diff --git a/.gitignore b/.gitignore index 6808180debe..9a0e583a3cb 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,12 @@ docs/en/operations docs/en/sql-reference docs/ru docs/zh +docs/ja/development +docs/ja/engines +docs/ja/getting-started +docs/ja/interfaces +docs/ja/operations +docs/ja/sql-reference docs/_clients **/.DS_Store diff --git a/copyClickhouseRepoDocs.sh b/copyClickhouseRepoDocs.sh index a4772448529..8e76cf55dd1 100755 --- a/copyClickhouseRepoDocs.sh +++ b/copyClickhouseRepoDocs.sh @@ -19,6 +19,7 @@ cp -r ClickHouse/docs/en/operations docs/en/ cp -r ClickHouse/docs/en/sql-reference docs/en/ cp -r ClickHouse/docs/ru docs/ cp -r ClickHouse/docs/zh docs/ +cp -r ClickHouse/docs/ja docs/ # Necessary for autogenerating settings cp ClickHouse/src/Core/FormatFactorySettings.h "$(dirname "$0")" diff --git a/docs/ja/_placeholders/api/_invitations-api-reference.md b/docs/ja/_placeholders/api/_invitations-api-reference.md new file mode 100644 index 00000000000..1ad8058f5d9 --- /dev/null +++ b/docs/ja/_placeholders/api/_invitations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 招待 +title: 招待 +--- + +## すべての招待を一覧表示 + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/api/_keys-api-reference.md b/docs/ja/_placeholders/api/_keys-api-reference.md new file mode 100644 index 00000000000..7e58a2195d9 --- /dev/null +++ b/docs/ja/_placeholders/api/_keys-api-reference.md @@ -0,0 +1,9 @@ +--- +sidebar_label: キー +title: キー +--- + +## すべてのキーのリストを取得する + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。 +内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/api/_members-api-reference.md b/docs/ja/_placeholders/api/_members-api-reference.md new file mode 100644 index 00000000000..c274b9f5849 --- /dev/null +++ b/docs/ja/_placeholders/api/_members-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: メンバー +title: メンバー +--- + +## 組織メンバーの一覧 + +このファイルはビルドプロセス中に`clickhouseapi.js`によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js`を編集してください。 diff --git a/docs/ja/_placeholders/api/_organizations-api-reference.md b/docs/ja/_placeholders/api/_organizations-api-reference.md new file mode 100644 index 00000000000..ec127f4cb9d --- /dev/null +++ b/docs/ja/_placeholders/api/_organizations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 組織 +title: 組織 +--- + +## 組織の詳細を取得する + +このファイルはビルドプロセス中に `clickhouseapi.js` によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/api/_services-api-reference.md b/docs/ja/_placeholders/api/_services-api-reference.md new file mode 100644 index 00000000000..6eec8e9c637 --- /dev/null +++ b/docs/ja/_placeholders/api/_services-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: サービス +title: サービス +--- + +## 組織サービスの一覧 + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/_placeholders/changelog/_index.md b/docs/ja/_placeholders/changelog/_index.md new file mode 100644 index 00000000000..ac44d7637ff --- /dev/null +++ b/docs/ja/_placeholders/changelog/_index.md @@ -0,0 +1,8 @@ +--- +slug: /ja/whats-new/changelog/ +sidebar_position: 2 +sidebar_label: 2024 +title: 2024 Changelog +note: このファイルは `yarn new-build` によって自動生成されます。 +--- + diff --git a/docs/ja/_snippets/_GCS_authentication_and_bucket.md b/docs/ja/_snippets/_GCS_authentication_and_bucket.md new file mode 100644 index 00000000000..5e16e8bbb47 --- /dev/null +++ b/docs/ja/_snippets/_GCS_authentication_and_bucket.md @@ -0,0 +1,41 @@ +
GCS バケットと HMAC キーを作成する + +### ch_bucket_us_east1 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png) + +### ch_bucket_us_east4 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png) + +### アクセスキーを生成する + +### サービスアカウントの HMAC キーとシークレットを作成する + +**Cloud Storage > Settings > Interoperability** を開き、既存の **Access key** を選択するか、**CREATE A KEY FOR A SERVICE ACCOUNT** を選択します。このガイドでは、新しいサービスアカウントの新しいキーを作成する手順を説明します。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png) + +### 新しいサービスアカウントを追加する + +すでにサービスアカウントが存在しないプロジェクトの場合は、**CREATE NEW ACCOUNT** をクリックします。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png) + +サービスアカウントを作成するには3つのステップがあります。最初のステップでは、アカウントに意味のある名前、ID、説明を付けます。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png) + +Interoperability 設定ダイアログでは、IAM ロールとして **Storage Object Admin** ロールが推奨されます。ステップ2でそのロールを選択します。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png) + +ステップ3はオプションであり、このガイドでは使用しません。ポリシーに基づいて、ユーザーにこれらの特権を与えることができます。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png) + +サービスアカウントの HMAC キーが表示されます。この情報を保存してください。ClickHouse の設定で使用します。 + +![バケットを追加](@site/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png) + +
diff --git a/docs/ja/_snippets/_S3_authentication_and_bucket.md b/docs/ja/_snippets/_S3_authentication_and_bucket.md new file mode 100644 index 00000000000..3603786c5f9 --- /dev/null +++ b/docs/ja/_snippets/_S3_authentication_and_bucket.md @@ -0,0 +1,132 @@ +
S3バケットとIAMユーザーの作成 + +この記事では、AWS IAMユーザーを設定し、S3バケットを作成し、ClickHouseをそのバケットをS3ディスクとして使用するように設定する基本を説明しています。使用する権限を決定するためにセキュリティチームと協力し、これらを出発点として考えてください。 + +### AWS IAMユーザーの作成 +この手順では、ログインユーザーではなくサービスアカウントユーザーを作成します。 +1. AWS IAM 管理コンソールにログインします。 + +2. 「ユーザー」で、**ユーザーを追加** を選択します。 + + ![create_iam_user_0](@site/docs/ja/_snippets/images/s3/s3-1.png) + +3. ユーザー名を入力し、資格情報の種類を **アクセスキー - プログラムによるアクセス** に設定し、**次: 権限** を選択します。 + + ![create_iam_user_1](@site/docs/ja/_snippets/images/s3/s3-2.png) + +4. ユーザーをグループに追加せず、**次: タグ** を選択します。 + + ![create_iam_user_2](@site/docs/ja/_snippets/images/s3/s3-3.png) + +5. タグを追加する必要がなければ、**次: 確認** を選択します。 + + ![create_iam_user_3](@site/docs/ja/_snippets/images/s3/s3-4.png) + +6. **ユーザーを作成** を選択します。 + + :::note + ユーザーに権限がないという警告メッセージは無視できます。次のセクションでバケットに対してユーザーに権限が付与されます。 + ::: + + ![create_iam_user_4](@site/docs/ja/_snippets/images/s3/s3-5.png) + +7. ユーザーが作成されました。**表示** をクリックし、アクセスキーとシークレットキーをコピーします。 +:::note +これがシークレットアクセスキーが利用可能な唯一のタイミングですので、キーを別の場所に保存してください。 +::: + + ![create_iam_user_5](@site/docs/ja/_snippets/images/s3/s3-6.png) + +8. 閉じるをクリックし、ユーザー画面でそのユーザーを見つけます。 + + ![create_iam_user_6](@site/docs/ja/_snippets/images/s3/s3-7.png) + +9. ARN(Amazon Resource Name)をコピーし、バケットのアクセスポリシーを設定する際に使用するために保存します。 + + ![create_iam_user_7](@site/docs/ja/_snippets/images/s3/s3-8.png) + +### S3バケットの作成 +1. S3バケットセクションで、**バケットの作成** を選択します。 + + ![create_s3_bucket_0](@site/docs/ja/_snippets/images/s3/s3-9.png) + +2. バケット名を入力し、他のオプションはデフォルトのままにします。 +:::note +バケット名はAWS全体で一意である必要があります。組織内だけでなく、一意でない場合はエラーが発生します。 +::: +3. `すべてのパブリックアクセスをブロック` を有効のままにします。パブリックアクセスは必要ありません。 + + ![create_s3_bucket_2](@site/docs/ja/_snippets/images/s3/s3-a.png) + +4. ページの下部にある **バケットの作成** を選択します。 + + ![create_s3_bucket_3](@site/docs/ja/_snippets/images/s3/s3-b.png) + +5. リンクを選択し、ARNをコピーして、バケットのアクセスポリシーを設定するときに使用するために保存します。 + +6. バケットが作成されたら、S3バケットリストで新しいS3バケットを見つけ、リンクを選択します。 + + ![create_s3_bucket_4](@site/docs/ja/_snippets/images/s3/s3-c.png) + +7. **フォルダを作成** を選択します。 + + ![create_s3_bucket_5](@site/docs/ja/_snippets/images/s3/s3-d.png) + +8. ClickHouse S3ディスクのターゲットとなるフォルダ名を入力し、**フォルダを作成** を選択します。 + + ![create_s3_bucket_6](@site/docs/ja/_snippets/images/s3/s3-e.png) + +9. フォルダがバケットリストに表示されるはずです。 + + ![create_s3_bucket_7](@site/docs/ja/_snippets/images/s3/s3-f.png) + +10. 新しいフォルダのチェックボックスを選択し、**URLをコピー** をクリックします。コピーしたURLは、次のセクションでのClickHouseストレージ設定で使用します。 + + ![create_s3_bucket_8](@site/docs/ja/_snippets/images/s3/s3-g.png) + +11. **権限** タブを選択し、**バケットポリシー** セクションの **編集** ボタンをクリックします。 + + ![create_s3_bucket_9](@site/docs/ja/_snippets/images/s3/s3-h.png) + +12. 以下の例のようにバケットポリシーを追加します: +```json +{ + "Version": "2012-10-17", + "Id": "Policy123456", + "Statement": [ + { + "Sid": "abc123", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::921234567898:user/mars-s3-user" + }, + "Action": "s3:*", + "Resource": [ + "arn:aws:s3:::mars-doc-test", + "arn:aws:s3:::mars-doc-test/*" + ] + } + ] +} +``` + +```response +|パラメータ | 説明 | 例 | +|----------|-------------|----------------| +|Version | ポリシーインタープリタのバージョン、そのままにしておく | 2012-10-17 | +|Sid | ユーザー定義のポリシーID | abc123 | +|Effect | ユーザー要求が許可されるか拒否されるか | Allow | +|Principal | 許可されるアカウントまたはユーザー | arn:aws:iam::921234567898:user/mars-s3-user | +|Action | バケット上で許可される操作| s3:*| +|Resource | バケット内で操作が許可されるリソース | "arn:aws:s3:::mars-doc-test", "arn:aws:s3:::mars-doc-test/*" | +``` + +:::note +使用する権限を決定するためにセキュリティチームと協力し、これらを出発点として考えてください。 +ポリシーと設定の詳細については、AWSドキュメントをご参照ください: +https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html +::: + +13. ポリシー設定を保存します。 + +
diff --git a/docs/ja/_snippets/_add_remote_ip_access_list_detail.md b/docs/ja/_snippets/_add_remote_ip_access_list_detail.md new file mode 100644 index 00000000000..a9ebd19b7bd --- /dev/null +++ b/docs/ja/_snippets/_add_remote_ip_access_list_detail.md @@ -0,0 +1,11 @@ +
IPアクセスリストを管理する + +ClickHouse Cloudのサービスリストから作業するサービスを選択し、**セキュリティ**に切り替えます。IPアクセスリストに、ClickHouse Cloudサービスに接続する必要があるリモートシステムのIPアドレスや範囲が含まれていない場合は、**エントリを追加**して問題を解決できます。 + +![サービスがトラフィックを許可しているか確認](@site/docs/ja/_snippets/images/ip-allow-list-check-list.png) + +ClickHouse Cloudサービスに接続する必要がある個別のIPアドレス、またはアドレスの範囲を追加します。フォームを適宜修正し、**エントリを追加**し、**エントリを送信**します。 + +![現在のIPアドレスを追加](@site/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png) + +
diff --git a/docs/ja/_snippets/_add_superset_detail.md b/docs/ja/_snippets/_add_superset_detail.md new file mode 100644 index 00000000000..98f5dad317c --- /dev/null +++ b/docs/ja/_snippets/_add_superset_detail.md @@ -0,0 +1,45 @@ +
DockerでApache Supersetを起動 + +Supersetは、[Docker Composeを使用してローカルにSupersetをインストールする](https://superset.apache.org/docs/installation/installing-superset-using-docker-compose/)手順を提供しています。GitHubからApache Supersetリポジトリをチェックアウトした後、最新の開発コードや特定のタグを実行することができます。`pre-release`としてマークされていない最新のリリースである2.0.0をお勧めします。 + +`docker compose`を実行する前にいくつかのタスクを行う必要があります: + +1. 公式のClickHouse Connectドライバーを追加 +2. MapBox APIキーを取得し、それを環境変数として追加(任意) +3. 実行するSupersetのバージョンを指定 + +:::tip +以下のコマンドはGitHubリポジトリのトップレベル、`superset`から実行してください。 +::: + +## 公式ClickHouse Connectドライバー + +SupersetデプロイメントでClickHouse Connectドライバーを利用可能にするために、ローカルのrequirementsファイルに追加します: + +```bash +echo "clickhouse-connect" >> ./docker/requirements-local.txt +``` + +## MapBox + +これは任意です。MapBox APIキーなしでSupersetで位置データをプロットできますが、キーを追加するべきというメッセージが表示され、地図の背景画像が欠けます(データポイントのみが表示され、地図の背景は表示されません)。MapBoxは無料のティアを提供していますので、利用したい場合はぜひご利用ください。 + +ガイドが作成するサンプルの可視化の一部は、例えば経度や緯度データなどの位置情報を使用します。SupersetはMapBoxマップのサポートを含んでいます。MapBoxの可視化を使用するには、MapBox APIキーが必要です。[MapBoxの無料ティア](https://account.mapbox.com/auth/signup/)にサインアップし、APIキーを生成してください。 + +APIキーをSupersetで利用可能にします: + +```bash +echo "MAPBOX_API_KEY=pk.SAMPLE-Use-your-key-instead" >> docker/.env-non-dev +``` + +## Supersetバージョン2.0.0をデプロイ + +リリース2.0.0をデプロイするには、以下を実行します: + +```bash +git checkout 2.0.0 +TAG=2.0.0 docker-compose -f docker-compose-non-dev.yml pull +TAG=2.0.0 docker-compose -f docker-compose-non-dev.yml up +``` + +
diff --git a/docs/ja/_snippets/_aws_regions.md b/docs/ja/_snippets/_aws_regions.md new file mode 100644 index 00000000000..d6cacd43369 --- /dev/null +++ b/docs/ja/_snippets/_aws_regions.md @@ -0,0 +1,11 @@ +| 地域 | VPC サービス名 | アベイラビリティーゾーン ID | +|------------------|--------------------------------------------------------------------|------------------------------| +|ap-south-1 | com.amazonaws.vpce.ap-south-1.vpce-svc-0a786406c7ddc3a1b | aps1-az1 aps1-az2 aps1-az3 | +|ap-southeast-1 | com.amazonaws.vpce.ap-southeast-1.vpce-svc-0a8b096ec9d2acb01 | apse1-az1 apse1-az2 apse1-az3| +|ap-southeast-2 | com.amazonaws.vpce.ap-southeast-2.vpce-svc-0ca446409b23f0c01 | apse2-az1 apse2-az2 apse2-az3| +|eu-central-1 | com.amazonaws.vpce.eu-central-1.vpce-svc-0536fc4b80a82b8ed | euc1-az2 euc1-az3 euc1-az1 | +|eu-west-1 | com.amazonaws.vpce.eu-west-1.vpce-svc-066b03c9b5f61c6fc | euw1-az2 euw1-az3 euw1-az1 | +|us-east-1 c0 | com.amazonaws.vpce.us-east-1.vpce-svc-0a0218fa75c646d81 | use1-az6 use1-az1 use1-az2 | +|us-east-1 c1 | com.amazonaws.vpce.us-east-1.vpce-svc-096c118db1ff20ea4 | use1-az6 use1-az4 use1-az2 | +|us-east-2 | com.amazonaws.vpce.us-east-2.vpce-svc-0b99748bf269a86b4 | use2-az1 use2-az2 use2-az3 | +|us-west-2 | com.amazonaws.vpce.us-west-2.vpce-svc-049bbd33f61271781 | usw2-az2 usw2-az1 usw2-az3 | diff --git a/docs/ja/_snippets/_check_ip_access_list_detail.md b/docs/ja/_snippets/_check_ip_access_list_detail.md new file mode 100644 index 00000000000..926a0dc8624 --- /dev/null +++ b/docs/ja/_snippets/_check_ip_access_list_detail.md @@ -0,0 +1,15 @@ +
IPアクセスリストを管理する + +ClickHouse Cloudのサービスリストから作業するサービスを選び、**設定**に切り替えます。 + +![サービスの設定](@site/docs/ja/_snippets/images/cloud-service-settings.png) + +IPアクセスリストが**現在、このサービスにアクセスできるトラフィックはありません**と表示される場合は、**エントリを追加**して問題を解決できます。 + +![サービスがトラフィックを許可しているか確認する](@site/docs/ja/_snippets/images/ip-allow-list-check-list.png) + +クイックスタートのために、ローカルのセキュリティポリシーが許可する場合は、現在のIPアドレスのみを追加することができます。これを行うには、**現在のIPを追加**を使用し、現在のIPと説明「ホームIP」でフォームを自動入力します。必要に応じてフォームを修正し、**エントリを追加**し**エントリを送信**します。 + +![現在のIPアドレスを追加する](@site/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png) + +
diff --git a/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx b/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx new file mode 100644 index 00000000000..e5a68056176 --- /dev/null +++ b/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx @@ -0,0 +1,61 @@ +1. ClickHouse Cloud Serviceを作成した後、認証情報画面でMySQLタブを選択します。 +![Credentials screen - Prompt](./images/mysql1.png) +2. この特定のサービスに対してMySQLインターフェースを有効にするためにスイッチを切り替えます。これにより、そのサービスでポート`3306`が公開され、ユニークなMySQLユーザー名を含むMySQL接続画面が表示されます。パスワードはサービスのデフォルトユーザーのパスワードと同じになります。 +![Credentials screen - Enabled MySQL](./images/mysql2.png) +代わりに、既存のサービスに対してMySQLインターフェースを有効にするには: +3. サービスが`Running`状態であることを確認し、MySQLインターフェースを有効にするサービスの「接続文字列を表示」ボタンをクリックします。 +![Connection screen - Prompt MySQL](./images/mysql3.png) +4. この特定のサービスに対してMySQLインターフェースを有効にするためにスイッチを切り替えます。これにより、デフォルトのパスワードを入力するよう求められます。 +![Connection screen - Prompt MySQL](./images/mysql4.png) +5. パスワードを入力すると、このサービスのMySQL接続文字列が表示されます。 +![Connection screen - MySQL Enabled](./images/mysql5.png) + +## ClickHouse Cloudで複数のMySQLユーザーを作成する + +デフォルトでは、`mysql4`という組み込みユーザーがあり、これは`default`ユーザーと同じパスワードを使用します。``部分はあなたのClickHouse Cloudホスト名の最初のセグメントです。このフォーマットは、安全な接続を実装しているが[TLSハンドシェイクでSNI情報を提供しない](https://www.cloudflare.com/learning/ssl/what-is-sni)ツール(MySQLコンソールクライアントがその一例)で作業するために必要です。この場合、ユーザー名に追加のヒントを含めずには内部ルーティングを行うことができません。 + +これにより、MySQLインターフェースで使用する新しいユーザーを作成する際には、`mysql4_`のフォーマットを使用することを_強くお勧めします_。ここで、``はあなたのCloudサービスを識別するためのヒントであり、``は選択した任意のサフィックスです。 + +:::tip +ClickHouse Cloudホスト名が`foobar.us-east1.aws.clickhouse.cloud`の場合、``部分は`foobar`に相当し、カスタムMySQLユーザー名は`mysql4foobar_team1`のようになります。 +::: + +MySQLインターフェースを使用するために追加のユーザーを作成することができます。例えば、追加の設定を適用する必要がある場合などです。 + +1. オプション - カスタムユーザーに適用する[設定プロフィール](https://clickhouse.com/docs/ja/sql-reference/statements/create/settings-profile)を作成します。たとえば、後で作成するユーザーで接続するときにデフォルトで適用される追加設定を持つ`my_custom_profile`: + + ```sql + CREATE SETTINGS PROFILE my_custom_profile SETTINGS prefer_column_name_to_alias=1; + ``` + + `prefer_column_name_to_alias`は単なる例として使用されます。ここに他の設定を使用することもできます。 +2. 以下のフォーマットを使用して[ユーザーを作成](https://clickhouse.com/docs/ja/sql-reference/statements/create/user)します: `mysql4_` ([上記参照](#creating-multiple-mysql-users-in-clickhouse-cloud))。パスワードはダブルSHA1形式である必要があります。例: + + ```sql + CREATE USER mysql4foobar_team1 IDENTIFIED WITH double_sha1_password BY 'YourPassword42$'; + ``` + + または、このユーザーにカスタムプロフィールを使用したい場合: + + ```sql + CREATE USER mysql4foobar_team1 IDENTIFIED WITH double_sha1_password BY 'YourPassword42$' SETTINGS PROFILE 'my_custom_profile'; + ``` + + ここで、`my_custom_profile`は前に作成したプロフィールの名前です。 +3. 新しいユーザーに必要なアクセス権を付与して、目的のテーブルまたはデータベースと対話できるようにします。[権限を付与](https://clickhouse.com/docs/ja/sql-reference/statements/grant)する例として、たとえば`system.query_log`のみのアクセスを付与したい場合: + + ```sql + GRANT SELECT ON system.query_log TO mysql4foobar_team1; + ``` + +4. 作成したユーザーを使用して、MySQLインターフェースでClickHouse Cloudサービスに接続します。 + +### ClickHouse Cloudでの複数のMySQLユーザーのトラブルシューティング + +新しいMySQLユーザーを作成し、MySQL CLIクライアントで接続しているときに以下のエラーが表示された場合: + +``` +ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 54 +``` + +この場合、ユーザー名が`mysql4_`形式に従っていることを確認してください。[上記](#creating-multiple-mysql-users-in-clickhouse-cloud)で説明されています。 diff --git a/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx b/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx new file mode 100644 index 00000000000..f728ab4e46b --- /dev/null +++ b/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx @@ -0,0 +1,87 @@ +ClickHouseサーバーにMySQLインターフェースを有効にする方法については[公式ドキュメント](https://clickhouse.com/docs/ja/interfaces/mysql)を参照してください。 + +サーバーの `config.xml` にエントリを追加することに加えて、 + +```xml + + 9004 + +``` + +MySQLインターフェースを利用するユーザーには、[二重SHA1パスワード暗号化](https://clickhouse.com/docs/ja/operations/settings/settings-users#user-namepassword)を使用することが**必要**です。 + +シェルから二重SHA1で暗号化されたランダムパスワードを生成するには以下を実行してください: + +```shell +PASSWORD=$(base64 < /dev/urandom | head -c16); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-' +``` + +出力は以下のようになります: + +``` +LZOQYnqQN4L/T6L0 +fbc958cc745a82188a51f30de69eebfc67c40ee4 +``` + +最初の行は生成されたパスワードで、2行目はClickHouseの設定に使用するハッシュです。 + +以下は生成されたハッシュを使用する`mysql_user`の設定例です: + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + fbc958cc745a82188a51f30de69eebfc67c40ee4 + + ::/0 + + default + default + + +``` + +`password_double_sha1_hex` エントリを自分で生成した二重SHA1ハッシュに置き換えてください。 + +さらに、BIツールがMySQLコネクタを使用する際にデータベーススキーマを適切に調査できるように、`SHOW [FULL] COLUMNS` クエリの結果でMySQLネイティブタイプを表示するために、`use_mysql_types_in_show_columns`を使用することを推奨します。 + +例えば: + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + 1 + + +``` + +または、デフォルト以外の異なるプロファイルに割り当てることもできます。 + +`mysql` バイナリが利用可能であれば、コマンドラインから接続をテストできます。以下は、サンプルのユーザー名 (`mysql_user`) とパスワード (`LZOQYnqQN4L/T6L0`) を使用したコマンドです: + +```bash +mysql --protocol tcp -h localhost -u mysql_user -P 9004 --password=LZOQYnqQN4L/T6L0 +``` + +``` +mysql> show databases; ++--------------------+ +| name | ++--------------------+ +| INFORMATION_SCHEMA | +| default | +| information_schema | +| system | ++--------------------+ +4行取得しました (0.00 sec) +4行読み込み、603.00 B、0.00156秒で、2564行/秒、377.48 KiB/秒 +``` + +最後に、ClickHouseサーバーを希望するIPアドレスでリッスンするように設定します。例えば、`config.xml` の中で、すべてのアドレスでリッスンするために以下をアンコメントしてください: + +```bash +:: +``` diff --git a/docs/ja/_snippets/_cloud_backup.md b/docs/ja/_snippets/_cloud_backup.md new file mode 100644 index 00000000000..8cd341f7a0a --- /dev/null +++ b/docs/ja/_snippets/_cloud_backup.md @@ -0,0 +1,19 @@ +## クラウドのバックアップとリストア + +各サービスは毎日バックアップされています。サービスの**バックアップ**タブで、サービスのバックアップリストを見ることができます。そこからバックアップをリストアしたり、バックアップを削除することができます。 + +![バックアップのリスト](@site/docs/ja/_snippets/images/cloud-backup-list.png) + +**バックアップをリストア**アイコンをクリックすると、新しく作成されるサービスの**サービス名**を指定して、**このバックアップをリストア**できます。 + +![バックアップのリスト](@site/docs/ja/_snippets/images/cloud-backup-restore.png) + +新しいサービスは、準備が整うまでサービスリストに**プロビジョニング**として表示されます。 + +![バックアップのリスト](@site/docs/ja/_snippets/images/cloud-backup-new-service.png) + +新しいサービスのプロビジョニングが完了すると、接続できます。その後… + +:::note +ClickHouse Cloud サービスを利用する際に、SQL クライアントで `BACKUP` および `RESTORE` コマンドを使用しないでください。クラウドのバックアップは UI から管理する必要があります。 +::: diff --git a/docs/ja/_snippets/_config-files.md b/docs/ja/_snippets/_config-files.md new file mode 100644 index 00000000000..cd40c778dc9 --- /dev/null +++ b/docs/ja/_snippets/_config-files.md @@ -0,0 +1,7 @@ +:::important best practices +ClickHouse Server を設定する際、設定ファイルを追加または編集するときは次のようにしてください: +- ファイルを `/etc/clickhouse-server/config.d/` ディレクトリに追加する +- ファイルを `/etc/clickhouse-server/users.d/` ディレクトリに追加する +- `/etc/clickhouse-server/config.xml` ファイルはそのままにしておく +- `/etc/clickhouse-server/users.xml` ファイルはそのままにしておく +::: diff --git a/docs/ja/_snippets/_gather_your_details_http.mdx b/docs/ja/_snippets/_gather_your_details_http.mdx new file mode 100644 index 00000000000..e466ee3c30e --- /dev/null +++ b/docs/ja/_snippets/_gather_your_details_http.mdx @@ -0,0 +1,17 @@ +HTTP(S) を使用して ClickHouse に接続するには、以下の情報が必要です: + +- **HOST と PORT**: 通常、TLS を使用する場合のポートは 8443、TLS を使用しない場合は 8123 です。 + +- **データベース名**: デフォルトで `default` という名前のデータベースがありますが、接続したいデータベースの名前を使用してください。 + +- **ユーザー名とパスワード**: デフォルトでユーザー名は `default` です。使用ケースに適したユーザー名を使用してください。 + +ClickHouse Cloud サービスの詳細は、ClickHouse Cloud コンソールで確認できます。 接続するサービスを選択し、**接続** をクリックします: + +![ClickHouse Cloud service connect button](@site/docs/ja/_snippets/images/cloud-connect-button.png) + +**HTTPS** を選択すると、サンプルの `curl` コマンドで詳細が確認できます。 + +![ClickHouse Cloud HTTPS connection details](@site/docs/ja/_snippets/images/connection-details-https.png) + +セルフマネージドの ClickHouse を使用している場合、接続の詳細は ClickHouse 管理者によって設定されます。 diff --git a/docs/ja/_snippets/_gather_your_details_native.md b/docs/ja/_snippets/_gather_your_details_native.md new file mode 100644 index 00000000000..757a2df37c7 --- /dev/null +++ b/docs/ja/_snippets/_gather_your_details_native.md @@ -0,0 +1,17 @@ +ClickHouseにネイティブTCPで接続するには、次の情報が必要です。 + +- **HOSTとPORT**: 通常、TLSを使用している場合はポートは9440、TLSを使用していない場合は9000です。 + +- **データベース名**: デフォルトでは、`default`という名前のデータベースがあります。接続したいデータベースの名前を使用してください。 + +- **ユーザー名とパスワード**: デフォルトのユーザー名は`default`です。使用するケースに適したユーザー名を利用してください。 + +ClickHouse Cloudサービスの詳細は、ClickHouse Cloudコンソールで確認できます。接続するサービスを選択し、**Connect**をクリックします。 + +![ClickHouse Cloud service connect button](@site/docs/ja/_snippets/images/cloud-connect-button.png) + +**Native** を選択すると、例として `clickhouse-client` コマンドで使用可能な詳細が表示されます。 + +![ClickHouse Cloud Native TCP connection details](@site/docs/ja/_snippets/images/connection-details-native.png) + +セルフマネージドのClickHouseを使用している場合、接続の詳細はClickHouse管理者によって設定されます。 diff --git a/docs/ja/_snippets/_gcp_regions.md b/docs/ja/_snippets/_gcp_regions.md new file mode 100644 index 00000000000..61207f0d01b --- /dev/null +++ b/docs/ja/_snippets/_gcp_regions.md @@ -0,0 +1,6 @@ +| リージョン | サービスアタッチメント | プライベートDNSドメイン | +|--------------|-------------------------------------------------------------|------------------------------| +|asia-southeast1| projects/dataplane-production/regions/asia-southeast1/serviceAttachments/production-asia-southeast1-clickhouse-cloud| asia-southeast1.p.gcp.clickhouse.cloud| +|europe-west4| projects/dataplane-production/regions/europe-west4/serviceAttachments/production-europe-west4-clickhouse-cloud| europe-west4.p.gcp.clickhouse.cloud| +|us-central1| projects/dataplane-production/regions/us-central1/serviceAttachments/production-us-central1-clickhouse-cloud| us-central1.p.gcp.clickhouse.cloud| +|us-east1| projects/dataplane-production/regions/us-east1/serviceAttachments/production-us-east1-clickhouse-cloud| us-east1.p.gcp.clickhouse.cloud| diff --git a/docs/ja/_snippets/_keeper-config-files.md b/docs/ja/_snippets/_keeper-config-files.md new file mode 100644 index 00000000000..393445edb1d --- /dev/null +++ b/docs/ja/_snippets/_keeper-config-files.md @@ -0,0 +1,5 @@ +:::important ベストプラクティス +ClickHouse Keeperを構成するために設定ファイルを編集する際には、以下を行うべきです: +- `/etc/clickhouse-keeper/keeper_config.xml` をバックアップする +- `/etc/clickhouse-keeper/keeper_config.xml` ファイルを編集する +::: diff --git a/docs/ja/_snippets/_launch_sql_console.md b/docs/ja/_snippets/_launch_sql_console.md new file mode 100644 index 00000000000..7ab292d93a1 --- /dev/null +++ b/docs/ja/_snippets/_launch_sql_console.md @@ -0,0 +1,11 @@ +:::tip SQL コンソール +SQL クライアント接続が必要な場合、ClickHouse Cloud サービスには関連付けられたウェブベースの SQL コンソールがあります。詳細については、以下の **SQL コンソールに接続** を展開してください。 +::: + +
SQL コンソールに接続 + +ClickHouse Cloud サービス一覧から、作業するサービスを選択し、**接続** をクリックします。ここから **SQL コンソールを開く** ことができます: + +![SQL コンソールに接続](@site/docs/ja/_snippets/images/cloud-connect-to-sql-console.png) + +
diff --git a/docs/ja/_snippets/_replication-sharding-terminology.md b/docs/ja/_snippets/_replication-sharding-terminology.md new file mode 100644 index 00000000000..5a32af3c52c --- /dev/null +++ b/docs/ja/_snippets/_replication-sharding-terminology.md @@ -0,0 +1,9 @@ +## 用語集 +### レプリカ +データのコピー。ClickHouseは常にデータの少なくとも1つのコピーを持っているため、**レプリカ**の最小数は1です。これは重要なポイントで、元のデータをレプリカとして数えることに慣れていないかもしれませんが、ClickHouseのコードとドキュメントではその用語が使用されています。データの2番目のレプリカを追加することで、フォールトトレランスを提供できます。 + +### シャード +データのサブセット。ClickHouseは常にデータの少なくとも1つのシャードを持っているので、データを複数のサーバーに分散しない場合、データは1つのシャードに格納されます。データを複数のサーバーに分散してシャーディングすることは、単一サーバーの容量を超えた場合に負荷を分散するために利用できます。宛先サーバーは**シャーディングキー**によって決まり、分散テーブルを作成する際に定義されます。シャーディングキーはランダムなものか、[ハッシュ関数](https://clickhouse.com/docs/ja/sql-reference/functions/hash-functions)の出力として定義することができます。シャーディングを含むデプロイメント例では、シャーディングキーとして`rand()`を使用し、いつどのようにして異なるシャーディングキーを選択するかについてのさらなる情報を提供します。 + +### 分散調整 +ClickHouse Keeperは、データのレプリケーションと分散DDLクエリの実行のための調整システムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。 diff --git a/docs/ja/_snippets/_self_managed_only_automated.md b/docs/ja/_snippets/_self_managed_only_automated.md new file mode 100644 index 00000000000..a13a937cc5d --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_automated.md @@ -0,0 +1,3 @@ +:::note +このページは [ClickHouse Cloud](https://clickhouse.com/cloud) には適用されません。ここで記載されている手順は、ClickHouse Cloud サービスで自動化されています。 +::: diff --git a/docs/ja/_snippets/_self_managed_only_no_roadmap.md b/docs/ja/_snippets/_self_managed_only_no_roadmap.md new file mode 100644 index 00000000000..1a5a90f3861 --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_no_roadmap.md @@ -0,0 +1,4 @@ +:::note +このページは[ClickHouse Cloud](https://clickhouse.com/cloud)には適用されません。ここで文書化されている機能は、ClickHouse Cloudサービスでは利用できません。 +詳細は、ClickHouseの[Cloud Compatibility](/docs/ja/whats-new/cloud-compatibility)ガイドをご覧ください。 +::: diff --git a/docs/ja/_snippets/_self_managed_only_not_applicable.md b/docs/ja/_snippets/_self_managed_only_not_applicable.md new file mode 100644 index 00000000000..e80de64fd8c --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_not_applicable.md @@ -0,0 +1,3 @@ +:::note +このページは[ClickHouse Cloud](https://clickhouse.com/cloud)には適用されません。ここに記載されている手順は、セルフマネージドのClickHouseデプロイメントでのみ必要です。 +::: diff --git a/docs/ja/_snippets/_self_managed_only_roadmap.md b/docs/ja/_snippets/_self_managed_only_roadmap.md new file mode 100644 index 00000000000..35c88e62051 --- /dev/null +++ b/docs/ja/_snippets/_self_managed_only_roadmap.md @@ -0,0 +1,3 @@ +:::note +このページは[ClickHouse Cloud](https://clickhouse.com/cloud)には適用されません。ここで文書化されている機能は、ClickHouse Cloudサービスではまだ利用できません。詳しくは、ClickHouseの[Cloud互換性](/docs/ja/whats-new/cloud-compatibility#roadmap)ガイドを参照してください。 +::: diff --git a/docs/ja/_snippets/_service_actions_menu.md b/docs/ja/_snippets/_service_actions_menu.md new file mode 100644 index 00000000000..84d24343d1a --- /dev/null +++ b/docs/ja/_snippets/_service_actions_menu.md @@ -0,0 +1,3 @@ +

ClickHouse Cloudサービスのアクションメニューを開き、{props.menu}を選択します:

+ +![Cloud service Actions menu](@site/docs/ja/_snippets/images/cloud-service-actions-menu.png) diff --git a/docs/ja/_snippets/_sign_in_or_trial.md b/docs/ja/_snippets/_sign_in_or_trial.md new file mode 100644 index 00000000000..1040f9b31f5 --- /dev/null +++ b/docs/ja/_snippets/_sign_in_or_trial.md @@ -0,0 +1,3 @@ +[ClickHouse.cloud](https://clickhouse.cloud)でアカウントを作成するか、サインインしてください。 + +![Cloud sign in prompt](@site/docs/ja/_snippets/images/cloud-sign-in-or-trial.png) diff --git a/docs/ja/_snippets/_tabs.md b/docs/ja/_snippets/_tabs.md new file mode 100644 index 00000000000..68aa6b4529b --- /dev/null +++ b/docs/ja/_snippets/_tabs.md @@ -0,0 +1,22 @@ +--- +sidebar_label: タブサンプル +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +## ステップ 1 + + + + +クラウド + + + + +セルフマネージド + + + diff --git a/docs/ja/_snippets/_users-and-roles-common.md b/docs/ja/_snippets/_users-and-roles-common.md new file mode 100644 index 00000000000..b7965705fed --- /dev/null +++ b/docs/ja/_snippets/_users-and-roles-common.md @@ -0,0 +1,447 @@ +## 管理者権限のテスト + +ユーザー `default` からログアウトし、ユーザー `clickhouse_admin` としてログインし直してください。 + +これらすべてが成功するはずです: + +```sql +SHOW GRANTS FOR clickhouse_admin; +``` + +```sql +CREATE DATABASE db1 +``` + +```sql +CREATE TABLE db1.table1 (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id; +``` + +```sql +INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); +``` + +```sql +SELECT * FROM db1.table1; +``` + +```sql +DROP TABLE db1.table1; +``` + +```sql +DROP DATABASE db1; +``` + +## 非管理者ユーザー + +ユーザーは必要な権限を持ち、全員が管理者であるべきではありません。このドキュメントの残りの部分では、例のシナリオと必要な役割を提供します。 + +### 準備 + +例で使用されるテーブルとユーザーを作成します。 + +#### サンプルデータベース、テーブル、および行の作成 + +1. テストデータベースを作成 + + ```sql + CREATE DATABASE db1; + ``` + +2. テーブルを作成 + + ```sql + CREATE TABLE db1.table1 ( + id UInt64, + column1 String, + column2 String + ) + ENGINE MergeTree + ORDER BY id; + ``` + +3. サンプル行でテーブルを埋める + + ```sql + INSERT INTO db1.table1 + (id, column1, column2) + VALUES + (1, 'A', 'abc'), + (2, 'A', 'def'), + (3, 'B', 'abc'), + (4, 'B', 'def'); + ``` + +4. テーブルを確認する: + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 475015cc-6f51-4b20-bda2-3c9c41404e49 + + ┌─id─┬─column1─┬─column2─┐ + │ 1 │ A │ abc │ + │ 2 │ A │ def │ + │ 3 │ B │ abc │ + │ 4 │ B │ def │ + └────┴─────────┴─────────┘ + ``` + +5. 特定のカラムへのアクセスを制限することを示すために使用される通常のユーザーを作成: + + ```sql + CREATE USER column_user IDENTIFIED BY 'password'; + ``` + +6. 特定の値を持つ行へのアクセスを制限することを示すために使用される通常のユーザーを作成: + ```sql + CREATE USER row_user IDENTIFIED BY 'password'; + ``` + +#### 役割の作成 + +この例を使って: + +- カラムや行、異なる権限のための役割を作成します +- 役割に権限を付与します +- ユーザーを各役割に割り当てます + +役割は、各ユーザーを個別に管理する代わりに、特定の権限を持つユーザーのグループを定義するために使用されます。 + +1. `db1` データベースおよび `table1` において、`column1` のみを閲覧できるユーザーの役割を作成: + + ```sql + CREATE ROLE column1_users; + ``` + +2. `column1` のみが閲覧可能な権限を設定 + + ```sql + GRANT SELECT(id, column1) ON db1.table1 TO column1_users; + ``` + +3. `column_user` ユーザーを `column1_users` 役割に追加 + + ```sql + GRANT column1_users TO column_user; + ``` + +4. `column1` に `A` を含む行のみを閲覧できるユーザーの役割を作成 + + ```sql + CREATE ROLE A_rows_users; + ``` + +5. `row_user` を `A_rows_users` 役割に追加 + + ```sql + GRANT A_rows_users TO row_user; + ``` + +6. `column1` が `A` の値を持つ行のみを閲覧可能とするポリシーを作成 + + ```sql + CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users; + ``` + +7. データベースとテーブルへの権限を設定 + + ```sql + GRANT SELECT(id, column1, column2) ON db1.table1 TO A_rows_users; + ``` + +8. 他の役割に対してもすべての行にアクセスできるように明示的な権限を付与 + + ```sql + CREATE ROW POLICY allow_other_users_filter + ON db1.table1 FOR SELECT USING 1 TO clickhouse_admin, column1_users; + ``` + + :::note + テーブルにポリシーをアタッチすると、システムはそのポリシーを適用し、定義されたユーザーと役割のみがそのテーブルでの操作を行うことができます。その他のユーザーは操作を拒否されます。制限された行ポリシーが他のユーザーに適用されないようにするため、他のユーザーと役割が通常または他のタイプのアクセスを持つことを許可する別のポリシーを定義する必要があります。 + ::: + +## 検証 + +### カラム制限ユーザーでの役割の権限テスト + +1. `clickhouse_admin` ユーザーでClickHouseクライアントにログイン + + ``` + clickhouse-client --user clickhouse_admin --password password + ``` + +2. 管理者ユーザーを使用して、データベース、テーブル、およびすべての行のアクセスを確認。 + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: f5e906ea-10c6-45b0-b649-36334902d31d + + ┌─id─┬─column1─┬─column2─┐ + │ 1 │ A │ abc │ + │ 2 │ A │ def │ + │ 3 │ B │ abc │ + │ 4 │ B │ def │ + └────┴─────────┴─────────┘ + ``` + +3. `column_user` ユーザーでClickHouseクライアントにログイン + + ``` + clickhouse-client --user column_user --password password + ``` + +4. すべてのカラムを使用した `SELECT` + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 5576f4eb-7450-435c-a2d6-d6b49b7c4a23 + + 0 rows in set. Elapsed: 0.006 sec. + + Received exception from server (version 22.3.2): + Code: 497. DB::Exception: Received from localhost:9000. + DB::Exception: column_user: Not enough privileges. + To execute this query it's necessary to have grant + SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED) + ``` + + :::note + すべてのカラムが指定されたためアクセスが拒否されました。ユーザーは `id` と `column1` のみへのアクセス権を持っています + ::: + +5. 指定されたカラムのみを用いた `SELECT` クエリを確認: + + ```sql + SELECT + id, + column1 + FROM db1.table1 + ``` + + ```response + Query id: cef9a083-d5ce-42ff-9678-f08dc60d4bb9 + + ┌─id─┬─column1─┐ + │ 1 │ A │ + │ 2 │ A │ + │ 3 │ B │ + │ 4 │ B │ + └────┴─────────┘ + ``` + +### 行制限ユーザーでの役割の権限テスト + +1. `row_user` でClickHouseクライアントにログイン + + ``` + clickhouse-client --user row_user --password password + ``` + +2. 利用可能な行を表示 + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: a79a113c-1eca-4c3f-be6e-d034f9a220fb + + ┌─id─┬─column1─┬─column2─┐ + │ 1 │ A │ abc │ + │ 2 │ A │ def │ + └────┴─────────┴─────────┘ + ``` + + :::note + 上記の2行のみが返されることを確認し、`column1` に `B` の値を持つ行は除外されるべきです。 + ::: + +## ユーザーと役割の変更 + +ユーザーは必要な権限の組み合わせに対して複数の役割を割り当てることができます。複数の役割を使用する場合、システムは役割を組み合わせて権限を決定し、その結果、役割の権限が累積されます。 + +例えば、1つの `role1` が `column1` のみの選択を許可し、`role2` が `column1` と `column2` の選択を許可する場合、ユーザーは両方のカラムにアクセスできます。 + +1. 管理者アカウントを使用して、デフォルトの役割で行とカラムの両方を制限する新しいユーザーを作成 + + ```sql + CREATE USER row_and_column_user IDENTIFIED BY 'password' DEFAULT ROLE A_rows_users; + ``` + +2. `A_rows_users` 役割に対する以前の権限を削除 + + ```sql + REVOKE SELECT(id, column1, column2) ON db1.table1 FROM A_rows_users; + ``` + +3. `A_row_users` 役割に `column1` のみの選択を許可 + + ```sql + GRANT SELECT(id, column1) ON db1.table1 TO A_rows_users; + ``` + +4. `row_and_column_user` でClickHouseクライアントにログイン + + ``` + clickhouse-client --user row_and_column_user --password password; + ``` + +5. すべてのカラムでテスト: + + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 8cdf0ff5-e711-4cbe-bd28-3c02e52e8bc4 + + 0 rows in set. Elapsed: 0.005 sec. + + Received exception from server (version 22.3.2): + Code: 497. DB::Exception: Received from localhost:9000. + DB::Exception: row_and_column_user: Not enough privileges. + To execute this query it's necessary to have grant + SELECT(id, column1, column2) ON db1.table1. (ACCESS_DENIED) + ``` + +6. 制限されたカラムでテスト: + + ```sql + SELECT + id, + column1 + FROM db1.table1 + ``` + + ```response + Query id: 5e30b490-507a-49e9-9778-8159799a6ed0 + + ┌─id─┬─column1─┐ + │ 1 │ A │ + │ 2 │ A │ + └────┴─────────┘ + ``` + +## トラブルシューティング + +権限が交差または結合して予期しない結果を生む場合があります。次のコマンドを使用して管理者アカウントを使用して問題を絞り込むことができます。 + +### ユーザーの権限と役割のリスト + +```sql +SHOW GRANTS FOR row_and_column_user +``` + +```response +Query id: 6a73a3fe-2659-4aca-95c5-d012c138097b + +┌─GRANTS FOR row_and_column_user───────────────────────────┐ +│ GRANT A_rows_users, column1_users TO row_and_column_user │ +└──────────────────────────────────────────────────────────┘ +``` + +### ClickHouse の役割のリスト + +```sql +SHOW ROLES +``` + +```response +Query id: 1e21440a-18d9-4e75-8f0e-66ec9b36470a + +┌─name────────────┐ +│ A_rows_users │ +│ column1_users │ +└─────────────────┘ +``` + +### ポリシーの表示 + +```sql +SHOW ROW POLICIES +``` + +```response +Query id: f2c636e9-f955-4d79-8e80-af40ea227ebc + +┌─name───────────────────────────────────┐ +│ A_row_filter ON db1.table1 │ +│ allow_other_users_filter ON db1.table1 │ +└────────────────────────────────────────┘ +``` + +### ポリシーがどのように定義されているかと現在の権限を表示 + +```sql +SHOW CREATE ROW POLICY A_row_filter ON db1.table1 +``` + +```response +Query id: 0d3b5846-95c7-4e62-9cdd-91d82b14b80b + +┌─CREATE ROW POLICY A_row_filter ON db1.table1────────────────────────────────────────────────┐ +│ CREATE ROW POLICY A_row_filter ON db1.table1 FOR SELECT USING column1 = 'A' TO A_rows_users │ +└─────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +## ロール、ポリシー、およびユーザーを管理するためのコマンドの例 + +次のコマンドを使用して: + +- 権限の削除 +- ポリシーの削除 +- ユーザーを役割から解除 +- ユーザーと役割の削除 +
+ +:::tip +これらのコマンドは管理者ユーザーまたは `default` ユーザーとして実行してください +::: + +### 役割からの権限を削除 + +```sql +REVOKE SELECT(column1, id) ON db1.table1 FROM A_rows_users; +``` + +### ポリシーを削除 + +```sql +DROP ROW POLICY A_row_filter ON db1.table1; +``` + +### ユーザーを役割から解除 + +```sql +REVOKE A_rows_users FROM row_user; +``` + +### 役割を削除 + +```sql +DROP ROLE A_rows_users; +``` + +### ユーザーを削除 + +```sql +DROP USER row_user; +``` + +## 要約 + +このドキュメントでは、SQLユーザーと役割の作成の基本を示し、ユーザーおよび役割の権限を設定および変更する手順を提供しました。それぞれの詳細情報については、ユーザーガイドおよびリファレンスドキュメントを参照してください。 diff --git a/docs/ja/_snippets/images/aws-rds-mysql.png b/docs/ja/_snippets/images/aws-rds-mysql.png new file mode 100644 index 00000000000..5e4456fbed5 Binary files /dev/null and b/docs/ja/_snippets/images/aws-rds-mysql.png differ diff --git a/docs/ja/_snippets/images/cloud-advanced-scaling.png b/docs/ja/_snippets/images/cloud-advanced-scaling.png new file mode 100644 index 00000000000..787f81f4bb5 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-advanced-scaling.png differ diff --git a/docs/ja/_snippets/images/cloud-backup-list.png b/docs/ja/_snippets/images/cloud-backup-list.png new file mode 100644 index 00000000000..fca809ae6d7 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-backup-list.png differ diff --git a/docs/ja/_snippets/images/cloud-backup-new-service.png b/docs/ja/_snippets/images/cloud-backup-new-service.png new file mode 100644 index 00000000000..eeff5a0d2c0 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-backup-new-service.png differ diff --git a/docs/ja/_snippets/images/cloud-backup-restore.png b/docs/ja/_snippets/images/cloud-backup-restore.png new file mode 100644 index 00000000000..922c640ee8d Binary files /dev/null and b/docs/ja/_snippets/images/cloud-backup-restore.png differ diff --git a/docs/ja/_snippets/images/cloud-connect-button.png b/docs/ja/_snippets/images/cloud-connect-button.png new file mode 100644 index 00000000000..c61e2f3605f Binary files /dev/null and b/docs/ja/_snippets/images/cloud-connect-button.png differ diff --git a/docs/ja/_snippets/images/cloud-connect-to-sql-console.png b/docs/ja/_snippets/images/cloud-connect-to-sql-console.png new file mode 100644 index 00000000000..5037f4c0591 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-connect-to-sql-console.png differ diff --git a/docs/ja/_snippets/images/cloud-load-data-sample.png b/docs/ja/_snippets/images/cloud-load-data-sample.png new file mode 100644 index 00000000000..1abd3f4f4af Binary files /dev/null and b/docs/ja/_snippets/images/cloud-load-data-sample.png differ diff --git a/docs/ja/_snippets/images/cloud-select-a-service.png b/docs/ja/_snippets/images/cloud-select-a-service.png new file mode 100644 index 00000000000..8eb530404bf Binary files /dev/null and b/docs/ja/_snippets/images/cloud-select-a-service.png differ diff --git a/docs/ja/_snippets/images/cloud-service-actions-menu.png b/docs/ja/_snippets/images/cloud-service-actions-menu.png new file mode 100644 index 00000000000..d56c183fd4d Binary files /dev/null and b/docs/ja/_snippets/images/cloud-service-actions-menu.png differ diff --git a/docs/ja/_snippets/images/cloud-service-settings.png b/docs/ja/_snippets/images/cloud-service-settings.png new file mode 100644 index 00000000000..4fa16435508 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-service-settings.png differ diff --git a/docs/ja/_snippets/images/cloud-sign-in-or-trial.png b/docs/ja/_snippets/images/cloud-sign-in-or-trial.png new file mode 100644 index 00000000000..824836d5080 Binary files /dev/null and b/docs/ja/_snippets/images/cloud-sign-in-or-trial.png differ diff --git a/docs/ja/_snippets/images/cmek-performance.png b/docs/ja/_snippets/images/cmek-performance.png new file mode 100644 index 00000000000..c8726203179 Binary files /dev/null and b/docs/ja/_snippets/images/cmek-performance.png differ diff --git a/docs/ja/_snippets/images/cmek1.png b/docs/ja/_snippets/images/cmek1.png new file mode 100644 index 00000000000..5b1f4bbe6f3 Binary files /dev/null and b/docs/ja/_snippets/images/cmek1.png differ diff --git a/docs/ja/_snippets/images/cmek2.png b/docs/ja/_snippets/images/cmek2.png new file mode 100644 index 00000000000..770e6774da9 Binary files /dev/null and b/docs/ja/_snippets/images/cmek2.png differ diff --git a/docs/ja/_snippets/images/cmek3.png b/docs/ja/_snippets/images/cmek3.png new file mode 100644 index 00000000000..27b2183f44b Binary files /dev/null and b/docs/ja/_snippets/images/cmek3.png differ diff --git a/docs/ja/_snippets/images/connect1.png b/docs/ja/_snippets/images/connect1.png new file mode 100644 index 00000000000..e534d7da388 Binary files /dev/null and b/docs/ja/_snippets/images/connect1.png differ diff --git a/docs/ja/_snippets/images/connect2.png b/docs/ja/_snippets/images/connect2.png new file mode 100644 index 00000000000..5e02ec95970 Binary files /dev/null and b/docs/ja/_snippets/images/connect2.png differ diff --git a/docs/ja/_snippets/images/connect3.png b/docs/ja/_snippets/images/connect3.png new file mode 100644 index 00000000000..ea769fe176a Binary files /dev/null and b/docs/ja/_snippets/images/connect3.png differ diff --git a/docs/ja/_snippets/images/connect4.png b/docs/ja/_snippets/images/connect4.png new file mode 100644 index 00000000000..ccdbaf94427 Binary files /dev/null and b/docs/ja/_snippets/images/connect4.png differ diff --git a/docs/ja/_snippets/images/connection-details-https.png b/docs/ja/_snippets/images/connection-details-https.png new file mode 100644 index 00000000000..cdd70b179e6 Binary files /dev/null and b/docs/ja/_snippets/images/connection-details-https.png differ diff --git a/docs/ja/_snippets/images/connection-details-native.png b/docs/ja/_snippets/images/connection-details-native.png new file mode 100644 index 00000000000..9eb043b564d Binary files /dev/null and b/docs/ja/_snippets/images/connection-details-native.png differ diff --git a/docs/ja/_snippets/images/createservice1.png b/docs/ja/_snippets/images/createservice1.png new file mode 100644 index 00000000000..c1e7b131a59 Binary files /dev/null and b/docs/ja/_snippets/images/createservice1.png differ diff --git a/docs/ja/_snippets/images/createservice2.png b/docs/ja/_snippets/images/createservice2.png new file mode 100644 index 00000000000..a79b51eebf9 Binary files /dev/null and b/docs/ja/_snippets/images/createservice2.png differ diff --git a/docs/ja/_snippets/images/createservice3.png b/docs/ja/_snippets/images/createservice3.png new file mode 100644 index 00000000000..422af55a832 Binary files /dev/null and b/docs/ja/_snippets/images/createservice3.png differ diff --git a/docs/ja/_snippets/images/createservice4.png b/docs/ja/_snippets/images/createservice4.png new file mode 100644 index 00000000000..5cf0113cd04 Binary files /dev/null and b/docs/ja/_snippets/images/createservice4.png differ diff --git a/docs/ja/_snippets/images/gcp-authorized-network.png b/docs/ja/_snippets/images/gcp-authorized-network.png new file mode 100644 index 00000000000..3fdd4d18a4f Binary files /dev/null and b/docs/ja/_snippets/images/gcp-authorized-network.png differ diff --git a/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png b/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png new file mode 100644 index 00000000000..f24612707c1 Binary files /dev/null and b/docs/ja/_snippets/images/ip-allow-list-add-current-ip.png differ diff --git a/docs/ja/_snippets/images/ip-allow-list-check-list.png b/docs/ja/_snippets/images/ip-allow-list-check-list.png new file mode 100644 index 00000000000..ed415f0828d Binary files /dev/null and b/docs/ja/_snippets/images/ip-allow-list-check-list.png differ diff --git a/docs/ja/_snippets/images/mysql1.png b/docs/ja/_snippets/images/mysql1.png new file mode 100644 index 00000000000..0f30799f701 Binary files /dev/null and b/docs/ja/_snippets/images/mysql1.png differ diff --git a/docs/ja/_snippets/images/mysql2.png b/docs/ja/_snippets/images/mysql2.png new file mode 100644 index 00000000000..105031eafca Binary files /dev/null and b/docs/ja/_snippets/images/mysql2.png differ diff --git a/docs/ja/_snippets/images/mysql3.png b/docs/ja/_snippets/images/mysql3.png new file mode 100644 index 00000000000..9a8a24814dc Binary files /dev/null and b/docs/ja/_snippets/images/mysql3.png differ diff --git a/docs/ja/_snippets/images/mysql4.png b/docs/ja/_snippets/images/mysql4.png new file mode 100644 index 00000000000..9f1a3876a3a Binary files /dev/null and b/docs/ja/_snippets/images/mysql4.png differ diff --git a/docs/ja/_snippets/images/mysql5.png b/docs/ja/_snippets/images/mysql5.png new file mode 100644 index 00000000000..5bccdfa31b1 Binary files /dev/null and b/docs/ja/_snippets/images/mysql5.png differ diff --git a/docs/ja/_snippets/images/openapi1.png b/docs/ja/_snippets/images/openapi1.png new file mode 100644 index 00000000000..2009f085cc7 Binary files /dev/null and b/docs/ja/_snippets/images/openapi1.png differ diff --git a/docs/ja/_snippets/images/openapi2.png b/docs/ja/_snippets/images/openapi2.png new file mode 100644 index 00000000000..b182d12faaf Binary files /dev/null and b/docs/ja/_snippets/images/openapi2.png differ diff --git a/docs/ja/_snippets/images/openapi3.png b/docs/ja/_snippets/images/openapi3.png new file mode 100644 index 00000000000..92b517546a0 Binary files /dev/null and b/docs/ja/_snippets/images/openapi3.png differ diff --git a/docs/ja/_snippets/images/openapi4.png b/docs/ja/_snippets/images/openapi4.png new file mode 100644 index 00000000000..f2e0490ee37 Binary files /dev/null and b/docs/ja/_snippets/images/openapi4.png differ diff --git a/docs/ja/_snippets/images/openapi5.png b/docs/ja/_snippets/images/openapi5.png new file mode 100644 index 00000000000..0333cd56b23 Binary files /dev/null and b/docs/ja/_snippets/images/openapi5.png differ diff --git a/docs/ja/_snippets/images/s3/s3-1.png b/docs/ja/_snippets/images/s3/s3-1.png new file mode 100644 index 00000000000..23d93874fbb Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-1.png differ diff --git a/docs/ja/_snippets/images/s3/s3-2.png b/docs/ja/_snippets/images/s3/s3-2.png new file mode 100644 index 00000000000..64c09710bc3 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-2.png differ diff --git a/docs/ja/_snippets/images/s3/s3-3.png b/docs/ja/_snippets/images/s3/s3-3.png new file mode 100644 index 00000000000..32617f3002e Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-3.png differ diff --git a/docs/ja/_snippets/images/s3/s3-4.png b/docs/ja/_snippets/images/s3/s3-4.png new file mode 100644 index 00000000000..efedf267d62 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-4.png differ diff --git a/docs/ja/_snippets/images/s3/s3-5.png b/docs/ja/_snippets/images/s3/s3-5.png new file mode 100644 index 00000000000..12286c41e2f Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-5.png differ diff --git a/docs/ja/_snippets/images/s3/s3-6.png b/docs/ja/_snippets/images/s3/s3-6.png new file mode 100644 index 00000000000..0b39a26a340 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-6.png differ diff --git a/docs/ja/_snippets/images/s3/s3-7.png b/docs/ja/_snippets/images/s3/s3-7.png new file mode 100644 index 00000000000..7b869d71711 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-7.png differ diff --git a/docs/ja/_snippets/images/s3/s3-8.png b/docs/ja/_snippets/images/s3/s3-8.png new file mode 100644 index 00000000000..329c9e70ca1 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-8.png differ diff --git a/docs/ja/_snippets/images/s3/s3-9.png b/docs/ja/_snippets/images/s3/s3-9.png new file mode 100644 index 00000000000..5a08e26dea5 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-9.png differ diff --git a/docs/ja/_snippets/images/s3/s3-a.png b/docs/ja/_snippets/images/s3/s3-a.png new file mode 100644 index 00000000000..6dbe8745747 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-a.png differ diff --git a/docs/ja/_snippets/images/s3/s3-b.png b/docs/ja/_snippets/images/s3/s3-b.png new file mode 100644 index 00000000000..8625bdc4b29 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-b.png differ diff --git a/docs/ja/_snippets/images/s3/s3-c.png b/docs/ja/_snippets/images/s3/s3-c.png new file mode 100644 index 00000000000..aa0bd4e798c Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-c.png differ diff --git a/docs/ja/_snippets/images/s3/s3-d.png b/docs/ja/_snippets/images/s3/s3-d.png new file mode 100644 index 00000000000..404f2a3f565 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-d.png differ diff --git a/docs/ja/_snippets/images/s3/s3-e.png b/docs/ja/_snippets/images/s3/s3-e.png new file mode 100644 index 00000000000..878eb6a3e3c Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-e.png differ diff --git a/docs/ja/_snippets/images/s3/s3-f.png b/docs/ja/_snippets/images/s3/s3-f.png new file mode 100644 index 00000000000..3bad9361172 Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-f.png differ diff --git a/docs/ja/_snippets/images/s3/s3-g.png b/docs/ja/_snippets/images/s3/s3-g.png new file mode 100644 index 00000000000..a1cfe53ef9e Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-g.png differ diff --git a/docs/ja/_snippets/images/s3/s3-h.png b/docs/ja/_snippets/images/s3/s3-h.png new file mode 100644 index 00000000000..6d08a3b059b Binary files /dev/null and b/docs/ja/_snippets/images/s3/s3-h.png differ diff --git a/docs/ja/about-us/_category_.yml b/docs/ja/about-us/_category_.yml new file mode 100644 index 00000000000..dfa8c8a3912 --- /dev/null +++ b/docs/ja/about-us/_category_.yml @@ -0,0 +1,6 @@ +label: 'About Us' +collapsible: true +collapsed: true +link: + type: generated-index + title: About Us diff --git a/docs/ja/about-us/adopters.md b/docs/ja/about-us/adopters.md new file mode 100644 index 00000000000..c28d11106e2 --- /dev/null +++ b/docs/ja/about-us/adopters.md @@ -0,0 +1,512 @@ +--- +slug: /ja/about-us/adopters +sidebar_label: 導入企業 +title: ClickHouse 導入企業 +sidebar_position: 60 +description: ClickHouse を導入している企業とその成功事例の一覧 +--- + +以下は、ClickHouse を導入している企業とその成功事例の一覧です。これらの情報は公開されている資料から収集されたものであり、現在の状況と異なる場合があります。貴社での ClickHouse 導入事例を共有し、[リストに追加](https://github.com/ClickHouse/clickhouse-docs/blob/main/docs/en/about-us/adopters.md)していただけると幸いです。ただし、共有に際しては NDA(秘密保持契約)に抵触しないことをご確認ください。他社の公開情報の更新も有益です。 + +
+ +| Company | Industry | Usecase | Cluster Size | (Un)Compressed Data Size\* | Reference | +|---------|----------|---------|--------------|------------------------------------------------------------------------------|-----------| +| [1Flow](https://1flow.ai/) | Feedback automation | - | — | — | ClickHouse Cloud user | +| [2gis](https://2gis.ru) | Maps | Monitoring | — | — | [Talk in Russian, July 2019](https://youtu.be/58sPkXfq6nw) | +| [3xpl](https://3xpl.com/) | Software & Technology | Blockchain Explorer | — | — | [Reddit, February 2023](https://www.reddit.com/r/ethereum/comments/1159pdg/new_ethereum_explorer_by_3xpl_no_ads_super_fast/) | +| [5CNetwork](https://www.5cnetwork.com/) | Software | Analytics | — | — | [Community Slack](https://clickhouse.com/slack) | +| [ASO.dev](https://aso.dev/) | Software & Technology | App store optimisation | — | — | [Twitter, April 2023](https://twitter.com/gorniv/status/1642847791226445828) | +| [AdGreetz](https://www.adgreetz.com/) | Software & Technology | AdTech & MarTech | — | — | [Blog, April 2023](https://clickhouse.com/blog/adgreetz-processes-millions-of-daily-ad-impressions) | +| [AdGuard](https://adguard.com/) | Anti-Ads | AdGuard DNS | — | 1,000,000 DNS requests per second from over 50 million users | [Official Website, August 2022](https://adguard.com/en/blog/adguard-dns-2-0-goes-open-source.html) | +| [AdScribe](http://www.adscribe.tv/) | Ads | TV Analytics | — | — | [A quote from CTO](https://altinity.com/24x7-support/) | +| [Adapty](https://adapty.io/) | Subscription Analytics | Main product | — | — | [Twitter, November 2021](https://twitter.com/iwitaly/status/1462698148061659139) | +| [Adevinta](https://www.adevinta.com/) | Software & Technology | Online Classifieds | — | — | [Blog, April 2023](https://clickhouse.com/blog/serving-real-time-analytics-across-marketplaces-at-adevinta) | +| [Admiral](https://getadmiral.com/) | Martech | Engagement Management | — | — | [Webinar Slides, June 2020](https://altinity.com/presentations/2020/06/16/big-data-in-real-time-how-clickhouse-powers-admirals-visitor-relationships-for-publishers) | +| [Admixer](https://admixer.com/) | Media & Entertainment | Ad Analytics | — | — | [Blog Post](https://clickhouse.com/blog/admixer-aggregates-over-1-billion-unique-users-a-day-using-clickhouse) | +| [Aggregations.io](https://aggregations.io/) | Real-time analytics | Main product | - | - | [Twitter](https://twitter.com/jsneedles/status/1734606200199889282) | +| [Ahrefs](https://ahrefs.com/) | SEO | Analytics | Main cluster is 100k+ CPU cores, 800TB RAM. | 110PB nvme storage, uncompressed data size on main cluster is 1EB. | [Job listing](https://ahrefs.com/jobs/data-scientist-search) | +| [Airfold](https://www.airfold.co/) | API platform | Main Product | - | - | [Documentation](https://docs.airfold.co/workspace/pipes) | +| [Aiven](https://aiven.io/) | Cloud data platform | Managed Service | - | - | [Blog post](https://aiven.io/blog/introduction-to-clickhouse) | +| [Akamai](https://www.akamai.com/) | Software & Technology | CDN | — | — | [LinkedIn](https://www.linkedin.com/in/david-piatek-bb27368/) | +| [Akvorado](https://demo.akvorado.net/) | Network Monitoring | Main Product | — | — | [Documentation](https://demo.akvorado.net/docs/intro) | +| [AlgoNode](https://algonode.io/) | Software & Technology | Algorand Hosting | — | — | [Twitter, April 2023](https://twitter.com/AlgoNode_io/status/1650594948998213632) | +| [Alibaba Cloud](https://cn.aliyun.com/) | Cloud | E-MapReduce | — | — | [Official Website](https://help.aliyun.com/document_detail/212195.html) | +| [Alibaba Cloud](https://cn.aliyun.com/) | Cloud | Managed Service | — | — | [Official Website](https://help.aliyun.com/product/144466.html) | +| [Aloha Browser](https://alohabrowser.com/) | Mobile App | Browser backend | — | — | [Slides in Russian, May 2019](https://presentations.clickhouse.com/meetup22/aloha.pdf) | +| [Altinity](https://altinity.com/) | Cloud, SaaS | Main product | — | — | [Official Website](https://altinity.com/) | +| [Amadeus](https://amadeus.com/) | Travel | Analytics | — | — | [Press Release, April 2018](https://www.altinity.com/blog/2018/4/5/amadeus-technologies-launches-investment-and-insights-tool-based-on-machine-learning-and-strategy-algorithms) | +| [AMP](https://useamp.com/) | Software & Technology | e-Commerce Metrics | — | — | [Twitter Post, May 2024](https://x.com/pc_barnes/status/1793846059724357832) [Meetup Slides](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup122/Talk%20Track%201%20-%20AMP's%20data%20journey%20from%20OSS%20to%20ClickHouse%20Cloud%20-%20Chris%20Lawrence%20.pdf) | +| [Android Hub](https://bestforandroid.com/) | Blogging, Analytics, Advertising data | — | — | — | [Official Website](https://bestforandroid.com/)| +| [AnswerAI](https://www.answerai.co.uk/) | Software & Technology | AI Customer Support | — | — | [Twitter, May 2024](https://twitter.com/TomAnswerAi/status/1791062219678998880) | +| [Anton](https://anton.tools/) | Software & Technology | Blockchain Indexer | — | — | [GitHub](https://github.com/tonindexer/anton) | +| [Antrea](https://antrea.io/) | Software & Technology | Kubernets Network Security | — | — | [Documentation](https://antrea.io/docs/main/docs/network-flow-visibility/) | +| [ApiRoad](https://apiroad.net/) | API marketplace | Analytics | — | — | [Blog post, November 2018, March 2020](https://pixeljets.com/blog/clickhouse-vs-elasticsearch/) | +| [Apitally](https://apitally.io/) | Software & Technology | API Monitoring | — | — | [Twitter, March 2024](https://twitter.com/simongurcke/status/1766005582971170926) | +| [Appsflyer](https://www.appsflyer.com) | Mobile analytics | Main product | — | — | [Talk in Russian, July 2019](https://www.youtube.com/watch?v=M3wbRlcpBbY) | +| [Aptabase](https://aptabase.com/) | Analytics | Privacy-first / open-source Firebase Analytics alternative | — | — | [GitHub Repository](https://github.com/aptabase/aptabase/tree/main/etc/clickhouse) | +| [ArenaData](https://arenadata.tech/) | Data Platform | Main product | — | — | [Slides in Russian, December 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup38/indexes.pdf) | +| [Argedor](https://www.argedor.com/en/clickhouse/) | ClickHouse support | — | — | — | [Official website](https://www.argedor.com/en/clickhouse/) | +| [Atani](https://atani.com/en/) | Software & Technology | Crypto Platform | — | — | [CTO LinkedIn](https://www.linkedin.com/in/fbadiola/) | +| [Autoblocks](https://autoblocks.ai) | Software & Technology | LLM Monitoring & Deployment | — | — | [Twitter, August 2023](https://twitter.com/nolte_adam/status/1690722237953794048) | +| [Aviso](https://www.aviso.com/) | AI Platform | Reporting | — | — | ClickHouse Cloud user | +| [Avito](https://avito.ru/) | Classifieds | Monitoring | — | — | [Meetup, April 2020](https://www.youtube.com/watch?v=n1tm4j4W8ZQ) | +| [Axis Communications](https://www.axis.com/en-ca) | Video surveillance | Main product | - | - | [Blog post](https://engineeringat.axis.com/schema-changes-clickhouse/) | +| [AzurePrice](https://azureprice.net/) | Analytics | Main Product | — | — | [Blog, November 2022](https://blog.devgenius.io/how-i-migrate-to-clickhouse-and-speedup-my-backend-7x-and-decrease-cost-by-6x-part-1-2553251a9059) | +| [AzurGames](https://azurgames.com/) | Gaming | Analytics | — | — | [AWS Blog, Aug 2024](https://aws.amazon.com/blogs/gametech/azur-games-migrates-all-game-analytics-data-to-clickhouse-cloud-on-aws/) | +| [B2Metric](https://b2metric.com/) | Marketing | Analytics | — | — | [ProductHunt, July 2023](https://www.producthunt.com/posts/b2metric-decision-intelligence?bc=1) | +| [Backpack Exchange](https://backpack.exchange/) | FinTech | Analytics | — | — | [Meetup, June 2024](https://clickhouse.com/videos/tokyo-meetup-orchestrating-multibillion-row-database-migration-to-clickhouse) | +| [BIGO](https://www.bigo.sg/) | Video | Computing Platform | — | — | [Blog Article, August 2020](https://www.programmersought.com/article/44544895251/) | +| [Badoo](https://badoo.com) | Dating | Timeseries | — | 1.6 mln events/sec (2018) | [Slides in Russian, December 2019](https://presentations.clickhouse.com/meetup38/forecast.pdf) | +| [Baidu](https://www.baidu.com/) | Internet services | Data warehousing | - | - | [GitHub](https://github.com/ClickHouse/ClickHouse/pull/60361) | +| [Baselime](https://baselime.io/) | Software & Technology | Observability for Serverless | — | — | [Official website](https://baselime.io/) | +| [Basic RUM](https://www.basicrum.com/) | Software & Technology | Real User Monitoring | — | — | [Official website](https://www.basicrum.com/) | +| [Beehiiv](https://www.beehiiv.com/) | Marketing | Analytics | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/data-hive-the-story-of-beehiivs-journey-from-postgres-to-clickhouse) | +| [Beeline](https://beeline.ru/) | Telecom | Data Platform | — | — | [Blog post, July 2021](https://habr.com/en/company/beeline/blog/567508/) | +| [Beetested](https://www.beetested.com/) | Software & Technology | Game Testing | — | — | [Case Study, June 2023](https://double.cloud/resources/case-studies/beetested-analyze-millions-of-gamers-emotions-with-doublecloud/) | +| [Benocs](https://www.benocs.com/) | Network Telemetry and Analytics | Main Product | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=48pAVShkeCY&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=12) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup66/Self%20repairing%20processing%20using%20ClickHouse.pdf) [Blog Post, March 2022](https://clickhouse.com/blog/-indexing-for-data-streams-benocs-telco/) [Slides in English, October 2017](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup9/lpm.pdf) | +| [Bento](https://bento.me/en/home) | Software & Technology | Personal Portfolio | — | — | [Twitter, May 2023](https://twitter.com/gubmee/status/1653405962542219264) | +| [Better Stack](https://betterstack.com/) | Cloud, SaaS | Log Management | - | - | [Official Website](https://betterstack.com/logtail) | +| [BiliBili](https://www.bilibili.com/) | Video sharing | — | — | — | [Blog post, June 2021](https://chowdera.com/2021/06/20210622012241476b.html) | +| [Binom](https://binom.org/) | Analytics | Website analytics | — | — | [Twitter, 2023](https://twitter.com/BinomTracker/status/1722948130948206940) | +| [Bitquery](https://bitquery.io/) | Software & Technology | Blockchain Data Company | — | — | [HackerNews, December 2020](https://bitquery.io/blog/blockchain-intelligence-system) | +| [Bloomberg](https://www.bloomberg.com/) | Finance, Media | Monitoring | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=HmJTIrGyVls&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=9) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup67/ClickHouse%20for%20Financial%20Analytics%20-%20Bloomberg.pdf) | +| [Bloxy](https://bloxy.info) | Blockchain | Analytics | — | — | [Slides in Russian, August 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/4_bloxy.pptx) | +| [Bonree](https://www.bonree.com/) | Software & Technology | Performance Monitoring & Observability | — | — | ClickHouse Meetup in Hangzhou, May 2024 | +| [Bonside](https://www.bonside.com/) | FinTech | - | — | — | [HackerNews, July 2023](https://news.ycombinator.com/item?id=36619722) | +| [Botify](https://www.botify.com/) | SaaS | SEO | — | — | [Blog Article, September 2022](https://tech.marksblogg.com/billion-taxi-rides-doublecloud-clickhouse.html) | +| [Braintrust](https://www.usebraintrust.com/) | Software & Technology | Real-time Analytics | — | — | [Written Blog from Meetup Video, July 2024](https://clickhouse.com/blog/building-better-ai-products-faster-how-braintrust-uses-clickhouse-for-real-time-data-analysis) | +| [ByConity](https://byconity.github.io/)| Software & Technology | Big Data Analysis Engine | — | — | [GitHub](https://github.com/ByConity/ByConity) | +| [Bytedance](https://www.bytedance.com) | Social platforms | — | — | — | [The ClickHouse Meetup East, October 2020](https://www.youtube.com/watch?v=ckChUkC3Pns) | +| [CARTO](https://carto.com/) | Business Intelligence | Geo analytics | — | — | [Geospatial processing with ClickHouse](https://carto.com/blog/geospatial-processing-with-clickhouse/) | +| [CERN](http://public.web.cern.ch/public/) | Research | Experiment | — | — | [Press release, April 2012](https://www.yandex.com/company/press_center/press_releases/2012/2012-04-10/) | +| [CHEQ](https://cheq.ai/) | Software & Technology | GTM Security | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=rxIO6w4er3k&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=7) [Slides, January 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup68/ClickHouse%20Meetup%20-%20CHEQ.pptx.pdf) | +| [Campaign Deputy](https://campaigndeputy.com/) | SaaS | Analytics, Logs | — | — | [Twitter, February 2023](https://twitter.com/joshabartley/status/1627669208074014721), [Tweet, July 2023](https://twitter.com/joshabartley/status/1677008728711651331) | +| [Canopus Networks](https://canopusnetworks.com/) | AI for telcos | Real-time analytics | - | - | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup126/Talk%20Track%201%20-%20Canopus%20Networks.pdf) | +| [Capgo.app](https://capgo.app/) | App development | Real-time statistics | - | - | [Twitter](https://twitter.com/martindonadieu/status/1735728943406219736) | +| [CardsMobile](https://cardsmobile.ru/) | Finance | Analytics | — | — | [VC.ru](https://vc.ru/s/cardsmobile/143449-rukovoditel-gruppy-analiza-dannyh) | +| [Castle](https://castle.io/) | Fraud Detection | Main product | — | — | [Community Slack](https://clickhouse.com/slack) | +| [Cato Networks](https://www.catonetworks.com/) | Network Security | Security event analytics | — | 8B (4TB) new events per day | [Full Stack Developers Israel, Jan 2023](https://www.youtube.com/watch?v=Is4TC2gf5EM) | +| [CDN77](https://www.cdn77.com/) | Software & Technology | Content Delivery Network | — | — | [GitHub Comment, April 2024](https://github.com/ClickHouse/ClickHouse/issues/61093#issuecomment-2070150654) | +| [Chainbase](https://chainbase.online/) | Blockchain | Main product | — | — | [Documentation](https://docs.chainbase.online/r/data-cloud-studio/data-cloud-api) | +| [ChatLayer](https://chatlayer.ai/) | AI virtual assistants | Analytics | — | — | [Press Release, December 2021](https://aiven.io/blog/aiven-for-clickhouse-now-generally-available) | +| [Checkly](https://www.checklyhq.com/) | Software Development | Analytics | — | — | [Twitter, October 2021](https://twitter.com/tim_nolet/status/1445810665743081474?s=20) | +| [ChelPipe Group](https://chelpipegroup.com/) | Analytics | — | — | — | [Blog post, June 2021](https://vc.ru/trade/253172-tyazhelomu-proizvodstvu-user-friendly-sayt-internet-magazin-trub-dlya-chtpz) | +| [Chroma](https://www.trychroma.com/) | Software & Technology | AI-native embedded database | — | — | [GitHub Repository](https://github.com/chroma-core/chroma) [Twitter, February 2023](https://twitter.com/atroyn/status/1625605732644298752) | +| [CipherStash](https://cipherstash.com/) | Software & Technology | Analytics | — | — | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup126/Talk%20Track%203%20-%20CipherStash.pdf) | +| [Cisco](http://cisco.com/) | Networking | Traffic analysis | — | — | [Lightning talk, October 2019](https://youtu.be/-hI1vDR2oPY?t=5057) | +| [Citadel Securities](https://www.citadelsecurities.com/) | Finance | — | — | — | [Contribution, March 2019](https://github.com/ClickHouse/ClickHouse/pull/4774) | +| [Citymobil](https://city-mobil.ru) | Taxi | Analytics | — | — | [Blog Post in Russian, March 2020](https://habr.com/en/company/citymobil/blog/490660/) | +| [Clearbit](https://clearbit.com/) | AI | Product usage | — | — | ClickHouse Cloud user | +| [ClickFunnels](https://www.clickfunnels.com/) | Website Builder | | — | — | ClickHouse Cloud user | +| [ClickVisual](https://clickvisual.net/) | Software | Logging Platform | — | — | [Blog Post, May 2022](https://golangexample.com/a-light-weight-log-visual-analytic-platform-for-clickhouse/) | +| [Clog](https://www.hybridlogic.co.uk/) | Software & Technology | Logging | — | — | [Blog, February 2023](https://www.hybridlogic.co.uk/2023/02/clog/) | +| [Cloudflare](https://cloudflare.com) | CDN | Traffic analysis | 36 servers | — | [Blog post, May 2017](https://blog.cloudflare.com/how-cloudflare-analyzes-1m-dns-queries-per-second/), [Blog post, March 2018](https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/) | +| [CloudRaft](https://www.cloudraft.io/) | Software & Technology | Consulting Services | — | — | [Twitter, May 2024](https://x.com/anjuls/status/1792048331805606156) | +| [Codegiant](https://codegiant.io/) | Security | Main product | — | — | [Blog, December 2023](https://blog.codegiant.io/clickhouse-in-codegiant-observability-ecosystem/) | +| [Cognitiv](https://cognitiv.ai/) | AdTech | Offline Feature Store | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/transforming-ad-tech-how-cognitiv-uses-clickhouse-to-build-better-machine-learning-models) | +| [Coinhall](https://coinhall.org/) | Web3 | Blockchain Data Platform | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/trade-secrets-how-coinhall-uses-clickhouse-to-power-its-blockchain-data-platform) | +| [Coinpaprika](https://coinpaprika.com/) | Software & Technology | Cryptocurrency Market Data Analysis | — | — | [Blog, May 2023](https://clickhouse.com/blog/coinpaprika-aggregates-pricing-data) | +| [Comcast](https://corporate.comcast.com/) | Media | CDN Traffic Analysis | — | — | [ApacheCon 2019 Talk](https://www.youtube.com/watch?v=e9TZ6gFDjNg) | +| [Common Room](https://www.commonroom.io/) | Marketing SaaS | Real-Time Analytics | — | — | [Seattle Meetup, March 2024](https://www.youtube.com/watch?v=liTgGiTuhJE) | +| [Constructor](https://constructor.io/) | E-commerce Search | E-commerce Search | — | — | ClickHouse Cloud user | +| [Contentsquare](https://contentsquare.com) | Web analytics | Main product | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=zvuCBAl2T0Q&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=5) [Blog Post, October 2022](https://clickhouse.com/blog/contentsquare-migration-from-elasticsearch-to-clickhouse) [Blog post in French, November 2018](http://souslecapot.net/2018/11/21/patrick-chatain-vp-engineering-chez-contentsquare-penser-davantage-amelioration-continue-que-revolution-constante/) | +| [Coroot](https://coroot.com/) | Software & Technology | Observability | — | — | [Twitter, July 2023](https://twitter.com/coroot_com/status/1680993372385804288?s=20) | +| [Corsearch](https://corsearch.com/) | Marketing SaaS (Brand Protection) | Main Datastore | — | — | [Seattle Meetup, March 2023](https://www.youtube.com/watch?v=BuS8jFL9cvw&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=10) | +| [Corunet](https://coru.net/) | Analytics | Main product | — | — | [Slides in English, April 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup21/predictive_models.pdf) | +| [Covalent](https://www.covalenthq.com/) | Financial - Crypto | Blockchain analysis | — | — | ClickHouse Cloud user | +| [CraiditX 氪信](https://www.creditx.com) | Finance AI | Analysis | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/udf.pptx) | +| [Craigslist](https://sfbay.craigslist.org/) | Classifieds | Rate limiting (Redis replacement) | — | — | [SF Meetup, March 2024](https://www.youtube.com/watch?v=wRwqrbUjRe4&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=9) | +| [Crazypanda](https://crazypanda.ru/en/) | Games | | — | — | Live session on ClickHouse meetup | +| [Criteo](https://www.criteo.com/) | Retail | Main product | — | — | [Slides in English, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/3_storetail.pptx) | +| [Cryptology](https://cryptology.com/) | Digital Assets Trading Platform | — | — | — | [Job advertisement, March 2021](https://career.habr.com/companies/cryptology/vacancies) | +| [Culver Max Entertainment/Sony Pictures](https://www.sonypicturesnetworks.com/overview) | Television/Entertainment | Media streaming analytics | — | — | ClickHouse Cloud user | +| [Cumul.io](https://www.cumul.io) | Software & Technology | Customer Analytics | — | — | [Blog Post, June 2022](https://clickhouse.com/blog/optimizing-your-customer-facing-analytics-experience-with-cumul-io-and-clickhouse) | +| [DB Pilot](https://www.dbpilot.io/)| Software & Technology | Database GUI | — | — | [Twitter, August 2023](https://twitter.com/dennis_hellweg/status/1701349566354686143) | +| [DENIC](https://www.denic.de/) | Software & Technology | Data Science Analytics | — | — | [Blog Post, May 2022](https://clickhouse.com/blog/denic-improves-query-times-by-10x-with-clickhouse) | +| [DNSMonster](https://dnsmonster.dev/) | Software & Technology | DNS Monitoring | — | — | [GitHub Repository](https://github.com/mosajjal/dnsmonster) | +| [Darwinium](https://www.darwinium.com/) | Software & Technology | Security and Fraud Analytics | — | — | [Blog Post, July 2022](https://clickhouse.com/blog/fast-feature-rich-and-mutable-clickhouse-powers-darwiniums-security-and-fraud-analytics-use-cases) | +| [Dashdive](https://www.dashdive.com/) | Infrastructure management | Analytics | — | — | [Hackernews, 2024](https://news.ycombinator.com/item?id=39178753) | +| [Dassana](https://lake.dassana.io/) | Cloud data platform | Main product | - | - | [Blog Post, Jan 2023](https://clickhouse.com/blog/clickhouse-powers-dassanas-security-data-lake) [Direct reference, April 2022](https://news.ycombinator.com/item?id=31111432) | +| [Datafold](https://www.datafold.com/) | Data Reliability Platform | — | — | — | [Job advertisement, April 2022](https://www.datafold.com/careers) | +| [Dataliance for China Telecom](https://www.chinatelecomglobal.com/) | Telecom | Analytics | — | — | [Slides in Chinese, January 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/telecom.pdf) | +| [DeepFlow](https://deepflow.io) | Software & Technology | Observability | — | — | [GitHub](https://github.com/deepflowio/deepflow) | +| [DeepL](https://www.deepl.com/) | Machine Learning | — | — | — | [Blog Post, July 2022](https://clickhouse.com/blog/deepls-journey-with-clickhouse) [Video, October 2021](https://www.youtube.com/watch?v=WIYJiPwxXdM&t=1182s) | +| [Deepglint 格灵深瞳](https://www.deepglint.com/) | AI, Computer Vision | OLAP | — | — | [Official Website](https://www.deepglint.com/) | +| [Deeplay](https://deeplay.io/eng/) | Gaming Analytics | — | — | — | [Job advertisement, 2020](https://career.habr.com/vacancies/1000062568) | +| [Depot](https://depot.dev/) | Software & Technology | CI & Build Acceleration | — | — | [Twitter, April 2024](https://twitter.com/jacobwgillespie/status/1778463642150695048) | +| [Deutsche Bank](https://db.com) | Finance | BI Analytics | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=O3GJ6jag3Hc&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=11) [Slides in English, October 2019](https://bigdatadays.ru/wp-content/uploads/2019/10/D2-H3-3_Yakunin-Goihburg.pdf) | +| [DevHubStack](http://devhubstack.com/) | Software & Technology | Community Management | — | — | [Twitter, May 2024](https://twitter.com/thedevhubstack/status/1790655455229771789) | +| [Didi](https://web.didiglobal.com/) | Transportation & Ride Sharing | Observability | 400+ logging, 40 tracing | PBs/day / 40GB/s write throughput, 15M queries/day, 200 QPS peak | [Blog, Apr 2024](https://clickhouse.com/blog/didi-migrates-from-elasticsearch-to-clickHouse-for-a-new-generation-log-storage-system) | +| [DigiCert](https://www.digicert.com) | Network Security | DNS Platform | — | over 35 billion events per day | [Job posting, Aug 2022](https://www.indeed.com/viewjob?t=Senior+Principal+Software+Engineer+Architect&c=DigiCert&l=Lehi,+UT&jk=403c35f96c46cf37&rtk=1g9mnof7qk7dv800) | +| [Disney+](https://www.disneyplus.com/) | Video Streaming | Analytics | — | 395 TiB | [Meetup Video, December 2022](https://www.youtube.com/watch?v=CVVp6N8Xeoc&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=8) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup67/Disney%20plus%20ClickHouse.pdf) | +| [Dittofeed](https://dittofeed.com/) | Software & Technology | Open Source Customer Engagement | — | — | [Hackernews, June 2023](https://news.ycombinator.com/item?id=36061344) | +| [Diva-e](https://www.diva-e.com) | Digital consulting | Main Product | — | — | [Slides in English, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup29/ClickHouse-MeetUp-Unusual-Applications-sd-2019-09-17.pdf) | +| [Dolphin Emulator](https://dolphin-emu.org/) | Games | Analytics | — | — | [Twitter, Sept 2022](https://twitter.com/delroth_/status/1567300096160665601) | +| [DotSentry](https://forum.polkadot.network/t/dotsentry-ecosystem-wide-monitoring-solution/8210) | Software & Technology | Monitoring for Polkadot Ecosystem | — | — | [Forum Post, May 2024](https://forum.polkadot.network/t/dotsentry-ecosystem-wide-monitoring-solution/8210) | +| [DrDroid](https://www.drdroid.io/)| Software & Technology | Monitoring | — | — | [Slack, August 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1694151014185729) | +| [Duckbill Group](https://www.duckbillgroup.com/)| Software & Technology | — | — | — | [Twitter, May 2024](https://twitter.com/mike_julian/status/1789737184192315876) | +| [eBay](https://www.ebay.com/) | E-commerce | Logs, Metrics and Events | — | — | [Official website, Sep 2020](https://tech.ebayinc.com/engineering/ou-online-analytical-processing/) | +| [Ecommpay](https://ecommpay.com/) | Payment Processing | Logs | — | — | [Video, Nov 2019](https://www.youtube.com/watch?v=d3GdZTOWGLk) | +| [Ecwid](https://www.ecwid.com/) | E-commerce SaaS | Metrics, Logging | — | — | [Slides in Russian, April 2019](https://nastachku.ru/var/files/1/presentation/backend/2_Backend_6.pdf) | +| [Effodio](https://www.effodio.com/) | Observability, Root cause analysis | Event storage | - | - | [Blog, 2024](https://peng.fyi/post/factorial-growth-of-clickhouse-with-clause/)| +| [Egg](https://github.com/ducc/egg) | Error Aggregation | Main Product | — | — | [GitHub repository](https://github.com/ducc/egg) | +| [Engage](https://engage.so/) | Software & Technology | Customer Engagement | — | — | [Twitter Post, May 2024](https://x.com/kehers/status/1793935987778724038) | +| [Ensemble](https://ensembleanalytics.io/) | Analytics | Analytics | — | — | [Official website, Sep 2020](https://ensembleanalytics.io/blog/why-we-went-all-in-clickhouse) | +| [EventBunker.io](https://www.eventbunker.io/) | Serverless Data Processing | — | — | — | [Twitter, April 2021](https://twitter.com/Halil_D_/status/1379839133472985091) | +| [ExitLag](http://www.exitlag.com/) | Software & Technology | Gaming Data Routing | — | — | [Blog, June 2023](https://clickhouse.com/blog/boosting-game-performance-exitlag-quest-for-a-better-data-management-system) | +| [ExitLag](https://www.exitlag.com/) | Software & Technology | Optimized Gaming Experience | — | — | [ClickHouse Blog, June 2023](https://clickhouse.com/blog/boosting-game-performance-exitlag-quest-for-a-better-data-management-system) | +| [Exness](https://www.exness.com/) | Trading | Metrics, Logging | — | — | [Talk in Russian, May 2019](https://youtu.be/_rpU-TvSfZ8?t=3215) | +| [Explo](https://www.explo.co/) | Analytics | - | — | — | [Integrations Page, August 2022](https://www.explo.co/integrations/clickhouse) | +| [Fastly](https://www.fastly.com/) | Internet Services | Metrics (Graphite replacement) | — | — | [Boston Meetup, Dec 2023](https://clickhouse.com/videos/scaling-graphite-with-clickhouse) | +| [FastNetMon](https://fastnetmon.com/) | DDoS Protection | Main Product | | — | [Official website](https://fastnetmon.com/docs-fnm-advanced/fastnetmon-advanced-traffic-persistency/) | +| [Fastnear](https://fastnear.com/) | Infrastructure | Main product | — | — | [Twitter, 2024](https://twitter.com/ekuzyakov/status/1762500731154698421) | +| [FeatBit](https://www.featbit.co/) | Software & Technology | Feature Flag Management | — | — | [GitHub, August 2023](https://github.com/featbit/featbit) | +| [FinBox](https://finbox.in/)| Software & Technology | Financial Services | — | — | [Slack](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1688198501884219) | +| [Fingerprint](https://fingerprint.com/) | Fraud detection | Fraud detection | — | — | [Meetup](https://www.linkedin.com/posts/system29a_clickhouse-meetup-in-berlin-tue-may-16-activity-7063805876570050561-UE-n/) | +| [Firebolt](https://www.firebolt.io/) | Analytics | Main product | - | - | [VLDB 2022 paper](https://www.firebolt.io/content/firebolt-vldb-cdms-2022), [VLDB 2022 slides](https://cdmsworkshop.github.io/2022/Slides/Fri_C2.5_MoshaPasumansky.pdf) | +| [Fl0](https://www.fl0.com/) | Cloud | Server management | - | - | [Meetup presentation](https://presentations.clickhouse.com/?path=meetup94) | +| [Flipkart](https://www.flipkart.com/) | e-Commerce | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=239) | +| [Flipt](https://www.flipt.io/) | Software | Software development management | - | - | [Blog, 2024](https://www.flipt.io/blog/analytics-with-clickhouse) | +| [FortiSIEM](https://www.fortinet.com/) | Information Security | Supervisor and Worker | — | — | [Documentation](https://help.fortinet.com/fsiem/6-6-0/Online-Help/HTML5_Help/clickhouse_config.htm) | +| [Fortis Games](https://fortisgames.com/) | Game studio | Online data analytics | - | — | [Blog post, July 2023](https://thenewstack.io/a-real-time-data-platform-for-player-driven-game-experiences/) | +| [Foxway](https://www.foxway.com/en/) | Software & Technology | e-Commerce | — | — | [ClickHouse Meetup, April 2024](https://twitter.com/ClickHouseDB/status/1782833838886121492) | +| [Friendly Captcha](https://friendlycaptcha.com) | Bot Protection | — | — | — | [Job Posting, Aug 2022](https://news.ycombinator.com/item?id=32311825) | +| [FunCorp](https://fun.co/rp) | Games | | — | 14 bn records/day as of Jan 2021 | [Article](https://www.altinity.com/blog/migrating-from-redshift-to-clickhouse) | +| [Futurra Group](https://futurragroup.com/) | Analytics | — | — | — | [Article in Russian, December 2021](https://dou.ua/forums/topic/35587/) | +| [G-Core Labs](https://gcorelabs.com/) | Security | Main product | — | — | [Job posting, May 2022](https://careers.gcorelabs.com/jobs/Careers) | +| [Galaxy-Future](https://www.galaxy-future.com/en/home) | Software & Technology | Metric Monitoring & Measurement | — | — | [CudgX GitHub Repository](https://github.com/galaxy-future/cudgx) | +| [Geniee](https://geniee.co.jp) | Ad network | Main product | — | — | [Blog post in Japanese, July 2017](https://tech.geniee.co.jp/entry/2017/07/20/160100) | +| [Genotek](https://www.genotek.ru/) | Bioinformatics | Main product | — | — | [Video, August 2020](https://youtu.be/v3KyZbz9lEE) | +| [Gigapipe](https://gigapipe.com/) | Managed ClickHouse | Main product | — | — | [Official website](https://gigapipe.com/) | +| [Gigasheet](https://gigasheet.co/) | Analytics | Main product | — | — | Direct Reference, February 2022| +| [GitLab](https://gitlab.com/) | Code and DevOps | APM | — | — | [Official website](https://gitlab.com/gitlab-org/incubation-engineering/apm/apm) | +| [Glaber](https://glaber.io/) | Monitoring | Main product | — | — | [Website](https://glaber.io/) | +| [Glenrose Group](https://www.glenrosegroup.com/) | Expense management | — | — | — | [Twitter](https://twitter.com/EncodedRose/status/1706145758897180783) | +| [Gluten](https://github.com/oap-project/gluten) | Software & Technology | Spark performance | — | — | [Github, July 2023](https://github.com/oap-project/gluten) | +| [Goldsky](https://goldsky.com/) | Software & Technology | Blockchain data analytics | - | — | [Documentation, July 2023](https://docs.goldsky.com/) | +| [Good Job Games](https://goodjobgames.com/) | Games | Event Processing | — | — | [Job Posting, Aug 2022](https://news.ycombinator.com/item?id=32313170) | +| [Goodpeople](https://twitter.com/_suzychoi/status/1702113350258180245) | Human Resources | OLAP | — | — | [Twitter, 2023](https://twitter.com/_suzychoi/status/1702113350258180245) | +| [Gorgias](https://www.gorgias.com/) | Software & Technology | eCommerce Helpdesk Analytics | — | — | [ClickHouse Slack, April 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1682502827729909) | +| [Grafbase](https://grafbase.com/) | Software & Technology | GraphQL API Management | — | — | [Blog, June 2023](https://grafbase.com/blog/how-to-build-your-own-realtime-analytics-dashboards) | +| [GraphCDN](https://graphcdn.io/) | CDN | Traffic Analytics | — | — | [Blog Post in English, August 2021](https://altinity.com/blog/delivering-insight-on-graphql-apis-with-clickhouse-at-graphcdn/) | +| [GraphJSON](https://www.graphjson.com) | Cloud analytics platform | Main product | - | - | [Official Website, November 2021](https://www.graphjson.com/guides/about) | +| [GraphQL Hive](https://graphql-hive.com/) | Software Development | Traffic analysis | — | — | [Source code](https://github.com/kamilkisiela/graphql-hive) | +| [Groundcover](https://groundcover.com/) | Observability | Kubernetes Observability | - | — | [Documentation, July 2023](https://docs.groundcover.com/docs/learn-more/architecture) | +| [Grouparoo](https://www.grouparoo.com) | Data Warehouse Integrations | Main product | — | — | [Official Website, August 2021](https://www.grouparoo.com/integrations) | +| [Growthbook](https://www.growthbook.io) | Open Source Feature Flagging | Integration | — | — | [Official Website, July 2022](https://www.growthbook.io) | +| [Gumlet](https://www.gumlet.com/) | CDN | Analytics | — | — | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup133/Talk%20Track%202%20-%20Gumlet.pdf) | +| [HUYA](https://www.huya.com/) | Video Streaming | Analytics | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/7.%20ClickHouse万亿数据分析实践%20李本旺(sundy-li)%20虎牙.pdf) | +| [Haibo 海博科技](https://www.botech.com.cn/) | Big Data | OLAP | — | — | [Personal reference](https://github.com/ClickHouse/clickhouse-docs/pull/279) | +| [Helicone](https://helicone.ai) | Software & Technology | LLM monitoring | — | — | [Meetup, August 2023](https://clickhouse.com/blog/helicones-migration-from-postgres-to-clickhouse-for-advanced-llm-monitoring) | +| [Hewlett-Packard](https://www.hp.com) | Software & Technology | - | — | — | [LinkedIn post, November 2023](https://www.indeed.com/viewjob?t=Machine+Learning+Engineer&c=Hewlett-Packard+CDS+GmbH&l=Houston,+TX&jk=109385f349350746&rtk=1hg3128s9kkf6800) | +| [Hi-Fi](https://hi.fi/) | Software & Technology | Music Industry Analytics | — | — | [Blog Post, January 2023](https://clickhouse.com/blog/hifis-migration-from-bigquery-to-clickhouse) | +| [Highlight](https://www.highlight.io/) | Software & Technology | Monitoring | — | — | [Hacker News, February 2023](https://news.ycombinator.com/item?id=34897645), [GitHub](https://github.com/highlight/highlight/tree/87f7e3882b88e9019d690847a134231e943890fe/backend/clickhouse) | +| [HockeyStack](https://hockeystack.com/) | Analytics platform | OLAP | — | — | [Blog](https://hockeystack.com/blog/a-new-database/) | +| [Honeybadger](https://www.honeybadger.io/) | Software | Error tracking | - | - | [Mastadon 2024](https://hachyderm.io/@wood/111904268945097226) | +| [Hookdeck](https://hookdeck.com/) | Software & Technology | Webhook | — | — | [Twitter, June 2023](https://twitter.com/mkherlakian/status/1666214460824997889) | +| [Hopsteiner](https://www.hopsteiner.com/) | Agriculture | - | — | — | [Job post, July 2023](https://www.indeed.com/viewjob?t=Systems+Administrator&c=S+S+STEINER&l=Yakima,+WA&jk=5b9b7336de0577d5&rtk=1h45ruu32j30q800&from=rss) | +| [Horizon](https://horizon.io/)| Software & Technology | Gaming Analytics | — | — | [Twitter, July 2023](https://twitter.com/peterk/status/1677099027110805504) | +| [Hubalz](https://hubalz.com) | Web analytics | Main product | — | — | [Twitter, July 2023](https://twitter.com/Derinilkcan/status/1676197439152312321) | +| [Hydrolix](https://www.hydrolix.io/) | Cloud data platform | Main product | — | — | [Documentation](https://docs.hydrolix.io/guide/query) | +| [HyperDx](https://www.hyperdx.io/) | Software & Technology | Open Telemetry | — | — | [HackerNews, May 2023](https://news.ycombinator.com/item?id=35881942) | +| [Hystax](https://hystax.com) | Cloud Operations | Observability Analytics | - | - | [Blog](https://hystax.com/clickhouse-for-real-time-cost-saving-analytics-how-to-stop-hammering-screws-and-use-an-electric-screwdriver/) | +| [IBM](https://www.ibm.com) | APM Platform | Ex-Instana | — | — | See Instana | +| [IBM QRadar](https://www.ibm.com) | IBM QRadar Log Insights | Main Product | — | — | [IBM Blog](https://www.ibm.com/blog/closing-breach-window-from-data-to-action/) | +| [ICA](https://www.the-ica.com/) | FinTech | Risk Management | — | — | [Blog Post in English, Sep 2020](https://altinity.com/blog/clickhouse-vs-redshift-performance-for-fintech-risk-management?utm_campaign=ClickHouse%20vs%20RedShift&utm_content=143520807&utm_medium=social&utm_source=twitter&hss_channel=tw-3894792263) | +| [Idealista](https://www.idealista.com) | Real Estate | Analytics | — | — | [Blog Post in English, April 2019](https://clickhouse.com/blog/en/clickhouse-meetup-in-madrid-on-april-2-2019) | +| [Improvado](https://improvado.io/) | Revenue Operations | Data Stack | — | — | [Blog Post, December 2021](https://improvado.io/blog/clickhouse-warehousing-pricing) | +| [INCREFF](https://www.increff.com/) | Retail Technology | Business Intelligence | — | — | [Meetup Presentation](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup133/Talk%20Track%203%20-%20Scaling%20BI%20at%20Increff%20with%20Clickhouse.pdf) | +| [Inigo](https://inigo.io/) | Software & Technology | GraphQL Gateway | — | — | [Blog, March 2023](https://inigo.io/blog/materialized_views_and_clickhouse) [Blog, June 2023](https://clickhouse.com/blog/harnessing-the-power-of-materialized-views-and-clickhouse-for-high-performance-analytics-at-inigo) | +| [Infobaleen](https://infobaleen.com) | AI markting tool | Analytics | — | — | [Official site](https://infobaleen.com) | +| [Infovista](https://www.infovista.com/) | Networks | Analytics | — | — | [Slides in English, October 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup30/infovista.pdf) | +| [Inngest](https://www.inngest.com/) | Software & Technology | Serverless queues and jobs | — | — | [TechCrunch, July 2023](https://techcrunch.com/2023/07/12/inngest-helps-developers-build-their-backend-workflows-raises-3m/) | +| [InnoGames](https://www.innogames.com) | Games | Metrics, Logging | — | — | [Slides in Russian, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/graphite_and_clickHouse.pdf) | +| [Instabug](https://instabug.com/) | APM Platform | Main product | — | — | [Blog Post, May 2022](https://clickhouse.com/blog/10x-improved-response-times-cheaper-to-operate-and-30-storage-reduction-why-instabug-chose-clickhouse-for-apm) | +| [Instacart](https://instacart.com/) | Delivery | Data Engineering and Infrastructure | — | — | [Blog Post, May 2022](https://www.instacart.com/company/how-its-made/data-engineering-and-infrastructure-at-instacart-with-engineering-manager-abhi-kalakuntla/) | +| [Instana](https://www.instana.com) | APM Platform | Main product | — | — | [Twitter post](https://twitter.com/mieldonkers/status/1248884119158882304) | +| [Integros](https://integros.com) | Platform for video services | Analytics | — | — | [Slides in Russian, May 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | +| [inwt](https://www.inwt-statistics.com/) | Software & Technology | Data Science | — | — | [Blog Post, December 2023](https://www.inwt-statistics.com/blog/business_case_air_pollution_forecast) | +| [Ippon Technologies](https://ippon.tech) | Technology Consulting | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=205) | +| [Ivi](https://www.ivi.ru/) | Online Cinema | Analytics, Monitoring | — | — | [Article in Russian, Jan 2018](https://habr.com/en/company/ivi/blog/347408/) | +| [Jerry](https://getjerry.com/) | Automotive SaaS | Analytics (Migrate from Redshift) | — | — | [Blog, May 2024](https://juicefs.com/en/blog/user-stories/read-write-separation) | +| [Jinshuju 金数据](https://jinshuju.net) | BI Analytics | Main product | — | — | [Slides in Chinese, October 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/3.%20金数据数据架构调整方案Public.pdf) | +| [Jitsu](https://jitsu.com) | Cloud Software | Data Pipeline | — | — | [Documentation](https://jitsu.com/docs/destinations-configuration/clickhouse-destination), [Hacker News post](https://news.ycombinator.com/item?id=29106082) | +| [JuiceFS](https://juicefs.com/) | Storage | Shopping Cart | - | - | [Blog](https://juicefs.com/blog/en/posts/shopee-clickhouse-with-juicefs/) | +| [June](https://www.june.so/) | Product analytics | Main product | - | - | [Job post](https://www.ycombinator.com/companies/june/jobs/SHd7fFLYG-founding-engineer) | +| [Juspay](https://juspay.in/) | Software & Technology | Payments | — | — | [Blog, March 2023](https://clickhouse.com/blog/juspay-analyzes-payment-transactions-in-real-time-with-clickhouse) | +| [KGK Global](https://www.kgk-global.com/en/) | Vehicle monitoring | — | — | — | [Press release, June 2021](https://zoom.cnews.ru/news/item/530921) | +| [KMK Online](https://www.kmkonline.co.id/) | Digital Services | Streaming analytics | — | — | ClickHouse Cloud user | +| [Kaiko](https://www.kaiko.com/) | Digital Assets Data Provider | — | — | — | [Job advertisement, April 2022](https://kaiko.talentlyft.com/) | +| [Kakaocorp](https://www.kakaocorp.com/) | Internet company | — | — | — | [if(kakao)2020](https://tv.kakao.com/channel/3693125/cliplink/414129353), [if(kakao)2021](https://if.kakao.com/session/24) | +| [Klaviyo](https://www.klaviyo.com/) | E-Commerce Marketing Automation Platform| — | 128 nodes | — | [Klaviyo Engineering Blog, Jan 2023](https://klaviyo.tech/adaptive-concurrency-control-for-mixed-analytical-workloads-51350439aeec) , [Klaviyo Engineering Blog, July 2023](https://klaviyo.tech/taking-the-first-sip-an-overview-of-klaviyos-segmentation-improvement-project-7db997f36b39) | +| [Knock.app](https://knock.app/) | Software | Notifications management | - | - | [Twitter, 2024](https://twitter.com/cjbell_/status/1759989849577181356)| +| [Kodiak Data](https://www.kodiakdata.com/) | Clouds | Main product | — | — | [Slides in Engish, April 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup13/kodiak_data.pdf) | +| [Kontur](https://kontur.ru) | Software Development | Metrics | — | — | [Talk in Russian, November 2018](https://www.youtube.com/watch?v=U4u4Bd0FtrY) | +| [Kopo Kopo](https://kopokopo.co.ke/) | FinTech | Metrics | — | — | ClickHouse Cloud user | +| [Kuaishou](https://www.kuaishou.com/) | Video | — | — | — | [ClickHouse Meetup, October 2018](https://clickhouse.com/blog/en/2018/clickhouse-community-meetup-in-beijing-on-october-28-2018/) | +| [Kujiale 酷家乐](https://www.kujiale.com/) | VR smart interior design platform. | Use in log monitoring platform. | Main cluster is 800+ CPU cores, 4000+ GB RAM. | SSD 140+ TB, HDD 280+ TB. | [Blog, July 2023](https://juejin.cn/post/7251786922615111740/) | +| [Kyligence](https://kyligence.io/) | Managed Service | Main Product | — | — | [Website](https://kyligence.io/all-inclusive-olap/) | +| [LANCOM Systems](https://www.lancom-systems.com/) | Network Solutions | Traffic analysis | - | - | [ClickHouse Operator for Kubernetes](https://www.lancom-systems.com/), [Hacker News post](https://news.ycombinator.com/item?id=29413660) | +| [Langchain](https://www.langchain.com/) | Software & Technology | LLM Monitoring | - | - | [Blog, Apr 2024](https://clickhouse.com/blog/langchain-why-we-choose-clickhouse-to-power-langchain) | +| [Langtrace AI](https://www.langtrace.ai/) | Software & Technology | LLM Monitoring | - | - | [Twitter, May 2024](https://x.com/karthikkalyan90/status/1790483625743716703) | +| [Lago](https://www.getlago.com/) | Billing automation | - | — | — | [GitHub Wiki post](https://github.com/getlago/lago/wiki/How-ClickHouse-saved-our-events-engine-problem) | +| [Lagon](https://lagon.app/) | Software Development | Serverless Functions | — | — | [Twitter, 2023](https://twitter.com/tomlienard/status/1702759256909394010) | +| [Laudspeaker](https://laudspeaker.com/) | Software & Technology | Open Source Messaging | — | — | [GitHub](https://github.com/laudspeaker/laudspeaker) | +| [Lawrence Berkeley National Laboratory](https://www.lbl.gov) | Research | Traffic analysis | 5 servers | 55 TiB | [Slides in English, April 2019](https://www.smitasin.com/presentations/2019-04-17_DOE-NSM.pdf) | +| [Lever](https://www.lever.co/) | Talent Management | Recruiting | - | - | [Hacker News post](https://news.ycombinator.com/item?id=29558544) | +| [LifeStreet](https://lifestreet.com/) | Ad network | Main product | 75 servers (3 replicas) | 5.27 PiB | [Blog post in Russian, February 2017](https://habr.com/en/post/322620/) | +| [LimeChat](https://www.limechat.ai/) | Mobile chat | Whatsapp Commerce | - | - | [LinkedIn 2024](https://www.linkedin.com/pulse/scaling-analytics-clickhouse-story-nikhil-gupta-gezcc/)| +| [LiteLLM](https://github.com/BerriAI/litellm) | Software | API management | | - | [GitHub](https://github.com/BerriAI/litellm/blob/e7b88c2134a013f527304de29358238a5593f91f/cookbook/misc/clickhouse_insert_logs.py#L4) | +| [Little Red Book (Xiaohongshu)](http://www.xiaohongshu.com/) | Social Media | Data warehouse | — | — | [Presentation, March 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup71/LittleRedBook.pdf) | +| [LogfireAI](https://logfire.ai/) | Software & Technology | Monitoring & Observability | — | — | [Twitter, March 2024](https://twitter.com/logfire_ai/status/1765947119200841883) | +| [LogSnag](https://logsnag.com/) | Software & Technology | Realtime Monitoring | — | — | [Interview, December 2022](https://founderbeats.com/shayan-on-building-and-growing-logsnag-as-a-solo-founder) | +| [Logtail](https://betterstack.com/logtail) | Cloud, SaaS | Log Management | - | - | [Official Website](https://betterstack.com/logtail) | +| [Loja Integrada](https://lojaintegrada.com.br/) | E-Commerce | — | — | — | [Case Study, March 2023](https://double.cloud/resources/case-studies/lojaintegrada-and-pagali-switch-to-doublecloud-to-make-running-clickhouse-easier) | +| [Lookforsale](https://lookforsale.ru/) | E-Commerce | — | — | — | [Job Posting, December 2021](https://telegram.me/javascript_jobs/587318) | +| [Loopme](https://loopme.com/) | AdTech | Analytics | — | — | [Blog, Aug 2024](https://clickhouse.com/blog/measuring-brand-impact-how-loopme-uses-clickhouse-to-deliver-better-brand-advertising-outcomes) | +| [Luabase](https://luabase.com/) | Software | Analytics | — | — | [Hacker News, April 2022](https://news.ycombinator.com/item?id=31040190) | +| [Lyft](https://lyft.com) | Rideshare | - | — | — | [Twitter, July 2023](https://twitter.com/riteshvaryani/status/1685160430606639104) | +| [MAXILECT](https://maxilect.com/) | Ad Tech, Blockchain, ML, AI | — | — | — | [Job advertisement, 2021](https://www.linkedin.com/feed/update/urn:li:activity:6780842017229430784/) | +| [MGID](https://www.mgid.com/) | Ad network | Web-analytics | — | — | [Blog post in Russian, April 2020](http://gs-studio.com/news-about-it/32777----clickhouse---c) | +| [MUX](https://mux.com/) | Online Video | Video Analytics | — | — | [Talk in English, August 2019](https://altinity.com/presentations/2019/8/13/how-clickhouse-became-the-default-analytics-database-for-mux/) | +| [Mail.ru Cloud Solutions](https://mcs.mail.ru/) | Cloud services | Main product | — | — | [Article in Russian](https://mcs.mail.ru/help/db-create/clickhouse#) | +| [Marfeel](https://www.marfeel.com/) | Mobile SaaS | — | — | — | Job offer, Apr 2022 | +| [Marilyn](https://tech.mymarilyn.ru) | Advertising | Statistics | — | — | [Talk in Russian, June 2017](https://www.youtube.com/watch?v=iXlIgx2khwc) | +| [MasMovil](https://www.masmovil.es/) | Telecom | Telecom services | - | - | [Blog](https://clickhouse.com/blog/how-grupo-masmovil-monitors-radio-access-networks-with-clickhouse) | +| [Match Systems](https://matchsystems.com/) | Software & Technology | Blockchain Intelligence & AML | — | — | [Job Posting, March 2024](https://telegra-ph.translate.goog/Senior-Database-Administrator-11-28?_x_tr_sl=ru&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) | +| [Mello](https://mellodesign.ru/) | Marketing | Analytics | 1 server | — | [Article, October 2020](https://vc.ru/marketing/166180-razrabotka-tipovogo-otcheta-skvoznoy-analitiki) | +| [Memfault](https://https://memfault.com/) | Software & Technology | IOT Monitoring | — | — | [Job Listing, August 2023](https://www.ycombinator.com/companies/memfault/jobs/zALzwIe-backend-engineer-systems-data) | +| [cBioPortal](https://www.cbioportal.org/) | Healthcare | Datstore backing portal for cancer genomics | — | — | [NYC Meetup, Dec 2023](https://clickhouse.com/videos/fast-answers-in-cancer-research) | +| [MessageBird](https://www.messagebird.com) | Telecommunications | Statistics | — | — | [Slides in English, November 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup20/messagebird.pdf) | +| [Metoda](https://metoda.com/) | Software & Technology | Advertisting | — | — | [ClickHouse Meetup, September 2022](https://www.youtube.com/watch?v=uS5uA-aZSlQ&t=1770s) | +| [MetricFire](https://www.metricfire.com) | Managed Service | Monitoring | — | — | [Blog, November 2022](https://www.metricfire.com/blog/using-clickhouse-with-metricfire) | +| [Microsoft - Clarity](https://clarity.microsoft.com/) | Web Analytics | Clarity (Main Product) | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=rUVZlquVGw0&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=2) [A question on GitHub](https://github.com/ClickHouse/ClickHouse/issues/21556) | +| [Microsoft - Titan](https://www.microsoft.com/) | Software & Technology | Internal Data Analytics (Titan) | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=r1ZqjU8ZbNs&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=2) | +| [Middleware](https://middleware.io/) | Software | Cloud management | - | - | [SF Meetup, March 2024](https://www.youtube.com/watch?v=xCLMuXJWx80&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=10) | +| [MindsDB](https://www.mindsdb.com/) | Machine Learning | Main Product | — | — | [Official Website](https://www.mindsdb.com/blog/machine-learning-models-as-tables-in-ch) | +| [Modeo](https://modeo.ai/) | Software & Technology | Data Engineering | — | — | [Blog, June 2023](https://clickhouse.com/blog/driving-sustainable-data-management-with-clickhouse-introducing-stash-by-modeo) | +| [moosejs](https://www.moosejs.com/) | Software & Technology | Open-source developer framework | — | — | [Blog Post, May 2024](https://www.fiveonefour.com/blog/product-update-2) | +| [Motodata](https://www.motadata.com/) | Monitoring | Main Product | — | — | [Official Website](https://www.motadata.com/docs) | +| [Muse Group](https://mu.se/) | Music Software | Performance Monitoring | — | — | [Blog post in Russian, January 2021](https://habr.com/en/post/647079/) | +| [MyScale](https://myscale.com/) | Software & Technology | AI Database | — | — | [Docs](https://docs.myscale.com/en/overview/) | +| [NANO Corp](https://nanocorp.fr/en/) | Software & Technology | NOC as a Service | — | — | [Blog Post, July 2022](https://clickhouse.com/blog/from-experimentation-to-production-the-journey-to-supercolumn) | +| [NGINX](https://nginx.com/) | Application Delivery Network | NGINX Management Suite | — | — | [Documentation](https://docs.nginx.com/nginx-management-suite/admin-guides/getting-started/prerequisites/configure-clickhouse/) | +| [NIC Labs](https://niclabs.cl/) | Network Monitoring | RaTA-DNS | — | — | [Blog post, March 2021](https://niclabs.cl/ratadns/2021/03/Clickhouse) | +| [Nixys](https://nixys.io/) | Software & Technology | DevOps, SRE and DevSecOps | — | — | [Blog Post, March 2024](https://habr-com.translate.goog/ru/companies/nixys/articles/801029/?_x_tr_hist=true/ru/companies/nixys/articles/801029/?_x_tr_sl=ru&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp&_x_tr_hist=true) | +| [NLMK](https://nlmk.com/en/) | Steel | Monitoring | — | — | [Article in Russian, Jan 2022](https://habr.com/en/company/nlmk/blog/645943/) | +| [NOC Project](https://getnoc.com/) | Network Monitoring | Analytics | Main Product | — | [Official Website](https://getnoc.com/features/big-data/) | +| [Nansen](https://www.nansen.ai/) | Finance - Crypto | Analytics | — | — | [Press release](https://clickhouse.com/blog/clickhouse-cloud-on-google-cloud-platform-gcp-is-generally-available) | +| [Narrative](https://www.trynarrative.com/) | Software & Technology | AI Automation | — | — | [Hacker News, May 2024](https://news.ycombinator.com/item?id=40225998) | +| [Nationale Databank Wegverkeers](https://www.ndw.nu/) | Software & Technology | Road Traffic Monitoring | — | — | [Presentation at Foss4G, August 2019](https://av.tib.eu/media/43434) | +| [Nebius](https://nebius.com/il/docs/managed-clickhouse/) | SaaS | Main product | — | — | [Official website](https://nebius.com/il/docs/managed-clickhouse/) | +| [Neocom](https://www.neocom.ai/) | AI SaaS | Main product | - | - | [Job listing](https://news.ycombinator.com/item?id=38497724) | +| [Neocom](https://www.neocom.ai/) | Software & Technology | Sales Platform | — | — | [Hacker News, September 2023](https://news.ycombinator.com/item?id=37359122) | +| [NeonDB](https://neon.tech/) | Cloud | Postgres management | - | - | [Blog, 2024](https://double.cloud/resources/case-studies/neon-increases-data-granularity-with-managed-clickhouse/) | +| [NetMeta](https://github.com/monogon-dev/NetMeta/blob/main/README.md) | Observability | Main Product | — | — | [Twitter, December 2022](https://twitter.com/leolukde/status/1605643470239977475) | +| [Netflix](https://www.netflix.com/) | Software & Technology | Video Streaming | — | — | [Twitter, June 2023](https://twitter.com/clickhousedb/status/1673803621220360193) | +| [Netskope](https://www.netskope.com/) | Network Security | — | — | — | [Job advertisement, March 2021](https://www.mendeley.com/careers/job/senior-software-developer-backend-developer-1346348) | +| [Nexpath Networks](https://www.nexpath.net/) | Software & Technology | Network Analysis | — | — | [Slides, September 2021](https://opensips.org/events/Summit-2021Distributed/assets/presentations/2021-jon-abrams-big-telco-data-with-clickhouse.pdf) [Video, September 2021](https://www.youtube.com/watch?v=kyu_wDcO0S4&t=3840s) | +| [NineData](https://www.ninedata.cloud/) | Software & Technology | DMaaS | — | — | ClickHouse Meetup in Hangzhou, May 2024 | +| [Noction](https://www.noction.com) | Network Technology | Main Product | — | — | [Official Website](https://www.noction.com/news/irp-3-11-remote-triggered-blackholing-capability) | +| [Notionlytics](https://notionlytics.com/) | Software & Technology | Page analytics for Notion | — | — | [Twitter, July 2023](https://twitter.com/MaxPrilutskiy/status/1675428469403004928) | +| [Ntop](https://www.ntop.org/) | Network Monitoning | Monitoring | — | — | [Official website, January 2022](https://www.ntop.org/ntop/historical-traffic-analysis-at-scale-using-clickhouse-with-ntopng/) | +| [Nuna Inc.](https://www.nuna.com/) | Health Data Analytics | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=170) | +| [Nutanix](https://www.nutanix.com/) | Software & Technology | Main Product | — | — | [Slides, March 2024](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup102/2-Unified_data_platform_with_clickhouse_by_Sachidanad_Gaurav_Nutanix.pdf) | +| [Oden](https://oden.io/) | Software & Technology | Manufacturing | — | — | [Meetup, April 2023](https://www.youtube.com/watch?v=pAKGJDOO6lo) | +| [Odoscope](https://www.odoscope.com/) | Software & Technology | Customer Engagement Platform | — | — | [Awards Submission, February 2023](https://ecommercegermanyawards.com/vote/164051) | +| [Ok.ru](https://ok.ru) | Social Network | — | 72 servers | 810 TB compressed, 50bn rows/day, 1.5 TB/day | [SmartData conference, October 2021](https://assets.ctfassets.net/oxjq45e8ilak/4JPHkbJenLgZhBGGyyonFP/57472ec6987003ec4078d0941740703b/____________________ClickHouse_______________________.pdf) | +| [Omnicomm](https://omnicomm.ru/) | Transportation Monitoring | — | — | — | [Facebook post, October 2021](https://www.facebook.com/OmnicommTeam/posts/2824479777774500) | +| [OneAPM](https://www.oneapm.com/) | Monitoring and Data Analysis | Main product | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/8.%20clickhouse在OneAPM的应用%20杜龙.pdf) | +| [OneUptime](https://oneuptime.com/) | Observability platform | Analytics | — | — | [GitHub repository](https://github.com/OneUptime/oneuptime) | +| [Onepixel.link](https://onepixel.link/) | Software | URL shorterner | - | - | [Twitter, 2024](https://twitter.com/championswimmer/status/1759195487134220415) | +| [Ongage](https://www.ongage.com/) | Marketing | Analytics | — | — | [Blog](https://clickhouse.com/blog/ongages-strategic-shift-to-clickhouse-for-real-time-email-marketing) | +| [Ookla](https://www.ookla.com/) | Software & Technology | Network Intelligence | — | — | [Presentation at J on the Beach, June 2023](https://www.youtube.com/watch?v=OZ0XpfDM8J0) | +| [OONI](https://ooni.org/) | Open Observatory of Network Interference (OONI) | Main product | — | — | [Blog, May 2023]( https://clickhouse.com/blog/ooni-analyzes-internet-censorship-data-with-clickhouse)[Twitter August 2022](https://twitter.com/OpenObservatory/status/1558014810746265600?s=20&t=hvcDU-LIrgCApP0rZCzuoA) | +| [Open Targets](https://www.opentargets.org/) | Genome Research | Genome Search | — | — | [Twitter, October 2021](https://twitter.com/OpenTargets/status/1452570865342758913?s=20), [Blog](https://blog.opentargets.org/graphql/) | +| [OpenLIT](https://openlit.io/) | Software & Technology | OTEL Monitoring with AI | — | — | [GitHub](https://github.com/openlit/openlit) | +| [OpenMeter](https://openmeter.io) | Expense Management | Main product | — | — | [Offical blog post, 2023](https://openmeter.io/blog/how-openmeter-uses-clickhouse-for-usage-metering#heading-querying-historical-usage) | +| [OpenReplay](https://openreplay.com/) | Product Analytics | Session Replay | — | — | [Docs](https://docs.openreplay.com/en/deployment/openreplay-admin/) | +| [Opensee](https://opensee.io/) | Financial Analytics | Main product | - | - | [Blog Post, February 2022](https://clickhouse.com/blog/opensee-analyzing-terabytes-of-financial-data-a-day-with-clickhouse/) [Blog Post, December 2021](https://opensee.io/news/from-moscow-to-wall-street-the-remarkable-journey-of-clickhouse/) | +| [Oppo](https://www.oppo.com/cn/) | Hardware | Consumer Electronics Company | — | — | ClickHouse Meetup in Chengdu, April 2024 | +| [OpsVerse](https://opsverse.io/) | Observability | — | — | — | [Twitter, 2022](https://twitter.com/OpsVerse/status/1584548242100219904) | +| [Opstrace](https://opstrace.com/) | Observability | — | — | — | [Source code](https://gitlab.com/gitlab-org/opstrace/jaeger-clickhouse/-/blob/main/README.md) | +| [Oxide](https://oxide.computer/) | Hardware & Software | Server Control Plane | — | — | [GitHub Repository](https://github.com/oxidecomputer/omicron) | +| [OZON](https://corp.ozon.com/) | E-commerce | — | — | — | [Official website](https://job.ozon.ru/vacancy/razrabotchik-clickhouse-ekspluatatsiya-40991870/) | +| [PITS Globale Datenrettungsdienste](https://www.pitsdatenrettung.de/) | Data Recovery | Analytics | — | — | | +| [PRANA](https://prana-system.com/en/) | Industrial predictive analytics | Main product | — | — | [News (russian), Feb 2021](https://habr.com/en/news/t/541392/) | +| [Pace](https://www.paceapp.com/) | Marketing & Sales | Internal app | — | — | ClickHouse Cloud user | +| [Panelbear](https://panelbear.com/) | Analytics | Monitoring and Analytics | — | — | [Tech Stack, November 2020](https://panelbear.com/blog/tech-stack/) | +| [Papermark](https://www.papermark.io/) | Software & Technology | Document Sharing & Analytics | — | — | [Twitter, September 2023](https://twitter.com/mfts0/status/1698670144367567263) | +| [Percent 百分点](https://www.percent.cn/) | Analytics | Main Product | — | — | [Slides in Chinese, June 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup24/4.%20ClickHouse万亿数据双中心的设计与实践%20.pdf) | +| [Percona](https://www.percona.com/) | Performance analysis | Percona Monitoring and Management | — | — | [Official website, Mar 2020](https://www.percona.com/blog/2020/03/30/advanced-query-analysis-in-percona-monitoring-and-management-with-direct-clickhouse-access/) | +| [Phare](https://phare.io/) | Uptime Monitoring | Main Product | — | — | [Official website, Aug 2023](https://phare.io/changelog/monthly-changelog-13) | +| [PheLiGe](https://phelige.com/about) | Software & Technology | Genetic Studies | — | — | [Academic Paper, November 2020](https://academic.oup.com/nar/article/49/D1/D1347/6007654?login=false) | +| [PingCAP](https://pingcap.com/) | Analytics | Real-Time Transactional and Analytical Processing | - | - | [GitHub, TiFlash/TiDB](https://github.com/pingcap/tiflash) | +| [Pirsch](https://pirsch.io/) | Software & Technology | Web Analytics | — | — | [Hacker News, April 2023](https://news.ycombinator.com/item?id=35692201) | +| [Piwik PRO](https://piwik.pro/) | Web Analytics | — | — | — | [Official website, Dec 2018](https://piwik.pro/blog/piwik-pro-clickhouse-faster-efficient-reports/) | +| [Plane](https://plane.so/)| Software & Technology | Project Management | — | — | [Twitter, September 2023](https://twitter.com/vamsi_kurama/status/1699593472704176441) | +| [Plausible](https://plausible.io/) | Analytics | Main Product | — | — | [Blog Post, December 2021](https://clickhouse.com/blog/plausible-analytics-uses-click-house-to-power-their-privacy-friendly-google-analytics-alternative) [Twitter, June 2020](https://twitter.com/PlausibleHQ/status/1273889629087969280) | +| [PoeticMetric](https://www.poeticmetric.com/) | Metrics | Main Product | — | — | Community Slack, April 2022 | +| [Portkey AI](https://portkey.ai/) | LLMOps | Main Product | — | — | [LinkedIn post, August 2023](https://www.linkedin.com/feed/update/urn:li:activity:7094676373826330626/) | +| [PostHog](https://posthog.com/) | Product Analytics | Main Product | — | — | [Release Notes, October 2020](https://posthog.com/blog/the-posthog-array-1-15-0), [Blog, November 2021](https://posthog.com/blog/how-we-turned-clickhouse-into-our-eventmansion) | +| [Postmates](https://postmates.com/) | Delivery | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=188) | +| [Pragma Innovation](http://www.pragma-innovation.fr/) | Telemetry and Big Data Analysis | Main product | — | — | [Slides in English, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup18/4_pragma_innovation.pdf) | +| [Prefect](https://www.prefect.io/) | Software & Technology | Main Product | — | — | [Blog, May 2024](https://clickhouse.com/blog/prefect-event-driven-workflow-orchestration-powered-by-clickhouse) | +| [Propel](https://www.propeldata.com/) | Analytics | Main product | — | — | [Blog, January 2024](https://www.propeldata.com/blog/how-to-store-json-in-clickhouse-the-right-way) | +| [Property Finder](https://www.propertyfinder.com/) | Real Estate | - | — | — | ClickHouse Cloud user | +| [QINGCLOUD](https://www.qingcloud.com/) | Cloud services | Main product | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/4.%20Cloud%20%2B%20TSDB%20for%20ClickHouse%20张健%20QingCloud.pdf) | +| [Qrator](https://qrator.net) | DDoS protection | Main product | — | — | [Blog Post, March 2019](https://blog.qrator.net/en/clickhouse-ddos-mitigation_37/) | +| [Qualified](https://www.qualified.com/) | Sales Pipeline Management | Data and Messaging layers | — | — | [Job posting, Nov 2022](https://news.ycombinator.com/item?id=33425109) | +| [Qube Research & Technologies](https://www.qube-rt.com/) | FinTech | Analysis | — | — | ClickHouse Cloud user | +| [QuickCheck](https://quickcheck.ng/) | FinTech | Analytics | — | — | [Blog post, May 2022](https://clickhouse.com/blog/how-quickcheck-uses-clickhouse-to-bring-banking-to-the-unbanked/) | +| [R-Vision](https://rvision.pro/en/) | Information Security | — | — | — | [Article in Russian, December 2021](https://www.anti-malware.ru/reviews/R-Vision-SENSE-15) | +| [RELEX](https://relexsolutions.com) | Supply Chain Planning | Forecasting | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=wyOSMR8l-DI&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=16) [Slides, December 2022](https://presentations.clickhouse.com/meetup65/CRUDy%20OLAP.pdf) | +| [Raiffeisenbank](https://www.rbinternational.com/) | Banking | Analytics | — | — | [Lecture in Russian, December 2020](https://cs.hse.ru/announcements/421965599.html) | +| [Railway](https://railway.app/) | Software & Technology | PaaS Software Tools | — | — | [Changelog, May 2023](https://railway.app/changelog/2023-05-19-horizontal-scaling#logs-are-getting-faster) | +| [Rambler](https://rambler.ru) | Internet services | Analytics | — | — | [Talk in Russian, April 2018](https://medium.com/@ramblertop/разработка-api-clickhouse-для-рамблер-топ-100-f4c7e56f3141) | +| [Ramp](https://ramp.com/) | Financial Services | Real-Time Analytics, Fraud Detection | — | — | [NYC Meetup, March 2024](https://www.youtube.com/watch?v=7BtUgUb4gCs) | +| [Rapid Delivery Analytics](https://rda.team/) | Retail | Analytics | — | — | ClickHouse Cloud user | +| [Releem](https://releem.com/) | Databases | MySQL management| - | - | [Blog 2024](https://releem.com/blog/whats-new-at-releem-june-2023) | +| [Replica](https://replicahq.com) | Urban Planning | Analytics | — | — | [Job advertisement](https://boards.greenhouse.io/replica/jobs/5547732002?gh_jid=5547732002) | +| [Request Metrics](https://requestmetrics.com/) | Software & Technology | Observability | — | — | [Hacker News, May 2023](https://news.ycombinator.com/item?id=35982281) | +| [Resmo](https://replicahq.com) | Software & Technology | Cloud Security & Asset Management | 1 c7g.xlarge node, +| [Retell](https://retell.cc/) | Speech synthesis | Analytics | — | — | [Blog Article, August 2020](https://vc.ru/services/153732-kak-sozdat-audiostati-na-vashem-sayte-i-zachem-eto-nuzhno) | +| [Rivet](https://rivet.gg/) | Software & Technology | Gamer Server Scaling | — | — | [HackerNews, August 2023](https://news.ycombinator.com/item?id=37188659) | +| [Rokt](https://www.rokt.com/) | Software & Technology | eCommerce | — | — | [Meetup Video, December 2022](https://www.youtube.com/watch?v=BEP07Edor-0&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=10) [Slides, December 2022](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup67/Building%20the%20future%20of%20reporting%20at%20Rokt.pdf) | +| [Rollbar](https://www.rollbar.com) | Software Development | Main Product | — | — | [Official Website](https://www.rollbar.com) | +| [Rspamd](https://rspamd.com/) | Antispam | Analytics | — | — | [Official Website](https://rspamd.com/doc/modules/clickhouse.html) | +| [RuSIEM](https://rusiem.com/en) | SIEM | Main Product | — | — | [Official Website](https://rusiem.com/en/products/architecture) | +| [RunReveal](https://runreveal.com/) | SIEM | Main Product | — | — | [SF Meetup, Nov 2023](https://www.youtube.com/watch?v=rVZ9JnbzHTQ&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=25) | +| [S7 Airlines](https://www.s7.ru) | Airlines | Metrics, Logging | — | — | [Talk in Russian, March 2019](https://www.youtube.com/watch?v=nwG68klRpPg&t=15s) | +| [SEMrush](https://www.semrush.com/) | Marketing | Main product | — | — | [Slides in Russian, August 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/5_semrush.pdf) | +| [SESCO Trading](https://www.sescotrading.com/) | Financial | Analysis | — | — | ClickHouse Cloud user | +| [SGK](http://www.sgk.gov.tr/wps/portal/sgk/tr) | Government Social Security | Analytics | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/ClickHouse%20Meetup-Ramazan%20POLAT.pdf) | +| [SMI2](https://smi2.ru/) | News | Analytics | — | — | [Blog Post in Russian, November 2017](https://habr.com/ru/company/smi2/blog/314558/) | +| [SQLPad](https://getsqlpad.com/en/introduction/) | Software & Technology | Web-based SQL editor. | — | — | [GitHub, March 2023](https://github.com/sqlpad/sqlpad/blob/master/server/package.json#L43) | +| [Santiment](https://www.santiment.net) | Behavioral analytics for the crypto market | Main Product | — | — | [Github repo](https://github.com/santiment/sanbase2) | +| [Sber](https://www.sberbank.com/index) | Banking, Fintech, Retail, Cloud, Media | — | 128 servers | >1 PB | [Job advertisement, March 2021](https://career.habr.com/vacancies/1000073536) | +| [Scale8](https://scale8.com) | Tag Management and Analytics | Main product | - | - | [Source Code](https://github.com/scale8/scale8) | +| [Scarf](https://about.scarf.sh/) | Open source analytics | Main product | - | - | [Tweet](https://x.com/avi_press/status/1803954179179974747) | +| [Scireum GmbH](https://www.scireum.de/) | e-Commerce | Main product | — | — | [Talk in German, February 2020](https://www.youtube.com/watch?v=7QWAn5RbyR4) | +| [ScrapingBee](https://www.scrapingbee.com/) | Software & Technology | Web scraping API | — | — | [Twitter, January 2024](https://twitter.com/PierreDeWulf/status/1745464855723986989) | +| [ScratchDB](https://scratchdb.com/) | Software & Technology | Serverless Analytics | — | — | [GitHub](https://github.com/scratchdata/ScratchDB) | +| [Segment](https://segment.com/) | Data processing | Main product | 9 * i3en.3xlarge nodes 7.5TB NVME SSDs, 96GB Memory, 12 vCPUs | — | [Slides, 2019](https://slides.com/abraithwaite/segment-clickhouse) | +| [sembot.io](https://sembot.io/) | Shopping Ads | — | — | — | A comment on LinkedIn, 2020 | +| [Sendinblue](https://www.sendinblue.com/) | Software & Technology | Segmentation | 100 nodes | — | [Blog, February 2023](https://engineering.sendinblue.com/segmentation-to-target-the-right-audience/) | +| [Sentio](https://www.sentio.xyz/) | Software & Technology | Observability | — | — | [Twitter, April 2023](https://twitter.com/qiaokan/status/1650736518955438083) | +| [Sentry](https://sentry.io/) | Software Development | Main product | — | — | [Blog Post in English, May 2019](https://blog.sentry.io/2019/05/16/introducing-snuba-sentrys-new-search-infrastructure) | +| [seo.do](https://seo.do/) | Analytics | Main product | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup35/CH%20Presentation-%20Metehan%20Çetinkaya.pdf) | +| [Serverless](https://www.serverless.com/) | Serverless Apps | Metrics | — | — | ClickHouse Cloud user | +| [ServiceNow](https://www.servicenow.com/) | Managed Services | Qualitative Mobile Analytics | — | — | [Meetup Video, January 2023](https://www.youtube.com/watch?v=b4Pmpx3iRK4&list=PL0Z2YDlm0b3iNDUzpY1S3L_iV4nARda_U&index=6) [Slides, January 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup68/Appsee%20Remodeling%20-%20ClickHouse.pdf) | +| [Sewer AI](https://www.sewerai.com/) | Software & Technology | - | — | — | ClickHouse Cloud user | +| [Shopee](https://www.shopee.com/) | E-Commerce | Distributed Tracing | - | - | [Meetup Video, April 2024](https://youtu.be/_BVy-V2wy9s?feature=shared) [Slides, April 2024](https://github.com/ClickHouse/clickhouse-presentations/blob/2b0ef2914ff594c0a0f8800d5150e5b31323be98/meetup105/Shopee%20-%20Distributed%20Tracing%20in%20ClickHouse.pdf) [Blog Post, June 2024](https://clickhouse.com/blog/seeing-the-big-picture-shopees-journey-to-distributed-tracing-with-clickhouse) | +| [SigNoz](https://signoz.io/) | Observability Platform | Main Product | — | — | [Source code](https://github.com/SigNoz/signoz) | +| [Sina](http://english.sina.com/index.html) | News | — | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/6.%20ClickHouse最佳实践%20高鹏_新浪.pdf) | +| [Sinch](https://www.sinch.com/) | Software & Technology | Customer Communications Cloud | — | — | [HackerNews, May 2023](https://news.ycombinator.com/item?id=36042104) | +| [Sipfront](https://www.sipfront.com/) | Software Development | Analytics | — | — | [Twitter, October 2021](https://twitter.com/andreasgranig/status/1446404332337913895?s=20) | +| [SiteBehaviour Analytics](https://www.sitebehaviour.com/) | Software| Analytics | - | - | [Twitter, 2024](https://twitter.com/developer_jass/status/1763023792970883322)| +| [slido](https://www.slido.com/) | Software & Technology | Q&A and Polling | — | — | [Meetup, April 2023](https://www.linkedin.com/events/datameetup-3-spotlightondataeng7048914766324473856/about/) | +| [Solarwinds](https://www.solarwinds.com/) | Software & Technology | Main product | — | — | [Talk in English, March 2018](https://www.youtube.com/watch?v=w8eTlqGEkkw) | +| [Sonrai Security](https://sonraisecurity.com/) | Cloud Security | - | — | — | Slack comments | +| [Spark New Zealand](https://www.spark.co.nz/) | Telecommunications | Security Operations | — | — | [Blog Post, Feb 2020](https://blog.n0p.me/2020/02/2020-02-05-dnsmonster/) | +| [Spec](https://www.specprotected.com/) | Software & Technology | Online Fraud Detection | — | — | [HackerNews, August 2023](https://news.ycombinator.com/item?id=36965317) +| [spectate](https://spectate.net/)| Software & Technology | Monitoring & Incident Management | — | — | [Twitter, August 2023](https://twitter.com/BjarnBronsveld/status/1700458569861112110) | +| [Splio](https://splio.com/en/) | Software & Technology | Individuation Marketing | — | — | [Slack, September 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1693995069023669) | +| [Splitbee](https://splitbee.io) | Analytics | Main Product | — | — | [Blog Post, Mai 2021](https://splitbee.io/blog/new-pricing) | +| [Splunk](https://www.splunk.com/) | Business Analytics | Main product | — | — | [Slides in English, January 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup12/splunk.pdf) | +| [Spotify](https://www.spotify.com) | Music | Experimentation | — | — | [Slides, July 2018](https://www.slideshare.net/glebus/using-clickhouse-for-experimentation-104247173) | +| [Staffbase](https://staffbase.com/en/) | Software & Technology | Internal Communications | — | — | [ClickHouse Slack, April 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1682781081062859) | +| [Staffcop](https://www.staffcop.ru/) | Information Security | Main Product | — | — | [Official website, Documentation](https://www.staffcop.ru/sce43) | +| [Statsig](https://statsig.com/) | Software & Technology | Real-time analytics | — | — | [Video](https://clickhouse.com/videos/statsig) | +| [Streamkap](https://streamkap.com/) | Data Platform | - | — | — | [Video](https://clickhouse.com/videos/switching-from-elasticsearch-to-clickhouse) | +| [Suning](https://www.suning.com/) | E-Commerce | User behaviour analytics | — | — | [Blog article](https://www.sohu.com/a/434152235_411876) | +| [Superology](https://superology.com/) | Software & Technology | Customer Analytics | — | — | [Blog Post, June 2022](https://clickhouse.com/blog/collecting-semi-structured-data-from-kafka-topics-using-clickhouse-kafka-engine) | +| [Superwall](https://superwall.me/) | Monetization Tooling | Main product | — | — | [Word of mouth, Jan 2022](https://github.com/ClickHouse/ClickHouse/pull/33573) | +| [SwarmFarm Robotics](https://www.swarmfarm.com/) | Agriculture & Technology | Main Product | — | — | [Meetup Slides](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup122/Talk%20Track%202%20-%20Harvesting%20Big%20Data%20at%20SwarmFarm%20Robotics%20-%20Angus%20Ross.pdf) | +| [Swetrix](https://swetrix.com) | Analytics | Main Product | — | — | [Source code](https://github.com/swetrix/swetrix-api) | +| [Swift Navigation](https://www.swiftnav.com/) | Geo Positioning | Data Pipelines | — | — | [Job posting, Nov 2022](https://news.ycombinator.com/item?id=33426590) | +| [Synerise](https://synerise.com/) | ML&AI | Feature Store | - | - | [Presentation, April 2020](https://www.slideshare.net/AndrzejMichaowski/feature-store-solving-antipatterns-in-mlsystems-232829863) | +| [Synpse](https://synpse.net/) | Application Management | Main Product | - | - | [Twitter, January 2022](https://twitter.com/KRusenas/status/1483571168363880455) | +| [Synq](https://www.synq.io) | Software & Technology | Main Product | — | — | [Blog Post, July 2023](https://clickhouse.com/blog/building-a-unified-data-platform-with-clickhouse) | +| [sumsub](https://sumsub.com/) | Software & Technology | Verification platform | — | — | [Meetup, July 2022](https://www.youtube.com/watch?v=F74bBGSMwGo) | +| [TURBOARD](https://www.turboard.com/) | BI Analytics | — | — | — | [Official website](https://www.turboard.com/blogs/clickhouse) | +| [TeamApt](https://www.teamapt.com/) | FinTech | Data Processing | — | — | [Official Website](https://www.teamapt.com/) | +| [Teamtailor](https://www.teamtailor.com/en/) | Recruitment Software | - | — | — | ClickHouse Cloud user | +| [Tekion](https://tekion.com/) | Automotive Retail | Clickstream Analytics | — | — | [Blog Post, June 2024](https://clickhouse.com/blog/tekion-adopts-clickhouse-cloud-to-power-application-performance-and-metrics-monitoring) | +| [Tencent Music Entertainment (TME)](https://www.tencentmusic.com/) | BigData | Data processing | — | — | [Blog in Chinese, June 2020](https://cloud.tencent.com/developer/article/1637840) | +| [Tencent](https://www.tencent.com) | Big Data | Data processing | — | — | [Slides in Chinese, October 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup19/5.%20ClickHouse大数据集群应用_李俊飞腾讯网媒事业部.pdf) | +| [Tencent](https://www.tencent.com) | Messaging | Logging | — | — | [Talk in Chinese, November 2019](https://youtu.be/T-iVQRuw-QY?t=5050) | +| [Teralytics](https://www.teralytics.net/) | Mobility | Analytics | — | — | [Tech blog](https://www.teralytics.net/knowledge-hub/visualizing-mobility-data-the-scalability-challenge) | +| [Tesla](https://www.tesla.com/) | Electric vehicle and clean energy company | — | — | — | [Vacancy description, March 2021](https://news.ycombinator.com/item?id=26306170) | +| [The Guild](https://the-guild.dev/) | API Platform | Monitoring | — | — | [Blog Post, November 2022](https://clickhouse.com/blog/100x-faster-graphql-hive-migration-from-elasticsearch-to-clickhouse) [Blog](https://the-guild.dev/blog/graphql-hive-and-clickhouse) | +| [Theia](https://theia.so/) | Software & Technology | Threat Intelligence | — | — | [Twitter, July 2023](https://twitter.com/jreynoldsdev/status/1680639586999980033) | +| [ThirdWeb](https://thirdweb.com/) | Software & Technology | Blockchain analysis | — | — | ClickHouse Cloud user | +| [Timeflow](https://timeflow.systems) | Software | Analytics | — | — | [Blog](https://timeflow.systems/why-we-moved-from-druid-to-clickhouse/ ) | +| [Timeplus](https://www.timeplus.com/) | Software & Technology | Streaming Analytics | — | — | [Meetup, August 2023](https://www.meetup.com/clickhouse-silicon-valley-meetup-group/events/294472987/) | +| [Tinybird](https://www.tinybird.co/) | Real-time Data Products | Data processing | — | — | [Official website](https://www.tinybird.co/) | +| [TrackingPlan](https://www.trackingplan.com/) | Marketing & Sales | Monitoring | — | — | ClickHouse Cloud user | +| [Traffic Stars](https://trafficstars.com/) | AD network | — | 300 servers in Europe/US | 1.8 PiB, 700 000 insert rps (as of 2021) | [Slides in Russian, May 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup15/lightning/ninja.pdf) | +| [Trillabit](https://www.trillabit.com/home) | Software & Technology | Business Intelligence | — | — | [Blog, January 2023](https://clickhouse.com/blog/trillabit-utilizes-the-power-of-clickhouse-for-fast-scalable-results-within-their-self-service-search-driven-analytics-offering) | +| [Trip.com](https://trip.com/) | Travel Services | Logging | — | — | [Meetup, March 2023](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup71/Trip.com.pdf) | +| [Turkcell](https://www.turkcell.com.tr/) | Telecom | BI Analytics | 2 nodes | 2TB per day, 100TB in total | [YouTube Video](https://www.youtube.com/watch?v=ckvPBgXl82Q) | +| [Tweeq](https://tweeq.sa/en) | Fintech | Spending Account | - | - | [Engineering Blog, May 2024](https://engineering.tweeq.sa/tweeq-data-platform-journey-and-lessons-learned-clickhouse-dbt-dagster-and-superset-fa27a4a61904) | +| [URLsLab](https://www.urlslab.com/) | Software & Technology | WordPress Plugin | — | — | [Twitter, July 2023](https://twitter.com/Yasha_br/status/1680224776302784514) , [Twitter, September 2023](https://twitter.com/Yasha_br/status/1698724654339215812) | +| [UTMSTAT](https://hello.utmstat.com/) | Analytics | Main product | — | — | [Blog post, June 2020](https://vc.ru/tribuna/133956-striming-dannyh-iz-servisa-skvoznoy-analitiki-v-clickhouse) | +| [Uber](https://www.uber.com) | Taxi | Logging | — | — | [Slides, February 2020](https://presentations.clickhouse.com/meetup40/uber.pdf) | +| [Uptrace](https://uptrace.dev/) | Software | Tracing Solution | — | — | [Official website, March 2021](https://uptrace.dev/open-source/) | +| [UseTech](https://usetech.com/) | Software Development | — | — | — | [Job Posting, December 2021](https://vk.com/wall136266658_2418) | +| [Usermaven](https://usermaven.com/) | Product Analytics | Main Product | — | — | [HackerNews, January 2023](https://news.ycombinator.com/item?id=34404706) | +| [VKontakte](https://vk.com) | Social Network | Statistics, Logging | — | — | [Slides in Russian, August 2018](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup17/3_vk.pdf) | +| [VKontech](https://vkontech.com/) | Distributed Systems | Migrating from MongoDB | - | - | [Blog, January 2022](https://vkontech.com/migrating-your-reporting-queries-from-a-general-purpose-db-mongodb-to-a-data-warehouse-clickhouse-performance-overview/) | +| [VMware](https://www.vmware.com/) | Cloud | VeloCloud, SDN | — | — | [Product documentation](https://docs.vmware.com/en/vRealize-Operations-Manager/8.3/com.vmware.vcom.metrics.doc/GUID-A9AD72E1-C948-4CA2-971B-919385AB3CA8.html) | +| [Valueleaf Services Pvt.Ltd](http://valueleaf.com/) | Software & Technology | Martech platform, Ads platform and Loan aggregator platform | — | — | [ClickHouse Slack, April 2023](https://clickhousedb.slack.com/archives/C04N3AU38DV/p1681122299263959) | +| [Vantage](https://www.vantage.sh/) | Software & Technology | Cloud Cost Management | — | — | [Meetup, April 2023](https://www.youtube.com/watch?v=gBgXcHM_ldc) , [ClickHouse Blog, June 2023](https://clickhouse.com/blog/nyc-meetup-report-vantages-journey-from-redshift-and-postgres-to-clickhouse) | +| [Velvet](https://www.usevelvet.com/) | Database management | Main product | - | - | [Job listing](https://news.ycombinator.com/item?id=38492272) | +| [Vercel](https://vercel.com/) | Traffic and Performance Analytics | — | — | — | Direct reference, October 2021 | +| [Vexo](https://www.vexo.co/) | App development | Analytics | — | — | [Twitter, December 2023](https://twitter.com/FalcoAgustin/status/1737161334213546279) | +| [Vidazoo](https://www.vidazoo.com/) | Advertising | Analytics | — | — | ClickHouse Cloud user | +| [Vimeo](https://vimeo.com/) | Video hosting | Analytics | - | - | [Blog post](https://medium.com/vimeo-engineering-blog/clickhouse-is-in-the-house-413862c8ac28) | +| [Visiology](https://visiology.com/) | Business intelligence | Analytics | - | - | [Company website](https://visiology.com/) | +| [Voltmetrix](https://voltmetrix.com/) | Database management | Main product | - | - | [Blog post](https://voltmetrix.com/blog/voltmetrix-iot-manufacturing-use-case/) | +| [Voltus](https://www.voltus.co/) | Energy | — | — | — | [Blog Post, Aug 2022](https://medium.com/voltus-engineering/migrating-kafka-to-amazon-msk-1f3a7d45b5f2) | +| [W3 Analytics](https://w3analytics.hottoshotto.com/) | Blockchain | Dashboards for NFT analytics | — | — | [Community Slack, July 2023](https://clickhousedb.slack.com/archives/CU170QE9H/p1689907164648339) | +| [WSPR Live](https://wspr.live/) | Software & Technology | WSPR Spot Data | — | — | [Twitter, April 2023](https://twitter.com/HB9VQQ/status/1652723207475015680) | +| [Waitlyst](https://waitlyst.co/) | Software & Technology | AI Customer Journey Management | — | — | [Twitter, June 2023](https://twitter.com/aaronkazah/status/1668261900554051585) | +| [Walmart Labs](https://www.walmartlabs.com/) | Internet, Retail | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=144) | +| [WanShanData](http://wanshandata.com/home) | Software & Technology | Main Product | — | — | [Meetup Slides in Chinese](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup56/wanshandata.pdf) | +| [Wargaming](https://wargaming.com/en/) | Games | | — | — | [Interview](https://habr.com/en/post/496954/) | +| [WebGazer](https://www.webgazer.io/) | Uptime Monitoring | Main Product | — | — | Community Slack, April 2022 | +| [Weights & Biases](https://wandb.ai/site) | Software & Technology | LLM Monitoring | — | — | [Twitter, April 2024](https://x.com/ClickHouseDB/status/1780264997228011986) | +| [Wildberries](https://www.wildberries.ru/) | E-commerce | | — | — | [Official website](https://it.wildberries.ru/) | +| [Wisebits](https://wisebits.com/) | IT Solutions | Analytics | — | — | [Slides in Russian, May 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup22/strategies.pdf) | +| [Workato](https://www.workato.com/) | Automation Software | — | — | — | [Talk in English, July 2020](https://youtu.be/GMiXCMFDMow?t=334) | +| [Wowza](https://www.wowza.com/) | Video Platform | Streaming Analytics | — | — | ClickHouse Cloud user | +| [Wundergraph](https://wundergraph.com/) | Software & Technology | API Platform | — | — | [Twitter, February 2023](https://twitter.com/dustindeus/status/1628757807913750531) | +| [Xata](https://xata.io/) | Software & Technology | SaaS observability dashboard | — | — | [Twitter, March 2024](https://x.com/tudor_g/status/1770517054971318656) | +| [Xenoss](https://xenoss.io/) | Martech, Adtech development | — | — | — | [Official website](https://xenoss.io/big-data-solution-development)| +| [Xiaoxin Tech](http://www.xiaoxintech.cn/) | Education | Common purpose | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/sync-clickhouse-with-mysql-mongodb.pptx) | +| [Ximalaya](https://www.ximalaya.com/) | Audio sharing | OLAP | — | — | [Slides in English, November 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup33/ximalaya.pdf) | +| [YTsaurus](https://ytsaurus.tech/) | Distributed Storage and Processing | Main product | - | - | [Main website](https://ytsaurus.tech/) | +| [Yandex Cloud](https://cloud.yandex.ru/services/managed-clickhouse) | Public Cloud | Main product | — | — | [Talk in Russian, December 2019](https://www.youtube.com/watch?v=pgnak9e_E0o) | +| [Yandex DataLens](https://cloud.yandex.ru/services/datalens) | Business Intelligence | Main product | — | — | [Slides in Russian, December 2019](https://presentations.clickhouse.com/meetup38/datalens.pdf) | +| [Yandex Market](https://market.yandex.ru/) | e-Commerce | Metrics, Logging | — | — | [Talk in Russian, January 2019](https://youtu.be/_l1qP0DyBcA?t=478) | +| [Yandex Metrica](https://metrica.yandex.com) | Web analytics | Main product | 630 servers in one cluster, 360 servers in another cluster, 1862 servers in one department | 133 PiB / 8.31 PiB / 120 trillion records | [Slides, February 2020](https://presentations.clickhouse.com/meetup40/introduction/#13) | +| [Yellowfin](https://www.yellowfinbi.com) | Analytics | Main product | - | - | [Integration](https://www.yellowfinbi.com/campaign/yellowfin-9-whats-new#el-30219e0e) | +| [Yotascale](https://www.yotascale.com/) | Cloud | Data pipeline | — | 2 bn records/day | [LinkedIn (Accomplishments)](https://www.linkedin.com/in/adilsaleem/) | +| [Your Analytics](https://www.your-analytics.org/) | Product Analytics | Main Product | — | - | [Twitter, November 2021](https://twitter.com/mikenikles/status/1459737241165565953) | +| [Zagrava Trading](https://zagravagames.com/en/) | — | — | — | — | [Job offer, May 2021](https://twitter.com/datastackjobs/status/1394707267082063874) | +| [Zappi](https://www.zappi.io/web/) | Software & Technology | Market Research | — | — | [Twitter Post, June 2024](https://x.com/HermanLangner/status/1805870318218580004)) | +| [Zerodha](https://zerodha.tech/) | Stock Broker | Logging | — | — | [Blog, March 2023](https://zerodha.tech/blog/logging-at-zerodha/) | +| [Zing Data](https://getzingdata.com/) | Software & Technology | Business Intelligence | — | — | [Blog, May 2023](https://clickhouse.com/blog/querying-clickhouse-on-your-phone-with-zing-data) | +| [Zipy](https://www.zipy.ai/) | Software & Technology | User session debug | — | — | [Blog, April 2023](https://www.zipy.ai/blog/deep-dive-into-clickhouse) | +| [Zomato](https://www.zomato.com/) | Online food ordering | Logging | — | — | [Blog, July 2023](https://www.zomato.com/blog/building-a-cost-effective-logging-platform-using-clickhouse-for-petabyte-scale) | +| [Zomato](https://www.zomato.com/ncr/golf-course-order-online) | Food & Beverage| Food Delivery | - | - | [Blog 2024](https://blog.zomato.com/building-a-cost-effective-logging-platform-using-clickhouse-for-petabyte-scale) | +| [АС "Стрела"](https://magenta-technology.ru/sistema-upravleniya-marshrutami-inkassacii-as-strela/) | Transportation | — | — | — | [Job posting, Jan 2022](https://vk.com/topic-111905078_35689124?post=3553) | +| [ДомКлик](https://domclick.ru/) | Real Estate | — | — | — | [Article in Russian, October 2021](https://habr.com/ru/company/domclick/blog/585936/) | +| [МКБ](https://mkb.ru/) | Bank | Web-system monitoring | — | — | [Slides in Russian, September 2019](https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup28/mkb.pdf) | +| [ООО «МПЗ Богородский»](https://shop.okraina.ru/) | Agriculture | — | — | — | [Article in Russian, November 2020](https://cloud.yandex.ru/cases/okraina) | +| [ЦВТ](https://htc-cs.ru/) | Software Development | Metrics, Logging | — | — | [Blog Post, March 2019, in Russian](https://vc.ru/dev/62715-kak-my-stroili-monitoring-na-prometheus-clickhouse-i-elk) | +| [ЦФТ](https://cft.ru/) | Banking, Financial products, Payments | — | — | — | [Meetup in Russian, April 2020](https://team.cft.ru/events/162) | +| [Цифровой Рабочий](https://promo.croc.ru/digitalworker) | Industrial IoT, Analytics | — | — | — | [Blog post in Russian, March 2021](https://habr.com/en/company/croc/blog/548018/) | +
diff --git a/docs/ja/about-us/cloud.md b/docs/ja/about-us/cloud.md new file mode 100644 index 00000000000..4ba0960e608 --- /dev/null +++ b/docs/ja/about-us/cloud.md @@ -0,0 +1,38 @@ +--- +slug: /ja/about-us/cloud +sidebar_label: クラウドサービス +sidebar_position: 10 +description: ClickHouse Cloud +--- + +# ClickHouse Cloud + +ClickHouse Cloudは、人気のオープンソースOLAPデータベースであるClickHouseの元開発者によって作成されたクラウドオファリングです。 +[無料トライアルを開始する](https://clickhouse.cloud/signUp)ことで、ClickHouse Cloudを体験できます。 + +### ClickHouse Cloudの利点: + +ClickHouse Cloudを使用する利点のいくつかを以下に示します: + +- **迅速な価値実現**: クラスターのサイズを調整することなく、すぐに構築を開始できます。 +- **シームレスなスケーリング**: 自動スケーリングにより、ピーク時に過剰なプロビジョニングをしなくても、多様なワークロードに対応します。 +- **サーバーレスオペレーション**: サイズ調整、スケーリング、セキュリティ、信頼性、アップグレードを私たちに任せてください。 +- **透明な価格設定**: 使用した分だけを支払い、リソースの予約とスケーリングコントロールを利用できます。 +- **所有コストの総額**: 最高の価格/パフォーマンス比と低管理オーバーヘッド。 +- **広範なエコシステム**: お気に入りのデータコネクター、ビジュアライゼーションツール、SQL、および言語クライアントを持ち込むことができます。 + +以下のビデオで、始め方のウォークスルーをご覧いただけます: + +
+ + + +
+ +### ClickHouse CloudはどのバージョンのClickHouseを使用しますか? + +Clickhouse Cloudは、サービスを継続的に新しいバージョンにアップグレードします。コアデータベースバージョンをオープンソースで公開した後、クラウドステージング環境で追加の検証を行い、通常6〜8週間で本番環境に展開します。展開はクラウドサービスプロバイダー、サービスタイプ、地域ごとに段階的に行われます。 + +定期的なリリーススケジュールに先立ち、更新を受け取るための「高速」リリースチャネルを提供しています。早期のアップグレードへのアクセスは、非本番環境でのみ推奨され、サポートチケットをログしてリクエストできます。 + +以前のバージョンの機能に依存している場合、サービスの互換性設定を使用して、元の動作に戻すことが可能な場合があります。 diff --git a/docs/ja/about-us/distinctive-features.md b/docs/ja/about-us/distinctive-features.md new file mode 100644 index 00000000000..c61c5d58e08 --- /dev/null +++ b/docs/ja/about-us/distinctive-features.md @@ -0,0 +1,96 @@ +--- +slug: /ja/about-us/distinctive-features +sidebar_label: ClickHouseはなぜユニークなのか? +sidebar_position: 50 +description: 他のデータベース管理システムとは異なるClickHouseの特徴を理解する +--- + +# ClickHouseの特徴 + +## 真の列指向データベース管理システム + +真の列指向DBMSでは、値に余分なデータが保存されません。これは、値の長さをその隣に「数値」として保存することを避けるために、固定長の値をサポートする必要があることを意味します。たとえば、10億個のUInt8型の値は圧縮されていないときに約1GBを消費するべきであり、これはCPUの使用に強く影響します。データを圧縮されずに(「ゴミ」がなく)コンパクトに保存することが重要で、というのも、データの解凍速度(CPU使用量)は圧縮されていないデータのボリュームに主に依存するからです。 + +これは、異なるカラムの値を別々に保存できるが、分析クエリを効果的に処理できないシステム、例えばHBase、BigTable、Cassandra、HyperTableなどとは対照的です。これらのシステムでは、1秒間に約10万行のスループットは得られますが、数億行は得られません。 + +最終的に、ClickHouseはデータベース管理システムであり、単一のデータベースではありません。実行時にテーブルやデータベースを作成し、データをロードし、サーバーを再構成せずにクエリを実行できます。 + +## データ圧縮 {#data-compression} + +一部の列指向DBMSはデータ圧縮を使用しません。しかし、データ圧縮は優れたパフォーマンスを達成するための重要な要素です。 + +ディスクスペースとCPU消費の間のトレードオフを考慮した効率的な汎用圧縮コーデックに加え、ClickHouseは特定のデータ型に特化した[コーデック](/docs/ja/sql-reference/statements/create/table.md#specialized-codecs)を提供し、ClickHouseはタイムシリーズ型のような特定の用途に優れたデータベースと競争し、さらに優れます。 + +## データのディスクストレージ {#disk-storage-of-data} + +データを主キーで物理的にソートして保持すると、特定の値または値の範囲に基づいてデータを数十ミリ秒未満の低遅延で抽出することが可能になります。SAP HANAやGoogle PowerDrillのような一部の列指向DBMSはRAMでのみ動作します。このアプローチではリアルタイム分析に必要以上のハードウェア予算を確保する必要があります。 + +ClickHouseは通常のハードドライブで動作するように設計されており、これはデータストレージあたりのGB単位のコストが低いことを意味しますが、利用可能な場合はSSDや追加のRAMも完全に使用します。 + +## 複数コアでの並列処理 {#parallel-processing-on-multiple-cores} + +大きなクエリは自然に並列化され、現在のサーバーで利用可能なすべてのリソースを利用します。 + +## 複数サーバーでの分散処理 {#distributed-processing-on-multiple-servers} + +上記の列指向DBMSのほとんどに分散クエリ処理のサポートはありません。 + +ClickHouseでは、データは異なるシャードに存在できます。各シャードは耐障害性のために使用されるレプリカのグループであることができます。すべてのシャードは、ユーザーにとって透明に並列でクエリを実行するために使用されます。 + +## SQLサポート {#sql-support} + +ClickHouseは、ANSI SQL標準とほぼ互換性のある[SQL言語](/ja/sql-reference/)をサポートしています。 + +サポートされているクエリには、[GROUP BY](../sql-reference/statements/select/group-by.md)、[ORDER BY](../sql-reference/statements/select/order-by.md)、[FROM](../sql-reference/statements/select/from.md)でのサブクエリ、[JOIN](../sql-reference/statements/select/join.md)句、[IN](../sql-reference/operators/in.md)演算子、[ウィンドウ関数](../sql-reference/window-functions/index.md)やスカラーサブクエリが含まれます。 + +相関(依存)サブクエリは執筆時点ではサポートされていませんが、将来的には利用可能になる可能性があります。 + +## ベクター計算エンジン {#vector-engine} + +データはカラムで保存されるだけでなく、ベクター(カラムの一部)によって処理され、高いCPU効率が達成されます。 + +## リアルタイムデータ挿入 {#real-time-data-updates} + +ClickHouseは主キーを持つテーブルをサポートしています。主キーの範囲でクエリを迅速に実行するために、データはインクリメンタルにMergeTreeを使用してソートされます。これにより、データを継続的にテーブルに追加することができます。新しいデータが取り込まれた際にロックは取得されません。 + +## 主インデックス {#primary-index} + +データが主キーで物理的にソートされていることで、特定の値または値の範囲に基づいてデータを数十ミリ秒未満の低遅延で抽出することが可能になります。 + +## 二次インデックス {#secondary-indexes} + +他のデータベース管理システムとは異なり、ClickHouseの二次インデックスは特定の行や行範囲を指しません。代わりに、クエリのフィルタリング条件に一致しないすべての行があるデータ部分でそれを読み込まないようにデータベースに事前に知らせるため、[データスキッピングインデックス](../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-data_skipping-indexes)と呼ばれます。 + +## オンラインクエリへの適合性 {#suitable-for-online-queries} + +ほとんどのOLAPデータベース管理システムは、1秒未満のレイテンシーでのオンラインクエリを目指していません。代替システムでは、数十秒から数分間のレポート生成時間が許容されることが多く、時にはさらに時間がかかり、オフラインでレポートを準備することを強いられることがあります(事前に、または「後で来てください」という形で)。 + +ClickHouseでは、「低遅延」とは、ユーザーインターフェースページが読み込まれるのと同時に、遅延なく、事前に回答を準備しようとせずにクエリを処理できることを意味します。言い換えれば、オンラインで。 + +## 近似計算のサポート {#support-for-approximated-calculations} + +ClickHouseは、性能を犠牲にして精度をトレードオフする様々な方法を提供しています: + +1. 異なる値の数、中央値、および分位数を近似計算するための集計関数。 +2. データの一部(サンプル)に基づいてクエリを実行し、近似結果を得る。この場合、ディスクから取得されるデータの量は比例して少なくなります。 +3. すべてのキーではなく、ランダムなキーの制限された数の集計を実行する。データ内のキー分布の条件によっては、少ないリソースで合理的に正確な結果を提供します。 + +## アダプティブジョインアルゴリズム {#adaptive-join-algorithm} + +ClickHouseは、複数のテーブルを[JOIN](../sql-reference/statements/select/join.md)する際に、主にハッシュジョインアルゴリズムを選択し、複数の大きなテーブルがある場合にはマージジョインアルゴリズムにフォールバックします。 + +## データレプリケーションとデータ整合性のサポート {#data-replication-and-data-integrity-support} + +ClickHouseは非同期マルチマスターレプリケーションを使用します。利用可能なレプリカに書き込まれた後、残りのすべてのレプリカがバックグラウンドでそのコピーを取得します。システムは異なるレプリカに同一のデータを保持します。ほとんどの障害からの回復は自動または複雑な場合には半自動で行われます。 + +詳細については、[データレプリケーション](../engines/table-engines/mergetree-family/replication.md)のセクションを参照してください。 + +## ロールベースのアクセス制御 {#role-based-access-control} + +ClickHouseはSQLクエリを使用したユーザーアカウント管理を実装し、ANSI SQL標準および一般的なリレーショナルデータベース管理システムで見られる[ロールベースのアクセス制御の構成](/docs/ja/guides/sre/user-management/index.md)を可能にします。 + +## 欠点と考えられる機能 {#clickhouse-features-that-can-be-considered-disadvantages} + +1. 本格的なトランザクションなし。 +2. 高速かつ低遅延で既に挿入されたデータを修正または削除する能力の欠如。データを整理したり変更したりするためにバッチ削除や更新は利用可能ですが、例えば[GDPR](https://gdpr-info.eu)に準拠するために別の方法があります。 +3. スパースなインデックスがClickHouseをポイントクエリでシングル行をキーによって取得するのにあまり効率的ではないようにします。 diff --git a/docs/ja/about-us/history.md b/docs/ja/about-us/history.md new file mode 100644 index 00000000000..c851c8e07a5 --- /dev/null +++ b/docs/ja/about-us/history.md @@ -0,0 +1,51 @@ +--- +slug: /ja/about-us/history +sidebar_label: ClickHouseの歴史 +sidebar_position: 40 +description: それが始まった場所... +--- + +# ClickHouseの歴史 {#clickhouse-history} + +ClickHouseは当初、[世界で2番目に大きなウェブ解析プラットフォーム](http://w3techs.com/technologies/overview/traffic_analysis/all)である[Yandex.Metrica](https://metrica.yandex.com/)を支えるために開発され、そのシステムのコアコンポーネントとして今も使われています。データベースには13兆を超えるレコードがあり、1日あたり200億件以上のイベントが発生しています。ClickHouseは、非集約データから直接カスタムレポートをその場で生成することを可能にします。この記事では、ClickHouseの開発初期段階での目標について簡単に説明します。 + +Yandex.Metricaは、ヒット数やセッション数に基づいてカスタマイズされたレポートをその場で作成し、ユーザーによって定義された任意のセグメントを使用します。このためには、しばしばユニークユーザー数などの複雑な集約を構築する必要があります。レポート作成のための新しいデータはリアルタイムで到着します。 + +2014年4月時点で、Yandex.Metricaは1日あたり約120億件のイベント(ページビューやクリック)を追跡していました。これらすべてのイベントはカスタムレポートを構築するために保存されなければなりません。単一のクエリでは数百万行を数百ミリ秒以内でスキャンしなければならないこともあれば、数億行を数秒でスキャンすることもあります。 + +## Yandex.Metricaとその他のYandexサービスでの使用 {#usage-in-yandex-metrica-and-other-yandex-services} + +ClickHouseは、Yandex.Metricaにおいて多目的に利用されています。 主なタスクは、非集約データを使用してオンラインモードでレポートを作成することです。それは374台のサーバークラスターを使用し、データベースに20.3兆行以上を保存します。圧縮データのボリュームは約2 PBで、重複とレプリカを考慮しない場合のことです。圧縮されていないデータ(TSV形式)のボリュームは約17 PBになります。 + +ClickHouseはまた、以下のプロセスにおいて重要な役割を果たしています: + +- Yandex.Metricaからのセッション再生データの保存。 +- 中間データの処理。 +- Analyticsを使用したグローバルレポートの作成。 +- Yandex.Metricaエンジンのデバッグのためにクエリを実行。 +- APIとユーザーインターフェースからのログの解析。 + +現在、他のYandexサービスや部門の検索バーティカル、eコマース、広告、ビジネス分析、モバイル開発、パーソナルサービスなどで、数十件のClickHouseのインストールが見られます。 + +## 集約データと非集約データ {#aggregated-and-non-aggregated-data} + +統計を効果的に計算するためには、データを集約しなければならないという意見が広まりつつあります。なぜなら、これによりデータの量が削減されるからです。 + +しかし、データ集約には多くの制約があります: + +- 必要なレポートの事前定義リストが必要です。 +- ユーザーはカスタムレポートを作成できません。 +- 多数の異なるキーに対して集約する場合、データ量はほとんど削減されないため、集約は無意味です。 +- 多数のレポートに対して、集約のバリエーションが多すぎる(組み合わせの爆発)。 +- 高いカーディナリティ(たとえばURL)のキーを集約する場合、データ量はあまり削減されません(2倍未満)。 +- このため、集約されたデータ量が縮小するどころか増加することがあります。 +- ユーザーは我々が生成するすべてのレポートを閲覧するわけではありません。大部分の計算は無駄になります。 +- さまざまな集約に対してデータの論理的一貫性が損なわれることがあります。 + +何も集約せず、非集約データとともに作業する場合、このアプローチにより計算量が削減されることがあります。 + +しかし、集約では作業の大部分がオフラインで比較的落ち着いて完了します。それに対照的に、オンライン計算ではユーザーが結果を待っているため、できるだけ早く計算する必要があります。 + +Yandex.Metricaには、Metrageというデータを集約するための専門システムがあり、大多数のレポートで使用されていました。 2009年から、Yandex.Metricaでは、レポートビルダーに以前使用されていたOLAPServerという非集約データのための専門的なOLAPデータベースも使用していました。OLAPServerは非集約データにはうまく機能しましたが、望ましいすべてのレポートで使用できない多くの制約がありました。これにはデータ型のサポート(数値のみ)がないことや、データをリアルタイムで増分更新できないこと(データを毎日書き換えることのみ可能)が含まれます。OLAPServerはDBMSではなく、専門的なDBです。 + +ClickHouseの初期目標は、OLAPServerの制約を撤廃し、すべてのレポートで非集約データを用いた作業の問題を解決することでしたが、長年にわたって成長を続け、広範囲の分析タスクに適した汎用データベース管理システムに成長しました。 diff --git a/docs/ja/about-us/intro.mdx b/docs/ja/about-us/intro.mdx new file mode 100644 index 00000000000..63c6b64de13 --- /dev/null +++ b/docs/ja/about-us/intro.mdx @@ -0,0 +1,9 @@ +--- +slug: /ja/about-clickhouse +sidebar_label: 入出力フォーマット +title: ClickHouseとは? +--- + +import Content from '@site/docs/ja/intro.md'; + + diff --git a/docs/ja/about-us/support.md b/docs/ja/about-us/support.md new file mode 100644 index 00000000000..9e8917f45e6 --- /dev/null +++ b/docs/ja/about-us/support.md @@ -0,0 +1,19 @@ +--- +slug: /ja/about-us/support +sidebar_label: サポート +title: ClickHouse Cloud サポートサービス +sidebar_position: 30 +--- + +ClickHouseでは、ClickHouse Cloudのユーザーと顧客向けにサポートサービスを提供しています。我々の目標は、ClickHouse製品を体現するサポートサービスチームを構築することです。それは、比類ないパフォーマンス、使いやすさ、および例外的に迅速で高品質な結果を提供することを意味します。詳細については、[サポートサービスページ](https://clickhouse.com/support/program/)をご覧ください。 + +[クラウドコンソールにログイン](https://clickhouse.cloud/support)して、メニューオプションから **ヘルプ -> サポート** を選択すると、新しいサポートケースを開いて、送信したケースのステータスを確認できます。 + +また、[ステータスページ](https://status.clickhouse.com)に登録して、プラットフォームに影響を与えるインシデントについて迅速に通知を受け取ることができます。 + +:::note +サポートインシデントに関するサービスレベルアグリーメントは、サブスクリプション顧客のみが対象です。現在ClickHouse Cloudのユーザーでない場合は、質問にはお答えしますが、代わりに以下のコミュニティリソースをご活用いただくことをお勧めします: + +- [ClickHouseコミュニティSlackチャンネル](https://clickhouse.com/slack) +- [その他のコミュニティオプション](https://github.com/ClickHouse/ClickHouse/blob/master/README.md#useful-links) +::: diff --git a/docs/ja/architecture/cluster-deployment.md b/docs/ja/architecture/cluster-deployment.md new file mode 100644 index 00000000000..e18df9c2c06 --- /dev/null +++ b/docs/ja/architecture/cluster-deployment.md @@ -0,0 +1,152 @@ +--- +slug: /ja/architecture/cluster-deployment +sidebar_label: クラスターデプロイ +sidebar_position: 100 +title: クラスターデプロイ +--- + +このチュートリアルでは、すでに[ローカルの ClickHouse サーバー](../getting-started/install.md)をセットアップしていることを前提としています。 + +このチュートリアルを通じて、シンプルな ClickHouse クラスターのセットアップ方法を学びます。小規模ですが、フォールトトレラントでスケーラブルです。その後、例のデータセットの1つを使用してデータを充填し、デモクエリを実行します。 + +## クラスターデプロイ {#cluster-deployment} + +この ClickHouse クラスターは同質クラスターになります。以下の手順に従ってください: + +1. クラスターのすべてのマシンに ClickHouse サーバーをインストールする +2. 設定ファイルにクラスターのコンフィグを設定する +3. 各インスタンスにローカルテーブルを作成する +4. [分散テーブル](../engines/table-engines/special/distributed.md)を作成する + +[分散テーブル](../engines/table-engines/special/distributed.md)は、ClickHouse クラスター内のローカルテーブルへの「ビュー」の一種です。分散テーブルからの SELECT クエリは、クラスターのすべてのシャードのリソースを使用して実行されます。複数のクラスターに対して設定を指定し、それに応じて異なるクラスターにビューを提供するために複数の分散テーブルを作成できます。 + +以下は、3つのシャードとそれぞれ1つのレプリカを持つクラスターのコンフィグ例です: + +```xml + + + + + example-perftest01j.clickhouse.com + 9000 + + + + + example-perftest02j.clickhouse.com + 9000 + + + + + example-perftest03j.clickhouse.com + 9000 + + + + +``` + +さらなるデモンストレーションのために、単一ノードデプロイメントチュートリアルで使用した `hits_v1` の `CREATE TABLE` クエリと同じクエリを使用して、新しいローカルテーブルを作成しますが、異なるテーブル名にします: + +```sql +CREATE TABLE tutorial.hits_local (...) ENGINE = MergeTree() ... +``` + +分散テーブルを作成すると、クラスターのローカルテーブルに対するビューを提供します: + +```sql +CREATE TABLE tutorial.hits_all AS tutorial.hits_local +ENGINE = Distributed(perftest_3shards_1replicas, tutorial, hits_local, rand()); +``` + +一般的な方法として、クラスターのすべてのマシンに同様の分散テーブルを作成します。これにより、クラスターの任意のマシンで分散クエリを実行できます。また、[remote](../sql-reference/table-functions/remote.md) テーブル関数を使用して、特定の SELECT クエリに対する一時的な分散テーブルを作成するオプションもあります。 + +分散テーブルに対して [INSERT SELECT](../sql-reference/statements/insert-into.md) を実行し、テーブルを複数のサーバーに分散させてみましょう。 + +```sql +INSERT INTO tutorial.hits_all SELECT * FROM tutorial.hits_v1; +``` + +予想通り、計算量の多いクエリは1台のサーバーを使用するよりも3台のサーバーを使用することでN倍速く実行されます。 + +この場合、3つのシャードを持つクラスターを使用し、各シャードには1つのレプリカがあります。 + +本番環境での回復力を提供するために、各シャードには複数の可用性ゾーンまたはデータセンター(または少なくともラック)に広がる2〜3のレプリカを含めることをお勧めします。 ClickHouse は無制限の数のレプリカをサポートしていることに注意してください。 + +以下は、1つのシャードに3つのレプリカを含むクラスターのコンフィグ例です: + +```xml + + ... + + + + example-perftest01j.clickhouse.com + 9000 + + + example-perftest02j.clickhouse.com + 9000 + + + example-perftest03j.clickhouse.com + 9000 + + + + +``` + +ネイティブなレプリケーションを有効にするには、[ZooKeeper](http://zookeeper.apache.org/) が必要です。ClickHouse はすべてのレプリカのデータ整合性を保証し、障害後自動的に復元手続きを実行します。ZooKeeper クラスターを他のプロセス(ClickHouse を含む)が実行されていない別のサーバーにデプロイすることをお勧めします。 + +:::note Note +ZooKeeper は厳密には必須ではありません: 一部の簡単なケースでは、アプリケーションコードからすべてのレプリカにデータを書き込むことでデータを複製できます。このアプローチは**推奨されません**。なぜなら、この場合、ClickHouse はすべてのレプリカでのデータ整合性を保証できません。このため、データ整合性の責任はアプリケーションにあります。 +::: + +ZooKeeper の場所は設定ファイルで指定されます: + +```xml + + + zoo01.clickhouse.com + 2181 + + + zoo02.clickhouse.com + 2181 + + + zoo03.clickhouse.com + 2181 + + +``` + +また、テーブル作成時に使用されるシャードとレプリカを識別するためのマクロを設定する必要があります: + +```xml + + 01 + 01 + +``` + +レプリケートされたテーブルの作成時にレプリカが存在しない場合、新しい最初のレプリカがインスタンス化されます。すでにライブレプリカがある場合、新しいレプリカは既存のものからデータをクローンします。すべてのレプリケートされたテーブルを先に作成してからデータを挿入するか、あるいはデータ挿入中または後に他のレプリカを追加するかのいずれかのオプションがあります。 + +```sql +CREATE TABLE tutorial.hits_replica (...) +ENGINE = ReplicatedMergeTree( + '/clickhouse_perftest/tables/{shard}/hits', + '{replica}' +) +... +``` + +ここでは、[ReplicatedMergeTree](../engines/table-engines/mergetree-family/replication.md) テーブルエンジンを使用しています。パラメーターでは、シャードとレプリカ識別子を含む ZooKeeper パスを指定します。 + +```sql +INSERT INTO tutorial.hits_replica SELECT * FROM tutorial.hits_local; +``` + +レプリケーションはマルチマスターモードで動作します。データは任意のレプリカにロードでき、システムは他のインスタンスと自動的に同期します。レプリケーションは非同期であるため、ある時点で、すべてのレプリカが最近挿入されたデータを含むとは限りません。ただし、データのインゲストを許可するには、少なくとも1つのレプリカが稼働している必要があります。その他のレプリカは再アクティブ化するとデータを同期し、一貫性を修復します。この方法により、最近挿入されたデータが失われる可能性が低いという利点があります。 diff --git a/docs/ja/chdb/data-formats.md b/docs/ja/chdb/data-formats.md new file mode 100644 index 00000000000..dd6a9fff7cb --- /dev/null +++ b/docs/ja/chdb/data-formats.md @@ -0,0 +1,98 @@ +--- +title: データ形式 +sidebar_label: データ形式 +slug: /ja/chdb/data-formats +description: chDBのデータ形式 +keywords: [chdb, データ形式] +--- + +データ形式について言えば、chDBはClickHouseと100%機能互換です。 + +入力形式は、`File`、`URL`、または`S3`のようなファイル対応テーブルへの`INSERT`および`SELECT`に提供されるデータを解析するために使用されます。出力形式は、`SELECT`の結果を整理し、ファイル対応テーブルへの`INSERT`を実行するために使用されます。ClickHouseがサポートするデータ形式に加えて、chDBも以下をサポートしています: + +- 出力形式としての`ArrowTable`、タイプはPythonの`pyarrow.Table` +- 入力および出力形式としての`DataFrame`、タイプはPythonの`pandas.DataFrame`。例については、[test_joindf.py](https://github.com/chdb-io/chdb/blob/main/tests/test_joindf.py)をご参照ください。 +- 出力としての`Debug`(`CSV`のエイリアスとして)、ただしClickHouseからのデバッグ冗長出力を有効にしています。 + +ClickHouseがサポートするデータ形式は以下の通りです: + +| Format | Input | Output | +|---------------------------------|-------|--------| +| TabSeparated | ✔ | ✔ | +| TabSeparatedRaw | ✔ | ✔ | +| TabSeparatedWithNames | ✔ | ✔ | +| TabSeparatedWithNamesAndTypes | ✔ | ✔ | +| TabSeparatedRawWithNames | ✔ | ✔ | +| TabSeparatedRawWithNamesAndTypes| ✔ | ✔ | +| Template | ✔ | ✔ | +| TemplateIgnoreSpaces | ✔ | ✗ | +| CSV | ✔ | ✔ | +| CSVWithNames | ✔ | ✔ | +| CSVWithNamesAndTypes | ✔ | ✔ | +| CustomSeparated | ✔ | ✔ | +| CustomSeparatedWithNames | ✔ | ✔ | +| CustomSeparatedWithNamesAndTypes| ✔ | ✔ | +| SQLInsert | ✗ | ✔ | +| Values | ✔ | ✔ | +| Vertical | ✗ | ✔ | +| JSON | ✔ | ✔ | +| JSONAsString | ✔ | ✗ | +| JSONStrings | ✔ | ✔ | +| JSONColumns | ✔ | ✔ | +| JSONColumnsWithMetadata | ✔ | ✔ | +| JSONCompact | ✔ | ✔ | +| JSONCompactStrings | ✗ | ✔ | +| JSONCompactColumns | ✔ | ✔ | +| JSONEachRow | ✔ | ✔ | +| PrettyJSONEachRow | ✗ | ✔ | +| JSONEachRowWithProgress | ✗ | ✔ | +| JSONStringsEachRow | ✔ | ✔ | +| JSONStringsEachRowWithProgress | ✗ | ✔ | +| JSONCompactEachRow | ✔ | ✔ | +| JSONCompactEachRowWithNames | ✔ | ✔ | +| JSONCompactEachRowWithNamesAndTypes | ✔ | ✔ | +| JSONCompactStringsEachRow | ✔ | ✔ | +| JSONCompactStringsEachRowWithNames | ✔ | ✔ | +| JSONCompactStringsEachRowWithNamesAndTypes | ✔ | ✔ | +| JSONObjectEachRow | ✔ | ✔ | +| BSONEachRow | ✔ | ✔ | +| TSKV | ✔ | ✔ | +| Pretty | ✗ | ✔ | +| PrettyNoEscapes | ✗ | ✔ | +| PrettyMonoBlock | ✗ | ✔ | +| PrettyNoEscapesMonoBlock | ✗ | ✔ | +| PrettyCompact | ✗ | ✔ | +| PrettyCompactNoEscapes | ✗ | ✔ | +| PrettyCompactMonoBlock | ✗ | ✔ | +| PrettyCompactNoEscapesMonoBlock | ✗ | ✔ | +| PrettySpace | ✗ | ✔ | +| PrettySpaceNoEscapes | ✗ | ✔ | +| PrettySpaceMonoBlock | ✗ | ✔ | +| PrettySpaceNoEscapesMonoBlock | ✗ | ✔ | +| Prometheus | ✗ | ✔ | +| Protobuf | ✔ | ✔ | +| ProtobufSingle | ✔ | ✔ | +| Avro | ✔ | ✔ | +| AvroConfluent | ✔ | ✗ | +| Parquet | ✔ | ✔ | +| ParquetMetadata | ✔ | ✗ | +| Arrow | ✔ | ✔ | +| ArrowStream | ✔ | ✔ | +| ORC | ✔ | ✔ | +| One | ✔ | ✗ | +| RowBinary | ✔ | ✔ | +| RowBinaryWithNames | ✔ | ✔ | +| RowBinaryWithNamesAndTypes | ✔ | ✔ | +| RowBinaryWithDefaults | ✔ | ✔ | +| Native | ✔ | ✔ | +| Null | ✗ | ✔ | +| XML | ✗ | ✔ | +| CapnProto | ✔ | ✔ | +| LineAsString | ✔ | ✔ | +| Regexp | ✔ | ✗ | +| RawBLOB | ✔ | ✔ | +| MsgPack | ✔ | ✔ | +| MySQLDump | ✔ | ✗ | +| Markdown | ✗ | ✔ | + +詳細および例については、[ClickHouseの入力および出力データ形式](/docs/ja/interfaces/formats)をご覧ください。 diff --git a/docs/ja/chdb/getting-started.md b/docs/ja/chdb/getting-started.md new file mode 100644 index 00000000000..1d957bb91ad --- /dev/null +++ b/docs/ja/chdb/getting-started.md @@ -0,0 +1,367 @@ +--- +title: chDBの使い始め +sidebar_label: 使い始め +slug: /ja/chdb/getting-started +description: chDBはClickHouseによってパワードされたプロセス内SQL OLAPエンジンです +keywords: [chdb, embedded, clickhouse-lite, in-process, in process] +--- + +# chDBの使い始め + +このガイドでは、chDBのPythonバリアントをセットアップしていきます。まず、S3上のJSONファイルにクエリを実行し、それを基にchDBでテーブルを作成し、データに対するクエリを行います。さらに、クエリ結果をApache ArrowやPandasなど異なるフォーマットで取得する方法を学び、最終的にはPandas DataFrameに対してクエリを実行する方法を紹介します。 + +## セットアップ + +まずは仮想環境を作成します: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次にchDBをインストールします。バージョン2.0.3以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +そして[ipython](https://ipython.org/)をインストールします: + +```bash +pip install ipython +``` + +このガイドの残りでは`ipython`を使ってコマンドを実行します。以下のコマンドで`ipython`を起動できます: + +```bash +ipython +``` + +さらに、PandasとApache Arrowを使用するので、それらのライブラリもインストールします: + +```bash +pip install pandas pyarrow +``` + +## S3上にあるJSONファイルにクエリ + +次に、S3バケットに保存されているJSONファイルに対してクエリを行う方法を見てみましょう。[YouTubeの非表示データセット](https://clickhouse.com/docs/ja/getting-started/example-datasets/youtube-dislikes)には、2021年までのYouTube動画の非表示数が4億以上含まれています。このデータセットのJSONファイルの1つを使っていきます。 + +chdbをインポートします: + +```python +import chdb +``` + +次のクエリで、JSONファイルの構造を調べることができます: + +```python +chdb.query( + """ + DESCRIBE s3( + 's3://clickhouse-public-datasets/youtube/original/files/' || + 'youtubedislikes_20211127161229_18654868.1637897329_vid.json.zst', + 'JSONLines' + ) + SETTINGS describe_compact_output=1 + """ +) +``` + +```text +"id","Nullable(String)" +"fetch_date","Nullable(String)" +"upload_date","Nullable(String)" +"title","Nullable(String)" +"uploader_id","Nullable(String)" +"uploader","Nullable(String)" +"uploader_sub_count","Nullable(Int64)" +"is_age_limit","Nullable(Bool)" +"view_count","Nullable(Int64)" +"like_count","Nullable(Int64)" +"dislike_count","Nullable(Int64)" +"is_crawlable","Nullable(Bool)" +"is_live_content","Nullable(Bool)" +"has_subtitles","Nullable(Bool)" +"is_ads_enabled","Nullable(Bool)" +"is_comments_enabled","Nullable(Bool)" +"description","Nullable(String)" +"rich_metadata","Array(Tuple( + call Nullable(String), + content Nullable(String), + subtitle Nullable(String), + title Nullable(String), + url Nullable(String)))" +"super_titles","Array(Tuple( + text Nullable(String), + url Nullable(String)))" +"uploader_badges","Nullable(String)" +"video_badges","Nullable(String)" +``` + +また、そのファイル内の行数をカウントすることもできます: + +```python +chdb.query( + """ + SELECT count() + FROM s3( + 's3://clickhouse-public-datasets/youtube/original/files/' || + 'youtubedislikes_20211127161229_18654868.1637897329_vid.json.zst', + 'JSONLines' + )""" +) +``` + +```text +336432 +``` + +このファイルには30万以上のレコードが含まれています。 + +chDBはまだクエリパラメータの受け渡しをサポートしていませんが、パスを取り出してf-Stringを使って渡すことができます。 + +```python +path = 's3://clickhouse-public-datasets/youtube/original/files/youtubedislikes_20211127161229_18654868.1637897329_vid.json.zst' +``` + +```python +chdb.query( + f""" + SELECT count() + FROM s3('{path}','JSONLines') + """ +) +``` + +:::warning +これはプログラム内で定義された変数を使用する限りでは問題ありませんが、ユーザーから提供された入力で行うと、クエリがSQLインジェクションに対して脆弱になります。 +::: + +## 出力フォーマットの設定 + +デフォルトの出力フォーマットは`CSV`ですが、`output_format`パラメータを使って変更できます。chDBはClickHouseのデータフォーマットに加え、`DataFrame`など[chDB独自のフォーマット](data-formats.md)をサポートしており、Pandas DataFrameを返します: + +```python +result = chdb.query( + f""" + SELECT is_ads_enabled, count() + FROM s3('{path}','JSONLines') + GROUP BY ALL + """, + output_format="DataFrame" +) + +print(type(result)) +print(result) +``` + +```text + + is_ads_enabled count() +0 False 301125 +1 True 35307 +``` + +また、Apache Arrowテーブルを取得したい場合は: + +```python +result = chdb.query( + f""" + SELECT is_live_content, count() + FROM s3('{path}','JSONLines') + GROUP BY ALL + """, + output_format="ArrowTable" +) + +print(type(result)) +print(result) +``` + +```text + +pyarrow.Table +is_live_content: bool +count(): uint64 not null +---- +is_live_content: [[false,true]] +count(): [[315746,20686]] +``` + +## JSONファイルからテーブルの作成 + +次に、chDBでテーブルを作成する方法を見てみましょう。これを行うには、異なるAPIを使用する必要がありますので、まずそれをインポートします: + +```python +from chdb import session as chs +``` + +次に、セッションを初期化します。セッションをディスクに保存したい場合は、ディレクトリ名を指定する必要があります。これを空にすると、データベースはメモリ上に配置され、Pythonのプロセスを終了すると消去されます。 + +```python +sess = chs.Session("gettingStarted.chdb") +``` + +次に、データベースを作成します: + +```python +sess.query("CREATE DATABASE IF NOT EXISTS youtube") +``` + +次に、JSONファイルのスキーマに基づいて`dislikes`テーブルを`CREATE...EMPTY AS`技法を使って作成します。カラムの型をすべて`Nullable`にしないように[`schema_inference_make_columns_nullable`](/docs/ja/operations/settings/formats/#schema_inference_make_columns_nullable)設定を使用します。 + +```python +sess.query(f""" + CREATE TABLE youtube.dislikes + ORDER BY fetch_date + EMPTY AS + SELECT * + FROM s3('{path}','JSONLines') + SETTINGS schema_inference_make_columns_nullable=0 + """ +) +``` + +その後、`DESCRIBE`句を使ってスキーマを確認できます: + +```python +sess.query(f""" + DESCRIBE youtube.dislikes + SETTINGS describe_compact_output=1 + """ +) +``` + +```text +"id","String" +"fetch_date","String" +"upload_date","String" +"title","String" +"uploader_id","String" +"uploader","String" +"uploader_sub_count","Int64" +"is_age_limit","Bool" +"view_count","Int64" +"like_count","Int64" +"dislike_count","Int64" +"is_crawlable","Bool" +"is_live_content","Bool" +"has_subtitles","Bool" +"is_ads_enabled","Bool" +"is_comments_enabled","Bool" +"description","String" +"rich_metadata","Array(Tuple( + call String, + content String, + subtitle String, + title String, + url String))" +"super_titles","Array(Tuple( + text String, + url String))" +"uploader_badges","String" +"video_badges","String" +``` + +次に、そのテーブルにデータを挿入します: + +```python +sess.query(f""" + INSERT INTO youtube.dislikes + SELECT * + FROM s3('{path}','JSONLines') + SETTINGS schema_inference_make_columns_nullable=0 + """ +) +``` + +これらのステップを1回の操作で行うこともできます。`CREATE...AS`技法を使って異なるテーブルを作成してみます: + +```python +sess.query(f""" + CREATE TABLE youtube.dislikes2 + ORDER BY fetch_date + AS + SELECT * + FROM s3('{path}','JSONLines') + SETTINGS schema_inference_make_columns_nullable=0 + """ +) +``` + +## テーブルへのクエリ + +最後に、テーブルにクエリを実行します: + +```sql +df = sess.query(""" + SELECT uploader, sum(view_count) AS viewCount, sum(like_count) AS likeCount, sum(dislike_count) AS dislikeCount + FROM youtube.dislikes + GROUP BY ALL + ORDER BY viewCount DESC + LIMIT 10 + """, + "DataFrame" +) +df +``` + +```text + uploader viewCount likeCount dislikeCount +0 Jeremih 139066569 812602 37842 +1 TheKillersMusic 109313116 529361 11931 +2 LetsGoMartin- Canciones Infantiles 104747788 236615 141467 +3 Xiaoying Cuisine 54458335 1031525 37049 +4 Adri 47404537 279033 36583 +5 Diana and Roma IND 43829341 182334 148740 +6 ChuChuTV Tamil 39244854 244614 213772 +7 Cheez-It 35342270 108 27 +8 Anime Uz 33375618 1270673 60013 +9 RC Cars OFF Road 31952962 101503 49489 +``` + +例えば、次にDataFrameにlikesとdislikesの比率を計算するカラムを追加する場合、次のコードを書くことができます: + +```python +df["likeDislikeRatio"] = df["likeCount"] / df["dislikeCount"] +``` + +## Pandas DataFrameへのクエリ + +次に、そのDataFrameに対してchDBからクエリを実行できます: + +```python +chdb.query( + """ + SELECT uploader, likeDislikeRatio + FROM Python(df) + """, + output_format="DataFrame" +) +``` + +```text + uploader likeDislikeRatio +0 Jeremih 21.473548 +1 TheKillersMusic 44.368536 +2 LetsGoMartin- Canciones Infantiles 1.672581 +3 Xiaoying Cuisine 27.842182 +4 Adri 7.627395 +5 Diana and Roma IND 1.225857 +6 ChuChuTV Tamil 1.144275 +7 Cheez-It 4.000000 +8 Anime Uz 21.173296 +9 RC Cars OFF Road 2.051021 +``` + +Pandas DataFrameへのクエリについての詳細は[Querying Pandas developer guide](guides/querying-pandas.md)で詳しく説明されています。 + +## 次のステップ + +このガイドでchDBの概要が理解できたでしょうか。さらなる学習には、以下のデベロッパーガイドをご参照ください: + +* [Pandas DataFrameへのクエリ](guides/querying-pandas.md) +* [Apache Arrowへのクエリ](guides/querying-apache-arrow.md) +* [JupySQLでのchDBの使用](guides/jupysql.md) +* [既存のclickhouse-localデータベースでのchDBの使用](guides/clickhouse-local.md) diff --git a/docs/ja/chdb/guides/clickhouse-local.md b/docs/ja/chdb/guides/clickhouse-local.md new file mode 100644 index 00000000000..850e4802656 --- /dev/null +++ b/docs/ja/chdb/guides/clickhouse-local.md @@ -0,0 +1,127 @@ +--- +title: clickhouse-localデータベースの使用方法 +sidebar_label: clickhouse-localデータベースの使用方法 +slug: /ja/chdb/guides/clickhouse-local +description: chDBでclickhouse-localデータベースを使用する方法を学びます。 +keywords: [chdb, clickhouse-local] +--- + +[clickhouse-local](/ja/operations/utilities/clickhouse-local) は、ClickHouseの埋め込みバージョンを使用するCLIであり、サーバーをインストールすることなくClickHouseの機能を利用できるようにします。このガイドでは、chDBからclickhouse-localデータベースを使用する方法を学びます。 + +## セットアップ + +最初に仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。 +バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +続いて[ipython](https://ipython.org/)をインストールします: + +```bash +pip install ipython +``` + +このガイドの残りのコマンドを実行するために`ipython`を使用します。以下のコマンドで起動できます: + +```bash +ipython +``` + +## clickhouse-localのインストール + +clickhouse-localのダウンロードとインストールは、[ClickHouseのダウンロードとインストール](https://clickhouse.com/docs/ja/install)と同じです。以下のコマンドを実行します: + +```bash +curl https://clickhouse.com/ | sh +``` + +データをディレクトリに保存してclickhouse-localを起動するには、`--path`を指定する必要があります: + +```bash +./clickhouse -m --path demo.chdb +``` + +## clickhouse-localにデータを取り込む + +デフォルトのデータベースはメモリにデータを保存するだけなので、ディスクにデータを保持するには名前付きデータベースを作成する必要があります。 + +```sql +CREATE DATABASE foo; +``` + +次にテーブルを作成し、ランダムな数値を挿入します: + +```sql +CREATE TABLE foo.randomNumbers +ORDER BY number AS +SELECT rand() AS number +FROM numbers(10_000_000); +``` + +データを確認するためにクエリを実行してみましょう: + +```sql +SELECT quantilesExact(0, 0.5, 0.75, 0.99)(number) AS quants +FROM foo.randomNumbers + +┌─quants────────────────────────────────┐ +│ [69,2147776478,3221525118,4252096960] │ +└───────────────────────────────────────┘ +``` + +その後、CLIから`exit;`することを忘れないでください。ディレクトリに対するロックを保持できるのは一つのプロセスだけです。この操作を怠ると、chDBからデータベースに接続しようとしたときに次のエラーが発生します: + +```text +ChdbError: Code: 76. DB::Exception: Cannot lock file demo.chdb/status. Another server instance in same directory is already running. (CANNOT_OPEN_FILE) +``` + +## clickhouse-localデータベースへの接続 + +`ipython`シェルに戻り、chDBから`session`モジュールをインポートします: + +```python +from chdb import session as chs +``` + +`demo.chdb`を指すセッションを初期化します: + +``` +sess = chs.Session("demo.chdb") +``` + +次に、数値の分位を返す同じクエリを実行できます: + +```python +sess.query(""" +SELECT quantilesExact(0, 0.5, 0.75, 0.99)(number) AS quants +FROM foo.randomNumbers +""", "Vertical") + +Row 1: +────── +quants: [0,9976599,2147776478,4209286886] +``` + +chDBからこのデータベースにデータを挿入することもできます: + +```python +sess.query(""" +INSERT INTO foo.randomNumbers +SELECT rand() AS number FROM numbers(10_000_000) +""") + +Row 1: +────── +quants: [0,9976599,2147776478,4209286886] +``` + +その後、chDBまたはclickhouse-localから分位数クエリを再実行できます。 diff --git a/docs/ja/chdb/guides/images/players_per_rank.png b/docs/ja/chdb/guides/images/players_per_rank.png new file mode 100644 index 00000000000..16ca6da241d Binary files /dev/null and b/docs/ja/chdb/guides/images/players_per_rank.png differ diff --git a/docs/ja/chdb/guides/jupysql.md b/docs/ja/chdb/guides/jupysql.md new file mode 100644 index 00000000000..281ffbcff18 --- /dev/null +++ b/docs/ja/chdb/guides/jupysql.md @@ -0,0 +1,420 @@ +--- +title: JupySQLとchDB +sidebar_label: JupySQL +slug: /ja/chdb/guides/jupysql +description: BunのためのchDBのインストール方法 +keywords: [chdb, jupysql] +--- + +[JupySQL](https://jupysql.ploomber.io/en/latest/quick-start.html) は、JupyterノートブックやiPythonシェルでSQLを実行するためのPythonライブラリです。 +このガイドでは、chDBとJupySQLを使ってデータをクエリする方法を学びます。 + +
+ +
+ +## セットアップ + +まず、仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、JupySQL、iPython、およびJupyter Labをインストールします: + +```bash +pip install jupysql ipython jupyterlab +``` + +iPythonでJupySQLを使用できるように、以下を実行して起動します: + +```bash +ipython +``` + +あるいは、Jupyter Labで以下を実行して起動できます: + +```bash +jupyter lab +``` + +:::note +Jupyter Labを使用している場合、ガイドの続きを行う前にノートブックを作成する必要があります。 +::: + +## データセットのダウンロード + +[Jeff Sackmannのtennis_atp](https://github.com/JeffSackmann/tennis_atp) データセットを使用します。このデータセットは、選手とそのランキングに関するメタデータを含んでいます。 +最初にランキングファイルをダウンロードしましょう: + +```python +from urllib.request import urlretrieve +``` + +```python +files = ['00s', '10s', '20s', '70s', '80s', '90s', 'current'] +base = "https://raw.githubusercontent.com/JeffSackmann/tennis_atp/master" +for file in files: + _ = urlretrieve( + f"{base}/atp_rankings_{file}.csv", + f"atp_rankings_{file}.csv", + ) +``` + +## chDBとJupySQLの設定 + +次に、chDBの`dbapi`モジュールをインポートします: + +```python +from chdb import dbapi +``` + +そして、chDB接続を作成します。 +保存したデータはすべて`atp.chdb`ディレクトリに保存されます: + +```python +conn = dbapi.connect(path="atp.chdb") +``` + +次に、`sql`マジックをロードし、chDBへの接続を作成します: + +```python +%load_ext sql +%sql conn --alias chdb +``` + +次に、クエリの結果が切り捨てられないように表示制限を設定します: + +```python +%config SqlMagic.displaylimit = None +``` + +## CSVファイルのデータクエリ + +`atp_rankings`プレフィックスのついた複数のファイルをダウンロードしました。 +`DESCRIBE`句を使ってスキーマを理解しましょう: + +```python +%%sql +DESCRIBE file('atp_rankings*.csv') +SETTINGS describe_compact_output=1, + schema_inference_make_columns_nullable=0 +``` + +```text ++--------------+-------+ +| name | type | ++--------------+-------+ +| ranking_date | Int64 | +| rank | Int64 | +| player | Int64 | +| points | Int64 | ++--------------+-------+ +``` + +また、ファイルに対して直接`SELECT`クエリを書いてデータの内容を確認することもできます: + +```python +%sql SELECT * FROM file('atp_rankings*.csv') LIMIT 1 +``` + +```text ++--------------+------+--------+--------+ +| ranking_date | rank | player | points | ++--------------+------+--------+--------+ +| 20000110 | 1 | 101736 | 4135 | ++--------------+------+--------+--------+ +``` + +データのフォーマットが少し不思議です。 +この日付をきれいにし、`REPLACE`句を使ってクリーンな`ranking_date`を返します: + +```python +%%sql +SELECT * REPLACE ( + toDate(parseDateTime32BestEffort(toString(ranking_date))) AS ranking_date +) +FROM file('atp_rankings*.csv') +LIMIT 10 +SETTINGS schema_inference_make_columns_nullable=0 +``` + +```text ++--------------+------+--------+--------+ +| ranking_date | rank | player | points | ++--------------+------+--------+--------+ +| 2000-01-10 | 1 | 101736 | 4135 | +| 2000-01-10 | 2 | 102338 | 2915 | +| 2000-01-10 | 3 | 101948 | 2419 | +| 2000-01-10 | 4 | 103017 | 2184 | +| 2000-01-10 | 5 | 102856 | 2169 | +| 2000-01-10 | 6 | 102358 | 2107 | +| 2000-01-10 | 7 | 102839 | 1966 | +| 2000-01-10 | 8 | 101774 | 1929 | +| 2000-01-10 | 9 | 102701 | 1846 | +| 2000-01-10 | 10 | 101990 | 1739 | ++--------------+------+--------+--------+ +``` + +## CSVファイルをchDBにインポート + +これでこれらCSVファイルからのデータをテーブルに保存します。 +デフォルトのデータベースではデータがディスクに保存されないので、最初に別のデータベースを作成する必要があります: + +```python +%sql CREATE DATABASE atp +``` + +次に、CSVファイルのデータ構造から派生するスキーマを持つ`rankings`というテーブルを作成します: + +```python +%%sql +CREATE TABLE atp.rankings +ENGINE=MergeTree +ORDER BY ranking_date AS +SELECT * REPLACE ( + toDate(parseDateTime32BestEffort(toString(ranking_date))) AS ranking_date +) +FROM file('atp_rankings*.csv') +SETTINGS schema_inference_make_columns_nullable=0 +``` + +テーブル内のデータを簡単に確認しましょう: + +```python +%sql SELECT * FROM atp.rankings LIMIT 10 +``` + +```text ++--------------+------+--------+--------+ +| ranking_date | rank | player | points | ++--------------+------+--------+--------+ +| 2000-01-10 | 1 | 101736 | 4135 | +| 2000-01-10 | 2 | 102338 | 2915 | +| 2000-01-10 | 3 | 101948 | 2419 | +| 2000-01-10 | 4 | 103017 | 2184 | +| 2000-01-10 | 5 | 102856 | 2169 | +| 2000-01-10 | 6 | 102358 | 2107 | +| 2000-01-10 | 7 | 102839 | 1966 | +| 2000-01-10 | 8 | 101774 | 1929 | +| 2000-01-10 | 9 | 102701 | 1846 | +| 2000-01-10 | 10 | 101990 | 1739 | ++--------------+------+--------+--------+ +``` + +見た目は良さそうです。予想通り、CSVファイルを直接クエリしたときと同じ出力です。 + +選手のメタデータについても同じプロセスに従います。 +今回はデータがすべて単一のCSVファイル内にあるので、そのファイルをダウンロードしましょう: + +```python +_ = urlretrieve( + f"{base}/atp_players.csv", + "atp_players.csv", +) +``` + +次に、CSVファイルの内容に基づいて`players`というテーブルを作成します。 +また、`dob`フィールドを`Date32`型にしてきれいにします。 + +> ClickHouseでは、`Date`型は1970年以降の日付のみをサポートしています。`dob`カラムが1970年以前の日付を含むため、代わりに`Date32`型を使用します。 + +```python +%%sql +CREATE TABLE atp.players +Engine=MergeTree +ORDER BY player_id AS +SELECT * REPLACE ( + makeDate32( + toInt32OrNull(substring(toString(dob), 1, 4)), + toInt32OrNull(substring(toString(dob), 5, 2)), + toInt32OrNull(substring(toString(dob), 7, 2)) + )::Nullable(Date32) AS dob +) +FROM file('atp_players.csv') +SETTINGS schema_inference_make_columns_nullable=0 +``` + +実行が完了したら、取り込んだデータを確認してみましょう: + +```python +%sql SELECT * FROM atp.players LIMIT 10 +``` + +```text ++-----------+------------+-----------+------+------------+-----+--------+-------------+ +| player_id | name_first | name_last | hand | dob | ioc | height | wikidata_id | ++-----------+------------+-----------+------+------------+-----+--------+-------------+ +| 100001 | Gardnar | Mulloy | R | 1913-11-22 | USA | 185 | Q54544 | +| 100002 | Pancho | Segura | R | 1921-06-20 | ECU | 168 | Q54581 | +| 100003 | Frank | Sedgman | R | 1927-10-02 | AUS | 180 | Q962049 | +| 100004 | Giuseppe | Merlo | R | 1927-10-11 | ITA | 0 | Q1258752 | +| 100005 | Richard | Gonzalez | R | 1928-05-09 | USA | 188 | Q53554 | +| 100006 | Grant | Golden | R | 1929-08-21 | USA | 175 | Q3115390 | +| 100007 | Abe | Segal | L | 1930-10-23 | RSA | 0 | Q1258527 | +| 100008 | Kurt | Nielsen | R | 1930-11-19 | DEN | 0 | Q552261 | +| 100009 | Istvan | Gulyas | R | 1931-10-14 | HUN | 0 | Q51066 | +| 100010 | Luis | Ayala | R | 1932-09-18 | CHI | 170 | Q1275397 | ++-----------+------------+-----------+------+------------+-----+--------+-------------+ +``` + +## chDBでのクエリ + +データの取り込みが完了したので、いよいよ楽しい部分です - データをクエリしましょう! + +テニス選手は、参戦したトーナメントでの成績に基づいてポイントを獲得します。 +ポイントは52週間のローリング期間で各選手に対して評価されます。 +各選手が獲得した最大ポイントとその時のランキングを見つけるクエリを書きます: + +```python +%%sql +SELECT name_first, name_last, + max(points) as maxPoints, + argMax(rank, points) as rank, + argMax(ranking_date, points) as date +FROM atp.players +JOIN atp.rankings ON rankings.player = players.player_id +GROUP BY ALL +ORDER BY maxPoints DESC +LIMIT 10 +``` + +```text ++------------+-----------+-----------+------+------------+ +| name_first | name_last | maxPoints | rank | date | ++------------+-----------+-----------+------+------------+ +| Novak | Djokovic | 16950 | 1 | 2016-06-06 | +| Rafael | Nadal | 15390 | 1 | 2009-04-20 | +| Andy | Murray | 12685 | 1 | 2016-11-21 | +| Roger | Federer | 12315 | 1 | 2012-10-29 | +| Daniil | Medvedev | 10780 | 2 | 2021-09-13 | +| Carlos | Alcaraz | 9815 | 1 | 2023-08-21 | +| Dominic | Thiem | 9125 | 3 | 2021-01-18 | +| Jannik | Sinner | 8860 | 2 | 2024-05-06 | +| Stefanos | Tsitsipas | 8350 | 3 | 2021-09-20 | +| Alexander | Zverev | 8240 | 4 | 2021-08-23 | ++------------+-----------+-----------+------+------------+ +``` + +このリストにある選手の中には、非常に多くのポイントを獲得しながらも1位にならなかった選手がいるのが興味深いです。 + +## クエリの保存 + +クエリは`%%sql`マジックの同じ行で`--save`パラメータを使用して保存できます。 +`--no-execute`パラメータにより、クエリの実行はスキップされます。 + +```python +%%sql --save best_points --no-execute +SELECT name_first, name_last, + max(points) as maxPoints, + argMax(rank, points) as rank, + argMax(ranking_date, points) as date +FROM atp.players +JOIN atp.rankings ON rankings.player = players.player_id +GROUP BY ALL +ORDER BY maxPoints DESC +``` + +保存されたクエリを実行すると、実行前に共通テーブル式(CTE)に変換されます。 +次のクエリでは、1位にランクインしたときにプレーヤーが達成した最大ポイントを計算します: + +```python +%sql select * FROM best_points WHERE rank=1 +``` + +```text ++-------------+-----------+-----------+------+------------+ +| name_first | name_last | maxPoints | rank | date | ++-------------+-----------+-----------+------+------------+ +| Novak | Djokovic | 16950 | 1 | 2016-06-06 | +| Rafael | Nadal | 15390 | 1 | 2009-04-20 | +| Andy | Murray | 12685 | 1 | 2016-11-21 | +| Roger | Federer | 12315 | 1 | 2012-10-29 | +| Carlos | Alcaraz | 9815 | 1 | 2023-08-21 | +| Pete | Sampras | 5792 | 1 | 1997-08-11 | +| Andre | Agassi | 5652 | 1 | 1995-08-21 | +| Lleyton | Hewitt | 5205 | 1 | 2002-08-12 | +| Gustavo | Kuerten | 4750 | 1 | 2001-09-10 | +| Juan Carlos | Ferrero | 4570 | 1 | 2003-10-20 | +| Stefan | Edberg | 3997 | 1 | 1991-02-25 | +| Jim | Courier | 3973 | 1 | 1993-08-23 | +| Ivan | Lendl | 3420 | 1 | 1990-02-26 | +| Ilie | Nastase | 0 | 1 | 1973-08-27 | ++-------------+-----------+-----------+------+------------+ +``` + +## パラメータを使用したクエリ + +クエリ内でパラメータを使用することもできます。 +パラメータは通常の変数です: + +```python +rank = 10 +``` + +次に`{{variable}}`構文をクエリ内で使用できます。 +以下のクエリでは、プレーヤーがトップ10にランクインした初日と最終日との間の日数が最短のプレーヤーを見つけます: + +```python +%%sql +SELECT name_first, name_last, + MIN(ranking_date) AS earliest_date, + MAX(ranking_date) AS most_recent_date, + most_recent_date - earliest_date AS days, + 1 + (days/7) AS weeks +FROM atp.rankings +JOIN atp.players ON players.player_id = rankings.player +WHERE rank <= {{rank}} +GROUP BY ALL +ORDER BY days +LIMIT 10 +``` + +```text ++------------+-----------+---------------+------------------+------+-------+ +| name_first | name_last | earliest_date | most_recent_date | days | weeks | ++------------+-----------+---------------+------------------+------+-------+ +| Alex | Metreveli | 1974-06-03 | 1974-06-03 | 0 | 1 | +| Mikael | Pernfors | 1986-09-22 | 1986-09-22 | 0 | 1 | +| Felix | Mantilla | 1998-06-08 | 1998-06-08 | 0 | 1 | +| Wojtek | Fibak | 1977-07-25 | 1977-07-25 | 0 | 1 | +| Thierry | Tulasne | 1986-08-04 | 1986-08-04 | 0 | 1 | +| Lucas | Pouille | 2018-03-19 | 2018-03-19 | 0 | 1 | +| John | Alexander | 1975-12-15 | 1975-12-15 | 0 | 1 | +| Nicolas | Massu | 2004-09-13 | 2004-09-20 | 7 | 2 | +| Arnaud | Clement | 2001-04-02 | 2001-04-09 | 7 | 2 | +| Ernests | Gulbis | 2014-06-09 | 2014-06-23 | 14 | 3 | ++------------+-----------+---------------+------------------+------+-------+ +``` + +## ヒストグラムのプロット + +JupySQLには限定的なチャート機能もあります。 +ボックスプロットやヒストグラムを作成できます。 + +ここでは、100位以内にランクインしたそれぞれのレンキングを達成した選手の数をカウントするヒストグラムを作成しますが、その前にプレーヤーが達成したランクを計算するクエリを書いて保存しましょう: + +```python +%%sql --save players_per_rank --no-execute +select distinct player, rank +FROM atp.rankings +WHERE rank <= 100 +``` + +次に、次の手順でヒストグラムを作成できます: + +```python +from sql.ggplot import ggplot, geom_histogram, aes + +plot = ( + ggplot( + table="players_per_rank", + with_="players_per_rank", + mapping=aes(x="rank", fill="#69f0ae", color="#fff"), + ) + geom_histogram(bins=100) +) +``` + +Self-managed ClickHouseからの移行 diff --git a/docs/ja/chdb/guides/query-remote-clickhouse.md b/docs/ja/chdb/guides/query-remote-clickhouse.md new file mode 100644 index 00000000000..7e95ce025fb --- /dev/null +++ b/docs/ja/chdb/guides/query-remote-clickhouse.md @@ -0,0 +1,186 @@ +--- +title: リモートClickHouseサーバーへのクエリ方法 +sidebar_label: リモートClickHouseへのクエリ +slug: /ja/chdb/guides/query-remote-clickhouse +description: このガイドでは、chDBからリモートClickHouseサーバーにクエリを実行する方法を学習します。 +keywords: [chdb, clickhouse] +--- + +このガイドでは、chDBからリモートClickHouseサーバーにクエリを実行する方法を学習します。 + +## セットアップ + +まず仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次にchDBをインストールします。 +バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次にpandasとipythonをインストールします: + +```bash +pip install pandas ipython +``` + +このガイドの残りの部分でコマンドを実行するために`ipython`を使用します。以下のコマンドで起動できます: + +```bash +ipython +``` + +また、このコードをPythonスクリプトやお好みのノートブックで使用することもできます。 + +## ClickPyの紹介 + +これからクエリを実行するリモートClickHouseサーバーは[ClickPy](https://clickpy.clickhouse.com)です。 +ClickPyはPyPiパッケージのダウンロード数を追跡し、UIを通じてパッケージの統計情報を探ることができます。基礎となるデータベースは`play`ユーザーを使用してクエリを実行できます。 + +ClickPyの詳細は[そのGitHubリポジトリ](https://github.com/ClickHouse/clickpy)で確認できます。 + +## ClickPy ClickHouseサービスへのクエリ + +chDBをインポートしましょう: + +```python +import chdb +``` + +`remoteSecure`関数を使用してClickPyにクエリを実行します。この関数には少なくともホスト名、テーブル名、ユーザー名が必要です。 + +[`openai`パッケージ](https://clickpy.clickhouse.com/dashboard/openai)の1日ごとのダウンロード数をPandas DataFrameとして取得するためのクエリは以下の通りです: + +```python +query = """ +SELECT + toStartOfDay(date)::Date32 AS x, + sum(count) AS y +FROM remoteSecure( + 'clickpy-clickhouse.clickhouse.com', + 'pypi.pypi_downloads_per_day', + 'play' +) +WHERE project = 'openai' +GROUP BY x +ORDER BY x ASC +""" + +openai_df = chdb.query(query, "DataFrame") +openai_df.sort_values(by=["x"], ascending=False).head(n=10) +``` + +```text + x y +2392 2024-10-02 1793502 +2391 2024-10-01 1924901 +2390 2024-09-30 1749045 +2389 2024-09-29 1177131 +2388 2024-09-28 1157323 +2387 2024-09-27 1688094 +2386 2024-09-26 1862712 +2385 2024-09-25 2032923 +2384 2024-09-24 1901965 +2383 2024-09-23 1777554 +``` + +次に[`scikit-learn`](https://clickpy.clickhouse.com/dashboard/scikit-learn)のダウンロード数を取得するために同じことを行ってみましょう: + +```python +query = """ +SELECT + toStartOfDay(date)::Date32 AS x, + sum(count) AS y +FROM remoteSecure( + 'clickpy-clickhouse.clickhouse.com', + 'pypi.pypi_downloads_per_day', + 'play' +) +WHERE project = 'scikit-learn' +GROUP BY x +ORDER BY x ASC +""" + +sklearn_df = chdb.query(query, "DataFrame") +sklearn_df.sort_values(by=["x"], ascending=False).head(n=10) +``` + +```text + x y +2392 2024-10-02 1793502 +2391 2024-10-01 1924901 +2390 2024-09-30 1749045 +2389 2024-09-29 1177131 +2388 2024-09-28 1157323 +2387 2024-09-27 1688094 +2386 2024-09-26 1862712 +2385 2024-09-25 2032923 +2384 2024-09-24 1901965 +2383 2024-09-23 1777554 +``` + +## Pandas DataFrameのマージ + +現在、2つのDataFrameを持っています。これを日付(`x`カラム)を基にしてマージすることができます: + +```python +df = openai_df.merge( + sklearn_df, + on="x", + suffixes=("_openai", "_sklearn") +) +df.head(n=5) +``` + +```text + x y_openai y_sklearn +0 2018-02-26 83 33971 +1 2018-02-27 31 25211 +2 2018-02-28 8 26023 +3 2018-03-01 8 20912 +4 2018-03-02 5 23842 +``` + +次に、このようにしてOpenAIのダウンロード数とscikit-learnのダウンロード数の比率を計算することができます: + +```python +df['ratio'] = df['y_openai'] / df['y_sklearn'] +df.head(n=5) +``` + +```text + x y_openai y_sklearn ratio +0 2018-02-26 83 33971 0.002443 +1 2018-02-27 31 25211 0.001230 +2 2018-02-28 8 26023 0.000307 +3 2018-03-01 8 20912 0.000383 +4 2018-03-02 5 23842 0.000210 +``` + +## Pandas DataFrameのクエリ + +次に、最も良い比率と最悪の比率の日付を探したいとします。 +chDBに戻ってこれらの値を計算します: + +```python +chdb.query(""" +SELECT max(ratio) AS bestRatio, + argMax(x, ratio) AS bestDate, + min(ratio) AS worstRatio, + argMin(x, ratio) AS worstDate +FROM Python(df) +""", "DataFrame") +``` + +```text + bestRatio bestDate worstRatio worstDate +0 0.693855 2024-09-19 0.000003 2020-02-09 +``` + +Pandas DataFrameへのクエリについてさらに学びたい場合は、[Pandas DataFrames 開発者ガイド](querying-pandas.md)をご覧ください。 diff --git a/docs/ja/chdb/guides/querying-apache-arrow.md b/docs/ja/chdb/guides/querying-apache-arrow.md new file mode 100644 index 00000000000..af3e1f0a6e0 --- /dev/null +++ b/docs/ja/chdb/guides/querying-apache-arrow.md @@ -0,0 +1,169 @@ +--- +title: chDBでApache Arrowをクエリする方法 +sidebar_label: Apache Arrowをクエリする +slug: /ja/chdb/guides/apache-arrow +description: このガイドでは、chDBを使用してApache Arrowテーブルをクエリする方法を学びます。 +keywords: [chdb, apache-arrow] +--- + +[Apache Arrow](https://arrow.apache.org/) は、データコミュニティで人気を博している標準化された列指向メモリフォーマットです。このガイドでは、`Python`テーブル関数を使用してApache Arrowをクエリする方法を学びます。 + +## セットアップ + +まず、仮想環境を作成します: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、pyarrow、pandas、ipythonをインストールします: + +```bash +pip install pyarrow pandas ipython +``` + +この後のガイドで使用するコマンドを実行するために、`ipython`を使用します。起動するには以下を実行してください: + +```bash +ipython +``` + +また、Pythonスクリプトや好きなノートブックでもコードを使用できます。 + +## ファイルからApache Arrowテーブルを作成する + +まず、[AWS CLIツール](https://aws.amazon.com/cli/)を使用して、[Ooklaデータセット](https://github.com/teamookla/ookla-open-data)のParquetファイルの1つをダウンロードします: + +```bash +aws s3 cp \ + --no-sign \ + s3://ookla-open-data/parquet/performance/type=mobile/year=2023/quarter=2/2023-04-01_performance_mobile_tiles.parquet . +``` + +:::note +ファイルをもっとダウンロードしたい場合は、`aws s3 ls`を使ってすべてのファイルのリストを取得し、上記のコマンドを更新してください。 +::: + +次に、pyarrowパッケージからParquetモジュールをインポートします: + +```python +import pyarrow.parquet as pq +``` + +そして、ParquetファイルをApache Arrowテーブルに読み込むことができます: + +```python +arrow_table = pq.read_table("./2023-04-01_performance_mobile_tiles.parquet") +``` + +スキーマは以下の通りです: + +```python +arrow_table.schema +``` + +```text +quadkey: string +tile: string +tile_x: double +tile_y: double +avg_d_kbps: int64 +avg_u_kbps: int64 +avg_lat_ms: int64 +avg_lat_down_ms: int32 +avg_lat_up_ms: int32 +tests: int64 +devices: int64 +``` + +`shape`属性を呼び出すことで行とカラムの数を取得できます: + +```python +arrow_table.shape +``` + +```text +(3864546, 11) +``` + +## Apache Arrowをクエリする + +次に、chDBからArrowテーブルをクエリしましょう。まず、chDBをインポートします: + +```python +import chdb +``` + +そして、テーブルを記述します: + +```python +chdb.query(""" +DESCRIBE Python(arrow_table) +SETTINGS describe_compact_output=1 +""", "DataFrame") +``` + +```text + name type +0 quadkey String +1 tile String +2 tile_x Float64 +3 tile_y Float64 +4 avg_d_kbps Int64 +5 avg_u_kbps Int64 +6 avg_lat_ms Int64 +7 avg_lat_down_ms Int32 +8 avg_lat_up_ms Int32 +9 tests Int64 +10 devices Int64 +``` + +行の数もカウントできます: + +```python +chdb.query("SELECT count() FROM Python(arrow_table)", "DataFrame") +``` + +```text + count() +0 3864546 +``` + +では、もう少し興味深いことをしましょう。以下のクエリは、`quadkey`および`tile.*`カラムを除外し、残りのすべてのカラムの平均と最大値を計算します: + +```python +chdb.query(""" +WITH numericColumns AS ( + SELECT * EXCEPT ('tile.*') EXCEPT(quadkey) + FROM Python(arrow_table) +) +SELECT * APPLY(max), * APPLY(avg) APPLY(x -> round(x, 2)) +FROM numericColumns +""", "Vertical") +``` + +```text +Row 1: +────── +max(avg_d_kbps): 4155282 +max(avg_u_kbps): 1036628 +max(avg_lat_ms): 2911 +max(avg_lat_down_ms): 2146959360 +max(avg_lat_up_ms): 2146959360 +max(tests): 111266 +max(devices): 1226 +round(avg(avg_d_kbps), 2): 84393.52 +round(avg(avg_u_kbps), 2): 15540.4 +round(avg(avg_lat_ms), 2): 41.25 +round(avg(avg_lat_down_ms), 2): 554355225.76 +round(avg(avg_lat_up_ms), 2): 552843178.3 +round(avg(tests), 2): 6.31 +round(avg(devices), 2): 2.88 +``` diff --git a/docs/ja/chdb/guides/querying-pandas.md b/docs/ja/chdb/guides/querying-pandas.md new file mode 100644 index 00000000000..60d6cf3ce2a --- /dev/null +++ b/docs/ja/chdb/guides/querying-pandas.md @@ -0,0 +1,398 @@ +--- +title: chDBでPandas DataFrameをクエリする方法 +sidebar_label: Pandasへのクエリ +slug: /ja/chdb/guides/pandas +description: chDBでPandas DataFrameをクエリする方法を学びます +keywords: [chdb, pandas] +--- + +[Pandas](https://pandas.pydata.org/)は、Pythonでのデータ操作と分析のための人気のあるライブラリです。 +chDBのバージョン2では、Pandas DataFrameへのクエリのパフォーマンスを向上し、新しい`Python`テーブル関数を導入しました。 +このガイドでは、`Python`テーブル関数を使用してPandasをクエリする方法を学びます。 + +## セットアップ + +まずは仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次にchDBをインストールします。バージョン2.0.2以上が必要です: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、Pandasとその他のライブラリをインストールします: + +```bash +pip install pandas requests ipython +``` + +このガイドで使用するコマンドを実行するために`ipython`を使用します。以下のコマンドで起動できます: + +```bash +ipython +``` + +または、Pythonスクリプトやお気に入りのノートブックでコードを使用できます。 + +## URLからPandas DataFrameを作成する + +[StatsBomb GitHubリポジトリ](https://github.com/statsbomb/open-data/tree/master?tab=readme-ov-file)からデータをクエリします。 +まずはrequestsとpandasをインポートします: + +```python +import requests +import pandas as pd +``` + +次に、ある試合のJSONファイルをDataFrameにロードします: + +```python +response = requests.get( + "https://raw.githubusercontent.com/statsbomb/open-data/master/data/matches/223/282.json" +) +matches_df = pd.json_normalize(response.json(), sep='_') +``` + +扱うデータを確認しましょう: + +```python +matches_df.iloc[0] +``` + +```text +match_id 3943077 +match_date 2024-07-15 +kick_off 04:15:00.000 +home_score 1 +away_score 0 +match_status available +match_status_360 unscheduled +last_updated 2024-07-15T15:50:08.671355 +last_updated_360 None +match_week 6 +competition_competition_id 223 +competition_country_name South America +competition_competition_name Copa America +season_season_id 282 +season_season_name 2024 +home_team_home_team_id 779 +home_team_home_team_name Argentina +home_team_home_team_gender male +home_team_home_team_group None +home_team_country_id 11 +home_team_country_name Argentina +home_team_managers [{'id': 5677, 'name': 'Lionel Sebastián Scalon... +away_team_away_team_id 769 +away_team_away_team_name Colombia +away_team_away_team_gender male +away_team_away_team_group None +away_team_country_id 49 +away_team_country_name Colombia +away_team_managers [{'id': 5905, 'name': 'Néstor Gabriel Lorenzo'... +metadata_data_version 1.1.0 +metadata_shot_fidelity_version 2 +metadata_xy_fidelity_version 2 +competition_stage_id 26 +competition_stage_name Final +stadium_id 5337 +stadium_name Hard Rock Stadium +stadium_country_id 241 +stadium_country_name United States of America +referee_id 2638 +referee_name Raphael Claus +referee_country_id 31 +referee_country_name Brazil +Name: 0, dtype: object +``` + +次に、もう一つのイベントJSONファイルをロードし、そのDataFrameに`match_id`カラムを追加します: + +```python +response = requests.get( + "https://raw.githubusercontent.com/statsbomb/open-data/master/data/events/3943077.json" +) +events_df = pd.json_normalize(response.json(), sep='_') +events_df["match_id"] = 3943077 +``` + +そして、最初の行を確認しましょう: + +```python +with pd.option_context("display.max_rows", None): + first_row = events_df.iloc[0] + non_nan_columns = first_row[first_row.notna()].T + display(non_nan_columns) +``` + +```text +id 279b7d66-92b5-4daa-8ff6-cba8fce271d9 +index 1 +period 1 +timestamp 00:00:00.000 +minute 0 +second 0 +possession 1 +duration 0.0 +type_id 35 +type_name Starting XI +possession_team_id 779 +possession_team_name Argentina +play_pattern_id 1 +play_pattern_name Regular Play +team_id 779 +team_name Argentina +tactics_formation 442.0 +tactics_lineup [{'player': {'id': 6909, 'name': 'Damián Emili... +match_id 3943077 +Name: 0, dtype: object +``` + +## Pandas DataFrameへのクエリ + +次に、chDBを使ってこれらのDataFrameにクエリを実行する方法を見てみましょう。 +ライブラリをインポートします: + +```python +import chdb +``` + +`Python`テーブル関数を使用してPandas DataFrameにクエリを実行できます: + +```sql +SELECT * +FROM Python() +``` + +したがって、`matches_df`のカラムを列挙する場合は、以下のように記述できます: + +```python +chdb.query(""" +DESCRIBE Python(matches_df) +SETTINGS describe_compact_output=1 +""", "DataFrame") +``` + +```text + name type +0 match_id Int64 +1 match_date String +2 kick_off String +3 home_score Int64 +4 away_score Int64 +5 match_status String +6 match_status_360 String +7 last_updated String +8 last_updated_360 String +9 match_week Int64 +10 competition_competition_id Int64 +11 competition_country_name String +12 competition_competition_name String +13 season_season_id Int64 +14 season_season_name String +15 home_team_home_team_id Int64 +16 home_team_home_team_name String +17 home_team_home_team_gender String +18 home_team_home_team_group String +19 home_team_country_id Int64 +20 home_team_country_name String +21 home_team_managers String +22 away_team_away_team_id Int64 +23 away_team_away_team_name String +24 away_team_away_team_gender String +25 away_team_away_team_group String +26 away_team_country_id Int64 +27 away_team_country_name String +28 away_team_managers String +29 metadata_data_version String +30 metadata_shot_fidelity_version String +31 metadata_xy_fidelity_version String +32 competition_stage_id Int64 +33 competition_stage_name String +34 stadium_id Int64 +35 stadium_name String +36 stadium_country_id Int64 +37 stadium_country_name String +38 referee_id Int64 +39 referee_name String +40 referee_country_id Int64 +41 referee_country_name String +``` + +次に、どの審判が2回以上の試合を担当したかを確認するために、次のクエリを記述できます: + +```python +chdb.query(""" +SELECT referee_name, count() AS count +FROM Python(matches_df) +GROUP BY ALL +HAVING count > 1 +ORDER BY count DESC +""", "DataFrame") +``` + +```text + referee_name count +0 César Arturo Ramos Palazuelos 3 +1 Maurizio Mariani 3 +2 Piero Maza Gomez 3 +3 Mario Alberto Escobar Toca 2 +4 Wilmar Alexander Roldán Pérez 2 +5 Jesús Valenzuela Sáez 2 +6 Wilton Pereira Sampaio 2 +7 Darío Herrera 2 +8 Andrés Matonte 2 +9 Raphael Claus 2 +``` + +次に、`events_df`を探索しましょう。 + +```python +chdb.query(""" +SELECT pass_recipient_name, count() +FROM Python(events_df) +WHERE type_name = 'Pass' AND pass_recipient_name <> '' +GROUP BY ALL +ORDER BY count() DESC +LIMIT 10 +""", "DataFrame") +``` + +```text + pass_recipient_name count() +0 Davinson Sánchez Mina 76 +1 Ángel Fabián Di María Hernández 64 +2 Alexis Mac Allister 62 +3 Enzo Fernandez 57 +4 James David Rodríguez Rubio 56 +5 Johan Andrés Mojica Palacio 55 +6 Rodrigo Javier De Paul 54 +7 Jefferson Andrés Lerma Solís 53 +8 Jhon Adolfo Arias Andrade 52 +9 Carlos Eccehomo Cuesta Figueroa 50 +``` + +## Pandas DataFrameの結合 + +また、クエリ内でDataFrameを結合することもできます。 +例えば、試合の概要を取得するために次のクエリを書くことができます: + +```python +chdb.query(""" +SELECT home_team_home_team_name, away_team_away_team_name, home_score, away_score, + countIf(type_name = 'Pass' AND possession_team_id=home_team_home_team_id) AS home_passes, + countIf(type_name = 'Pass' AND possession_team_id=away_team_away_team_id) AS away_passes, + countIf(type_name = 'Shot' AND possession_team_id=home_team_home_team_id) AS home_shots, + countIf(type_name = 'Shot' AND possession_team_id=away_team_away_team_id) AS away_shots +FROM Python(matches_df) AS matches +JOIN Python(events_df) AS events ON events.match_id = matches.match_id +GROUP BY ALL +LIMIT 5 +""", "DataFrame").iloc[0] +``` + +```text +home_team_home_team_name Argentina +away_team_away_team_name Colombia +home_score 1 +away_score 0 +home_passes 527 +away_passes 669 +home_shots 11 +away_shots 19 +Name: 0, dtype: object +``` + +## DataFrameからテーブルへのデータの投入 + +また、DataFrameからClickHouseのテーブルを作成し、データを投入することもできます。 +chDBでテーブルを作成する場合、Stateful Session APIを使用する必要があります。 + +セッションモジュールをインポートしましょう: + +```python +from chdb import session as chs +``` + +セッションを初期化します: + +``` +sess = chs.Session() +``` + +次に、データベースを作成します: + +```python +sess.query("CREATE DATABASE statsbomb") +``` + +続いて、`events_df`に基づいて`events`テーブルを作成します: + +```python +sess.query(""" +CREATE TABLE statsbomb.events ORDER BY id AS +SELECT * +FROM Python(events_df) +""") +``` + +最も多くのパスを受けた選手を返すクエリを実行できます: + +```python +sess.query(""" +SELECT pass_recipient_name, count() +FROM statsbomb.events +WHERE type_name = 'Pass' AND pass_recipient_name <> '' +GROUP BY ALL +ORDER BY count() DESC +LIMIT 10 +""", "DataFrame") +``` + +```text + pass_recipient_name count() +0 Davinson Sánchez Mina 76 +1 Ángel Fabián Di María Hernández 64 +2 Alexis Mac Allister 62 +3 Enzo Fernandez 57 +4 James David Rodríguez Rubio 56 +5 Johan Andrés Mojica Palacio 55 +6 Rodrigo Javier De Paul 54 +7 Jefferson Andrés Lerma Solís 53 +8 Jhon Adolfo Arias Andrade 52 +9 Carlos Eccehomo Cuesta Figueroa 50 +``` + +## Pandas DataFrameとテーブルの結合 + +最後に、`matches_df` DataFrameと`statsbomb.events`テーブルを結合するために、結合クエリを更新することもできます: + +```python +sess.query(""" +SELECT home_team_home_team_name, away_team_away_team_name, home_score, away_score, + countIf(type_name = 'Pass' AND possession_team_id=home_team_home_team_id) AS home_passes, + countIf(type_name = 'Pass' AND possession_team_id=away_team_away_team_id) AS away_passes, + countIf(type_name = 'Shot' AND possession_team_id=home_team_home_team_id) AS home_shots, + countIf(type_name = 'Shot' AND possession_team_id=away_team_away_team_id) AS away_shots +FROM Python(matches_df) AS matches +JOIN statsbomb.events AS events ON events.match_id = matches.match_id +GROUP BY ALL +LIMIT 5 +""", "DataFrame").iloc[0] +``` + +```text +home_team_home_team_name Argentina +away_team_away_team_name Colombia +home_score 1 +away_score 0 +home_passes 527 +away_passes 669 +home_shots 11 +away_shots 19 +Name: 0, dtype: object +``` diff --git a/docs/ja/chdb/guides/querying-parquet.md b/docs/ja/chdb/guides/querying-parquet.md new file mode 100644 index 00000000000..3ab1f8abaf6 --- /dev/null +++ b/docs/ja/chdb/guides/querying-parquet.md @@ -0,0 +1,171 @@ +--- +title: Parquetファイルをクエリする方法 +sidebar_label: Parquetファイルのクエリ +slug: /ja/chdb/guides/querying-parquet +description: chDBを使用してParquetファイルをクエリする方法を学びます。 +keywords: [chdb, parquet] +--- + +世界中のデータの多くはAmazon S3バケットに存在しています。このガイドでは、chDBを使用してそのデータをクエリする方法を学びます。 + +## セットアップ + +まず、仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。バージョン2.0.2以上であることを確認してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、iPythonをインストールします: + +```bash +pip install ipython +``` + +`ipython`を使用してこのガイドのコマンドを実行します。起動するには以下を実行します: + +```bash +ipython +``` + +また、Pythonスクリプトやお好みのノートブックでコードを使用することもできます。 + +## Parquetメタデータの探索 + +これから、[Amazonレビュー](/docs/ja/getting-started/example-datasets/amazon-reviews)データセットのParquetファイルを探索します。まず、`chDB`をインストールしましょう: + +```python +import chdb +``` + +Parquetファイルをクエリする際に、[`ParquetMetadata`](/docs/ja/interfaces/formats#parquetmetadata-data-format-parquet-metadata)入力フォーマットを使用して、ファイルの内容ではなくParquetメタデータを返すことができます。このフォーマットを使用する際に返されるフィールドを`DESCRIBE`句を使って確認しましょう: + +```python +query = """ +DESCRIBE s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', + ParquetMetadata +) +SETTINGS describe_compact_output=1 +""" + +chdb.query(query, 'TabSeparated') +``` + +```text +num_columns UInt64 +num_rows UInt64 +num_row_groups UInt64 +format_version String +metadata_size UInt64 +total_uncompressed_size UInt64 +total_compressed_size UInt64 +columns Array(Tuple(name String, path String, max_definition_level UInt64, max_repetition_level UInt64, physical_type String, logical_type String, compression String, total_uncompressed_size UInt64, total_compressed_size UInt64, space_saved String, encodings Array(String))) +row_groups Array(Tuple(num_columns UInt64, num_rows UInt64, total_uncompressed_size UInt64, total_compressed_size UInt64, columns Array(Tuple(name String, path String, total_compressed_size UInt64, total_uncompressed_size UInt64, have_statistics Bool, statistics Tuple(num_values Nullable(UInt64), null_count Nullable(UInt64), distinct_count Nullable(UInt64), min Nullable(String), max Nullable(String)))))) +``` + +現在、このファイルのメタデータを見てみましょう。`columns`と`row_groups`は多くのプロパティを含むタプルの配列なので、今回はそれらを除外します。 + +```python +query = """ +SELECT * EXCEPT(columns, row_groups) +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', + ParquetMetadata +) +""" + +chdb.query(query, 'Vertical') +``` + +```text +Row 1: +────── +num_columns: 15 +num_rows: 41905631 +num_row_groups: 42 +format_version: 2.6 +metadata_size: 79730 +total_uncompressed_size: 14615827169 +total_compressed_size: 9272262304 +``` + +この出力から、このParquetファイルには40百万行以上の行があり、42の行グループに分割され、各行に15のカラムが含まれていることがわかります。行グループはデータを論理的に水平に分割したものです。各行グループには関連するメタデータがあり、クエリツールはそのメタデータを使用してファイルを効率的にクエリできます。 + +行グループの1つを見てみましょう: + +```python +query = """ +WITH rowGroups AS ( + SELECT rg + FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet', + ParquetMetadata + ) + ARRAY JOIN row_groups AS rg + LIMIT 1 +) +SELECT tupleElement(c, 'name') AS name, tupleElement(c, 'total_compressed_size') AS total_compressed_size, + tupleElement(c, 'total_uncompressed_size') AS total_uncompressed_size, + tupleElement(tupleElement(c, 'statistics'), 'min') AS min, + tupleElement(tupleElement(c, 'statistics'), 'max') AS max +FROM rowGroups +ARRAY JOIN tupleElement(rg, 'columns') AS c +""" + +chdb.query(query, 'DataFrame') +``` + +```text + name total_compressed_size total_uncompressed_size min max +0 review_date 493 646 16455 16472 +1 marketplace 66 64 US US +2 customer_id 5207967 7997207 10049 53096413 +3 review_id 14748425 17991290 R10004U8OQDOGE RZZZUTBAV1RYI +4 product_id 8003456 13969668 0000032050 BT00DDVMVQ +5 product_parent 5758251 7974737 645 999999730 +6 product_title 41068525 63355320 ! Small S 1pc Black 1pc Navy (Blue) Replacemen... 🌴 Vacation On The Beach +7 product_category 1726 1815 Apparel Pet Products +8 star_rating 369036 374046 1 5 +9 helpful_votes 538940 1022990 0 3440 +10 total_votes 610902 1080520 0 3619 +11 vine 11426 125999 0 1 +12 verified_purchase 102634 125999 0 1 +13 review_headline 16538189 27634740 🤹🏽‍♂️🎤Great product. Practice makes perfect. D... +14 review_body 145886383 232457911 🚅 +🐧=💥 😀 +``` + +## Parquetファイルのクエリ + +次に、ファイルの内容をクエリします。上記のクエリを調整して、`ParquetMetadata`を削除し、すべてのレビューで最も人気のある`star_rating`を計算してみましょう: + +```python +query = """ +SELECT star_rating, count() AS count, formatReadableQuantity(count) +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/amazon_reviews_2015.snappy.parquet' +) +GROUP BY ALL +ORDER BY star_rating +""" + +chdb.query(query, 'DataFrame') +``` + +```text + star_rating count formatReadableQuantity(count()) +0 1 3253070 3.25 million +1 2 1865322 1.87 million +2 3 3130345 3.13 million +3 4 6578230 6.58 million +4 5 27078664 27.08 million +``` + +興味深いことに、5つ星レビューは他のすべての評価を合わせたものよりも多いことがわかります。Amazonの商品が好まれているように見えますが、もし気に入らない場合は評価を付けないことが多いようです。 diff --git a/docs/ja/chdb/guides/querying-s3-bucket.md b/docs/ja/chdb/guides/querying-s3-bucket.md new file mode 100644 index 00000000000..43bb53b1ab6 --- /dev/null +++ b/docs/ja/chdb/guides/querying-s3-bucket.md @@ -0,0 +1,192 @@ +--- +title: S3バケット内のデータをクエリする方法 +sidebar_label: S3でのクエリ +slug: /ja/chdb/guides/querying-s3 +description: chDBを使用してS3バケット内のデータをクエリする方法を学びます。 +keywords: [chdb, s3] +--- + +世界中の多くのデータはAmazon S3バケットに保存されています。 このガイドでは、chDBを使用してそのデータをクエリする方法を学びます。 + +## セットアップ + +まず、仮想環境を作成しましょう: + +```bash +python -m venv .venv +source .venv/bin/activate +``` + +次に、chDBをインストールします。 バージョン2.0.2以上を確実に使用してください: + +```bash +pip install "chdb>=2.0.2" +``` + +次に、iPythonをインストールします: + +```bash +pip install ipython +``` + +このガイドの残りのコマンドを実行するために`ipython`を使用します。起動するには次のコマンドを実行します: + +```bash +ipython +``` + +また、Pythonスクリプトやお好みのノートブックでもコードを使用できます。 + +## S3バケット内のファイルを一覧表示 + +まずはじめに、[Amazonレビューを含むS3バケット](/docs/ja/getting-started/example-datasets/amazon-reviews)内のすべてのファイルを一覧表示しましょう。 これを行うために、[`s3`テーブル関数](/docs/ja/sql-reference/table-functions/s3)を使用し、ファイルへのパスまたは一連のファイルへのワイルドカードを渡します。 + +:::tip +バケット名のみを渡すと例外が発生します。 +::: + +また、ファイルが解析されず、ファイルごとに一行のみが返され、`_file`バーチャルカラムと`_path`バーチャルカラム経由でファイルとパスにアクセスできるようにするために、[`One`](/docs/ja/interfaces/formats#data-format-one)入力フォーマットを使用します。 + +```python +import chdb + +chdb.query(""" +SELECT + _file, + _path +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', One) +SETTINGS output_format_pretty_row_numbers=0 +""", 'PrettyCompact') +``` + +```text +┌─_file───────────────────────────────┬─_path─────────────────────────────────────────────────────────────────────┐ +│ amazon_reviews_2010.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2010.snappy.parquet │ +│ amazon_reviews_1990s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_1990s.snappy.parquet │ +│ amazon_reviews_2013.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2013.snappy.parquet │ +│ amazon_reviews_2015.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2015.snappy.parquet │ +│ amazon_reviews_2014.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2014.snappy.parquet │ +│ amazon_reviews_2012.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2012.snappy.parquet │ +│ amazon_reviews_2000s.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2000s.snappy.parquet │ +│ amazon_reviews_2011.snappy.parquet │ datasets-documentation/amazon_reviews/amazon_reviews_2011.snappy.parquet │ +└─────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┘ +``` + +このバケットにはParquetファイルのみが含まれています。 + +## S3バケット内のファイルのクエリ + +次に、これらのファイルにクエリを実行する方法を学びましょう。 各ファイルの行数をカウントしたい場合は、次のクエリを実行できます: + +```python +chdb.query(""" +SELECT + _file, + count() AS count, + formatReadableQuantity(count) AS readableCount +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet') +GROUP BY ALL +SETTINGS output_format_pretty_row_numbers=0 +""", 'PrettyCompact') +``` + +```text +┌─_file───────────────────────────────┬────count─┬─readableCount───┐ +│ amazon_reviews_2013.snappy.parquet │ 28034255 │ 28.03 million │ +│ amazon_reviews_1990s.snappy.parquet │ 639532 │ 639.53 thousand │ +│ amazon_reviews_2011.snappy.parquet │ 6112495 │ 6.11 million │ +│ amazon_reviews_2015.snappy.parquet │ 41905631 │ 41.91 million │ +│ amazon_reviews_2012.snappy.parquet │ 11541011 │ 11.54 million │ +│ amazon_reviews_2000s.snappy.parquet │ 14728295 │ 14.73 million │ +│ amazon_reviews_2014.snappy.parquet │ 44127569 │ 44.13 million │ +│ amazon_reviews_2010.snappy.parquet │ 3868472 │ 3.87 million │ +└─────────────────────────────────────┴──────────┴─────────────────┘ +``` + +また、S3バケットのHTTP URIを渡すことでも同じ結果を得ることができます: + +```python +chdb.query(""" +SELECT + _file, + count() AS count, + formatReadableQuantity(count) AS readableCount +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/amazon_reviews/*.parquet') +GROUP BY ALL +SETTINGS output_format_pretty_row_numbers=0 +""", 'PrettyCompact') +``` + +では、`DESCRIBE`句を使用してこれらのParquetファイルのスキーマを見てみましょう: + +```python +chdb.query(""" +DESCRIBE s3('s3://datasets-documentation/amazon_reviews/*.parquet') +SETTINGS describe_compact_output=1 +""", 'PrettyCompact') +``` + +```text + ┌─name──────────────┬─type─────────────┐ + 1. │ review_date │ Nullable(UInt16) │ + 2. │ marketplace │ Nullable(String) │ + 3. │ customer_id │ Nullable(UInt64) │ + 4. │ review_id │ Nullable(String) │ + 5. │ product_id │ Nullable(String) │ + 6. │ product_parent │ Nullable(UInt64) │ + 7. │ product_title │ Nullable(String) │ + 8. │ product_category │ Nullable(String) │ + 9. │ star_rating │ Nullable(UInt8) │ +10. │ helpful_votes │ Nullable(UInt32) │ +11. │ total_votes │ Nullable(UInt32) │ +12. │ vine │ Nullable(Bool) │ +13. │ verified_purchase │ Nullable(Bool) │ +14. │ review_headline │ Nullable(String) │ +15. │ review_body │ Nullable(String) │ + └───────────────────┴──────────────────┘ +``` + +次に、レビューの数に基づいてトップの製品カテゴリーを計算し、平均の星評価も計算してみましょう: + +```python +chdb.query(""" +SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet') +GROUP BY ALL +LIMIT 10 +""", 'PrettyCompact') +``` + +```text + ┌─product_category─┬──reviews─┬──avg─┐ + 1. │ Toys │ 4864056 │ 4.21 │ + 2. │ Apparel │ 5906085 │ 4.11 │ + 3. │ Luggage │ 348644 │ 4.22 │ + 4. │ Kitchen │ 4880297 │ 4.21 │ + 5. │ Books │ 19530930 │ 4.34 │ + 6. │ Outdoors │ 2302327 │ 4.24 │ + 7. │ Video │ 380596 │ 4.19 │ + 8. │ Grocery │ 2402365 │ 4.31 │ + 9. │ Shoes │ 4366757 │ 4.24 │ +10. │ Jewelry │ 1767667 │ 4.14 │ + └──────────────────┴──────────┴──────┘ +``` + +## プライベートなS3バケット内のファイルにクエリする + +プライベートなS3バケット内のファイルにクエリを実行する場合には、アクセスキーとシークレットを渡す必要があります。これらの資格情報を`s3`テーブル関数に渡すことができます: + +```python +chdb.query(""" +SELECT product_category, count() AS reviews, round(avg(star_rating), 2) as avg +FROM s3('s3://datasets-documentation/amazon_reviews/*.parquet', 'access-key', 'secret') +GROUP BY ALL +LIMIT 10 +""", 'PrettyCompact') +``` + +:::note +このクエリはパブリックバケットなので動作しません! +::: + +別の方法として、[名前付きコレクション](/docs/ja/operations/named-collections)を使用することもできますが、このアプローチはまだchDBでサポートされていません。 diff --git a/docs/ja/chdb/index.md b/docs/ja/chdb/index.md new file mode 100644 index 00000000000..3393b34c594 --- /dev/null +++ b/docs/ja/chdb/index.md @@ -0,0 +1,61 @@ +--- +title: chDB +sidebar_label: Overview +slug: /ja/chdb +description: chDBはClickHouseによって駆動されるインプロセスSQL OLAPエンジンです +keywords: [chdb, embedded, clickhouse-lite, in-process, in process] +--- + +# chDB + +chDBは、[ClickHouse](https://github.com/clickhouse/clickhouse)によって駆動される高速なインプロセスSQL OLAPエンジンです。ClickHouseサーバーに接続することなく、プログラミング言語でClickHouseの力を得たい場合に使用できます。 + +## chDBはどの言語をサポートしていますか? + +chDBは以下の言語バインディングを提供しています: + +* [Python](install/python.md) +* [Go](install/go.md) +* [Rust](install/rust.md) +* [NodeJS](install/nodejs.md) +* [Bun](install/bun.md) + +## どの入力および出力フォーマットがサポートされていますか? + +chDBはParquet、CSV、JSON、Apache Arrow、ORC、[60以上のフォーマット](https://clickhouse.com/docs/ja/interfaces/formats)をサポートしています。 + +## どのように開始しますか? + +* [Go](install/go.md)、[Rust](install/rust.md)、[NodeJS](install/nodejs.md)、または[Bun](install/bun.md)を使用している場合は、対応する言語ページをご覧ください。 +* Pythonを使用している場合は、[開発者向けの開始ガイド](getting-started.md)を参照してください。以下のような一般的なタスクを行うためのガイドも用意されています: + * [JupySQL](guides/jupysql.md) + * [Pandasのクエリ](guides/querying-pandas.md) + * [Apache Arrowへのクエリ](guides/querying-apache-arrow.md) + * [S3内のデータへのクエリ](guides/querying-s3-bucket.md) + * [Parquetファイルへのクエリ](guides/querying-parquet.md) + * [リモートClickHouseへのクエリ](guides/query-remote-clickhouse.md) + * [clickhouse-localデータベースの使用](guides/clickhouse-local.md) + + + +## 紹介ビデオ + +ClickHouseのオリジナル作成者、Alexey MilovidovによるchDBの簡潔なプロジェクト紹介をお聞きください: + +
+ +
+ +## chDBについて + +- [Auxtenのブログ](https://clickhouse.com/blog/chdb-embedded-clickhouse-rocket-engine-on-a-bicycle)でchDBプロジェクト誕生の全過程を読む +- [公式ClickHouseブログ](https://clickhouse.com/blog/welcome-chdb-to-clickhouse)でchDBとその使用事例について読む +- [codapiの例](https://antonz.org/trying-chdb/)を使用してブラウザでchDBを発見する + +## どのライセンスが使用されていますか? + +chDBはApache License, Version 2.0のもとで利用可能です。 diff --git a/docs/ja/chdb/install/bun.md b/docs/ja/chdb/install/bun.md new file mode 100644 index 00000000000..1598e8e08ee --- /dev/null +++ b/docs/ja/chdb/install/bun.md @@ -0,0 +1,55 @@ +--- +title: Installing chDB for Bun +sidebar_label: Bun +slug: /ja/chdb/install/bun +description: How to install chDB for Bun +keywords: [chdb, embedded, clickhouse-lite, bun, install] +--- + +# Bun用のchDBをインストールする + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb) をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## インストール + +参考: [chdb-bun](https://github.com/chdb-io/chdb-bun) + +## GitHubリポジトリ + +プロジェクトのGitHubリポジトリは [chdb-io/chdb-bun](https://github.com/chdb-io/chdb-bun) にあります。 + +## 使用方法 + +### Query(query, *format) (一時的) + +```javascript +import { query } from 'chdb-bun'; + +// クエリ(一時的) +var result = query("SELECT version()", "CSV"); +console.log(result); // 23.10.1.1 +``` + +### Session.Query(query, *format) + +```javascript +import { Session } from 'chdb-bun'; +const sess = new Session('./chdb-bun-tmp'); + +// セッションでクエリ(永続化) +sess.query("CREATE FUNCTION IF NOT EXISTS hello AS () -> 'Hello chDB'", "CSV"); +var result = sess.query("SELECT hello()", "CSV"); +console.log(result); + +// クリーンアップ前に、データベースファイルを`./chdb-bun-tmp`に見つけることができます + +sess.cleanup(); // セッションをクリーンアップ、これによりデータベースが削除されます +``` + + diff --git a/docs/ja/chdb/install/c.md b/docs/ja/chdb/install/c.md new file mode 100644 index 00000000000..5ef158ac164 --- /dev/null +++ b/docs/ja/chdb/install/c.md @@ -0,0 +1,45 @@ +--- +title: CとC++向けのchDBのインストール +sidebar_label: CとC++ +slug: /ja/chdb/install/c +description: CとC++向けのchDBをインストールする方法 +keywords: [chdb, 組み込み, clickhouse-lite, インストール] +--- + +# CとC++向けのchDBのインストール + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb)をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + + +## 使用方法 + +[libchdb](https://github.com/chdb-io/chdb/blob/main/bindings.md)の手順に従って開始してください。 + +`chdb.h` + +```c +#pragma once +#include +#include + +extern "C" { +struct local_result +{ + char * buf; + size_t len; + void * _vec; // std::vector *の解放用 + double elapsed; + uint64_t rows_read; + uint64_t bytes_read; +}; + +local_result * query_stable(int argc, char ** argv); +void free_result(local_result * result); +} +``` diff --git a/docs/ja/chdb/install/go.md b/docs/ja/chdb/install/go.md new file mode 100644 index 00000000000..e02248aa7f3 --- /dev/null +++ b/docs/ja/chdb/install/go.md @@ -0,0 +1,30 @@ +--- +title: Go 用 chDB のインストール +sidebar_label: Go +slug: /ja/chdb/install/go +description: Go 用 chDB のインストール方法 +keywords: [chdb, embedded, clickhouse-lite, go, install] +--- + +# Go 用 chDB のインストール + +## 必要条件 + +[libchdb](https://github.com/chdb-io/chdb) をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## インストール + +参照: [chdb-go](https://github.com/chdb-io/chdb-go) + +## GitHub リポジトリ + +プロジェクトの GitHub リポジトリは [chdb-io/chdb-go](https://github.com/chdb-io/chdb-go) で見つけることができます。 + +## 使用法 + +- API ドキュメント: [高レベル API](https://github.com/chdb-io/chdb-go/blob/main/chdb.md) +- 低レベル API ドキュメント: [低レベル API](https://github.com/chdb-io/chdb-go/blob/main/lowApi.md) diff --git a/docs/ja/chdb/install/nodejs.md b/docs/ja/chdb/install/nodejs.md new file mode 100644 index 00000000000..7331596eb9e --- /dev/null +++ b/docs/ja/chdb/install/nodejs.md @@ -0,0 +1,65 @@ +--- +title: NodeJS 用 chDB のインストール +sidebar_label: NodeJS +slug: /ja/chdb/install/nodejs +description: NodeJS 用 chDB のインストール方法 +keywords: [chdb, embedded, clickhouse-lite, nodejs, install] +--- + +# NodeJS 用 chDB のインストール + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb) をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## インストール + +```bash +npm i chdb +``` + +## GitHub リポジトリ + +プロジェクトの GitHub リポジトリは [chdb-io/chdb-node](https://github.com/chdb-io/chdb-node) で確認できます。 + +## 使用法 + +NodeJS アプリケーションで chdb-node モジュールをインポートし、その強力な機能を活用できます: + +```javascript +const { query, Session } = require("chdb"); + +var ret; + +// スタンドアローンのクエリをテスト +ret = query("SELECT version(), 'Hello chDB', chdb()", "CSV"); +console.log("Standalone Query Result:", ret); + +// セッションのクエリをテスト +// 新しいセッションインスタンスを作成 +const session = new Session("./chdb-node-tmp"); +ret = session.query("SELECT 123", "CSV") +console.log("Session Query Result:", ret); +ret = session.query("CREATE DATABASE IF NOT EXISTS testdb;" + + "CREATE TABLE IF NOT EXISTS testdb.testtable (id UInt32) ENGINE = MergeTree() ORDER BY id;"); + +session.query("USE testdb; INSERT INTO testtable VALUES (1), (2), (3);") + +ret = session.query("SELECT * FROM testtable;") +console.log("Session Query Result:", ret); + +// セッションのクリーンアップ +session.cleanup(); +``` + +## ソースからビルド + +```bash +npm run libchdb +npm install +npm run test +``` diff --git a/docs/ja/chdb/install/python.md b/docs/ja/chdb/install/python.md new file mode 100644 index 00000000000..3f9a7b77922 --- /dev/null +++ b/docs/ja/chdb/install/python.md @@ -0,0 +1,257 @@ +--- +title: Python向けのchDBのインストール +sidebar_label: Python +slug: /ja/chdb/install/python +description: Python向けのchDBのインストール方法 +keywords: [chdb, embedded, clickhouse-lite, python, install] +--- + +# Python向けのchDBのインストール + +## 必要条件 + +macOSとLinux(x86_64およびARM64)上のPython 3.8+ + +## インストール + +```bash +pip install chdb +``` + +## 使用法 + +CLI例: + +```python +python3 -m chdb [SQL] [OutputFormat] +``` + +```python +python3 -m chdb "SELECT 1, 'abc'" Pretty +``` + +Pythonファイル例: + +```python +import chdb + +res = chdb.query("SELECT 1, 'abc'", "CSV") +print(res, end="") +``` + +クエリは、`Dataframe`や`Debug`を含む[サポート形式](/docs/ja/interfaces/formats)のいずれかを使用してデータを返すことができます。 + +## GitHubリポジトリ + +プロジェクトのGitHubリポジトリは[chdb-io/chdb](https://github.com/chdb-io/chdb)にあります。 + +## データ入力 + +以下のメソッドを使用して、オンディスクおよびインメモリのデータフォーマットにアクセス可能です。 + +### ファイル上でのクエリ (Parquet, CSV, JSON, Arrow, ORC など60+) + +SQLを実行し、希望の形式でデータを返せます。 + +```python +import chdb +res = chdb.query('select version()', 'Pretty'); print(res) +``` + +**ParquetまたはCSVでの操作** + +```python +# データ型の詳細は tests/format_output.py を参照 +res = chdb.query('select * from file("data.parquet", Parquet)', 'JSON'); print(res) +res = chdb.query('select * from file("data.csv", CSV)', 'CSV'); print(res) +print(f"SQL read {res.rows_read()} rows, {res.bytes_read()} bytes, elapsed {res.elapsed()} seconds") +``` + +**Pandas dataframe出力** +```python +# 詳細はhttps://clickhouse.com/docs/ja/interfaces/formatsを参照 +chdb.query('select * from file("data.parquet", Parquet)', 'Dataframe') +``` + +### テーブル上でのクエリ (Pandas DataFrame, Parquet file/bytes, Arrow bytes) + +**Pandas DataFrame上でのクエリ** + +```python +import chdb.dataframe as cdf +import pandas as pd +# 2つのDataFrameを結合 +df1 = pd.DataFrame({'a': [1, 2, 3], 'b': ["one", "two", "three"]}) +df2 = pd.DataFrame({'c': [1, 2, 3], 'd': ["①", "②", "③"]}) +ret_tbl = cdf.query(sql="select * from __tbl1__ t1 join __tbl2__ t2 on t1.a = t2.c", + tbl1=df1, tbl2=df2) +print(ret_tbl) +# DataFrameテーブルでのクエリ +print(ret_tbl.query('select b, sum(a) from __table__ group by b')) +``` + +### 状態を持つセッションでのクエリ + +セッションはクエリの状態を保持します。すべてのDDLおよびDMLの状態はディレクトリに保持されます。ディレクトリパスは引数として渡すことができます。指定されない場合、一時ディレクトリが作成されます。 + +パスが指定されない場合、セッションオブジェクトが削除されるときに一時ディレクトリが削除されます。そうでない場合、パスは保持されます。 + +デフォルトのデータベースは`_local`で、デフォルトのエンジンは`Memory`であるため、すべてのデータはメモリに保存されます。ディスクにデータを保存したい場合は、別のデータベースを作成する必要があります。 + +```python +from chdb import session as chs + +## 一時セッションでDB、テーブル、ビューを作成し、セッションが削除されると自動的にクリーンアップします。 +sess = chs.Session() +sess.query("CREATE DATABASE IF NOT EXISTS db_xxx ENGINE = Atomic") +sess.query("CREATE TABLE IF NOT EXISTS db_xxx.log_table_xxx (x String, y Int) ENGINE = Log;") +sess.query("INSERT INTO db_xxx.log_table_xxx VALUES ('a', 1), ('b', 3), ('c', 2), ('d', 5);") +sess.query( + "CREATE VIEW db_xxx.view_xxx AS SELECT * FROM db_xxx.log_table_xxx LIMIT 4;" +) +print("ビューから選択:\n") +print(sess.query("SELECT * FROM db_xxx.view_xxx", "Pretty")) +``` + +関連情報: [test_stateful.py](https://github.com/chdb-io/chdb/blob/main/tests/test_stateful.py). + +### Python DB-API 2.0でのクエリ + +```python +import chdb.dbapi as dbapi +print("chdbドライバーバージョン: {0}".format(dbapi.get_client_info())) + +conn1 = dbapi.connect() +cur1 = conn1.cursor() +cur1.execute('select version()') +print("説明: ", cur1.description) +print("データ: ", cur1.fetchone()) +cur1.close() +conn1.close() +``` + +### UDF(ユーザー定義関数)でのクエリ + +```python +from chdb.udf import chdb_udf +from chdb import query + +@chdb_udf() +def sum_udf(lhs, rhs): + return int(lhs) + int(rhs) + +print(query("select sum_udf(12,22)")) +``` + +chDBのPython UDF(ユーザー定義関数)デコレーターに関する注意点。 +1. 関数はステートレスであるべきです。UDF(ユーザー定義関数)のみがサポートされており、UDAF(ユーザー定義集約関数)はサポートされていません。 +2. デフォルトの戻り値の型はStringです。戻り値の型を変更したい場合は、引数として渡すことができます。戻り値の型は[次のいずれか](/ja/sql-reference/data-types)である必要があります。 +3. 関数はString型の引数を受け取るべきです。入力がタブ区切りであるため、すべての引数は文字列です。 +4. 関数は入力の各行ごとに呼び出されるでしょう。例: + ```python + def sum_udf(lhs, rhs): + return int(lhs) + int(rhs) + + for line in sys.stdin: + args = line.strip().split('\t') + lhs = args[0] + rhs = args[1] + print(sum_udf(lhs, rhs)) + sys.stdout.flush() + ``` +5. 関数は純粋なPython関数であるべきです。関数内で使用するすべてのPythonモジュールをインポートする必要があります。 + ```python + def func_use_json(arg): + import json + ... + ``` +6. 使用されるPythonインタープリタは、スクリプトを実行しているものと同じです。`sys.executable`から取得できます。 + +関連情報: [test_udf.py](https://github.com/chdb-io/chdb/blob/main/tests/test_udf.py). + +### Pythonテーブルエンジン + +### Pandas DataFrameでのクエリ + +```python +import chdb +import pandas as pd +df = pd.DataFrame( + { + "a": [1, 2, 3, 4, 5, 6], + "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"], + } +) + +chdb.query("SELECT b, sum(a) FROM Python(df) GROUP BY b ORDER BY b").show() +``` + +### Arrowテーブルでのクエリ + +```python +import chdb +import pyarrow as pa +arrow_table = pa.table( + { + "a": [1, 2, 3, 4, 5, 6], + "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"], + } +) + +chdb.query( + "SELECT b, sum(a) FROM Python(arrow_table) GROUP BY b ORDER BY b", "debug" +).show() +``` + +### chdb.PyReaderクラスのインスタンスでのクエリ + +1. chdb.PyReaderクラスを継承し、`read`メソッドを実装する必要があります。 +2. `read`メソッドは以下を行う必要があります: + 1. リストのリストを返すこと。第一次元はカラム、第二次元は行です。カラムの順序は、`read`の最初の引数`col_names`と同じであるべきです。 + 1. 読み疲れた時に空のリストを返すこと。 + 1. 状態を持ち、カーソルは`read`メソッド内で更新されるべきです。 +3. オプションで`get_schema`メソッドを実装してテーブルのスキーマを返すことができます。プロトタイプは`def get_schema(self) -> List[Tuple[str, str]]:`です。返り値はタプルのリストで、各タプルはカラム名とカラムの型を含みます。カラム型は[次のいずれか](/ja/sql-reference/data-types)である必要があります。 + +
+ +```python +import chdb + +class myReader(chdb.PyReader): + def __init__(self, data): + self.data = data + self.cursor = 0 + super().__init__(data) + + def read(self, col_names, count): + print("Python func read", col_names, count, self.cursor) + if self.cursor >= len(self.data["a"]): + return [] + block = [self.data[col] for col in col_names] + self.cursor += len(block[0]) + return block + +reader = myReader( + { + "a": [1, 2, 3, 4, 5, 6], + "b": ["tom", "jerry", "auxten", "tom", "jerry", "auxten"], + } +) + +chdb.query( + "SELECT b, sum(a) FROM Python(reader) GROUP BY b ORDER BY b" +).show() +``` + +関連情報: [test_query_py.py](https://github.com/chdb-io/chdb/blob/main/tests/test_query_py.py). + +## 制限事項 + +1. サポートされているカラム型: pandas.Series, pyarrow.array, chdb.PyReader +1. サポートされているデータ型: Int, UInt, Float, String, Date, DateTime, Decimal +1. Pythonオブジェクト型はStringに変換される +1. Pandas DataFrameのパフォーマンスは最高で、Arrow TableはPyReaderよりも優れています。 + +
+ +より多くの例については、[examples](https://github.com/chdb-io/chdb/tree/main/examples)および[tests](https://github.com/chdb-io/chdb/tree/main/tests)を参照してください。 diff --git a/docs/ja/chdb/install/rust.md b/docs/ja/chdb/install/rust.md new file mode 100644 index 00000000000..9d482064027 --- /dev/null +++ b/docs/ja/chdb/install/rust.md @@ -0,0 +1,23 @@ +--- +title: Rust用chDBのインストール +sidebar_label: Rust +slug: /ja/chdb/install/rust +description: Rust用chDBのインストール方法 +keywords: [chdb, 組み込み, clickhouse-lite, bun, インストール] +--- + +## 要件 + +[libchdb](https://github.com/chdb-io/chdb)をインストールします: + +```bash +curl -sL https://lib.chdb.io | bash +``` + +## 使用法 + +このバインディングは現在開発中です。[chdb-rust](https://github.com/chdb-io/chdb-rust)の指示に従って始めてください。 + +## GitHubリポジトリ + +プロジェクトのGitHubリポジトリは[chdb-io/chdb-rust](https://github.com/chdb-io/chdb-rust)で確認できます。 diff --git a/docs/ja/chdb/sql-reference.md b/docs/ja/chdb/sql-reference.md new file mode 100644 index 00000000000..eb6aa03397e --- /dev/null +++ b/docs/ja/chdb/sql-reference.md @@ -0,0 +1,20 @@ +--- +title: SQLリファレンス +sidebar_label: SQLリファレンス +slug: /ja/chdb/sql-reference +description: chDBのSQLリファレンス +keywords: [chdb, sql リファレンス] +--- + +chDBは、ClickHouseと同じSQL構文、ステートメント、エンジン、および関数をサポートしています: + +- [SQL構文](/docs/ja/sql-reference/syntax) +- [ステートメント](/docs/ja/sql-reference/statements) +- [テーブルエンジン](/docs/ja/engines/table-engines) +- [データベースエンジン](/docs/ja/engines/database-engines) +- [通常の関数](/docs/ja/sql-reference/functions) +- [集計関数](/docs/ja/sql-reference/aggregate-functions) +- [テーブル関数](/docs/ja/sql-reference/table-functions) +- [ウィンドウ関数](/docs/ja/sql-reference/window-functions) + +詳細情報や例については、[ClickHouse SQLリファレンス](/docs/ja/sql-reference)をご覧ください。 diff --git a/docs/ja/cloud-index.md b/docs/ja/cloud-index.md new file mode 100644 index 00000000000..db456a2dcaf --- /dev/null +++ b/docs/ja/cloud-index.md @@ -0,0 +1,9 @@ +--- +slug: /ja/cloud/overview +keywords: [AWS, Cloud, serverless] +title: 概要 +hide_title: true +--- +import Content from '@site/docs/ja/about-us/cloud.md'; + + diff --git a/docs/ja/cloud/_category_.yml b/docs/ja/cloud/_category_.yml new file mode 100644 index 00000000000..4fcbe452846 --- /dev/null +++ b/docs/ja/cloud/_category_.yml @@ -0,0 +1,7 @@ +position: 1 +label: 'Benefits' +collapsible: true +collapsed: true +link: + type: doc + id: en/cloud/index diff --git a/docs/ja/cloud/bestpractices/_category_.yml b/docs/ja/cloud/bestpractices/_category_.yml new file mode 100644 index 00000000000..0477dadedc4 --- /dev/null +++ b/docs/ja/cloud/bestpractices/_category_.yml @@ -0,0 +1,7 @@ +label: 'Best Practices' +collapsible: true +collapsed: true +link: + type: generated-index + title: Best Practices + slug: /ja/cloud/bestpractices/ diff --git a/docs/ja/cloud/bestpractices/asyncinserts.md b/docs/ja/cloud/bestpractices/asyncinserts.md new file mode 100644 index 00000000000..a47745cbe24 --- /dev/null +++ b/docs/ja/cloud/bestpractices/asyncinserts.md @@ -0,0 +1,58 @@ +--- +slug: /ja/cloud/bestpractices/asynchronous-inserts +sidebar_label: 非同期インサート +title: 非同期インサート (async_insert) +--- + +ClickHouseにデータを大規模なバッチで挿入することはベストプラクティスです。これによりコンピュータの演算サイクルとディスクI/Oが節約され、結果的にコストも削減されます。ClickHouse外部でバッチ処理を行うことが可能であれば、それも一つの選択肢ですが、ClickHouseにバッチを作成させたい場合は、ここで説明する非同期INSERTモードを使用できます。 + +非同期インサートは、クライアント側でデータをバッチ処理し、挿入率を毎秒一つのインサートクエリ程度に維持する代替手段として、[async_insert](/docs/ja/operations/settings/settings.md/#async_insert)設定を有効にして使用します。これにより、ClickHouseがサーバー側でバッチ処理を行います。 + +デフォルトでは、ClickHouseはデータを同期的に書き込んでいます。ClickHouseに送信された各インサートは、即座にそのデータを含むパートを作成します。これは、async_insert設定がデフォルト値の0に設定されているときのデフォルトの動作です: + +![compression block diagram](images/async-01.png) + +async_insertを1に設定すると、ClickHouseはまず受信したインサートをメモリ内バッファに保存し、それを定期的にディスクにフラッシュします。 + +ClickHouseがバッファをディスクにフラッシュする原因となる可能性がある条件は次の二つです: +- バッファサイズがNバイトに達した(Nは[async_insert_max_data_size](/docs/ja/operations/settings/settings.md/#async-insert-max-data-size)で設定可能) +- 最後のバッファフラッシュからNミリ秒以上が経過した(Nは[async_insert_busy_timeout_ms](/docs/ja/operations/settings/settings.md/#async-insert-busy-timeout-ms)で設定可能) + +上記の条件が満たされるたびに、ClickHouseはメモリ内バッファをディスクにフラッシュします。 + +:::note +データが記憶装置のパートに書き込まれると、読み取りクエリのためにデータが利用可能になります。このことは、`async_insert_busy_timeout_ms`(デフォルトでは1秒に設定)や`async_insert_max_data_size`(デフォルトでは10 MiBに設定)設定を変更する際に考慮してください。 +::: + +[wait_for_async_insert](/docs/ja/operations/settings/settings.md/#wait-for-async-insert)設定を使うことで、インサートステートメントがバッファにデータを挿入後すぐに応答を返すか(wait_for_async_insert = 0)、あるいは、デフォルトで、バッファからフラッシュしてパートにデータが書き込まれた後で応答を返すか(wait_for_async_insert = 1)を設定できます。 + +以下の二つの図は、async_insertとwait_for_async_insertの二つの設定を示しています: + +![compression block diagram](images/async-02.png) + +![compression block diagram](images/async-03.png) + + +### 非同期インサートの有効化 + +非同期インサートは特定のユーザー、または特定のクエリに対して有効化できます: + +- ユーザーレベルでの非同期インサートの有効化。この例ではユーザー`default`を使用していますが、別のユーザーを作成した場合はそのユーザー名に置き換えてください: + ```sql + ALTER USER default SETTINGS async_insert = 1 + ``` +- インサートクエリのSETTINGS句を使用して非同期インサートの設定を指定できます: + ```sql + INSERT INTO YourTable SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...) + ``` +- また、ClickHouseプログラミング言語クライアントを使用する際に接続パラメータとして非同期インサートの設定を指定することも可能です。 + + 例として、ClickHouse Cloudに接続するためにClickHouse Java JDBCドライバーを使用する場合、JDBC接続文字列内で次のように指定できます: + ```bash + "jdbc:ch://HOST.clickhouse.cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1" + ``` +非同期インサートを使用する場合、async_insert=1,wait_for_async_insert=1を使用することを強く推奨します。wait_for_async_insert=0を使用することは非常にリスクが高く、INSERTクライアントがエラーを認識できない可能性があり、また、ClickHouseサーバーが書き込み速度を減速させてバックプレッシャーを作成する必要がある状況で、クライアントが高速で書き込みを続けると潜在的なオーバーロードが発生する可能性があるためです。 + +:::note 非同期インサートを使用する場合、自動重複排除はデフォルトで無効になっています。 +手動のバッチ処理([上記セクション](#ingest-data-in-bulk)参照)は、(正確に)同じインサートステートメントが一時的なネットワーク接続問題によるクライアントソフトウェアでの自動再試行のためClickHouse Cloudに複数回送信される場合に、テーブルデータの[built-in automatic deduplication](/docs/ja/engines/table-engines/mergetree-family/replication.md)をサポートする利点があります。 +::: diff --git a/docs/ja/cloud/bestpractices/avoidmutations.md b/docs/ja/cloud/bestpractices/avoidmutations.md new file mode 100644 index 00000000000..6790f1fd091 --- /dev/null +++ b/docs/ja/cloud/bestpractices/avoidmutations.md @@ -0,0 +1,13 @@ +--- +slug: /ja/cloud/bestpractices/avoid-mutations +sidebar_label: ミューテーションを避ける +title: ミューテーションを避ける +--- + +ミューテーションとは、テーブルデータを削除または更新する [ALTER](/docs/ja/sql-reference/statements/alter/) クエリのことを指します。主に ALTER TABLE … DELETE, UPDATE などのクエリがこれに該当します。このようなクエリを実行すると、データパーツの新しい変異バージョンが生成されます。つまり、このようなステートメントはミューテーションの前に挿入されたすべてのデータに対してデータパーツの全体を書き直すことを引き起こし、大量の書き込み要求に繋がります。 + +更新に関しては、デフォルトの MergeTree のテーブルエンジンの代わりに、[ReplacingMergeTree](/docs/ja/engines/table-engines/mergetree-family/replacingmergetree.md) または [CollapsingMergeTree](/docs/ja/engines/table-engines/mergetree-family/collapsingmergetree.md) などの専用のテーブルエンジンを使用することで、この大量の書き込み要求を回避できます。 + +## 関連コンテンツ + +- ブログ: [ClickHouseでの更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/cloud/bestpractices/avoidnullablecolumns.md b/docs/ja/cloud/bestpractices/avoidnullablecolumns.md new file mode 100644 index 00000000000..8a782f756cd --- /dev/null +++ b/docs/ja/cloud/bestpractices/avoidnullablecolumns.md @@ -0,0 +1,36 @@ +--- +slug: /ja/cloud/bestpractices/avoid-nullable-columns +sidebar_label: Nullableカラムを避ける +title: Nullableカラムを避ける +--- + +[`Nullable`カラム](/docs/ja/sql-reference/data-types/nullable/)(例: `Nullable(String)`)は`UInt8`型の別カラムを作成します。この追加のカラムは、ユーザーがNullableカラムを操作するたびに処理される必要があります。これにより、追加のストレージスペースが必要になり、ほとんどの場合、パフォーマンスに悪影響を及ぼします。 + +`Nullable`カラムを避けるには、そのカラムにデフォルト値を設定することを検討してください。例えば、以下のようにする代わりに: + +```sql +CREATE TABLE default.sample +( + `x` Int8, + # highlight-next-line + `y` Nullable(Int8) +) +ENGINE = MergeTree +ORDER BY x +``` +次のように使用します + +```sql +CREATE TABLE default.sample2 +( + `x` Int8, + # highlight-next-line + `y` Int8 DEFAULT 0 +) +ENGINE = MergeTree +ORDER BY x +``` + +:::note +ユースケースを考慮し、デフォルト値が不適切である可能性もあります。 +::: diff --git a/docs/ja/cloud/bestpractices/avoidoptimizefinal.md b/docs/ja/cloud/bestpractices/avoidoptimizefinal.md new file mode 100644 index 00000000000..9fdc7a5a6f1 --- /dev/null +++ b/docs/ja/cloud/bestpractices/avoidoptimizefinal.md @@ -0,0 +1,9 @@ +--- +slug: /ja/cloud/bestpractices/avoid-optimize-final +sidebar_label: Optimize Finalを避ける +title: Optimize Finalを避ける +--- + +[`OPTIMIZE TABLE ... FINAL`](/docs/ja/sql-reference/statements/optimize/) クエリを使用すると、特定のテーブルのデータパーツを1つにマージする予定外のマージが開始されます。このプロセス中、ClickHouseはすべてのデータパーツを読み込み、それらを解凍し、マージし、1つのパートに圧縮し直し、オブジェクトストアに書き戻します。これにより、多大なCPUおよびIOリソースが消費されます。 + +この最適化では、すでに1つのパーツにマージされている場合でも、その1つのパーツを書き換えることに注意が必要です。また、「1つのパーツ」の範囲についても重要です - これは、設定値 [`max_bytes_to_merge_at_max_space_in_pool`](https://clickhouse.com/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool) が無視されることを示します。例えば、[`max_bytes_to_merge_at_max_space_in_pool`](https://clickhouse.com/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool) はデフォルトで150 GBに設定されています。OPTIMIZE TABLE ... FINALを実行すると、残りの1つのパーツがこのサイズを超える可能性があります。150 GBの多数のパーツを1つにマージすることは、大量の時間やメモリを要する可能性があるため、このコマンドを一般的に使用しないもう一つの重要な考慮点です。 diff --git a/docs/ja/cloud/bestpractices/bulkinserts.md b/docs/ja/cloud/bestpractices/bulkinserts.md new file mode 100644 index 00000000000..f81d7127ca0 --- /dev/null +++ b/docs/ja/cloud/bestpractices/bulkinserts.md @@ -0,0 +1,13 @@ +--- +slug: /ja/cloud/bestpractices/bulk-inserts +sidebar_position: 63 +sidebar_label: バルクインサートを使用する +title: バルクインサート +--- + +## データを一括で取り込む +デフォルトでは、ClickHouseに送信された各インサートは、インサートされたデータと一緒に保存する必要がある他のメタデータを含むストレージ上のパートを即座に作成します。そのため、少ない数のインサートで各インサートに多くのデータを含める方が、多くの数のインサートで各インサートに少ないデータを含めるよりも、必要な書き込みの数が減ります。一般的に、1回のインサートで少なくとも1,000行、理想的には10,000から100,000行の大きなバッチでデータをインサートすることをお勧めします。そのためには、[Bufferテーブルエンジン](/docs/ja/engines/table-engines/special/buffer.md)を使用してバッチインサートを可能にするバッファメカニズムを実装するか、非同期インサートを利用することを検討してください([非同期インサート](/docs/ja/cloud/bestpractices/asyncinserts.md)を参照)。 + +:::tip +インサートのサイズに関係なく、インサートクエリの数を1秒に1回程度に保つことをお勧めします。この推奨の理由は、作成されたパートがバックグラウンドで大容量のパートにマージされ、読み取りクエリの最適化を行うためです。1秒間に多くのインサートクエリを送信すると、バックグラウンドのマージが多数の新しいパートに追いつけなくなる状況を引き起こす可能性があります。ただし、非同期インサートを使用する場合は、1秒間により多くのインサートクエリを使用することが可能です([非同期インサート](/docs/ja/cloud/bestpractices/asyncinserts.md)を参照)。 +::: diff --git a/docs/ja/cloud/bestpractices/images/async-01.png b/docs/ja/cloud/bestpractices/images/async-01.png new file mode 100644 index 00000000000..5ac0f7cd712 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/async-01.png differ diff --git a/docs/ja/cloud/bestpractices/images/async-02.png b/docs/ja/cloud/bestpractices/images/async-02.png new file mode 100644 index 00000000000..30446e4f73d Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/async-02.png differ diff --git a/docs/ja/cloud/bestpractices/images/async-03.png b/docs/ja/cloud/bestpractices/images/async-03.png new file mode 100644 index 00000000000..ecd82e950a7 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/async-03.png differ diff --git a/docs/ja/cloud/bestpractices/images/async.excalidraw b/docs/ja/cloud/bestpractices/images/async.excalidraw new file mode 100644 index 00000000000..a310e8e73ec --- /dev/null +++ b/docs/ja/cloud/bestpractices/images/async.excalidraw @@ -0,0 +1,8682 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 9191, + "versionNonce": 647165293, + "isDeleted": false, + "id": "z7b22yE8RBNw-dJti7WVw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 11713.625100217656, + "y": -362.5020983032264, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1493.1072881078205, + "seed": 77762255, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "veotS3i5mtgTncfBapy56", + "type": "arrow" + }, + { + "id": "kt7o2EcGvutAPunnwRp85", + "type": "arrow" + }, + { + "id": "0wAEvWjfkReYdnXnKEP-h", + "type": "arrow" + }, + { + "id": "HQHHlxtTUMpxfg5tg2cgp", + "type": "arrow" + }, + { + "id": "QcBHPr75biqSQUSeenF-n", + "type": "arrow" + }, + { + "id": "SW4ZoMUP2yAJ0tQGqBBMv", + "type": "arrow" + } + ], + "updated": 1664526042739, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9406, + "versionNonce": 2018714595, + "isDeleted": false, + "id": "0kqbthpF2BiBxnmmuryaa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 70, + "angle": 0, + "x": 11789.731349070416, + "y": -220.98991573643434, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 1138.870180087369, + "seed": 1270704335, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "zWRCMAu8b-b3yhe5MqdXu", + "type": "arrow" + }, + { + "id": "_GH5FCHHFjL8ucTQMTU2M", + "type": "arrow" + }, + { + "id": "Lvf51imWTee_5K2D3NesT", + "type": "arrow" + }, + { + "id": "MHgyHI7AE34K9ew6I8yKE", + "type": "arrow" + } + ], + "updated": 1664526042739, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8358, + "versionNonce": 1480017389, + "isDeleted": false, + "id": "bC-MZJnsb_BfYPNP8wLol", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 12653.566657908705, + "y": -3253.871411737997, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1340.6118210378552, + "seed": 810810465, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "type": "arrow" + }, + { + "id": "YPI_35Zw_AwduFo1kpFcA", + "type": "arrow" + }, + { + "id": "f9HEnxVOpTBviKw8tXThY", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 640, + "versionNonce": 1580866403, + "isDeleted": false, + "id": "d4vLH9jcWs8UgK72bcfg3", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12686.881791728685, + "y": -3218.149529222761, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 742471215, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "rectangle", + "version": 7072, + "versionNonce": 1318191181, + "isDeleted": false, + "id": "8_SkgbVKhlR-i00bKx4GO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12770.276081935259, + "y": -2966.5796372067907, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 473417793, + "groupIds": [ + "_o2D4Ff754LPiJ3lANnSl" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 625, + "versionNonce": 466007811, + "isDeleted": false, + "id": "dF8SSKrHtIz-FHa6Xtnzg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12846.17314606392, + "y": -2926.513937048745, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 189.04938640566917, + "height": 102.30907970189156, + "seed": 976787535, + "groupIds": [ + "_o2D4Ff754LPiJ3lANnSl" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "Part", + "baseline": 71.30907970189156, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 7201, + "versionNonce": 1919315629, + "isDeleted": false, + "id": "TRbPz9TYXzrkV2ImWH0Q6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12778.69576288221, + "y": -2629.001616539861, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 360126497, + "groupIds": [ + "UK_p7ZURolHsxzKbESJfP" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "YPI_35Zw_AwduFo1kpFcA", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 779, + "versionNonce": 545185443, + "isDeleted": false, + "id": "ZnThar1RbW3QRqk_PHGdz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12851.583200290752, + "y": -2582.7230820505692, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 189.04938640566917, + "height": 102.30907970189156, + "seed": 1933489775, + "groupIds": [ + "UK_p7ZURolHsxzKbESJfP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "Part", + "baseline": 71.30907970189156, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 7280, + "versionNonce": 1381896461, + "isDeleted": false, + "id": "e7TqDGRkXzcjPEEyP5vcS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12787.749619364122, + "y": -2305.301487900526, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 1845586945, + "groupIds": [ + "eYxxul4F4EQgO40CK_jWL" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "f9HEnxVOpTBviKw8tXThY", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 864, + "versionNonce": 386994755, + "isDeleted": false, + "id": "ZUb7SBz2Tb-ELWFc663jz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12861.177245411945, + "y": -2256.9089129349886, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 189.04938640566917, + "height": 102.30907970189156, + "seed": 2115768463, + "groupIds": [ + "eYxxul4F4EQgO40CK_jWL" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "Part", + "baseline": 71.30907970189156, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 8588, + "versionNonce": 1811048301, + "isDeleted": false, + "id": "r4asxMHx9AF_CwQuXL5fr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 11717.33779159477, + "y": -3251.8698951545557, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1335.3865333455474, + "seed": 232145889, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "gBlSD1bJsqWNZiq5ArccA", + "type": "arrow" + }, + { + "id": "_LoAwX3tpSgnbaB7aSy5P", + "type": "arrow" + }, + { + "id": "YPI_35Zw_AwduFo1kpFcA", + "type": "arrow" + }, + { + "id": "f9HEnxVOpTBviKw8tXThY", + "type": "arrow" + }, + { + "id": "oM06BNl4jMhDCQawN0zMG", + "type": "arrow" + }, + { + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "type": "arrow" + }, + { + "id": "CNm4GJJ-rnwmdgPRGLvid", + "type": "arrow" + }, + { + "id": "7DX8HA8axopnXqPbjokVE", + "type": "arrow" + }, + { + "id": "6PEFg4n0JDF3pzWvnf30o", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 783, + "versionNonce": 1348194787, + "isDeleted": false, + "id": "7m-mbZyIVyy569uTn4tBd", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11772.853936454947, + "y": -3217.188579668402, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 344532655, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "image", + "version": 7612, + "versionNonce": 1366094285, + "isDeleted": false, + "id": "2x--W-ZvY7ju0oGWOTVyT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12173.67001282949, + "y": -3219.1902669673636, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 822419393, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 8618, + "versionNonce": 2104335747, + "isDeleted": false, + "id": "w3eLzAqXtWGhH7PGEgS30", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10923.404910249546, + "y": -3064.805232181765, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 623802575, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7215, + "versionNonce": 266809389, + "isDeleted": false, + "id": "yyBPzm_6f5xE0byBRF1rD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10936.419143009847, + "y": -3050.3868957032555, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1705869217, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1249, + "versionNonce": 1430954637, + "isDeleted": false, + "id": "86JAnse64Kf1MqKWhOdCo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11137.620333766728, + "y": -2974.834601195555, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1241441153, + "groupIds": [ + "FTTlvUwZNT9_ZQyZQ4cjm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1422, + "versionNonce": 1947228355, + "isDeleted": false, + "id": "eZcTl0fr3lgHxYeTJeIbl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11137.620333766728, + "y": -2965.320276036416, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 74699023, + "groupIds": [ + "FTTlvUwZNT9_ZQyZQ4cjm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1318, + "versionNonce": 1448134893, + "isDeleted": false, + "id": "-8pzVLkx5sWZfu5BrM1xQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11137.620333766728, + "y": -2955.805950877277, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 171494241, + "groupIds": [ + "FTTlvUwZNT9_ZQyZQ4cjm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1321, + "versionNonce": 1954751309, + "isDeleted": false, + "id": "g7iFjimxwzRqo-hVVsMtx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11051.450247834839, + "y": -3051.063348010731, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 514504513, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8633, + "versionNonce": 898354083, + "isDeleted": false, + "id": "14um3uuD-lJpKFHhdHqFV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10932.414242905656, + "y": -2412.763441454721, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 618041871, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8664, + "versionNonce": 1114187203, + "isDeleted": false, + "id": "1Q4k4j8GjWiWN_1lKHWFI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10927.65208851143, + "y": -2740.7145584258697, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 2019432303, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 1604, + "versionNonce": 1795828707, + "isDeleted": false, + "id": "gBlSD1bJsqWNZiq5ArccA", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10594.324968228852, + "y": -2851.518633431533, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1113.9555986959022, + "height": 2.7898041151352118, + "seed": 1972267183, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.40524785955330467, + "gap": 9.057224670014875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1113.9555986959022, + -2.7898041151352118 + ] + ] + }, + { + "type": "arrow", + "version": 1845, + "versionNonce": 1122580429, + "isDeleted": false, + "id": "_LoAwX3tpSgnbaB7aSy5P", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10595.202639827345, + "y": -2526.7935270425287, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1109.8649363564746, + "height": 1.4805954349831154, + "seed": 1064107457, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.08308029355720341, + "gap": 12.270215410949277 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1109.8649363564746, + -1.4805954349831154 + ] + ] + }, + { + "type": "arrow", + "version": 1483, + "versionNonce": 624998275, + "isDeleted": false, + "id": "oM06BNl4jMhDCQawN0zMG", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10602.4096126515, + "y": -2190.2900278869147, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1109.2581114153727, + "height": 5.8104704563475025, + "seed": 2017163983, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "v0VPu-dOzqZnKb6oWmVs8", + "focus": -1.8456662495571472, + "gap": 15.409080937494991 + }, + "endBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.5776284899645453, + "gap": 5.670067527896208 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1109.2581114153727, + -5.8104704563475025 + ] + ] + }, + { + "type": "text", + "version": 1524, + "versionNonce": 1441445421, + "isDeleted": false, + "id": "wzVySREK89VXORifFN-n9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11128.489472206526, + "y": -2151.5439128164917, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 1466539425, + "groupIds": [ + "lZRMHQF9ze0VLmpdEoOHb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1688, + "versionNonce": 1541721891, + "isDeleted": false, + "id": "MPwhakWq6HiTskDXqVC7k", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11128.489472206526, + "y": -2094.1637864092327, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 1673611503, + "groupIds": [ + "lZRMHQF9ze0VLmpdEoOHb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1600, + "versionNonce": 1559062669, + "isDeleted": false, + "id": "BwdLyi1-L2RUYXy9xHXDo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11128.489472206526, + "y": -2036.7836600019737, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 713507201, + "groupIds": [ + "lZRMHQF9ze0VLmpdEoOHb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1382, + "versionNonce": 1097134787, + "isDeleted": false, + "id": "Z28owIXwt3E5af-gPVQxO", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12932.009569792115, + "y": -2153.7487984083537, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 363352847, + "groupIds": [ + "YlXP2qvWycHOudlREYVDP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1546, + "versionNonce": 699059949, + "isDeleted": false, + "id": "EHzBoQcSe594ZnDZZB330", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12932.009569792115, + "y": -2096.3686720010946, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 906324321, + "groupIds": [ + "YlXP2qvWycHOudlREYVDP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1458, + "versionNonce": 912237155, + "isDeleted": false, + "id": "A-KLwRYqMrBpalqDDXAWH", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12932.009569792115, + "y": -2038.9885455938356, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 32.60579993680513, + "height": 136.3515270084578, + "seed": 644421935, + "groupIds": [ + "YlXP2qvWycHOudlREYVDP" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 106.70989070227132, + "fontFamily": 1, + "text": ".", + "baseline": 96.3515270084578, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 1168, + "versionNonce": 447506765, + "isDeleted": false, + "id": "Lk_di2Do9dqrCKDW8N0Gm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12296.561868915402, + "y": -2865.0059960429708, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 462.7328840911905, + "height": 0.516881397756606, + "seed": 590583105, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.4208841931785951, + "gap": 6.181103876019733 + }, + "endBinding": { + "elementId": "8_SkgbVKhlR-i00bKx4GO", + "focus": -0.09070770920808076, + "gap": 10.981328928668518 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 462.7328840911905, + 0.516881397756606 + ] + ] + }, + { + "type": "arrow", + "version": 1533, + "versionNonce": 61038083, + "isDeleted": false, + "id": "YPI_35Zw_AwduFo1kpFcA", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12302.170083829382, + "y": -2542.438861037297, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 459.3807302084424, + "height": 3.0096084426559173, + "seed": 191634255, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.05941742942559109, + "gap": 11.789318789999925 + }, + "endBinding": { + "elementId": "TRbPz9TYXzrkV2ImWH0Q6", + "focus": 0.03157068329610485, + "gap": 17.144948844385 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 459.3807302084424, + 3.0096084426559173 + ] + ] + }, + { + "type": "arrow", + "version": 1700, + "versionNonce": 21739437, + "isDeleted": false, + "id": "f9HEnxVOpTBviKw8tXThY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12300.222597391738, + "y": -2200.9445397735844, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 468.09049532253266, + "height": 1.2695973711279294, + "seed": 1165051169, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.5744992460351734, + "gap": 9.841832352355596 + }, + "endBinding": { + "elementId": "e7TqDGRkXzcjPEEyP5vcS", + "focus": -0.09360166648365265, + "gap": 19.436526649851658 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 468.09049532253266, + -1.2695973711279294 + ] + ] + }, + { + "type": "text", + "version": 1210, + "versionNonce": 1412343203, + "isDeleted": false, + "id": "tWvUA7xEsE36cUtoFfqnY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10926.030907155478, + "y": -3218.297896217668, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 432, + "height": 59, + "seed": 2030688623, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 1048, + "versionNonce": 1202862605, + "isDeleted": false, + "id": "NqjEpSR_dJCttOCntuu_V", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10711.25765719908, + "y": -3407.8988617918803, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 7.589343086200643, + "height": 1643.9036701963516, + "seed": 1479407873, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 7.589343086200643, + 1643.9036701963516 + ] + ] + }, + { + "type": "text", + "version": 1526, + "versionNonce": 1865414979, + "isDeleted": false, + "id": "X5mm-BFXTFimTtdsX49P2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10668.784552386063, + "y": -1705.5793083778499, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 93, + "height": 59, + "seed": 76206991, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "time", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "time" + }, + { + "type": "arrow", + "version": 2204, + "versionNonce": 1457090669, + "isDeleted": false, + "id": "CNm4GJJ-rnwmdgPRGLvid", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11707.428256649255, + "y": -2816.1450649511416, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1053.9157014066477, + "height": 1.088799603037387, + "seed": 2095657185, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": 0.3477221783787709, + "gap": 9.90953494551377 + }, + "endBinding": { + "elementId": "OKueZSKQ2ETJEZPzWvtfg", + "focus": 0.01912997293608503, + "gap": 11.687067524372651 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1053.9157014066477, + 1.088799603037387 + ] + ] + }, + { + "type": "arrow", + "version": 2320, + "versionNonce": 839244003, + "isDeleted": false, + "id": "7DX8HA8axopnXqPbjokVE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11704.118186549878, + "y": -2490.0246239209296, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1048.317345240992, + "height": 2.6603627831809717, + "seed": 103254447, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.14199550169923875, + "gap": 13.219605044890159 + }, + "endBinding": { + "elementId": "xE19T5e9Wysn8zoUG985g", + "focus": -0.05287449867237143, + "gap": 11.259228929836354 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1048.317345240992, + -2.6603627831809717 + ] + ] + }, + { + "type": "arrow", + "version": 2296, + "versionNonce": 1015732941, + "isDeleted": false, + "id": "6PEFg4n0JDF3pzWvnf30o", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11709.515568986542, + "y": -2160.8492028620435, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1047.0984069373608, + "height": 4.357566102021792, + "seed": 2033347777, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r4asxMHx9AF_CwQuXL5fr", + "focus": -0.6310532427810328, + "gap": 7.822222608226184 + }, + "endBinding": { + "elementId": "v0VPu-dOzqZnKb6oWmVs8", + "focus": 0.026668879454902896, + "gap": 8.517975295454562 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1047.0984069373608, + 4.357566102021792 + ] + ] + }, + { + "type": "text", + "version": 1734, + "versionNonce": 1245627523, + "isDeleted": false, + "id": "OKueZSKQ2ETJEZPzWvtfg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10586.743002549409, + "y": -2833.4164856067873, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 990411727, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "16_ypIlxoTp2M1Dk710RX", + "type": "arrow" + }, + { + "id": "eEfVfgGYmCShzGgSTsASX", + "type": "arrow" + }, + { + "id": "CNm4GJJ-rnwmdgPRGLvid", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 1888, + "versionNonce": 291502381, + "isDeleted": false, + "id": "xE19T5e9Wysn8zoUG985g", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10589.459127210226, + "y": -2509.87993220553, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 883502241, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "7DX8HA8axopnXqPbjokVE", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 1858, + "versionNonce": 798571555, + "isDeleted": false, + "id": "v0VPu-dOzqZnKb6oWmVs8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10598.816701584903, + "y": -2174.88094694942, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 658909679, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "W7YDiu09-OR0Tvc8g-7Jc", + "type": "arrow" + }, + { + "id": "oM06BNl4jMhDCQawN0zMG", + "type": "arrow" + }, + { + "id": "6PEFg4n0JDF3pzWvnf30o", + "type": "arrow" + } + ], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 987, + "versionNonce": 516049805, + "isDeleted": false, + "id": "wGlVn0CphcZySt9Az-yK1", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10707.799612223622, + "y": -3622.7366339723703, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 883.1604826321716, + "height": 113.30422280648524, + "seed": 1996288129, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "async_insert = 0", + "baseline": 91.30422280648524, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "async_insert = 0" + }, + { + "type": "rectangle", + "version": 7416, + "versionNonce": 1577304003, + "isDeleted": false, + "id": "Xl8BQ7srbKrePLFbE4SMU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10936.043282909015, + "y": -2999.083422964102, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 68103183, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7493, + "versionNonce": 1156272621, + "isDeleted": false, + "id": "gof0jujEL7V0RU2-OMofS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10934.88593975075, + "y": -2912.657600075194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 988612129, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1432, + "versionNonce": 1335676771, + "isDeleted": false, + "id": "wR_KU6UfVZ7MXN3S-2vIf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11051.074387734008, + "y": -3000.2993183406566, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 64613057, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1502, + "versionNonce": 551849037, + "isDeleted": false, + "id": "YdX5glsCRgrBKx-sdZZxb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11053.649724186334, + "y": -2915.3126642838592, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 38451983, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7326, + "versionNonce": 917695235, + "isDeleted": false, + "id": "_gMJ3F4wObYW0YE904ube", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10942.865710780368, + "y": -2725.47459735298, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 15769665, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1359, + "versionNonce": 1921481389, + "isDeleted": false, + "id": "5UKdvAcS_JRJz2Ts4MjtV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11144.06690153725, + "y": -2649.92230284528, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1008287823, + "groupIds": [ + "tbhrmuasja2WmqQisk8eb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1532, + "versionNonce": 2009371299, + "isDeleted": false, + "id": "tmOOB6qKUgyVhYl1ayWL2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11144.06690153725, + "y": -2640.407977686141, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 492105761, + "groupIds": [ + "tbhrmuasja2WmqQisk8eb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1428, + "versionNonce": 1115528461, + "isDeleted": false, + "id": "aP3ZitQYd7dZFdDhVMoF9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11144.06690153725, + "y": -2630.893652527002, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1120558703, + "groupIds": [ + "tbhrmuasja2WmqQisk8eb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1431, + "versionNonce": 1669350979, + "isDeleted": false, + "id": "nelC_MSr6sa8ochhSpqLX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11057.896815605358, + "y": -2726.151049660456, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1818510337, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7528, + "versionNonce": 1212183405, + "isDeleted": false, + "id": "7HORGwMmckivbaMESZS8T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10942.682298282823, + "y": -2673.978677010538, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 770881679, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7604, + "versionNonce": 818185699, + "isDeleted": false, + "id": "jJkQz8kHAKT63YuDxjQn8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10941.332507521269, + "y": -2587.745301724918, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1780358113, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1542, + "versionNonce": 270106061, + "isDeleted": false, + "id": "KvP2hjBcsmNlV1YU2dY17", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11057.520955504528, + "y": -2675.3870199903813, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1665846959, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1612, + "versionNonce": 916443523, + "isDeleted": false, + "id": "XrActUzzlVbNq1YqaOOrb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11060.096291956854, + "y": -2590.400365933584, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1720842177, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7290, + "versionNonce": 1629633581, + "isDeleted": false, + "id": "yBrqnOHauqTiYzo-koLn2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10948.290542613031, + "y": -2401.50628656556, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 200568559, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1323, + "versionNonce": 1716562211, + "isDeleted": false, + "id": "lOp4e9Assx2rdxXWmmDNf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.491733369912, + "y": -2325.95399205786, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 788626305, + "groupIds": [ + "LcLU-acPh-sOPixH08K9g" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1496, + "versionNonce": 1665412749, + "isDeleted": false, + "id": "ZiytRED6G1DfjCEUe5Tgx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.491733369912, + "y": -2316.43966689872, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1485224207, + "groupIds": [ + "LcLU-acPh-sOPixH08K9g" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1392, + "versionNonce": 88444099, + "isDeleted": false, + "id": "V3Z5_GgCKKDRZl86yTysp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.491733369912, + "y": -2306.925341739582, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1663591265, + "groupIds": [ + "LcLU-acPh-sOPixH08K9g" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1395, + "versionNonce": 87610605, + "isDeleted": false, + "id": "ysDzDodoBlYWx0JNoVRKz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.32164743802, + "y": -2402.1827388730353, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 210419503, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7492, + "versionNonce": 656211043, + "isDeleted": false, + "id": "DnkgM_S5MqjruI9CcnD-c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10947.914682512197, + "y": -2350.202813826406, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1709657921, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042746, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7568, + "versionNonce": 579448653, + "isDeleted": false, + "id": "SBWRJK-TvopNXwt72IjkM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10946.757339353931, + "y": -2263.7769909374983, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1248395599, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1506, + "versionNonce": 1738897411, + "isDeleted": false, + "id": "-A2HLwAuj10deyHVG8xPR", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11062.94578733719, + "y": -2351.4187092029615, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 765312801, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1577, + "versionNonce": 1771060653, + "isDeleted": false, + "id": "PHVvYTFt-Tu8Q95XcKSkf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11065.521123789516, + "y": -2266.4320551461633, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1400504175, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8837, + "versionNonce": 1692237731, + "isDeleted": false, + "id": "awUEWAA8CLP17LpYHvH6P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 12648.405314950462, + "y": -364.49402835267574, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1494.474639367547, + "seed": 642251951, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "UGSRJmN3MsDMsRVN5QR7B", + "type": "arrow" + }, + { + "id": "PwlCoKb42UzW0NYlczmWr", + "type": "arrow" + }, + { + "id": "wBMhNAE5SnGg_sE0i_bOK", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 8045, + "versionNonce": 1882486381, + "isDeleted": false, + "id": "0Y0mlivbwuVpvOyf4i_lH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12168.508669871244, + "y": -329.6339005635946, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 2049301743, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 9051, + "versionNonce": 877015779, + "isDeleted": false, + "id": "uJ3Qd7btEme-7LxdKsay7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10918.243567291298, + "y": -175.24886577799566, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 157674881, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9094, + "versionNonce": 1132135683, + "isDeleted": false, + "id": "1t0QMqrqIxrfcoGgOfXia", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10922.740670054958, + "y": 148.84180797789918, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 1595694305, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9066, + "versionNonce": 818447139, + "isDeleted": false, + "id": "3-nEIP9R4LmFUQOcEORys", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10927.252899947409, + "y": 476.7929249490485, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 67186753, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 3234, + "versionNonce": 994258243, + "isDeleted": false, + "id": "veotS3i5mtgTncfBapy56", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10585.180157747885, + "y": 40.859038939258426, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1125.8776942209497, + "height": 1.2625051858872212, + "seed": 982902689, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "G_cjG9NGUMqeUkqehWFVW", + "focus": -1.7951399188514814, + "gap": 14.384573043244245 + }, + "endBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": 0.4616290704639783, + "gap": 2.567248248819851 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1125.8776942209497, + -1.2625051858872212 + ] + ] + }, + { + "type": "arrow", + "version": 2845, + "versionNonce": 1875082349, + "isDeleted": false, + "id": "kt7o2EcGvutAPunnwRp85", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10585.223726389402, + "y": 363.68658303561233, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1116.2054327063452, + "height": 0.17707567252489298, + "seed": 1339465455, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": 0.027577621242712277, + "gap": 12.195941121907708 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1116.2054327063452, + -0.17707567252489298 + ] + ] + }, + { + "type": "arrow", + "version": 2417, + "versionNonce": 2106756323, + "isDeleted": false, + "id": "0wAEvWjfkReYdnXnKEP-h", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10596.763967093577, + "y": 701.5290982506217, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1111.7174391889857, + "height": 1.2681875196597048, + "seed": 899304321, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": -0.4272148747293711, + "gap": 5.143693935092415 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1111.7174391889857, + 1.2681875196597048 + ] + ] + }, + { + "type": "text", + "version": 1641, + "versionNonce": 1146316493, + "isDeleted": false, + "id": "bC9SsYY-nMMJaLxOwA8uq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10920.72556093747, + "y": -328.59316281899237, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 432, + "height": 59, + "seed": 1084418319, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "text", + "version": 1563, + "versionNonce": 674694445, + "isDeleted": false, + "id": "SizfOxTHDWIgtEcHg8XQY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11797.422041457132, + "y": -213.31559077092766, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 92.45010600653902, + "height": 38.412367988632404, + "seed": 27324207, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 30.38771497908792, + "fontFamily": 1, + "text": "buffer", + "baseline": 26.412367988632404, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "buffer" + }, + { + "type": "rectangle", + "version": 8206, + "versionNonce": 1837531757, + "isDeleted": false, + "id": "43VjTFhKz7zS5KS6W6hIM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12788.992867861649, + "y": 857.1898514414802, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1254318319, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8303, + "versionNonce": 1978328803, + "isDeleted": false, + "id": "uGohHPKAhjZroszXJ1HQM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12788.49645007739, + "y": 781.549592369844, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1045604737, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8389, + "versionNonce": 1606790349, + "isDeleted": false, + "id": "0yU25xOLabv_GmVIIjKWQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12790.162349148173, + "y": 708.7057069267507, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 78080783, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2223, + "versionNonce": 710021763, + "isDeleted": false, + "id": "-A14N5H_8zguTVEKam-Ws", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12806.55951702084, + "y": 723.5286297668713, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 308.2869528801066, + "height": 166.83764508805757, + "seed": 203673953, + "groupIds": [ + "xG1_N6lq3vxstfhJ518Ri" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 130.56859180804503, + "fontFamily": 1, + "text": "Part", + "baseline": 117.83764508805757, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "arrow", + "version": 2489, + "versionNonce": 1768983341, + "isDeleted": false, + "id": "MHgyHI7AE34K9ew6I8yKE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12233.050567512346, + "y": 821.3452400154339, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 535.859357916067, + "height": 0.06534604596265581, + "seed": 365244719, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "0kqbthpF2BiBxnmmuryaa", + "focus": 0.8304810387070579, + "gap": 3.5584119912728056 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 535.859357916067, + -0.06534604596265581 + ] + ] + }, + { + "type": "arrow", + "version": 3548, + "versionNonce": 202557987, + "isDeleted": false, + "id": "HQHHlxtTUMpxfg5tg2cgp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11703.93290592633, + "y": 73.07819509761953, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1055.3643529877809, + "height": 0.7398101402201291, + "seed": 2034564417, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": 0.41671124609872856, + "gap": 9.692194291325904 + }, + "endBinding": { + "elementId": "G_cjG9NGUMqeUkqehWFVW", + "focus": 0.03027275457975293, + "gap": 11.795086622790222 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1055.3643529877809, + 0.7398101402201291 + ] + ] + }, + { + "type": "arrow", + "version": 3000, + "versionNonce": 183541133, + "isDeleted": false, + "id": "QcBHPr75biqSQUSeenF-n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11700.87286745263, + "y": 395.7151579146706, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1049.7659968221255, + "height": 2.5139289048910314, + "seed": 1736782671, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": -0.01656803953296109, + "gap": 12.752232765024928 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1049.7659968221255, + -2.5139289048910314 + ] + ] + }, + { + "type": "arrow", + "version": 3651, + "versionNonce": 1343983043, + "isDeleted": false, + "id": "SW4ZoMUP2yAJ0tQGqBBMv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11702.52803898585, + "y": 738.0648827446084, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1048.547058518494, + "height": 4.493016513437169, + "seed": 622177569, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": { + "elementId": "z7b22yE8RBNw-dJti7WVw", + "focus": -0.47171278936871536, + "gap": 11.097061231804219 + }, + "endBinding": { + "elementId": "STPsN7OleYbzTtI1M9_1-", + "focus": 0.06296681167862889, + "gap": 13.903084420416235 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1048.547058518494, + 4.493016513437169 + ] + ] + }, + { + "type": "arrow", + "version": 1403, + "versionNonce": 2071946221, + "isDeleted": false, + "id": "FRemx_DRYWXJhWJZ7KHKo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10698.525446260344, + "y": -401.118879155345, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 7.589343086200643, + "height": 1643.9036701963516, + "seed": 574615919, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 7.589343086200643, + 1643.9036701963516 + ] + ] + }, + { + "type": "text", + "version": 1920, + "versionNonce": 160095587, + "isDeleted": false, + "id": "6320NDc33yTz5Sv0IRTA2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10657.106588296567, + "y": 1271.317266339392, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 93, + "height": 59, + "seed": 386228481, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "time", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "time" + }, + { + "type": "text", + "version": 2047, + "versionNonce": 1327914573, + "isDeleted": false, + "id": "G_cjG9NGUMqeUkqehWFVW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10581.690981146934, + "y": 55.24361198250267, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 1329458063, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "HQHHlxtTUMpxfg5tg2cgp", + "type": "arrow" + }, + { + "id": "veotS3i5mtgTncfBapy56", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2199, + "versionNonce": 1672427779, + "isDeleted": false, + "id": "Q8pPOj73Aj2Wi5lsQGe8O", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10577.598920219556, + "y": 381.07072283767593, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 1016305889, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2192, + "versionNonce": 1556024493, + "isDeleted": false, + "id": "STPsN7OleYbzTtI1M9_1-", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10584.995410878117, + "y": 723.5363882379029, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 985113007, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "SW4ZoMUP2yAJ0tQGqBBMv", + "type": "arrow" + } + ], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2110, + "versionNonce": 470229155, + "isDeleted": false, + "id": "BU_OIQXM7fVXdcf65bMhn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10492.550278189203, + "y": 6.870146264230243, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 28, + "height": 56, + "seed": 659543233, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t" + }, + { + "type": "arrow", + "version": 2502, + "versionNonce": 1676865293, + "isDeleted": false, + "id": "rvBS-i9vxpvnrZyITMkMn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10579.376449067948, + "y": 825.4320721280069, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1623.7136677156018, + "height": 1.9093365596636431, + "seed": 366318543, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042747, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1623.7136677156018, + -1.9093365596636431 + ] + ] + }, + { + "type": "text", + "version": 2189, + "versionNonce": 1933280621, + "isDeleted": false, + "id": "qg3LJ1Z2_KBSk1KVC1v20", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 9677.080137272706, + "y": 795.4488267744159, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 903, + "height": 56, + "seed": 1487946223, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "tf4f5Ttd3vc2bvxc1uMXA", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t + async_insert_busy_timeout_ms ", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t + async_insert_busy_timeout_ms " + }, + { + "type": "text", + "version": 1452, + "versionNonce": 339448803, + "isDeleted": false, + "id": "HTKKa4w7JMH6KIb4s0H1P", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10729.150882897164, + "y": -766.9086906142543, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 884, + "height": 113, + "seed": 2061523073, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "async_insert = 1", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "async_insert = 1" + }, + { + "type": "text", + "version": 1575, + "versionNonce": 232935373, + "isDeleted": false, + "id": "xy4zXW3-DJNw6qjK-ICLf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10731.029806058092, + "y": -625.932343140094, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1380, + "height": 113, + "seed": 1682975759, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "wait_for_async_insert = 0", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "wait_for_async_insert = 0" + }, + { + "type": "rectangle", + "version": 8940, + "versionNonce": 1946492803, + "isDeleted": false, + "id": "lTG-8QtXaYksBy1xibPuJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10915.494547140497, + "y": 155.17015197481192, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 451595425, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7601, + "versionNonce": 302042669, + "isDeleted": false, + "id": "st2P9a8klcShYP2PY-sR-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10930.708169409438, + "y": 170.41011304770177, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 2003732975, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1634, + "versionNonce": 635189027, + "isDeleted": false, + "id": "1tXEudKHe-zdZjmPKvz7F", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11131.909360166319, + "y": 245.9624075554018, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1678413953, + "groupIds": [ + "PMuYsSIh9qDGZeLS0Z8pp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1807, + "versionNonce": 1585479821, + "isDeleted": false, + "id": "u_B-oAXydFUBM40i3DVKY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11131.909360166319, + "y": 255.47673271454073, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 604337167, + "groupIds": [ + "PMuYsSIh9qDGZeLS0Z8pp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1703, + "versionNonce": 674192067, + "isDeleted": false, + "id": "f0FHVNQ171mhmzueoD9N8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11131.909360166319, + "y": 264.99105787367967, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 541513825, + "groupIds": [ + "PMuYsSIh9qDGZeLS0Z8pp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1706, + "versionNonce": 958064365, + "isDeleted": false, + "id": "Oy0vu1Ud9lem8FozjQvEI", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11045.739274234424, + "y": 169.73366074022556, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 242883119, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7803, + "versionNonce": 664603235, + "isDeleted": false, + "id": "VI8vFlMwoKX5HprA0nXXb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10930.524756911891, + "y": 221.9060333901441, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1097802817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7879, + "versionNonce": 1952022861, + "isDeleted": false, + "id": "0aaB4qQ_8f_0vicGJNMVv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10929.174966150335, + "y": 308.13940867576343, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 733281359, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1817, + "versionNonce": 955500035, + "isDeleted": false, + "id": "lbp7pzODv2KPFBtlq_zPV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11045.363414133593, + "y": 220.49769041030027, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1398993953, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1887, + "versionNonce": 1435881389, + "isDeleted": false, + "id": "v55jU8UjTDppudrTge9hV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11047.93875058592, + "y": 305.48434446709757, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1066310255, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7430, + "versionNonce": 1395789219, + "isDeleted": false, + "id": "3WG85fNKmNshZUroQX5FM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10932.631584221082, + "y": -159.67267227329876, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1729037473, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1464, + "versionNonce": 989417997, + "isDeleted": false, + "id": "vcyHYwDLe9WwOzrtxN3JT", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11133.832774977964, + "y": -84.12037776559828, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 415879663, + "groupIds": [ + "30EqGw61csf9bYrCg0E5p" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1637, + "versionNonce": 159801667, + "isDeleted": false, + "id": "HHizHG17ix82VUUJV04Rw", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11133.832774977964, + "y": -74.60605260645934, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 250071169, + "groupIds": [ + "30EqGw61csf9bYrCg0E5p" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1533, + "versionNonce": 25004141, + "isDeleted": false, + "id": "doozI8AKUrwVFjkTcPFQ4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11133.832774977964, + "y": -65.09172744732041, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 179813391, + "groupIds": [ + "30EqGw61csf9bYrCg0E5p" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1536, + "versionNonce": 89080035, + "isDeleted": false, + "id": "wCyO7RWIuIJgWYqOgj_pS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11047.662689046076, + "y": -160.34912458077406, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1790775393, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7631, + "versionNonce": 720106189, + "isDeleted": false, + "id": "pimrBrFug0s_5JxRkfZ4H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10932.255724120252, + "y": -108.36919953414508, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 2007196207, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7708, + "versionNonce": 1075522691, + "isDeleted": false, + "id": "B1phD7w2CvvQ0tcUn93lq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10931.098380961987, + "y": -21.943376645237095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1348361281, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1647, + "versionNonce": 1138626861, + "isDeleted": false, + "id": "uRq_dTrNr-07Dp1uOEM3S", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11047.286828945245, + "y": -109.58509491069981, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 812991567, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1717, + "versionNonce": 2108204067, + "isDeleted": false, + "id": "LSAK1peaoCVSNpUDZYhQo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11049.862165397572, + "y": -24.598440853902503, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 799747105, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7586, + "versionNonce": 163406733, + "isDeleted": false, + "id": "GIK2xnh3xjVoH2mNgXJgJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10938.167335942951, + "y": 492.6610330784283, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1834457153, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1619, + "versionNonce": 98969539, + "isDeleted": false, + "id": "ty_23HO_RT9IwAFtzP-Tm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11139.368526699833, + "y": 568.2133275861283, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1740490831, + "groupIds": [ + "R-bC9tyDYJCoovcGPRLpm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1792, + "versionNonce": 1354983917, + "isDeleted": false, + "id": "FMYyXedAzwG0rs0AMArOn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11139.368526699833, + "y": 577.7276527452682, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1377626145, + "groupIds": [ + "R-bC9tyDYJCoovcGPRLpm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1688, + "versionNonce": 519190371, + "isDeleted": false, + "id": "VeP44CoINcBxdlooIZprg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11139.368526699833, + "y": 587.2419779044062, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 413001327, + "groupIds": [ + "R-bC9tyDYJCoovcGPRLpm" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1691, + "versionNonce": 704226381, + "isDeleted": false, + "id": "VLsqQ39mYA485LtqqUGXp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11053.198440767941, + "y": 491.984580770953, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 896351233, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7788, + "versionNonce": 1192973059, + "isDeleted": false, + "id": "yrIAuCc6PANbGI_p2hCjK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10937.791475842118, + "y": 543.9645058175824, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 269828239, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7864, + "versionNonce": 1228509869, + "isDeleted": false, + "id": "hKLE0HIHfe15WnCdNwZ61", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10936.634132683852, + "y": 630.39032870649, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 390599649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1802, + "versionNonce": 786430627, + "isDeleted": false, + "id": "Ns5IsS-4cSyV1v9yX-oAF", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11052.82258066711, + "y": 542.7486104410268, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1876711087, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1873, + "versionNonce": 724350221, + "isDeleted": false, + "id": "M430CtOqQcBFAh-Idslo-", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11055.397917119437, + "y": 627.735264497825, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1270673345, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7789, + "versionNonce": 1928244803, + "isDeleted": false, + "id": "fJI4KGFfz5fIAGJ2ar8m0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.593530459948, + "y": 170.27465419642976, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 39594191, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1822, + "versionNonce": 2068613997, + "isDeleted": false, + "id": "L3QIoulxLeLgfAneabny_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12003.79472121683, + "y": 245.8269487041298, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 2138230689, + "groupIds": [ + "SETiNalYS9O2cZrxDcLNZ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1995, + "versionNonce": 371584483, + "isDeleted": false, + "id": "jmi8wXf8oByCKj5zwJQrV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12003.79472121683, + "y": 255.34127386326873, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 27014895, + "groupIds": [ + "SETiNalYS9O2cZrxDcLNZ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1891, + "versionNonce": 971150797, + "isDeleted": false, + "id": "mHV27wpghy6wGwJySxi-R", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12003.79472121683, + "y": 264.85559902240766, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 513422209, + "groupIds": [ + "SETiNalYS9O2cZrxDcLNZ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1894, + "versionNonce": 999569795, + "isDeleted": false, + "id": "iDcdx6J7TsZAYtk721XVj", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11917.624635284934, + "y": 169.59820188895355, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1442152719, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7991, + "versionNonce": 570971181, + "isDeleted": false, + "id": "_tohoIGOJyx7I3YyQrOl-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.410117962401, + "y": 221.7705745388721, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1323965281, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8067, + "versionNonce": 544739619, + "isDeleted": false, + "id": "8wu7Rh5P2H97hyWd-oUQt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11801.060327200845, + "y": 308.00394982449143, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 14714671, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2005, + "versionNonce": 1336362637, + "isDeleted": false, + "id": "jB6lodUtI_6Aec1ro7KM2", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11917.248775184104, + "y": 220.36223155902826, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1622280001, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2075, + "versionNonce": 1447032003, + "isDeleted": false, + "id": "PjpfBY_pPlkRtVcVk-GVZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11919.82411163643, + "y": 305.34888561582557, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1086703951, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7618, + "versionNonce": 628681965, + "isDeleted": false, + "id": "q7tN7khLnuThoxptNGme7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11804.516945271593, + "y": -159.80813112457076, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1850832673, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1652, + "versionNonce": 1015702627, + "isDeleted": false, + "id": "d6ERGGBwjCqxCYBvK-s-Q", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12005.718136028474, + "y": -84.25583661687028, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1929234287, + "groupIds": [ + "TYes1eYl5zdUdjc_MrH4F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1825, + "versionNonce": 1929824077, + "isDeleted": false, + "id": "6-r6-zLERnCs1T424R6Wv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12005.718136028474, + "y": -74.74151145773135, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 439872257, + "groupIds": [ + "TYes1eYl5zdUdjc_MrH4F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1721, + "versionNonce": 992337923, + "isDeleted": false, + "id": "xqlODkL6jeqVQ4RF0YgtE", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12005.718136028474, + "y": -65.22718629859241, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 902889871, + "groupIds": [ + "TYes1eYl5zdUdjc_MrH4F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1724, + "versionNonce": 1521112493, + "isDeleted": false, + "id": "HqoC90JqkvTgArlp3bcEq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11919.548050096586, + "y": -160.48458343204607, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 216326881, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7819, + "versionNonce": 1007740835, + "isDeleted": false, + "id": "wBs5xU2Ypww9eKDisJBjJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11804.141085170762, + "y": -108.50465838541709, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1249376175, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7896, + "versionNonce": 2005735437, + "isDeleted": false, + "id": "hI0nlmUp8gxFMcIFD9ed3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.983742012497, + "y": -22.0788354965091, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 854056641, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1835, + "versionNonce": 1702492995, + "isDeleted": false, + "id": "ahj_JCsl_bgmKiBBIf-8c", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11919.172189995756, + "y": -109.72055376197181, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 924527055, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 1905, + "versionNonce": 1135119981, + "isDeleted": false, + "id": "QWbQDk1jXsuCEYXARV7ga", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11921.747526448082, + "y": -24.733899705174508, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 987782817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7774, + "versionNonce": 331324131, + "isDeleted": false, + "id": "81Xym2Ei4mixHPJO_a8tp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11810.052696993462, + "y": 492.5255742271563, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 684922863, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1807, + "versionNonce": 1036400845, + "isDeleted": false, + "id": "CZjGCbM2W7MjicflG3y93", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12011.253887750343, + "y": 568.0778687348563, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1400758913, + "groupIds": [ + "YdoDx14OFuFiJEc9W5Nie" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1980, + "versionNonce": 326125187, + "isDeleted": false, + "id": "x_S5tPlu6ol9a3lsse9EY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12011.253887750343, + "y": 577.5921938939962, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 363348495, + "groupIds": [ + "YdoDx14OFuFiJEc9W5Nie" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1876, + "versionNonce": 1333761837, + "isDeleted": false, + "id": "8_cNNQ2X-EPzDrde0dTXe", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12011.253887750343, + "y": 587.1065190531342, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 696248929, + "groupIds": [ + "YdoDx14OFuFiJEc9W5Nie" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1879, + "versionNonce": 457866787, + "isDeleted": false, + "id": "eCZRcUYfKOGZ5CFt8YBr8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11925.083801818451, + "y": 491.849121919681, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 512960559, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7976, + "versionNonce": 1933453709, + "isDeleted": false, + "id": "TwlNxmXGHUH8Y72e2g-M1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11809.676836892628, + "y": 543.8290469663104, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 632682049, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8052, + "versionNonce": 104645059, + "isDeleted": false, + "id": "WYABx-odVUAWdjvyhwilr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11808.519493734362, + "y": 630.254869855218, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 830229071, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1990, + "versionNonce": 440102893, + "isDeleted": false, + "id": "0RZuZQp2fIzg-DrN3WmFq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11924.707941717621, + "y": 542.6131515897548, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1795130913, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1298501987, + "isDeleted": false, + "id": "5yUiLONIflckY6ODlMoZO", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11927.283278169947, + "y": 627.599805646553, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1799104623, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "arrow", + "version": 1432, + "versionNonce": 1384180301, + "isDeleted": false, + "id": "p_mujapNK1HLZFLfWV-Mz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10704.109137958572, + "y": 2773.8210159356904, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 2.5207489314871054, + "height": 1616.867889645605, + "seed": 2053011503, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5207489314871054, + 1616.867889645605 + ] + ] + }, + { + "type": "rectangle", + "version": 9224, + "versionNonce": 1108569347, + "isDeleted": false, + "id": "_S1VsQeCe9jmCVzltaNiq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 12665.741083768607, + "y": 2829.781771902455, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1494.474639367547, + "seed": 990357057, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "UGSRJmN3MsDMsRVN5QR7B", + "type": "arrow" + }, + { + "id": "PwlCoKb42UzW0NYlczmWr", + "type": "arrow" + }, + { + "id": "wBMhNAE5SnGg_sE0i_bOK", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9576, + "versionNonce": 130340003, + "isDeleted": false, + "id": "yeWaxa45GzF-9jIgCsb1L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 11730.481174921983, + "y": 2832.224937774474, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1493.1072881078205, + "seed": 1251685921, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "E0USEpWMl2ARgev0503M4", + "type": "arrow" + }, + { + "id": "SymoFzBsIWLDxRI5vaxAl", + "type": "arrow" + }, + { + "id": "1RNOM6dFYkRgYxvim7D4z", + "type": "arrow" + }, + { + "id": "FTHurF4qeJGBxvj8o5fpQ", + "type": "arrow" + }, + { + "id": "nmnzK2jrZye5qir7thmrP", + "type": "arrow" + }, + { + "id": "cUji-Br17Nea8XRPh-Tdx", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 8433, + "versionNonce": 1311262787, + "isDeleted": false, + "id": "1Vdo7vOfKL16u6y5-VU-G", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12185.844438689384, + "y": 2864.904565961666, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 1693567489, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 9440, + "versionNonce": 1032950125, + "isDeleted": false, + "id": "CykemVIDRFm_2ZKrr3jqH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10935.579336109446, + "y": 3019.2896007472655, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 1936233103, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9483, + "versionNonce": 1265110349, + "isDeleted": false, + "id": "cbuTOKVr20FDKIkgA4GIy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10940.076438873106, + "y": 3343.38027450316, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 911218991, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9454, + "versionNonce": 609557805, + "isDeleted": false, + "id": "io_CdIt9rtIAJ8p1B4f_s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 10944.588668765557, + "y": 3671.3313914743085, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 202.38417375812654, + "seed": 2056223695, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 3381, + "versionNonce": 599539981, + "isDeleted": false, + "id": "E0USEpWMl2ARgev0503M4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10624.61016191806, + "y": 3237.7806316767555, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1103.303764755099, + "height": 3.4156117718298447, + "seed": 566049391, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": 0.4619878782807352, + "gap": 2.56724824882167 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1103.303764755099, + -3.4156117718298447 + ] + ] + }, + { + "type": "arrow", + "version": 3562, + "versionNonce": 904782403, + "isDeleted": false, + "id": "SymoFzBsIWLDxRI5vaxAl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10634.460843708423, + "y": 3558.2368459784275, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1084.2764893954172, + "height": 0.3618028454022806, + "seed": 1335699457, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": 0.026894030096862375, + "gap": 11.743841818141846 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1084.2764893954172, + 0.3618028454022806 + ] + ] + }, + { + "type": "arrow", + "version": 3175, + "versionNonce": 1376425837, + "isDeleted": false, + "id": "1RNOM6dFYkRgYxvim7D4z", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 10634.483945443835, + "y": 3896.0675647758826, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1090.8535355430568, + "height": 1.4317591920334962, + "seed": 1646924943, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.42722033057796605, + "gap": 5.143693935090596 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1090.8535355430568, + 1.4317591920334962 + ] + ] + }, + { + "type": "text", + "version": 2028, + "versionNonce": 454992355, + "isDeleted": false, + "id": "9VJJNqw6p5GTpzOi0i0R4", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10938.061329755617, + "y": 2865.9453037062685, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 432, + "height": 59, + "seed": 1016758241, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "rectangle", + "version": 9783, + "versionNonce": 620700109, + "isDeleted": false, + "id": "sYKGvj4ZYFGztvmWLWbC7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 70, + "angle": 0, + "x": 11794.329063970248, + "y": 2964.41449903395, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 439.76080645065736, + "height": 1138.870180087369, + "seed": 1345759919, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "zWRCMAu8b-b3yhe5MqdXu", + "type": "arrow" + }, + { + "id": "_GH5FCHHFjL8ucTQMTU2M", + "type": "arrow" + }, + { + "id": "Z1c6cYExM1G6PzJDzZsKg", + "type": "arrow" + } + ], + "updated": 1664526042748, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1942, + "versionNonce": 123104643, + "isDeleted": false, + "id": "d6dmPkhgAN5kOZ4hRC3fu", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11806.75781027528, + "y": 2981.2228757543335, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 92.45010600653902, + "height": 38.412367988632404, + "seed": 1944181697, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042748, + "link": null, + "locked": false, + "fontSize": 30.38771497908792, + "fontFamily": 1, + "text": "buffer", + "baseline": 26.412367988632404, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "buffer" + }, + { + "type": "rectangle", + "version": 8594, + "versionNonce": 306150467, + "isDeleted": false, + "id": "t0Lm7jv4Uqovyoh3gdifz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12806.328636679795, + "y": 4051.728317966744, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1221363201, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8691, + "versionNonce": 1354210669, + "isDeleted": false, + "id": "91oVB3IrvKFXhHwP1biGW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12805.832218895532, + "y": 3976.0880588951086, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1554486927, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8777, + "versionNonce": 1848441827, + "isDeleted": false, + "id": "7QkYFrJhQcTM3nhBUz0XN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 12807.49811796632, + "y": 3903.2441734520135, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 74.02775544479714, + "seed": 1412308449, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oJnjijS90rJ0_z-bJ1AH1", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2610, + "versionNonce": 337340365, + "isDeleted": false, + "id": "w201R2yI0d1xjhmRe1NRL", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12823.895285838986, + "y": 3918.067096292135, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 308.2869528801066, + "height": 166.83764508805757, + "seed": 1672735919, + "groupIds": [ + "89T9p7Et_qq5s53SV7pNo" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 130.56859180804503, + "fontFamily": 1, + "text": "Part", + "baseline": 117.83764508805757, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "arrow", + "version": 3265, + "versionNonce": 1535739779, + "isDeleted": false, + "id": "Z1c6cYExM1G6PzJDzZsKg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 12246.386336330486, + "y": 4015.883740840124, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 539.859357916067, + "height": 0.06538034538743887, + "seed": 1397864897, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "sYKGvj4ZYFGztvmWLWbC7", + "focus": 0.8465226964412093, + "gap": 12.296465909581457 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 539.859357916067, + -0.06538034538743887 + ] + ] + }, + { + "type": "arrow", + "version": 3755, + "versionNonce": 559343149, + "isDeleted": false, + "id": "FTHurF4qeJGBxvj8o5fpQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11721.516926577138, + "y": 4053.4068377157064, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1088.0919143642882, + "height": 2.0576826928454466, + "seed": 252739279, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.6345500353195794, + "gap": 8.964248344843327 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1088.0919143642882, + 2.0576826928454466 + ] + ] + }, + { + "type": "arrow", + "version": 3995, + "versionNonce": 1888722723, + "isDeleted": false, + "id": "nmnzK2jrZye5qir7thmrP", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11718.979084065571, + "y": 4079.250110135018, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 1085.8857366791058, + "height": 4.3606847360542815, + "seed": 123132321, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.6677435996583445, + "gap": 11.502090856410177 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1085.8857366791058, + 4.3606847360542815 + ] + ] + }, + { + "type": "arrow", + "version": 3984, + "versionNonce": 1263769741, + "isDeleted": false, + "id": "cUji-Br17Nea8XRPh-Tdx", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 11722.28484108962, + "y": 4104.806050024824, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 1083.6525604448043, + "height": 5.3380759152805695, + "seed": 1633012975, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "yeWaxa45GzF-9jIgCsb1L", + "focus": -0.7013371646566656, + "gap": 8.196333832361233 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1083.6525604448043, + 5.3380759152805695 + ] + ] + }, + { + "type": "text", + "version": 2125, + "versionNonce": 2008662723, + "isDeleted": false, + "id": "kpx6D1BZgInUySlMmcKMk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10662.876379519015, + "y": 4435.489757261454, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 93, + "height": 59, + "seed": 1634532737, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "time", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "time" + }, + { + "type": "text", + "version": 2234, + "versionNonce": 1271594733, + "isDeleted": false, + "id": "oORPywmtzEdDIA38uLsmV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10508.040178570109, + "y": 3208.8911580020595, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 28, + "height": 56, + "seed": 1980520207, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t" + }, + { + "type": "text", + "version": 2238, + "versionNonce": 471170691, + "isDeleted": false, + "id": "JejiZv2Lhs1BQDFDgWZbn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12334.981048376341, + "y": 3855.2843238079936, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 311, + "height": 59, + "seed": 13870433, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526058444, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "(buffer flush)", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(buffer flush)" + }, + { + "type": "arrow", + "version": 3552, + "versionNonce": 1766234445, + "isDeleted": false, + "id": "Oa17vadiLj-ZBcDq-DqIk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10593.318463100519, + "y": 4017.0103647230762, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1623.7136677156018, + "height": 1.5859618770700763, + "seed": 1672256815, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "startBinding": { + "elementId": "hm31v-0wN6ou-nmHxIPH0", + "focus": 0.1492379286659515, + "gap": 6.042136718009715 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1623.7136677156018, + -1.5859618770700763 + ] + ] + }, + { + "type": "text", + "version": 2358, + "versionNonce": 654585347, + "isDeleted": false, + "id": "hm31v-0wN6ou-nmHxIPH0", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 9684.276326382509, + "y": 3985.212792576559, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 903, + "height": 56, + "seed": 1893355841, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Oa17vadiLj-ZBcDq-DqIk", + "type": "arrow" + } + ], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 3, + "text": "t + async_insert_busy_timeout_ms ", + "baseline": 45, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "t + async_insert_busy_timeout_ms " + }, + { + "type": "text", + "version": 2219, + "versionNonce": 1562372013, + "isDeleted": false, + "id": "KpOYZoUP4SClVKsdPAHxq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10550.943919991476, + "y": 4036.405356736873, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 1570709327, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2280, + "versionNonce": 1928689059, + "isDeleted": false, + "id": "-X43xJfW7Yf_FgejE1zeg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10549.61384360674, + "y": 4066.434251750293, + "strokeColor": "#3f78ec", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 652247329, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 2332, + "versionNonce": 2038458893, + "isDeleted": false, + "id": "9f_kAYbnsT2Vh1dMfEQsP", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10551.240741578482, + "y": 4095.052602904413, + "strokeColor": "#ef9236", + "backgroundColor": "#ef9236", + "width": 55.082485168825606, + "height": 36.109629166230114, + "seed": 373054831, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 28.566036840756308, + "fontFamily": 1, + "text": "ACK", + "baseline": 26.109629166230114, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ACK" + }, + { + "type": "text", + "version": 1802, + "versionNonce": 748472643, + "isDeleted": false, + "id": "qZLys518MSHE9KFozhw9P", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10764.549728213735, + "y": 2413.58935629607, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 884, + "height": 113, + "seed": 1079358721, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "async_insert = 1", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "async_insert = 1" + }, + { + "type": "text", + "version": 1926, + "versionNonce": 258056301, + "isDeleted": false, + "id": "FN_7uUXENg-Zb2CTwTub9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 10766.428651374665, + "y": 2554.5657037702304, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 1380, + "height": 113, + "seed": 1624037263, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042749, + "link": null, + "locked": false, + "fontSize": 94.13763794752755, + "fontFamily": 3, + "text": "wait_for_async_insert = 1", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "wait_for_async_insert = 1" + }, + { + "type": "rectangle", + "version": 8025, + "versionNonce": 1142325347, + "isDeleted": false, + "id": "IYdOW9I1xTMKTJosj30GX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10946.687808089993, + "y": 3360.0748238687197, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1130789857, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2058, + "versionNonce": 249195341, + "isDeleted": false, + "id": "_FbyIQaFzC0WBOSCXcGwb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11147.888998846875, + "y": 3435.6271183764197, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1765306031, + "groupIds": [ + "VDiG1DocIiukvG1E9yQR8" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2231, + "versionNonce": 852392963, + "isDeleted": false, + "id": "2aiIoEHfH-YeyGBsQfSIL", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11147.888998846875, + "y": 3445.1414435355587, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 936269761, + "groupIds": [ + "VDiG1DocIiukvG1E9yQR8" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2127, + "versionNonce": 74021293, + "isDeleted": false, + "id": "aV7bDtVPAiTMOI9XdIW4C", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11147.888998846875, + "y": 3454.6557686946976, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 884261071, + "groupIds": [ + "VDiG1DocIiukvG1E9yQR8" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2130, + "versionNonce": 1816527779, + "isDeleted": false, + "id": "Rh29BPVpHZ5EbvkDrW6oV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11061.71891291498, + "y": 3359.3983715612435, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 781170593, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8227, + "versionNonce": 1707588621, + "isDeleted": false, + "id": "MumMrQClgIVTc_aeyit88", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10946.50439559245, + "y": 3411.570744211162, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 220319471, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8303, + "versionNonce": 145463107, + "isDeleted": false, + "id": "B6yh7mf8KW5M3SAqUO4RU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10945.15460483089, + "y": 3497.8041194967814, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 702159745, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2241, + "versionNonce": 1525592685, + "isDeleted": false, + "id": "AxR63i3op5_Z0lr3SxcMI", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11061.343052814149, + "y": 3410.162401231318, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 218634511, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2311, + "versionNonce": 375240419, + "isDeleted": false, + "id": "jXSzypt57Z6MwfD2r4UNC", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.918389266475, + "y": 3495.1490552881155, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 971834209, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 7854, + "versionNonce": 1353178317, + "isDeleted": false, + "id": "viN28jDwCZLRzxbPm8qYD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10948.611222901638, + "y": 3029.992038547719, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1776295727, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1888, + "versionNonce": 1407902339, + "isDeleted": false, + "id": "7Bynw_FOhmEDYNADUePwl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.81241365852, + "y": 3105.54433305542, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 991424321, + "groupIds": [ + "AlbRq5oCO2_ZUbqffArRh" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1586281261, + "isDeleted": false, + "id": "eoOIvMh_KtX2QVo1rqEwh", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.81241365852, + "y": 3115.058658214559, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 370303311, + "groupIds": [ + "AlbRq5oCO2_ZUbqffArRh" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1957, + "versionNonce": 705796643, + "isDeleted": false, + "id": "bar4rLJDqgN6x_yIAMFd7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11149.81241365852, + "y": 3124.5729833736978, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1404722977, + "groupIds": [ + "AlbRq5oCO2_ZUbqffArRh" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1960, + "versionNonce": 1829162381, + "isDeleted": false, + "id": "J3Q335dN1YkNLoV15xyBg", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.642327726631, + "y": 3029.3155862402436, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 586637167, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8055, + "versionNonce": 1707105731, + "isDeleted": false, + "id": "pZTV2Gis7cMCK-GhVqRkb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10948.235362800808, + "y": 3081.295511286873, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 843305729, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8132, + "versionNonce": 458200045, + "isDeleted": false, + "id": "7dTfotbVGv3ZLMWMDnKgL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10947.078019642542, + "y": 3167.7213341757806, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1658296719, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2071, + "versionNonce": 840281443, + "isDeleted": false, + "id": "_sP0J4vAk4xFfi2xu-BKa", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11063.266467625801, + "y": 3080.0796159103184, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 187943649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2141, + "versionNonce": 1701875277, + "isDeleted": false, + "id": "gNV6gfYyyn_VbrnMX7wMY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11065.841804078127, + "y": 3165.0662699671157, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1256951727, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8010, + "versionNonce": 1382025475, + "isDeleted": false, + "id": "vcwOCQwmDPJLycZmVeU4j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10954.14697462351, + "y": 3682.325743899446, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1461307073, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2043, + "versionNonce": 172178605, + "isDeleted": false, + "id": "0nQNxLhAsQg5dNDliiSX7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11155.348165380392, + "y": 3757.878038407146, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 358334927, + "groupIds": [ + "dtDjaa7pTpGYGYdvGNe-A" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2216, + "versionNonce": 471724195, + "isDeleted": false, + "id": "lmVGruSF5NaGuBSdM4d17", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11155.348165380392, + "y": 3767.392363566286, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1351960225, + "groupIds": [ + "dtDjaa7pTpGYGYdvGNe-A" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2112, + "versionNonce": 829497101, + "isDeleted": false, + "id": "G6ykDBV-0ILG6ml87D1Rt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11155.348165380392, + "y": 3776.906688725424, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 591441903, + "groupIds": [ + "dtDjaa7pTpGYGYdvGNe-A" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2115, + "versionNonce": 821945411, + "isDeleted": false, + "id": "USHW4L2bxJUTINt6JYu6p", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11069.178079448497, + "y": 3681.6492915919707, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 844483201, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8212, + "versionNonce": 1366537581, + "isDeleted": false, + "id": "iXptNufhM6VXOZpXhWL0b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10953.771114522673, + "y": 3733.6292166386, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 513989135, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8288, + "versionNonce": 2027840483, + "isDeleted": false, + "id": "U_WUE9BHj3jgpyrUJ49Mu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 10952.613771364408, + "y": 3820.0550395275077, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 890950241, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2226, + "versionNonce": 1435795405, + "isDeleted": false, + "id": "ut74Ykqn19rhyLruk1o1n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11068.802219347666, + "y": 3732.4133212620445, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1551548463, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2297, + "versionNonce": 1540222851, + "isDeleted": false, + "id": "vuYuvrTMziW5dlYvcjNjn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11071.377555799992, + "y": 3817.3999753188427, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1303633473, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8180, + "versionNonce": 1007355683, + "isDeleted": false, + "id": "ziz5U4AHNE05XNxEUV_RN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11801.142829149712, + "y": 3357.0968931548437, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 855708961, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2213, + "versionNonce": 593932429, + "isDeleted": false, + "id": "c1PwyUB-GOq8A6H1AINUl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12002.344019906594, + "y": 3432.6491876625437, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1226770799, + "groupIds": [ + "BaikFKfAK7E_cKcSJFHpb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2386, + "versionNonce": 805579459, + "isDeleted": false, + "id": "8QoIeYrd9Biqt4x6cVhxo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12002.344019906594, + "y": 3442.1635128216826, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 591644929, + "groupIds": [ + "BaikFKfAK7E_cKcSJFHpb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2282, + "versionNonce": 1639651053, + "isDeleted": false, + "id": "_kFMFYBZspxagDHEo83ZH", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12002.344019906594, + "y": 3451.6778379808216, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 2054816655, + "groupIds": [ + "BaikFKfAK7E_cKcSJFHpb" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2285, + "versionNonce": 2086132323, + "isDeleted": false, + "id": "7kU808MNImIHGuzKzfLvf", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11916.173933974698, + "y": 3356.4204408473674, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 80019681, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8382, + "versionNonce": 2037625165, + "isDeleted": false, + "id": "9r7NcOrR4aNLUvURSOWbS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11800.959416652166, + "y": 3408.592813497286, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1454422447, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8458, + "versionNonce": 1305777667, + "isDeleted": false, + "id": "ubWP0wfyZ5QsVrvlIqa4I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11799.60962589061, + "y": 3494.8261887829053, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 890518721, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2396, + "versionNonce": 401211309, + "isDeleted": false, + "id": "LL82mbBZKNEX7E97g3N9F", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11915.798073873868, + "y": 3407.184470517442, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 48999375, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2466, + "versionNonce": 863559075, + "isDeleted": false, + "id": "NTNR1x7Hz2_jl6dCQ4Dva", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11918.373410326194, + "y": 3492.1711245742395, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 869334177, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8009, + "versionNonce": 55017997, + "isDeleted": false, + "id": "BPbI-pzlVJWzz0VKmiSGn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11803.066243961357, + "y": 3027.014107833843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1799576047, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2043, + "versionNonce": 1483944259, + "isDeleted": false, + "id": "zsHl9mSslN3hICr_if6yK", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12004.267434718238, + "y": 3102.5664023415434, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1621803137, + "groupIds": [ + "GJmb3oJHg1SrPhlhubiqt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2216, + "versionNonce": 8763501, + "isDeleted": false, + "id": "vpkaRXh35Dqj7WK7tnapD", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12004.267434718238, + "y": 3112.0807275006823, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1690321935, + "groupIds": [ + "GJmb3oJHg1SrPhlhubiqt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2112, + "versionNonce": 2116161763, + "isDeleted": false, + "id": "7yfg7aL65VWc06PJnVieq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12004.267434718238, + "y": 3121.5950526598212, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 2036402273, + "groupIds": [ + "GJmb3oJHg1SrPhlhubiqt" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2115, + "versionNonce": 2037261005, + "isDeleted": false, + "id": "-PONHZbeWcaSELx-4w7xz", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11918.09734878635, + "y": 3026.3376555263676, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 257616431, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8210, + "versionNonce": 907279491, + "isDeleted": false, + "id": "Ta2DTCNo-H7H5hyFrozJC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11802.690383860527, + "y": 3078.3175805729966, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1472418881, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8287, + "versionNonce": 1654276397, + "isDeleted": false, + "id": "Z0ZmqhoY_08H9xoijWIqt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11801.533040702261, + "y": 3164.7434034619046, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 2012990543, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2226, + "versionNonce": 1543992355, + "isDeleted": false, + "id": "xatSANBjvVijniigEF9OF", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11917.72148868552, + "y": 3077.101685196442, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1873880097, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2296, + "versionNonce": 1634964365, + "isDeleted": false, + "id": "fQqghPsYUR6hAjb8Ut7uU", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11920.296825137846, + "y": 3162.088339253239, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 2054908527, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8165, + "versionNonce": 1340798915, + "isDeleted": false, + "id": "TN0S4WRgv9ljtxPoVxfMe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11808.601995683226, + "y": 3679.34781318557, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 219805697, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2198, + "versionNonce": 842242541, + "isDeleted": false, + "id": "pSHdUmsJdsopwlwDcoHfG", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12009.803186440107, + "y": 3754.90010769327, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1671578767, + "groupIds": [ + "hAXDLk53p66dDHQES9Ls3" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2371, + "versionNonce": 1876756323, + "isDeleted": false, + "id": "MJImwjrzupofDn03QZLzS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12009.803186440107, + "y": 3764.41443285241, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1375555553, + "groupIds": [ + "hAXDLk53p66dDHQES9Ls3" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2267, + "versionNonce": 1306776653, + "isDeleted": false, + "id": "hTQVLdlZDB3yRAD5ZuXJq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12009.803186440107, + "y": 3773.928758011548, + "strokeColor": "#000000", + "backgroundColor": "#31303d", + "width": 11, + "height": 46, + "seed": 1395186351, + "groupIds": [ + "hAXDLk53p66dDHQES9Ls3" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": ".", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2270, + "versionNonce": 1378624259, + "isDeleted": false, + "id": "CfA9T6orB6dHSYaWt0x7d", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11923.633100508216, + "y": 3678.6713608780947, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1953147841, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "rectangle", + "version": 8367, + "versionNonce": 1348321965, + "isDeleted": false, + "id": "aPjHudTPMcgtXIrW6c3pI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11808.226135582392, + "y": 3730.651285924724, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1572318415, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8443, + "versionNonce": 1062652579, + "isDeleted": false, + "id": "PSVCS5G7PGQG0iPPypxQL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11807.068792424127, + "y": 3817.0771088136316, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 414.1541017154242, + "height": 42.079701266153464, + "seed": 1015122849, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2381, + "versionNonce": 508224781, + "isDeleted": false, + "id": "NTw2RdcN_QV6vazLQUA0d", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11923.257240407385, + "y": 3729.4353905481685, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1860647663, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 2452, + "versionNonce": 1812692547, + "isDeleted": false, + "id": "ZOtFdqAWvj2Jc45Dh-hoQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11925.832576859711, + "y": 3814.4220446049667, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 184.09189206544056, + "height": 45.39252133120452, + "seed": 1114730369, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row values", + "baseline": 32.39252133120452, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row values" + }, + { + "type": "text", + "version": 830, + "versionNonce": 1932049891, + "isDeleted": false, + "id": "qj6hv-WOiJhA9USWOHQ9p", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11771.021756865077, + "y": -323.41194902328493, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 979582115, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "text", + "version": 833, + "versionNonce": 1060423117, + "isDeleted": false, + "id": "AXuo8IqvL5-2aw3co9o7t", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 11790.304811255894, + "y": 2867.8935130919144, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 1999681251, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "text", + "version": 717, + "versionNonce": 264046979, + "isDeleted": false, + "id": "btddqkw1cZS62_THR2GYh", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12683.94961784368, + "y": -325.0135316138835, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 1377695565, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "text", + "version": 678, + "versionNonce": 496272429, + "isDeleted": false, + "id": "VNX0MVuuZ5Kl2GuOrpQxt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12701.094559476043, + "y": 2872.2978652160627, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 1674277123, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "text", + "version": 1380, + "versionNonce": 386326819, + "isDeleted": false, + "id": "g7-WS88S7JoAMr2mrsptm", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12326.288227843892, + "y": -2940.675759076498, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1678436461, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1503, + "versionNonce": 1781364365, + "isDeleted": false, + "id": "6fyUyh2YBG2MD71WbAfGC", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12323.509990871042, + "y": -2619.5338150727944, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1540880717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1559, + "versionNonce": 846513347, + "isDeleted": false, + "id": "8eDBGTeemF7ORaQbQcCC7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12324.015643259972, + "y": -2270.6228942437424, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1831670019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1572, + "versionNonce": 1874402541, + "isDeleted": false, + "id": "x_eolzVi2Mg95cM0UuSxk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12315.293707918483, + "y": 739.602421190865, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1566931203, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526042750, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1559, + "versionNonce": 134090573, + "isDeleted": false, + "id": "s37cDZFs6IJmoX27kEN36", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12338.720101626945, + "y": 3939.5894787966467, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 402576397, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526049982, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 2303, + "versionNonce": 509947331, + "isDeleted": false, + "id": "sjwBpE5-_ikOWdPUq0yP6", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 12315.032301894369, + "y": 664.1448671068708, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 311, + "height": 59, + "seed": 1250473507, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664526062894, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "(buffer flush)", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "(buffer flush)" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/cloud/bestpractices/images/partitioning-01.png b/docs/ja/cloud/bestpractices/images/partitioning-01.png new file mode 100644 index 00000000000..9e247f9a624 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/partitioning-01.png differ diff --git a/docs/ja/cloud/bestpractices/images/partitioning-02.png b/docs/ja/cloud/bestpractices/images/partitioning-02.png new file mode 100644 index 00000000000..d950418eb18 Binary files /dev/null and b/docs/ja/cloud/bestpractices/images/partitioning-02.png differ diff --git a/docs/ja/cloud/bestpractices/images/partitioning.excalidraw b/docs/ja/cloud/bestpractices/images/partitioning.excalidraw new file mode 100644 index 00000000000..7f9a2d7d2ad --- /dev/null +++ b/docs/ja/cloud/bestpractices/images/partitioning.excalidraw @@ -0,0 +1,2143 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 8392, + "versionNonce": 1227065807, + "isDeleted": false, + "id": "ytCCGuuNAl5mXEevQ2lnb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 1146.2109714243088, + "y": 513.407612987312, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1340.6118210378552, + "seed": 1187087823, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "nvI7iaZJc_sIHmKpMgIRb", + "type": "arrow" + }, + { + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "type": "arrow" + }, + { + "id": "ZOS1J46buP8mtNNhrfw0Z", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 648, + "versionNonce": 2054765857, + "isDeleted": false, + "id": "2U1NfEIC2koZguRQyXHWo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1178.209094859074, + "y": 549.6215312910845, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 610124449, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "rectangle", + "version": 7474, + "versionNonce": 1947074209, + "isDeleted": false, + "id": "gNVuw3A600BXCoHv3EC7c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1265.417474754835, + "y": 994.6497055136697, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 726529007, + "groupIds": [ + "eDtfL_Sgf5F8PSFREEFF-" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1147, + "versionNonce": 309156751, + "isDeleted": false, + "id": "i5zJoABS_6-sDiT1QdU2G", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1282.616099027975, + "y": 1043.2616824546585, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 295.8908110752025, + "height": 93.15081089404521, + "seed": 1873725057, + "groupIds": [ + "eDtfL_Sgf5F8PSFREEFF-" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 73.12153761678803, + "fontFamily": 1, + "text": "p2 Part", + "baseline": 65.15081089404521, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "p2 Part" + }, + { + "type": "rectangle", + "version": 7542, + "versionNonce": 449804271, + "isDeleted": false, + "id": "HBQehfo4MHRh5w3tvalRT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1270.3958273975732, + "y": 1231.9362684673142, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 1013423631, + "groupIds": [ + "uFV2oeSZ1fgqwbQx4K8SQ" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "ZOS1J46buP8mtNNhrfw0Z", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1219, + "versionNonce": 1184720065, + "isDeleted": false, + "id": "YdUFQp_xcMayIzqoiOO6m", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1288.516377154232, + "y": 1284.2083456618957, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 287.042075503265, + "height": 91.20963146832715, + "seed": 1442074209, + "groupIds": [ + "uFV2oeSZ1fgqwbQx4K8SQ" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 71.59775029774868, + "fontFamily": 1, + "text": "p3 Part", + "baseline": 64.20963146832715, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "p3 Part" + }, + { + "type": "rectangle", + "version": 7251, + "versionNonce": 1442284161, + "isDeleted": false, + "id": "liaaaHSb5LS68aKA8ueyk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1263.1816070109999, + "y": 754.7917901459059, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 1829176367, + "groupIds": [ + "2-WexmjQimmSUbUglwKwC" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "nvI7iaZJc_sIHmKpMgIRb", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 909, + "versionNonce": 383103471, + "isDeleted": false, + "id": "tp7k4CGVLbyjHzwDqa9tV", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1286.8524369793122, + "y": 794.1194366211439, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 288, + "height": 102, + "seed": 234740289, + "groupIds": [ + "2-WexmjQimmSUbUglwKwC" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 80.06797541887164, + "fontFamily": 1, + "text": "p1 Part", + "baseline": 71, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "p1 Part" + }, + { + "type": "rectangle", + "version": 8603, + "versionNonce": 1226351119, + "isDeleted": false, + "id": "6BrYz5A_65JCBILSCP-Rb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 208.66509472515827, + "y": 515.9011653592916, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1335.3865333455474, + "seed": 1024763471, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "type": "arrow" + }, + { + "id": "ZOS1J46buP8mtNNhrfw0Z", + "type": "arrow" + }, + { + "id": "nvI7iaZJc_sIHmKpMgIRb", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 808, + "versionNonce": 1735949377, + "isDeleted": false, + "id": "SU1wj2by1cKenGjLc1kbu", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 264.5118131009185, + "y": 552.8911457395243, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 1219160609, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "image", + "version": 7622, + "versionNonce": 1808108129, + "isDeleted": false, + "id": "z4xzMa6CG3-iUpwM8j5t8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 664.9973159598812, + "y": 548.5807935464818, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 459867247, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1618, + "versionNonce": 1819369871, + "isDeleted": false, + "id": "nvI7iaZJc_sIHmKpMgIRb", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 793.4982581488621, + "y": 1066.5072897775426, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 456.004113499861, + "height": 206.85168414643067, + "seed": 1860894209, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": 0.022857239875283614, + "gap": 11.790189979089519, + "elementId": "6BrYz5A_65JCBILSCP-Rb" + }, + "endBinding": { + "focus": 0.41625427260255443, + "gap": 13.679235362276813, + "elementId": "liaaaHSb5LS68aKA8ueyk" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 456.004113499861, + -206.85168414643067 + ] + ] + }, + { + "type": "arrow", + "version": 2357, + "versionNonce": 1459258081, + "isDeleted": false, + "id": "HPb8eRyX_GzXs4w6r6T9Q", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 790.5542163049286, + "y": 1102.5390659111563, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 457.71830960552325, + "height": 0.7691905232532008, + "seed": 130850447, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.12056576898605727, + "gap": 8.846148135156, + "elementId": "6BrYz5A_65JCBILSCP-Rb" + }, + "endBinding": { + "focus": -0.13872800851895606, + "gap": 17.144948844385, + "elementId": "gNVuw3A600BXCoHv3EC7c" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 457.71830960552325, + -0.7691905232532008 + ] + ] + }, + { + "type": "arrow", + "version": 2415, + "versionNonce": 235689903, + "isDeleted": false, + "id": "ZOS1J46buP8mtNNhrfw0Z", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 792.3176841712157, + "y": 1136.7878431507952, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 464.8585314017764, + "height": 188.7879937583566, + "seed": 532518369, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.2136039098150314, + "gap": 10.6096160014431, + "elementId": "6BrYz5A_65JCBILSCP-Rb" + }, + "endBinding": { + "focus": -0.4506101730849665, + "gap": 13.219611824582898, + "elementId": "HBQehfo4MHRh5w3tvalRT" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 464.8585314017764, + 188.7879937583566 + ] + ] + }, + { + "type": "text", + "version": 1737, + "versionNonce": 2106011599, + "isDeleted": false, + "id": "IMMDHmEFDIX4XiDFJvLl1", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -575.8442671654957, + "y": 448.52679181050735, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 511, + "height": 177, + "seed": 1962407087, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "One insert statement\nto a table \nwith a partitioning key", + "baseline": 160, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "One insert statement\nto a table \nwith a partitioning key" + }, + { + "type": "text", + "version": 1837, + "versionNonce": 1491302369, + "isDeleted": false, + "id": "Tcrvvv55VlBbr7vVgffEp", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 836.67647335332, + "y": 1044.8510036585758, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1848783297, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "text", + "version": 1907, + "versionNonce": 857289391, + "isDeleted": false, + "id": "YjlyyRnrt7Ylre3oOEZw_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 5.878136486069045, + "x": 805.6496778206056, + "y": 916.008548841548, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 1788053199, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "rectangle", + "version": 9601, + "versionNonce": 1157072943, + "isDeleted": false, + "id": "jhBuDNqZYlJjCRfKQIRjZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": -612.5562085513739, + "y": 647.6077528341903, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 632.8936334499986, + "height": 443.819296284645, + "seed": 1600672161, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8105, + "versionNonce": 232588495, + "isDeleted": false, + "id": "rGimYRCmNzXs601Y-_DRz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -596.7125836977539, + "y": 660.2425398916548, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1731712239, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2346, + "versionNonce": 234730401, + "isDeleted": false, + "id": "7e3Suymps2XLBcuGnqe2u", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -586.9085938875069, + "y": 661.6909858169511, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 571, + "height": 44, + "seed": 680490369, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row with partitioning key value p1", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p1" + }, + { + "type": "rectangle", + "version": 8287, + "versionNonce": 547459823, + "isDeleted": false, + "id": "uN2cLElqqsu7q_mg4YUDG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -597.2104803172842, + "y": 720.1080842102838, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 40722191, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2528, + "versionNonce": 1646827393, + "isDeleted": false, + "id": "1YbCbJqKQ8agLm9B9SB17", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -587.4064905070336, + "y": 721.55653013558, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 571, + "height": 44, + "seed": 753343841, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row with partitioning key value p1", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p1" + }, + { + "type": "rectangle", + "version": 8398, + "versionNonce": 602889487, + "isDeleted": false, + "id": "8KwJxRA3hSvwXtSmoxXvk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -595.6929856487986, + "y": 780.327410341537, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1319937327, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2702, + "versionNonce": 1527512929, + "isDeleted": false, + "id": "zPAR13QXWuo3KVyIVbkvJ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -584.888995838548, + "y": 782.6591494062359, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 573.1653197288124, + "height": 42.96298819091612, + "seed": 1002359105, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.41208789220834, + "fontFamily": 1, + "text": "row with partitioning key value p2", + "baseline": 29.96298819091612, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p2" + }, + { + "type": "rectangle", + "version": 8506, + "versionNonce": 725541679, + "isDeleted": false, + "id": "9LIQNrk4yjEzIk4tvFO51", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -596.0797616563832, + "y": 841.8644648811187, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 2069768015, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2789, + "versionNonce": 1459055425, + "isDeleted": false, + "id": "o2FgNu9pmx50HxL9ZeUgi", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -585.7757718461326, + "y": 844.1454760331981, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 572.864491742517, + "height": 43.01371610353369, + "seed": 242612513, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.45271945581906, + "fontFamily": 1, + "text": "row with partitioning key value p3", + "baseline": 30.01371610353369, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p3" + }, + { + "type": "rectangle", + "version": 8583, + "versionNonce": 1190700367, + "isDeleted": false, + "id": "nSMnYrc18ZX6n28zgbjdM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -597.3075751356955, + "y": 905.2758954574438, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 920282479, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2872, + "versionNonce": 1045060385, + "isDeleted": false, + "id": "Q6BeQetN84MzgOOphoMT-", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -587.1741158735385, + "y": 907.5806845167008, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 574.5950664431072, + "height": 43.14365686603535, + "seed": 108801281, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.556798178651775, + "fontFamily": 1, + "text": "row with partitioning key value p3", + "baseline": 30.14365686603535, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p3" + }, + { + "type": "rectangle", + "version": 8684, + "versionNonce": 1718952815, + "isDeleted": false, + "id": "080dLIBHN4iyHp-90Mhu3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -597.2995936802945, + "y": 967.1898086710771, + "strokeColor": "#000000", + "backgroundColor": "#3f78ec", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1349115791, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2950, + "versionNonce": 1098141441, + "isDeleted": false, + "id": "GoGIR65l13G0boADpkaiZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -588.4956038700439, + "y": 968.9469168193446, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 580.8314185457511, + "height": 43.537619107347616, + "seed": 726721761, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 34.872350328190464, + "fontFamily": 1, + "text": "row with partitioning key value p2", + "baseline": 30.537619107347616, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p2" + }, + { + "type": "rectangle", + "version": 8847, + "versionNonce": 2046614927, + "isDeleted": false, + "id": "BhascU_S-8OKk8c9oVSEU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -599.640084392835, + "y": 1031.7764432704407, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 440735151, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3088, + "versionNonce": 1458882273, + "isDeleted": false, + "id": "_44rpKtL53AtsvgYAPjla", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -589.8360945825843, + "y": 1033.2248891957333, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 571, + "height": 44, + "seed": 1753456833, + "groupIds": [ + "iFwwsrTMeNAlW1UFhQsWp" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row with partitioning key value p1", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row with partitioning key value p1" + }, + { + "type": "arrow", + "version": 2232, + "versionNonce": 1422414767, + "isDeleted": false, + "id": "5chJcUtzPG7EIT7tbAgEQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -667.2743215585033, + "y": 1106.5483905154306, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 839.4409531609472, + "height": 0.049243034357004944, + "seed": 194283471, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 839.4409531609472, + -0.049243034357004944 + ] + ] + }, + { + "type": "text", + "version": 2047, + "versionNonce": 2036024001, + "isDeleted": false, + "id": "PaH1GTDE9O9k8-ruU5SJS", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0.35292370782435256, + "x": 803.7652428088804, + "y": 1220.5199159714066, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 196337825, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082345, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "rectangle", + "version": 8692, + "versionNonce": 1313314369, + "isDeleted": false, + "id": "tY0lEpRAtvwvYaLCWr6rH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 1134.231348113888, + "y": -1043.3382565332922, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1340.6118210378552, + "seed": 577811951, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "mkx18XmSxEj5Vcu4Arum6", + "type": "arrow" + }, + { + "id": "6mbk2of81QqkwqeCTJHEw", + "type": "arrow" + }, + { + "id": "zRPoWxUngFL8GlzLlat0E", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 947, + "versionNonce": 652897487, + "isDeleted": false, + "id": "k3bIG421DCIliNMg3xCR7", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1166.2294715486532, + "y": -1007.1243382295197, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 498, + "height": 59, + "seed": 43066497, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "rectangle", + "version": 7776, + "versionNonce": 1280617039, + "isDeleted": false, + "id": "odJGlE-0FJvpHrIQ0RkOM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1253.437851444418, + "y": -562.0961640069345, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 331.74912391788905, + "height": 187.53194150601996, + "seed": 98705423, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "6mbk2of81QqkwqeCTJHEw", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1450, + "versionNonce": 228765569, + "isDeleted": false, + "id": "QKg4x_DVd1UVUPqXrzKUZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1333.2808458953805, + "y": -513.4841870659457, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 171, + "height": 93, + "seed": 1490742369, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 73.12153761678803, + "fontFamily": 1, + "text": "Part", + "baseline": 65, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Part" + }, + { + "type": "rectangle", + "version": 8905, + "versionNonce": 1348281889, + "isDeleted": false, + "id": "3_yFoyRHAuHMrV5fXruVD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 196.68547141473755, + "y": -1040.8447041613126, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 573.0429734446138, + "height": 1335.3865333455474, + "seed": 1742816815, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + }, + { + "id": "6mbk2of81QqkwqeCTJHEw", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1107, + "versionNonce": 1063602991, + "isDeleted": false, + "id": "5gukj8EzYoTsYPfJxgSHB", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 252.5321897904978, + "y": -1003.8547237810799, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 373, + "height": 59, + "seed": 1986050113, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "ClickHouse Cloud", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Cloud" + }, + { + "type": "image", + "version": 7922, + "versionNonce": 1275627631, + "isDeleted": false, + "id": "zYmWY1RWdJgQ5PzPmB-k-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 653.0176926494605, + "y": -1008.1650759741224, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 69.82062964662826, + "height": 62.056575629923195, + "seed": 659990607, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 3259, + "versionNonce": 1766424257, + "isDeleted": false, + "id": "6mbk2of81QqkwqeCTJHEw", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": 778.5745929945078, + "y": -454.2068036094479, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 457.71830960552325, + "height": 0.7691905232532008, + "seed": 486672417, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.12056576898605588, + "gap": 8.846148135156, + "elementId": "3_yFoyRHAuHMrV5fXruVD" + }, + "endBinding": { + "focus": -0.1387280085189851, + "gap": 17.144948844386818, + "elementId": "odJGlE-0FJvpHrIQ0RkOM" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 457.71830960552325, + -0.7691905232532008 + ] + ] + }, + { + "type": "text", + "version": 2038, + "versionNonce": 299594529, + "isDeleted": false, + "id": "JkleSkvUtz1cgLpuEFlLW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -595.8238904759164, + "y": -1108.0194340251674, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 527, + "height": 177, + "seed": 840615535, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "One insert statement\nto a table \nwith no partitioning key", + "baseline": 160, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "One insert statement\nto a table \nwith no partitioning key" + }, + { + "type": "text", + "version": 2136, + "versionNonce": 572623727, + "isDeleted": false, + "id": "q8IymnOBsiDPsKuJ_iBLn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 824.6968500428993, + "y": -511.8948658620302, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 310, + "height": 59, + "seed": 648961025, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 46.674424870051325, + "fontFamily": 1, + "text": "write request", + "baseline": 42, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write request" + }, + { + "type": "rectangle", + "version": 9903, + "versionNonce": 1022736897, + "isDeleted": false, + "id": "Sz1E7l4chxIw_8w_1bqa8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": -624.5358318617946, + "y": -909.2859706537874, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 632.8936334499986, + "height": 443.819296284645, + "seed": 653664399, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "OI5QQaDo2-dUJpru_TigX", + "type": "arrow" + }, + { + "id": "G5dDrKKKvk9yYrUHFcQq2", + "type": "arrow" + }, + { + "id": "JoNx2LU7OR76D9NccpSzy", + "type": "arrow" + } + ], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8406, + "versionNonce": 1406944655, + "isDeleted": false, + "id": "fOMUBMRGRcnjdpazp7psn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -608.692207008171, + "y": -896.6511835963229, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 56964065, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2648, + "versionNonce": 455073505, + "isDeleted": false, + "id": "gdhALTIy442Ipa0DWa4wQ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -350.8882171979276, + "y": -895.2027376710266, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 933312175, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "rectangle", + "version": 8588, + "versionNonce": 242924463, + "isDeleted": false, + "id": "OIjrC_2jIZyGjoZedd4Is", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -609.190103627705, + "y": -836.7856392776939, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 2000031681, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8700, + "versionNonce": 946035393, + "isDeleted": false, + "id": "PaBqBdJZsQvP9YxksSM-G", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -607.6726089592194, + "y": -776.5663131464407, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1254394063, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8808, + "versionNonce": 1982164431, + "isDeleted": false, + "id": "wq776HHlWhs-_oxx39OOD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -608.0593849668003, + "y": -715.029258606859, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 406876065, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8885, + "versionNonce": 2072795809, + "isDeleted": false, + "id": "j2w7ND7W09iLpxz-rXGz1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -609.2871984461162, + "y": -651.6178280305339, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 1576572655, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8986, + "versionNonce": 368368623, + "isDeleted": false, + "id": "oShdRrQzd2oRbBtnVD3yI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -609.2792169907152, + "y": -589.7039148169006, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 213111681, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 9148, + "versionNonce": 357195393, + "isDeleted": false, + "id": "BP_YtM86AN_kYWrmX4ElW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -611.6197077032557, + "y": -525.117280217537, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 597.3727241313998, + "height": 46.84180196316288, + "seed": 667279631, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 2531, + "versionNonce": 32605711, + "isDeleted": false, + "id": "XhekCJTItof9UkArjLoLv", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 70, + "angle": 0, + "x": -679.2539448689204, + "y": -450.1974790051736, + "strokeColor": "#000000", + "backgroundColor": "#ef9236", + "width": 839.4409531609472, + "height": 0.049243034357004944, + "seed": 147831649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 839.4409531609472, + -0.049243034357004944 + ] + ] + }, + { + "type": "text", + "version": 2718, + "versionNonce": 1952245345, + "isDeleted": false, + "id": "bURwFMyU6EGVRTpVpNt9e", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -355.8928036015204, + "y": -833.8691935706102, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 2040850223, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 2783, + "versionNonce": 957606959, + "isDeleted": false, + "id": "c8j0IrT_RH-FBPWFVopf0", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -354.0435519338971, + "y": -772.4449061587493, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 216246081, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 2865, + "versionNonce": 59994689, + "isDeleted": false, + "id": "KXf8lrRU_PcdBLk21aCfX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -355.51282038214777, + "y": -711.7679190783219, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 1644046671, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 2938, + "versionNonce": 1195675215, + "isDeleted": false, + "id": "GktA0qQQ5YeSySgXCr8l_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -353.89789169980577, + "y": -651.8635645439626, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 1666127649, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 3036, + "versionNonce": 667779617, + "isDeleted": false, + "id": "ieCANeOQpEEdVo4agRv90", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -354.32853934842933, + "y": -586.8041043334179, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 237643631, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + }, + { + "type": "text", + "version": 3110, + "versionNonce": 660335727, + "isDeleted": false, + "id": "b2rV3wYSFJovt1VvCL4Qt", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -353.48624321215175, + "y": -522.6312716347547, + "strokeColor": "#ffffff", + "backgroundColor": "#ef9236", + "width": 75, + "height": 44, + "seed": 1585548033, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1665051082346, + "link": null, + "locked": false, + "fontSize": 35.242703801904284, + "fontFamily": 1, + "text": "row ", + "baseline": 31, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "row " + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/cloud/bestpractices/partitioningkey.md b/docs/ja/cloud/bestpractices/partitioningkey.md new file mode 100644 index 00000000000..99ce06be220 --- /dev/null +++ b/docs/ja/cloud/bestpractices/partitioningkey.md @@ -0,0 +1,18 @@ +--- +slug: /ja/cloud/bestpractices/low-cardinality-partitioning-key +sidebar_label: 低カーディナリティのパーティションキーを選択 +title: 低カーディナリティのパーティションキーを選択 +--- + +大量の行を含むべき[前のセクション](#ingest-data-in-bulk)で述べたインサートステートメントをClickHouse Cloudのテーブルに送信し、そのテーブルが[パーティションキー](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md)を使用していない場合、そのインサートからのすべての行データはストレージの新しいパートに書き込まれます。 + +![compression block diagram](images/partitioning-01.png) + +しかし、ClickHouse Cloudのテーブルにインサートステートメントを送信し、そのテーブルがパーティションキーを持っている場合、ClickHouseは次の処理を行います: +- インサートに含まれる行のパーティションキーの値を確認します +- 異なるパーティションキーの値ごとにストレージに新しいパートを作成します +- パーティションキーの値によって対応するパートに行を配置します + +![compression block diagram](images/partitioning-02.png) + +したがって、ClickHouse Cloudオブジェクトストレージへの書き込み要求の数を最小限に抑えるためには、低カーディナリティのパーティションキーを使用するか、テーブルにパーティションキーを使用しないようにすることをお勧めします。 diff --git a/docs/ja/cloud/changelogs/changelog-24-5.md b/docs/ja/cloud/changelogs/changelog-24-5.md new file mode 100644 index 00000000000..4e2f2fb3ac5 --- /dev/null +++ b/docs/ja/cloud/changelogs/changelog-24-5.md @@ -0,0 +1,181 @@ +--- +slug: /ja/changelogs/24.5 +title: v24.5 Changelog for Cloud +description: Fast release changelog for v24.5 +keywords: [chaneglog, cloud] +--- + +# v24.5 Changelog for Cloud + +Relevant changes for ClickHouse Cloud services based on the v24.5 release. + +## Breaking Changes + +* Change the column name from duration_ms to duration_microseconds in the system.zookeeper table to reflect the reality that the duration is in the microsecond resolution. [#60774](https://github.com/ClickHouse/ClickHouse/pull/60774) (Duc Canh Le). + +* Don't allow to set max_parallel_replicas to 0 as it doesn't make sense. Setting it to 0 could lead to unexpected logical errors. Closes #60140. [#61201](https://github.com/ClickHouse/ClickHouse/pull/61201) (Kruglov Pavel). + +* Remove support for INSERT WATCH query (part of the experimental LIVE VIEW feature). [#62382](https://github.com/ClickHouse/ClickHouse/pull/62382) (Alexey Milovidov). + +* Usage of functions neighbor, runningAccumulate, runningDifferenceStartingWithFirstValue, runningDifference deprecated (because it is error-prone). Proper window functions should be used instead. To enable them back, set allow_deprecated_error_prone_window_functions=1. [#63132](https://github.com/ClickHouse/ClickHouse/pull/63132) (Nikita Taranov). + + +## Backward Incompatible Changes + +* In the new ClickHouse version, the functions geoDistance, greatCircleDistance, and greatCircleAngle will use 64-bit double precision floating point data type for internal calculations and return type if all the arguments are Float64. This closes #58476. In previous versions, the function always used Float32. You can switch to the old behavior by setting geo_distance_returns_float64_on_float64_arguments to false or setting compatibility to 24.2 or earlier. [#61848](https://github.com/ClickHouse/ClickHouse/pull/61848) (Alexey Milovidov). + +* Queries from system.columns will work faster if there is a large number of columns, but many databases or tables are not granted for SHOW TABLES. Note that in previous versions, if you grant SHOW COLUMNS to individual columns without granting SHOW TABLES to the corresponding tables, the system.columns table will show these columns, but in a new version, it will skip the table entirely. Remove trace log messages "Access granted" and "Access denied" that slowed down queries. [#63439](https://github.com/ClickHouse/ClickHouse/pull/63439) (Alexey Milovidov). + +* Fix crash in largestTriangleThreeBuckets. This changes the behaviour of this function and makes it to ignore NaNs in the series provided. Thus the resultset might differ from previous versions. [#62646](https://github.com/ClickHouse/ClickHouse/pull/62646) (Raúl Marín). + +## New Features + +* The new analyzer is enabled by default on new services. + +* Supports dropping multiple tables at the same time like drop table a,b,c;. [#58705](https://github.com/ClickHouse/ClickHouse/pull/58705) (zhongyuankai). + +* User can now parse CRLF with TSV format using a setting input_format_tsv_crlf_end_of_line. Closes #56257. [#59747](https://github.com/ClickHouse/ClickHouse/pull/59747) (Shaun Struwig). + +* Table engine is grantable now, and it won't affect existing users behavior. [#60117](https://github.com/ClickHouse/ClickHouse/pull/60117) (jsc0218). + +* Adds the Form Format to read/write a single record in the application/x-www-form-urlencoded format. [#60199](https://github.com/ClickHouse/ClickHouse/pull/60199) (Shaun Struwig). + +* Added possibility to compress in CROSS JOIN. [#60459](https://github.com/ClickHouse/ClickHouse/pull/60459) (p1rattttt). + +* New setting input_format_force_null_for_omitted_fields that forces NULL values for omitted fields. [#60887](https://github.com/ClickHouse/ClickHouse/pull/60887) (Constantine Peresypkin). + +* Support join with inequal conditions which involve columns from both left and right table. e.g. `t1.y < t2.y`. To enable, SET allow_experimental_join_condition = 1. [#60920](https://github.com/ClickHouse/ClickHouse/pull/60920) (lgbo). + +* Add a new function, getClientHTTPHeader. This closes #54665. Co-authored with @lingtaolf. [#61820](https://github.com/ClickHouse/ClickHouse/pull/61820) (Alexey Milovidov). + +* For convenience purpose, SELECT * FROM numbers() will work in the same way as SELECT * FROM system.numbers - without a limit. [#61969](https://github.com/ClickHouse/ClickHouse/pull/61969) (YenchangChan). + +* Modifying memory table settings through ALTER MODIFY SETTING is now supported. ALTER TABLE memory MODIFY SETTING min_rows_to_keep = 100, max_rows_to_keep = 1000;. [#62039](https://github.com/ClickHouse/ClickHouse/pull/62039) (zhongyuankai). + +* Analyzer support recursive CTEs. [#62074](https://github.com/ClickHouse/ClickHouse/pull/62074) (Maksim Kita). + +* Earlier our s3 storage and s3 table function didn't support selecting from archive files. I created a solution that allows to iterate over files inside archives in S3. [#62259](https://github.com/ClickHouse/ClickHouse/pull/62259) (Daniil Ivanik). + +* Support for conditional function clamp. [#62377](https://github.com/ClickHouse/ClickHouse/pull/62377) (skyoct). + +* Add npy output format. [#62430](https://github.com/ClickHouse/ClickHouse/pull/62430) (豪肥肥). + +* Analyzer support QUALIFY clause. Closes #47819. [#62619](https://github.com/ClickHouse/ClickHouse/pull/62619) (Maksim Kita). + +* Added role query parameter to the HTTP interface. It works similarly to SET ROLE x, applying the role before the statement is executed. This allows for overcoming the limitation of the HTTP interface, as multiple statements are not allowed, and it is not possible to send both SET ROLE x and the statement itself at the same time. It is possible to set multiple roles that way, e.g., ?role=x&role=y, which will be an equivalent of SET ROLE x, y. [#62669](https://github.com/ClickHouse/ClickHouse/pull/62669) (Serge Klochkov). + +* Add SYSTEM UNLOAD PRIMARY KEY. [#62738](https://github.com/ClickHouse/ClickHouse/pull/62738) (Pablo Marcos). + +* Added SQL functions generateUUIDv7, generateUUIDv7ThreadMonotonic, generateUUIDv7NonMonotonic (with different monotonicity/performance trade-offs) to generate version 7 UUIDs aka. timestamp-based UUIDs with random component. Also added a new function UUIDToNum to extract bytes from a UUID and a new function UUIDv7ToDateTime to extract timestamp component from a UUID version 7. [#62852](https://github.com/ClickHouse/ClickHouse/pull/62852) (Alexey Petrunyaka). + +* Raw as a synonym for TSVRaw. [#63394](https://github.com/ClickHouse/ClickHouse/pull/63394) (Unalian). + +* Added possibility to do cross join in temporary file if size exceeds limits. [#63432](https://github.com/ClickHouse/ClickHouse/pull/63432) (p1rattttt). + +## Performance Improvements + +* Skip merging of newly created projection blocks during INSERT-s. [#59405](https://github.com/ClickHouse/ClickHouse/pull/59405) (Nikita Taranov). + +* Reduce overhead of the mutations for SELECTs (v2). [#60856](https://github.com/ClickHouse/ClickHouse/pull/60856) (Azat Khuzhin). + +* JOIN filter push down improvements using equivalent sets. [#61216](https://github.com/ClickHouse/ClickHouse/pull/61216) (Maksim Kita). + +* Add a new analyzer pass to optimize in single value. [#61564](https://github.com/ClickHouse/ClickHouse/pull/61564) (LiuNeng). + +* Process string functions XXXUTF8 'asciily' if input strings are all ASCII chars. Inspired by apache/doris#29799. Overall speed up by 1.07x~1.62x. Notice that peak memory usage had been decreased in some cases. [#61632](https://github.com/ClickHouse/ClickHouse/pull/61632) (李扬). + +* Enabled fast Parquet encoder by default (output_format_parquet_use_custom_encoder). [#62088](https://github.com/ClickHouse/ClickHouse/pull/62088) (Michael Kolupaev). + +* Improve JSONEachRowRowInputFormat by skipping all remaining fields when all required fields are read. [#62210](https://github.com/ClickHouse/ClickHouse/pull/62210) (lgbo). + +* Functions splitByChar and splitByRegexp were speed up significantly. [#62392](https://github.com/ClickHouse/ClickHouse/pull/62392) (李扬). + +* Improve trivial insert select from files in file/s3/hdfs/url/... table functions. Add separate max_parsing_threads setting to control the number of threads used in parallel parsing. [#62404](https://github.com/ClickHouse/ClickHouse/pull/62404) (Kruglov Pavel). + +* Support parallel write buffer for AzureBlobStorage managed by setting azure_allow_parallel_part_upload. [#62534](https://github.com/ClickHouse/ClickHouse/pull/62534) (SmitaRKulkarni). + +* Functions to_utc_timestamp and from_utc_timestamp are now about 2x faster. [#62583](https://github.com/ClickHouse/ClickHouse/pull/62583) (KevinyhZou). + +* Functions parseDateTimeOrNull, parseDateTimeOrZero, parseDateTimeInJodaSyntaxOrNull and parseDateTimeInJodaSyntaxOrZero now run significantly faster (10x - 1000x) when the input contains mostly non-parseable values. [#62634](https://github.com/ClickHouse/ClickHouse/pull/62634) (LiuNeng). + +* Change HostResolver behavior on fail to keep only one record per IP [#62652](https://github.com/ClickHouse/ClickHouse/pull/62652) (Anton Ivashkin). + +* Add a new configurationprefer_merge_sort_block_bytes to control the memory usage and speed up sorting 2 times when merging when there are many columns. [#62904](https://github.com/ClickHouse/ClickHouse/pull/62904) (LiuNeng). + +* QueryPlan convert OUTER JOIN to INNER JOIN optimization if filter after JOIN always filters default values. Optimization can be controlled with setting query_plan_convert_outer_join_to_inner_join, enabled by default. [#62907](https://github.com/ClickHouse/ClickHouse/pull/62907) (Maksim Kita). + +* Enable optimize_rewrite_sum_if_to_count_if by default. [#62929](https://github.com/ClickHouse/ClickHouse/pull/62929) (Raúl Marín). + +* Micro-optimizations for the new analyzer. [#63429](https://github.com/ClickHouse/ClickHouse/pull/63429) (Raúl Marín). + +* Index analysis will work if DateTime is compared to DateTime64. This closes #63441. [#63443](https://github.com/ClickHouse/ClickHouse/pull/63443) (Alexey Milovidov). + +* Speed up indices of type set a little (around 1.5 times) by removing garbage. [#64098](https://github.com/ClickHouse/ClickHouse/pull/64098) (Alexey Milovidov). + +# Improvements + +* Remove optimize_monotonous_functions_in_order_by setting this is becoming a no-op. [#63004](https://github.com/ClickHouse/ClickHouse/pull/63004) (Raúl Marín). + +* Maps can now have Float32, Float64, Array(T), Map(K,V) and Tuple(T1, T2, ...) as keys. Closes #54537. [#59318](https://github.com/ClickHouse/ClickHouse/pull/59318) (李扬). + +* Add asynchronous WriteBuffer for AzureBlobStorage similar to S3. [#59929](https://github.com/ClickHouse/ClickHouse/pull/59929) (SmitaRKulkarni). + +* Multiline strings with border preservation and column width change. [#59940](https://github.com/ClickHouse/ClickHouse/pull/59940) (Volodyachan). + +* Make RabbitMQ nack broken messages. Closes #45350. [#60312](https://github.com/ClickHouse/ClickHouse/pull/60312) (Kseniia Sumarokova). + +* Add a setting first_day_of_week which affects the first day of the week considered by functions toStartOfInterval(..., INTERVAL ... WEEK). This allows for consistency with function toStartOfWeek which defaults to Sunday as the first day of the week. [#60598](https://github.com/ClickHouse/ClickHouse/pull/60598) (Jordi Villar). + +* Added persistent virtual column _block_offset which stores original number of row in block that was assigned at insert. Persistence of column _block_offset can be enabled by setting enable_block_offset_column. Added virtual column_part_data_version which contains either min block number or mutation version of part. Persistent virtual column _block_number is not considered experimental anymore. [#60676](https://github.com/ClickHouse/ClickHouse/pull/60676) (Anton Popov). + +* Functions date_diff and age now calculate their result at nanosecond instead of microsecond precision. They now also offer nanosecond (or nanoseconds or ns) as a possible value for the unit parameter. [#61409](https://github.com/ClickHouse/ClickHouse/pull/61409) (Austin Kothig). + +* Now marks are not loaded for wide parts during merges. [#61551](https://github.com/ClickHouse/ClickHouse/pull/61551) (Anton Popov). + +* Enable output_format_pretty_row_numbers by default. It is better for usability. [#61791](https://github.com/ClickHouse/ClickHouse/pull/61791) (Alexey Milovidov). + +* The progress bar will work for trivial queries with LIMIT from system.zeros, system.zeros_mt (it already works for system.numbers and system.numbers_mt), and the generateRandom table function. As a bonus, if the total number of records is greater than the max_rows_to_read limit, it will throw an exception earlier. This closes #58183. [#61823](https://github.com/ClickHouse/ClickHouse/pull/61823) (Alexey Milovidov). + +* Add TRUNCATE ALL TABLES. [#61862](https://github.com/ClickHouse/ClickHouse/pull/61862) (豪肥肥). + +* Add a setting input_format_json_throw_on_bad_escape_sequence, disabling it allows saving bad escape sequences in JSON input formats. [#61889](https://github.com/ClickHouse/ClickHouse/pull/61889) (Kruglov Pavel). + +* Fixed grammar from "a" to "the" in the warning message. There is only one Atomic engine, so it should be "to the new Atomic engine" instead of "to a new Atomic engine". [#61952](https://github.com/ClickHouse/ClickHouse/pull/61952) (shabroo). + +* Fix logical-error when undoing quorum insert transaction. [#61953](https://github.com/ClickHouse/ClickHouse/pull/61953) (Han Fei). + +* Automatically infer Nullable column types from Apache Arrow schema. [#61984](https://github.com/ClickHouse/ClickHouse/pull/61984) (Maksim Kita). + +* Allow to cancel parallel merge of aggregate states during aggregation. Example: uniqExact. [#61992](https://github.com/ClickHouse/ClickHouse/pull/61992) (Maksim Kita). + +* Dictionary source with INVALIDATE_QUERY is not reloaded twice on startup. [#62050](https://github.com/ClickHouse/ClickHouse/pull/62050) (vdimir). + +* OPTIMIZE FINAL for ReplicatedMergeTree now will wait for currently active merges to finish and then reattempt to schedule a final merge. This will put it more in line with ordinary MergeTree behaviour. [#62067](https://github.com/ClickHouse/ClickHouse/pull/62067) (Nikita Taranov). + +* While read data from a hive text file, it would use the first line of hive text file to resize of number of input fields, and sometimes the fields number of first line is not matched with the hive table defined , such as the hive table is defined to have 3 columns, like test_tbl(a Int32, b Int32, c Int32), but the first line of text file only has 2 fields, and in this suitation, the input fields will be resized to 2, and if the next line of the text file has 3 fields, then the third field can not be read but set a default value 0, which is not right. [#62086](https://github.com/ClickHouse/ClickHouse/pull/62086) (KevinyhZou). + +* The syntax highlighting while typing in the client will work on the syntax level (previously, it worked on the lexer level). [#62123](https://github.com/ClickHouse/ClickHouse/pull/62123) (Alexey Milovidov). + +* Fix an issue where when a redundant = 1 or = 0 is added after a boolean expression involving the primary key, the primary index is not used. For example, both `SELECT * FROM WHERE IN () = 1` and `SELECT * FROM
WHERE NOT IN () = 0` will both perform a full table scan, when the primary index can be used. [#62142](https://github.com/ClickHouse/ClickHouse/pull/62142) (josh-hildred). + +* Added setting lightweight_deletes_sync (default value: 2 - wait all replicas synchronously). It is similar to setting mutations_sync but affects only behaviour of lightweight deletes. [#62195](https://github.com/ClickHouse/ClickHouse/pull/62195) (Anton Popov). + +* Distinguish booleans and integers while parsing values for custom settings: SET custom_a = true; SET custom_b = 1;. [#62206](https://github.com/ClickHouse/ClickHouse/pull/62206) (Vitaly Baranov). + +* Support S3 access through AWS Private Link Interface endpoints. Closes #60021, #31074 and #53761. [#62208](https://github.com/ClickHouse/ClickHouse/pull/62208) (Arthur Passos). + +* Client has to send header 'Keep-Alive: timeout=X' to the server. If a client receives a response from the server with that header, client has to use the value from the server. Also for a client it is better not to use a connection which is nearly expired in order to avoid connection close race. [#62249](https://github.com/ClickHouse/ClickHouse/pull/62249) (Sema Checherinda). + +* Added nano- micro- milliseconds unit for date_trunc. [#62335](https://github.com/ClickHouse/ClickHouse/pull/62335) (Misz606). + +* The query cache now no longer caches results of queries against system tables (system.*, information_schema.*, INFORMATION_SCHEMA.*). [#62376](https://github.com/ClickHouse/ClickHouse/pull/62376) (Robert Schulze). + +* MOVE PARTITION TO TABLE query can be delayed or can throw TOO_MANY_PARTS exception to avoid exceeding limits on the part count. The same settings and limits are applied as for theINSERT query (see max_parts_in_total, parts_to_delay_insert, parts_to_throw_insert, inactive_parts_to_throw_insert, inactive_parts_to_delay_insert, max_avg_part_size_for_too_many_parts, min_delay_to_insert_ms and max_delay_to_insert settings). [#62420](https://github.com/ClickHouse/ClickHouse/pull/62420) (Sergei Trifonov). + +* Make transform always return the first match. [#62518](https://github.com/ClickHouse/ClickHouse/pull/62518) (Raúl Marín). + +* Avoid evaluating table DEFAULT expressions while executing RESTORE. [#62601](https://github.com/ClickHouse/ClickHouse/pull/62601) (Vitaly Baranov). + +* Allow quota key with different auth scheme in HTTP requests. [#62842](https://github.com/ClickHouse/ClickHouse/pull/62842) (Kseniia Sumarokova). + +* Close session if user's valid_until is reached. [#63046](https://github.com/ClickHouse/ClickHouse/pull/63046) (Konstantin Bogdanov). diff --git a/docs/ja/cloud/changelogs/changelog-24-6.md b/docs/ja/cloud/changelogs/changelog-24-6.md new file mode 100644 index 00000000000..bcfc4158869 --- /dev/null +++ b/docs/ja/cloud/changelogs/changelog-24-6.md @@ -0,0 +1,139 @@ +--- +slug: /ja/changelogs/24.6 +title: v24.6 Changelog for Cloud +description: Fast release changelog for v24.6 +keywords: [chaneglog, cloud] +--- + +# v24.6 Changelog for Cloud + +Relevant changes for ClickHouse Cloud services based on the v24.6 release. + +## Backward Incompatible Change +* Rework parallel processing in `Ordered` mode of storage `S3Queue`. This PR is backward incompatible for Ordered mode if you used settings `s3queue_processing_threads_num` or `s3queue_total_shards_num`. Setting `s3queue_total_shards_num` is deleted, previously it was allowed to use only under `s3queue_allow_experimental_sharded_mode`, which is now deprecated. A new setting is added - `s3queue_buckets`. [#64349](https://github.com/ClickHouse/ClickHouse/pull/64349) ([Kseniia Sumarokova](https://github.com/kssenii)). +* New functions `snowflakeIDToDateTime`, `snowflakeIDToDateTime64`, `dateTimeToSnowflakeID`, and `dateTime64ToSnowflakeID` were added. Unlike the existing functions `snowflakeToDateTime`, `snowflakeToDateTime64`, `dateTimeToSnowflake`, and `dateTime64ToSnowflake`, the new functions are compatible with function `generateSnowflakeID`, i.e. they accept the snowflake IDs generated by `generateSnowflakeID` and produce snowflake IDs of the same type as `generateSnowflakeID` (i.e. `UInt64`). Furthermore, the new functions default to the UNIX epoch (aka. 1970-01-01), just like `generateSnowflakeID`. If necessary, a different epoch, e.g. Twitter's/X's epoch 2010-11-04 aka. 1288834974657 msec since UNIX epoch, can be passed. The old conversion functions are deprecated and will be removed after a transition period: to use them regardless, enable setting `allow_deprecated_snowflake_conversion_functions`. [#64948](https://github.com/ClickHouse/ClickHouse/pull/64948) ([Robert Schulze](https://github.com/rschu1ze)). + +## New Feature + +* Support empty tuples. [#55061](https://github.com/ClickHouse/ClickHouse/pull/55061) ([Amos Bird](https://github.com/amosbird)). +* Add Hilbert Curve encode and decode functions. [#60156](https://github.com/ClickHouse/ClickHouse/pull/60156) ([Artem Mustafin](https://github.com/Artemmm91)). +* Add support for index analysis over `hilbertEncode`. [#64662](https://github.com/ClickHouse/ClickHouse/pull/64662) ([Artem Mustafin](https://github.com/Artemmm91)). +* Added support for reading `LINESTRING` geometry in the WKT format using function `readWKTLineString`. [#62519](https://github.com/ClickHouse/ClickHouse/pull/62519) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added new SQL functions `generateSnowflakeID` for generating Twitter-style Snowflake IDs. [#63577](https://github.com/ClickHouse/ClickHouse/pull/63577) ([Danila Puzov](https://github.com/kazalika)). +* Add support for comparing `IPv4` and `IPv6` types using the `=` operator. [#64292](https://github.com/ClickHouse/ClickHouse/pull/64292) ([Francisco J. Jurado Moreno](https://github.com/Beetelbrox)). +* Support decimal arguments in binary math functions (pow, atan2, max2, min2, hypot). [#64582](https://github.com/ClickHouse/ClickHouse/pull/64582) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Added SQL functions `parseReadableSize` (along with `OrNull` and `OrZero` variants). [#64742](https://github.com/ClickHouse/ClickHouse/pull/64742) ([Francisco J. Jurado Moreno](https://github.com/Beetelbrox)). +* Add `_time` virtual column to file alike storages (s3/file/hdfs/url/azureBlobStorage). [#64947](https://github.com/ClickHouse/ClickHouse/pull/64947) ([Ilya Golshtein](https://github.com/ilejn)). +* Introduced new functions `base64URLEncode`, `base64URLDecode` and `tryBase64URLDecode`. [#64991](https://github.com/ClickHouse/ClickHouse/pull/64991) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Add new function `editDistanceUTF8`, which calculates the [edit distance](https://en.wikipedia.org/wiki/Edit_distance) between two UTF8 strings. [#65269](https://github.com/ClickHouse/ClickHouse/pull/65269) ([LiuNeng](https://github.com/liuneng1994)). +* Add `http_response_headers` configuration to support custom response headers in custom HTTP handlers. [#63562](https://github.com/ClickHouse/ClickHouse/pull/63562) ([Grigorii](https://github.com/GSokol)). +* Added a new table function `loop` to support returning query results in an infinite loop. [#63452](https://github.com/ClickHouse/ClickHouse/pull/63452) ([Sariel](https://github.com/sarielwxm)). This is useful for testing. +* Introduced two additional columns in the `system.query_log`: `used_privileges` and `missing_privileges`. `used_privileges` is populated with the privileges that were checked during query execution, and `missing_privileges` contains required privileges that are missing. [#64597](https://github.com/ClickHouse/ClickHouse/pull/64597) ([Alexey Katsman](https://github.com/alexkats)). +* Added a setting `output_format_pretty_display_footer_column_names` which when enabled displays column names at the end of the table for long tables (50 rows by default), with the threshold value for minimum number of rows controlled by `output_format_pretty_display_footer_column_names_min_rows`. [#65144](https://github.com/ClickHouse/ClickHouse/pull/65144) ([Shaun Struwig](https://github.com/Blargian)). + +## Performance Improvement + +* Fix performance regression in cross join introduced in #60459 (24.5). #65243 (Nikita Taranov). +* Improve io_uring resubmits visibility. Rename profile event IOUringSQEsResubmits -> IOUringSQEsResubmitsAsync and add a new one IOUringSQEsResubmitsSync. #63699 (Tomer Shafir). +* Introduce assertions to verify all functions are called with columns of the right size. #63723 (Raúl Marín). +* Add the ability to reshuffle rows during insert to optimize for size without violating the order set by `PRIMARY KEY`. It's controlled by the setting `optimize_row_order` (off by default). [#63578](https://github.com/ClickHouse/ClickHouse/pull/63578) ([Igor Markelov](https://github.com/ElderlyPassionFruit)). +* Add a native parquet reader, which can read parquet binary to ClickHouse Columns directly. It's controlled by the setting `input_format_parquet_use_native_reader` (disabled by default). [#60361](https://github.com/ClickHouse/ClickHouse/pull/60361) ([ZhiHong Zhang](https://github.com/copperybean)). +* Support partial trivial count optimization when the query filter is able to select exact ranges from merge tree tables. [#60463](https://github.com/ClickHouse/ClickHouse/pull/60463) ([Amos Bird](https://github.com/amosbird)). +* Reduce max memory usage of multithreaded `INSERT`s by collecting chunks of multiple threads in a single transform. [#61047](https://github.com/ClickHouse/ClickHouse/pull/61047) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Reduce the memory usage when using Azure object storage by using fixed memory allocation, avoiding the allocation of an extra buffer. [#63160](https://github.com/ClickHouse/ClickHouse/pull/63160) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Reduce the number of virtual function calls in `ColumnNullable::size`. [#60556](https://github.com/ClickHouse/ClickHouse/pull/60556) ([HappenLee](https://github.com/HappenLee)). +* Speedup `splitByRegexp` when the regular expression argument is a single-character. [#62696](https://github.com/ClickHouse/ClickHouse/pull/62696) ([Robert Schulze](https://github.com/rschu1ze)). +* Speed up aggregation by 8-bit and 16-bit keys by keeping track of the min and max keys used. This allows to reduce the number of cells that need to be verified. [#62746](https://github.com/ClickHouse/ClickHouse/pull/62746) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize operator IN when the left hand side is `LowCardinality` and the right is a set of constants. [#64060](https://github.com/ClickHouse/ClickHouse/pull/64060) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Use a thread pool to initialize and destroy hash tables inside `ConcurrentHashJoin`. [#64241](https://github.com/ClickHouse/ClickHouse/pull/64241) ([Nikita Taranov](https://github.com/nickitat)). +* Optimized vertical merges in tables with sparse columns. [#64311](https://github.com/ClickHouse/ClickHouse/pull/64311) ([Anton Popov](https://github.com/CurtizJ)). +* Enabled prefetches of data from remote filesystem during vertical merges. It improves latency of vertical merges in tables with data stored on remote filesystem. [#64314](https://github.com/ClickHouse/ClickHouse/pull/64314) ([Anton Popov](https://github.com/CurtizJ)). +* Reduce redundant calls to `isDefault` of `ColumnSparse::filter` to improve performance. [#64426](https://github.com/ClickHouse/ClickHouse/pull/64426) ([Jiebin Sun](https://github.com/jiebinn)). +* Speedup `find_super_nodes` and `find_big_family` keeper-client commands by making multiple asynchronous getChildren requests. [#64628](https://github.com/ClickHouse/ClickHouse/pull/64628) ([Alexander Gololobov](https://github.com/davenger)). +* Improve function `least`/`greatest` for nullable numberic type arguments. [#64668](https://github.com/ClickHouse/ClickHouse/pull/64668) ([KevinyhZou](https://github.com/KevinyhZou)). +* Allow merging two consequent filtering steps of a query plan. This improves filter-push-down optimization if the filter condition can be pushed down from the parent step. [#64760](https://github.com/ClickHouse/ClickHouse/pull/64760) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove bad optimization in the vertical final implementation and re-enable vertical final algorithm by default. [#64783](https://github.com/ClickHouse/ClickHouse/pull/64783) ([Duc Canh Le](https://github.com/canhld94)). +* Remove ALIAS nodes from the filter expression. This slightly improves performance for queries with `PREWHERE` (with the new analyzer). [#64793](https://github.com/ClickHouse/ClickHouse/pull/64793) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Re-enable OpenSSL session caching. [#65111](https://github.com/ClickHouse/ClickHouse/pull/65111) ([Robert Schulze](https://github.com/rschu1ze)). +* Added settings to disable materialization of skip indexes and statistics on inserts (`materialize_skip_indexes_on_insert` and `materialize_statistics_on_insert`). [#64391](https://github.com/ClickHouse/ClickHouse/pull/64391) ([Anton Popov](https://github.com/CurtizJ)). +* Use the allocated memory size to calculate the row group size and reduce the peak memory of the parquet writer in the single-threaded mode. [#64424](https://github.com/ClickHouse/ClickHouse/pull/64424) ([LiuNeng](https://github.com/liuneng1994)). +* Improve the iterator of sparse column to reduce call of `size`. [#64497](https://github.com/ClickHouse/ClickHouse/pull/64497) ([Jiebin Sun](https://github.com/jiebinn)). +* Update condition to use server-side copy for backups to Azure blob storage. [#64518](https://github.com/ClickHouse/ClickHouse/pull/64518) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Optimized memory usage of vertical merges for tables with high number of skip indexes. [#64580](https://github.com/ClickHouse/ClickHouse/pull/64580) ([Anton Popov](https://github.com/CurtizJ)). + +## Improvement + +* Returned back the behaviour of how ClickHouse works and interprets Tuples in CSV format. This change effectively reverts ClickHouse/ClickHouse#60994 and makes it available only under a few settings: output_format_csv_serialize_tuple_into_separate_columns, input_format_csv_deserialize_separate_columns_into_tuple and input_format_csv_try_infer_strings_from_quoted_tuples. #65170 (Nikita Mikhaylov). +* `SHOW CREATE TABLE` executed on top of system tables will now show the super handy comment unique for each table which will explain why this table is needed. [#63788](https://github.com/ClickHouse/ClickHouse/pull/63788) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* The second argument (scale) of functions `round()`, `roundBankers()`, `floor()`, `ceil()` and `trunc()` can now be non-const. [#64798](https://github.com/ClickHouse/ClickHouse/pull/64798) ([Mikhail Gorshkov](https://github.com/mgorshkov)). +* Avoid possible deadlock during MergeTree index analysis when scheduling threads in a saturated service. [#59427](https://github.com/ClickHouse/ClickHouse/pull/59427) ([Sean Haynes](https://github.com/seandhaynes)). +* Several minor corner case fixes to S3 proxy support & tunneling. [#63427](https://github.com/ClickHouse/ClickHouse/pull/63427) ([Arthur Passos](https://github.com/arthurpassos)). +* Add metrics to track the number of directories created and removed by the `plain_rewritable` metadata storage, and the number of entries in the local-to-remote in-memory map. [#64175](https://github.com/ClickHouse/ClickHouse/pull/64175) ([Julia Kartseva](https://github.com/jkartseva)). +* The query cache now considers identical queries with different settings as different. This increases robustness in cases where different settings (e.g. `limit` or `additional_table_filters`) would affect the query result. [#64205](https://github.com/ClickHouse/ClickHouse/pull/64205) ([Robert Schulze](https://github.com/rschu1ze)). +* Support the non standard error code `QpsLimitExceeded` in object storage as a retryable error. [#64225](https://github.com/ClickHouse/ClickHouse/pull/64225) ([Sema Checherinda](https://github.com/CheSema)). +* Added a new setting `input_format_parquet_prefer_block_bytes` to control the average output block bytes, and modified the default value of `input_format_parquet_max_block_size` to 65409. [#64427](https://github.com/ClickHouse/ClickHouse/pull/64427) ([LiuNeng](https://github.com/liuneng1994)). +* Settings from the user's config don't affect merges and mutations for `MergeTree` on top of object storage. [#64456](https://github.com/ClickHouse/ClickHouse/pull/64456) ([alesapin](https://github.com/alesapin)). +* Support the non standard error code `TotalQpsLimitExceeded` in object storage as a retryable error. [#64520](https://github.com/ClickHouse/ClickHouse/pull/64520) ([Sema Checherinda](https://github.com/CheSema)). +* Updated Advanced Dashboard for both open-source and ClickHouse Cloud versions to include a chart for 'Maximum concurrent network connections'. [#64610](https://github.com/ClickHouse/ClickHouse/pull/64610) ([Thom O'Connor](https://github.com/thomoco)). +* Improve progress report on `zeros_mt` and `generateRandom`. [#64804](https://github.com/ClickHouse/ClickHouse/pull/64804) ([Raúl Marín](https://github.com/Algunenano)). +* Add an asynchronous metric `jemalloc.profile.active` to show whether sampling is currently active. This is an activation mechanism in addition to prof.active; both must be active for the calling thread to sample. [#64842](https://github.com/ClickHouse/ClickHouse/pull/64842) ([Unalian](https://github.com/Unalian)). +* Remove mark of `allow_experimental_join_condition` as important. This mark may have prevented distributed queries in a mixed versions cluster from being executed successfully. [#65008](https://github.com/ClickHouse/ClickHouse/pull/65008) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added server Asynchronous metrics `DiskGetObjectThrottler*` and `DiskGetObjectThrottler*` reflecting request per second rate limit defined with `s3_max_get_rps` and `s3_max_put_rps` disk settings and currently available number of requests that could be sent without hitting throttling limit on the disk. Metrics are defined for every disk that has a configured limit. [#65050](https://github.com/ClickHouse/ClickHouse/pull/65050) ([Sergei Trifonov](https://github.com/serxa)). +* Add a validation when creating a user with `bcrypt_hash`. [#65242](https://github.com/ClickHouse/ClickHouse/pull/65242) ([Raúl Marín](https://github.com/Algunenano)). +* Add profile events for number of rows read during/after `PREWHERE`. [#64198](https://github.com/ClickHouse/ClickHouse/pull/64198) ([Nikita Taranov](https://github.com/nickitat)). +* Print query in `EXPLAIN PLAN` with parallel replicas. [#64298](https://github.com/ClickHouse/ClickHouse/pull/64298) ([vdimir](https://github.com/vdimir)). +* Rename `allow_deprecated_functions` to `allow_deprecated_error_prone_window_functions`. [#64358](https://github.com/ClickHouse/ClickHouse/pull/64358) ([Raúl Marín](https://github.com/Algunenano)). +* Respect `max_read_buffer_size` setting for file descriptors as well in the `file` table function. [#64532](https://github.com/ClickHouse/ClickHouse/pull/64532) ([Azat Khuzhin](https://github.com/azat)). +* Disable transactions for unsupported storages even for materialized views. [#64918](https://github.com/ClickHouse/ClickHouse/pull/64918) ([alesapin](https://github.com/alesapin)). +* Forbid `QUALIFY` clause in the old analyzer. The old analyzer ignored `QUALIFY`, so it could lead to unexpected data removal in mutations. [#65356](https://github.com/ClickHouse/ClickHouse/pull/65356) ([Dmitry Novik](https://github.com/novikd)). + +## Bug Fix (user-visible misbehavior in an official stable release) +* Fixed 'set' skip index not working with IN and indexHint(). #62083 (Michael Kolupaev). +* Fix queries with FINAL give wrong result when table does not use adaptive granularity. #62432 (Duc Canh Le). +* Support executing function during assignment of parameterized view value. #63502 (SmitaRKulkarni). +* Fixed parquet memory tracking. #63584 (Michael Kolupaev). +* Fix rare case with missing data in the result of distributed query. #63691 (vdimir). +* Fixed reading of columns of type Tuple(Map(LowCardinality(String), String), ...). #63956 (Anton Popov). +* Fix resolve of unqualified COLUMNS matcher. Preserve the input columns order and forbid usage of unknown identifiers. #63962 (Dmitry Novik). +* Fix an Cyclic aliases error for cyclic aliases of different type (expression and function). #63993 (Nikolai Kochetov). +* This fix will use a proper redefined context with the correct definer for each individual view in the query pipeline. #64079 (pufit). +* Fix analyzer: "Not found column" error is fixed when using INTERPOLATE. #64096 (Yakov Olkhovskiy). +* Prevent LOGICAL_ERROR on CREATE TABLE as MaterializedView. #64174 (Raúl Marín). +* The query cache now considers two identical queries against different databases as different. The previous behavior could be used to bypass missing privileges to read from a table. #64199 (Robert Schulze). +* Fix possible abort on uncaught exception in ~WriteBufferFromFileDescriptor in StatusFile. #64206 (Kruglov Pavel). +* Fix duplicate alias error for distributed queries with ARRAY JOIN. #64226 (Nikolai Kochetov). +* Fix unexpected accurateCast from string to integer. #64255 (wudidapaopao). +* Fixed CNF simplification, in case any OR group contains mutually exclusive atoms. #64256 (Eduard Karacharov). +* Fix Query Tree size validation. #64377 (Dmitry Novik). +* Fix Logical error: Bad cast for Buffer table with PREWHERE. #64388 (Nikolai Kochetov). +* Fixed CREATE TABLE AS queries for tables with default expressions. #64455 (Anton Popov). +* Fixed optimize_read_in_order behaviour for ORDER BY ... NULLS FIRST / LAST on tables with nullable keys. #64483 (Eduard Karacharov). +* Fix the Expression nodes list expected 1 projection names and Unknown expression or identifier errors for queries with aliases to GLOBAL IN.. #64517 (Nikolai Kochetov). +* Fix an error Cannot find column in distributed queries with constant CTE in the GROUP BY key. #64519 (Nikolai Kochetov). +* Fix the output of function formatDateTimeInJodaSyntax when a formatter generates an uneven number of characters and the last character is 0. For example, SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D') now correctly returns 150 instead of previously 15. #64614 (LiuNeng). +* Do not rewrite aggregation if -If combinator is already used. #64638 (Dmitry Novik). +* Fix type inference for float (in case of small buffer, i.e. --max_read_buffer_size 1). #64641 (Azat Khuzhin). +* Fix bug which could lead to non-working TTLs with expressions. #64694 (alesapin). +* Fix removing the WHERE and PREWHERE expressions, which are always true (for the new analyzer). #64695 (Nikolai Kochetov). +* Fixed excessive part elimination by token-based text indexes (ngrambf , full_text) when filtering by result of startsWith, endsWith, match, multiSearchAny. #64720 (Eduard Karacharov). +* Fixes incorrect behaviour of ANSI CSI escaping in the UTF8::computeWidth function. #64756 (Shaun Struwig). +* Fix a case of incorrect removal of ORDER BY / LIMIT BY across subqueries. #64766 (Raúl Marín). +* Fix (experimental) unequal join with subqueries for sets which are in the mixed join conditions. #64775 (lgbo). +* Fix crash in a local cache over plain_rewritable disk. #64778 (Julia Kartseva). +* Fix Cannot find column in distributed query with ARRAY JOIN by Nested column. Fixes #64755. #64801 (Nikolai Kochetov). +* Fix memory leak in slru cache policy. #64803 (Kseniia Sumarokova). +* Fixed possible incorrect memory tracking in several kinds of queries: queries that read any data from S3, queries via http protocol, asynchronous inserts. #64844 (Anton Popov). +* Fix the Block structure mismatch error for queries reading with PREWHERE from the materialized view when the materialized view has columns of different types than the source table. Fixes #64611. #64855 (Nikolai Kochetov). +* Fix rare crash when table has TTL with subquery + database replicated + parallel replicas + analyzer. It's really rare, but please don't use TTLs with subqueries. #64858 (alesapin). +* Fix ALTER MODIFY COMMENT query that was broken for parameterized VIEWs in ClickHouse/ClickHouse#54211. #65031 (Nikolay Degterinsky). +* Fix host_id in DatabaseReplicated when cluster_secure_connection parameter is enabled. Previously all the connections within the cluster created by DatabaseReplicated were not secure, even if the parameter was enabled. #65054 (Nikolay Degterinsky). +* Fixing the Not-ready Set error after the PREWHERE optimization for StorageMerge. #65057 (Nikolai Kochetov). +* Avoid writing to finalized buffer in File-like storages. #65063 (Kruglov Pavel). +* Fix possible infinite query duration in case of cyclic aliases. Fixes #64849. #65081 (Nikolai Kochetov). +* Fix the Unknown expression identifier error for remote queries with INTERPOLATE (alias) (new analyzer). Fixes #64636. #65090 (Nikolai Kochetov). +* Fix pushing arithmetic operations out of aggregation. In the new analyzer, optimization was applied only once. #65104 (Dmitry Novik). +* Fix aggregate function name rewriting in the new analyzer. #65110 (Dmitry Novik). +* Respond with 5xx instead of 200 OK in case of receive timeout while reading (parts of) the request body from the client socket. #65118 (Julian Maicher). +* Fix possible crash for hedged requests. #65206 (Azat Khuzhin). +* Fix the bug in Hashed and Hashed_Array dictionary short circuit evaluation, which may read uninitialized number, leading to various errors. #65256 (jsc0218). +* This PR ensures that the type of the constant(IN operator's second parameter) is always visible during the IN operator's type conversion process. Otherwise, losing type information may cause some conversions to fail, such as the conversion from DateTime to Date. fix (#64487). #65315 (pn). \ No newline at end of file diff --git a/docs/ja/cloud/changelogs/changelog-24-8.md b/docs/ja/cloud/changelogs/changelog-24-8.md new file mode 100644 index 00000000000..e1b53785d38 --- /dev/null +++ b/docs/ja/cloud/changelogs/changelog-24-8.md @@ -0,0 +1,65 @@ +--- +slug: /ja/changelogs/24.8 +title: v24.8 Changelog for Cloud +description: Fast release changelog for v24.8 +keywords: [chaneglog, cloud] +--- + +Relevant changes for ClickHouse Cloud services based on the v24.8 release. + +## Backward Incompatible Change + +- Change binary serialization of Variant data type: add compact mode to avoid writing the same discriminator multiple times for granules with single variant or with only NULL values. Add MergeTree setting use_compact_variant_discriminators_serialization that is enabled by default. Note that Variant type is still experimental and backward-incompatible change in serialization should not impact you unless you have been working with support to get this feature enabled earlier. [#62774](https://github.com/ClickHouse/ClickHouse/pull/62774) (Kruglov Pavel). + +- Forbid CREATE MATERIALIZED VIEW ... ENGINE Replicated*MergeTree POPULATE AS SELECT ... with Replicated databases. This specific PR is only applicable to users still using, ReplicatedMergeTree. [#63963](https://github.com/ClickHouse/ClickHouse/pull/63963) (vdimir). + +- Metric KeeperOutstandingRequets was renamed to KeeperOutstandingRequests. This fixes a typo reported in [#66179](https://github.com/ClickHouse/ClickHouse/issues/66179). [#66206](https://github.com/ClickHouse/ClickHouse/pull/66206) (Robert Schulze). + +- clickhouse-client and clickhouse-local now default to multi-query mode (instead single-query mode). As an example, clickhouse-client -q "SELECT 1; SELECT 2" now works, whereas users previously had to add --multiquery (or -n). The --multiquery/-n switch became obsolete. INSERT queries in multi-query statements are treated specially based on their FORMAT clause: If the FORMAT is VALUES (the most common case), the end of the INSERT statement is represented by a trailing semicolon ; at the end of the query. For all other FORMATs (e.g. CSV or JSONEachRow), the end of the INSERT statement is represented by two newlines \n\n at the end of the query. [#63898](https://github.com/ClickHouse/ClickHouse/pull/63898) (wxybear). + +- In previous versions, it was possible to use an alternative syntax for LowCardinality data types by appending WithDictionary to the name of the data type. It was an initial working implementation, and it was never documented or exposed to the public. Now, it is deprecated. If you have used this syntax, you have to ALTER your tables and rename the data types to LowCardinality. [#66842](https://github.com/ClickHouse/ClickHouse/pull/66842)(Alexey Milovidov). + +- Fix logical errors with storage Buffer used with distributed destination table. It's a backward incompatible change: queries using Buffer with a distributed destination table may stop working if the table appears more than once in the query (e.g., in a self-join). [#67015](https://github.com/vdimir) (vdimir). + +- In previous versions, calling functions for random distributions based on the Gamma function (such as Chi-Squared, Student, Fisher) with negative arguments close to zero led to a long computation or an infinite loop. In the new version, calling these functions with zero or negative arguments will produce an exception. This closes [#67297](https://github.com/ClickHouse/ClickHouse/issues/67297). [#67326](https://github.com/ClickHouse/ClickHouse/pull/67326) (Alexey Milovidov). + +- In previous versions, arrayWithConstant can be slow if asked to generate very large arrays. In the new version, it is limited to 1 GB per array. This closes [#32754](https://github.com/ClickHouse/ClickHouse/issues/32754). [#67741](https://github.com/ClickHouse/ClickHouse/pull/67741) (Alexey Milovidov). + +- Fix REPLACE modifier formatting (forbid omitting brackets). [#67774](https://github.com/ClickHouse/ClickHouse/pull/67774) (Azat Khuzhin). + + +## New Feature + +- Extend function tuple to construct named tuples in query. Introduce function tupleNames to extract names from tuples. [#54881](https://github.com/ClickHouse/ClickHouse/pull/54881) (Amos Bird). + +- ASOF JOIN support for full_sorting_join algorithm Close [#54493](https://github.com/ClickHouse/ClickHouse/issues/54493). [#55051](https://github.com/ClickHouse/ClickHouse/pull/55051) (vdimir). + +- A new table function, fuzzQuery, was added. This function allows you to modify a given query string with random variations. Example: SELECT query FROM fuzzQuery('SELECT 1');. [#62103](https://github.com/ClickHouse/ClickHouse/pull/62103) (pufit). + +- Add new window function percent_rank. [#62747](https://github.com/ClickHouse/ClickHouse/pull/62747) (lgbo). + +- Support JWT authentication in clickhouse-client. [#62829](https://github.com/ClickHouse/ClickHouse/pull/62829) (Konstantin Bogdanov). + +- Add SQL functions changeYear, changeMonth, changeDay, changeHour, changeMinute, changeSecond. For example, SELECT changeMonth(toDate('2024-06-14'), 7) returns date 2024-07-14. [#63186](https://github.com/ClickHouse/ClickHouse/pull/63186) (cucumber95). + +- Add system.error_log which contains history of error values from table system.errors, periodically flushed to disk. [#65381](https://github.com/ClickHouse/ClickHouse/pull/65381) (Pablo Marcos). + +- Add aggregate function groupConcat. About the same as arrayStringConcat( groupArray(column), ',') Can receive 2 parameters: a string delimiter and the number of elements to be processed. [#65451](https://github.com/ClickHouse/ClickHouse/pull/65451) (Yarik Briukhovetskyi). + +- Add AzureQueue storage. [#65458](https://github.com/ClickHouse/ClickHouse/pull/65458) (Kseniia Sumarokova). + +- Add a new setting to disable/enable writing page index into parquet files. [#65475](https://github.com/ClickHouse/ClickHouse/pull/65475) (lgbo). + +- Automatically append a wildcard * to the end of a directory path with table function file. [#66019](https://github.com/ClickHouse/ClickHouse/pull/66019) (Zhidong (David) Guo). + +- Add --memory-usage option to client in non interactive mode. [#66393](https://github.com/ClickHouse/ClickHouse/pull/66393) (vdimir). + +- Add _etag virtual column for S3 table engine. Fixes [#65312](https://github.com/ClickHouse/ClickHouse/issues/65312). [#65386](https://github.com/ClickHouse/ClickHouse/pull/65386) (skyoct) + +- This pull request introduces Hive-style partitioning for different engines (File, URL, S3, AzureBlobStorage, HDFS). Hive-style partitioning organizes data into partitioned sub-directories, making it efficient to query and manage large datasets. Currently, it only creates virtual columns with the appropriate name and data. The follow-up PR will introduce the appropriate data filtering (performance speedup). [#65997](https://github.com/ClickHouse/ClickHouse/pull/65997) (Yarik Briukhovetskyi). + +- Add function printf for spark compatiability. [#66257](https://github.com/ClickHouse/ClickHouse/pull/66257) (李扬). + +- Added support for reading MULTILINESTRING geometry in WKT format using function readWKTLineString. [#67647](https://github.com/ClickHouse/ClickHouse/pull/67647) (Jacob Reckhard). + +- Added a tagging (namespace) mechanism for the query cache. The same queries with different tags are considered different by the query cache. Example: SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'abc' and SELECT 1 SETTINGS use_query_cache = 1, query_cache_tag = 'def' now create different query cache entries. [#68235](https://github.com/ClickHouse/ClickHouse/pull/68235)(sakulali). \ No newline at end of file diff --git a/docs/ja/cloud/images/sqlconsole/abc.png b/docs/ja/cloud/images/sqlconsole/abc.png new file mode 100644 index 00000000000..be7ecb98e26 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/abc.png differ diff --git a/docs/ja/cloud/images/sqlconsole/add-more-filters.png b/docs/ja/cloud/images/sqlconsole/add-more-filters.png new file mode 100644 index 00000000000..ed228d9cfe6 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/add-more-filters.png differ diff --git a/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png b/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png new file mode 100644 index 00000000000..185c7484471 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png differ diff --git a/docs/ja/cloud/images/sqlconsole/authentication-success.png b/docs/ja/cloud/images/sqlconsole/authentication-success.png new file mode 100644 index 00000000000..183e90d5367 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/authentication-success.png differ diff --git a/docs/ja/cloud/images/sqlconsole/bar-chart.png b/docs/ja/cloud/images/sqlconsole/bar-chart.png new file mode 100644 index 00000000000..10c251cb76d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/bar-chart.png differ diff --git a/docs/ja/cloud/images/sqlconsole/cancel-a-query.png b/docs/ja/cloud/images/sqlconsole/cancel-a-query.png new file mode 100644 index 00000000000..97f01a60f40 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/cancel-a-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png b/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png new file mode 100644 index 00000000000..574e12cbf4b Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png differ diff --git a/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png b/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png new file mode 100644 index 00000000000..19ef230145b Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png differ diff --git a/docs/ja/cloud/images/sqlconsole/creating-a-query.png b/docs/ja/cloud/images/sqlconsole/creating-a-query.png new file mode 100644 index 00000000000..eae12583eeb Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/creating-a-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/download-as-csv.png b/docs/ja/cloud/images/sqlconsole/download-as-csv.png new file mode 100644 index 00000000000..5910d502524 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/download-as-csv.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-completed.png b/docs/ja/cloud/images/sqlconsole/endpoints-completed.png new file mode 100644 index 00000000000..55f3c5dd1fb Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-completed.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-configure.png b/docs/ja/cloud/images/sqlconsole/endpoints-configure.png new file mode 100644 index 00000000000..75c4f934187 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-configure.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-createkey.png b/docs/ja/cloud/images/sqlconsole/endpoints-createkey.png new file mode 100644 index 00000000000..ae91e705ce5 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-createkey.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-curltest.png b/docs/ja/cloud/images/sqlconsole/endpoints-curltest.png new file mode 100644 index 00000000000..44917ae8f69 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-curltest.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png b/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png new file mode 100644 index 00000000000..1ad8cdb79ea Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png b/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png new file mode 100644 index 00000000000..ffa80de31f6 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png differ diff --git a/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png b/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png new file mode 100644 index 00000000000..f51f86e50bf Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png differ diff --git a/docs/ja/cloud/images/sqlconsole/enter-credentials.png b/docs/ja/cloud/images/sqlconsole/enter-credentials.png new file mode 100644 index 00000000000..0da62a82d16 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/enter-credentials.png differ diff --git a/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png b/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png new file mode 100644 index 00000000000..966fa17306d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png differ diff --git a/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png b/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png new file mode 100644 index 00000000000..323ea9d8073 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png differ diff --git a/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png b/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png new file mode 100644 index 00000000000..3cb64dca734 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_drilldown.png b/docs/ja/cloud/images/sqlconsole/insights_drilldown.png new file mode 100644 index 00000000000..3063dc50aef Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_drilldown.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_latency.png b/docs/ja/cloud/images/sqlconsole/insights_latency.png new file mode 100644 index 00000000000..34e768dc013 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_latency.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_overview.png b/docs/ja/cloud/images/sqlconsole/insights_overview.png new file mode 100644 index 00000000000..12f5221a896 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_overview.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_query_info.png b/docs/ja/cloud/images/sqlconsole/insights_query_info.png new file mode 100644 index 00000000000..adbb15624c9 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_query_info.png differ diff --git a/docs/ja/cloud/images/sqlconsole/insights_recent.png b/docs/ja/cloud/images/sqlconsole/insights_recent.png new file mode 100644 index 00000000000..35ec081553e Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/insights_recent.png differ diff --git a/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png b/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png new file mode 100644 index 00000000000..63116ec7a7e Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png differ diff --git a/docs/ja/cloud/images/sqlconsole/match-in-body.png b/docs/ja/cloud/images/sqlconsole/match-in-body.png new file mode 100644 index 00000000000..936a24cc80a Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/match-in-body.png differ diff --git a/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png b/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png new file mode 100644 index 00000000000..f236cf96bee Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png differ diff --git a/docs/ja/cloud/images/sqlconsole/pagination-nav.png b/docs/ja/cloud/images/sqlconsole/pagination-nav.png new file mode 100644 index 00000000000..ccb488d4541 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/pagination-nav.png differ diff --git a/docs/ja/cloud/images/sqlconsole/pagination.png b/docs/ja/cloud/images/sqlconsole/pagination.png new file mode 100644 index 00000000000..6bfe15f50f8 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/pagination.png differ diff --git a/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png b/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png new file mode 100644 index 00000000000..d1ad23258a0 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png differ diff --git a/docs/ja/cloud/images/sqlconsole/run-at-cursor.png b/docs/ja/cloud/images/sqlconsole/run-at-cursor.png new file mode 100644 index 00000000000..54aed6713b8 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/run-at-cursor.png differ diff --git a/docs/ja/cloud/images/sqlconsole/run-selected-query.png b/docs/ja/cloud/images/sqlconsole/run-selected-query.png new file mode 100644 index 00000000000..7c986647088 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/run-selected-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/save-the-query.png b/docs/ja/cloud/images/sqlconsole/save-the-query.png new file mode 100644 index 00000000000..41ee8ba62fd Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/save-the-query.png differ diff --git a/docs/ja/cloud/images/sqlconsole/search-github.png b/docs/ja/cloud/images/sqlconsole/search-github.png new file mode 100644 index 00000000000..0359429b05d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/search-github.png differ diff --git a/docs/ja/cloud/images/sqlconsole/select-a-service.png b/docs/ja/cloud/images/sqlconsole/select-a-service.png new file mode 100644 index 00000000000..408a5167cae Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/select-a-service.png differ diff --git a/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png b/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png new file mode 100644 index 00000000000..58d47f8740d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png differ diff --git a/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png b/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png new file mode 100644 index 00000000000..d8f23e4d2ec Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png differ diff --git a/docs/ja/cloud/images/sqlconsole/switch-services.png b/docs/ja/cloud/images/sqlconsole/switch-services.png new file mode 100644 index 00000000000..9ca0834e0cd Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/switch-services.png differ diff --git a/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png b/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png new file mode 100644 index 00000000000..533bf98b6e6 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png differ diff --git a/docs/ja/cloud/images/sqlconsole/tabular-query-results.png b/docs/ja/cloud/images/sqlconsole/tabular-query-results.png new file mode 100644 index 00000000000..429db85a22d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/tabular-query-results.png differ diff --git a/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png b/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png new file mode 100644 index 00000000000..6cc38b441e1 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png differ diff --git a/docs/ja/cloud/images/sqlconsole/update-query-name.png b/docs/ja/cloud/images/sqlconsole/update-query-name.png new file mode 100644 index 00000000000..0501e03c50d Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/update-query-name.png differ diff --git a/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png b/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png new file mode 100644 index 00000000000..f6e11642e74 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png differ diff --git a/docs/ja/cloud/images/sqlconsole/view-columns.png b/docs/ja/cloud/images/sqlconsole/view-columns.png new file mode 100644 index 00000000000..fd7d2eeb449 Binary files /dev/null and b/docs/ja/cloud/images/sqlconsole/view-columns.png differ diff --git a/docs/ja/cloud/manage/_category_.yml b/docs/ja/cloud/manage/_category_.yml new file mode 100644 index 00000000000..59089856c86 --- /dev/null +++ b/docs/ja/cloud/manage/_category_.yml @@ -0,0 +1,6 @@ +label: 'Manage Cloud' +collapsible: true +collapsed: true +link: + type: generated-index + title: Manage ClickHouse Cloud diff --git a/docs/ja/cloud/manage/account-close.md b/docs/ja/cloud/manage/account-close.md new file mode 100644 index 00000000000..e36a627365c --- /dev/null +++ b/docs/ja/cloud/manage/account-close.md @@ -0,0 +1,53 @@ +--- +sidebar_label: アカウント削除 +slug: /ja/cloud/manage/close_account +title: アカウントクローズと削除 +--- + +## アカウントクローズと削除 + +私たちの目標は、あなたのプロジェクトが成功することです。このサイトで回答されていない質問や特定のユースケースの評価が必要な場合は、[support@clickhouse.com](mailto:support@clickhouse.com)までお問い合わせください。 + +時にはアカウントクローズが必要となる状況があることも理解しています。このガイドは、そのプロセスを支援するためのものです。 + +## クローズと削除の違い + +顧客はクローズされたアカウントに再ログインして、使用状況、請求、アカウントレベルのアクティビティログを確認できます。これにより、ユースケースの文書化から年末の税金用の請求書のダウンロードにいたるまで、さまざまな目的に役立つ詳細に簡単にアクセスできます。また、クローズされたアカウントは新しいサービスを開始するためにいつでも再開することができます。 + +個人データの削除を要求する顧客は、このプロセスが不可逆であることを認識してください。アカウントおよび関連情報は利用できなくなります。製品の更新情報は受け取れず、アカウントを再開することもできません。これはニュースレターの購読には影響しません。 + +ニュースレターの購読者は、アカウントをクローズしたり情報を削除したりせずに、ニュースレターのメール末尾の購読解除リンクを使用していつでも購読解除できます。 + +## クローズの準備 + +アカウントクローズを要求する前に、次の手順を実行してアカウントを準備してください。 + +1. 保存が必要なサービスからデータをエクスポートします。 +2. サービスを停止し削除します。これにより、アカウントで追加の料金が発生することを防げます。 +3. クローズを要求する管理者以外のすべてのユーザーを削除します。これにより、プロセスが完了する間に新しいサービスが作成されることを防ぐことができます。 +4. コントロールパネルの 'Usage'(使用状況) と'Billing'(請求) タブを確認し、すべての料金が支払われていることを確認します。未払い残高のあるアカウントはクローズできません。 + +## アカウントクローズを要求 + +クローズと削除の要求を認証することが求められます。要求が迅速に処理されるように、以下の手順に従ってください。 + +1. clickhouse.cloudアカウントにサインインします。 +2. 上記の _クローズの準備_ セクションの残りの手順を完了します。 +3. 画面右上のヘルプボタン(質問マーク)をクリックします。 +4. 'Support'(サポート) の下で 'Create case.'(ケース作成) をクリックします。 +5. 'Create new case'(新しいケースの作成) 画面で次の情報を入力します。 +``` +Priority: Severity 3 +Subject: Please close my ClickHouse account +Description: We would appreciate it if you would share a brief note about why you are cancelling. +``` +1. 'Create new case'(新しいケースの作成) をクリックします。 +2. アカウントをクローズし、完了時に確認メールを送信します。 + +## 個人データ削除の要求 + +ClickHouseから個人データ削除を要求できるのはアカウント管理者のみです。アカウント管理者でない場合は、ClickHouseアカウント管理者に連絡してアカウントからの削除を要求してください。 + +データ削除を要求するには、上記の「アカウントクローズの要求」の手順に従ってください。ケース情報を入力する際に、件名を 'Please close my ClickHouse account and delete my personal data.'(私のClickHouseアカウントをクローズし、個人データを削除してください) に変更してください。 + +個人データ削除の要求は30日以内に完了します。 diff --git a/docs/ja/cloud/manage/api/api-overview.md b/docs/ja/cloud/manage/api/api-overview.md new file mode 100644 index 00000000000..71133cd3324 --- /dev/null +++ b/docs/ja/cloud/manage/api/api-overview.md @@ -0,0 +1,32 @@ +--- +sidebar_label: 概要 +sidebar_position: 1 +--- + +# ClickHouse Cloud API + +## 概要 + +ClickHouse Cloud APIは、ClickHouse Cloud上の組織やサービスを簡単に管理できるように設計されたREST APIです。このCloud APIを使用すると、サービスの作成や管理、APIキーのプロビジョニング、組織内のメンバーの追加または削除などが可能です。 + +[最初のAPIキーを作成してClickHouse Cloud APIの使用を開始する方法を学びましょう。](/docs/ja/cloud/manage/openapi.md) + +## レート制限 + +開発者は、1つの組織につき100個のAPIキーに制限されています。各APIキーは、10秒間のウィンドウ内で10回のリクエストに制限されています。組織のためにAPIキーや10秒ごとのリクエスト数を増やしたい場合は、support@clickhouse.comまでご連絡ください。 + +## Terraformプロバイダー + +公式のClickHouse Terraformプロバイダーを利用すると、[コードとしてのインフラストラクチャ](https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac)を使用して、予測可能でバージョン管理された設定を作成し、デプロイメントのエラー発生を大幅に減らすことができます。 + +Terraformプロバイダーのドキュメントは、[Terraformレジストリ](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest/docs)で閲覧できます。 + +ClickHouse Terraformプロバイダーに貢献したい場合は、[GitHubリポジトリ](https://github.com/ClickHouse/terraform-provider-clickhouse)でソースを確認できます。 + +## Swagger(OpenAPI)エンドポイントとUI + +ClickHouse Cloud APIはオープンソースの[OpenAPI仕様](https://www.openapis.org/)に基づいて構築されており、クライアント側での予測可能な利用を可能にします。ClickHouse Cloud APIドキュメントをプログラムで利用する必要がある場合は、https://api.clickhouse.cloud/v1を通してJSONベースのSwaggerエンドポイントを提供しています。当社のAPIリファレンスドキュメントは、同じエンドポイントから自動生成されています。Swagger UIを通してAPIドキュメントを閲覧したい場合は、[こちら](https://clickhouse.com/docs/ja/cloud/manage/api/swagger)をクリックしてください。 + +## サポート + +迅速なサポートを得るには、まず[当社のSlackチャネル](https://clickhouse.com/slack)を訪れることをお勧めします。APIやその機能に関して追加のヘルプや詳細情報が必要な場合は、https://clickhouse.cloud/supportでClickHouseサポートにお問い合わせください。 diff --git a/docs/ja/cloud/manage/api/invitations-api-reference.md b/docs/ja/cloud/manage/api/invitations-api-reference.md new file mode 100644 index 00000000000..edd820393c3 --- /dev/null +++ b/docs/ja/cloud/manage/api/invitations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 招待 +title: 招待 +--- + +## すべての招待を一覧表示する + +このファイルは、ビルドプロセス中に`clickhouseapi.js`によって生成されます。内容を変更する必要がある場合は、`clickhouseapi.js`を編集してください。 diff --git a/docs/ja/cloud/manage/api/keys-api-reference.md b/docs/ja/cloud/manage/api/keys-api-reference.md new file mode 100644 index 00000000000..56d3f4d0629 --- /dev/null +++ b/docs/ja/cloud/manage/api/keys-api-reference.md @@ -0,0 +1,9 @@ +--- +sidebar_label: キー +title: キー +--- + +## すべてのキーの一覧を取得 + +このファイルは、ビルドプロセス中に `clickhouseapi.js` によって生成されます。 +内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/cloud/manage/api/members-api-reference.md b/docs/ja/cloud/manage/api/members-api-reference.md new file mode 100644 index 00000000000..95b06578377 --- /dev/null +++ b/docs/ja/cloud/manage/api/members-api-reference.md @@ -0,0 +1,9 @@ +--- +sidebar_label: メンバー +title: メンバー +--- + +## メンバー一覧 + +このファイルはビルドプロセス中に`clickhouseapi.js`によって生成されます。 +内容を変更する必要がある場合は、`clickhouseapi.js`を編集してください。 diff --git a/docs/ja/cloud/manage/api/organizations-api-reference.md b/docs/ja/cloud/manage/api/organizations-api-reference.md new file mode 100644 index 00000000000..a78d4757fc9 --- /dev/null +++ b/docs/ja/cloud/manage/api/organizations-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: 組織 +title: 組織 +--- + +## 組織の詳細を取得する + +このファイルはビルドプロセス中に `clickhouseapi.js` で生成されます。内容を変更する必要がある場合は、`clickhouseapi.js` を編集してください。 diff --git a/docs/ja/cloud/manage/api/services-api-reference.md b/docs/ja/cloud/manage/api/services-api-reference.md new file mode 100644 index 00000000000..44160dc0f33 --- /dev/null +++ b/docs/ja/cloud/manage/api/services-api-reference.md @@ -0,0 +1,8 @@ +--- +sidebar_label: サービス +title: サービス +--- + +## 組織サービスの一覧 + +このファイルはビルドプロセス中に `clickhouseapi.js` によって生成されます。 内容を変更する必要がある場合は、 `clickhouseapi.js` を編集してください。 diff --git a/docs/ja/cloud/manage/backups.md b/docs/ja/cloud/manage/backups.md new file mode 100644 index 00000000000..6f68b97c418 --- /dev/null +++ b/docs/ja/cloud/manage/backups.md @@ -0,0 +1,191 @@ +--- +sidebar_label: バックアップ +slug: /ja/cloud/manage/backups +description: ClickHouse Cloudでのバックアップ管理 +keywords: [バックアップ, クラウドバックアップ, 復元] +--- + +# バックアップ + +:::note +ClickHouse Cloudのサービスで`BACKUP`と`RESTORE`コマンドを使用しないでください。クラウドバックアップはUIから管理する必要があります。 +::: + +データベースのバックアップは、安全な方法を提供し、予期しない理由でデータが失われた場合でも、サービスを以前の正常なバックアップ状態に復元することができます。これにより、ダウンタイムを最小限に抑え、ビジネスに重要なデータが永久に失われることを防ぎます。このガイドでは、ClickHouse Cloudでのバックアップの動作、サービスのバックアップを構成するためのオプション、およびバックアップからの復元方法について説明します。 + +## ClickHouse Cloudでのバックアップの動作 + +ClickHouse Cloudのバックアップは、バックアップチェーンを構成する「フル」と「増分」のバックアップの組み合わせです。チェーンはフルバックアップから始まり、その後のスケジュールされた時間に増分バックアップが行われ、バックアップのシーケンスが作成されます。バックアップチェーンが一定の長さに達すると、新しいチェーンが開始されます。このバックアップの全体のチェーンは、必要に応じて新しいサービスにデータを復元するために利用されます。サービスの保持期間(後述)を過ぎると、特定のチェーンに含まれるすべてのバックアップは破棄されます。 + +以下のスクリーンショットでは、実線の四角形がフルバックアップを示し、点線の四角形が増分バックアップを示しています。実線の四角形で囲まれた領域は保持期間を示し、エンドユーザーに表示されるバックアップを示します。以下のシナリオでは、バックアップは24時間ごとに実行され、2日間保持されます。 + +Day 1にはバックアップチェーンを開始するためにフルバックアップが行われます。Day 2には増分バックアップが行われ、現在復元可能なフルバックアップと増分バックアップが存在します。Day 7までには、チェーン内に1つのフルバックアップと6つの増分バックアップがあります。ユーザーには最新の2つの増分バックアップが表示されます。Day 8には新しいフルバックアップが行われ、Day 9には新しいチェーンに2つのバックアップがある時点で、以前のチェーンは破棄されます。 + +![バックアップチェーン](./images/backup-chain.png) + +*ClickHouse Cloudの**Production**層のデフォルトバックアップポリシーと保持* + +## デフォルトバックアップポリシー + +ClickHouse Cloudは、サービスのバックアップを毎24時間ごとに作成します。**Production**サービスのバックアップは2日間保持され、**Development**サービスのバックアップは1日間保持されます。以下で説明するようにバックアップスケジュールをカスタマイズしない場合、これがサービスのバックアップスケジュールと保持ポリシーです。ClickHouse Cloudでのデフォルトバックアップには費用はかかりません。 + +## カスタマイズ可能なバックアップ + +ClickHouse Cloudでは、**Production**および**Dedicated**層サービスのバックアップスケジュールを構成することができます。バックアップはビジネスニーズに基づいて次のディメンションに沿って構成できます。 + +- **保持**: 各バックアップが保持される日数。保持期間は最小で1日から、最大で30日まで指定可能です。 +- **頻度**: 次回のバックアップまでの時間を指定することができます。「12時間ごと」の頻度の場合、バックアップは12時間ごとに行われます。頻度は「6時間ごと」から「48時間ごと」まで、次の時間単位で指定できます: 6, 8, 12, 16, 20, 24, 36, 48。 +- **開始時刻**: 毎日バックアップをスケジュールしたい開始時刻を指定します。開始時刻を指定すると、バックアップの「頻度」は24時間ごとに1回にデフォルト設定されます。ClickHouse Cloudは指定された開始時刻の1時間以内にバックアップを開始します。 + +:::note +カスタムスケジュールは、指定されたサービスに対するClickHouse Cloudのデフォルトバックアップポリシーを上書きします。 +::: + +サービスのバックアップスケジュールを構成するには、コンソールの**設定**タブに移動し、**バックアップ構成の変更**をクリックします。 + +バックアップ設定の構成 + +これにより、保持期間、頻度、および開始時刻の値を選択できる別のウィンドウが開きます。選択した設定を保存する必要があります。 + +バックアップの保持期間と頻度の選択 + +:::note +開始時刻と頻度は互いに排他的です。開始時刻が優先されます。 +::: + +:::note +バックアップスケジュールの変更は、サービスのデフォルトバックアップにカバーされないバックアップがある場合、ストレージに対する月次料金が上昇する可能性があります。「バックアップコストの理解」セクションを参照してください。 +::: + +## バックアップステータスリスト + +サービスの設定したスケジュールに基づいてバックアップが行われます。これはデフォルトの日次スケジュールか、または自分で選んだカスタムスケジュールのいずれかです。利用可能なすべてのバックアップは、サービスの**バックアップ**タブで表示することができます。ここから、バックアップのステータス、期間、サイズを確認できます。また、**操作**列から特定のバックアップを復元することもできます。 + +![バックアップステータスリスト](./images/backup-status-list.png) + +## バックアップコストの理解 + +ClickHouse Cloudは無料で2つのバックアップが含まれていますが、より多くのデータの保持やより頻繁なバックアップを必要とするスケジュールを選択すると、バックアップのストレージに対して追加の料金が発生する可能性があります。デフォルト設定を変更しなければ、バックアップコストは発生しません。 + +バックアップコストを理解するためには、使用画面からサービスごとのバックアップコストを確認できます(以下に示すように)。カスタマイズしたスケジュールで数日間バックアップが実行された後、コストの見積もりを得て、月次コストを推測することができます。 + +![バックアップ使用量チャート](./images/backup-usage.png) + +バックアップの総コストを推定するには、スケジュールを設定する必要があります。また、スケジュールを設定する前に[料金計算機](https://clickhouse.com/pricing)を更新し、月次のコストの見積もりを得るための作業も行っています。コストを見積もるには、以下の入力が必要です: +- フルバックアップと増分バックアップのサイズ +- 希望する頻度 +- 希望する保持 +- クラウドプロバイダーと地域 + +:::note +バックアップの推定コストは、サービス内のデータサイズが時間とともに変化(増加)するにつれて変わることを念頭に置いてください。 +::: + + +## バックアップを復元する + +バックアップは、元のサービスからバックアップが取られた既存のサービスではなく、新しいClickHouse Cloudサービスに復元されます。 + +**復元**のバックアップアイコンをクリックした後、新しく作成されるサービスのサービス名を指定し、このバックアップを復元できます: + +![バックアップの復元](./images/backup-restore.png) + +新しいサービスは`Provisioning`というステータスでサービスリストに表示されます。準備が整うまで: + +サービスのプロビジョニング中 + +## 復元されたサービスの利用 + +バックアップが復元されると、現在の**元のサービス**と、バックアップから復元された新しい**復元されたサービス**の2つの類似したサービスが表示されます。 + +バックアップの復元が完了したら、次のいずれかを行うべきです: +- 新しい復元されたサービスを使用し、元のサービスを削除します。 +- 新しい復元されたサービスから元のサービスにデータを移行し、新しい復元されたサービスを削除します。 + +### **新しい復元されたサービス**を使用する + +新しいサービスを使用するには、次の手順を実行します: + +1. 新しいサービスが、利用ケースに必要なIPアクセスリストのエントリを持っていることを確認します。 +1. 新しいサービスが必要なデータを含んでいることを確認します。 +1. 元のサービスを削除します。 + +### **新しい復元されたサービス**から**元のサービス**へデータを移行する + +新しく復元されたサービスを使用できない理由がある場合(たとえば、既存のサービスに接続するユーザーやアプリケーションがある場合)、新しく復元されたデータを元のサービスに移行することを選択するかもしれません。この移行は次の手順で行うことができます: + +**新しく復元されたサービスへのリモートアクセスを許可する** + +新しいサービスは通常、元のサービスと同じIPアクセスリストからのバックアップとして復元されます。他のClickHouse Cloudサービスへの接続は許可されていない、またはアクセスが**Anywhere**として許可されていない限り、接続は許可されません。一時的にどこからでもアクセスを許可するために許可リストを変更します。詳細は[IPアクセスリスト](/docs/ja/cloud/security/setting-ip-filters)のドキュメントを参照してください。 + +**新しく復元されたClickHouseサービスで(復元されたデータをホストしているシステム)** + +:::note +新しいサービスにアクセスするためには、パスワードをリセットする必要があります。サービスリストの**設定**タブから行えます。 +::: + +ソーステーブル(この例では`db.table`)を読み取り可能なユーザーを追加します: + + ```sql + CREATE USER exporter + IDENTIFIED WITH SHA256_PASSWORD BY 'password-here' + SETTINGS readonly = 1; + ``` + + ```sql + GRANT SELECT ON db.table TO exporter; + ``` + +テーブル定義をコピーします: + + ```sql + select create_table_query + from system.tables + where database = 'db' and table = 'table' + ``` + +**送信先のClickHouse Cloudシステム上で(破損したテーブルがある所)** + +送信先データベースを作成します: + ```sql + CREATE DATABASE db + ``` + +ソースからの`CREATE TABLE`ステートメントを使用し、送信先を作成します: + +:::tip +`CREATE`ステートメントを実行した際に、`ENGINE`を`ReplicatedMergeTree`に変更し、パラメータを省略します。ClickHouse Cloudは常にテーブルを複数コピーし、正しいパラメータを提供します。 +::: + + ```sql + CREATE TABLE db.table ... + # highlight-next-line + ENGINE = ReplicatedMergeTree + ORDER BY ... + ``` + +`remoteSecure`関数を使用して、新しく復元されたClickHouse Cloudサービスからデータを元のサービスに取り込みます: + + ```sql + INSERT INTO db.table SELECT * FROM + remoteSecure('source-hostname', db, table, 'exporter', 'password-here') + ``` + +データを元のサービスに正常に挿入した後、サービス内のデータを確認してください。データが確認後、新しいサービスは削除するべきです。 + +## テーブルの削除解除または削除取り消し + +ClickHouse Cloudは`UNDROP`コマンドをサポートしていません。テーブルを誤って`DROP`した場合、最適な対策は最後のバックアップから復元し、そのバックアップからテーブルを再作成することです。 + +ユーザーがテーブルを誤って削除することを防ぐために、[`GRANT`文](/docs/ja/sql-reference/statements/grant)を使用して、特定のユーザーまたはロールの[`DROP TABLE`コマンド](/docs/ja/sql-reference/statements/drop#drop-table)の権限を取り消すことができます。 + +さらに、データの誤削除を防ぐために、ClickHouse Cloudでは>`1TB`を超えるテーブルを削除することはできません。テーブルをこの閾値を超えて削除したい場合は、support@clickhouse.comにお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing.md b/docs/ja/cloud/manage/billing.md new file mode 100644 index 00000000000..68ef68673d4 --- /dev/null +++ b/docs/ja/cloud/manage/billing.md @@ -0,0 +1,200 @@ +--- +sidebar_label: 概要 +slug: /ja/manage/billing +title: 課金 +--- + +## 料金 + +料金情報については、[ClickHouse Cloud 料金](https://clickhouse.com/pricing)のページをご覧ください。請求額に影響する要因や、支出を管理する方法について知りたい方は、引き続きお読みください。 + +## Amazon Web Services (AWS) の例 + +:::note +価格は AWS `us-east-1` の料金を反映しています。 +::: + +### 開発: 月額 $51 から + +適用に最適: 初期プロジェクト・ステージング +- 開発サービス +- 16 GiB RAM, 2 vCPU +- 1 TB データ + +#### この例の料金内訳: + + | | 活動率 10% | 活動率 50% | 常時稼働 | + |---------|-----------:|-----------:|----------:| + | コンピュート | $16 | $79 | $158 | + | ストレージ | $35 | $35 | $35 | + | 合計 | $51 | $114 | $193 | + +:::note +使用ディスクが 1TB 未満の場合、消費はさらに低く抑えられます。 +::: + +### 本番 (アイドリング、自動スケーリング): 月額 $172 から + +#### 適用に最適: コストに敏感なアドホック分析アプリケーション +- 本番サービス +- 活動ワークロード約 25% 時間 +- デフォルト設定でのアイドリング +- 暴走請求を防ぐための自動スケーリング最大値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|--------------------------------:|---------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$125 | 192 GiB RAM, 48 vCPU
$1000 | 720 GiB RAM, 180 vCPU
$3750 | + | ストレージ | 1 TB データ
$47 | 5 TB データ
$235 | 10 TB データ
$470 | + | 合計 | $172 | $1,235 | $4,220 | + +### 本番 (常時稼働、予約容量): 月額 $550 から​ + +適用に最適: レイテンシーに敏感なアプリケーション + +- 本番サービス +- 活動ワークロード約 100% 時間 +- 容量予約のための自動スケーリング最小値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|-------------------------------:|-------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$503 | 96 GiB RAM, 24 vCPU
$2,012 | 360 GiB RAM, 90 vCPU
$7,545 | + | ストレージ | 1 TB データ
$47 | 4 TB データ
$188 | 8 TB データ
$376 | + | 合計 | $550 | $2,200 | $7,921 | + +さらなる見積もりの支援が必要な場合、すでに ClickHouse Cloud ユーザーであれば [サポート](https://clickhouse.cloud/support)に問い合わせるか、または [sales@clickhouse.com](mailto:sales@clickhouse.com) までご連絡ください。 + +## Google Cloud Platform (GCP) の例 + +:::note +価格は GCP `us-central-1` の料金を反映しています。 +::: + +### 開発: 月額 $46 から + +適用に最適: 初期プロジェクト・ステージング +- 開発サービス +- 16 GiB RAM, 2 vCPU +- 1 TB データ + +#### この例の料金内訳: + + | | 活動率 10% | 活動率 50% | 常時稼働 | + |---------|-----------:|-----------:|----------:| + | コンピュート | $15 | $74 | $147 | + | ストレージ | $31 | $31 | $31 | + | 合計 | $46 | $105 | $178 | + +:::note +使用ディスクが 1TB 未満の場合、消費はさらに低く抑えられます。 +::: + +### 本番 (アイドリング、自動スケーリング): 月額 $146 から + +#### 適用に最適: コストに敏感なアドホック分析アプリケーション +- 本番サービス +- 活動ワークロード約 25% 時間 +- デフォルト設定でのアイドリング +- 暴走請求を防ぐための自動スケーリング最大値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|-------------------------------:|-------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$105 | 192 GiB RAM, 48 vCPU
$843 | 720 GiB RAM, 180 vCPU
$3162 | + | ストレージ | 1 TB データ
$41 | 5 TB データ
$205 | 10 TB データ
$410 | + | 合計 | $146 | $1,048 | $3,572 | + +### 本番 (常時稼働、予約容量): 月額 $463 から​ + +適用に最適: レイテンシーに敏感なアプリケーション + +- 本番サービス +- 活動ワークロード約 100% 時間 +- 容量予約のための自動スケーリング最小値設定 + +#### この例の料金内訳: + + | | 例 1 | 例 2 | 例 3 | + |---------|------------------------------:|-------------------------------:|-------------------------------:| + | コンピュート | 24 GiB RAM, 6 vCPU
$422 | 96 GiB RAM, 24 vCPU
$1,686 | 360 GiB RAM, 90 vCPU
$6,342 | + | ストレージ | 1 TB データ
$41 | 4 TB データ
$164 | 8 TB データ
$328 | + | 合計 | $463 | $1,850 | $6,652 | + +さらなる見積もりの支援が必要な場合、すでに ClickHouse Cloud ユーザーであれば [サポート](https://clickhouse.cloud/support)に問い合わせるか、または [sales@clickhouse.com](mailto:sales@clickhouse.com) までご連絡ください。 + +## FAQ + +### 計算リソースの測定方法は? + +ClickHouse Cloud は、8G RAM ごとの単位で、1 分あたりの基準で計算リソースを測定します。 + +### ディスク上のストレージはどのように計算されますか? + +ClickHouse Cloud はクラウドオブジェクトストレージを使用し、ClickHouse テーブルに保存されているデータの圧縮サイズで測定されます。 + +### バックアップは合計ストレージに含まれますか? + +ClickHouse Cloud は、本番サービスには 2 つ、開発サービスには 1 つの無料バックアップを提供しており、バックアップはストレージに含まれません。 + +### 圧縮の見積もりをどう行うのですか? + +圧縮率はデータセットによって大きく変わる可能性があります。データがどれだけ圧縮可能であるか(高/低カーディナリティフィールドの数)や、ユーザーがスキーマをどのように設定するか(オプションのコーデックを使用するかどうかなど)によって異なります。一般的な分析データのタイプでは 10 倍程度ですが、はるかに低くなる場合も高くなる場合もあります。ガイダンスについては[最適化](/docs/ja/guides/best-practices/asyncinserts.md)ドキュメントを参照してください。データセットを ClickHouse に取り込み、ClickHouse に格納されたサイズと比較することが唯一の実用的な方法です。 + +クエリ `SELECT formatReadableSize(total_bytes) FROM system.tables WHERE name = ` を使用できます。 + +### セルフマネージドのデプロイメントがある場合、クラウドでのサービス運営コストを見積もるためのツールを ClickHouse は提供していますか? + +ClickHouse クエリログは、ClickHouse Cloud でのワークロード運営コストの見積もりに使用できる[主要メトリクス](/docs/ja/operations/system-tables/query_log.md)を記録します。セルフマネージドから ClickHouse Cloud への移行の詳細については、[移行ドキュメント](/docs/ja/integrations/migration/clickhouse-to-cloud.md)を参照し、さらなる質問があれば[ClickHouse Cloud サポート](https://clickhouse.cloud/support)に連絡してください。 + +### ClickHouse Cloud の課金オプションはどのようなものですか? + +ClickHouse Cloud は次の課金オプションに対応しています: +- セルフサービスによる月ごとの支払い(USD、クレジットカード経由) +- 直接販売による年次/複数年契約(前払 "ClickHouse クレジット" 経由、USD、追加支払いオプションあり) + +### 課金サイクルの期間はどのくらいですか? + +課金は月次課金サイクルに従い、ClickHouse Cloud の組織が作成された日付が開始日として追跡されます。 + +### 本番サービスのコスト管理に対し、ClickHouse Cloud はどのようなコントロールを提供していますか? + +- トライアルと年間コミット顧客には、消費が一定の閾値に達したときに自動メールで通知されます(50%、75%、90%)。 +- ClickHouse Cloud は、計算リソースの[高度なスケーリングコントロール](/docs/ja/cloud/manage/scaling.md)を通じて最大自動スケーリング制限を設定できるようにし、分析ワークロードの重要なコスト要因に対処します。 +- [高度なスケーリングコントロール](/docs/ja/cloud/manage/scaling.md) では、メモリ制限を設定し、非アクティブ時の一時停止/アイドリングの動作を制御するオプションがあります。 + +### 開発者向けサービスのコスト管理に対し、ClickHouse Cloud はどのようなコントロールを提供していますか? + +- [高度なスケーリングコントロール](/docs/ja/cloud/manage/scaling.md) では、非アクティブ時の一時停止/アイドリングの動作を制御できます。開発者向けサービスではメモリ割り当ての調整はサポートされていません。 +- デフォルト設定では非アクティブな期間後にサービスが一時停止します。 + +### 複数のサービスがある場合、サービスごとに請求書が発行されるのか、それとも合算された請求書が発行されるのか? + +課金期間における特定の組織内のすべてのサービスに対して、合算された請求書が発行されます。 + +### クレジットカードを追加し、トライアル期間とクレジットが終了する前にアップグレードした場合、課金はどうなりますか? + +ユーザーが 30 日間のトライアル期間が終了する前にトライアルから有料に変換した場合、トライアルクレジットの残額がある場合は、初回の 30 日間のトライアル期間中はトライアルクレジットから引き落としを続け、その後クレジットカードへの請求が発生します。 + +### 支出を管理するにはどうすれば良いですか? + +ClickHouse Cloud コンソールには、「使用量」表示があり、計算およびストレージごとに各サービスの使用量に関する詳細情報を提供します。これにより、メーター単位でのコスト内訳を理解することができます。 + +### ClickHouse Cloud サービスの AWS マーケットプレース購読についての請求書はどのようにアクセスしますか? + +すべてのマーケットプレース購読は AWS によって課金および請求されます。請求書は AWS 請求ダッシュボードからダウンロードできます。 + +### 使用量ステートメントの日付が AWS マーケットプレース請求書の日付と一致しないのはなぜですか? + +AWS マーケットプレースの請求は暦月のサイクルに従います。たとえば、使用期間が 2022 年 12 月 1 日から 2023 年 1 月 1 日までの場合、請求書は 2023 年 1 月 3 日から 5 日の間に生成されます。 + +ClickHouse Cloud の使用量ステートメントは異なる課金サイクルに従い、サインアップの日から 30 日間にわたって使用量が測定および報告されます。 + +使用量と請求書の日付が異なる場合、これらの日付が一致していない可能性があります。使用量ステートメントは特定のサービスに対する日ごとの使用量を記録するため、ユーザーはステートメントに依存してコスト内訳を確認できます。 + +### 前払いクレジットの使用に関して制限はありますか? + +ClickHouse Cloud の前払いクレジット(ClickHouse 直接またはクラウドプロバイダーのマーケットプレース経由)については、契約の条件のためにのみ利用できます。これは、受け入れ日または将来の日付に適用され、過去の期間には適用されません。前払いクレジットでカバーされない超過分はクレジットカード支払い、またはマーケットプレースの月次請求でカバーする必要があります。 diff --git a/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-committed.md b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-committed.md new file mode 100644 index 00000000000..18a1b49314e --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-committed.md @@ -0,0 +1,114 @@ +--- +slug: /ja/cloud/billing/marketplace/aws-marketplace-committed-contract +title: AWS Marketplace コミットメント契約 +description: AWS Marketplace (コミットメント契約) 経由で ClickHouse Cloud に登録する方法 +keywords: [aws, amazon, marketplace, billing, committed, committed contract] +--- + +[AWS Marketplace](https://aws.amazon.com/marketplace) を通じてコミットメント契約で ClickHouse Cloud を始めましょう。コミットメント契約、またはプライベートオファーとも呼ばれるものは、顧客が特定の期間にわたり ClickHouse Cloud に一定の金額を支払うことを約束できる契約です。 + +## 前提条件 + +- 特定の契約条件に基づく ClickHouse からのプライベートオファー。 + +## サインアップの手順 + +1. プライベートオファーを確認して受理するリンクが記載されたメールを受け取るはずです。 + +
+ +AWS Marketplace プライベートオファーメール + +
+ +2. メールの **Review Offer** リンクをクリックしてください。これにより、プライベートオファーの詳細が記載された AWS Marketplace ページに移動します。プライベートオファーを受け入れる際には、契約オプションのプルダウンでユニット数を1に設定してください。 + +3. AWS ポータルでの購読手続きを完了し、**Set up your account** をクリックします。この時点で ClickHouse Cloud にリダイレクトし、新規アカウントを登録するか既存アカウントでサインインしてください。このステップを完了しないと、AWS Marketplace サブスクリプションを ClickHouse Cloud とリンクすることができません。 + +4. ClickHouse Cloud にリダイレクトしたら、既存のアカウントでログインするか、新しいアカウントを登録してください。このステップは、ClickHouse Cloud オーガニゼーションを AWS Marketplace の請求設定に接続するため非常に重要です。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しい ClickHouse Cloud ユーザーの場合は、ページ下部の **Register** をクリックします。新しいユーザーを作成し、メールを確認するように求められます。メールを確認した後は、ClickHouse Cloud ログインページを離れ、新しいユーザー名を使用して [https://clickhouse.cloud](https://clickhouse.cloud) にログインできます。 + +
+ +ClickHouse Cloud 新規登録ページ + +
+ +新規ユーザーの場合は、ビジネスの基本情報も提供する必要があることに注意してください。以下のスクリーンショットをご覧ください。 + +
+ +ClickHouse Cloud 新規登録情報フォーム + +
+ +
+ +ClickHouse Cloud 新規登録情報フォーム 2 + +
+ +既存の ClickHouse Cloud ユーザーの場合は、単に資格情報を使用してログインしてください。 + +5. ログインが成功すると、新しい ClickHouse Cloud オーガニゼーションが作成されます。このオーガニゼーションは AWS の請求アカウントに接続され、すべての利用が AWS アカウントを通じて請求されます。 + +6. ログイン後、請求が AWS Marketplace に結びついていることを確認し、ClickHouse Cloud リソースのセットアップを開始できます。 + +
+ +AWS Marketplace の請求を表示する ClickHouse Cloud + +
+ +ClickHouse Cloud 新サービスページ + +
+ +6. サインアップ確認メールを受け取るはずです: + +
+ +AWS Marketplace 確認メール + +
+ +何か問題が発生した場合は、お気軽に[サポートチーム](https://clickhouse.com/support/program) にお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-payg.md b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-payg.md new file mode 100644 index 00000000000..bc3df0d1b8a --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/aws-marketplace-payg.md @@ -0,0 +1,169 @@ +--- +slug: /ja/cloud/billing/marketplace/aws-marketplace-payg +title: AWS Marketplace PAYG +description: AWS Marketplace(PAYG)を介してClickHouse Cloudにサブスクライブします。 +keywords: [aws, marketplace, 請求, payg] +--- + +[AWS Marketplace](https://aws.amazon.com/marketplace)でのPAYG(従量課金制)パブリックオファーを通じてClickHouse Cloudを始めましょう。 + +## 前提条件 + +- 購入権限が請求管理者によって有効化されているAWSアカウント。 +- 購入するには、このアカウントでAWS Marketplaceにログインする必要があります。 + +## サインアップの手順 + +1. [AWS Marketplace](https://aws.amazon.com/marketplace)にアクセスし、ClickHouse Cloudを検索します。 + +
+ +AWS Marketplace ホームページ + +
+ +2. [リスティング](https://aws.amazon.com/marketplace/pp/prodview-jettukeanwrfc)をクリックし、**購入オプションの表示**を選択します。 + +
+ +AWS Marketplace ClickHouse 検索 + +
+ +3. 次の画面で契約を設定します: +- **契約の期間** - PAYG契約は月単位で実行されます。 +- **更新設定** - 契約の自動更新を設定することができます。 自動更新を有効にしない場合、組織は請求サイクルの終了時に自動的に猶予期間に入り、その後停止されます。 + +- **契約オプション** - このテキストボックスに任意の数(または1)を入力できます。これらの単位の価格はパブリックオファーの場合$0であるため、価格には影響しません。これらの単位は通常、ClickHouse Cloudからのプライベートオファーを受け入れる際に使用されます。 + +- **発注書** - これは任意なので、無視しても問題ありません。 + +
+ +AWS Marketplace 契約設定 + +
+ +上記の情報を入力したら、**契約を作成**をクリックします。 契約価格が0ドルで表示されていることを確認できますが、これは支払いがないことを意味し、使用に基づいて請求が発生することになります。 + +
+ +AWS Marketplace 契約確認 + +
+ +4. **契約を作成**をクリックすると、確認して支払うためのモーダルが表示されます($0の支払い予定)。 + +5. **今すぐ支払う**をクリックすると、ClickHouse CloudのAWS Marketplaceオファリングを購読していることの確認が表示されます。 + +
+ +AWS Marketplace 支払い確認 + +
+ +6. この時点で、設定はまだ完了していません。**アカウントを設定する**をクリックしてClickHouse Cloudにリダイレクトし、そこでサインアップする必要があります。 + +7. ClickHouse Cloudにリダイレクトしたら、既存のアカウントでログインするか、新しいアカウントを登録できます。このステップは、AWS Marketplaceの請求にClickHouse Cloudの組織を結びつけるために非常に重要です。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しいClickHouse Cloudユーザーである場合は、ページの下部にある**登録**をクリックします。新しいユーザーを作成してメールを確認するように求められます。メールを確認した後、ClickHouse Cloudのログインページから離れ、新しいユーザー名を使用して[https://clickhouse.cloud](https://clickhouse.cloud)でログインできます。 + +
+ +ClickHouse Cloud サインアップページ + +
+ +新しいユーザーである場合は、ビジネスに関する基本的な情報も提供する必要があります。以下のスクリーンショットを参照してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム2 + +
+ +既存のClickHouse Cloudユーザーである場合は、資格情報を使用してログインするだけです。 + +8. ログインに成功すると、新しいClickHouse Cloud組織が作成されます。この組織はAWSの請求アカウントに接続され、すべての使用がAWSアカウントを通じて請求されます。 + +9. ログインすると、請求がAWS Marketplaceに結びついていることを確認し、ClickHouse Cloudリソースのセットアップを開始できます。 + +
+ +ClickHouse Cloud AWS Marketplace 請求確認 + +
+ +ClickHouse Cloud 新しいサービスページ + +
+ +10. サインアップ確認のメールを受け取るはずです: + +
+ +AWS Marketplace 確認メール + +
+ +問題が発生した場合は、[サポートチーム](https://clickhouse.com/support/program)にお気軽にご連絡ください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-committed.md b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-committed.md new file mode 100644 index 00000000000..555daacca51 --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-committed.md @@ -0,0 +1,174 @@ +--- +slug: /ja/cloud/billing/marketplace/azure-marketplace-committed-contract +title: Azure Marketplace コミットメント契約 +description: コミットメント契約を通じて Azure Marketplace で ClickHouse Cloud に登録 +keywords: [Microsoft, Azure, Marketplace, 請求, コミットメント, コミットメント契約] +--- + +[Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps)でコミットメント契約を通じてClickHouse Cloudを始めましょう。コミットメント契約、またはプライベートオファーとも呼ばれるこの契約では、一定期間中にClickHouse Cloud に一定額を支払うことをお客様が約束します。 + +## 前提条件 + +- 特定の契約条件に基づくClickHouseからのプライベートオファー。 + +## 登録手順 + +1. プライベートオファーを確認して受け入れるためのリンクが記載されたメールを受け取っているはずです。 + +
+ +Azure Marketplace プライベートオファーのメール + +
+ +2. メール内の**プライベートオファーを確認**リンクをクリックします。これにより、プライベートオファーの詳細が表示されたGCP Marketplaceのページに移動します。 + +
+ +Azure Marketplace プライベートオファーの詳細 + +
+ +3. オファーを受け入れると、**プライベートオファー管理**画面に移動します。Azureは購入準備に少し時間がかかる場合があります。 + +
+ +Azure Marketplace プライベートオファー管理ページ + +
+ +Azure Marketplace プライベートオファー管理ページの読み込み中 + +
+ +4. 数分後にページをリフレッシュします。オファーが**購入**可能になっているはずです。 + +
+ +Azure Marketplace プライベートオファー管理ページ 購入可 + +
+ +5. **購入**をクリックすると、フライアウトが開きます。次のことを完了してください: + +
+ +- サブスクリプションとリソースグループ +- SaaSサブスクリプションの名前を提供 +- プライベートオファーが設定された課金プランを選択します。プライベートオファーが作成された期間のみ(金額が表示されます(例: 1年)。他の課金期間オプションには$0の金額が表示されます)。 +- 定期課金の有無を選択します。定期課金が選択されていない場合、契約は請求期間の終わりに終了し、リソースは廃止予定となります。 +- **レビューしてサブスクライブ**をクリックします。 + +
+ +Azure Marketplace サブスクリプションフォーム + +
+ +6. 次の画面で、すべての詳細を確認し、**サブスクライブ**を押します。 + +
+ +Azure Marketplace サブスクリプション確認 + +
+ +7. 次の画面では、**SaaSサブスクリプションは進行中です**というメッセージが表示されます。 + +
+ +Azure Marketplace サブスクリプション送信ページ + +
+ +8. 準備が整ったら、**今すぐアカウントを構成**をクリックします。このステップは重要です。Azureのサブスクリプションをお客様のClickHouse Cloud組織に結びつける役割を果たします。このステップがないと、Marketplaceのサブスクリプションは完了しません。 + +
+ +Azure Marketplace アカウント構成今すぐボタン + +
+ +9. ClickHouse Cloudのサインアップまたはサインインページにリダイレクトされます。新しいアカウントを使用してサインアップするか、既存のアカウントを使用してサインインできます。サインインが完了すると、Azure Marketplaceを通じて請求され、使用可能な新しい組織が作成されます。 + +10. いくつかの質問に答える必要があります。次のステップに進む前に、住所や会社の詳細を入力してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +11. **サインアップを完了**をクリックすると、ClickHouse Cloud内の組織に移動し、Azure Marketplaceを通じて課金されることを確認でき、サービスを作成できるようになります。 + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +問題が発生した場合は、[サポートチーム](https://clickhouse.com/support/program) にお気軽にお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-payg.md b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-payg.md new file mode 100644 index 00000000000..c396b699bd1 --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/azure-marketplace-payg.md @@ -0,0 +1,187 @@ +--- +slug: /ja/cloud/billing/marketplace/azure-marketplace-payg +title: Azure Marketplace PAYG +description: Azure Marketplace (PAYG) を通じて ClickHouse Cloud に登録する方法。 +keywords: [azure, marketplace, 課金, payg] +--- + +[Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps) で「PAYG (Pay-as-you-go)」のパブリックオファーを利用して ClickHouse Cloud を始めましょう。 + +## 前提条件 + +- あなたの課金管理者によって購入権限が有効になっている Azure プロジェクト。 +- Azure Marketplace で ClickHouse Cloud を購読するには、購入権限のあるアカウントでログインし、適切なプロジェクトを選択する必要があります。 + +1. [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps) にアクセスし、ClickHouse Cloud を検索してください。マーケットプレースでオファーを購入できるようにログインしていることを確認してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +2. 製品リストページで、**Get It Now** をクリックします。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +3. 次の画面で、名前、メール、所在地の情報を提供する必要があります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +4. 次の画面で、**Subscribe** をクリックします。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +5. 次の画面で、サブスクリプション、リソースグループ、およびリソースグループの場所を選択します。リソースグループの場所は、ClickHouse Cloud でサービスを起動する予定の場所と同じである必要はありません。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +6. サブスクリプションの名前を提供する必要があり、利用可能なオプションから課金条件を選択します。**Recurring billing** をオンまたはオフに設定できます。オフに設定すると、課金条件が終了した時点で契約が終了し、リソースが廃止されます。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +7. **"Review + subscribe"** をクリックします。 + +8. 次の画面で、すべてが正しいことを確認し、**Subscribe** をクリックします。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +9. この時点で、ClickHouse Cloud の Azure サブスクリプションに登録されていますが、ClickHouse Cloud アカウントのセットアップはまだ行われていません。この次のステップは、ClickHouse Cloud が Azure サブスクリプションにバインドするために必要であり、Azure マーケットプレイスを通じて正しく課金されるために重要です。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +10. Azure のセットアップが完了すると、**Configure account now** ボタンがアクティブになります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +11. **Configure account now** をクリックします。 + +
+ +アカウントの設定に関する詳細を記載した以下のようなメールを受け取ります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +12. ClickHouse Cloud のサインアップまたはサインインページにリダイレクトされます。新しいアカウントを使用してサインアップするか、既存のアカウントを使用してサインインすることができます。サインインが完了すると、Azure Marketplace を介して請求される準備が整った新しい組織が作成されます。 + +13. 続行する前に、住所や会社の詳細に関するいくつかの質問に答える必要があります。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +14. **Complete sign up** をクリックすると、ClickHouse Cloud 内の組織に移動し、Azure Marketplace 経由で請求されることを確認し、サービスを作成できる請求画面を表示できます。 + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +15. もし問題が発生した場合は、遠慮なく[サポートチーム](https://clickhouse.com/support/program)までご連絡ください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-committed.md b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-committed.md new file mode 100644 index 00000000000..f253a2206e4 --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-committed.md @@ -0,0 +1,179 @@ +--- +slug: /ja/cloud/billing/marketplace/gcp-marketplace-committed-contract +title: GCP Marketplace コミット契約 +description: GCP Marketplaceを通じてClickHouse Cloudにサブスクライブする(コミット契約) +keywords: [gcp, google, marketplace, billing, committed, committed contract] +--- + +[GCP Marketplace](https://console.cloud.google.com/marketplace)を通じてClickHouse Cloudを利用するには、コミット契約を行います。コミット契約はプライベートオファーとも呼ばれ、一定期間、ClickHouse Cloudに対して一定額を支出することをコミットする契約です。 + +## 前提条件 + +- 特定の契約条件に基づくClickHouseからのプライベートオファー。 + +## 登録手順 + +1. プライベートオファーのレビューと承認を求められるメールを受信しているはずです。 + +
+ +GCP Marketplace プライベートオファーのメール + +
+ +2. メール内の**オファーをレビュー**リンクをクリックします。これにより、プライベートオファーの詳細を含むGCP Marketplaceページに遷移します。 + +
+ +GCP Marketplace オファーの概要 + +
+ +GCP Marketplace 価格の概要 + +
+ +3. プライベートオファーの詳細をレビューし、問題がなければ**承認**をクリックします。 + +
+ +GCP Marketplace 承認ページ + +
+ +4. **製品ページに移動**をクリックします。 + +
+ +GCP Marketplace 承認確認 + +
+ +5. **プロバイダで管理**をクリックします。 + +
+ +GCP Marketplace ClickHouse Cloudページ + +
+ +ここでClickHouse Cloudにリダイレクトし、サインアップまたはサインインを行うことが不可欠です。このステップを完了しないと、GCP MarketplaceのサブスクリプションをClickHouse Cloudにリンクすることができません。 + +
+ +GCP Marketplace サイト離脱確認モーダル + +
+ +6. ClickHouse Cloudにリダイレクトされると、既存のアカウントでログインするか、新しいアカウントを登録できます。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しいClickHouse Cloudユーザーの場合は、ページ下部の**登録**をクリックしてください。新しいユーザーを作成し、メールを確認するように促されます。メールを確認した後、ClickHouse Cloudのログインページを離れ、新しいユーザー名を使用して[https://clickhouse.cloud](https://clickhouse.cloud)でログインできます。 + +
+ +ClickHouse Cloud サインアップページ + +
+ +新しいユーザーの場合、ビジネスに関する基本情報も提供する必要があります。以下のスクリーンショットを参照してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +既存のClickHouse Cloudユーザーの場合は、資格情報を使用してログインするだけです。 + +7. ログインに成功すると、新しいClickHouse Cloud組織が作成されます。この組織はGCP課金アカウントと接続され、すべての使用量がGCPアカウントを通じて課金されます。 + +8. ログイン後、課金がGCP Marketplaceに確実に結び付けられていることを確認し、ClickHouse Cloudリソースの設定を開始できます。 + +
+ +ClickHouse Cloud サインインページ + +
+ +ClickHouse Cloud 新サービスページ + +
+ +9. サインアップの確認メールが送信されるはずです: + +
+
+ +GCP Marketplace 確認メール + +
+ +
+ +問題がある場合は、[サポートチーム](https://clickhouse.com/support/program)にお気軽にお問い合わせください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-payg.md b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-payg.md new file mode 100644 index 00000000000..5232e1b69fd --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/gcp-marketplace-payg.md @@ -0,0 +1,155 @@ +--- +slug: /ja/cloud/billing/marketplace/gcp-marketplace-payg +title: GCP Marketplace PAYG +description: GCP Marketplace で ClickHouse Cloud に PAYG 形式でサブスクライブする。 +keywords: [gcp, marketplace, billing, payg] +--- + +[GCP Marketplace](https://console.cloud.google.com/marketplace) を通じて、PAYG(従量課金制)公開オファーで ClickHouse Cloud を始めましょう。 + +## 前提条件 + +- 請求管理者によって購入権限が有効化された GCP プロジェクト。 +- GCP Marketplace で ClickHouse Cloud にサブスクライブするには、購入権限を持ったアカウントでログインし、適切なプロジェクトを選択する必要があります。 + +## 申し込み手順 + +1. [GCP Marketplace](https://cloud.google.com/marketplace) にアクセスし、ClickHouse Cloud を検索します。適切なプロジェクトが選択されていることを確認してください。 + +
+ +GCP Marketplace ホームページ + +
+ +2. [リスト](https://console.cloud.google.com/marketplace/product/clickhouse-public/clickhouse-cloud)をクリックし、**購読** ボタンを押します。 + +
+ +GCP Marketplace の ClickHouse Cloud + +
+ +3. 次の画面でサブスクリプションを設定します: + +- プランはデフォルトで "ClickHouse Cloud" になります +- サブスクリプション期間は "月次" +- 適切な課金アカウントを選択 +- 利用条件を確認し、**購読** ボタンをクリック + +
+ +GCP Marketplace でのサブスクリプション設定 + +
+ +4. **購読** をクリックすると、**ClickHouse へのサインアップ** というモーダルが表示されます。 + +
+ +GCP Marketplace サインアップモーダル + +
+ +5. ここで設定はまだ完了していません。**アカウントを設定** をクリックして ClickHouse Cloud にリダイレクトし、サインアップを完了してください。 + +6. ClickHouse Cloud にリダイレクトしたら、既存のアカウントでログインするか、新しいアカウントで登録します。このステップは、ClickHouse Cloud の組織を GCP Marketplace の請求に紐付けるために非常に重要です。 + +
+ +ClickHouse Cloud サインインページ + +
+ +新しい ClickHouse Cloud ユーザーの場合は、ページ下部の **登録** をクリックします。新しいユーザーを作成し、メールを確認するように促されます。メールを確認した後は、ClickHouse Cloud のログインページを閉じ、[https://clickhouse.cloud](https://clickhouse.cloud) で新しいユーザー名を使用してログインできます。 + +
+ +ClickHouse Cloud サインアップページ + +
+ +新規ユーザーの場合、事業に関する基本的な情報を提供する必要があることに注意してください。以下のスクリーンショットを参照してください。 + +
+ +ClickHouse Cloud サインアップ情報フォーム + +
+ +ClickHouse Cloud サインアップ情報フォーム 2 + +
+ +既存の ClickHouse Cloud ユーザーであれば、単に認証情報を使用してログインします。 + +7. ログインが成功すると、新しい ClickHouse Cloud の組織が作成されます。この組織は GCP の請求アカウントに接続され、すべての使用量が GCP アカウントを通じて請求されます。 + +8. ログイン後に、請求が GCP Marketplace に紐付けられていることを確認し、ClickHouse Cloud のリソースを設定し始めることができます。 + +
+ +ClickHouse Cloud サインインページ + +
+ +ClickHouse Cloud 新しいサービスページ + +
+ +9. サインアップを確認するメールを受け取るはずです: + +
+
+ +GCP Marketplace 確認メール + +
+ +
+ +問題が発生した場合は、どうぞ [サポートチーム](https://clickhouse.com/support/program) までご連絡ください。 diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-committed-1.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-committed-1.png new file mode 100644 index 00000000000..85bb249999e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-committed-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-1.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-1.png new file mode 100644 index 00000000000..e66938a4032 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-10.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-10.png new file mode 100644 index 00000000000..5ffa405fa97 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-10.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-11.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-11.png new file mode 100644 index 00000000000..a35707d9553 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-11.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-12.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-12.png new file mode 100644 index 00000000000..5444fc098dd Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-12.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-2.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-2.png new file mode 100644 index 00000000000..53331473a2c Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-3.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-3.png new file mode 100644 index 00000000000..fae6dfde6fd Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-4.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-4.png new file mode 100644 index 00000000000..270e8416a28 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-5.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-5.png new file mode 100644 index 00000000000..a78f24ed126 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-6.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-6.png new file mode 100644 index 00000000000..83da15ef569 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-7.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-7.png new file mode 100644 index 00000000000..eed74cc64da Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-8.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-8.png new file mode 100644 index 00000000000..6b344256b9a Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-8.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-9.png b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-9.png new file mode 100644 index 00000000000..d31fe6cab73 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/aws-marketplace-payg-9.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-1.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-1.png new file mode 100644 index 00000000000..ecb8b673fff Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-2.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-2.png new file mode 100644 index 00000000000..01d5d8af8ca Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-3.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-3.png new file mode 100644 index 00000000000..2db001f79e9 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-4.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-4.png new file mode 100644 index 00000000000..2d2b30fa3af Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-5.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-5.png new file mode 100644 index 00000000000..dfaf3887e1e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-6.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-6.png new file mode 100644 index 00000000000..bb091fcb35a Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-7.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-7.png new file mode 100644 index 00000000000..ed3527f2fe5 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-8.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-8.png new file mode 100644 index 00000000000..a5ee3c6fdcb Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-8.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-9.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-9.png new file mode 100644 index 00000000000..8d0e32998f8 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-committed-9.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-1.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-1.png new file mode 100644 index 00000000000..b01014470cc Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-10.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-10.png new file mode 100644 index 00000000000..067161e54da Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-10.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-11.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-11.png new file mode 100644 index 00000000000..c0375474cc2 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-11.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-12.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-12.png new file mode 100644 index 00000000000..f1fb00ee790 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-12.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-2.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-2.png new file mode 100644 index 00000000000..24cebeb8bf5 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-3.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-3.png new file mode 100644 index 00000000000..abf8fccfcb8 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-4.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-4.png new file mode 100644 index 00000000000..993270f861c Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-5.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-5.png new file mode 100644 index 00000000000..1410ba80ee1 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-6.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-6.png new file mode 100644 index 00000000000..c96297ed13f Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-7.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-7.png new file mode 100644 index 00000000000..db13f7e369e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-8.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-8.png new file mode 100644 index 00000000000..04961189abe Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-8.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-9.png b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-9.png new file mode 100644 index 00000000000..2c2926b51e1 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/azure-marketplace-payg-9.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-1.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-1.png new file mode 100644 index 00000000000..8a33fe48e06 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-2.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-2.png new file mode 100644 index 00000000000..a29bc20bc71 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-3.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-3.png new file mode 100644 index 00000000000..122609794eb Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-4.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-4.png new file mode 100644 index 00000000000..1502dc6fd5e Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-5.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-5.png new file mode 100644 index 00000000000..f6558cc919d Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-6.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-6.png new file mode 100644 index 00000000000..72786e05bd1 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-7.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-7.png new file mode 100644 index 00000000000..c592e055fbf Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-committed-7.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-1.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-1.png new file mode 100644 index 00000000000..8d0041f565b Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-1.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-2.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-2.png new file mode 100644 index 00000000000..3906d1181d4 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-2.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-3.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-3.png new file mode 100644 index 00000000000..6e0623e11d9 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-3.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-4.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-4.png new file mode 100644 index 00000000000..5069638cef9 Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-4.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-5.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-5.png new file mode 100644 index 00000000000..2d20a49f45f Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-5.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-6.png b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-6.png new file mode 100644 index 00000000000..7bbcd75c23b Binary files /dev/null and b/docs/ja/cloud/manage/billing/marketplace/images/gcp-marketplace-payg-6.png differ diff --git a/docs/ja/cloud/manage/billing/marketplace/index.md b/docs/ja/cloud/manage/billing/marketplace/index.md new file mode 100644 index 00000000000..69fe86c5cef --- /dev/null +++ b/docs/ja/cloud/manage/billing/marketplace/index.md @@ -0,0 +1,69 @@ +--- +slug: /ja/cloud/marketplace +title: Marketplaceの支払い +description: AWS、GCP、Azure Marketplaceを通じてClickHouse Cloudにサブスクライブ。 +keywords: [aws, azure, gcp, google cloud, marketplace, billing] +--- + +ClickHouse Cloudにサブスクライブするには、AWS、GCP、Azureの各マーケットプレイスを通じて行うことができます。これにより、既存のクラウドプロバイダーの請求を通じてClickHouse Cloudの支払いが可能になります。 + +**従量課金制**(PAYG)を利用するか、市場を通じてClickHouse Cloudとの契約を締結することができます。請求はクラウドプロバイダーによって処理され、すべてのクラウドサービスに対して単一の請求書を受取ります。 + +- [AWS Marketplace PAYG](/ja/cloud/billing/marketplace/aws-marketplace-payg) +- [AWS Marketplace Committed Contract](/ja/cloud/billing/marketplace/aws-marketplace-committed-contract) +- [GCP Marketplace PAYG](/ja/cloud/billing/marketplace/gcp-marketplace-payg) +- [GCP Marketplace Committed Contract](/ja/cloud/billing/marketplace/gcp-marketplace-committed-contract) +- [Azure Marketplace PAYG](/ja/cloud/billing/marketplace/azure-marketplace-payg) +- [Azure Marketplace Committed Contract](/ja/cloud/billing/marketplace/azure-marketplace-committed-contract) + +## よくある質問(FAQ) + +**自分の組織がマーケットプレイス請求に接続されていることをどのように確認できますか?** + +ClickHouse Cloudコンソールで、**Billing** に移動します。**Payment details** セクションにマーケットプレイスの名前とリンクが表示されるはずです。 + +**既存のClickHouse Cloudユーザーです。AWS / GCP / Azureマーケットプレイスを介してClickHouse Cloudにサブスクライブした場合、どうなりますか?** + +クラウドプロバイダーマーケットプレイスからClickHouse Cloudに登録するには、以下の2ステップが必要です: +1. 最初に、クラウドプロバイダーのマーケットプレースポータルでClickHouse Cloudに「サブスクライブ」します。サブスクライブを完了したら、「Pay Now」または「Manage on Provider」(マーケットプレイスによって異なる)をクリックします。これで、ClickHouse Cloudにリダイレクトされます。 +2. ClickHouse Cloudで新しいアカウントに登録するか、既存のアカウントでサインインします。どちらの場合も、マーケットプレイス請求に紐付けられた新しいClickHouse Cloud組織が作成されます。 + +**注**:以前のClickHouse Cloudサインアップで作成された既存のサービスと組織は残り、マーケットプレイス請求には接続されません。ClickHouse Cloudでは、同一アカウントで異なる請求方法を持つ複数の組織を管理できます。 + +ClickHouse Cloudコンソールの左下のメニューから組織を切り替えることができます。 + +**既存のClickHouse Cloudユーザーです。既存のサービスをマーケットプレイス経由で請求したい場合はどうすれば良いですか?** + +その場合は、[ClickHouse Cloudサポート](https://clickhouse.com/support/program)にお問い合わせください。マーケットプレイスを通じてClickHouse Cloudにサブスクライブする必要があり、リソースへの組織のリンクを切り替えて、請求がマーケットプレイスを通じて行われるようにします。 + +**マーケットプレイスユーザーとしてClickHouse Cloudにサブスクライブしました。どのようにして購読を解除できますか?** + +ClickHouse Cloudの使用を停止して、既存のすべてのClickHouse Cloudサービスを削除するだけでも問題ありません。サブスクリプションは引き続き有効ですが、再発料金はないため、料金は発生しません。 + +もしサブスクリプションの解除を希望する場合は、クラウドプロバイダーコンソールに移動し、そこでサブスクリプションの更新をキャンセルしてください。サブスクリプションが終了すると、すべての既存サービスは停止され、クレジットカードの登録が求められます。カードが追加されていない場合、2週間後にすべての既存サービスが削除されます。 + +**マーケットプレイスユーザーとしてClickHouse Cloudにサブスクライブしてから、サブスクリプションを解除しました。再度サブスクライブするにはどうすれば良いですか?** + +その場合は、通常通りClickHouse Cloudにサブスクライブしてください(マーケットプレイス経由でのサブスクライブに関するセクションを参照)。 + +- AWSマーケットプレイスの場合、新しいClickHouse Cloud組織が作成され、マーケットプレイスに接続されます。 +- GCPマーケットプレイスの場合は、古い組織が再有効化されます。 + +マーケットプレイスを利用した組織の再活性化に問題がある場合は、[ClickHouse Cloudサポート](https://clickhouse.com/support/program)にお問い合わせください。 + +**ClickHouse Cloudサービスのマーケットプレイスサブスクリプションの請求書にはどこでアクセスできますか?** + +- [AWS請求コンソール](https://us-east-1.console.aws.amazon.com/billing/home) +- [GCPマーケットプレースオーダー](https://console.cloud.google.com/marketplace/orders)(サブスクリプションに使用した請求アカウントを選択) + +**なぜ使用状況のステートメントの日付がマーケットプレイス請求書と一致しないのですか?** + +マーケットプレイスの請求はカレンダー月のサイクルに従います。たとえば、12月1日から1月1日までの使用について、1月3日から5日の間に請求書が発行されます。 + +ClickHouse Cloudの使用状況ステートメントは、サインアップ日から始まる30日間のサイクルに従ってメーターされ、報告されます。 + +これらの日付が同じでない場合は、使用状況と請求書の日付が異なることがあります。使用状況ステートメントは、特定のサービスの一日の使用を追跡するため、ユーザーはその費用の内訳を確認する際にステートメントに頼ることができます。 + +**一般的な請求情報はどこで確認できますか?** + +[Billing overview page](http://localhost:3000/docs/en/manage/billing)をご覧ください。 diff --git a/docs/ja/cloud/manage/billing/payment-thresholds.md b/docs/ja/cloud/manage/billing/payment-thresholds.md new file mode 100644 index 00000000000..a72ee142202 --- /dev/null +++ b/docs/ja/cloud/manage/billing/payment-thresholds.md @@ -0,0 +1,15 @@ +--- +sidebar_label: 支払い限度額 +slug: /ja/cloud/billing/payment-thresholds +title: 支払い限度額 +description: ClickHouse Cloud の支払い限度額と自動請求。 +keywords: [請求, 支払い限度額, 自動請求書, 請求書] +--- + +# 支払い限度額 + +ClickHouse Cloudの請求期間中の支払い金額が10,000米ドルまたはそれに相当する金額に達した場合、登録されているお支払い方法で自動的に決済されます課金の失敗は、猶予期間後にサービスの停止または終了を招く可能性があります。この支払い限度額は、ClickHouseとのコミットメント契約または他の交渉済み契約を持っているお客様には適用されません。 + +組織が支払い限度額の90%に到達し、期間中にその限度を超える見込みがある場合、組織に関連付けられた請求メールに通知が送信されます。また、支払い限度額を超えた際には、請求書と共にメール通知が送信されます。 + +これらの支払い限度額は調整可能です。ご質問がある場合は、詳細についてsupport@clickhouse.comまでご連絡ください。 diff --git a/docs/ja/cloud/manage/images/AutoScaling.png b/docs/ja/cloud/manage/images/AutoScaling.png new file mode 100644 index 00000000000..0d76dcbafaf Binary files /dev/null and b/docs/ja/cloud/manage/images/AutoScaling.png differ diff --git a/docs/ja/cloud/manage/images/backup-chain.png b/docs/ja/cloud/manage/images/backup-chain.png new file mode 100644 index 00000000000..1b11ec88df6 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-chain.png differ diff --git a/docs/ja/cloud/manage/images/backup-configuration-form.png b/docs/ja/cloud/manage/images/backup-configuration-form.png new file mode 100644 index 00000000000..c8401383d68 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-configuration-form.png differ diff --git a/docs/ja/cloud/manage/images/backup-restore.png b/docs/ja/cloud/manage/images/backup-restore.png new file mode 100644 index 00000000000..6b36ecbb03a Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-restore.png differ diff --git a/docs/ja/cloud/manage/images/backup-service-provisioning.png b/docs/ja/cloud/manage/images/backup-service-provisioning.png new file mode 100644 index 00000000000..45f16a912c9 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-service-provisioning.png differ diff --git a/docs/ja/cloud/manage/images/backup-settings.png b/docs/ja/cloud/manage/images/backup-settings.png new file mode 100644 index 00000000000..74e45fef84a Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-settings.png differ diff --git a/docs/ja/cloud/manage/images/backup-status-list.png b/docs/ja/cloud/manage/images/backup-status-list.png new file mode 100644 index 00000000000..d38aca20669 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-status-list.png differ diff --git a/docs/ja/cloud/manage/images/backup-usage.png b/docs/ja/cloud/manage/images/backup-usage.png new file mode 100644 index 00000000000..3471ec931b7 Binary files /dev/null and b/docs/ja/cloud/manage/images/backup-usage.png differ diff --git a/docs/ja/cloud/manage/images/cloud-settings-sidebar.png b/docs/ja/cloud/manage/images/cloud-settings-sidebar.png new file mode 100644 index 00000000000..b15ab174422 Binary files /dev/null and b/docs/ja/cloud/manage/images/cloud-settings-sidebar.png differ diff --git a/docs/ja/cloud/manage/images/notifications-1.png b/docs/ja/cloud/manage/images/notifications-1.png new file mode 100644 index 00000000000..39a48f4eea8 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-1.png differ diff --git a/docs/ja/cloud/manage/images/notifications-2.png b/docs/ja/cloud/manage/images/notifications-2.png new file mode 100644 index 00000000000..288017bfed0 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-2.png differ diff --git a/docs/ja/cloud/manage/images/notifications-3.png b/docs/ja/cloud/manage/images/notifications-3.png new file mode 100644 index 00000000000..454c9830f45 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-3.png differ diff --git a/docs/ja/cloud/manage/images/notifications-4.png b/docs/ja/cloud/manage/images/notifications-4.png new file mode 100644 index 00000000000..3a8103f9be3 Binary files /dev/null and b/docs/ja/cloud/manage/images/notifications-4.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman1.png b/docs/ja/cloud/manage/images/postman/postman1.png new file mode 100644 index 00000000000..7798ce24b81 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman1.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman10.png b/docs/ja/cloud/manage/images/postman/postman10.png new file mode 100644 index 00000000000..283f17311f6 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman10.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman11.png b/docs/ja/cloud/manage/images/postman/postman11.png new file mode 100644 index 00000000000..80cfcc7e031 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman11.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman12.png b/docs/ja/cloud/manage/images/postman/postman12.png new file mode 100644 index 00000000000..c5d7f750ebe Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman12.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman13.png b/docs/ja/cloud/manage/images/postman/postman13.png new file mode 100644 index 00000000000..7b31505bc23 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman13.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman14.png b/docs/ja/cloud/manage/images/postman/postman14.png new file mode 100644 index 00000000000..bc14279548c Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman14.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman15.png b/docs/ja/cloud/manage/images/postman/postman15.png new file mode 100644 index 00000000000..affc6156d14 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman15.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman16.png b/docs/ja/cloud/manage/images/postman/postman16.png new file mode 100644 index 00000000000..e6e89872c2c Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman16.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman17.png b/docs/ja/cloud/manage/images/postman/postman17.png new file mode 100644 index 00000000000..668d7260027 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman17.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman2.png b/docs/ja/cloud/manage/images/postman/postman2.png new file mode 100644 index 00000000000..43601b1600f Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman2.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman3.png b/docs/ja/cloud/manage/images/postman/postman3.png new file mode 100644 index 00000000000..4b5ad18d1fe Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman3.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman4.png b/docs/ja/cloud/manage/images/postman/postman4.png new file mode 100644 index 00000000000..b329c17e433 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman4.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman5.png b/docs/ja/cloud/manage/images/postman/postman5.png new file mode 100644 index 00000000000..b1309e3f445 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman5.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman6.png b/docs/ja/cloud/manage/images/postman/postman6.png new file mode 100644 index 00000000000..bd240b7be72 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman6.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman7.png b/docs/ja/cloud/manage/images/postman/postman7.png new file mode 100644 index 00000000000..77c3bbb5134 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman7.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman8.png b/docs/ja/cloud/manage/images/postman/postman8.png new file mode 100644 index 00000000000..5fe4241d5c6 Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman8.png differ diff --git a/docs/ja/cloud/manage/images/postman/postman9.png b/docs/ja/cloud/manage/images/postman/postman9.png new file mode 100644 index 00000000000..1a71845869b Binary files /dev/null and b/docs/ja/cloud/manage/images/postman/postman9.png differ diff --git a/docs/ja/cloud/manage/images/scaling-configure.png b/docs/ja/cloud/manage/images/scaling-configure.png new file mode 100644 index 00000000000..eff7dc9ef0b Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-configure.png differ diff --git a/docs/ja/cloud/manage/images/scaling-memory-allocation.png b/docs/ja/cloud/manage/images/scaling-memory-allocation.png new file mode 100644 index 00000000000..fe11ac96a8f Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-memory-allocation.png differ diff --git a/docs/ja/cloud/manage/images/scaling-patch-request.png b/docs/ja/cloud/manage/images/scaling-patch-request.png new file mode 100644 index 00000000000..eab877a75cf Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-patch-request.png differ diff --git a/docs/ja/cloud/manage/images/scaling-patch-response.png b/docs/ja/cloud/manage/images/scaling-patch-response.png new file mode 100644 index 00000000000..47b1e2b5d8b Binary files /dev/null and b/docs/ja/cloud/manage/images/scaling-patch-response.png differ diff --git a/docs/ja/cloud/manage/images/trial-expired.png b/docs/ja/cloud/manage/images/trial-expired.png new file mode 100644 index 00000000000..91eb3ea9484 Binary files /dev/null and b/docs/ja/cloud/manage/images/trial-expired.png differ diff --git a/docs/ja/cloud/manage/integrations.md b/docs/ja/cloud/manage/integrations.md new file mode 100644 index 00000000000..3a9b5909ade --- /dev/null +++ b/docs/ja/cloud/manage/integrations.md @@ -0,0 +1,32 @@ +--- +sidebar_label: インテグレーション +slug: /ja/manage/integrations +title: インテグレーション +--- + +ClickHouseのインテグレーションの全リストを見るには、[こちらのページ](/ja/integrations)をご覧ください。 + +## ClickHouse Cloudの専用インテグレーション + +ClickHouseには多数のインテグレーションが用意されていますが、ClickHouse Cloudにのみ利用可能な専用インテグレーションも存在します。 + +### ClickPipes + +[ClickPipes](/ja/integrations/clickpipes)は、単純なウェブベースUIを使用して、ClickHouse Cloudにデータを取り込むための管理されたインテグレーションプラットフォームです。現在、Apache Kafka、S3、GCS、Amazon Kinesisをサポートしており、さらに多くのインテグレーションが近日中に追加予定です。 + +### ClickHouse Cloud用Looker Studio + +[Looker Studio](https://lookerstudio.google.com/)は、Googleが提供する人気のビジネスインテリジェンスツールです。Looker Studioは現在、ClickHouseコネクタをサポートしておらず、代わりにMySQLワイヤープロトコルを使用してClickHouseに接続しています。 + +Looker StudioをClickHouse Cloudに接続するには、[MySQLインターフェース](/ja/interfaces/mysql)を有効にする必要があります。Looker StudioをClickHouse Cloudに接続する方法の詳細については、[こちらのページ](/ja/interfaces/mysql#enabling-the-mysql-interface-on-clickhouse-cloud)をご覧ください。 + +### MySQLインターフェース + +一部のアプリケーションは、現在ClickHouseワイヤープロトコルをサポートしていません。これらのアプリケーションでClickHouse Cloudを使用するには、Cloud Consoleを通じてMySQLワイヤープロトコルを有効にすることができます。Cloud Consoleを通じてMySQLワイヤープロトコルを有効にする方法の詳細については、[こちらのページ](/ja/interfaces/mysql#enabling-the-mysql-interface-on-clickhouse-cloud)をご覧ください。 + +## 未対応のインテグレーション + +以下のインテグレーション機能は現在、ClickHouse Cloudでは利用できません。これらはエクスペリメンタルな機能であるため、アプリケーションでこれらの機能をサポートする必要がある場合は、support@clickhouse.comまでご連絡ください。 + +- [MaterializedPostgreSQL](/ja/engines/database-engines/materialized-mysql) +- [MaterializedMySQL](/ja/engines/table-engines/integrations/materialized-postgresql) diff --git a/docs/ja/cloud/manage/notifications.md b/docs/ja/cloud/manage/notifications.md new file mode 100644 index 00000000000..5fbf5f5c841 --- /dev/null +++ b/docs/ja/cloud/manage/notifications.md @@ -0,0 +1,60 @@ +--- +title: 通知 +slug: /ja/cloud/notifications +description: あなたのClickHouse Cloudサービスの通知 +keywords: [cloud, notifications] +--- + +ClickHouse Cloudは、あなたのサービスや組織に関連する重要なイベントについての通知を送信します。通知が送信され、設定される方法を理解するために、いくつかの概念を覚えておく必要があります: + +1. **通知カテゴリ**: 請求通知やサービス関連通知などの通知のグループを指します。各カテゴリ内には、配信モードを設定できる複数の通知があります。 +2. **通知の重大度**: 通知の重要度に応じて、通知の重大度は`情報`、`警告`、または`クリティカル`です。これは設定できません。 +3. **通知チャンネル**: チャンネルは、UI、メール、Slackなど、通知が受信される方法を指します。これはほとんどの通知で設定可能です。 + +## 通知の受信 + +通知はさまざまなチャンネルを通じて受信できます。現在、ClickHouse CloudはメールおよびClickHouse Cloud UIを通じて通知を受信できます。左上のメニューでベルのアイコンをクリックすると現在の通知が表示されるフライアウトが開きます。フライアウトの下にある**すべて表示**ボタンをクリックすると、すべての通知の活動ログを表示するページに移動します。 + +
+ +バックアップ設定の構成 + +
+ +バックアップ設定の構成 + +## 通知のカスタマイズ + +各通知について、通知を受信する方法をカスタマイズできます。通知フライアウトまたは通知活動ログの2番目のタブから設定画面にアクセスできます。 + +特定の通知の配信を設定するには、鉛筆アイコンをクリックして通知配信チャンネルを変更します。 + +
+ +バックアップ設定の構成 + +
+ +バックアップ設定の構成 + +
+ +:::note +**支払い失敗**などの**必須**通知は設定できません。 +::: + +## サポートされている通知 + +現在、請求関連の通知(支払い失敗、使用量が一定のしきい値を超えた場合など)やスケーリングイベントに関連する通知(スケーリング完了、スケーリングブロックなど)を送信しています。今後、バックアップ、ClickPipes、その他関連するカテゴリの通知を追加する予定です。 diff --git a/docs/ja/cloud/manage/openapi.md b/docs/ja/cloud/manage/openapi.md new file mode 100644 index 00000000000..b72ceade3bf --- /dev/null +++ b/docs/ja/cloud/manage/openapi.md @@ -0,0 +1,50 @@ +--- +sidebar_label: APIキーの管理 +slug: /ja/cloud/manage/openapi +title: APIキーの管理 +--- + +ClickHouse Cloudは、OpenAPIを利用したAPIを提供しており、アカウントおよびサービスの各種要素をプログラムで管理することができます。 + +# APIキーの管理 + +:::note +このドキュメントは、ClickHouse Cloud APIについて説明しています。データベースAPIのエンドポイントについては、[Cloud Endpoints API](/docs/ja/cloud/security/cloud-endpoints-api.md)をご覧ください。 +::: + +1. 左側のメニューの**API Keys**タブを使用して、APIキーの作成と管理ができます。 + + ![ClickHouse Cloud API Keys Tab](@site/docs/ja/_snippets/images/openapi1.png) + +2. **API Keys**ページは、最初にAPIキーを作成するためのプロンプトを表示します。最初のキーを作成した後は、画面右上に表示される `New API Key` ボタンを使用して新しいキーを作成できます。 + + ![Initial API Screen](@site/docs/ja/_snippets/images/openapi2.png) + +3. APIキーを作成するには、キー名、キーの権限、および有効期限を指定し、`Generate API Key` をクリックします。 + + ![Create API Key](@site/docs/ja/_snippets/images/openapi3.png) + +4. 次の画面では、Key ID と Key secret が表示されます。この値をコピーして、金庫などの安全な場所に保管してください。この画面を離れた後は、これらの値は表示されません。 + + ![API Key ID and Key Secret](@site/docs/ja/_snippets/images/openapi4.png) + +5. ClickHouse Cloud APIは、[HTTP Basic Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)を使用してAPIキーの有効性を確認します。以下は、`curl`を使用してClickHouse Cloud APIにリクエストを送信する例です: + +```bash +$ KEY_ID=mykeyid +$ KEY_SECRET=mykeysecret + +$ curl --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations +``` + +6. **API Keys**ページに戻ると、キーの名前、Key IDの最後の4文字、権限、ステータス、満期日、および作成者が表示されます。この画面からキー名、権限、および有効期限を編集することができます。キーはこの画面から無効化または削除することもできます。 + +:::note +APIキーを削除すると、この操作は取り消すことができません。このキーを使用しているサービスは、すぐにClickHouse Cloudへのアクセスができなくなります。 +::: + + ![API Key Management](@site/docs/ja/_snippets/images/openapi5.png) + +## エンドポイント + +[エンドポイントドキュメントはこちら](/docs/ja/cloud/manage/api/invitations-api-reference.md)。API Key と API Secret を利用して、ベースURL `https://api.clickhouse.cloud/v1` を使用してください。 diff --git a/docs/ja/cloud/manage/postman.md b/docs/ja/cloud/manage/postman.md new file mode 100644 index 00000000000..66639d7a9af --- /dev/null +++ b/docs/ja/cloud/manage/postman.md @@ -0,0 +1,74 @@ +--- +slug: /ja/cloud/manage/postman +sidebar_label: Postmanを使用したプログラムによるAPIアクセス +title: Postmanを使用したプログラムによるAPIアクセス +--- + +このガイドでは、[Postman](https://www.postman.com/product/what-is-postman/)を使用してClickHouse Cloud APIをテストする方法を紹介します。Postmanアプリケーションは、Webブラウザ内で使用するか、デスクトップにダウンロードして使用できます。 + +### アカウントを作成 +* 無料のアカウントは[https://www.postman.com](https://www.postman.com)で利用できます。 +![Postmanサイト](@site/docs/ja/cloud/manage/images/postman/postman1.png) + +### ワークスペースを作成 +* ワークスペースに名前を付け、表示レベルを設定します。 +![ワークスペースを作成](@site/docs/ja/cloud/manage/images/postman/postman2.png) + +### コレクションを作成 +* 左上のメニューの「Explore」以下で「Import」をクリックします。 +![Explore > Import](@site/docs/ja/cloud/manage/images/postman/postman3.png) + +* モーダルが表示されます。 +![API URLの入力](@site/docs/ja/cloud/manage/images/postman/postman4.png) + +* APIアドレス「https://api.clickhouse.cloud/v1」を入力し、'Enter'を押します。 +![インポート](@site/docs/ja/cloud/manage/images/postman/postman5.png) + +* 「Import」ボタンをクリックして「Postman Collection」を選択します。 +![コレクション > Import](@site/docs/ja/cloud/manage/images/postman/postman6.png) + +### ClickHouse Cloud API仕様とインターフェース +* 「ClickHouse CloudのAPI仕様」が「Collections」内に表示されます(左ナビゲーション)。 +![APIのインポート](@site/docs/ja/cloud/manage/images/postman/postman7.png) + +* 「ClickHouse CloudのAPI仕様」をクリックします。中央のウィンドウから「Authorization」タブを選択します。 +![インポート完了](@site/docs/ja/cloud/manage/images/postman/postman8.png) + +### 認証を設定 +* ドロップダウンメニューを切り替えて「Basic Auth」を選択します。 +![Basic auth](@site/docs/ja/cloud/manage/images/postman/postman9.png) + +* ClickHouse Cloud APIキーを設定したときに受け取ったユーザー名とパスワードを入力します。 +![クレデンシャル](@site/docs/ja/cloud/manage/images/postman/postman10.png) + +### 変数を有効化 +* [変数](https://learning.postman.com/docs/sending-requests/variables/)を利用すると、Postmanで値を保存して再利用でき、APIテストが容易になります。 +#### 組織IDとサービスIDを設定 +* 「Collection」内で、中央のペインにある「Variable」タブをクリックします(ベースURLは先ほどのAPIインポートによって設定されています)。 +* 「baseURL」以下で「Add new value」と書かれたフィールドを開き、組織IDとサービスIDを代入します。 +![組織IDとサービスID](@site/docs/ja/cloud/manage/images/postman/postman11.png) + +## ClickHouse Cloud API機能のテスト +### "GET list of available organizations"のテスト +* 「OpenAPI spec for ClickHouse Cloud」以下でフォルダを展開し、> V1 > organizationsを選択します。 +* 「GET list of available organizations」をクリックし、右の青い「Send」ボタンを押します。 +![組織の取得テスト](@site/docs/ja/cloud/manage/images/postman/postman12.png) +* 戻り結果は「status: 200」とともに組織の詳細を返すべきです。(組織情報が表示されず「status: 400」を受け取った場合、設定が正しくありません)。 +![ステータス](@site/docs/ja/cloud/manage/images/postman/postman13.png) + +### "GET organizational details"のテスト +* organizationidフォルダ以下で「GET organizational details」に移動します。 +* 中央フレームのメニューでParamsの下に、organizationidが必要です。 +![組織詳細の取得テスト](@site/docs/ja/cloud/manage/images/postman/postman14.png) +* この値を中括弧で囲まれた"{{orgid}}"に編集します(この値を以前に設定したため、値が表示されるメニューが現れます)。 +![テストの提出](@site/docs/ja/cloud/manage/images/postman/postman15.png) +* 「Save」ボタンを押した後、画面右上の青い「Send」ボタンを押します。 +![返り値](@site/docs/ja/cloud/manage/images/postman/postman16.png) +* 戻り結果は「status: 200」とともに組織の詳細を返すべきです。(組織情報が表示されず「status: 400」を受け取った場合、設定が正しくありません)。 + +### "GET service details"のテスト +* 「GET service details」をクリックします。 +* organizationidおよびserviceidの値をそれぞれ{{orgid}}と{{serviceid}}に編集します。 +* 「Save」を押し、その後右の青い「Send」ボタンを押します。 +![サービスのリスト](@site/docs/ja/cloud/manage/images/postman/postman17.png) +* 戻り結果は「status: 200」とともにサービスの一覧とその詳細を返すべきです。(サービス情報が表示されず「status: 400」を受け取った場合、設定が正しくありません)。 diff --git a/docs/ja/cloud/manage/scaling.md b/docs/ja/cloud/manage/scaling.md new file mode 100644 index 00000000000..e92a50a193a --- /dev/null +++ b/docs/ja/cloud/manage/scaling.md @@ -0,0 +1,105 @@ +--- +sidebar_position: 1 +sidebar_label: 自動スケーリング +slug: /ja/manage/scaling +description: ClickHouse Cloudの自動スケーリング設定 +keywords: [autoscaling, auto scaling, scaling, horizontal, vertical, bursts] +--- + +# 自動スケーリング + +スケーリングとは、クライアントの需要に応じて使用可能なリソースを調整する能力のことです。サービスはAPIをプログラム的に呼び出したり、UIでシステムリソースを調整する設定を変更することで手動でスケーリングできます。代わりに、サービスはアプリケーションの要求に合わせて**自動スケーリング**することも可能です。 + +:::note +スケーリングは**Production**ティアのサービスにのみ適用されます。**Development**ティアのサービスはスケーリングしません。スケーリングするためには、**Development**ティアから**Production**ティアにサービスを**アップグレード**する必要があります。一度**Development**サービスがアップグレードされると、ダウングレードすることはできません。 +::: + +## ClickHouse Cloudにおけるスケーリングの仕組み +**Production**サービスは、(より大きなレプリカに切り替えることで)垂直にスケーリングしたり、(同じサイズのレプリカを追加することで)水平にスケーリングしたりできます。デフォルトでは、ClickHouse Cloudの**Production**サービスは3つの異なる可用性ゾーンに3つのレプリカで運用されます。垂直スケーリングは、長時間の挿入や読み取りに多くのメモリを必要とするクエリに役立ち、水平スケーリングは並列化によって同時実行クエリをサポートするのに役立ちます。 + +現在、ClickHouse Cloudはサービスを垂直にのみ自動スケーリングします。水平にスケーリングするには(現在プライベートプレビュー中)、ClickHouse CloudコンソールまたはCloud APIを使用する必要があります。サービスで水平スケーリングを有効にするには、support@clickhouse.comにお問い合わせのうえ、[セルフサーブ水平スケーリング](#self-serve-horizontal-scaling)のセクションをご覧ください。 + +### 垂直自動スケーリング +**Production**サービスは、CPUとメモリの使用量に基づいて自動スケーリングされます。過去30時間のルックバックウィンドウにわたってサービスの使用履歴を常に監視し、スケーリングの判断を行います。使用量が特定の閾値を上回ったり下回ったりした場合、需要に応じてサービスを適切にスケーリングします。 + +CPUベースの自動スケーリングは、CPU使用率が50-75%の範囲の上限閾値を超えたときに始動します。この時点で、クラスタへのCPU割り当てが倍増されます。CPU使用率が上限閾値の半分を下回った場合(たとえば、上限閾値が50%の場合、25%)、CPU割り当てが半減されます。 + +メモリベースの自動スケーリングでは、クラスタは最大メモリ使用量の125%、またはメモリ不足エラー(OOM)が発生した場合は最大150%までスケーリングされます。 + +CPUまたはメモリの推奨値で**より大きい方**が選ばれ、サービスに割り当てられるCPUとメモリは`1` CPUと`4 GiB`メモリの同期インクリメントでスケーリングされます。 + +注意: 現在の実装では、垂直自動スケーリングはメモリとCPUのニーズが緩やかに増加する場面ではうまく機能し、保守的になる傾向があります。ワークロードの急増に対応できるよう、より動的にし、スケーリングのためにより積極的なCPU/メモリ閾値を使用し、適切なルックバックウィンドウを使用して垂直スケーリングの意思決定を行うよう改善を進めています。 + +### 垂直自動スケーリングの設定 +ClickHouse Cloud Productionサービスのスケーリングは、**Admin**ロールを持つ組織のメンバーによって調整できます。垂直自動スケーリングを設定するには、サービス詳細ページの**設定**タブに移動し、最小および最大メモリ、及びCPU設定を調整します。 + +スケーリング設定ページ + +**最大メモリ**を**最小メモリ**よりも高く設定してください。すると、必要に応じてその範囲内でサービスがスケールします。これらの設定は、初期のサービス作成フローでも利用可能です。サービス内の各レプリカには、同じメモリとCPUリソースが割り当てられます。 + +これらの値を同じに設定することも選択でき、その場合、特定の設定にサービスを固定します。そうすることで、選択したサイズにすぐにスケーリングが強制されます。これは、クラスタでの任意の自動スケーリングを無効にし、この設定を超えたCPUまたはメモリ使用量の増加からサービスを保護しなくなることに注意してください。 + +## セルフサービスによる水平スケーリング {#self-serve-horizontal-scaling} + +ClickHouse Cloudの水平スケーリングは現在**プライベートプレビュー**中です。一旦水平スケーリングがサービスで有効になると、ClickHouse Cloud [公開API](https://clickhouse.com/docs/ja/cloud/manage/api/swagger#/paths/~1v1~1organizations~1:organizationId~1services~1:serviceId~1scaling/patch)を使用して、サービスのスケーリング設定を更新することでサービスをスケールできます。 + +- 機能がサービスで有効になっていない場合、リクエストは`BAD_REQUEST: Adjusting number of replicas is not enabled for your instance"というエラーで拒否されます。このエラーが表示され、スケーリングが既に有効になっていると考える場合は、ClickHouse Cloudサポートにお問い合わせください。 +- **Production** ClickHouseサービスは最低でも`3`つのレプリカが必要です。現在、**Production**サービスがスケールアウト可能な最大レプリカ数は`20`です。これらの制限は時間とともに増加します。現在、より高い制限が必要な場合は、ClickHouse Cloudサポートチームにご連絡ください。 +- 現在、スケールイン操作中に削除されるレプリカのシステムテーブルデータは保持されません。これは、システムテーブルデータを利用しているダッシュボードや他の機能に影響を与える可能性があります。 + +### APIを介した水平スケーリング + +クラスタを水平スケーリングするには、APIを通じて`PATCH`リクエストを発行し、レプリカ数を調整します。以下のスクリーンショットは、`3`レプリカのクラスタを`6`レプリカにスケールアウトするAPIコールと、その対応するレスポンスを示しています。 + +スケーリング設定ページ + +*レプリカ数を更新する`PATCH`リクエスト* + +スケーリング設定ページ + +*`PATCH`リクエストからのレスポンス* + +新しいスケーリングリクエストや複数のリクエストを連続して発行すると、そのうち1つが進行中の場合、スケーリングサービスは中間状態を無視し、最終的なレプリカ数に収束します。 + +### UIを介した水平スケーリング + +UIからサービスを水平スケーリングするには、**設定**ページでサービスのノード数を調整します。 + +スケーリング設定ページ + +*ClickHouse Cloudコンソールからのサービススケーリング設定* + +サービスのスケールが完了すると、クラウドコンソールのメトリックダッシュボードに正しい割り当てが表示されるはずです。以下のスクリーンショットは、クラスタが`96 GiB`の総メモリにスケールしていることを示しており、これは`6`レプリカ、各レプリカにGiBのメモリが割り当てられています。 + +スケーリング設定ページ + +## 自動アイドリング +**設定**ページでは、サービスが非アクティブ時に自動アイドリングが許可されるかどうかを選択できます(すなわち、サービスがユーザー提出のクエリを実行していないとき)。自動アイドリングにより、サービスのコストを削減でき、サービスが一時停止中はコンピューティングリソースに対して請求が発生しません。 + +:::danger 自動アイドリングを使用しない場合 +自動アイドリングは、クエリに応答する前に遅延を許容できる場合のみ使用してください。サービスが一時停止されると、その間の接続がタイムアウトします。自動アイドリングは、使用頻度が少なく、遅延が許容できるサービスに理想的です。頻繁に使用される顧客向け機能を動かすサービスには推奨されません。 +::: + +## 突発的なワークロードの取り扱い +予想されるワークロードのスパイクがある場合は、[ClickHouse Cloud API](/docs/ja/cloud/manage/api/services-api-reference.md)を使用して、あらかじめサービスを拡張し、スパイクを処理した後に需要が落ち着いたらスケールダウンすることができます。各レプリカの現在のCPUコアとメモリリソースを理解するために、以下のクエリを実行できます: + +```sql +SELECT * +FROM clusterAllReplicas('default', view( + SELECT + hostname() AS server, + anyIf(value, metric = 'CGroupMaxCPU') AS cpu_cores, + formatReadableSize(anyIf(value, metric = 'CGroupMemoryTotal')) AS memory + FROM system.asynchronous_metrics +)) +ORDER BY server ASC +SETTINGS skip_unavailable_shards = 1 +``` diff --git a/docs/ja/cloud/manage/service-types.md b/docs/ja/cloud/manage/service-types.md new file mode 100644 index 00000000000..717cce7a216 --- /dev/null +++ b/docs/ja/cloud/manage/service-types.md @@ -0,0 +1,61 @@ +--- +sidebar_label: サービスタイプ +slug: /ja/cloud/manage/service-types +title: サービスタイプ +--- + +# サービスタイプ + +ClickHouse Cloud では、いくつかのサービスタイプが利用可能です。このページでは、特定のユースケースに最適なサービスタイプについて説明します。ClickHouse Cloud 組織内で異なるサービスを持つことが可能で、それぞれに指定されたサービスタイプがあります。 + +**サービスタイプの概要:** + +| | 開発 | 本番 | 専用 | +|:---------|:-----|:---------|:---------| +|**ユースケース**|小規模ワークロード、プロトタイプ|中規模ワークロード、顧客向けアプリケーション|厳しい待ち時間と分離要件があり、カスタマイズが必要なアプリケーション| +|**ストレージ**|最大 1TB|無制限|無制限| +|**メモリ**|16 GiB|24GiB+|無制限| +|**計算**|バースト可能なCPU|専用CPU|カスタム計算オプション| +|**バックアップ**|24時間ごと、1日保持|24時間ごと、2日保持|カスタムバックアップ保持| +|**アップグレード**|自動|自動|スケジュール可能| +|**SLAとサポート**|24時間の応答時間|1時間の応答時間|カスタムSLA、専任のサポートエンジニア| + +## 開発 + +`開発`サービスは、小規模なワークロードやスタートプロジェクト向けに設計されています。ClickHouse Cloud で最も低コストのオプションです。他のサービスタイプよりも低価格ですが、`開発`サービスは高い信頼性を持ち、2つの可用性ゾーンにわたってレプリケートされています。 + +**制限事項** + +`開発`サービスは自動スケーリングをサポートしていません。`開発`サービスは、内部プロジェクトやプロトタイプ、ClickHouse を試す開発者に最適です。 + +`開発`サービスの基盤ストレージはシステムの過負荷を防ぐために制限される場合があります。継続的な挿入を伴うワークロードは、ノードあたり1秒あたり4回の挿入に制限されます。高い頻度の一時的な挿入は許可されます。 + +[**エクスペリメンタル**](/docs/ja/beta-and-experimental-features#experimental-features)な機能は、不安定であったり、サービスの異常動作やクラッシュを引き起こす可能性があるため、ClickHouse Cloud では許可されていません。ClickHouse Cloud ではいくつかの[**ベータ**](/docs/ja/beta-and-experimental-features)機能が利用可能です - **ベータ**は、その機能が**一般公開("GA")**に向かって積極的に進行していることを示します。 + +:::note +`開発`サービスは Azure ではサポートされていません。 +::: + +## 本番 + +`本番`サービスは、顧客向けアプリケーションや中規模ワークロード向けに設計されています。自動スケーリング、AWS Private Link サポート、S3 ロールベースのアクセスなど、`開発`サービスよりも高度な機能を提供します。 + +`本番`サービスは、ワークロードとトラフィックの変動に対処するために自動的にスケールします。`本番`サービスは、ほとんどのスタートアップやエンタープライズのユースケースにおいて最も一般的なサービスタイプです。 + +## 専用 + +`専用`サービスは、厳しい分離と待ち時間要件があるエンタープライズワークロード向けに設計されています。計算とメモリの設定が高度にカスタマイズ可能で、これらのサービスはアプリケーションのニーズに正確に合わせられます。 + +`専用`サービスは、高トラフィックの顧客向けアプリケーションをサポートするワークロードや、重要な社内使用に対応するエンタープライズに最適です。 + +## 別のティアへのアップグレード + +`開発`から`本番`や、`本番`から`専用`へアップグレードできます。 [サポートケース](https://console.clickhouse.cloud/support)を作成してください。 + +`専用`サービスは、厳しい分離と待ち時間要件があるエンタープライズワークロード向けに設計されています。計算とメモリの設定が高度にカスタマイズ可能で、これらのサービスはアプリケーションのニーズに正確に合わせられます。 + +`専用`サービスは、高トラフィックの顧客向けアプリケーションをサポートするワークロードや、重要な社内使用に対応するエンタープライズに最適です。 + +--- + +サービスタイプに関する質問があれば、[価格ページ](https://clickhouse.com/pricing)を確認するか、support@clickhouse.com までお問い合わせください。 diff --git a/docs/ja/cloud/manage/service-uptime.md b/docs/ja/cloud/manage/service-uptime.md new file mode 100644 index 00000000000..8f29f6d24bf --- /dev/null +++ b/docs/ja/cloud/manage/service-uptime.md @@ -0,0 +1,13 @@ +--- +sidebar_label: サービス稼働時間とSLA +slug: /ja/cloud/manage/service-uptime +title: サービス稼働時間 +--- + +## 稼働時間アラート + +ユーザーは現在、[ステータスページ](https://status.clickhouse.com/)で地域ごとの稼働時間を確認し、サービスの中断に関するアラートを購読することができます。 + +## SLA + +私たちは、プロダクションインスタンスに対してサービスレベルアグリーメント(SLA)も提供しています。SLAポリシーの詳細については、[sales@clickhouse.com](mailto:sales@clickhouse.com)までお問い合わせください。 diff --git a/docs/ja/cloud/manage/settings.md b/docs/ja/cloud/manage/settings.md new file mode 100644 index 00000000000..6f673a4815d --- /dev/null +++ b/docs/ja/cloud/manage/settings.md @@ -0,0 +1,14 @@ +--- +sidebar_label: 設定の構成 +slug: /ja/manage/settings +--- + +# 設定の構成 + +特定の[ユーザー](/docs/ja/operations/access-rights#user-account-management)または[ロール](/docs/ja/operations/access-rights#role-management)に対してClickHouse Cloudサービスの設定を指定するには、[SQL主導の設定プロファイル](/docs/ja/operations/access-rights#settings-profiles-management)を使用する必要があります。設定プロファイルを適用することで、サービスが停止、待機、アップグレードした場合でも構成した設定が持続されます。設定プロファイルについて詳しくは、[こちらのページ](/docs/ja/operations/settings/settings-profiles.md)をご覧ください。 + +現在、ClickHouse CloudではXMLベースの設定プロファイルおよび[構成ファイル](/docs/ja/operations/configuration-files.md)はサポートされていないことにご注意ください。 + +ClickHouse Cloudサービスに対して指定できる設定について詳しくは、[こちらのドキュメント](/docs/ja/operations/settings)でカテゴリ毎にすべての可能な設定をご覧ください。 + + diff --git a/docs/ja/cloud/manage/troubleshooting-billing-issues.md b/docs/ja/cloud/manage/troubleshooting-billing-issues.md new file mode 100644 index 00000000000..caee3bdcd07 --- /dev/null +++ b/docs/ja/cloud/manage/troubleshooting-billing-issues.md @@ -0,0 +1,20 @@ +--- +sidebar_label: 請求問題のトラブルシューティング +slug: /ja/manage/troubleshooting-billing-issues +title: 請求問題のトラブルシューティング +--- + +# 請求問題のトラブルシューティング + +## 機能しない支払い情報の修正 + +ClickHouse Cloud の利用には、有効で正常に機能するクレジットカードが必要です。試用期間の終了後、または最後の支払いが成功した後から30日間、サービスは継続して実行されます。しかし、有効なクレジットカードに課金できない場合、クラウドコンソールの機能は組織に対して制限されます。 + +**試用期間終了後または最後の支払い成功から30日以内に有効なクレジットカードが追加されない場合、データは削除されます。** + +支払い情報に問題がある、またはクレジットカードを追加できない場合は、[サポートチーム](https://clickhouse.com/support/program)にお問い合わせください。 + +
+ +試用期間の終了 + diff --git a/docs/ja/cloud/manage/upgrades.md b/docs/ja/cloud/manage/upgrades.md new file mode 100644 index 00000000000..89e15ecb14e --- /dev/null +++ b/docs/ja/cloud/manage/upgrades.md @@ -0,0 +1,54 @@ +--- +sidebar_label: アップグレード +slug: /ja/manage/updates +--- + +# アップグレード + +ClickHouse Cloud では、パッチ適用やアップグレードについて心配する必要がありません。修正、新機能、性能改善を含むアップグレードを定期的に展開しています。ClickHouse の新機能の詳細については、[Cloud の変更履歴](/docs/ja/cloud/reference/changelog.md)をご覧ください。 + +## バージョン互換性 + +サービスを作成するとき、[`compatibility` 設定](/docs/ja/operations/settings/settings#compatibility)は、サービスが最初にプロビジョニングされた時点で ClickHouse Cloud によって提供されている最新の ClickHouse バージョンに設定されます。 + +`compatibility` 設定により、以前のバージョンの設定のデフォルト値を使用できます。サービスが新しいバージョンにアップグレードされても、`compatibility` 設定に指定されたバージョンは変更されません。これは、サービスを作成したときに存在していた設定のデフォルト値が変更されないことを意味します(ただし、既にそれらのデフォルト値を上書きしている場合、それらはアップグレード後も持続します)。 + +サービスの `compatibility` 設定は管理できません。`compatibility` 設定に指定されているバージョンを変更したい場合は、[サポートに連絡](https://clickhouse.com/support/program)する必要があります。 + +## メンテナンスモード + +場合によっては、サービスを更新する必要があり、スケーリングやアイドリングなどの特定の機能を無効にする必要があることがあります。まれに、問題が発生しているサービスに対して何らかの措置を講じ、正常な状態に戻す必要が生じることがあります。このようなメンテナンス中は、サービスページに「メンテナンスが進行中」と書かれたバナーが表示されます。この間でもクエリのためにサービスを利用できる場合があります。 + +メンテナンス中の時間に対しては料金が課されません。_メンテナンスモード_ はまれな出来事であり、通常のサービスアップグレードと混同しないでください。 + +## リリースチャネル(アップグレードスケジュール) + +ClickHouse Cloud サービスのアップグレードスケジュールを特定のリリースチャネルに登録することで指定できます。通常のアップグレードスケジュールに加え、通常のリリーススケジュールの前にサービスを更新したい場合、**Fast release** チャネルを提供しています。早期のアップグレードのための **Fast release** チャネルへの登録は、本番環境以外での利用を推奨しており、サポートチケットを記録することでリクエストできます。 + +### Fast release チャネル(早期アップグレード) + +- 最新の ClickHouse リリースを受け取る +- 新しいリリースがテストされるため、アップグレード頻度がより高い +- 現在**Production** サービスで構成可能 +- 重要でない環境での新機能のテストに適しています。厳しい稼働時間と信頼性要件がある本番ワークロードには推奨されません。 + サービスのリリーススケジュールは、Cloud コンソールで変更できます。構成は、サービスの設定タブにあります。 + +Configure backup settings + +Configure backup settings + +:::note +開発サービスは、Fast release チャネルの直後にアップグレードされます。 +::: + +### 通常リリースチャネル + +- 本番環境に推奨 +- 新しいマイナーバージョンは **Fast release** チャネルの少なくとも 2 週間後にリリースされます +- 新しいパッチバージョンは **Fast release** チャネルの少なくとも 2 日後にリリースされます diff --git a/docs/ja/cloud/reference/_category_.yml b/docs/ja/cloud/reference/_category_.yml new file mode 100644 index 00000000000..79520c71142 --- /dev/null +++ b/docs/ja/cloud/reference/_category_.yml @@ -0,0 +1,7 @@ +label: 'Cloud Reference' +position: 1 +collapsible: true +collapsed: true +link: + type: generated-index + title: Cloud Reference diff --git a/docs/ja/cloud/reference/architecture.md b/docs/ja/cloud/reference/architecture.md new file mode 100644 index 00000000000..7b3d3d63736 --- /dev/null +++ b/docs/ja/cloud/reference/architecture.md @@ -0,0 +1,46 @@ +--- +sidebar_label: アーキテクチャ +slug: /ja/cloud/reference/architecture +--- + +# ClickHouse Cloud アーキテクチャ + +![ClickHouse Cloud architecture](@site/docs/ja/cloud/reference/images/architecture.svg) + +## オブジェクトストアに支えられたストレージ +- 事実上無制限のストレージ +- データを手動で共有する必要なし +- 特にあまり頻繁にアクセスされないデータを保存する際のコストが大幅に低減 + +## コンピュート +- 自動スケーリングとアイドリング:事前にサイズを決定する必要がなく、ピーク使用に合わせて過剰プロビジョンする必要もなし +- 自動アイドリングと再開:誰も使っていないときに未使用のコンピュートを走らせる必要がない +- デフォルトで安全で高可用性 + +## 管理 +- セットアップ、監視、バックアップ、および請求は自動的に行われます。 +- コストコントロールはデフォルトで有効であり、Cloud コンソールを通じて調整できます。 + +## サービスのアイソレーション + +### ネットワークのアイソレーション + +すべてのサービスはネットワーク層でアイソレーションされています。 + +### コンピュートのアイソレーション + +`Production` および `Development` サービスは、それぞれの Kubernetes スペース内で別々のポッドにデプロイされ、ネットワークレベルでアイソレーションされています。`Dedicated` サービスは専用の VM 上で自身の Kubernetes オペレーターと共に実行されます。 + +### ストレージのアイソレーション + +すべてのサービスは、共有バケット(AWS, GCP)またはストレージコンテナ(Azure)の別々のサブパスを使用します。 + +AWS では、ストレージへのアクセスは AWS IAM を介して制御され、各 IAM ロールはサービスごとにユニークです。**Production** および **Dedicated** サービスについては、[CMEK](/docs/ja/cloud/security/cmek)が有効化されて使用停止時の高度なデータアイソレーションを提供します。CMEK は現在、AWS サービスのみでサポートされています。 + +GCP および Azure では、サービスはオブジェクトストレージのアイソレーションが確保されており(すべてのサービスが自身のバケットまたはストレージコンテナを持っています)。 + +## 同時実行制限 + +ClickHouse Cloud サービスでは、秒あたりのクエリ数 (QPS) に制限はありません。ただし、1 レプリカあたり1000 の同時クエリ制限があります。QPS は最終的に、平均クエリ実行時間とサービス内のレプリカ数による関数となります。 + +セルフマネージドの ClickHouse インスタンスや他のデータベース/データウェアハウスと比較した ClickHouse Cloud の主な利点は、[レプリカを追加する(水平スケーリング)](/docs/ja/manage/scaling#self-serve-horizontal-scaling)ことで簡単に同時実行数を増やせることです。 diff --git a/docs/ja/cloud/reference/byoc.md b/docs/ja/cloud/reference/byoc.md new file mode 100644 index 00000000000..bc3d21d9a7b --- /dev/null +++ b/docs/ja/cloud/reference/byoc.md @@ -0,0 +1,322 @@ +--- +title: AWS用BYOC (Bring Your Own Cloud) - プライベートプレビュー +slug: /ja/cloud/reference/byoc +sidebar_label: BYOC (Bring Your Own Cloud) +keywords: [byoc, cloud, bring your own cloud] +description: 独自のクラウドインフラにClickHouseをデプロイ +--- + +## 概要 + +BYOC (Bring Your Own Cloud) を使用すると、自身のクラウドインフラにClickHouse Cloudをデプロイできます。これは、ClickHouse Cloudの管理サービスを使用することができない具体的な要件や制約がある場合に役立ちます。 + +**BYOCは現在プライベートプレビュー中です。アクセスを希望される場合は、[サポート](https://clickhouse.com/support/program)までお問い合わせください。** プライベートプレビューに関する追加情報は、[利用規約](https://clickhouse.com/legal/agreements/terms-of-service) を参照してください。 + +BYOCは現在、AWSのみサポートされており、GCPおよびMicrosoft Azureは開発中です。 + +:::note +BYOCは大規模なデプロイメント専用に設計されています。 +::: + +## 用語集 + +- **ClickHouse VPC:** ClickHouse Cloudが所有するVPC。 +- **Customer BYOC VPC:** ClickHouse Cloudによってプロビジョニングおよび管理され、ClickHouse Cloud BYOCのデプロイメントに専念する顧客クラウドアカウントのVPC。 +- **Customer VPC** 顧客クラウドアカウントが所有する他のVPCで、Customer BYOC VPCに接続する必要があるアプリケーション用に使用されます。 + +## アーキテクチャ + +メトリクスとログは顧客のBYOC VPC内に保存されます。ログは現在、ローカルのEBSに保存されています。次のアップデートで、ログはLogHouse(顧客のBYOC VPCにあるClickHouseサービス)に保存されるようになります。メトリクスはPrometheusとThanosスタックを介して顧客のBYOC VPC内にローカルに保存されます。 + +
+ +BYOC Architecture + +
+ +## オンボーディングプロセス + +プライベートプレビュー中は、ClickHouse [サポート](https://clickhouse.com/support/program) に連絡することでオンボーディングプロセスを開始します。顧客は専用のAWSアカウントを持っている必要があり、使用するリージョンを知っている必要があります。現時点では、ClickHouse Cloudをサポートしている地域でのみBYOCサービスの起動を許可しています。 + +BYOCのセットアップはCloudFormationスタックを通じて管理されます。このCloudFormationスタックは、ClickHouse CloudのBYOCコントローラーがインフラを設定および管理するための役割を作成するのみです。ClickHouseを実行するために使用されるS3、VPC、およびコンピュートリソースはCloudFormationスタックの一部ではありません。 + +## アップグレードプロセス + +定期的にソフトウェアをアップグレードします。これには、ClickHouseデータベースのバージョンアップグレード、ClickHouse Operator、EKS、およびその他のコンポーネントが含まれます。 + +アップグレードをできるだけシームレスにするよう努めています(例: ローリングアップグレードと再起動)が、ClickHouseバージョンの変更やEKSノードのアップグレードなど、一部のアップグレードはサービスに影響を与える可能性があります。その場合、顧客はメンテナンスウィンドウ(例: 毎週火曜日の午前1時PDT)を指定できます。そのようなアップグレードは、スケジュールされたメンテナンスウィンドウ中にのみ実行されることを保証します。 + +メンテナンスウィンドウは、セキュリティおよび脆弱性修正には適用されないことに注意してください。これらはオフサイクルアップグレードとして処理され、顧客と迅速にコミュニケーションを取り、必要なアクションを実行し、操作への影響を最小限に抑えるための適切な時間を調整します。 + +## CloudFormation IAM Roles + +### Bootstrap IAMロール + +bootstrap IAMロールにはこれらの権限があります: + +- VPCとEKSクラスターのセットアップに必要なEC2およびVPC操作。 +- バケットを作成するために必要な`s3:CreateBucket`などのS3操作が必要です。 +- 外部DNSにおけるroute53のレコード設定のために`route53:*`が必要です。 +- コントローラーが追加の役割を作成するために`iam:CreatePolicy`などのIAM関連の操作が必要です。詳細は次のセクションを参照してください。 +- `ClickHouse-cloud`プリフィックスで始まるリソースに限定されたeks:xx操作。 + +### コントローラーによって作成される追加のIAMロール + +CloudFormationを通じて作成された`ClickHouseManagementRole`に加えて、コントローラーは他にいくつかの役割を作成します。 + +これらの役割は、顧客のEKSクラスターで実行されるアプリケーションによって引き受けられることを意図しています。 +- **State exporter role** + - ClickHouseコンポーネントがサービスの健康情報をClickHouse Cloudに報告するもの。 + - ClickHouse Cloudが所有するSQSに書き込み権限が必要 +- **Load-balancer-controller** + - 標準的なAWSロードバランサーコントローラー + - ClickHouseサービスに必要なボリュームを管理するためのEBS CSIコントローラー +- **External-dns**、route53にDNS設定を伝搬するため +- **Cert-manager**、BYOCサービスドメイン用にTLS証明書をプロビジョニングするため +- **Cluster autoscaler**、ノードグループを適宜スケールするため + +**K8s-control-plane**と**k8s-worker**ロールはAWS EKSサービスによって引き受けられることを意図しています。 + +最後に、**data-plane-mgmt**はカスタムリソースの`ClickHouseCluster`やIstio Virtual Service/Gatewayなどを調整するためのClickHouseクラウドコントロールプレーンコンポーネントに許可するためのものです。 + +## ネットワーク境界 + +このセクションは、顧客のBYOC VPCへのおよびからのさまざまなネットワークトラフィックに焦点を当てています。 + +- **インバウンド**: 顧客のBYOC VPCに送られるトラフィック。 +- **アウトバウンド**: 顧客のBYOC VPCから発信され、そのVPC外の宛先に送信されるトラフィック +- **パブリック**: 公共のインターネットに公開されているネットワークエンドポイントアドレス +- **プライベート**: VPCピアリング、VPCプライベートリンク、Tailscaleなどを通じてのみアクセス可能なプライベートなネットワークエンドポイントアドレス + +**Istio ingressはAWS NLBの背後にデプロイされ、ClickHouseクライアントトラフィックを受け入れます** + +*インバウンド、パブリック(プライベートにすることができます)* + +Istio ingress gatewayはTLSを終了します。証明書はLet's EncryptでCertManagerによってプロビジョニングされ、EKSクラスター内にシークレットとして保存されます。IstioとClickHouse間のトラフィックは[AWSによって暗号化](https://docs.aws.amazon.com/whitepapers/latest/logical-separation/encrypting-data-at-rest-and--in-transit.html#:~:text=All%20network%20traffic%20between%20AWS,supported%20Amazon%20EC2%20instance%20types)されます。デフォルトでは、インテ入はIP許可リストフィルタリングでパブリックインターネットに利用可能です。顧客はVPCピアリングを設定してプライベートにしてパブリック接続を無効にするオプションがあります。アクセスを制限するに[IPフィルター](/ja/cloud/security/setting-ip-filters)を設定することを強くお勧めします。 + +**トラブルシューティングアクセス** + +ClickHouseクラウドエンジニアはトラブルシューティングアクセスにTailscaleを必要とします。BYOCデプロイメントへの証明書ベースの認証を求め、タイムリーに提供されます。 + +*インバウンド、パブリック(プライベートにすることができます)* + +**課金スクレイパー** + +*アウトバウンド、プライベート* + +課金スクレイパーは、ClickHouseから課金データを収集し、ClickHouseクラウドが所有するS3バケットに送信します。スクレイパーは、ClickHouseサーバーコンテナの横でサイドカートして働くコンポーネントです。定期的にClickHouseのCPUとメモリのメトリクスをスクレイプします。同じリージョンへのリクエストはVPCゲートウェイサービスのエンドポイントを介して行われます。 + +**アラート** + +*アウトバウンド、パブリック* + +AlertManagerは、顧客のClickHouseクラスターが健康ではないときにアラートをClickHouseクラウドに送信するように構成されています。メトリクスとログは顧客のBYOC VPC内に保存されます。ログは現在、ローカルのEBSに保存されています。次のアップデートで、ログはLogHouse(顧客のBYOC VPCにあるClickHouseサービス)に保存されるようになります。メトリクスはPrometheusとThanosスタックを介して顧客のBYOC VPC内にローカルに保存されます。 + +**サービス状態** + +*アウトバウンド* + +State ExporterはClickHouseのサービス状態情報をClickHouseクラウド所有のSQSに送信します。 + +## 機能 + +### サポートされている機能 + +- SharedMergeTree: ClickHouse CloudとBYOCは同じバイナリおよび設定を使用 +- サービス状態を管理するためのコンソールアクセス + - サポートされる操作には開始、停止、終了が含まれます + - サービスと状態を表示 +- バックアップとリストア +- 手動による垂直および水平スケーリング +- Falcoによるランタイムセキュリティ監視とアラート(falco-metrics) +- Tailscaleによるゼロトラストネットワーク +- 監視: クラウドコンソールにはサービスの健康を監視するための組み込みのダッシュボードがあります +- 中央ダッシュボードを使用したユーザーによる監視を選択するためのPrometheusのスクレイピング。今日、Prometheus、Grafana、Datadogをサポートしています。セットアップの詳細な手順については、[Prometheusドキュメント](/ja/integrations/prometheus) を参照してください +- VPCピアリング +- [このページ](/ja/integrations) にリストされている統合 +- セキュアなS3 + +### 計画された機能(現在サポートされていません) + +- [AWS PrivateLink](https://aws.amazon.com/privatelink/) +- [AWS KMS](https://aws.amazon.com/kms/) 別名CMEK(顧客管理型暗号化キー) +- インジェスト用のClickPipes +- 自動スケーリング +- イドル化 +- MySQLインターフェース + +## FAQ + +### コンピュート + +**この単一のEKSクラスターに複数のサービスを作成できますか?** + +はい。インフラストラクチャは、AWSアカウントとリージョンの組み合わせごとに一度プロビジョニングするだけです。 + +**BYOCをサポートしている地域はどこですか?** + +BYOCはClickHouse Cloudと同じ[リージョン](/ja/cloud/reference/supported-regions#aws-regions )セットをサポートしています。 + +**リソースオーバーヘッドはありますか?ClickHouseインスタンス以外のサービスを実行するために必要なリソースは何ですか?** + +Clickhouseインスタンス(ClickHouseサーバーおよびClickHouse Keeper)の他に、clickhouse-operator、aws-cluster-autoscaler、Istioなどなどのサービスや監視スタックを実行しています。 + +現在、それらのワークロードを実行するために専用のノードグループに3つのm5.xlargeノード(各AZに1つずつ)があります。 + +### ネットワークとセキュリティ + +**セットアップが完了した後にセットアップ中に設定された権限を取り消すことができますか?** + +現時点では不可能です。 + +**ClickHouseエンジニアがトラブルシューティングのために顧客のインフラにアクセスする際の将来のセキュリティコントロールを検討していますか?** + +はい。顧客がエンジニアのクラスターへのアクセスを承認できるようにする顧客制御のメカニズムの実装は、我々のロードマップに含まれています。現時点では、エンジニアは、クラスターへのタイムリーなアクセスを取得するために、内部のエスカレーションプロセスを経る必要があります。これは記録され、当社のセキュリティチームによって監査されます。 + +**VPCピアリングをどのようにセットアップしますか?** + +VPCピアリングの作成と削除は、サポートエスカレーションを通じて行うことができます。前提条件として、ピアリングされたVPC間でCIDR範囲が重複していない必要があります。 + +ClickHouseサポートによってVPCピアリングの構成が完了したら、ユーザーが完了する必要があるいくつかの操作があります。 + +1. ピアリングされたVPCのAWSアカウントでVPCピアリングリクエストを受け取り、受け入れる必要があります。**VPC -> Peering connections -> Actions -> Accept request**に移動してください。 + + +2. ピアリングされたVPCのルートテーブルを調整します。ClickHouseインスタンスに接続する必要があるピアリングされたVPCのサブネットを見つけます。このサブネットのルートテーブルを編集し、次の構成で1つのルートを追加します: +- 送信先: ClickHouse BYOC VPC CIDR (例: 10.0.0.0/16) +- ターゲット: ピアリング接続、pcx-12345678(ドロップダウンリストで実際のIDが表示される) + +
+ +BYOC network configuration + +
+ +3. 既存のセキュリティグループを確認し、BYOC VPCへのアクセスをブロックしないルールがあることを確認してください。 + +ピアリングされたVPCからClickHouseサービスにアクセスできるようになります。 + +ClickHouseサービスにプライベートにアクセスするには、プライベートロードバランサーとエンドポイントがプロビジョニングされ、ユーザーのピアVPCからプライベートに接続できます。エンドポイントは`-private`のサフィックスで、パブリックエンドポイントと同様です。例: +もし公開エンドポイントが `h5ju65kv87.mhp0y4dmph.us-west-2.aws.byoc.clickhouse.cloud`であるなら、プライベートエンドポイントは`h5ju65kv87-private.mhp0y4dmph.us-west-2.aws.byoc.clickhouse.cloud`になります。 + +**EKSクラスター用に作成されるVPC IP範囲を選択できますか?** + +VPC CIDR範囲を選択できます。これはVPCピアリング機能に影響を与えるためです。オンボーディング時にサポートチケットに記載してください。 + +**作成されるVPC IP範囲のサイズはどれくらいですか?** + +将来の拡張を考慮して少なくとも/22を予約することをお勧めしますが、縮小を希望する場合は/23を使用して、30のサーバーポッドに制限される可能性がある場合は可能です。 + +**メンテナンスの頻度を決めることができますか?** + +サポートに連絡してメンテナンスウィンドウをスケジュールしてください。少なくとも隔週のアップデートスケジュールの予定です。 + +## 観測可能性 + +### 組み込みの監視ツール + +#### 観測可能性のダッシュボード + +ClickHouse Cloudには、メモリ使用率、クエリレート、I/Oなどのメトリクスを表示する高度な観測可能性のダッシュボードが含まれています。これはClickHouse Cloudのウェブコンソールインターフェースの**監視**セクションでアクセスできます。 + +
+ +Observability dashboard + +
+ +#### 高度なダッシュボード + +`system.metrics`、`system.events`、`system.asynchronous_metrics`などのシステムテーブルからのメトリクスを使用して、サーバーのパフォーマンスとリソース使用状況を詳細に監視するためのダッシュボードをカスタマイズすることができます。 + +
+ +Advanced dashboard + +
+ +#### Prometheus統合 + +ClickHouse Cloudは監視のためにメトリクスをスクレイプするために使用できるPrometheusエンドポイントを提供しています。これにより、GrafanaやDatadogなどのツールとの統合が可能です。 + +**/metrics_allのhttpsエンドポイントを介したサンプルリクエスト** + +```bash +curl --user : https://i6ro4qarho.mhp0y4dmph.us-west-2.aws.byoc.clickhouse.cloud:8443/metrics_all +``` + +**サンプルレスポンス** + +```bash +# HELP ClickHouse_CustomMetric_StorageSystemTablesS3DiskBytes The amount of bytes stored on disk `s3disk` in system database +# TYPE ClickHouse_CustomMetric_StorageSystemTablesS3DiskBytes gauge +ClickHouse_CustomMetric_StorageSystemTablesS3DiskBytes{hostname="c-jet-ax-16-server-43d5baj-0"} 62660929 +# HELP ClickHouse_CustomMetric_NumberOfBrokenDetachedParts The number of broken detached parts +# TYPE ClickHouse_CustomMetric_NumberOfBrokenDetachedParts gauge +ClickHouse_CustomMetric_NumberOfBrokenDetachedParts{hostname="c-jet-ax-16-server-43d5baj-0"} 0 +# HELP ClickHouse_CustomMetric_LostPartCount The age of the oldest mutation (in seconds) +# TYPE ClickHouse_CustomMetric_LostPartCount gauge +ClickHouse_CustomMetric_LostPartCount{hostname="c-jet-ax-16-server-43d5baj-0"} 0 +# HELP ClickHouse_CustomMetric_NumberOfWarnings The number of warnings issued by the server. It usually indicates about possible misconfiguration +# TYPE ClickHouse_CustomMetric_NumberOfWarnings gauge +ClickHouse_CustomMetric_NumberOfWarnings{hostname="c-jet-ax-16-server-43d5baj-0"} 2 +# HELP ClickHouseErrorMetric_FILE_DOESNT_EXIST FILE_DOESNT_EXIST +# TYPE ClickHouseErrorMetric_FILE_DOESNT_EXIST counter +ClickHouseErrorMetric_FILE_DOESNT_EXIST{hostname="c-jet-ax-16-server-43d5baj-0",table="system.errors"} 1 +# HELP ClickHouseErrorMetric_UNKNOWN_ACCESS_TYPE UNKNOWN_ACCESS_TYPE +# TYPE ClickHouseErrorMetric_UNKNOWN_ACCESS_TYPE counter +ClickHouseErrorMetric_UNKNOWN_ACCESS_TYPE{hostname="c-jet-ax-16-server-43d5baj-0",table="system.errors"} 8 +# HELP ClickHouse_CustomMetric_TotalNumberOfErrors The total number of errors on server since the last restart +# TYPE ClickHouse_CustomMetric_TotalNumberOfErrors gauge +ClickHouse_CustomMetric_TotalNumberOfErrors{hostname="c-jet-ax-16-server-43d5baj-0"} 9 +``` + +**認証** + +ClickHouseのユーザー名とパスワードのペアを使用して認証を行います。メトリクスをスクレイプするために最小限の権限で専用のユーザーを作成することをお勧めします。少なくとも、レプリカ間で`system.custom_metrics`テーブルへの`READ`権限が必要です。例: + +```sql +GRANT REMOTE ON *.* TO scraping_user +GRANT SELECT ON system.custom_metrics TO scraping_user +``` + +**Prometheusの設定** + +以下は設定例です。`targets`エンドポイントはClickHouseサービスにアクセスするために使用されるものと同じです。 + +```bash +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "clickhouse" + static_configs: + - targets: ["..aws.byoc.clickhouse.cloud:8443"] + scheme: https + metrics_path: "/metrics_all" + basic_auth: + username: + password: + honor_labels: true +``` + +また[このブログ記事](https://clickhouse.com/blog/clickhouse-cloud-now-supports-prometheus-monitoring) および [ClickHouse用のPrometheusセットアップドキュメント](/ja/integrations/prometheus)も参照してください。 diff --git a/docs/ja/cloud/reference/changelog.md b/docs/ja/cloud/reference/changelog.md new file mode 100644 index 00000000000..64a33bfd759 --- /dev/null +++ b/docs/ja/cloud/reference/changelog.md @@ -0,0 +1,1048 @@ +--- + +slug: /ja/whats-new/cloud +sidebar_label: Cloud Changelog +title: Cloud Changelog + +--- + +このClickHouse Cloudの変更ログに加え、[Cloud Compatibility](/docs/ja/cloud/reference/cloud-compatibility.md)のページもご覧ください。 + +## 2024年10月4日 + +### ClickHouse Cloud が GCPでのベータ版HIPAA対応サービスを提供開始 + +保護された健康情報(PHI)のセキュリティを強化したいと考えているお客様は、[Google Cloud Platform (GCP)](https://cloud.google.com/)上でClickHouse Cloudにオンボードできます。ClickHouseは[HIPAAセキュリティルール](https://www.hhs.gov/hipaa/for-professionals/security/index.html)に基づく管理的、物理的、および技術的な保護策を実施し、用途やワークロードに応じて実装可能なセキュリティ設定が用意されています。利用可能なセキュリティ設定についての詳細は、[Security Shared Responsibility Model](/docs/ja/cloud/security/shared-responsibility-model)をご参照ください。 + +サービスはGCPの`us-central-1`で、**Dedicated**サービスタイプのお客様向けに提供され、業務協力契約(BAA)が必要です。この機能へのアクセスをリクエストするか、追加のGCP、AWS、Azureのリージョンの待機リストに参加するには、[sales](mailto:sales@clickhouse.com)または[support](https://clickhouse.com/support/program)までお問い合わせください。 + +### Compute-Compute分離がGCPとAzureでプライベートプレビュー開始 + +最近、AWSでのCompute-Compute分離のプライベートプレビューを発表しましたが、今回、GCPとAzureでも利用可能になりました。 + +Compute-Compute分離は、特定のサービスを読み書きまたは読み取り専用のサービスとして指定することができ、アプリケーションに最適なコンピュート構成を設計してコストとパフォーマンスを最適化します。詳細については[ドキュメントをお読みください](/docs/ja/cloud/reference/compute-compute-separation)。 + +### セルフサービスによるMFAリカバリーコード + +多要素認証を使用しているお客様は、携帯電話を紛失した場合やトークンを誤って削除した場合に使用できるリカバリーコードを取得できるようになりました。初めてMFAに登録するお客様には設定時にコードが提供されます。既存のMFAを持つお客様は、既存のMFAトークンを削除して新しいものを追加することでリカバリーコードを取得できます。 + +### ClickPipesのアップデート: カスタム証明書、レイテンシーインサイトなど! + +ClickPipesの最新アップデートをご紹介できることを嬉しく思います。ClickPipesは、ClickHouseサービスにデータを取り込む最も簡単な方法です!これらの新機能は、データ取り込みの制御を強化し、パフォーマンスメトリクスへの可視性を高めるように設計されています。 + +*Kafka用カスタム認証証明書* + +ClickPipes for Kafkaは、SASL&公開のSSL/TLSを使用するKafkaブローカー用のカスタム認証証明書をサポートします。ClickPipeの設定中にSSL証明書セクションに簡単に自分自身の証明書をアップロードし、Kafkaへのより安全な接続を確保できます。 + +*KafkaおよびKinesisのレイテンシーメトリクス導入* + +パフォーマンスの可視性は重要です。ClickPipesは現在、メッセージプロダクション(KafkaトピックまたはKinesisストリームから)からClickHouse Cloudへの取り込みまでの時間に関するインサイトを提供するレイテンシーグラフを特徴としています。この新しいメトリクスを使用して、データパイプラインのパフォーマンスをより注意深く監視し、それに応じて最適化できます。 + +Latency Metrics graph + +
+ +*KafkaおよびKinesisのスケーリングコントロール(プライベートベータ)* + +高スループットは、データ量とレイテンシーのニーズを満たすために追加のリソースを要求することがあります。クリックだけでスケーリングリソースをより効果的に調整できる水平スケーリングをClickPipesで紹介しています。この機能は現在プライベートベータで、要件に基づいてリソースを拡張できます。[support](https://clickhouse.com/support/program)に連絡してベータ版に参加してください。 + +*KafkaおよびKinesisの生メッセージ取り込み* + +KafkaまたはKinesisのメッセージ全体をパースせずに取り込むことが可能になりました。ClickPipesは、完全なメッセージを単一のStringカラムにマッピングできる`_raw_message`[仮想カラム](/docs/ja/integrations/clickpipes/kafka#kafka-virtual-columns)のサポートを提供しており、生データを必要に応じて操作する柔軟性を提供します。 + +## 2024年8月29日 + +### 新しいTerraformプロバイダー バージョン - v1.0.0 + +Terrafromを使用すると、ClickHouse Cloudサービスをプログラムで制御し、構成をコードとして保存できます。私たちのTerraformプロバイダーは20万以上のダウンロードがあり、公式にバージョンv1.0.0になりました!この新しいバージョンは、リトライロジックの改善や、ClickHouse Cloudサービスにプライベートエンドポイントを追加する新しいリソースなどの改良を含んでいます。 [Terraform provider here](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest)および[完全な変更ログはこちら](https://github.com/ClickHouse/terraform-provider-clickhouse/releases/tag/v1.0.0)ダウンロードできます。 + +### 2024年のSOC 2 Type IIレポートと更新されたISO 27001認証書 + +Azureで新たに開始されたサービスだけでなく、AWSとGCPでのサービスを含む、2024年のSOC 2 Type IIレポートと更新されたISO 27001認証書の利用開始の発表を誇らしく思います。 + +SOC 2 Type IIは、ClickHouseユーザーに提供するサービスのセキュリティ、可用性、処理の完全性、および機密性の確保に向けた継続的な取り組みを示しています。詳細については、アメリカ公認会計士協会(AICPA)が発行する[SOC 2 - サービス組織用SOC: 信頼サービス基準](https://www.aicpa-cima.com/resources/landing/system-and-organization-controls-soc-suite-of-services)および国際標準化機構(ISO)の[ISO/IEC 27001について](https://www.iso.org/standard/27001)をご確認ください。 + +また、当社のセキュリティおよびコンプライアンス文書とレポートについては、当社の [Trust Center](https://trust.clickhouse.com/) もご覧ください。 + +## 2024年8月15日 + +### Compute-compute分離がAWSでプライベートプレビュー開始 + +既存のClickHouse Cloudサービスでは、レプリカが読み取りと書き込みの両方を処理し、特定のレプリカが特定の操作のみを処理するように設定する方法がありませんでした。読み書き可能または読み取り専用のサービスとして特定のサービスを指定でき、アプリケーションの最適なコンピュート構成を設計して、コストとパフォーマンスを最適化する新しい機能であるCompute-compute分離が登場します。 + +新しいCompute-compute分離機能を使用すると、複数のオブジェクトストレージフォルダと、同じテーブル、ビューなどを使用している各々のエンドポイントを持つ複数のコンピュートノードグループを作成できます。[Compute-compute分離の詳細はこちら](/ja/cloud/reference/compute-compute-separation)。この機能にプライベートプレビューでアクセスしたい場合は、[サポートへの連絡](https://clickhouse.com/support/program)をしてください。 + +Compute-compute分離の例のアーキテクチャ + +### ClickPipes for S3とGCSがGA(一般提供)に移行、継続モードのサポート + +ClickPipesは、ClickHouse Cloudへのデータ取り込みを最も簡単に行う方法です。[ClickPipes](https://clickhouse.com/cloud/clickpipes)がS3およびGCS用として**一般提供**されることを嬉しく思います。ClickPipesは一度限りのバッチ導入と「継続モード」の両方をサポートしています。取り込みタスクは特定のリモートバケットからパターンに一致するすべてのファイルをClickHouse宛先テーブルにロードします。「継続モード」では、ClickPipesジョブは常に実行され、リモートオブジェクトストレージバケットに追加されるマッチするファイルを取り込んでいきます。これにより、任意のオブジェクトストレージ バケットをClickHouse Cloudへのデータ取り込み用の完全なステージングエリアに変えることができます。[関連ドキュメント](/ja/integrations/clickpipes)をお読みください。 + +## 2024年7月18日 + +### Prometheusのメトリクスエンドポイントが一般提供に + +前回のクラウド変更ログで、ClickHouse Cloudから[Prometheus](https://prometheus.io/)メトリクスをエクスポートするためのプライベートプレビューを発表しました。この機能により、[Grafana](https://grafana.com/)や[Datadog](https://www.datadoghq.com/)などのツールで可視化するために、[ClickHouse Cloud API](/ja/cloud/manage/api/api-overview)からメトリクスを取得することができます。この機能が**一般提供**されることを嬉しく思います。この機能の詳細は[ドキュメント](/ja/integrations/prometheus)をご参照ください。 + +### クラウドコンソールのテーブルインスペクター + +ClickHouseには、テーブルを調査してスキーマを確認するために[`DESCRIBE`](/ja/sql-reference/statements/describe-table)などのコマンドがあります。これらのコマンドはコンソールに出力されますが、テーブルとカラムに関するすべての関連データを取得するためには複数のクエリを組み合わせる必要があるため、しばしば便利ではありません。 + +クラウドコンソールに**テーブル インスペクター**を新たに導入しました。これにより、SQLを書く必要なくUI上で重要なテーブルとカラム情報を取得できます。クラウドコンソールでテーブルインスペクターを試してみてください。スキーマ、ストレージ、圧縮、その他の情報を一つの統一されたインターフェースで提供します。 + +テーブルインスペクターUI + +### 新しいJavaクライアントAPI + +[Java Client](https://github.com/ClickHouse/clickhouse-java)は、ClickHouseに接続するために最も人気のあるクライアントの一つです。これをさらに簡単で直感的に使用できるようにしたいと考えており、新しいAPI設計とさまざまなパフォーマンス最適化を含む変更を行いました。これにより、JavaアプリケーションからClickHouseへの接続が大幅に容易になります。[こちらのブログ投稿](https://clickhouse.com/blog/java-client-sequel)で、更新されたJavaクライアントの使用方法について詳しくお読みいただけます。 + +### 新しいアナライザーがデフォルトで有効化 + +過去数年にわたり、クエリアナリシスと最適化のための新しいアナライザーに取り組んでいます。このアナライザーはクエリ性能を向上させ、さらなる最適化を可能にします。これには、より高速かつ効率的な`JOIN`を含みます。以前は、この機能を有効にするために新しいユーザーは`allow_experimental_analyzer`設定を使用する必要がありました。この改良されたアナライザーは新しいClickHouse Cloudサービスでデフォルトで利用できます。 + +さらなる最適化を計画しており、アナライザーの改善が続くことをお楽しみください! + +## 2024年6月28日 + +### ClickHouse CloudがMicrosoft Azureで一般提供開始! + +[今年の5月](https://clickhouse.com/blog/clickhouse-cloud-is-now-on-azure-in-public-beta)にベータ版でMicrosoft Azureサポートを最初に発表しました。最新のクラウドリリースでは、Azureのサポートがベータから一般提供へ移行します。ClickHouse CloudはAWS、Google Cloud Platform、そしてMicrosoft Azureという三大クラウドプラットフォームのすべてで利用可能です。 + +このリリースには、[Microsoft Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/clickhouse.clickhouse_cloud)を通じてサブスクリプションをサポートすることも含まれています。このサービスは最初に以下のリージョンでサポートされます: +- 米国:West US 3(アリゾナ) +- 米国:East US 2(バージニア) +- ヨーロッパ:Germany West Central(フランクフルト) + +特定のリージョンでのサポートをご希望の場合は、[こちらからご連絡ください](https://clickhouse.com/support/program)。 + +### クエリログインサイト + +新しいクエリインサイトUI in ClickHouse Cloudのコンソールは、ClickHouse内蔵のクエリログの使用を大幅に簡単にします。ClickHouseの`system.query_log`テーブルは、クエリ最適化、デバッグ、およびクラスタ全体の健全性と性能の監視にとって重要な情報源です。ただし、70以上のフィールドとクエリごとに複数のレコードがあるため、クエリログを理解することは急な学習曲線を伴います。クエリインサイトのこの初期バージョンは、クエリデバッグと最適化パターンの簡素化のためのブループリントを提供します。この機能をさらに発展させていく中でのフィードバックをお待ちしています、ぜひご意見をお寄せください! + +クエリインサイトUI + +### Prometheusのメトリクスエンドポイント(プライベートプレビュー) + +おそらく最も求められている機能の一つ:ClickHouse Cloudから[Prometheus](https://prometheus.io/)メトリクスを[Grafana](https://grafana.com/)や[Datadog](https://www.datadoghq.com/)にエクスポートして可視化できるようになりました。Prometheusは、ClickHouseを監視し、カスタムアラートを設定するためのオープンソースソリューションを提供します。ClickHouse Cloudサービス用のPrometheusメトリクスへのアクセスは[ClickHouse Cloud API](https://clickhouse.com/docs/ja/integrations/prometheus)を介して利用可能です。この機能は現在プライベートプレビューです。組織用にこの機能を有効にするには、[サポートチーム](https://clickhouse.com/support/program)までご連絡ください。 + +GrafanaとのPrometheusメトリクス + +### その他の機能: +- [カスタマイズ可能なバックアップ](/ja/cloud/manage/backups#configurable-backups)で、頻度、保持、スケジュールなどのカスタムバックアップポリシーを設定可能です。 + +## 2024年6月13日 + +### Kafka ClickPipesコネクタ用のオフセットの設定可能性(ベータ版) + +これまで、新しい[Kafkaコネクタ用ClickPipes](/docs/ja/integrations/clickpipes/kafka)をセットアップするたびに、常にKafkaトピックの最初からデータを消費していました。この状況では、歴史的データの再処理が必要な場合、または新しい着信データを監視する場合、または特定のポイントから再開する場合に特定のユースケースに十分に柔軟ではない可能性があります。 + +ClickPipes for Kafkaには、Kafkaトピックからのデータ消費に対する柔軟性と制御を強化する新機能が追加されました。データの消費を開始するオフセットを設定できます。 + +選択可能なオプションは以下の通りです: +- 最初から: Kafkaトピックの非常に開始からデータの消費を開始します。このオプションは、すべての歴史的データを再処理する必要があるユーザーに理想的です。 +- 最新から: 最新のオフセットからデータの消費を始めます。これは、新しいメッセージにのみ関心のあるユーザーにとって便利です。 +- タイムスタンプから: 特定のタイムスタンプで生成されたまたはその後のメッセージからデータの消費を開始します。この機能により、より正確な制御が可能となり、ユーザーは正確な時点からの処理再開が可能になります。 + +Kafkaコネクタ用オフセットの設定 + +### 高速リリースチャンネルへのサービス登録 + +高速リリースチャンネルにより、従来のリリーススケジュールよりも早くサービスの更新を受け取ることが可能になります。この機能を有効にするためにはサポートチームの支援が必要でしたが、現在ではClickHouse Cloudコンソールを使用してこの機能をサービスに直接有効化できます。**設定**に移動し、**高速リリースに登録**をクリックするだけです。これで、更新ができ次第その都度受け取ります! + +高速リリースに登録 + +### Terraformによる水平スケーリングのサポート + +ClickHouse Cloudは[水平スケーリング](/docs/ja/manage/scaling#vertical-and-horizontal-scaling)、すなわち同じサイズのレプリカをサービスに追加する能力をサポートしています。水平スケーリングは、パフォーマンスと並行性を向上させて並行クエリをサポートします。以前は、ClickHouse CloudコンソールやAPIを使用して他のレプリカを追加する必要がありましたが、現在ではTerraformを使用してサービスからレプリカを追加または削除でき、必要に応じてClickHouseサービスをプログラムでスケーリングできます。 + +詳細については、[ClickHouse Terraformプロバイダ](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest/docs)をご覧ください。 + +## 2024年5月30日 + +### チームメイトとクエリを共有 + +SQLクエリを書いた場合、そのクエリがあなたのチームの他のメンバーにも役立つ可能性があります。以前は、クエリをSlackやメールで送信する必要があり、あなたが変更を加えた場合に自動でそのクエリを受け取る方法がありませんでした。 + +ClickHouse Cloudコンソールを通じてクエリを簡単に共有できることをうれしく思います。クエリエディタから、クエリをチーム全体または特定のメンバーと直接共有できます。また、読み取りまたは書き込み専用アクセスとして指定することもできます。クエリエディタの**共有**ボタンをクリックして、新しい共有クエリ機能をお試しください。 + +クエリを共有 + +### ClickHouse CloudがMicrosoft Azureでベータ版提供開始 + +Microsoft AzureでClickHouse Cloudサービスを作成する機能をついに開始しました!すでに多くの顧客がプライベートプレビュー プログラムの一環としてAzure上でClickHouse Cloudを本番で使用しています。今後、任意のユーザーがAzureに自身のサービスを作成できます。AWSおよびGCPでサポートされているすべてのClickHouse機能はAzureでも動作します。 + +ClickHouse Cloud for Azureは次の数週間以内に一般提供に向けた準備を進めています。[このブログ投稿をお読みください](https://clickhouse.com/blog/clickhouse-cloud-is-now-on-azure-in-public-beta) またはClickHouse Cloudコンソールを通じてAzureを使用して新しいサービスを作成してください。 + +注意: 現時点ではAzureの**開発**サービスはサポートされていません。 + +### クラウドコンソールによるプライベートリンクのセットアップ + +私たちのプライベートリンク機能は、ClickHouse Cloudサービスを自分のクラウドプロバイダアカウント内の内部サービスに接続し、パブリックインターネットにトラフィックを送信することなくコスト削減とセキュリティを強化します。以前は、設定が難しく、ClickHouse Cloud APIの使用が必要でした。 + +現在では、ClickHouse Cloudコンソールからボタンを数回クリックするだけでプライベートエンドポイントを設定できます。サービスの **設定** に移動し、**セキュリティ** セクションで **プライベートエンドポイントの設定** をクリックするだけです。 + +![プライベートエンドポイントの設定](./images/may-30-private-endpoints.png) + +## 2024年5月17日 + +### Amazon Kinesisを使用したClickPipesによるデータ取り込み(Beta) + +ClickPipesはクリックハウスクラウドによるコード不要のデータ取り込み独自サービスです。Amazon KinesisはAWSのフルマネージドストリーミングサービスで、データストリームを受信し保存し、処理するために用いられます。最もリクエストのある統合の一つであるAmazon KinesisのClickPipes betaを開始しました。私たちはClickPipesにさらに多くの統合を追加していく予定ですので、どのデータソースをサポートしてほしいか教えてください!この機能の詳細については[こちら](https://clickhouse.com/blog/clickpipes-amazon-kinesis)をお読みください。 + +クラウドコンソールで新しいAmazon Kinesis統合をClickPipesで試してみてください: + +![Amazon Kinesis on ClickPipes](./images/may-17-kinesis.png) + +### カスタマイズ可能なバックアップ (プライベート プレビュー) + +バックアップは任意のデータベース(こむ論じることなく)にとって重要です。ClickHouse Cloudのデータベースバックアップは初日から非常に重視しています。今週、より多くの柔軟性を持たせるためのサービスのバックアップを可能にするカスタマイズ可能なバックアップを開始しました。開始時刻、保持、および頻度の制御が可能になりました。この機能は**本番用**および**専用**サービス向けに提供されており、**開発**サービスには対応していません。この機能はプライベートプレビューであるため、この機能をサービス用に有効にするにはsupport@clickhouse.comまでお問い合わせください。[カスタマイズ可能なバックアップの詳細はこちら](https://clickhouse.com/blog/configurable-backups-in-clickhouse-cloud). + +### SQLクエリからAPIを作成(ベータ版) + +ClickHouse用にSQLクエリを書くと、アプリケーションへのクエリ公開のためにClickHouseに接続するためのドライバーが必要です。これにより、**クエリエンドポイント**機能を使って、任意の設定を行わずにAPIからSQLクエリを直接実行できます。クエリエンドポイントはJSON、CSV、またはTSVを返すことができます。クラウドコンソール内の **共有** ボタンをクリックして、この新しいクエリ機能を試してみてください。[クエリエンドポイントの詳細はこちら](https://clickhouse.com/blog/automatic-query-endpoints). + +クエリエンドポイントを設定 + +### 公式ClickHouse認定が利用可能に + +ClickHouse Developトレーニングコースには12の無料トレーニングモジュールがあります。今週まで、ClickHouseの公式の習熟度を証明する方法がありませんでした。現在、**ClickHouse認定開発者**となるための公式試験を開始しました。この試験を完了することで、現在および将来の雇用主に対して、データ取り込み、モデリング、分析、パフォーマンス最適化などのトピックにおけるClickHouseの習熟度を共有することができます。[こちらで試験を受ける](https://clickhouse.com/learn/certification)ことができ、ClickHouse認定について[ブログ投稿を読む](https://clickhouse.com/blog/first-official-clickhouse-certification)こともできます。 + +## 2024年4月25日 + +### S3およびGCSからClickPipesを使用してデータをロード + +新しくリリースされたクラウドコンソールでは、”データソース”と呼ばれる新しいセクションがあります。この”データソース”ページは、ClickPipesによって動作し、ClickHouse Cloudにさまざまなソースから簡単にデータを挿入できます。 + +最新のClickPipesの更新では、Amazon S3およびGoogle Cloud Storageからデータを直接アップロードする機能が追加されました。組み込みのテーブル関数を引き続き使用できますが、ClickPipesはUIを通じた完全に管理されたサービスで、S3およびGCSから数クリックでデータを取り込むことができます。この機能はまだプライベートプレビューですが、クラウドコンソールで試してみることができます。 + +![ClickPipes S3 and GCS](./images/clickpipes-s3-gcs.png) + +### Fivetranを使用して500以上のソースからClickHouse Cloudにデータをロード + +ClickHouseは大規模データセットを迅速にクエリできますが、もちろん最初にデータをClickHouseに挿入する必要があります。Fivetranの包括的なコネクタ範囲を利用すれば、ZendeskやSlackなどのお気に入りのアプリケーションからデータを素早くロードできるようになります。Fivetranの新しいClickHouse宛先を使用して、アプリケーションデータのターゲットデータベースとしてClickHouseを指定できるようになります。 + +これは私たちのインテグレーションチームが多くの努力を重ねて構築したオープンソースの統合です。私たちの[リリースブログ投稿](https://clickhouse.com/blog/fivetran-destination-clickhouse-cloud)および[GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-fivetran-destination)を確認できます。 + +### その他の変更 + +**コンソールの変更** +- SQLコンソールでの出力フォーマットサポート + +**インテグレーションの変更** +- ClickPipes Kafkaコネクタは複数のブローカー設定をサポートします +- ODBCドライバーの構成オプションを指定するPowerBIコネクタのサポート + +## 2024年4月18日 + +### AWS東京リージョンがClickHouse Cloudに対応 + +このリリースで、ClickHouse Cloud用の新しいAWS東京リージョン(`ap-northeast-1`)を導入しました。ClickHouseを最速のデータベースにしたいと考えているため、レイテンシーを可能な限り短くするために全てのクラウドにおけるリージョンの追加を続けています。更新されたクラウドコンソールで東京に新しいサービスを作成することができます。 + +![東京サービスの作成](./images/create-tokyo-service.png) + +その他の変更: + +### コンソールの変更 +- ClickPipes用KafkaへのAvroフォーマットサポートが一般提供 +- Terraformプロバイダのサービスとプライベートエンドポイントのリソースインポートの完全なサポートを実装 + +### インテグレーションの変更 +- NodeJSクライアントの主要な安定リリース:query + ResultSet用のアドバンストTypeScriptサポート、URL構成 +- Kafkaコネクタの修正:DLQに書き込む際の例外を無視する問題、Avro Enumタイプのサポートを追加、[MSK](https://www.youtube.com/watch?v=6lKI_WlQ3-s)および[Confluent Cloud](https://www.youtube.com/watch?v=SQAiPVbd3gg)でのコネクタの使用ガイドを公開 +- Grafanaの修正:UIでのNullableタイプサポート、動的OTELトレーステーブル名のサポート +- DBTの修正:カスタムマテリアライゼーション用のモデル設定 +- Javaクライアントの修正:エラーコードの解析の不備 +- Pythonクライアントの修正:数値タイプのパラメータバインディング、クエリバインディングの際のナンバーリストに関するバグ修正、SQLAlchemyポイントサポートを追加 + +## 2024年4月4日 + +### 新しいClickHouse Cloud Consoleのご紹介 + +このリリースでは、新しいクラウドコンソールのプライベートプレビューを導入しています。 + +ClickHouseでは、開発者エクスペリエンスの向上について常に考えています。私たちは、最速のリアルタイムデータウェアハウスを提供するだけでなく、使いやすく管理しやすいものにする必要があることを認識しています。 + +ClickHouse Cloudの何千人ものユーザーが毎月数十億のクエリをSQLコンソールで実行し続けています。そのため、ClickHouse Cloudサービスと相互作用することをさらに簡単にするために、一流のコンソールにさらに投資することを決断しました。今回の新しいクラウドコンソール体験は、スタンドアロンSQLエディタと管理コンソールを一つの直感的なUIに組み合わせています。 + +選ばれた顧客が新しいクラウドコンソール体験のプレビューを受けます - ClickHouseでデータを探索し、管理するための統一された没入的な方法です。優先アクセスを希望する方は、support@clickhouse.comまでご連絡ください。 + +![新しいクラウドコンソール](./images/new-cloud-console.gif) + +## 2024年3月28日 + +このリリースでは、Microsoft Azureのサポート、APIを介した水平スケーリング、プライベートプレビューでのリリースチャネルが導入されています。 + +### 一般的な更新 +- プライベートプレビューでのMicrosoft Azureのサポートを導入。アクセスを得るには、アカウント管理またはサポートにお問い合わせください、または[待機リスト](https://clickhouse.com/cloud/azure-waitlist)に参加してください。 +- リリースチャネルの導入 - 環境タイプに基づいたアップグレードタイミングの指定機能。このリリースでは、非本番環境を本番環境の前にアップグレードするための「快速」リリースチャネルを追加しました(有効にするにはサポートにご連絡ください)。 + +### 管理変更 +- APIを利用した水平スケーリング構成をサポート(プライベートプレビュー、有効化にはサポートへの連絡が必要) +- 起動時にメモリ不足エラーに直面しているサービスのスケールアップを改善 +- AWSのCMEKのTerraformプロバイダーでのサポートを追加 + +### コンソールの変更 +- Microsoftソーシャルログインのサポートを追加 +- SQLコンソールでのクエリ共有機能を追加 +- クエリエディタのパフォーマンスを大幅に改善(EU地域の一部で5秒から1.5秒のレイテンシー) + +### インテグレーションの変更 +- ClickHouse OpenTelemetryエクスポーター:ClickHouseのレプリケーションテーブルエンジンに対する[サポートを追加](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/31920)し[統合テストを追加](https://github.com/open-telemetry/opentelemetry-collector-contrib/pull/31896) +- ClickHouse DBTアダプタ:TTL表現サポートに関する[テスト](https://github.com/ClickHouse/dbt-clickhouse/pull/254)と[Dictionaryのマテリアライゼーションマクロサポート](https://github.com/ClickHouse/dbt-clickhouse/pull/255)を追加 +- ClickHouse Kafka Connect Sink:[Kafkaプラグイン検出](https://github.com/ClickHouse/clickhouse-kafka-connect/issues/350)と互換性があります(コミュニティの貢献) +- ClickHouse Javaクライアント:[新しいクライアントAPIパッケージ](https://github.com/ClickHouse/clickhouse-java/pull/1574)を導入し、[クラウドテスト用のテストカバレッジを追加](https://github.com/ClickHouse/clickhouse-java/pull/1575) +- ClickHouse NodeJSクライアント:新しいHTTPキープアライブ動作のテストとドキュメントを拡張。v0.3.0リリース以降利用可能 +- ClickHouse Golangクライアント:MapのキーとしてのEnumに[バグを修正](https://github.com/ClickHouse/clickhouse-go/pull/1236); エラー接続が接続プールに残される[バグを修正](https://github.com/ClickHouse/clickhouse-go/pull/1237)(コミュニティの貢献) +- ClickHouse Pythonクライアント:PyArrow経由でのクエリストリーミングを[サポート](https://github.com/ClickHouse/clickhouse-connect/issues/155) (コミュニティの貢献) + +### セキュリティ更新 +- [「クエリキャッシングが有効な場合、役割ベースのアクセス制御がバイパスされる」](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-45h5-f7g3-gr8r)(CVE-2024-22412)を防ぐためにClickHouse Cloudを更新しました。 + +## 2024年3月14日 + +このリリースは、新しいクラウドコンソール体験、S3およびGCSからのClickPipesのデータ一括ローディングのプレビュー版、およびClickPipesでのKafka用Avroフォーマットのサポートをもたらします。また、ClickHouseデータベースバージョンを24.1にアップグレードし、新しい関数、パフォーマンス、およびリソース使用最適化をサポートします。 + +### コンソールの変更 +- 早期アクセスでの新しいクラウドコンソール体験が利用可能(参加に興味がある方はサポートにお問い合わせください)。 +- S3およびGCSからの一括ローディングのためのClickPipesが早期アクセスで利用可能(参加に興味がある方はサポートにお問い合わせください)。 +- KafkaのClickPipesでのAvroフォーマットサポートが早期アクセスで利用可能(参加に興味がある方はサポートにお問い合わせください)。 + +### ClickHouseバージョンアップグレード +- FINALの最適化、ベクトル化の設計改善、より速い集計 - [23.12リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-12#optimizations-for-final)で詳細を参照 +- Punycode処理、文字列類似性、外れ値検出のための新しい関数、そしてKeeperのメモリー最適化 - [24.1リリースブログ](https://clickhouse.com/blog/clickhouse-release-24-01)および[プレゼンテーション](https://presentations.clickhouse.com/release_24.1/)で詳細情報を参照 +- このClickHouse cloudバージョンは24.1に基づいており、数十の新機能、性能改善、およびバグ修正が含まれています。詳細は[コアデータベース変更ログ](/docs/ja/whats-new/changelog/2023#2312)を参照してください。 + +### インテグレーションの変更 +- Grafana:v4向けのダッシュボード移行修正、アドホックフィルタリングの論理補正 +- Tableau Connector:DATENAME関数と「real」引数の四捨五入処理を修正 +- Kafka Connector:接続初期化時のNPE修正、JDBCドライバーオプション指定機能追加 +- Golang クライアント:レスポンスハンドリングのメモリ使用量削減、Date32極値修正、圧縮が有効な場合のエラー報告改善 +- Python Client:datetimeパラメータのタイムゾーンサポート改善、Pandas DataFrameのパフォーマンス改善 + +## 2024年2月29日 + +このリリースは、SQLコンソールアプリケーションの読み込み時間を改善し、ClickPipesでSCRAM-SHA-256認証のサポートを追加し、Kafka Connectでネストされた構造体のサポートを拡張します。 + +### コンソールの変更 +- SQLコンソールアプリケーションの初期読み込み時間を最適化 +- 'authentication failed'エラーを引き起こすSQLコンソール競合状態を修正 +- 監視ページで最新のメモリアロケーション値が時々不正確であった振る舞いを修正 +- SQLコンソールが時々重複したKILLクエリコマンドを発行する問題を修正 +- SCRAM-SHA-256認証メソッドを使用するKafkaベースのデータソース用ClickPipesのサポートを追加 + +### インテグレーションの変更 +- Kafka Connector:複雑なネストされた構造体(Array、Map)のサポートを拡張;FixedStringタイプのサポートを追加;複数のデータベースへの取り込みサポートを追加 +- Metabase:ClickHouseバージョン23.8より低い場合の非互換性を修正 +- DBT:モデル作成への設定を渡す能力を追加 +- Node.jsクライアント:長時間のクエリ (>1時間) のサポートを追加、空の値を正常に処理する + +## 2024年2月15日 + +このリリースはコアデータベースバージョンの更新、Terraformを使用したプライベートリンクの設定機能を追加し、Kafka Connectを介した非同期挿入に対する正確な一度のセマンティクスをサポートします。 + +### ClickHouseバージョンアップグレード +- S3Queueテーブルエンジンは、S3からの連続かつスケジュールされたデータロードのためのプロダクション対応となります。 - [23.11リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-11) で詳細をご確認ください。 +- FINALの重要なパフォーマンス向上と、SIMD命令用のベクトル化向上の結果としての高速なクエリ - [23.12リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-12#optimizations-for-final) で詳細をご覧ください。 +- このClickHouseクラウドバージョンは23.12に基づいていて、多数の新機能、性能向上、およびバグ修正が行われています。詳細は[コアデータベースの変更ログ](https://clickhouse.com/docs/ja/whats-new/changelog/2023#2312)を参照してください。 + +### コンソールの変更 +- AWS Private LinkとGCP Private Service ConnectをTerraformプロバイダーを通じて設定する機能を追加 +- リモートファイルデータインポートの回復力向上 +- インポートステータスの詳細をすべてのデータインポートへ追加 +- S3データインポートへのキー/秘密鍵資格情報サポートを追加 + +### インテグレーションの変更 +* Kafka Connect + * `async_insert` の正確な一度のサポートが追加されました(デフォルトでは無効) +* Golangクライアント + * DateTimeバインディングを修正 + * バッチ挿入性能を改善 +* Javaクライアント + * リクエスト圧縮の問題を修正 + +### 設定変更 +* `use_mysql_types_in_show_columns` はもはや必須ではありません。MySQLインターフェースを介して接続する際に自動的に有効になります。 +* `async_insert_max_data_size` はデフォルト値が `10 MiB` になりました + +## 2024年2月2日 + +このリリースはClickPipes for Azure Event Hubの利用可能性をもたらし、v4 ClickHouse Grafanaコネクターを用いてログとトレースナビゲーションのワークフローを劇的に改善し、FlywayおよびAtlasデータベーススキーマ管理ツールのサポートを公開しました。 + +### コンソールの変更 +* Azure Event Hubに対するClickPipesのサポートを追加 +* 新しいサービスのデフォルトアイドリング時間は15分です + +### インテグレーションの変更 +* [ClickHouseデータソース for Grafana](https://grafana.com/grafana/plugins/grafana-clickhouse-datasource/) v4リリース + * Table、Logs、Time Series、およびTraces用の専用エディタを備えた完全に再構築されたクエリビルダー + * より複雑で動的なクエリをサポートするための完全に再構築されたSQLジェネレータ + * OpenTelemetryへの優れたサポートをLogとTraceビューに追加 + * LogsとTracesのデフォルトのテーブルと列を指定するための拡張設定 + * カスタムHTTPヘッダを指定する能力を追加 + * その他多くの改善 - 完全な[変更ログ](https://github.com/grafana/clickhouse-datasource/blob/main/CHANGELOG.md#400)を確認してください +* データベーススキーマ管理ツール + * [FlywayがClickHouseサポートを追加](https://github.com/flyway/flyway-community-db-support/packages/2037428) + * [Ariga AtlasがClickHouseサポートを追加](https://atlasgo.io/blog/2023/12/19/atlas-v-0-16#clickhouse-beta-program) +* Kafkaコネクタシンク + * デフォルト値を持つテーブルへの取り込みを最適化 + * DateTime64での文字列ベースの日付をサポート +* Metabase + * 複数データベースへの接続をサポート + +## 2024年1月18日 + +このリリースはAWSの新しい地域(ロンドン / eu-west-2)をもたらし、RedPanda、Upstash、Warpstreamに対するClickPipesのサポートを追加し、[is_deleted](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/replacingmergetree#is_deleted)コアデータベース機能の信頼性を改善しました。 + +### 一般的な変更 +- 新しいAWS地域:ロンドン (eu-west-2) + +### コンソールの変更 +- RedPanda、Upstash、Warpstreamに対するClickPipesのサポートを追加 +- ClickPipesの認証機構をUIにおいて設定可能に + +### インテグレーションの変更 +- Javaクライアント: + - 破壊的変更:ランダムURLハンドルのコールでの指定を削除しました。この機能はClickHouseから削除されました + - 廃止予定機能:Java CLIクライアントとGRPCパッケージ + - エクサビームの要求により、ClickHouseインスタンスのワークロードを減少させるためのRowBinaryWithDefaultsフォーマットのサポートを追加 + - ClickHouseとの互換性のためのDate32とDateTime64範囲境界、Spark Array文字列タイプとの互換性、ノード選択メカニズム +- Kafkaコネクタ:Grafana用のJMXモニタリングダッシュボードを追加 +- PowerBI:ODBCドライバーの設定をUIで指定可能に +- JavaScriptクライアント:クエリの概要情報を公開し、挿入の際の特定列を指定可能に、webクライアント用にkeep_aliveを設定可能に +- Pythonクライアント:SQLAlchemyのNothingタイプサポートを追加 + +### 信頼性の変更 +- ユーザー向けの後方互換性の無い変更:以前、ある条件下で二つの機能([is_deleted](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/replacingmergetree#is_deleted)と``OPTIMIZE CLEANUP``)がClickHouse内のデータの破損を引き起こす可能性がありました。ユーザーのデータの整合性を保持するためにコア機能を維持しながら、これがどのように動作するかを調整しました。具体的には、MergeTree設定``clean_deleted_rows``は非推奨となり、もはや効果を持ちません。``CLEANUP``キーワードはデフォルトでは許可されていません(これを使用するには``allow_experimental_replacing_merge_with_cleanup``を有効にする必要があります)。``CLEANUP``を使用する場合、``OPTIMIZE FINAL CLEANUP``を実行した後で古いバージョンの行が挿入されないことを保証する必要があります。 + +## 2023年12月18日 + +このリリースはGCPの新しい地域(us-east1)、セキュアエンドポイント接続のセルフサービス機能、DBT 1.7を含む追加統合のサポート、数多くのバグ修正とセキュリティ強化をもたらします。 + +### 一般的な変更 +- ClickHouse CloudはGCP us-east1 (サウスカロライナ)地域でご利用いただけます +- AWS Private LinkおよびGCP Private Service Connectの設定能力をOpenAPIで導入 + +### コンソールの変更 +- 開発者ロールのユーザー向けにSQLコンソールへのシームレスログインを有効化 +- オンボーディング中のアイドリングコントロール設定ワークフローを簡素化 + +### インテグレーションの変更 +- DBT コネクタ:DBT v1.7までのサポートを追加 +- Metabase:Metabase v0.48へのサポートを追加 +- PowerBI Connector:PowerBI Cloud 上での実行が可能になりました +- ClickPipes 内部ユーザー設定を設定可能に +- Kafka Connect + - 重複排除ロジックとNullable型の取り込みを改善 + - テキストベースフォーマットの追加サポート (CSV, TSV) +- Apache Beam: BooleanとLowCardinality型をサポート +- Nodejs クライアント: Parquetフォーマットのサポートを追加 + +### セキュリティ発表 +- 3つのセキュリティ脆弱性をパッチ - 詳細は[セキュリティ変更ログ](https://clickhouse.com/docs/ja/whats-new/security-changelog)をご参照ください: + - CVE 2023-47118 (CVSS 7.0) - デフォルトでポート9000/tcpで動作しているネイティブインターフェースに影響を与えるヒープバッファーオーバーフロー脆弱性 + - CVE-2023-48704 (CVSS 7.0) - デフォルトでポート9000/tcpで動作しているネイティブインターフェースに影響を与えるヒープバッファーオーバーフロー脆弱性 + - CVE 2023-48298 (CVSS 5.9) - FPC圧縮コーデックにおける整数アンダーフロー脆弱性 + +## 2023年11月22日 + +このリリースはコアデータベースバージョンをアップグレードし、ログインおよび認証フローの改善、Kafka Connect Sinkにプロキシサポートを追加します。 + +### ClickHouseバージョンアップグレード + +- Parquetファイルの読み取りのパフォーマンスが劇的に改善されました。詳細は[23.8リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-08)をご覧ください。 +- JSON用の型推論サポートを追加しました。詳細は[23.9リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-09)をご覧ください。 +- `ArrayFold`のような強力なアナリスト向け関数を導入しました。詳細は[23.10リリースブログ](https://clickhouse.com/blog/clickhouse-release-23-10)をご覧ください。 +- **ユーザー向け後方互換性ない変更**:サンプルデータが数字に似ている文字列を含む場合の解析エラーを可能性があるため、JSONフォーマットで文字列から数値推論を避けるために、デフォルトで設定`input_format_json_try_infer_numbers_from_strings`を無効化。 +- 新機能、パフォーマンス向上、バグ修正が多数。詳細は[コアデータベースの変更ログ](https://clickhouse.com/docs/ja/whats-new/changelog)をご覧ください。 + +### コンソールの変更 + +- ログインと認証フローを改善しました。 +- 大規模なスキーマをよりよくサポートするためにAIベースのクエリ提案を改善しました。 + +### インテグレーションの変更 + +- Kafka Connect Sink:プロキシサポート、`topic-tablename`マッピング、およびKeeper _exactly-once_ 配信プロパティの設定可能性を追加。 +- Node.js クライアント:Parquetフォーマットのサポートを追加。 +- Metabase:`datetimeDiff`関数のサポートを追加。 +- Pythonクライアント:カラム名に特殊文字のサポートを追加。タイムゾーンパラメータバインディングを修正。 + +## 2023年11月2日 + +このリリースは、アジアでの開発サービスに対する地域サポートを拡張し、顧客管理の暗号化キーに対するキー回転機能、請求コンソールの税設定の詳細度を向上させ、サポートされている言語クライアントのバグ修正を提供します。 + +### 一般的な更新 +- 開発サービスがAWSの`ap-south-1`(ムンバイ) と `ap-southeast-1`(シンガポール) で利用可能になりました +- 顧客管理の暗号化キー (CMEK) にキー回転のサポートを追加 + +### コンソールの変更 +- クレジットカード追加時に細かな税設定を構成する能力を追加 + +### インテグレーションの変更 +- MySQL + - MySQLを介してTableau OnlineとQuickSightのサポートを改善しました +- Kafka コネクタ + - テキストベースフォーマット(CSV、TSV)をサポートする新しいStringConverterを導入 + - バイト数及び小数点数データ型をサポート + - エラー.トレランス=すべての場合でも、再試行可能例外を常に再試行するように調整 +- Node.js クライアント + - 大規模なデータセットのストリームで提供する破損した結果に関する問題を修正 +- Python クライアント + - 大量挿入時のタイムアウトを修正 + - Numpy/PandasのDate32に関する問題を修正 +​​- Golang クライアント + - 空のマップをJSONカラムに挿入する際の問題を修正、圧縮バッファクリーンアップ、クエリエスケープ、IPv4及びIPv6のゼロ/ nilでのパニック + - キャンセルされた挿入を監視するウォッチドッグを追加 +- DBT + - 分散テーブルのサポートをテストで改善 + +## 2023年10月19日 + +このリリースは、SQLコンソールの使いやすさとパフォーマンスの向上、MetabaseコネクタのIPデータタイプ処理の改善、およびJavaとNode.jsクライアントでの新機能をもたらします。 + +### コンソールの変更 +- SQLコンソールの使いやすさを改善(例えば、クエリ実行間の列幅を維持する) +- SQLコンソールのパフォーマンスを改善 + +### インテグレーションの変更 +- Java クライアント: + - オープンコネクションを再利用するためにデフォルトのネットワークライブラリを切り替え、パフォーマンスを向上 + - プロキシサポートを追加 + - Trust Storeを使用した安全な接続のサポートを追加 +- Node.jsクライアント:挿入クエリのkeep-alive動作を修正 +- Metabase:IPv4/IPv6カラムのシリアル化を修正 + +## 2023年9月28日 + +このリリースはKafka、Confluent Cloud、Amazon MSKおよびKafka Connect ClickHouse Sink用のClickPipesの一般提供を可能にし、AWS S3への安全なアクセスの自己サービスワークフロー、およびAI支援クエリ提案(プライベートプレビュー)を提供します。 + +### コンソールの変更 +- [AWS S3への安全なアクセス](/docs/ja/cloud/security/secure-s3)の自己サービスワークフローを追加 +- プライベートプレビューでAI支援によるクエリ提案を導入(試してみたい方は[ClickHouse Cloudサポート](https://clickhouse.cloud/support)までお問い合わせください) + +### インテグレーションの変更 +- Kafka、Confluent Cloud、Amazon MSK用のClickPipesの一般提供を発表([リリースブログ](https://clickhouse.com/blog/clickpipes-is-generally-available)をご参照ください) +- Kafka Connect ClickHouse Sinkの一般提供に到達 + - `clickhouse.settings`プロパティを使用したカスタマイズされたClickHouse設定サポートを拡張 + - 動的フィールドを考慮した重複排除動作を改善 + - ClickHouseからのテーブル変更取得用に`tableRefreshInterval`を追加 +- [PowerBI](/docs/ja/integrations/powerbi)および ClickHouse データ型との間のSSL接続問題と型マッピングを修正 + +## 2023年9月7日 + +このリリースはPowerBI Desktopの公式コネクタのベータリリース、インドでのクレジットカード決済処理の改善、サポートされている言語クライアントでの複数の改善を提供します。 + +### コンソールの変更 +- インドからの請求をサポートするために残高と支払い再試行を追加 + +### インテグレーションの変更 +- Kafka コネクタ: ClickHouse設定を構成するサポートを追加、エラー.tolerance構成オプションを追加 +- PowerBI Desktop: 公式コネクターのベータ版をリリース +- Grafana: ポイントジオタイプのサポートを追加、Data Analystダッシュボードのパネルを修正、timeIntervalマクロを修正 +- Pythonクライアント: Pandas 2.1.0との互換性, Python 3.7のサポートを終了し、nullable JSON型のサポートを追加 +- Node.js クライアント: default_format 設定のサポートを追加 +- Golang クライアント: bool型の取り扱いを修正、文字列の制限を解除 + +## 2023年8月24日 + +このリリースはClickHouseデータベースへのMySQLインターフェースサポート、新しい公式PowerBIコネクタ、クラウドコンソールでの「実行中のクエリ」ビュー、ClickHouseバージョン23.7への更新を追加します。 + +### 一般的な更新 +- [MySQLプロトコル](https://clickhouse.com/docs/ja/interfaces/mysql)へのサポートを追加しました。このサポートにより、多くの既存のBIツールとの互換性が可能です。会社に対するこの機能を有効にするにはサポートまでお問い合わせください。 +- 新しい公式PowerBIコネクタを導入しました + +### コンソールの変更 +- SQLコンソールでの「実行中のクエリ」ビューサポートを追加 + +### ClickHouse 23.7 バージョンアップグレード +- Azureテーブル関数のサポートを追加し、プロダクション対応のジオデータタイプ、ジョインパフォーマンスを改善 - 23.5リリース [ブログ](https://clickhouse.com/blog/clickhouse-release-23-05) で詳細を参照 +- MongoDBの統合をバージョン6.0まで拡張 - 23.6リリース [ブログ](https://clickhouse.com/blog/clickhouse-release-23-06) で詳細を参照 +- Parquet形式への書き込みパフォーマンスを6倍に向上し、PRQLクエリ言語のサポートを追加し、SQL互換性を向上 - 23.7リリース [デック](https://presentations.clickhouse.com/release_23.7/)で詳細を参照 +- 新機能、パフォーマンス向上、およびバグ修正が多数 - 23.5、23.6、23.7の詳細な[変更ログ](https://clickhouse.com/docs/ja/whats-new/changelog)をご参照ください + +### インテグレーションの変更 +- Kafkaコネクタ: Avro日付および時間タイプのサポートを追加 +- JavaScriptクライアント: ウェブベースの環境用に安定版をリリース +- Grafana: フィルターロジック、データベース名処理を改善し、サブ秒精度のTimeIntevalをサポート +- Golangクライアント:複数のバッチおよび非同期データローディングの問題を修正 +- Metabase:v0.47をサポートし、接続に疑似化を追加、データ型マッピングを修正 + +## 2023年7月27日 + +このリリースは、Kafka、ClickHouse用のClickPipesのプライベートプレビュー、新しいデータローディング体験、およびクラウドコンソールを使用してURLからファイルをロードする能力を導入します。 + +### インテグレーションの変更 +- ClickPipes for Kafkaのプライベートプレビューを導入し、カフカとConfluent Cloudからの大規模データを数クリックで取り込むクラウドネイティブの統合エンジン。参加をご希望の方はこちらの[待機リスト](https://clickhouse.com/cloud/clickpipes#joinwaitlist)にサインアップしてください。 +- JavaScriptクライアント:ウェブベースの環境(ブラウザ、Cloudflareワーカー)のサポートをリリース。コミュニティによるカスタム環境向けコネクタ作成を許可するためにコードをリファクタリング。 +- Kafkaコネクタ:Timestamp とTime Kafkaタイプでのインラインスキーマサポートを追加 +- Pythonクライアント:挿入圧縮およびLowCardinality読み取りの問題を修正 + +### コンソールの変更 +- 変更時のテーブル作成設定オプションを多数揃えた新しいデータローディング体験を追加 +- クラウドコンソールを使用したURLからのファイルロード機能を導入 +- 参加フローを改善し、別の組織に参加するための追加オプションと、すべての保留中の参加を表示 + +## 2023年7月14日 + +このリリースは、専用サービスを立ち上げる能力、新しいAWSリージョンオーストラリア、およびディスク上の暗号化データに対する独自のキー持ち込み能力を導入します。 + +### 一般的な更新 +- 新しいAWSオーストラリア地域:シドニー (ap-southeast-2) +- レイテンシーを厳しく監視したワークロード用の専用階層サービス(セットアップには[サポート](https://clickhouse.cloud/support)に連絡してください) +- 磁気ディスク上の暗号化データのための独自のキー持ち込み能力 (設置には[サポート](https://clickhouse.cloud/support)に連絡してください) + +### コンソールの変更 +- 非同期挿入用の観測性メトリクスダッシュボードへの改善 +- サポートとの統合のためのチャットボットの振る舞いを改善 + +### インテグレーションの変更 +- NodeJSクライアント:ソケットタイムアウトによる接続失敗の修正 +- Pythonクライアント:挿入クエリに対するQuerySummaryの追加、データベース名での特殊文字サポート +- Metabase:JDBCドライバーバージョン、DateTime64サポート、パフォーマンス改善を更新 + +### コアデータベースの変更 +- [クエリキャッシュ](https://clickhouse.com/docs/ja/operations/query-cache)はClickHouse Cloudで利用可能です。有効にすると、成功したクエリはデフォルトで1分間キャッシュされ、以降のクエリはキャッシュされた結果を使用します。 + +## 2023年6月20日 + +このリリースはClickHouse Cloud on GCPを一般提供し、Cloud API用のTerraformプロバイダーを提供し、ClickHouseバージョン23.4へ更新します。 + +### 一般的な更新 +- ClickHouse Cloud on GCPはGAで、GCPマーケットプレースの統合、プライベートサービス接続のサポート、および自動バックアップ (詳細は[ブログ](https://clickhouse.com/blog/clickhouse-cloud-on-google-cloud-platform-gcp-is-generally-available)と[プレスリリース](https://clickhouse.com/blog/clickhouse-cloud-expands-choice-with-launch-on-google-cloud-platform)を参照) をもたらします。 +- [Terraformプロバイダー](https://registry.terraform.io/providers/ClickHouse/clickhouse/latest/docs)がCloud APIで利用可能になりました + +### コンソールの変更 +- サービスのための新しい統合設定ページを追加 +- ストレージと計算のためのメータリング精度を調整 + +### インテグレーションの変更 +- Pythonクライアント:挿入パフォーマンスを改善し、内部依存をリファクタリングしてマルチプロセッシングをサポート +- Kafkaコネクタ: Confluent Cloudにアップロードおよびインストールでき、臨時の接続問題を再試行、無効なコネクタステートを自動リセット + +### ClickHouse 23.4 バージョンアップグレード +- 並列レプリカのJOINサポートを追加 (設置には[サポート](https://clickhouse.cloud/support)までご連絡ください) +- 論理削除のパフォーマンスを改善 +- 大規模挿入の処理中にキャッシュを改善 + +### 管理変更 +- 非「デフォルト」ユーザーのためのローカルDictionary作成を拡張 + +## 2023年5月30日 +このリリースでは、ClickHouse Cloudの管理プレーン操作向けプログラムAPIの一般公開(詳細は[ブログ](https://clickhouse.com/blog/using-the-new-clickhouse-cloud-api-to-automate-deployments)を参照)、IAMロールを用いたS3アクセス、および追加のスケーリングオプションを提供します。 + +### 一般的な変更 +- ClickHouse Cloud用APIサポート。新しいCloud APIを使用すると、既存のCI/CDパイプラインに管理サービスをシームレスに統合し、サービスをプログラムで管理できます。 +- IAMロールを使用したS3アクセス。IAMロールを活用して、プライベートなAmazon Simple Storage Service (S3) バケットに安全にアクセスできるようになりました(設定するにはサポートにお問い合わせください)。 + +### スケーリングの変更 +- [水平スケーリング](/docs/ja/manage/scaling#adding-more-nodes-horizontal-scaling)。より多くの並列化が必要なワークロードは、最大10のレプリカで構成できるようになりました(設定するにはサポートにお問い合わせください)。 +- [CPUベースの自動スケーリング](/docs/ja/manage/scaling)。CPU負荷の高いワークロードは、自動スケーリングポリシーに追加のトリガーを利用できます。 + +### コンソールの変更 +- DevサービスからProductionサービスへの移行(有効にするにはサポートにお問い合わせください)。 +- インスタンス作成フロー中のスケーリング設定コントロールの追加 +- デフォルトのパスワードがメモリに存在しないときの接続文字列の修正 + +### 統合の変更 +- Golangクライアント:ネイティブプロトコルでの不均衡な接続を引き起こす問題を修正し、ネイティブプロトコルでのカスタム設定のサポートを追加 +- Nodejsクライアント:nodejs v14のサポートを中止し、v20のサポートを追加 +- Kafka Connector:LowCardinality型のサポートを追加 +- Metabase:タイムレンジでのグループ化を修正し、Metabaseに組み込まれた質問での整数サポートを修正 + +### パフォーマンスと信頼性 +- 書き込み負荷の高いワークロードの効率とパフォーマンスを改善 +- バックアップの速度と効率を上げるための増分バックアップ戦略を展開 + +## 2023年5月11日 + +このリリースでは、ClickHouse Cloud on GCPの~~パブリックベータ~~ (現在GA、詳しくは6月20日の項目を参照) を提供し、管理者権限の拡張によりクエリの終了権限を付与し、CloudコンソールでMFAユーザーのステータスの可視性を向上させます。 + +### ClickHouse Cloud on GCP ~~(パブリックベータ)~~ (現在GA、詳しくは6月20日の項目を参照) +- Google ComputeとGoogle Cloud Storage上で動作する、完全に管理されたストレージとコンピュートの分離されたClickHouseオファリングを開始 +- 米国アイオワ(us-central1)、オランダ(ヨーロッパ西部4)、シンガポール(アジア南東部1)のリージョンで利用可能 +- すべての初期リージョンで開発および本番サービスをサポート +- デフォルトで強力なセキュリティを提供:転送中のエンドツーエンド暗号化、静止中のデータ暗号化、IP許可リスト + +### 統合の変更 +- Golangクライアント:プロキシ環境変数のサポートを追加 +- Grafana:GrafanaデータソースセットアップでClickHouseカスタム設定とプロキシ環境変数を指定する機能を追加 +- Kafka Connector:空のレコードの処理を改善 + +### コンソールの変更 +- ユーザーリストに多要素認証(MFA)使用のインジケーターを追加 + +### パフォーマンスと信頼性 +- 管理者向けにクエリ終了権限のより細かい制御を追加 + +## 2023年5月4日 + +このリリースでは、新しいヒートマップチャートタイプを導入し、課金使用ページを改善し、サービスの起動時間を改善します。 + +### コンソールの変更 +- SQLコンソールにヒートマップチャートタイプを追加 +- 各課金ディメンション内で消費されたクレジットを表示するように課金使用ページを改善 + +### 統合の変更 +- Kafkaコネクタ:一時的な接続エラーの再試行メカニズムを追加 +- Pythonクライアント:http接続が永遠に再利用されないようにするmax_connection_age設定を追加。これにより、特定のロードバランシングの問題を解決するのに役立ちます +- Node.jsクライアント:Node.js v20のサポートを追加 +- Javaクライアント:クライアント証明書認証のサポートを改善し、ネストされたタプル、マップ、ネストされたタイプのサポートを追加 + +### パフォーマンスと信頼性 +- 大量のパーツが存在する際のサービスの起動時間を改善 +- SQLコンソールのロングランニングクエリキャンセルのロジックを最適化 + +### バグ修正 +- ‘Cell Towers’サンプルデータセットのインポートが失敗するバグを修正 + +## 2023年4月20日 + +このリリースではClickHouseのバージョンを23.3に更新し、コールドリードの速度を大幅に改善し、サポートとのリアルタイムチャットを提供します。 + +### コンソールの変更 +- サポートとのリアルタイムチャットオプションを追加 + +### 統合の変更 +- Kafka コネクタ:Nullable 型のサポートを追加 +- Golang クライアント:外部テーブルのサポートを追加、ブールとポインタ型のパラメータバインディングをサポート + +### 設定の変更 +- `max_table_size_to_drop` と `max_partition_size_to_drop` の設定をオーバーライドして大きなテーブルを削除する能力を追加 + +### パフォーマンスと信頼性 +- S3 プリフェッチを通じてコールドリードの速度を改善する `allow_prefetched_read_pool_for_remote_filesystem` 設定を導入 + +### ClickHouse 23.3 バージョンアップグレード +- 論理削除が本番対応となり、詳細は23.3リリース[ブログ](https://clickhouse.com/blog/clickhouse-release-23-03)を参照 +- 複数ステージのPREWHEREをサポートに追加、23.2リリース[ブログ](https://clickhouse.com/blog/clickhouse-release-23-03)を参照 +- 新機能、パフォーマンス改善、バグ修正多数 - 詳細な[変更ログ](/docs/ja/whats-new/changelog/index.md)を参照ください + +## 2023年4月6日 + +このリリースでは、クラウドエンドポイントを取得するためのAPI、最小アイドルタイムアウトのための高度なスケーリング制御、およびPythonクライアントクエリメソッドでの外部データのサポートを提供します。 + +### APIの変更 +* [Cloud Endpoints API](/docs/ja/cloud/security/cloud-endpoints-api.md)経由でClickHouse Cloudエンドポイントをプログラムでクエリする能力を追加 + +### コンソールの変更 +- 高度なスケーリング設定に「最小アイドルタイムアウト」設定を追加 +- データロードモーダルでのスキーマ推論に最善努力の日付時刻検出を追加 + +### 統合の変更 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md):複数のスキーマサポートを追加 +- [Go client](/docs/ja/integrations/language-clients/go/index.md):TLS接続のアイドル接続ライブネスチェックを修正 +- [Python client](/docs/ja/integrations/language-clients/python/index.md) + - クエリメソッドでの外部データのサポートを追加 + - クエリ結果のタイムゾーンサポートを追加 + - `no_proxy` / `NO_PROXY` 環境変数のサポートを追加 + - Nullable型のNULL値のサーバー側パラメータバインディングを修正 + +### バグ修正 +* SQLコンソールからの `INSERT INTO … SELECT …` 実行時に選択クエリと同じ行制限が誤って適用される問題を修正 + +## 2023年3月23日 + +このリリースでは、データベースのパスワードの複雑さルールを導入し、大規模なバックアップの復元速度を大幅に向上させ、Grafana Trace Viewでのトレース表示サポートを追加します。 + +### セキュリティと信頼性 +- 基幹データベースエンドポイントはパスワードの複雑さルールを施行 +- 大規模バックアップの復元時間を改善 + +### コンソールの変更 +- オンボーディングワークフローを合理化し、新しいデフォルトとよりコンパクトなビューを導入 +- サインアップおよびサインイン遅延を削減 + +### 統合の変更 +- Grafana: + - ClickHouseに保存されたトレースデータのTrace View表示サポートを追加 + - 時間範囲フィルタを改善し、テーブル名に特殊文字サポートを追加 +- Superset:ネイティブClickHouseサポートを追加 +- Kafka Connect Sink:自動日付変換とNullカラム処理を追加 +- Metabase:v0.46との互換性を実装 +- Pythonクライアント:一時テーブルへの挿入を修正し、Pandas Nullサポートを追加 +- Golangクライアント:タイムゾーンでDate型を正規化 +- Javaクライアント + - 圧縮、インファイル、アウトファイルキーワードのSQLパーサーサポートを追加 + - 資格情報の負荷を追加 + - `ON CLUSTER`でのバッチサポートを修正 +- Node.jsクライアント + - JSONStrings, JSONCompact, JSONCompactStrings, JSONColumnsWithMetadata形式のサポートを追加 + - すべての主要なクライアントメソッドに `query_id` を提供可能 + +### バグ修正 +- 新しいサービスの初期プロビジョニングと起動時間の遅延を引き起こすバグを修正 +- キャッシュの誤設定によるクエリ性能の低下を引き起こすバグを修正 + +## 2023年3月9日 + +このリリースでは監視ダッシュボードを改善し、大規模バックアップの作成時間を最適化し、大規模なテーブルやパーティションを削除するために必要な設定を追加します。 + +### コンソールの変更 +- 高度な監視ダッシュボードの追加(プレビュー) +- 監視ダッシュボードにメモリアロケーションチャートを導入 +- SQLコンソールのスプレッドシートビューでのスペースと改行処理を改善 + +### 信頼性とパフォーマンス +- データが変更された場合のみバックアップが実行されるようにバックアップスケジュールを最適化 +- 大規模バックアップの完了時間を改善 + +### 設定の変更 +- クエリまたは接続レベルで設定 `max_table_size_to_drop` と `max_partition_size_to_drop` をオーバーライドすることでテーブルとパーティションを削除するための制限を増やす能力を追加 +- クエリログにソースIPを追加し、ソースIPに基づいたクォータとアクセス制御の施行を可能に + +### 統合 +- [Python client](/docs/ja/integrations/language-clients/python/index.md):Pandasサポートを改善し、タイムゾーン関連の問題を修正 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md):Metabase 0.46.xの互換性とSimpleAggregateFunctionのサポート +- [Kafka-Connect](/docs/ja/integrations/data-ingestion/kafka/index.md):暗黙的な日付変換とnullカラムのより良い取り扱い +- [Java Client](https://github.com/ClickHouse/clickhouse-java):Javaマップへのネストされた変換 + +## 2023年2月23日 + +このリリースでは、ClickHouse 23.1コアリリースの機能の一部を有効化し、Amazon Managed Streaming for Apache Kafka(MSK)との相互運用性を提供し、アクティビティログでの高度なスケーリングとアイドリングの調整を公開します。 + +### ClickHouse 23.1 バージョンアップグレード + +ClickHouse 23.1の機能の一部を追加。例: +- Map型とのARRAY JOIN +- SQL標準の16進数とバイナリリテラル +- 新しい関数、`age()`、`quantileInterpolatedWeighted()`、`quantilesInterpolatedWeighted()`など +- `generateRandom` で引数なしで挿入テーブルの構造を使用する能力 +- 過去の名前の再利用を可能にするデータベース作成と名前変更ロジックの改善 +- 詳細は23.1リリース[ウェビナースライド](https://presentations.clickhouse.com/release_23.1/#cover)および[23.1リリース変更ログ](/docs/ja/whats-new/changelog/index.md/#clickhouse-release-231)を参照ください + +### 統合の変更 +- [Kafka-Connect](/docs/ja/integrations/data-ingestion/kafka/index.md):Amazon MSKのサポートを追加 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md):1.0.0の初期安定リリース + - 接続が[Metabase Cloud](https://www.metabase.com/start/)で利用可能 + - 利用可能なデータベースをすべて探索する機能を追加 + - AggregationFunction型のデータベースとの同期を修正 +- [DBT-clickhouse](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md):最新のDBTバージョンv1.4.1のサポートを追加 +- [Python client](/docs/ja/integrations/language-clients/python/index.md):プロキシとSSHトンネリングのサポートを改善。Pandasデータフレームのためのいくつかの修正とパフォーマンス最適化を追加 +- [Nodejs client](/docs/ja/integrations/language-clients/js.md):`system.query_log`からクエリメトリクスを取得するために使用可能な`query_id`をクエリ結果に添付する機能をリリース +- [Golang client](/docs/ja/integrations/language-clients/go/index.md):ClickHouse Cloudとのネットワーク接続を最適化 + +### コンソールの変更 +- アクティビティログに高度なスケーリングおよびアイドリング設定の調整を追加 +- パスワードリセットメールにユーザーエージェントとIP情報を追加 +- Google OAuthのサインアップフローメカニクスを改善 + +### 信頼性とパフォーマンス +- 大規模サービスのリジューム時間をスピードアップ +- 大規模なテーブルとパーティションを持つサービスのリード遅延を改善 + +### バグ修正 +- サービスパスワードのリセットがパスワードポリシーに従っていなかった動作を修正 +- 組織招待メールの検証を大文字小文字を区別しないように変更 + +## 2023年2月2日 + +このリリースでは、公式にサポートされたMetabase統合、主要なJavaクライアント/JDBCドライバリリース、およびSQLコンソールでのビューとMaterialized Viewサポートを提供します。 + +### 統合の変更 +- [Metabase](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md) プラグイン: ClickHouseが保守する公式ソリューションとしての提供 +- [dbt](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md) プラグイン: [複数スレッド](https://github.com/ClickHouse/dbt-clickhouse/blob/main/CHANGELOG.md)のサポートを追加 +- [Grafana](/docs/ja/integrations/data-visualization/grafana/index.md) プラグイン: 接続エラーのより良い処理 +- [Python](/docs/ja/integrations/language-clients/python/index.md) クライアント: 挿入操作の[ストリーミングサポート](/docs/ja/integrations/language-clients/python/index.md#streaming-queries) +- [Go](/docs/ja/integrations/language-clients/go/index.md) クライアント: [バグ修正](https://github.com/ClickHouse/clickhouse-go/blob/main/CHANGELOG.md): キャンセルされた接続のクローズを修正、接続エラーのより良い処理 +- [JS](/docs/ja/integrations/language-clients/js.md) クライアント: [exec/insertの破壊的な変更](https://github.com/ClickHouse/clickhouse-js/releases/tag/0.0.12); 返戻タイプでquery_idを公開 +- [Java](https://github.com/ClickHouse/clickhouse-java#readme) クライアント/JDBCドライバーの大幅なリリース + - [破壊的な変更](https://github.com/ClickHouse/clickhouse-java/releases): 廃止されたメソッド、クラス、およびパッケージが削除 + - R2DBCドライバーとファイル挿入サポートを追加 + +### コンソールの変更 +- SQLコンソールでのビューとMaterialized Viewのサポートを追加 + +### パフォーマンスと信頼性 +- 停止中/アイドリング中のインスタンスのパスワードリセットを高速化 +- より正確なアクティビティトラッキングによるスケールダウン動作の改善 +- SQLコンソールでのCSVエクスポートが切り捨てられたバグを修正 +- サンプルデータのアップロードに断続的な障害が発生するバグを修正 + +## 2023年1月12日 + +このリリースでは、ClickHouseのバージョンを22.12に更新し、多くの新しいソースでDictionaryを有効にし、クエリのパフォーマンスを改善します。 + +### 一般的な変更 +- 外部ClickHouse、Cassandra、MongoDB、MySQL、PostgreSQL、Redisを含む追加のソースのためDictionaryを有効化 + +### ClickHouse 22.12 バージョンアップグレード +- Grace Hash Joinを含むJOINサポートを拡張 +- ファイルを読み取るためのバイナリJSON(BSON)サポートを追加 +- GROUP BY ALLの標準SQL構文をサポート +- 固定精度での小数演算のための新しい数学関数を追加 +- 完全な変更のリストは[22.12 リリースブログ](https://clickhouse.com/blog/clickhouse-release-22-12)と[詳細な 22.12 changelog](/docs/ja/whats-new/changelog/2022.md/#-clickhouse-release-2212-2022-12-15)を参照 + +### コンソールの変更 +- SQLコンソールでの自動補完機能を改善 +- デフォルトリージョンが大陸のローカリティを考慮するように +- 課金使用ページを改善し、課金単位とウェブサイト単位の両方を表示 + +### 統合の変更 +- DBTリリース[v1.3.2](https://github.com/ClickHouse/dbt-clickhouse/blob/main/CHANGELOG.md#release-132-2022-12-23) + - delete+insertインクリメンタルストラテジーのエクスペリメンタルサポートを追加 + - 新しいs3sourceマクロ +- Pythonクライアント[v0.4.8](https://github.com/ClickHouse/clickhouse-connect/blob/main/CHANGELOG.md#048-2023-01-02) + - ファイル挿入サポート + - サーバーサイドクエリ[パラメータバインド](/docs/ja/interfaces/cli.md/#cli-queries-with-parameters) +- Goクライアント[v2.5.0](https://github.com/ClickHouse/clickhouse-go/releases/tag/v2.5.0) + - 圧縮のメモリ使用量削減 + - サーバーサイドクエリ[パラメータバインド](/docs/ja/interfaces/cli.md/#cli-queries-with-parameters) + +### 信頼性とパフォーマンス +- オブジェクトストア上で小さなファイルを大量に取得するクエリのリードパフォーマンスを改善 +- 新しく起動されたサービスのデフォルトのClickHouseリリース設定をもとにサービスを起動するときの[互換性](/docs/ja/cloud/manage/upgrades.md/#use-the-default-settings-of-a-clickhouse-release)設定を設定 + +### バグ修正 +高度なスケーリングスライダーを使用してリソースを予約すると、すぐに効果を発揮するようになりました。 + +## 2022年12月20日 + +このリリースでは、管理者がSQLコンソールにシームレスにログインできるようになり、コールドリードの読み取りパフォーマンスを改善し、ClickHouse Cloud用のMetabaseコネクタを改善します。 + +### コンソールの変更 +- 管理者ユーザー向けにSQLコンソールへのシームレスアクセスを有効に +- 新しい招待者のデフォルトロールを「管理者」に変更 +- オンボーディングサーベイを追加 + +### 信頼性とパフォーマンス +- ネットワーク障害時にリカバリするための長時間実行する挿入クエリの再試行ロジックを追加 +- コールドリードのリードパフォーマンスを改善 + +### 統合の変更 +- [Metabaseプラグイン](/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md)は、待望のv0.9.1メジャーアップデートを受けました。これにより、最新のMetabaseバージョンとの互換性があり、ClickHouse Cloudに対して徹底的にテストされました。 + +## 2022年12月6日 - 一般提供 + +ClickHouse CloudがSOC2 Type II準拠、稼働率SLA、公共のステータスページを備えた、一般提供対応となりました。このリリースには、AWS Marketplace統合、ClickHouseユーザーのためのデータ探索ワークベンチであるSQLコンソール、ClickHouse Cloudでの自己学習のためのClickHouse Academyといった新たな主要機能が含まれています。詳細はこの[ブログ](https://clickhouse.com/blog/clickhouse-cloud-generally-available)をご覧ください。 + +### 生産準備完了 +- SOC2 Type II準拠(詳細は[ブログ](https://clickhouse.com/blog/clickhouse-cloud-is-now-soc-2-type-ii-compliant)および[Trust Center](https://trust.clickhouse.com/)を参照) +- ClickHouse Cloudの公開[ステータスページ](https://status.clickhouse.com/) +- 稼働率SLAが生産用途に利用可能 +- [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-jettukeanwrfc)上での利用可能 + +### 主要な新機能 +- SQLコンソールの導入、ClickHouseユーザー向けのデータ探索のためのワークベンチ +- 自己学習のための[ClickHouse Academy](https://learn.clickhouse.com/visitor_class_catalog)の開始、ClickHouse Cloudでの学習 + +### 価格とメータリングの変更 +- 試用期間を30日間に延長 +- 初心者向けプロジェクトと開発/ステージング環境に適した固定容量で低月額の開発サービスを導入 +- ClickHouse Cloudの運用とスケーリングを改善するために継続して、新しい生産サービスの低価格を導入 +- コンピュートの計測における粒度と忠実度を改善 + +### 統合の変更 +- ClickHouse Postgres / MySQL統合エンジンのサポートを有効化 +- SQLユーザー定義関数(UDF)のサポートを追加 +- Kafka Connectシンクをベータステータスに昇格 +- 統合UIを改善し、バージョンに関するリッチメタデータ、更新状況などを導入 + +### コンソールの変更 +- クラウドコンソールでの多要素認証サポート +- モバイルデバイス向けにクラウドコンソールナビゲーションを改善 + +### ドキュメントの変更 +- ClickHouse Cloudに専用の[ドキュメント](https://clickhouse.com/docs/ja/cloud/overview)セクションを導入 + +### バグ修正 +- バックアップからの復元が依存関係の解決により常に動作しないことがあるという既知の問題を修正 + +## 2022年11月29日 + +このリリースはSOC2 Type II準拠、ClickHouseのバージョンを22.11に更新し、多数のClickHouseクライアントと統合を改善します。 + +### 一般的な変更 +- SOC2 Type II準拠に達(詳細は[ブログ](https://clickhouse.com/blog/clickhouse-cloud-is-now-soc-2-type-ii-compliant)および[Trust Center](https://trust.clickhouse.com)を参照) + +### コンソールの変更 +- サービスが自動的に一時停止されていることを示す「アイドル」ステータスインジケータを追加 + +### ClickHouse 22.11 バージョンアップグレード + +- HudiとDeltaLakeテーブルエンジンとテーブル関数のサポートを追加 +- S3の再帰的なディレクトリトラバーサルを改善 +- 複合時間間隔構文のサポートを追加 +- 挿入時の信頼性を向上し、挿入時に再試行を行う +- 完全な変更のリストは[detailed 22.11 changelog](/docs/ja/whats-new/changelog/2022.md/#-clickhouse-release-2211-2022-11-17)を参照 + +### 統合 +- Pythonクライアント:v3.11のサポート、挿入パフォーマンスを改善 +- Goクライアント:DateTimeおよびInt64 のサポートを修正 +- JSクライアント:相互SSL認証のサポート +- dbt-clickhouse:DBT v1.3のサポート + +### バグ修正 +- アップグレード後に古いClickHouseバージョンを表示するバグを修正 +- "default" アカウントの権限を変更してもセッションが中断されなくなりました +- 新しく作成された非管理アカウントはデフォルトでシステムテーブルへのアクセスを持たなくなりました + +### このリリースの既知の問題 +- バックアップからの復元が依存関係の解決により動作しない可能性がある + +## 2022年11月17日 + +このリリースでは、ローカルClickHouseテーブルおよびHTTPソースからのDictionaryを有効化し、ムンバイリージョンのサポートを導入し、クラウドコンソールのユーザーエクスペリエンスを改善します。 + +### 一般的な変更 +- ローカルClickHouseテーブルおよびHTTPソースからの[Dictionary](/docs/ja/sql-reference/dictionaries/index.md)のサポートを追加 +- ムンバイ[リージョン](/docs/ja/cloud/reference/supported-regions.md)のサポートを導入 + +### コンソールの変更 +- 請求書のフォーマットを改善 +- 支払い方法キャプチャのユーザーインターフェースを合理化 +- バックアップのより細かいアクティビティログを追加 +- ファイルアップロード中のエラーハンドリングを改善 + +### バグ修正 +- 一部パーツ内に単一の大きなファイルが存在する場合にバックアップが失敗するバグを修正 +- アクセスリストの変更が同時に適用された場合にバックアップからの復元が成功しないバグを修正 + +### 既知の問題 +- バックアップからの復元が依存関係の解決により動作しない可能性がある + +## 2022年11月3日 + +このリリースでは、料金から読み取り・書き込み単位を削除し(詳細は[料金ページ](https://clickhouse.com/pricing)を参照)、ClickHouseのバージョンを22.10に更新し、セルフサービスのお客様向けにより高い垂直スケーリングをサポートし、より良いデフォルトを通じて信頼性を向上させます。 + +### 一般的な変更 +- 読み取り/書き込み単位を料金モデルから削除 + +### 設定の変更 +- `allow_suspicious_low_cardinality_types`、`allow_suspicious_fixed_string_types`、および`allow_suspicious_codecs`(デフォルトはfalse)の設定は、安定性のためにユーザーによって変更できなくなりました。 + +### コンソールの変更 +- 有料顧客のために垂直スケーリングのセルフサービス最大を720GBのメモリに引き上げ +- バックアップからの復元ワークフローを改善し、IPアクセスリストルールとパスワードを設定 +- サービス作成ダイアログにGCPとAzureのウェイトリストを導入 +- ファイルアップロード中のエラーハンドリングを改善 +- 課金管理のためのワークフローを改善 + +### ClickHouse 22.10 バージョンアップグレード +- 多くの大きなパーツ(少なくとも10 GiB)が存在する場合、"多すぎるパーツ"のしきい値を緩和することで、オブジェクトストア上での結合を改善。これにより、単一テーブルの単一パーティションで最大ペタバイトのデータを有効に。 +- 一定の時間しきい値を超えた後にマージするための`min_age_to_force_merge_seconds`設定を改善。 +- 設定をリセットするためのMySQL互換の構文を追加`SET setting_name = DEFAULT`。 +- Morton曲線エンコーディング、Java整数ハッシュ、およびランダム数生成のための関数を追加。 +- 完全な変更のリストは[detailed 22.10 changelog](/docs/ja/whats-new/changelog/2022.md/#-clickhouse-release-2210-2022-10-25)を参照ください。 + +## 2022年10月25日 + +このリリースでは、小規模なワークロードの計算消費を大幅に削減し、計算料金を引き下げ(詳細は[料金ページ](https://clickhouse.com/pricing)を参照)、より良いデフォルトを通じて安定性を向上させ、ClickHouse Cloudコンソールの課金と使用ビューを強化します。 + +### 一般的な変更 +- 最小サービスメモリアロケーションを24Gに削減 +- サービスアイドルタイムアウトを30分から5分に短縮 + +### 設定の変更 +- max_parts_in_totalを100kから10kに削減。MergeTreeテーブルの`max_parts_in_total`設定のデフォルト値は100,000から10,000に下げられました。この変更の理由は、クラウドでのサービス起動時間が遅くなる可能性があるためです。データパーツの多さは、多くの場合、非常に粒度の細かいパーティションキーの選択を示しており、これは通常誤って行われ、避けるべきです。このデフォルトの変更は、これらのケースをより早く検出することを可能にします。 + +### コンソールの変更 +- トライアルユーザー向けの課金ビューでのクレジット使用の詳細を強化 +- ツールチップとヘルプテキストを改善し、使用ビューに料金ページへのリンクを追加 +- IPフィルタリングのオプションを切り替える際のワークフローを改善 +- クラウドコンソールに再送メール確認ボタンを追加 + +## 2022年10月4日 - Beta + +ClickHouse Cloudは2022年10月4日にパブリックベータを開始しました。詳細はこの[ブログ](https://clickhouse.com/blog/clickhouse-cloud-public-beta)をご覧ください。 + +ClickHouse CloudバージョンはClickHouseコアv22.10に基づいています。互換性のある機能のリストは[Cloud Compatibility](/docs/ja/cloud/reference/cloud-compatibility.md)ガイドを参照ください。 diff --git a/docs/ja/cloud/reference/cloud-compatibility.md b/docs/ja/cloud/reference/cloud-compatibility.md new file mode 100644 index 00000000000..c7dd9af37c6 --- /dev/null +++ b/docs/ja/cloud/reference/cloud-compatibility.md @@ -0,0 +1,136 @@ +--- +slug: /ja/whats-new/cloud-compatibility +sidebar_label: Cloud Compatibility +title: クラウド互換性 +--- + +# ClickHouse Cloud — 互換性ガイド + +このガイドは、ClickHouse Cloudにおける機能的および操作上の期待を概観します。ClickHouse CloudはオープンソースのClickHouseディストリビューションに基づいていますが、アーキテクチャや実装にいくつかの違いがあるかもしれません。[ClickHouse Cloudをどのように構築したか](https://clickhouse.com/blog/building-clickhouse-cloud-from-scratch-in-a-year)についてのブログも背景として興味深いでしょう。 + +## ClickHouse Cloud アーキテクチャ +ClickHouse Cloudは、運用のオーバーヘッドを大幅に簡素化し、大規模にClickHouseを運用するコストを削減します。デプロイメントのサイズを事前に設定したり、高可用性のためにレプリケーションを設定したり、手動でデータをシャードしたり、ワークロードが増えたときにサーバーをスケールアップしたり、使用していないときにスケールダウンしたりする必要はありません。これらはすべて、私たちが処理します。 + +これらの利点は、ClickHouse Cloudの基盤となるアーキテクチャの選択によるものです: +- コンピュートとストレージが分離されており、異なる次元で自動的にスケーリングできるため、静的なインスタンス構成でストレージやコンピュートを過剰にプロビジョンする必要はありません。 +- オブジェクトストアの上にある階層型ストレージと多層キャッシングは、事実上無制限のスケーリングと良好な価格/性能比を提供し、ストレージパーティションを事前に設定する必要や高いストレージコストについて心配する必要はありません。 +- 高可用性はデフォルトでオンになっており、レプリケーションは透過的に管理されているため、アプリケーションの構築やデータの分析に集中できます。 +- 変動する継続的なワークロードのための自動スケーリングはデフォルトでオンになっており、サービスのサイズを事前に設定したり、ワークロードが増えたときにサーバーをスケールアップしたり、アクティビティが減少したときに手動でサーバーをスケールダウンしたりする必要はありません。 +- 断続的なワークロードのためのシームレスなハイバネーションがデフォルトでオンになっており、新しいクエリが到着したときに計算リソースを自動的に一時停止し、透過的に再開するため、アイドルリソースの支払いをする必要はありません。 +- 高度なスケーリング制御を使用して、コスト制御のための自動スケーリング最大値を設定したり、専門的な性能要件を持つアプリケーションのためにコンピュートリソースを予約するための自動スケーリング最小値を設定できます。 + +## 機能 +ClickHouse Cloudは、オープンソースディストリビューションのClickHouseの厳選された機能へのアクセスを提供します。以下のテーブルは、現時点でClickHouse Cloudで無効になっているいくつかの機能を説明しています。 + +### DDL構文 +ClickHouse CloudのDDL構文は、大部分がセルフマネージドインストールで利用可能なものと一致するはずです。一部の顕著な例外: + - 現在利用できない`CREATE AS SELECT`のサポート。代替策として、`CREATE ... EMPTY ... AS SELECT`を使用し、そのテーブルに挿入することをお勧めします(例については[このブログ](https://clickhouse.com/blog/getting-data-into-clickhouse-part-1)を参照してください)。 + - 一部のエクスペリメンタルな構文は無効にされる可能性があり、たとえば`ALTER TABLE … MODIFY QUERY`文です。 + - セキュリティ上の理由から一部のイントロスペクション機能が無効になることがあり、たとえば`addressToLine` SQL関数などです。 + - ClickHouse Cloudで`ON CLUSTER`パラメータを使用しないでください。これらは基本的に無効な関数ですが、[マクロ](https://clickhouse.com/docs/ja/operations/server-configuration-parameters/settings#macros)を使用しようとするとエラーが発生する可能性があります。マクロはClickHouse Cloudでは通常機能しないし、必要でもありません。 + +### データベースおよびテーブルエンジン + +ClickHouse Cloudはデフォルトで高可用性のレプリケートされたサービスを提供します。その結果、すべてのデータベースおよびテーブルエンジンは「Replicated」となります。たとえば、`ReplicatedMergeTree`と`MergeTree`はClickHouse Cloudで使用される場合、同一です。 + +**サポートされているテーブルエンジン** + + - ReplicatedMergeTree (指定がない場合のデフォルト) + - ReplicatedSummingMergeTree + - ReplicatedAggregatingMergeTree + - ReplicatedReplacingMergeTree + - ReplicatedCollapsingMergeTree + - ReplicatedVersionedCollapsingMergeTree + - MergeTree (ReplicatedMergeTreeに変換) + - SummingMergeTree (ReplicatedSummingMergeTreeに変換) + - AggregatingMergeTree (ReplicatedAggregatingMergeTreeに変換) + - ReplacingMergeTree (ReplicatedReplacingMergeTreeに変換) + - CollapsingMergeTree (ReplicatedCollapsingMergeTreeに変換) + - VersionedCollapsingMergeTree (ReplicatedVersionedCollapsingMergeTreeに変換) + - URL + - View + - MaterializedView + - GenerateRandom + - Null + - Buffer + - Memory + - Deltalake + - Hudi + - MySQL + - MongoDB + - NATS + - RabbitMQ + - PostgreSQL + - S3 + +### インターフェース +ClickHouse CloudはHTTPS、ネイティブインターフェース、および[MySQLワイヤプロトコル](/docs/ja/interfaces/mysql)をサポートしています。Postgresのような他のインターフェースのサポートは近日中に予定されています。 + +### Dictionary +Dictionaryは、ClickHouseでルックアップを高速化するための一般的な方法です。ClickHouse Cloudは現在、PostgreSQL、MySQL、リモートおよびローカルClickHouseサーバー、Redis、MongoDB、およびHTTPソースからのDictionaryをサポートしています。 + +### 分散クエリ +クラウド内でのクロスクラスタ通信と外部セルフマネージドClickHouseクラスタとの通信のために、分散ClickHouseクエリをサポートします。ClickHouse Cloudは現在、以下の統合エンジンを使用して分散クエリをサポートしています: + - Deltalake + - Hudi + - MySQL + - MongoDB + - NATS + - RabbitMQ + - PostgreSQL + - S3 + +SQLite、ODBC、JDBC、Redis、HDFS、Hiveのような一部の外部データベースおよびテーブルエンジンとの分散クエリはまだサポートされていません。 + +### ユーザー定義関数 + +ユーザー定義関数は、ClickHouseの最近の機能です。ClickHouse Cloudは現在、SQL UDFのみをサポートしています。 + +### エクスペリメンタル機能 + +エクスペリメンタル機能は、サービスデプロイメントの安定性を確保するためにClickHouse Cloudサービスで無効化されています。 + +### Kafka + +[Kafka テーブルエンジン](/docs/ja/integrations/data-ingestion/kafka/index.md)は、ClickHouse Cloudで一般に利用可能ではありません。代わりに、Kafka接続コンポーネントをClickHouseサービスから分離するアーキテクチャを利用することをお勧めします。Kafkaストリームからデータをプルするためには、[ClickPipes](https://clickhouse.com/cloud/clickpipes)をお勧めいたします。あるいは、プッシュベースの代替案として、[Kafkaユーザーガイド](/docs/ja/integrations/data-ingestion/kafka/index.md)にリストされているオプションを検討してください。 + +### Named collections + +[Named collections](/ja/operations/named-collections)は現在、ClickHouse Cloudでサポートされていません。 + +## 運用上のデフォルトと考慮事項 +以下はClickHouse Cloudサービスのデフォルト設定です。一部の設定はサービスの適切な運用を確保するために固定されており、他の設定は調整可能です。 + +### 運用の制限 + +#### `max_parts_in_total: 10,000` +MergeTreeテーブルの`max_parts_in_total`設定のデフォルト値は、100,000から10,000に引き下げられました。この変更の理由は、大量のデータパーツがクラウドでのサービスの起動時間を遅らせる可能性があることがわかったためです。多数のパーツは、通常はパーティションキーの選定が細かすぎることを示し、これは通常誤って行われるため避けるべきです。このデフォルトの変更により、これらのケースが早期に検出できるようになります。 + +#### `max_concurrent_queries: 1,000` +このサーバー単位の設定をデフォルトの100から1000に増加させ、より多くの同時性を許可しました。これにより、開発サービスでは2,000の同時クエリ、プロダクションでは3,000の同時クエリが可能になります。 + +#### `max_table_size_to_drop: 1,000,000,000,000` +この設定を50GBから1TBまでテーブル/パーティションの削除を許可するために増加しました。 + +### システム設定 +ClickHouse Cloudは可変のワークロードに最適化されており、そのため大多数のシステム設定は現時点で構成可能ではありません。ほとんどのユーザーにとってシステム設定の調整は不要と考えていますが、高度なシステム調整に関する質問がある場合は、ClickHouse Cloudサポートにお問い合わせください。 + +### 高度なセキュリティ管理 +ClickHouseサービスの作成の一環として、デフォルトのデータベースおよびこのデータベースに広範な権限を持つデフォルトユーザーが作成されます。この最初のユーザーは、他のユーザーを作成し、その権限をこのデータベースに割り当てることができます。これを超えて、Kerberos、LDAP、またはSSL X.509証明書認証を用いたデータベース内の以下のセキュリティ機能を有効にする機能は現時点ではサポートされていません。 + +## ロードマップ +以下のテーブルは、上記で説明したいくつかの機能を拡張するための取り組みを要約しています。フィードバックがある場合は、[こちらに提出](mailto:feedback@clickhouse.com)してください。 + +| 機能 | 状況 | +|---------------------------------------------------------------------------------------------|:----------------------------------------| +|Dictionaryサポート:PostgreSQL、MySQL、リモートおよびローカルClickHouseサーバー、Redis、MongoDB、およびHTTPソース | **GAで追加済み** | +|SQLユーザー定義関数(UDF) | **GAで追加済み** | +|MySQLおよびPostgreSQLエンジン | **GAで追加済み** | +|MySQLインターフェース | **GAで追加済み** | +|Postgresインターフェース | 近日公開 | +|SQLite、ODBC、Redis、HDFS、Hive向けエンジン | 近日公開 | +|Protobuf、Cap'n'Protoフォーマット | 近日公開 | +|Kafkaテーブルエンジン | 推奨されません; ※上記の代替案を参照 | +|JDBCテーブルエンジン | 推奨されません | +|EmbeddedRocksDBエンジン | 需要を評価中 | +|実行可能なユーザー定義関数 | 需要を評価中 | diff --git a/docs/ja/cloud/reference/compute-compute-separation.md b/docs/ja/cloud/reference/compute-compute-separation.md new file mode 100644 index 00000000000..87c2dd38cfc --- /dev/null +++ b/docs/ja/cloud/reference/compute-compute-separation.md @@ -0,0 +1,190 @@ +--- +title: ウェアハウス、またはコンピュート・コンピュート分離 +slug: /ja/cloud/reference/compute-compute-separation +keywords: [コンピュート分離, クラウド, アーキテクチャ, コンピュート・コンピュート, ウェアハウス, ウェアハウス] +description: ClickHouse Cloud での複数の、分離されたノードグループの使用方法 + +--- + +# ウェアハウス、またはコンピュート・コンピュート分離(プライベートプレビュー) + +## コンピュート・コンピュート分離とは? + +各ClickHouse Cloudサービスには以下が含まれます: +- ClickHouseノード(またはレプリカ)のグループ - **開発**ティアサービスには2ノード、**本番**ティアサービスには3ノード +- サービスに接続するために使用するエンドポイント(またはClickHouse Cloud UIコンソールで作成された複数のエンドポイント)、これはサービスURLです(例:`https://dv2fzne24g.us-east-1.aws.clickhouse.cloud:8443`) +- サービスがすべてのデータと一部のメタデータを保存するオブジェクトストレージフォルダー: + +
+ +NEEDS ALT + +
+ +_Fig. 1 - 現在のClickHouse Cloudサービス_ + +コンピュート・コンピュート分離により、ユーザーは複数のコンピュートノードグループを作成できます。これらはそれぞれ独自のエンドポイントを持ち、同じオブジェクトストレージフォルダーを使用するため、同じテーブル、ビューなどを持つことが可能です。 + +各コンピュートノードグループは独自のエンドポイントを持つため、どのレプリカセットをワークロードに使用するか選択できます。あるワークロードは小型のレプリカ1つで満足できるかもしれませんし、他のワークロードは高可用性(HA)と何百ギガのメモリを必要とするかもしれません。コンピュート・コンピュート分離により、読み取り操作を書き込み操作から分離し、相互に干渉しないようにすることも可能です。 + +
+ +NEEDS ALT + +
+ +_Fig. 2 - ClickHouse Cloudのコンピュート_ + +このプライベートプレビュープログラムでは、既存のサービスのデータを共有する新しいサービスを作成したり、同じデータを共有する複数のサービスを持つ完全に新しいセットアップを作成することができます。 + +## ウェアハウスとは何ですか? + +ClickHouse Cloudでの_ウェアハウス_は、同じデータを共有するサービスのセットです。 +各ウェアハウスには主要なサービス(最初に作成されたサービス)と副サービスがあります。以下のスクリーンショットでは、同じデータを共有する「DWH Prod」というウェアハウスと2つのサービスが含まれていることが分かります: +- 主要サービス「DWH Prod」 +- 副サービス「DWH Prod Subservice」 + +
+ +NEEDS ALT + +
+ +_Fig. 3 - ウェアハウスの例_ + +ウェアハウス内のすべてのサービスは同じものを共有します: + +- 地域(例:us-east1) +- クラウドサービスプロバイダー(AWS, GCPまたはAzure) +- ClickHouseデータベースのバージョン + +サービスは所属するウェアハウスごとにソートできます。 + +## アクセス制御 + +### データベース資格情報 + +ウェアハウス内のすべてが同じテーブルセットを共有しているため、他のサービスへのアクセス制御も共有します。これは、サービス1で作成されたすべてのデータベースユーザーが、同じ権限(テーブル、ビューへの付与など)を持ってサービス2も使用できることを意味します。ユーザーは各サービスの別のエンドポイントを使用しますが、同じユーザー名とパスワードを使用します。つまり、_ユーザーは同じストレージを使って作業するサービス間で共有されます:_ + +
+ +NEEDS ALT + +
+ +_Fig. 4 - ユーザーAliceはサービス1で作成されましたが、同じ資格情報を使って同じデータを共有するすべてのサービスにアクセスできます_ + +### ネットワークアクセス制御 + +他のアプリケーションやアドホックユーザーによる特定のサービスの使用を制限することはしばしば有用です。これはネットワーク制限を使用して実現できます。現在通常のサービスに設定されているのと同様に設定できます(ClickHouse Cloudコンソールの特定のサービスタブの**設定**に移動)。 + +IPフィルタリング設定を各サービスに別々に適用できるため、どのアプリケーションがどのサービスにアクセスできるかを制御できます。これにより、特定のサービスの利用を制限できます: + +
+ +NEEDS ALT + +
+ +_Fig. 5 - ネットワーク設定によりAliceはサービス2にアクセス不可とされています_ + +### 読み取り vs 読み書き + +特定のサービスの書き込みアクセスを制限し、ウェアハウス内のサービスのサブセットのみが書き込みを許可されるようにすることが有用な場合があります。これを行うには、2番目およびn番目のサービスを作成するときに行えます(最初のサービスは常に読み書き可能であるべきです): + +
+ +NEEDS ALT + +
+ +_Fig. 6 - ウェアハウス内の読み書き可能および読み取り専用のサービス_ + +## スケーリング + +ウェアハウス内の各サービスは以下に対してワークロードに合わせて調整できます: +- ノード(レプリカ)の数。現在、ノード(レプリカ)の最小数は2です。 +- ノード(レプリカ)のサイズ +- サービスが自動的にスケールするかどうか +- サービスが非アクティブ時にアイドル状態にするべきか(グループ内の最初のサービスには適用できません - **制限**セクションを参照してください) + +## 動作の変更 + +サービスでコンピュート・コンピュートが有効になると(少なくとも1つの副サービスが作成された場合)、`clusterAllReplicas()` 関数呼び出しは`default` クラスタ名を使用して、呼び出されたサービスのレプリカのみを活用します。つまり、同じデータセットに接続されている2つのサービスがあり、サービス1から `clusterAllReplicas(default, system, processes)` が呼ばれる場合、サービス1で実行されているプロセスのみが表示されます。必要に応じて、例えば `clusterAllReplicas('all_groups.default', system, processes)` を呼び出してすべてのレプリカに到達することもできます。 + +## 制限事項 + +このコンピュート・コンピュート分離が現在プライベートプレビュー中であるため、この機能を使用する場合にはいくつかの制限事項があります。これらの制限の多くは、機能がGA(一般公開)にリリースされた後に解除されます: + +1. **主要(元の)サービスは最近作成されたか、移行されているべきです。** 残念ながら、すべての既存のサービスが他のサービスとストレージを共有できるわけではありません。昨年中にサービスがサポートする必要があるいくつかの機能(共有Merge Treeエンジンなど)をリリースしたため、未更新のサービスはほとんど他のサービスとデータを共有できません。これはClickHouseバージョンに依存しません。 + + 良いニュースは、我々が古いサービスを新しいエンジンに移行し、追加のサービスを作成できるようにすることができます。ご希望のサービスが移行する必要があるかどうか、サポートにお問い合わせください。 + +2. **主要サービスは常に稼働中であり、アイドル状態になってはならない(GAの数時間後にこの制限は解除されます)。** プライベートプレビュー中およびGA後の数時間は、主要サービス(通常は他のサービスを追加することで拡張したい既存のサービス)は常に稼働しており、アイドル設定が無効化されています。少なくとも1つの副サービスがある場合、主要サービスを停止またはアイドル状態にすることはできません。すべての副サービスが削除されたら、元のサービスを再び停止またはアイドル状態にできます。 + +3. **時にはワークロードを隔離できないことがあります。** データベースワークロードを互いに隔離するオプションを提供することを目的としていますが、1つのサービスのワークロードが同じデータを共有する別のサービスに影響を与えるコーナーケースがあるかもしれません。これは主にOLTPのようなワークロードに関連する非常に稀な状況です。 + +4. **すべての読み書き可能なサービスはバックグラウンドマージ操作を実施します。** ClickHouseにデータを挿入すると、最初にデータベースはデータをステージングパーティションに挿入し、その後バックグラウンドでマージ操作を行います。これらのマージはメモリとCPUリソースを消費します。2つの読み書き可能なサービスが同じストレージを共有している場合、両方ともバックグラウンド操作を実行しています。つまり、サービス1で`INSERT`クエリがありますが、マージ操作がサービス2で完了することがあるかもしれません。読み取り専用のサービスはバックグラウンドマージを実行しないため、この操作にリソースを費やしません。 + +5. **一つの読み書き可能なサービスでの挿入操作が、アイドル状態にした場合のもう一つの読み書き可能なサービスを防ぐことがある。** 前のポイントのため、第二のサービスが最初のサービス用にバックグラウンドマージ操作を行います。これらのバックグラウンド操作は、第二のサービスがアイドル状態になるのを妨げる可能性があります。バックグラウンド操作が完了すると、サービスはアイドル状態になります。読み取り専用サービスは影響を受けず、遅延なくアイドル状態になります。 + +6. **CREATE/RENAME/DROP DATABASEクエリはアイドル/停止状態のサービスによってブロックされる可能性がある(GAの際に制限は解除されます)。** これらのクエリはハングすることがあります。これを回避するには、セッションまたはクエリ単位で `settings distributed_ddl_task_timeout=0` でデータベース管理クエリを実行することができます。例: + +```sql +create database db_test_ddl_single_query_setting +settings distributed_ddl_task_timeout=0 +``` + +## 料金 + +プライベートプレビュー中に作成された追加のサービスは通常どおり請求されます。コンピュート価格はウェアハウス内のすべてのサービス(主および副)で同じです。ストレージは一度だけ請求されます - それは最初の(オリジナルの)サービスに含まれています。 + +## プライベートプレビュー終了後に何が起こるか + +プライベートプレビュープログラムが終了し、コンピュート・コンピュート分離機能がGAにリリースされると、新しく作成されたサービスはコンピュート・コンピュート分離機能の一部としてそのまま残ります。データやサービスが削除されることはありません。 + +## バックアップ + +- 単一ウェアハウス内のすべてのサービスが同じストレージを共有しているため、バックアップは主要(初期)サービス上のみで作成されます。これにより、ウェアハウス内のすべてのサービスのデータがバックアップされます。 +- ウェアハウスの主要サービスのバックアップを復元する場合、既存のウェアハウスと接続されていない完全に新しいサービスに復元されます。復元が完了した直後に新しいサービスに他のサービスを追加できます。 + +## 始める方法 + +組織内でコンピュート・コンピュート分離プライベートプレビューを有効にするには、ClickHouse Cloudサポートチームに連絡してください。チームがこの機能を有効にすると、組織内の既存のサービスに追加のサービスを作成できるようになり、プラス記号をクリックします。 + +
+ +NEEDS ALT + +
+ +_Fig. 7 - ウェアハウス内で新しいサービスを作成するためにプラス記号をクリック_ + diff --git a/docs/ja/cloud/reference/images/architecture.svg b/docs/ja/cloud/reference/images/architecture.svg new file mode 100644 index 00000000000..73043b42179 --- /dev/null +++ b/docs/ja/cloud/reference/images/architecture.svg @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/cloud/reference/images/aug-15-compute-compute.png b/docs/ja/cloud/reference/images/aug-15-compute-compute.png new file mode 100644 index 00000000000..c5dfb2b6c85 Binary files /dev/null and b/docs/ja/cloud/reference/images/aug-15-compute-compute.png differ diff --git a/docs/ja/cloud/reference/images/aug-29-scaling.png b/docs/ja/cloud/reference/images/aug-29-scaling.png new file mode 100644 index 00000000000..e77b0dfcea5 Binary files /dev/null and b/docs/ja/cloud/reference/images/aug-29-scaling.png differ diff --git a/docs/ja/cloud/reference/images/byoc-1.png b/docs/ja/cloud/reference/images/byoc-1.png new file mode 100644 index 00000000000..5702d22a618 Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-1.png differ diff --git a/docs/ja/cloud/reference/images/byoc-2.png b/docs/ja/cloud/reference/images/byoc-2.png new file mode 100644 index 00000000000..dcb54f675b6 Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-2.png differ diff --git a/docs/ja/cloud/reference/images/byoc-3.png b/docs/ja/cloud/reference/images/byoc-3.png new file mode 100644 index 00000000000..683e63a9ab7 Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-3.png differ diff --git a/docs/ja/cloud/reference/images/byoc-4.png b/docs/ja/cloud/reference/images/byoc-4.png new file mode 100644 index 00000000000..f171dbc68bb Binary files /dev/null and b/docs/ja/cloud/reference/images/byoc-4.png differ diff --git a/docs/ja/cloud/reference/images/clickpipes-s3-gcs.png b/docs/ja/cloud/reference/images/clickpipes-s3-gcs.png new file mode 100644 index 00000000000..834a5d70016 Binary files /dev/null and b/docs/ja/cloud/reference/images/clickpipes-s3-gcs.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-1.png b/docs/ja/cloud/reference/images/compute-compute-1.png new file mode 100644 index 00000000000..8547a3d0efe Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-1.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-2.png b/docs/ja/cloud/reference/images/compute-compute-2.png new file mode 100644 index 00000000000..c5dfb2b6c85 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-2.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-3.png b/docs/ja/cloud/reference/images/compute-compute-3.png new file mode 100644 index 00000000000..1433fc5624e Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-3.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-4.png b/docs/ja/cloud/reference/images/compute-compute-4.png new file mode 100644 index 00000000000..cd7da5b5401 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-4.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-5.png b/docs/ja/cloud/reference/images/compute-compute-5.png new file mode 100644 index 00000000000..a53d8285388 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-5.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-6.png b/docs/ja/cloud/reference/images/compute-compute-6.png new file mode 100644 index 00000000000..80cefbe1013 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-6.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-7.png b/docs/ja/cloud/reference/images/compute-compute-7.png new file mode 100644 index 00000000000..af397e08e0d Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-7.png differ diff --git a/docs/ja/cloud/reference/images/compute-compute-8.png b/docs/ja/cloud/reference/images/compute-compute-8.png new file mode 100644 index 00000000000..a4c329474c9 Binary files /dev/null and b/docs/ja/cloud/reference/images/compute-compute-8.png differ diff --git a/docs/ja/cloud/reference/images/create-tokyo-service.png b/docs/ja/cloud/reference/images/create-tokyo-service.png new file mode 100644 index 00000000000..edcef59bc63 Binary files /dev/null and b/docs/ja/cloud/reference/images/create-tokyo-service.png differ diff --git a/docs/ja/cloud/reference/images/july-18-table-inspector.png b/docs/ja/cloud/reference/images/july-18-table-inspector.png new file mode 100644 index 00000000000..f2efc2c97a5 Binary files /dev/null and b/docs/ja/cloud/reference/images/july-18-table-inspector.png differ diff --git a/docs/ja/cloud/reference/images/june-13-fast-releases.png b/docs/ja/cloud/reference/images/june-13-fast-releases.png new file mode 100644 index 00000000000..351fb3470e3 Binary files /dev/null and b/docs/ja/cloud/reference/images/june-13-fast-releases.png differ diff --git a/docs/ja/cloud/reference/images/june-13-kafka-config.png b/docs/ja/cloud/reference/images/june-13-kafka-config.png new file mode 100644 index 00000000000..391bc3548d3 Binary files /dev/null and b/docs/ja/cloud/reference/images/june-13-kafka-config.png differ diff --git a/docs/ja/cloud/reference/images/june-28-prometheus.png b/docs/ja/cloud/reference/images/june-28-prometheus.png new file mode 100644 index 00000000000..1e1e1685dbf Binary files /dev/null and b/docs/ja/cloud/reference/images/june-28-prometheus.png differ diff --git a/docs/ja/cloud/reference/images/june-28-query-insights.png b/docs/ja/cloud/reference/images/june-28-query-insights.png new file mode 100644 index 00000000000..e4b9681e232 Binary files /dev/null and b/docs/ja/cloud/reference/images/june-28-query-insights.png differ diff --git a/docs/ja/cloud/reference/images/may-17-kinesis.png b/docs/ja/cloud/reference/images/may-17-kinesis.png new file mode 100644 index 00000000000..97dbec0a753 Binary files /dev/null and b/docs/ja/cloud/reference/images/may-17-kinesis.png differ diff --git a/docs/ja/cloud/reference/images/may-17-query-endpoints.png b/docs/ja/cloud/reference/images/may-17-query-endpoints.png new file mode 100644 index 00000000000..4bc93b357a4 Binary files /dev/null and b/docs/ja/cloud/reference/images/may-17-query-endpoints.png differ diff --git a/docs/ja/cloud/reference/images/may-30-private-endpoints.png b/docs/ja/cloud/reference/images/may-30-private-endpoints.png new file mode 100644 index 00000000000..a2ec543d44e Binary files /dev/null and b/docs/ja/cloud/reference/images/may-30-private-endpoints.png differ diff --git a/docs/ja/cloud/reference/images/may-30-share-queries.png b/docs/ja/cloud/reference/images/may-30-share-queries.png new file mode 100644 index 00000000000..56808712665 Binary files /dev/null and b/docs/ja/cloud/reference/images/may-30-share-queries.png differ diff --git a/docs/ja/cloud/reference/images/new-cloud-console.gif b/docs/ja/cloud/reference/images/new-cloud-console.gif new file mode 100644 index 00000000000..ebc96f10ba3 Binary files /dev/null and b/docs/ja/cloud/reference/images/new-cloud-console.gif differ diff --git a/docs/ja/cloud/reference/images/oct-4-latency-insights.png b/docs/ja/cloud/reference/images/oct-4-latency-insights.png new file mode 100644 index 00000000000..214f8c706b8 Binary files /dev/null and b/docs/ja/cloud/reference/images/oct-4-latency-insights.png differ diff --git a/docs/ja/cloud/reference/images/shared-merge-tree-1.png b/docs/ja/cloud/reference/images/shared-merge-tree-1.png new file mode 100644 index 00000000000..447d00a2712 Binary files /dev/null and b/docs/ja/cloud/reference/images/shared-merge-tree-1.png differ diff --git a/docs/ja/cloud/reference/images/shared-merge-tree-2.png b/docs/ja/cloud/reference/images/shared-merge-tree-2.png new file mode 100644 index 00000000000..3c68e03c743 Binary files /dev/null and b/docs/ja/cloud/reference/images/shared-merge-tree-2.png differ diff --git a/docs/ja/cloud/reference/shared-merge-tree.md b/docs/ja/cloud/reference/shared-merge-tree.md new file mode 100644 index 00000000000..e79b2cffa51 --- /dev/null +++ b/docs/ja/cloud/reference/shared-merge-tree.md @@ -0,0 +1,119 @@ +--- +slug: /ja/cloud/reference/shared-merge-tree +sidebar_label: SharedMergeTree +title: SharedMergeTree +keywords: [shared merge tree sharedmergetree engine] +--- + +# SharedMergeTree テーブルエンジン + +*\* ClickHouse Cloud(および一部のパートナークラウドサービス)でのみ利用可能* + +SharedMergeTree テーブルエンジンファミリーは、ReplicatedMergeTree エンジンのクラウドネイティブな代替品であり、共有ストレージ(例:Amazon S3、Google Cloud Storage、MinIO、Azure Blob Storage)上での動作に最適化されています。特定の MergeTree エンジンタイプごとに SharedMergeTree アナログが存在し、つまり ReplacingSharedMergeTree は ReplacingReplicatedMergeTree を置き換えます。 + +SharedMergeTree テーブルエンジンファミリーは、ClickHouse Cloud の基盤です。エンドユーザーにとって、ReplicatedMergeTree ベースのエンジンを使用する代わりに SharedMergeTree エンジンファミリーを使い始めるために何かを変更する必要はありません。以下の追加の利点を提供します: + +- 高い挿入スループット +- バックグラウンドマージのスループットの向上 +- ミューテーションのスループットの向上 +- スケールアップおよびスケールダウン操作の高速化 +- 選択クエリのより軽量な強整合性 + +SharedMergeTree がもたらす重要な改善点は、ReplicatedMergeTree に比べて計算とストレージのより深い分離を提供することです。以下で ReplicatedMergeTree が計算とストレージをどのように分離するかを確認できます: + +![ReplicatedMergeTree Diagram](./images/shared-merge-tree-1.png) + +ご覧のとおり、ReplicatedMergeTree に保存されたデータはオブジェクトストレージにありますが、メタデータは依然として各 clickhouse-server に存在します。つまり、すべてのレプリケーション操作のために、メタデータもすべてのレプリカにレプリケートされる必要があります。 + +![ReplicatedMergeTree Diagram with Metadata](./images/shared-merge-tree-2.png) + +ReplicatedMergeTree とは異なり、SharedMergeTree はレプリカ同士の通信を必要としません。代わりに、すべての通信は共有ストレージと clickhouse-keeper を通じて行われます。SharedMergeTree は非同期のリーダーレスレプリケーションを実装し、clickhouse-keeper を調整およびメタデータストレージに使用します。これは、サービスのスケールアップおよびスケールダウンに伴ってメタデータをレプリケートする必要がないことを意味します。これにより、レプリケーション、ミューテーション、マージおよびスケールアップの操作が高速化されます。SharedMergeTree は各テーブルに対して何百ものレプリカを可能にし、シャードなしで動的にスケールすることができます。ClickHouse Cloud では、分散クエリ実行アプローチが採用され、より多くのコンピュートリソースがクエリに利用されます。 + +## 内部監視 + +ReplicatedMergeTree の内部監視に使用されるほとんどのシステムテーブルは、SharedMergeTree にも存在しますが、データとメタデータのレプリケーションが発生しないため、`system.replication_queue` と `system.replicated_fetches` は含まれていません。しかし、SharedMergeTree にはこれら2つのテーブルに対応する代替案があります。 + +**system.virtual_parts** + +このテーブルは `system.replication_queue` に対する SharedMergeTree の代替として機能します。現在のパーツの最新セット、ならびにマージ、ミューテーション、および削除されたパーティションなどの進行中の将来のパーツに関する情報を格納します。 + +**system.shared_merge_tree_fetches** + +このテーブルは `system.replicated_fetches` に対する SharedMergeTree の代替です。メモリに読み込まれる主キーとチェックサムの進行中のフェッチに関する情報を含みます。 + +## SharedMergeTree の有効化 + +`SharedMergeTree` はデフォルトで有効になっています。 + +SharedMergeTree テーブルエンジンをサポートするサービスでは、手動で何かを有効にする必要はありません。以前と同様にテーブルを作成すると、CREATE TABLE クエリで指定されたエンジンに対応する SharedMergeTree ベースのテーブルエンジンが自動的に使用されます。 + +```sql +CREATE TABLE my_table( + key UInt64, + value String +) +ENGINE = MergeTree +ORDER BY key +``` + +これにより、SharedMergeTree テーブルエンジンを使用して `my_table` テーブルが作成されます。 + +ClickHouse Cloud では `default_table_engine=MergeTree` として設定されているため、`ENGINE=MergeTree` を指定する必要はありません。以下のクエリは、上記のクエリと同一です。 + +```sql +CREATE TABLE my_table( + key UInt64, + value String +) +ORDER BY key +``` + +もし Replacing, Collapsing, Aggregating, Summing, VersionedCollapsing, または Graphite MergeTree テーブルを使用すると、それに対応する SharedMergeTree ベースのテーブルエンジンに自動的に変換されます。 + +```sql +CREATE TABLE myFirstReplacingMT +( + `key` Int64, + `someCol` String, + `eventTime` DateTime +) +ENGINE = ReplacingMergeTree +ORDER BY key; +``` + +特定のテーブルについて、`CREATE TABLE` ステートメントで使用されたテーブルエンジンを確認するには、`SHOW CREATE TABLE` を使用します。 +``` sql +SHOW CREATE TABLE myFirstReplacingMT; +``` + +```sql +CREATE TABLE default.myFirstReplacingMT +( `key` Int64, `someCol` String, `eventTime` DateTime ) +ENGINE = SharedReplacingMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') +ORDER BY key +SETTINGS index_granularity = 8192 +``` + +## 設定 + +いくつかの設定の挙動が大幅に変更されています: + +- `insert_quorum` -- すべての SharedMergeTree への挿入はクオーラム挿入(共有ストレージに書き込まれる)ですので、この設定は SharedMergeTree テーブルエンジンを使用する際には必要ありません。 +- `insert_quorum_parallel` -- すべての SharedMergeTree への挿入はクオーラム挿入(共有ストレージに書き込まれる)ですので、この設定は SharedMergeTree テーブルエンジンを使用する際には必要ありません。 +- `select_sequential_consistency` -- クオーラム挿入を必要とせず、`SELECT` クエリに追加の負荷を clickhouse-keeper にかけます。 + +## 一貫性 + +SharedMergeTree は、ReplicatedMergeTree よりも軽量な一貫性を提供します。SharedMergeTree に挿入する際には、`insert_quorum` や `insert_quorum_parallel` のような設定を提供する必要はありません。挿入はクオーラム挿入であり、メタデータは ClickHouse-Keeper に保存され、メタデータは少なくとも ClickHouse-keepers のクオーラムに複製されます。クラスター内の各レプリカは、非同期に ClickHouse-Keeper から新しい情報をフェッチします。 + +通常、`select_sequential_consistency` や `SYSTEM SYNC REPLICA LIGHTWEIGHT` を使用する必要はありません。非同期レプリケーションはほとんどのシナリオをカバーし、非常に低いレイテンシーを持っています。どうしても古いデータを読みたくない場合には、以下の推奨事項を優先順位に従って実行してください: + +1. クエリを同じセッションまたは同じノードで読み書きしている場合、`select_sequential_consistency` は必要ありません。すでにレプリカが最新のメタデータを持っているからです。 + +2. 一方のレプリカに書き込み、別のレプリカから読み取る場合、`SYSTEM SYNC REPLICA LIGHTWEIGHT` を使用して、レプリカが ClickHouse-Keeper からメタデータを取得するように強制できます。 + +3. クエリの一部として `select_sequential_consistency` という設定を使用します。 + +## 関連コンテンツ + +- [ClickHouse Cloud が SharedMergeTree と軽量アップデートでパフォーマンスを向上](https://clickhouse.com/blog/clickhouse-cloud-boosts-performance-with-sharedmergetree-and-lightweight-updates) diff --git a/docs/ja/cloud/reference/supported-regions.md b/docs/ja/cloud/reference/supported-regions.md new file mode 100644 index 00000000000..1df725dd921 --- /dev/null +++ b/docs/ja/cloud/reference/supported-regions.md @@ -0,0 +1,49 @@ +--- +title: サポートされているクラウドリージョン +sidebar_label: サポートされているクラウドリージョン +keywords: [aws, gcp, google cloud, azure, クラウド, リージョン] +description: ClickHouse Cloudがサポートするリージョン +--- +# サポートされているクラウドリージョン +## AWSリージョン + +- ap-northeast-1 (東京) +- ap-south-1 (ムンバイ) +- ap-southeast-1 (シンガポール) +- ap-southeast-2 (シドニー) +- eu-central-1 (フランクフルト) +- eu-west-1 (アイルランド) +- eu-west-2 (ロンドン) +- us-east-1 (北バージニア) +- us-east-2 (オハイオ) +- us-west-2 (オレゴン) + +**検討中:** +- ca-central-1 (カナダ) +- me-central-1 (中東) +- af-south-1 (南アフリカ) +- eu-north-1 (ストックホルム) +- sa-east-1 (南アメリカ) + + +## Google Cloudリージョン + +- asia-southeast1 (シンガポール) +- europe-west4 (オランダ) +- us-central1 (アイオワ) +- us-east1 (サウスカロライナ) + +**検討中:** +- australia-southeast1 (シドニー) +- us-west-1 (オレゴン) +- eu-west-1 (ベルギー) + +## Azureリージョン + +- 西 US 3 (アリゾナ) +- 東 US 2 (バージニア) +- ドイツ西中央 (フランクフルト) + +:::note +現在リストされていないリージョンへのデプロイが必要ですか? [リクエストを送信](https://clickhouse.com/pricing?modal=open)してください。 +::: diff --git a/docs/ja/cloud/security/_category_.yml b/docs/ja/cloud/security/_category_.yml new file mode 100644 index 00000000000..b7253753fd5 --- /dev/null +++ b/docs/ja/cloud/security/_category_.yml @@ -0,0 +1,6 @@ +label: 'Cloud Security' +collapsible: true +collapsed: true +link: + type: generated-index + title: Cloud Security diff --git a/docs/ja/cloud/security/accessing-s3-data-securely.md b/docs/ja/cloud/security/accessing-s3-data-securely.md new file mode 100644 index 00000000000..501ce1ebdc1 --- /dev/null +++ b/docs/ja/cloud/security/accessing-s3-data-securely.md @@ -0,0 +1,140 @@ +--- +slug: /ja/cloud/security/secure-s3 +sidebar_label: S3データに安全にアクセスする +title: S3データに安全にアクセスする +--- + +この記事では、ClickHouse Cloudの顧客が役割ベースのアクセスを活用してAmazon Simple Storage Service (S3) に認証し、安全にデータにアクセスする方法を説明します。 + +## はじめに + +安全なS3アクセスのセットアップに進む前に、その仕組みについて理解することが重要です。以下は、ClickHouseサービスが顧客のAWSアカウント内の役割を引き受けてプライベートS3バケットにアクセスする方法の概要です。 + +![secures3](@site/docs/ja/cloud/security/images/secures3.jpg) + +このアプローチにより、顧客は全てのS3バケットへのアクセスを一か所(引き受けた役割のIAMポリシー)で管理することができ、バケットポリシーをすべて見直してアクセスを追加または削除する必要がなくなります。 + +## セットアップ + +### ClickHouseサービスのIAMロールArnを取得 + +1 - ClickHouseクラウドアカウントにログインします。 + +2 - 統合を作成したいClickHouseサービスを選択します。 + +3 - **設定** タブを選択します。 + +4 - ページの下部にある **このサービスについて** セクションまでスクロールします。 + +5 - 下に示されているように、サービスに属する **IAMロール** 値をコピーします。 + +![s3info](@site/docs/ja/cloud/security/images/secures3_arn.jpg) + +### IAM引き受けロールの設定 + +#### オプション1: CloudFormationスタックを使用してデプロイ + +1 - IAMロールの作成と管理の権限を持つIAMユーザーで、ウェブブラウザからAWSアカウントにログインします。 + +2 - [このURL](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://s3.us-east-2.amazonaws.com/clickhouse-public-resources.clickhouse.cloud/cf-templates/secure-s3.yaml&stackName=ClickHouseSecureS3) にアクセスしてCloudFormationスタックを構成します。 + +3 - ClickHouseサービスに属する **IAMロール** を入力(または貼り付け)します。 + +4 - CloudFormationスタックを設定します。以下は各パラメータについての追加情報です。 + +| パラメータ | デフォルト値 | 説明 | +| :--- | :----: | :---- | +| RoleName | ClickHouseAccess-001 | ClickHouse CloudがあなたのS3バケットにアクセスするのに使用する新しいロールの名前 | +| Role Session Name | * | Role Session Nameは、バケットをさらに保護するための共有シークレットとして使用できます。 | +| ClickHouse Instance Roles | | このSecure S3統合を使用できるClickHouseサービス IAMロールのカンマ区切りリスト。 | +| Bucket Access | Read | 提供されたバケットに対するアクセスレベルを設定します。 | +| Bucket Names | | このロールがアクセス権を持つ**バケット名**のカンマ区切りリスト。 | + +*注意*: フルバケットArnではなく、バケット名のみを入力してください。 + +5 - **AWS CloudFormationがカスタム名付きのIAMリソースを作成する可能性があります。** チェックボックスを選択します。 + +6 - 右下の **スタックを作成** ボタンをクリックします。 + +7 - CloudFormationスタックがエラーなく完了することを確認します。 + +8 - CloudFormationスタックの **Outputs** を選択します。 + +9 - この統合に必要な **RoleArn** 値をコピーします。これにより、S3バケットにアクセスできます。 + +![s3info](@site/docs/ja/cloud/security/images/secures3_output.jpg) + +#### オプション2: IAMロールを手動で作成する + +1 - IAMロールの作成と管理の権限を持つIAMユーザーで、ウェブブラウザからAWSアカウントにログインします。 + +2 - IAMサービスコンソールに移動します。 + +3 - 以下のIAMポリシーと信頼ポリシーを持つ新しいIAMロールを作成します。 + +信頼ポリシー({ClickHouse_IAM_ARN}をClickHouseインスタンスに属するIAMロールのarnに置き換えてください): + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "{ClickHouse_IAM_ARN}" + }, + "Action": "sts:AssumeRole" + } + ] +} +``` + +IAMポリシー({BUCKET_NAME}をあなたのバケット名に置き換えてください): + +``` +{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "s3:GetBucketLocation", + "s3:ListBucket" + ], + "Resource": [ + "arn:aws:s3:::{BUCKET_NAME}" + ], + "Effect": "Allow" + }, + { + "Action": [ + "s3:Get*", + "s3:List*" + ], + "Resource": [ + "arn:aws:s3:::{BUCKET_NAME}/*" + ], + "Effect": "Allow" + } + ] +} +``` + +4 - 作成後の新しい **IAMロールArn** をコピーします。これにより、S3バケットにアクセスできます。 + +## ClickHouseAccessロールでS3バケットにアクセス + +ClickHouse Cloudには、新しく作成したロールを使用して`extra_credentials`をS3テーブル関数の一部として指定できる新機能があります。以下は、新しく作成したロールを使用してクエリを実行する例です。 + +``` +describe table s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001')) +``` + +以下は、`role_session_name`を共有シークレットとして使用してバケットからデータをクエリする例です。`role_session_name`が正しくない場合、この操作は失敗します。 + +``` +describe table s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001', role_session_name = 'secret-role-name')) +``` + +:::note +データ転送料を削減するために、ソースS3がClickHouse Cloudサービスと同じ地域にあることをお勧めします。詳細については、[S3料金]( https://aws.amazon.com/s3/pricing/) を参照してください。 +::: diff --git a/docs/ja/cloud/security/audit-logging.md b/docs/ja/cloud/security/audit-logging.md new file mode 100644 index 00000000000..08caa5bbaf3 --- /dev/null +++ b/docs/ja/cloud/security/audit-logging.md @@ -0,0 +1,58 @@ +--- +sidebar_label: 監査ログ +slug: /ja/cloud/security/audit-logging +title: 監査ログ +--- + +ClickHouse Cloud では、左側のメニューにある**アクティビティ**タブを使って、あなたの ClickHouse Cloud オーガニゼーションに対してどのような変更が行われたか、誰が変更を行ったのか、いつ行われたのかを確認することができます。 + +ClickHouse Cloud 活動タブ + +
+ +**アクティビティ**ページでは、オーガニゼーションに関するイベントのリストがログに記録されたテーブルを表示します。デフォルトでは、このリストは逆時系列(最新のイベントが上部)でソートされています。テーブルの順序は、各カラムのヘッダーをクリックすることで変更できます。テーブルの各項目には以下のフィールドが含まれています: + +- **アクティビティ:** イベントを説明するテキストスニペット +- **ユーザー:** イベントを開始したユーザー +- **IP アドレス:** 該当する場合、イベントを開始したユーザーの IP アドレス +- **時間:** イベントのタイムスタンプ + +![ClickHouse Cloud アクティビティテーブル](./images/activity_log2.png) + +
+ +提供されている検索バーを使用して、サービス名や IP アドレスなどの基準に基づいてイベントを絞り込むことができます。また、この情報を CSV 形式でエクスポートして、外部ツールで配布や分析に使用することもできます。 + +
+ +![ClickHouse Cloud アクティビティ CSV エクスポート](./images/activity_log3.png) +
+ +## ログ記録されたイベントの一覧 + +オーガニゼーション用にキャプチャされたさまざまな種類のイベントは、**サービス**、**オーガニゼーション**、および **ユーザー**の3つのカテゴリにグループ化されています。ログ記録されたイベントのリストには次のものが含まれます: + +### サービス + +- サービスが作成されました +- サービスが削除されました +- サービスが停止されました +- サービスが開始されました +- サービス名が変更されました +- サービス IP アクセスリストが変更されました +- サービスのパスワードがリセットされました + +### オーガニゼーション + +- オーガニゼーションが作成されました +- オーガニゼーションが削除されました +- オーガニゼーション名が変更されました + +### ユーザー + +- ユーザーの役割が変更されました +- ユーザーがオーガニゼーションから削除されました +- ユーザーがオーガニゼーションに招待されました +- ユーザーがオーガニゼーションに参加しました +- ユーザー招待が削除されました +- ユーザーがオーガニゼーションから退出しました diff --git a/docs/ja/cloud/security/aws-privatelink.md b/docs/ja/cloud/security/aws-privatelink.md new file mode 100644 index 00000000000..721b9faccd9 --- /dev/null +++ b/docs/ja/cloud/security/aws-privatelink.md @@ -0,0 +1,416 @@ +--- +title: "AWS PrivateLink" +description: "このドキュメントは、AWS PrivateLink を使用して ClickHouse Cloud に接続する方法を説明します。" +slug: /ja/manage/security/aws-privatelink +--- + +# AWS PrivateLink + +[AWS PrivateLink](https://aws.amazon.com/privatelink/) を使用して、VPC、AWS サービス、お客様のオンプレミスシステム、および ClickHouse Cloud との間でインターネットを通さずに接続を提供することができます。このドキュメントは、AWS PrivateLink を使用して ClickHouse Cloud に接続する方法を説明します。AWS PrivateLink アドレス以外のアドレスからの ClickHouse Cloud サービスへのアクセスを無効にするには、ClickHouse Cloud の [IP アクセスリスト](https://clickhouse.com/docs/ja/cloud/security/setting-ip-filters) を使用します。 + +:::note 本番環境でのみ利用可能 +AWS PrivateLink は ClickHouse Cloud 本番サービスでのみ利用可能です。開発サービスはサポートしていません。 +::: + +AWS PrivateLink を有効にするには、以下の手順を完了してください。 +1. エンドポイントサービス名を取得します。 +2. サービスエンドポイントを作成します。 +3. エンドポイント ID を ClickHouse Cloud 組織に追加します。 +4. エンドポイント ID をサービスの許可リストに追加します。 + +AWS PrivateLink の完全な Terraform 例については、[こちら](https://github.com/ClickHouse/terraform-provider-clickhouse/tree/main/examples/PrivateLink)をご参照ください。 + +## 前提条件 + +始める前に必要なもの: + +1. AWS アカウント。 +2. プライベートリンクを作成および管理するための必要な権限を持つ API キー。 + +## 手順 + +以下の手順に従って、ClickHouse Cloud を AWS PrivateLink に接続します。 + +### エンドポイントサービス名の取得 + +#### オプション 1: ClickHouse Cloud コンソール + +ClickHouse Cloud コンソールで、PrivateLink を介して接続したいサービスを開き、**Settings** メニューを開きます。**Set up private endpoint** ボタンをクリックします。Private Link のセットアップに使用する **Service name** をコピーします。 + +![Private Endpoints](./images/aws-privatelink-pe-create.png) + +#### オプション 2: API + +コマンドを実行する前に、以下の環境変数を設定します。 + +```shell +REGION= +PROVIDER=aws +KEY_ID=<キー ID> +KEY_SECRET=<キー シークレット> +ORG_ID= +SERVICE_NAME= +``` + +リージョン、プロバイダー、およびサービス名でフィルタリングして、目的のインスタンス ID を取得します。 + +```shell +export INSTANCE_ID=$(curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services | \ +jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\" and .name==\"${SERVICE_NAME:?}\") | .id " -r) +``` + +Private Link 構成のための AWS Service Name を取得します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | \ +jq .result +``` + +このコマンドを実行すると、次のような結果が返されます。 + +```result +{ + ... + "endpointServiceId": "com.amazonaws.vpce.yy-xxxx-N.vpce-svc-xxxxxxxxxxxx", + ... +} +``` + +`endpointServiceId` をメモして、[手順 2 に進みます](#create-a-service-endpoint)。 + +### サービスエンドポイントの作成 + +次に、前のステップで取得した `endpointServiceId` を使用してサービスポイントを作成します。 + +#### オプション 1: AWS コンソール + +AWS コンソールを開き、**VPC** → **Endpoints** → **Create endpoints** に進みます。 + +**Other endpoint services** を選択し、前のステップで取得した `endpointServiceId` を使用します。完了したら、**Verify service** をクリックします。 + +![](./images/aws-privatelink-endpoint-settings.png) + +次に、VPC とサブネットを選択します。 + +![Select VPC and subnets](./images/aws-privatelink-select-vpc-and-subnets.png) + +オプションとして、セキュリティグループ/タグを割り当てます。 + +:::note ポート +セキュリティグループでポート `8443` と `9440` が許可されていることを確認してください。 +::: + +VPC エンドポイントを作成した後、`Endpoint ID` の値をメモしてください。これは次のステップで必要になります。 + +![VPC endpoint ID](@site/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png) + +#### オプション 2: AWS CloudFormation + +正しいサブネット ID、セキュリティグループ、および VPC ID を使用するようにしてください。 + +```response +Resources: + ClickHouseInterfaceEndpoint: + Type: 'AWS::EC2::VPCEndpoint' + Properties: + VpcEndpointType: Interface + PrivateDnsEnabled: false + ServiceName: + VpcId: vpc-vpc_id + SubnetIds: + - subnet-subnet_id1 + - subnet-subnet_id2 + - subnet-subnet_id3 + SecurityGroupIds: + - sg-security_group_id1 + - sg-security_group_id2 + - sg-security_group_id3 +``` + +#### オプション 3: Terraform + +```json +resource "aws_vpc_endpoint" "this" { + vpc_id = var.vpc_id + service_name = "" + vpc_endpoint_type = "Interface" + security_group_ids = [ + var.security_group_id1,var.security_group_id2, var.security_group_id3, + ] + subnet_ids = [var.subnet_id1,var.subnet_id2,var.subnet_id3] + private_dns_enabled = false +} +``` + +#### エンドポイントのプライベート DNS 名を変更する + +このステップでは、プライベート DNS ゾーン `.vpce.aws.clickhouse.cloud` の構成を AWS VPC に注入します。 + +:::note DNS リゾルバー +独自の DNS リゾルバーを使用している場合は、`.vpce.aws.clickhouse.cloud` の DNS ゾーンを作成し、ワイルドカードレコード `*..vpce.aws.clickhouse.cloud` をエンドポイント ID IP アドレスにポイントします。 +::: + +#### オプション 1: AWS コンソール + +**VPC Endpoints** に移動して、VPC エンドポイントを右クリックし、**Modify private DNS name** を選択します。 + +![Endpoints menu](@site/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png) + +開いたページで、**Enable private DNS names** を選択します。 + +![Modify DNS names](@site/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png) + +#### オプション 2: AWS CloudFormation + +`CloudFormation` テンプレートを更新し、`PrivateDnsEnabled` を `true` に設定します。 + +```json +PrivateDnsEnabled: true +``` + +変更を適用します。 + +#### オプション 3: Terraform + +- Terraform コード内の `aws_vpc_endpoint` リソースを変更し、`private_dns_enabled` を `true` に設定します。 + +```json +private_dns_enabled = true +``` + +変更を適用します。 + +### エンドポイント ID を ClickHouse Cloud 組織に追加 + +#### オプション 1: ClickHouse Cloud コンソール + +組織にエンドポイントを追加するには、[サービスの許可リストにエンドポイント ID を追加](#add-endpoint-id-to-services-allow-list)のステップに進んでください。ClickHouse Cloud コンソールでサービス許可リストに `Endpoint ID` を追加すると、自動的に組織にも追加されます。 + +エンドポイントを削除するには、**Organization details -> Private Endpoints** を開き、削除ボタンをクリックしてエンドポイントを削除します。 + +![endpoints](./images/pe-remove-private-endpoint.png) + +#### オプション 2: API + +コマンドを実行する前に、以下の環境変数を設定します。 + +```bash +PROVIDER=aws +KEY_ID=<キー ID> +KEY_SECRET=<キー シークレット> +ORG_ID= +ENDPOINT_ID=<前のステップからのエンドポイント ID> +REGION=<リージョンコード, AWS フォーマットを使用してください> +``` + +前のステップからのデータを使用して `VPC_ENDPOINT` 環境変数を設定します。 + +エンドポイントを追加するには、次のコマンドを実行します。 + +```bash +cat < +KEY_SECRET=<キー シークレット> +ORG_ID= +ENDPOINT_ID=<前のステップからのエンドポイント ID> +INSTANCE_ID=<インスタンス ID> +``` + +許可リストにエンドポイント ID を追加するには: + +```bash +cat < +KEY_SECRET=<キー シークレット> +ORG_ID= +INSTANCE_ID=<インスタンス ID> +``` + +次のコマンドを実行します: + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | \ +jq .result +``` + +これは次のような出力を返します: + +```result +{ + "endpointServiceId": "com.amazonaws.vpce.yy-xxxx-N.vpce-svc-xxxxxxxxxxxx", + "privateDnsHostname": "xxxxxxx.yy-xxxx-N.vpce.aws.clickhouse.cloud" +} +``` + +この例では、ホスト名 `xxxxxxx.yy-xxxx-N.vpce.aws.clickhouse.cloud` への接続は PrivateLink へルーティングされますが、`xxxxxxx.yy-xxxx-N.aws.clickhouse.cloud` はインターネットを経由してルーティングされます。 + +## トラブルシューティング + +### 1 つのリージョンに複数の PrivateLink + +同じ AWS リージョン内で 2 つ以上の AWS Private Link を必要とする場合、次の点に注意してください:ClickHouse では、リージョンレベルで VPC エンドポイントサービスを提供しています。1 つの VPC に 2 つ以上の VPC エンドポイントをセットアップすると、AWS VPC の観点からは、1 つの AWS Private Link を使用していることになります。同じリージョン内で 2 つ以上の AWS Private Link を構成する必要がある場合は、1 つの VPC に 1 つの VPC エンドポイントを作成し、ClickHouse に依頼して同じ VPC エンドポイント ID を同じ AWS リージョン内のすべての ClickHouse サービスに設定してください。 + +### プライベートエンドポイントへの接続がタイムアウトする + +- VPC エンドポイントにセキュリティグループをアタッチしてください。 +- エンドポイントにアタッチされたセキュリティグループの `インバウンド` ルールを確認し、ClickHouse のポートを許可してください。 +- 接続テストに使用した VM にアタッチされたセキュリティグループの `アウトバウンド` ルールを確認し、ClickHouse のポートへの接続を許可してください。 + +### プライベートホスト名: ホストのアドレスが見つからない + +- "Private DNS names" オプションが有効になっていることを確認してください。詳細は[ステップ](#modify-private-dns-name-for-endpoint)をご確認ください。 + +### ピアによる接続のリセット + +- エンドポイント ID がサービス許可リストに追加されていない可能性があります。[ステップ](#add-endpoint-id-to-services-allow-list)をご確認ください。 + +### エンドポイントフィルターの確認 + +コマンドを実行する前に、以下の環境変数を設定します。 + +```bash +KEY_ID=<キー ID> +KEY_SECRET=<キー シークレット> +ORG_ID= +INSTANCE_ID=<インスタンス ID> +``` + +次のコマンドを実行します: + +```shell +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} \ +-X GET -H "Content-Type: application/json" \ +https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?} | \ +jq .result.privateEndpointIds +``` + +### リモートデータベースへの接続 + +仮に、ClickHouse Cloud で [MySQL](../../sql-reference/table-functions/mysql.md) や [PostgreSQL](../../sql-reference/table-functions/postgresql.md) テーブル関数を使用して、Amazon Web Services (AWS) VPC にホストされているデータベースに接続しようとしているとします。この接続を安全に有効にするために AWS PrivateLink を使用することはできません。PrivateLink は片方向、一方向の接続です。内部ネットワークまたは Amazon VPC が安全に ClickHouse Cloud に接続することはできますが、ClickHouse Cloud から内部ネットワークに接続することはできません。 + +[AWS PrivateLink ドキュメント](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/aws-privatelink.html)によると: + +> AWS PrivateLink を使用して、クライアント/サーバー設定で、消費者 VPC がプロバイダー VPC にある特定のサービスまたは一連のインスタンスに一方向のアクセスを許可したい場合に使用します。消費者 VPC のクライアントだけが、サービスプロバイダー VPC のサービスに接続を開始できます。 + +これを実現するために、ClickHouse Cloud から内部/プライベートなデータベースサービスへの接続を許可するように AWS セキュリティグループを設定してください。ClickHouse Cloud のリージョンにおける[デフォルトの送信元 IP アドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api)と、[利用可能な静的 IP アドレス](https://api.clickhouse.cloud/static-ips.json)を確認してください。 diff --git a/docs/ja/cloud/security/azure-privatelink.md b/docs/ja/cloud/security/azure-privatelink.md new file mode 100644 index 00000000000..a801e3ea027 --- /dev/null +++ b/docs/ja/cloud/security/azure-privatelink.md @@ -0,0 +1,527 @@ +--- +title: Azure Private Link +sidebar_label: Azure Private Link +slug: /ja/cloud/security/azure-privatelink +description: How to set up Azure Private Link +keywords: [azure, private link, privatelink] +--- + +# Azure Private Link + +:::note +Azure Private LinkはClickHouse Cloudの**Production**サービスでのみ有効にできます。**Development**サービスはサポートされていません。 +::: + +このガイドは、Azure Private Linkを使用して、Azure(顧客所有およびMicrosoftパートナーサービスを含む)とClickHouse Cloudの間に仮想ネットワークを介したプライベート接続を提供する方法を示しています。Azure Private Linkはネットワークアーキテクチャを簡素化し、Azure内のエンドポイント間のデータの公開インターネットへの露出を排除することで接続を保護します。 + +![Overview of PrivateLink](@site/docs/ja/cloud/security/images/azure-pe.png) + +AWSやGCPとは異なり、AzureはPrivate Linkを介したクロスリージョン接続をサポートしています。これにより、複数のリージョンにデプロイされたClickHouseサービス間での接続を確立することができます。 + +:::note +リージョン間トラフィックには追加料金がかかる場合があります。最新のAzureドキュメントをご確認ください。 +::: + +Azure Private Linkを有効にするには、以下の手順を完了してください。 + +1. Private LinkのためのAzure接続エイリアスを取得する +1. Azureでプライベートエンドポイントを作成する +1. ClickHouse Cloud組織にプライベートエンドポイントGUIDを追加する +1. サービスの許可リストにプライベートエンドポイントGUIDを追加する +1. Private Linkを使用してClickHouse Cloudサービスにアクセスする + +Azure Private Linkの完全なTerraform例は[こちら](https://github.com/ClickHouse/terraform-provider-clickhouse/tree/main/examples/PrivateLinkAzure)をご覧ください。 + +## Private Link用のAzure接続エイリアスを取得する + +### オプション 1: ClickHouse Cloudコンソール + +ClickHouse Cloudコンソールで、PrivateLink経由で接続したいサービスを開き、**Settings**メニューを開きます。**Set up private endpoint**ボタンをクリックします。このステップで設定するために使用する**Service name**をコピーします。 + +![Private Endpoints](./images/azure-privatelink-pe-create.png) + +### オプション 2: API + +開始する前に、ClickHouse Cloud APIキーが必要です。[新しいキーを作成](https://clickhouse.com/docs/ja/cloud/manage/openapi)するか、既存のキーを使用してください。Private Link構成を管理するには**Admin**キーが必要になります。 + +APIキーを入手したら、コマンドを実行する前に次の環境変数を設定してください。 + +```bash +REGION= +PROVIDER=azure +KEY_ID= +KEY_SECRET= +ORG_ID= +``` + +リージョンからインスタンスIDを取得します。 + +指定されたリージョンに少なくとも1つのClickHouse Cloudサービスがデプロイされている必要があります。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services | jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\") | .id " -r | head -1 | tee instance_id +``` + +前のステップで受け取ったIDを使用して`INSTANCE_ID`環境変数を作成します。 + +```bash +INSTANCE_ID=$(cat instance_id) +``` + +Azure接続エイリアスとPrivate DNSホスト名を取得します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | jq .result +{ + "endpointServiceId": "production-westus3-0-0.63c890a9-4d32-48cc-a08c-8cd92dfb1ad3.westus3.azure.privatelinkservice", + ... +} +``` + +`endpointServiceId`をメモしておいてください。次のステップで使用します。 + +## Azureでプライベートエンドポイントを作成する {#create-private-endpoint-in-azure} + +このセクションでは、Azureでプライベートエンドポイントを作成します。AzureポータルまたはTerraformのいずれかを使用できます。 + +### オプション 1: Azure Portalを使用してAzureでプライベートエンドポイントを作成 + +Azureポータルで、**Private Link Center → Private Endpoints**を開きます。 + +![Open Azure Private Center](@site/docs/ja/cloud/security/images/azure-private-link-center.png) + +**Create**ボタンをクリックしてプライベートエンドポイント作成ダイアログを開きます。 + +![Create PE](@site/docs/ja/cloud/security/images/azure-private-link-center.png) + +--- + +次の画面で、次のオプションを指定します。 + +- **Subscription** / **Resource Group**: プライベートエンドポイント用にAzureサブスクリプションとリソースグループを選択してください。 +- **Name**: **Private Endpoint**の名前を設定します。 +- **Region**: Private Linkを介してClickHouse Cloudと接続するVNETがデプロイされているリージョンを選択します。 + +上記のステップを完了したら、**Next: Resource**ボタンをクリックします。 + +![Create PE](@site/docs/ja/cloud/security/images/azure-pe-create-basic.png) + +--- + +**Connect to an Azure resource by resource ID or alias**オプションを選択します。 + +**Resource ID or alias**として、[Private Link用のAzure接続エイリアスを取得](#obtain-azure-connection-alias-for-private-link)ステップで取得した**endpointServiceId**を使用します。 + +**Next: Virtual Network**ボタンをクリックします。 + +![PE resource](@site/docs/ja/cloud/security/images/azure-pe-resource.png) + +--- + +- **Virtual network**: Private Linkを使用してClickHouse Cloudと接続したいVNETを選択します。 +- **Subnet**: プライベートエンドポイントが作成されるサブネットを選択します。 + +オプション: + +- **Application security group**: ASGをプライベートエンドポイントにアタッチし、ネットワークセキュリティグループでプライベートエンドポイントへの/からのネットワークトラフィックをフィルタリングするために使用できます。 + +**Next: DNS**ボタンをクリックします。 + +![PE network](@site/docs/ja/cloud/security/images/azure-pe-create-vnet.png) + +**Next: Tags**ボタンをクリックします。 + +--- + +![PE DNS](@site/docs/ja/cloud/security/images/azure-pe-create-dns.png) + +タグをプライベートエンドポイントにアタッチすることができます(任意)。 + +**Next: Review + create**ボタンをクリックします。 + +--- + +![PE tags](@site/docs/ja/cloud/security/images/azure-pe-create-tags.png) + +最後に、**Create**ボタンをクリックします。 + +![PE review](@site/docs/ja/cloud/security/images/azure-pe-create-review.png) + +作成されたプライベートエンドポイントの**Connection status**は**Pending**状態になります。このプライベートエンドポイントをサービス許可リストに追加すると**Approved**状態に変更されます。 + +プライベートエンドポイントに関連したネットワークインターフェースを開き、次のステップで必要になる**Private IPv4 address**(この例では10.0.0.4)をコピーします。 + +![PE IP address](@site/docs/ja/cloud/security/images/azure-pe-ip.png) + +### オプション 2: Terraformを使用してAzureでプライベートエンドポイントを作成する + +Terraformを使用してプライベートエンドポイントを作成するための以下のテンプレートを使用します。 + +```json +resource "azurerm_private_endpoint" "example_clickhouse_cloud" { + name = var.pe_name + location = var.pe_location + resource_group_name = var.pe_resource_group_name + subnet_id = var.pe_subnet_id + + private_service_connection { + name = "test-pl" + private_connection_resource_alias = "" + is_manual_connection = true + } +} +``` + +### プライベートエンドポイントresourceGuidの取得 {#obtaining-private-endpoint-resourceguid} + +Private Linkを使用するためには、プライベートエンドポイント接続GUIDをサービス許可リストに追加する必要があります。 + +プライベートエンドポイントリソースGUIDはAzureポータルでのみ表示されます。前のステップで作成したプライベートエンドポイントを開き、**JSON View**をクリックします。 + +![PE GUID](@site/docs/ja/cloud/security/images/azure-pe-view.png) + +`resourceGuid`フィールドを見つけ、この値をコピーします。 + +![PE GUID](@site/docs/ja/cloud/security/images/azure-pe-resource-guid.png) + +## Private LinkのためのDNSの設定 + +Private Linkを介してリソースにアクセスするために、プライベートDNSゾーン (`${location_code}.privatelink.azure.clickhouse.cloud`) を作成し、それをVNETにアタッチする必要があります。 + +### Private DNSゾーンを作成 + +**オプション 1: Azureポータルを使用** + +[Azure Portalを使用してAzureプライベートDNSゾーンを作成する](https://learn.microsoft.com/en-us/azure/dns/private-dns-getstarted-portal)ためのガイドに従ってください。 + +**オプション 2: Terraformを使用** + +Private DNSゾーンを作成するための以下のTerraformテンプレートを使用します。 + +```json +resource "azurerm_private_dns_zone" "clickhouse_cloud_private_link_zone" { + name = "${var.location}.privatelink.azure.clickhouse.cloud" + resource_group_name = var.resource_group_name +} +``` + +### ワイルドカードDNSレコードを作成 + +ワイルドカードレコードを作成し、プライベートエンドポイントにポイントします。 + +**オプション 1: Azureポータルを使用** + +1. MyAzureResourceGroupリソースグループを開き、`${region_code}.privatelink.azure.clickhouse.cloud`プライベートゾーンを選択します。 +2. **+ Record set**を選択します。 +3. **Name**に`*`を入力します。 +4. **IP Address**にプライベートエンドポイントのIPアドレスを入力します。 +5. **OK**を選択します。 + +![PE review](@site/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png) + +**オプション 2: Terraformを使用** + +ワイルドカードDNSレコードを作成するための以下のTerraformテンプレートを使用します。 + +```json +resource "azurerm_private_dns_a_record" "example" { + name = "*" + zone_name = var.zone_name + resource_group_name = var.resource_group_name + ttl = 300 + records = ["10.0.0.4"] +} +``` + +### 仮想ネットワークリンクを作成 + +プライベートDNSゾーンを仮想ネットワークにリンクするために、仮想ネットワークリンクを作成する必要があります。 + +**オプション 1: Azureポータルを使用** + +[プライベートDNSゾーンに仮想ネットワークをリンクする](https://learn.microsoft.com/en-us/azure/dns/private-dns-getstarted-portal#link-the-virtual-network)ためのガイドに従ってください。 + +**オプション 2: Terraformを使用** + +仮想ネットワークをプライベートDNSゾーンにリンクするための以下のTerraformテンプレートを使用します。 + +```json +resource "azurerm_private_dns_zone_virtual_network_link" "example" { + name = "test" + resource_group_name = var.resource_group_name + private_dns_zone_name = var.zone_name + virtual_network_id = var.virtual_network_id +} +``` + +### DNS設定の検証 + +westus3.privatelink.azure.clickhouse.cloudドメイン内の任意のレコードはプライベートエンドポイントIPにポイントされるべきです(この例では10.0.0.4)。 + +```bash +nslookup instance-id.westus3.privatelink.azure.clickhouse.cloud. +Server: 127.0.0.53 +Address: 127.0.0.53#53 + +Non-authoritative answer: +Name: instance-id.westus3.privatelink.azure.clickhouse.cloud +Address: 10.0.0.4 +``` + +## ClickHouse Cloud組織にプライベートエンドポイントGUIDを追加する + +### オプション 1: ClickHouse Cloudコンソール + +組織にエンドポイントを追加するには、[Add the Private Endpoint GUID to your service(s) allow list](#add-private-endpoint-guid-to-services-allow-list)ステップに進んでください。ClickHouse Cloudコンソールを使用してサービス許可リストに`Private Endpoint GUID`を追加すると、それが組織にも自動的に追加されます。 + +エンドポイントを削除するには、**Organization details -> Private Endpoints**を開き、削除ボタンをクリックしてエンドポイントを削除します。 + +![endpoints](./images/azure-pe-remove-private-endpoint.png) + +### オプション 2: API + +コマンドを実行する前に次の環境変数を設定してください。 + +```bash +PROVIDER=azure +KEY_ID= +KEY_SECRET= +ORG_ID= +ENDPOINT_ID= +REGION= +``` + +[プライベートエンドポイントresourceGuidの取得](#obtaining-private-endpoint-resourceguid)ステップからのデータを使用して`VPC_ENDPOINT`環境変数を設定します。 + +プライベートエンドポイントを追加するために次のコマンドを実行します。 + +```bash +cat < +KEY_SECRET= +ORG_ID= +ENDPOINT_ID= +INSTANCE_ID= +``` + +プライベートリンクを使用して利用可能にしたい各サービスで実行します。 + +サービス許可リストにプライベートエンドポイントを追加するために次のコマンドを実行します。 + +```bash +cat < +KEY_SECRET= +ORG_ID= +INSTANCE_ID= +``` + +次のコマンドを実行します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig | jq .result +``` + +次のような応答を受けるはずです。 + +```response +{ + ... + "privateDnsHostname": "xxxxxxx..privatelink.azure.clickhouse.cloud" +} +``` + +この例では、`xxxxxxx.region_code.privatelink.azure.clickhouse.cloud`ホスト名への接続はPrivate Linkにルーティングされます。一方、`xxxxxxx.region_code.azure.clickhouse.cloud`はインターネットを介してルーティングされます。 + +`privateDnsHostname`を使用して、プライベートリンクを介してClickHouse Cloudサービスに接続します。 + +## トラブルシューティング + +### DNS設定のテスト + +`${region_code}.privatelink.azure.clickhouse.cloud.`ゾーン内のすべてのDNSレコードは[Azureでプライベートエンドポイントを作成](#create-private-endpoint-in-azure)ステップからの内部IPアドレスにポイントされる必要があります。この例では、リージョンは`westus3`です。 + +次のコマンドを実行します。 + +```bash +nslookup abcd.westus3.privatelink.azure.clickhouse.cloud. +``` + +次のような応答を受けるはずです。 + +```response +Non-authoritative answer: +Name: abcd.westus3.privatelink.azure.clickhouse.cloud +Address: 10.0.0.4 +``` + +### ピアによる接続リセット + +おそらく、プライベートエンドポイントGUIDがサービス許可リストに追加されていません。[サービスの許可リストにプライベートエンドポイントGUIDを追加する](#add-private-endpoint-guid-to-services-allow-list)ステップに再度取り組んでください。 + +### プライベートエンドポイントがPending状態 + +おそらく、プライベートエンドポイントGUIDがサービス許可リストに追加されていません。[サービスの許可リストにプライベートエンドポイントGUIDを追加する](#add-private-endpoint-guid-to-services-allow-list)ステップに再度取り組んでください。 + +### 接続のテスト + +Private Link経由で接続に問題がある場合は、`openssl`を使用して接続を確認します。Private Linkエンドポイントのステータスが`Accepted`であることを確認してください。 + +OpenSSLは接続可能であるはずです(出力にCONNECTEDが表示されます)。`errno=104`は予期されたものです。 + +```bash +openssl s_client -connect abcd.westus3.privatelink.azure.clickhouse.cloud.cloud:9440 +``` + +```response +# highlight-next-line +CONNECTED(00000003) +write:errno=104 +--- +no peer certificate available +--- +No client certificate CA names sent +--- +SSL handshake has read 0 bytes and written 335 bytes +Verification: OK +--- +New, (NONE), Cipher is (NONE) +Secure Renegotiation IS NOT supported +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +``` + +### プライベートエンドポイントフィルターの確認 + +コマンドを実行する前に次の環境変数を設定してください。 + +```bash +KEY_ID= +KEY_SECRET= +ORG_ID= +INSTANCE_ID= +``` + +プライベートエンドポイントフィルターを確認するために次のコマンドを実行します。 + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X GET -H "Content-Type: application/json" https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?} | jq .result.privateEndpointIds +[] +``` + +## 詳細情報 + +Azure Private Linkの詳細については、[azure.microsoft.com/en-us/products/private-link](https://azure.microsoft.com/en-us/products/private-link)をご覧ください。 diff --git a/docs/ja/cloud/security/cloud-access-management.md b/docs/ja/cloud/security/cloud-access-management.md new file mode 100644 index 00000000000..6571d2bfb48 --- /dev/null +++ b/docs/ja/cloud/security/cloud-access-management.md @@ -0,0 +1,140 @@ +--- +sidebar_label: 概要 +slug: /ja/cloud/security/cloud-access-management +title: クラウドアクセス管理 +--- + +# ClickHouse Cloudのアクセス制御 +ClickHouseはユーザーアクセスをコンソールとデータベースの2つの場所で制御します。コンソールアクセスはclickhouse.cloudのユーザーインターフェースを介して管理されます。データベースアクセスはデータベースのユーザーアカウントとロールを通じて管理されます。さらに、コンソールユーザーはSQLコンソールを介してデータベースとやり取りできるように、データベース内のロールを付与されることがあります。 + +## ロールの種類 +利用可能なロールの種類は次のとおりです: +- **コンソールロール** clickhouse.cloudコンソールへのアクセスを可能にします +- **データベースロール** 単一のサービス内の権限管理を可能にします +- **SQLコンソールロール** コンソールユーザーがSQLコンソールを介して割り当てられた権限でデータベースにアクセスできるようにする特別に名付けられたデータベースロール。 + +## 定義済みのロール +ClickHouse Cloudは、アクセス管理を可能にするための限られた数の定義済みロールを提供します。追加のカスタムデータベースロールは、データベース内で[CREATE ROLE](/ja/sql-reference/statements/create/role)および[GRANT](/ja/sql-reference/statements/grant)コマンドを使用していつでも作成できます。 + +| コンテキスト | ロール名 | 説明 | +|--------------|-----------------------|------------------------------------------------------------------------------------| +| コンソール | Admin | ClickHouse組織への完全アクセス | +| コンソール | Developer | ClickHouse組織への読み取り専用アクセス | +| SQLコンソール | sql_console_admin | データベースへの管理者アクセス | +| SQLコンソール | sql_console_read_only | データベースへの読み取り専用アクセス | +| データベース | default | データベースへの管理者アクセス。サービス作成時に`default`ユーザーに自動的に付与される | + +## 初期設定 +ClickHouse Cloudアカウントを最初に設定したユーザーは、コンソール内で自動的にAdminロールが割り当てられます。このユーザーは、他のユーザーを組織に招待し、AdminまたはDeveloperロールをユーザーに割り当てることができます。 + +:::note +コンソール内でユーザーのロールを変更するには、左側のユーザーメニューに移動し、ドロップダウンでユーザーのロールを変更してください。 +::: + +データベースには、自動的に追加され、サービス作成時にdefault_roleが付与された`default`というアカウントがあります。サービスが作成されたときに、このアカウントのランダムに生成されたパスワードが使用されたユーザーに表示されます。初期設定後はパスワードは表示されませんが、コンソール内で管理者権限を持つユーザーが後で変更することができます。このアカウントまたはコンソール内で管理者権限を持つアカウントは、いつでも追加のデータベースユーザーとロールを設定することができます。 + +:::note +コンソール内で`default`アカウントに割り当てられたパスワードを変更するには、左側のサービスメニューに移動してサービスにアクセスし、設定タブに移動してパスワードのリセットボタンをクリックしてください。 +::: + +新しいユーザーアカウントを作成し、そのユーザーにdefault_roleを付与することをお勧めします。これは、ユーザーが行った操作が彼らのユーザーIDに関連付けられ、`default`アカウントが緊急時対応操作用に予約されるためです。 + +``` +CREATE USER userID IDENTIFIED WITH sha256_hash by 'hashed_password'; +GRANT default_role to userID; +``` + +ユーザーはSHA256ハッシュジェネレーターまたはPythonのhashlibのようなコード関数を使用して、適切な複雑性を持つ12文字以上のパスワードをSHA256文字列に変換し、システム管理者に提供できます。これにより、管理者がクリアテキストのパスワードを見たり扱ったりすることがなくなります。 + +## コンソールロール +コンソールユーザーにはロールが割り当てられ、AdminまたはDeveloperロールを割り当てることができます。各ロールに関連付けられた権限は以下に含まれています。 + +| コンポーネント | 機能 | Admin | Developer | +|-----------------------------------|-----------------------------|--------|-----------| +| サービスの管理 | サービスを見る | ✅ | ✅ | +| | サービスを作成する | ✅ | ❌ | +| | サービスを削除する | ✅ | ❌ | +| | サービスを停止する | ✅ | ❌ | +| | サービスを再起動する | ✅ | ❌ | +| | サービスパスワードのリセット | ✅ | ❌ | +| | サービスメトリクスを表示 | ✅ | ✅ | +| クラウドAPI | APIキーの記録を見る | ✅ | ✅ | +| | APIキーを作成する | ✅ | Read-Only | +| | APIキーを削除する | ✅ | 自分のキー| +| コンソールユーザーの管理 | ユーザーを見る | ✅ | ✅ | +| | ユーザーを招待する | ✅ | ❌ | +| | ユーザーロールを変更する | ✅ | ❌ | +| | ユーザーを削除する | ✅ | ❌ | +| 請求、組織、サポート | 請求を見る | ✅ | ✅ | +| | 請求を管理する | ✅ | ❌ | +| | 組織活動を見る | ✅ | ❌ | +| | サポートリクエストを提出する| ✅ | ✅ | +| | 統合を見る | ✅ | ✅ | + +## SQLコンソールロール +私たちのコンソールには、パスワード無しの認証でデータベースとやり取りするためのSQLコンソールが含まれています。コンソールで管理者権限が付与されたユーザーは、組織内のすべてのデータベースに対する管理アクセス権を持っています。Developerロールが与えられたユーザーにはデフォルトでアクセス権がありませんが、コンソールから“フルアクセス”または“読み取り専用”のデータベース権限が割り当てられる場合があります。“読み取り専用”ロールは最初に読み取り専用アクセスをアカウントに付与します。しかし、読み取り専用アクセスが付与された後、特定のSQLコンソールユーザーのために新しいカスタムロールを作成し、そのユーザーがSQLコンソールを介してデータベースに接続する際に使用されるようにそのユーザーに関連付けることができます。 + +:::note +コンソール内のDeveloperロールを持つユーザーがSQLコンソールにアクセスできるようにするには、左側のサービスメニューに移動し、サービスにアクセスして設定をクリックし、SQLコンソールアクセスセクションまでスクロールし、“フルアクセス”または“読み取り専用”を選択します。アクセス権が付与されたら、以下の***SQLコンソールロールの作成***で示されているプロセスを使用してカスタムロールを割り当ててください。 +::: + +### パスワードレス認証について +SQLコンソールユーザーは各セッションごとに作成され、自動でローテーションされるX.509証明書を使用して認証されます。セッションが終了するとユーザーは削除されます。監査のためにアクセスリストを生成する場合は、コンソールのサービスの設定タブに移動して、SQLコンソールアクセスとデータベース内に存在するデータベースユーザーを確認してください。カスタムロールが構成されている場合、ユーザーのアクセスはユーザーのユーザー名で終わるロールにリストされます。 + +## SQLコンソールロールの作成 +SQLコンソールユーザーに関連付けられたカスタムロールを作成することができます。SQLコンソールはユーザーが新しいセッションを開くたびに新しいユーザーアカウントを作成するため、システムはロール名の命名規則を使用してカスタムデータベースロールをそのユーザーに関連付けます。これにより、それぞれのユーザーに個別のロールが割り当てられます。個別のロールは、GRANT文を通じて直接アクセス権を割り当てることができるか、一般的な新しいロール(例えばdatabase_developerやsecurity_administrator)を確立し、個別のユーザーロールにその一般的なロールを通じてアクセス権を与えることができます。 + +SQLコンソールユーザー用のカスタムロールを作成し、一般的なロールを付与するには、次のコマンドを実行します。メールアドレスはコンソール内のユーザーのメールアドレスと一致している必要があります。 +1. database_developerロールを作成し、SHOW、CREATE、ALTER、およびDELETE権限を付与します。 + +``` +CREATE ROLE OR REPLACE database_developer; +GRANT SHOW ON * TO database_developer; +GRANT CREATE ON * TO database_developer; +GRANT ALTER ON * TO database_developer; +GRANT DELETE ON * TO database_developer; +``` + +2. SQLコンソールユーザーmy.user@domain.comのためのロールを作成し、database_developerロールをそのロールに割り当てます。 + +``` +CREATE ROLE OR REPLACE `sql-console-role:my.user@domain.com`; +GRANT database_developer TO `sql-console-role:my.user@domain.com`; +``` + +このロールの構成を使用すると、ユーザーが存在しない場合にユーザーアクセスを表示するクエリは、ロール対ロールの付与を含めるために修正される必要があります。 + +``` +SELECT grants.user_name, + grants.role_name, + users.name AS role_member, + grants.access_type, + grants.database, + grants.table +FROM system.grants LEFT OUTER JOIN system.role_grants ON grants.role_name = role_grants.granted_role_name + LEFT OUTER JOIN system.users ON role_grants.user_name = users.name + +UNION ALL + +SELECT grants.user_name, + grants.role_name, + role_grants.role_name AS role_member, + grants.access_type, + grants.database, + grants.table +FROM system.role_grants LEFT OUTER JOIN system.grants ON role_grants.granted_role_name = grants.role_name +WHERE role_grants.user_name is null; +``` + +## データベースロール +ユーザーとカスタムロールは、CREATE User, CREATE Role, GRANTステートメントを使用してデータベース内で直接作成することもできます。SQLコンソール用に作成されたロールを除き、これらのユーザーとロールはコンソールユーザーとロールとは独立しています。 + +データベースロールは加算的です。これはつまり、ユーザーが2つのロールのメンバーである場合、ユーザーはその2つのロールに付与された最も多いアクセス権を持っていることになります。ロールを追加することでアクセス権が失われることはありません。 + +データベースロールは他のロールに付与することができ、階層構造が可能です。ロールは、メンバーであるロールのすべての権限を継承します。 + +データベースロールはサービスごとにユニークであり、同じサービス内の複数のデータベースに適用することができます。 + +以下の図は、ユーザーに権限が付与される可能性のある異なる方法を示しています。 + +![Screenshot 2024-01-18 at 5 14 41 PM](https://github.com/ClickHouse/clickhouse-docs/assets/110556185/94b45f98-48cc-4907-87d8-5eff1ac468e5) diff --git a/docs/ja/cloud/security/cloud-authentication.md b/docs/ja/cloud/security/cloud-authentication.md new file mode 100644 index 00000000000..11296d435ed --- /dev/null +++ b/docs/ja/cloud/security/cloud-authentication.md @@ -0,0 +1,122 @@ +--- +sidebar_label: クラウド認証 +slug: /ja/cloud/security/cloud-authentication +title: クラウド認証 +--- +# クラウド認証 + +ClickHouse Cloudは、認証方法をいくつか提供しています。このガイドでは、認証を構成するための良いプラクティスを説明します。認証方法を選択する際は、必ずセキュリティチームに確認してください。 + +## パスワード設定 + +コンソールとサービス(データベース)の最小パスワード設定は、現在 [NIST 800-63B](https://pages.nist.gov/800-63-3/sp800-63b.html#sec4) 認証器保証レベル1に準拠しています。 +- 最小12文字 +- 次の4項目のうち、3項目を含む: + - 1つの大文字 + - 1つの小文字 + - 1つの数字 + - 1つの特殊文字 + +## メール + パスワード + +ClickHouse Cloudでは、メールアドレスとパスワードで認証することができます。この方法を使用する際、ClickHouseアカウントを保護する最良の方法は強力なパスワードを使用することです。覚えやすいパスワードを考えるためのオンラインリソースはいくつもあります。また、ランダムなパスワード生成器を使用し、パスワードマネージャーにパスワードを保管することでセキュリティを強化できます。 + +## GoogleまたはMicrosoftのソーシャル認証を使用したSSO + +あなたの会社がGoogle WorkspaceまたはMicrosoft 365を使用している場合、現在のシングルサインオン(SSO)のセットアップをClickHouse Cloud内で利用できます。このためには、単に会社のメールアドレスでサインアップし、そのメールアドレスを使用して他のユーザーを招待します。その結果、ユーザーは、ClickHouse Cloudに認証する前に、会社のログインフロー(IDプロバイダー経由または直接GoogleまたはMicrosoft認証を通じて)を使用してログインする必要があります。 + +## 多要素認証 + +メール+パスワードまたはソーシャル認証を持つユーザーは、多要素認証(MFA)を使用して、アカウントの安全性をさらに高めることができます。MFAを設定するには: +1. console.clickhouse.cloudにログイン +2. ClickHouseロゴの隣にある左上のイニシャルをクリック +3. プロフィールを選択 +4. 左側のセキュリティを選択 +5. 認証アプリタイルの「セットアップ」をクリック +6. Authy、1Password、またはGoogle Authenticatorなどの認証アプリを使用してQRコードをスキャン +7. コードを入力して確認 +8. 次の画面で復旧コードをコピーし、安全な場所に保存 +9. `私はこのコードを安全に記録しました`のチェックボックスをオン +10. 続行をクリック + +## アカウントリカバリー + +
+ 復旧コードを取得 + + 以前にMFAに登録し、復旧コードを作成していないか紛失した場合は、新しい復旧コードを取得するために以下の手順に従ってください。 + 1. https://console.clickhouse.cloudにアクセス + 2. 資格情報とMFAでサインイン + 3. 左上のプロフィールに移動 + 4. 左側のセキュリティをクリック + 5. 認証アプリの横にあるゴミ箱をクリック + 6. 認証アプリを削除 + 7. コードを入力して続行をクリック + 8. 認証アプリセクションでセットアップをクリック + 9. QRコードをスキャンして新しいコードを入力 + 10. 復旧コードをコピーして安全な場所に保存 + 11. `私はこのコードを安全に記録しました`のチェックボックスをオン + 12. 続行をクリック + +
+
+ パスワードを忘れた場合 + + パスワードを忘れた場合、自分で回復するための手順は以下の通りです: + 1. https://console.clickhouse.cloudにアクセス + 2. メールアドレスを入力して続行をクリック + 3. パスワードをお忘れですか?をクリック + 4. パスワードリセットリンクを送信をクリック + 5. メールをチェックして、メールからパスワードをリセットをクリック + 6. 新しいパスワードを入力し、パスワードを確認して、パスワードの更新をクリック + 7. サインインに戻るをクリック + 8. 新しいパスワードで通常通りサインイン + +
+
+ MFAデバイスまたはトークンを紛失した場合 + + MFAデバイスを紛失するか、トークンを削除した場合、新しいトークンを作成するための手順は以下の通りです: + 1. https://console.clickhouse.cloudにアクセス + 2. 資格情報を入力して続行をクリック + 3. 多要素認証画面でキャンセルをクリック + 4. 復旧コードをクリック + 5. コードを入力して続行を押す + 6. 新しい復旧コードをコピーして、安全な場所に保管 + 7. `私はこのコードを安全に記録しました`のボックスをチェックし、続行をクリック + 8. サインイン後、左上のプロフィールに移動 + 9. 左上のセキュリティをクリック + 10. 認証アプリの横にあるゴミ箱アイコンをクリックし、古い認証アプリを削除 + 11. 認証アプリを削除をクリック + 12. 多要素認証を求められたらキャンセルをクリック + 13. 復旧コードをクリック + 14. 復旧コード(ステップ7で生成された新しいコード)を入力して続行をクリック + 15. 新しい復旧コードをコピーし、安全な場所に保管 - 削除プロセス中に画面を離れた場合のフェイルセーフです + 16. `私はこのコードを安全に記録しました`のチェックボックスをオンにして続行 + 17. 新しいMFAファクターを設定するための上記の手順に従う + +
+
+ MFAと復旧コードを両方とも紛失した場合 + + MFAデバイスと復旧コードを両方とも紛失した、またはMFAデバイスを紛失し、復旧コードを取得したことがない場合、リセットをリクエストするためには以下の手順に従ってください。 + + **チケットを提出する**: 他の管理ユーザーがいる組織にいる場合、たとえ一人だけのユーザー組織にアクセスしようとしている場合であっても、組織にログインし、あなたに代わってMFAをリセットするようサポートチケットを提出する役割を持つ組織のメンバーに依頼してください。リクエストが認証されたことを確認後、MFAをリセットし、管理者に通知します。通常通りにMFAなしでサインインし、新しいファクターを登録したい場合はプロフィール設定に移動してください。 + + **メールでリセット**: 組織の唯一のユーザーである場合は、アカウントに紐付けられたメールアドレスを使用して、サポートケースをメール(support@clickhouse.com)で提出してください。正しいメールからのリクエストであることを確認後、MFAとパスワードをリセットします。パスワードリセットリンクにアクセスするにはメールを確認してください。新しいパスワードを設定し、新しいファクターを登録したい場合はプロフィール設定に移動します。 + +
+ +## SAML SSO + +ClickHouse Cloudは、セキュリティアサーションマークアップ言語(SAML)シングルサインオン(SSO)もサポートしています。詳細については、[SAML SSOの設定](/docs/ja/cloud/security/saml-setup)を参照してください。 + +## データベースユーザーID + パスワード + +パスワードを保護するために、[ユーザーアカウントを作成する](/docs/ja/sql-reference/statements/create/user.md)際にSHA256_hashメソッドを使用してください。 + +**TIP:** 管理権限のないユーザーは自分でパスワードを設定できないので、ユーザーにパスワードを生成器でハッシュするよう依頼し、[このツール](https://tools.keycdn.com/sha256-online-generator)などを使用してから、それを管理者に提供してアカウントを設定してもらいます。パスワードは上記の[要件](#establish-strong-passwords)に従う必要があります。 + +``` +CREATE USER userName IDENTIFIED WITH sha256_hash BY 'hash'; +``` diff --git a/docs/ja/cloud/security/cloud-endpoints-api.md b/docs/ja/cloud/security/cloud-endpoints-api.md new file mode 100644 index 00000000000..bb86e375d36 --- /dev/null +++ b/docs/ja/cloud/security/cloud-endpoints-api.md @@ -0,0 +1,131 @@ +--- +slug: /ja/manage/security/cloud-endpoints-api +sidebar_label: クラウドIPアドレス +title: クラウドIPアドレス +--- + +## 静的IPの一覧 + +以下の表は、ClickHouse Cloudでサポートされている各クラウドとリージョンにおける静的IPとS3エンドポイントを示しています。 + +### AWS + +#### Egress IPs + +| リージョン | IPアドレス | +|--------|------| +| ap-northeast-1 | `35.73.179.23` `54.248.225.163` `54.65.53.160` | +| ap-south-1 | `15.206.7.77` `3.110.39.68` `3.6.83.17` | +| ap-southeast-1 | `46.137.240.41` `52.74.24.166` `54.254.37.170` | +| ap-southeast-2 | `13.210.79.90` `13.236.190.252` `13.54.63.56` | +| eu-central-1 | `18.197.49.136` `3.64.109.93` `3.74.177.59` | +| eu-west-1 | `108.128.86.193` `34.240.176.195` `54.73.98.215` | +| eu-west-2 | `13.43.228.235` `18.135.36.159` `3.10.239.194` | +| us-east-1 | `18.211.40.49` `35.175.32.241` `44.197.47.227` `44.208.152.165` `52.205.46.187` `52.22.199.32` | +| us-east-2 | `18.117.209.120` `3.135.147.1` `3.21.42.89` | +| us-west-2 | `35.165.97.55` `44.236.63.111` `54.244.160.153` | + +#### Ingress IPs + +| リージョン | IPアドレス | +|--------|------| +| ap-northeast-1 | `18.182.162.251` `52.194.58.178` `54.150.231.136` | +| ap-south-1 | `15.206.78.111` `3.6.185.108` `43.204.6.248` | +| ap-southeast-1 | `18.138.54.172` `18.143.38.5` `18.143.51.125` | +| ap-southeast-2 | `3.105.241.252` `3.24.14.253` `3.25.31.112` | +| eu-central-1 | `3.125.141.249` `3.75.55.98` `52.58.240.109` | +| eu-west-1 | `79.125.122.80` `99.80.3.151` `99.81.5.155` | +| eu-west-2 | `18.133.60.223` `18.134.36.146` `18.170.151.77` | +| us-east-1 | `3.224.78.251` `3.217.93.62` `52.4.220.199` `54.166.56.105` `44.210.169.212` `52.206.111.15` | +| us-east-2 | `18.216.18.121` `18.218.245.169` `18.225.29.123` | +| us-west-2 | `35.82.252.60` `35.85.205.122` `44.226.232.172` | + +#### S3エンドポイント + +| リージョン | IPアドレス | +|--------|------| +| ap-northeast-1 | `vpce-0047c645aecb997e7` | +| ap-south-1 | `vpce-0a975c9130d07276d` | +| ap-southeast-1 | `vpce-04c0b7c7066498854` | +| ap-southeast-2 | `vpce-0b45293a83527b13c` | +| eu-central-1 | `vpce-0c58e8f7ed0f63623` | +| eu-west-1 | `vpce-0c85c2795779d8fb2` | +| eu-west-2 | `vpce-0ecd990a9f380d784` | +| us-east-1 | `vpce-05f1eeb392b983932` `vpce-0b8b558ea42181cf6` | +| us-east-2 | `vpce-09ff616fa76e09734` | +| us-west-2 | `vpce-0bc78cc5e63dfb27c` | + +### GCP + +#### Egress IPs + +| リージョン | IPアドレス | +|--------|------| +| europe-west4 | `34.147.18.130` `34.90.110.137` `34.90.16.52` `34.91.142.156` `35.234.163.128` | +| asia-southeast1 | `34.124.237.2` `34.142.232.74` `34.143.238.252` `35.240.251.145` `35.247.141.182` | +| us-central1 | `34.136.25.254` `34.170.139.51` `34.172.174.233` `34.173.64.62` `34.66.234.85` | +| us-east1 | `104.196.202.44` `34.74.136.232` `104.196.211.50` `34.74.115.64` `35.237.218.133` | + +#### Ingress IPs + +| リージョン | IPアドレス | +|--------|------| +| europe-west4 | `35.201.102.65` | +| asia-southeast1 | `34.160.80.214` | +| us-central1 | `35.186.193.237` | +| us-east1 | `34.36.105.62` | + +### Azure + +#### Egress IPs + +| リージョン | IPアドレス | +|--------|------| +| eastus2 | `20.109.60.147` `20.242.123.110` `20.75.77.143` | +| westus3 | `20.14.94.21` `20.150.217.205` `20.38.32.164` | +| germanywestcentral | `20.218.133.244` `20.79.167.238` `51.116.96.61` | + +### Ingress IPs + +| リージョン | IPアドレス | +|--------|------| +| eastus2 | `4.152.12.124` | +| westus3 | `4.227.34.126` | +| germanywestcentral | `4.182.8.168` | + +## 静的IPのAPI + +静的IPのリストをプログラムで取得する必要がある場合は、以下のClickHouse Cloud APIエンドポイントを使用できます: [`https://api.clickhouse.cloud/static-ips.json`](https://api.clickhouse.cloud/static-ips.json)。このAPIは、リージョンごとおよびクラウドごとのingress/egress IPやS3エンドポイントの情報を提供します。 + +MySQLやPostgreSQLエンジンのような統合を使用している場合、ClickHouse Cloudがインスタンスにアクセスできるように承認する必要があるかもしれません。このAPIを使用して、パブリックIPを取得し、GCPの`firewalls`または`Authorized networks`、AzureやAWSの`Security Groups`、もしくは他の任意のインフラeコネクトストの管理システムで設定することができます。 + +例えば、`ap-south-1`リージョンでホストされているAWSのClickHouse Cloudサービスからのアクセスを許可するには、そのリージョンの`egress_ips`アドレスを追加します: + +``` +❯ curl -s https://api.clickhouse.cloud/static-ips.json | jq '.' +{ + "aws": [ + { + "egress_ips": [ + "3.110.39.68", + "15.206.7.77", + "3.6.83.17" + ], + "ingress_ips": [ + "15.206.78.111", + "3.6.185.108", + "43.204.6.248" + ], + "region": "ap-south-1", + "s3_endpoints": "vpce-0a975c9130d07276d" + }, +... +``` + +例えば、`us-east-2`で稼働しているAWS RDSインスタンスがClickHouse Cloudサービスに接続する必要がある場合、以下のInboundセキュリティグループルールを設定します: + +![AWS Security group rules](@site/docs/ja/_snippets/images/aws-rds-mysql.png) + +同じく`us-east-2`のClickHouse CloudサービスがGCP上のMySQLに接続する場合、`Authorized networks`は次のようになります: + +![GCP Authorized networks](@site/docs/ja/_snippets/images/gcp-authorized-network.png) diff --git a/docs/ja/cloud/security/cmek.md b/docs/ja/cloud/security/cmek.md new file mode 100644 index 00000000000..ee370d78ee0 --- /dev/null +++ b/docs/ja/cloud/security/cmek.md @@ -0,0 +1,132 @@ +--- +sidebar_label: ユーザー管理の暗号化キー +slug: /ja/cloud/security/cmek +title: ユーザー管理の暗号化キー (CMEK) +--- + +# ユーザー管理の暗号化キー (CMEK) + +ClickHouse Cloudは、ユーザー自身のキー管理サービス (KMS) キーを活用してサービスを保護することを可能にします。私たちは、ClickHouseの組み込み機能である[データ暗号化用の仮想ファイルシステム機能](/docs/ja/operations/storing-data#encrypted-virtual-file-system)を利用し、あなたのデータを暗号化・保護します。ClickHouse Cloudサービスで使用されるデータ暗号化キーは、[エンベロープ暗号化](https://docs.aws.amazon.com/wellarchitected/latest/financial-services-industry-lens/use-envelope-encryption-with-customer-master-keys.html)として知られるプロセスを通じて、ユーザーが提供したKMSキーを使用して暗号化・保護されます。この機能を動作させるために必要なのは、ランタイムでデータ暗号化キーを復号・暗号化するためのKMSキーへのアクセスです。 + +この機能は ClickHouse Cloud のプロダクションサービスに限定されており、この機能を有効にするには[support](/docs/ja/cloud/support)にご連絡ください。ユーザー管理の暗号化キーは、サービス作成時に指定する必要があり、既存のサービスではこのオプションを使用できません。[バックアップと復元](#backup-and-restore)を確認して代替オプションをご覧ください。 + +現在サポートされている KMS プロバイダー: + +- AWSにホストされているサービス向けの[AWS Key Management Service](https://aws.amazon.com/kms) + +近日提供予定: + +- Azureにホストされているサービス向けの[Azure Key Vault](https://azure.microsoft.com/en-us/products/key-vault) +- GCPにホストされているサービス向けの[GCP Cloud Key Management](https://cloud.google.com/security-key-management) +- AWS、Azure、GCPにホストされているサービス向けの[Hashicorp Vault](https://www.hashicorp.com/products/vault) + +:::warning +ClickHouse Cloud サービスの暗号化に使用されたKMSキーを削除すると、ClickHouseサービスは停止され、データおよび既存のバックアップは取得不可能になります。 +::: + +## 手順1. KMSキーの作成 + +### AWS KMSを使用 + +AWSコンソール、CloudFormation スタック、またはTerraform プロバイダを使用してAWS KMSキーを作成できます。以下にそれぞれの手順を説明します。 + +#### オプション1. AWSコンソールを使用してKMSキーを手動で作成 + +*注意: 既に使用したいKMSキーがある場合は、次のステップに進んでください。* + +1. AWSアカウントにログインし、Key Management Service に移動します。 +2. 左側のメニューから__ユーザー管理キー__を選択します。 +3. 右上の__キーを作成__をクリックします。 +4. __キータイプ__「対称キー」と__キー使用__「暗号化および復号化」を選択し、次へをクリックします。 +5. キーのエイリアス(表示名)を入力し、次へをクリックします。 +6. キー管理者を選択し、次へをクリックします。 +7. (オプション)キーのユーザーを選択し、次へをクリックします。 +8. __キー ポリシー__の下に、以下のコードスニペットを追加します: + + ```json + { + "Sid": "Allow ClickHouse Access", + "Effect": "Allow", + "Principal": { + "AWS": "arn:aws:iam::576599896960:role/prod-kms-request-role" + }, + "Action": ["kms:GetPublicKey", + "kms:Decrypt", + "kms:GenerateDataKeyPair", + "kms:Encrypt", + "kms:GetKeyRotationStatus", + "kms:GenerateDataKey", + "kms:DescribeKey"], + "Resource": "*" + } + ``` + + ![暗号化キー ポリシー](@site/docs/ja/_snippets/images/cmek1.png) + +9. 完了をクリックします。 +10. 作成したキーのエイリアスをクリックします。 +11. コピー ボタンを使用してARNをコピーします。 + +#### オプション2. CloudFormationスタックを使用してKMSキーを設定または作成 + +ClickHouseは、キーのためのAWSポリシーをデプロイするための簡単なCloudFormationスタックを提供します。この方法は、既存のKMSキーおよびClickHouse Cloud統合のための新しいKMSキーの作成の両方をサポートします。 + +##### 既存のKMSキーを使用 + +1. AWS アカウントにログインします。 +2. [このリンク](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://s3.us-east-2.amazonaws.com/clickhouse-public-resources.clickhouse.cloud/cf-templates/cmek.yaml&stackName=ClickHouseBYOK¶m_KMSCreate=false¶m_ClickHouseRole=arn:aws:iam::576599896960:role/prod-kms-request-role)を訪問してCloudFormation テンプレートを準備します。 +3. 使用したいKMSキーのARNを入力します(カンマで区切り、スペースを空けないこと)。 +4. 「AWS CloudFormationがカスタム名でIAMリソースを作成する可能性があることを認識しています。」に同意し、__スタックを作成__をクリックします。 +5. 次のステップで必要なスタック出力の`RoleArn`と`KeyArn`を書き留めます。 + +##### 新しいKMSキーを作成 + +1. AWS アカウントにログインします。 +2. [このリンク](https://us-west-2.console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/quickcreate?templateURL=https://s3.us-east-2.amazonaws.com/clickhouse-public-resources.clickhouse.cloud/cf-templates/cmek.yaml&stackName=ClickHouseBYOK¶m_KMSCreate=true¶m_ClickHouseRole=arn:aws:iam::576599896960:role/prod-kms-request-role)を訪問してCloudFormation テンプレートを準備します。 +3. 「AWS CloudFormationがカスタム名でIAMリソースを作成する可能性があることを認識しています。」に同意し、__スタックを作成__をクリックします。 +4. 次のステップで必要なスタック出力の`KeyArn`を書き留めます。 + +#### オプション3. Terraformを通じてKMSキーを作成 + +キーをTerraformを使用してデプロイしたいユーザー向けに、AWSプロバイダのドキュメントは[こちら](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key)をご覧ください。 + +## 手順2. ユーザー管理の暗号化キーを使用してClickHouseサービスを開始 + +1. ClickHouse Cloudアカウントにログインします。 +2. サービス画面に移動します。 +3. __新しいサービス__ をクリックします。 +4. クラウドプロバイダー、リージョンを選択し、サービスに名前を付けます。 +5. __暗号化キーの設定 (CMEK)__をクリックします。例はAWS KMSプロバイダーを使用して示されています。 +6. ウィンドウの右側のフィールドにAWS ARNを貼り付けます。 + + ![暗号化設定](@site/docs/ja/_snippets/images/cmek2.png) + +7. システムは暗号化キーがアクセス可能であることを確認します。 +8. AWS ARNボックスの上に__有効__メッセージが表示されたら__サービスを作成__をクリックします。 +9. サービス画面のサービスタイルの右上隅にキーアイコンが表示され、暗号化されていることを知らせます。 + + ![サービス暗号化済み](@site/docs/ja/_snippets/images/cmek3.png) + +## バックアップと復元 + +バックアップは、関連するサービスと同じキーを使用して暗号化されます。暗号化されたバックアップを復元することで、元のインスタンスと同じKMSキーを使用する暗号化済みインスタンスが作成されます。KMSキーを回転させることも可能です。詳細については[キーの回転](#key-rotation)を参照してください。 + +暗号化済みインスタンスは、非暗号化バックアップを復元し、新しいサービスのために希望するKMSキーを指定することで作成できますので、[support](/docs/ja/cloud/support)にご連絡ください。 + +## KMS キーポーラー + +エンベロープ暗号化を使用する場合、提供されたKMSキーが依然として有効であることを定期的に確認する必要があります。KMSキーのアクセスを10分ごとに確認します。アクセスが無効になった時点でClickHouseサービスを停止します。サービスを再開するには、このガイドの手順に従ってアクセスを復活させ、それからサービスを開始してください。 + +この機能の性質上、KMSキーが削除された後にClickHouse Cloudサービスを復旧することはできません。これを防ぐために、ほとんどのプロバイダーはキーをすぐに削除せず、削除をスケジュールします。プロバイダーのドキュメントを確認するか、このプロセスについて[support](/docs/ja/cloud/support)にお問い合わせください。 + +## キーの回転 + +キー回転は同じKMSプロバイダー内でサポートされています。これは新しいKMSキーを使用してデータ暗号化キーを再暗号化し、このリクエストはClickHouseサービスのダウンタイムなしで即時に処理されます。この操作を実行するには、設定されたKMSキーと新しいKMSキーの両方にアクセスできることを確認し、KMSキー情報を添えて[support](/docs/ja/cloud/support)にご連絡ください。 + +## パフォーマンス + +本ページで指定されているように、私たちはClickHouseの組み込み機能である[データ暗号化用の仮想ファイルシステム機能](/docs/ja/operations/storing-data#encrypted-virtual-file-system)を利用し、データを暗号化・保護しています。 + +この機能で使用されるアルゴリズムは`AES_256_CTR`であり、ワークロードに応じて5-15%のパフォーマンス低下が予想されます: + +![CMEKパフォーマンス低下](@site/docs/ja/_snippets/images/cmek-performance.png) diff --git a/docs/ja/cloud/security/common-access-management-queries.md b/docs/ja/cloud/security/common-access-management-queries.md new file mode 100644 index 00000000000..7dd01461b5c --- /dev/null +++ b/docs/ja/cloud/security/common-access-management-queries.md @@ -0,0 +1,68 @@ +--- +sidebar_label: "一般的なアクセス管理クエリ" +title: "一般的なアクセス管理クエリ" +slug: "/ja/cloud/security/common-access-management-queries" +--- + +import CommonUserRolesContent from '@site/docs/ja/_snippets/_users-and-roles-common.md'; + +# 一般的なアクセス管理クエリ + +:::tip セルフマネージド +セルフマネージドのClickHouseを使用している場合は、[SQLユーザーとロール](/docs/ja/guides/sre/user-management/index.md)をご覧ください。 +::: + +この記事では、SQLユーザーとロールを定義し、それらの特権と権限をデータベース、テーブル、行、カラムに適用する基本的な方法を示します。 + +## 管理ユーザー + +ClickHouse Cloudサービスには、サービス作成時に作成される`default`という管理ユーザーがいます。パスワードはサービス作成時に提供され、**Admin**のロールを持つClickHouse Cloudユーザーによってリセットできます。 + +ClickHouse Cloudサービスに追加のSQLユーザーを追加する場合、そのユーザーにはSQLユーザー名とパスワードが必要です。管理レベルの特権を付与したい場合は、新しいユーザーに`default_role`ロールを割り当ててください。例えば、ユーザー`clickhouse_admin`を追加します: + +```sql +CREATE USER IF NOT EXISTS clickhouse_admin +IDENTIFIED WITH sha256_password BY 'P!@ssword42!'; +``` + +```sql +GRANT default_role TO clickhouse_admin; +``` + +:::note +SQLコンソールを使用する場合、SQLステートメントは`default`ユーザーとして実行されません。代わりに、`sql-console:${cloud_login_email}`という名前のユーザーとして実行され、`cloud_login_email`はクエリを現在実行しているユーザーのメールアドレスです。 + +これらの自動生成されたSQLコンソールユーザーには`default`ロールが付与されています。 +::: + +## パスワードなし認証 + +SQLコンソールには2つのロールが利用可能です: `sql_console_admin`は`default_role`と同じ権限を持ち、`sql_console_read_only`は読み取り専用の権限を持ちます。 + +管理ユーザーにはデフォルトで`sql_console_admin`ロールが割り当てられているため、何も変更はありません。ただし、`sql_console_read_only`ロールを使用すると、管理者でないユーザーでも読み取り専用または完全なアクセス権を任意のインスタンスに割り当てることができます。管理者がこのアクセスを設定する必要があります。これらのロールは`GRANT`または`REVOKE`コマンドを使用してインスタンス固有の要件に合わせて調整できます。これらのロールに対する変更は永続化されます。 + +### 詳細なアクセス制御 + +このアクセス制御機能は、ユーザーレベルの詳細度で手動で設定することもできます。新しい`sql_console_*`ロールをユーザーに割り当てる前に、`sql-console-role:`という名前空間に一致するSQLコンソールユーザー専用のデータベースロールを作成する必要があります。例えば: + +```sql +CREATE ROLE OR REPLACE sql-console-role:; +GRANT TO sql-console-role:; +``` + +一致するロールが検出されると、テンプレートロールではなく、そのユーザーに割り当てられます。より複雑なアクセス制御の設定が可能となり、例えば`sql_console_sa_role`や`sql_console_pm_role`のようなロールを作成し、特定のユーザーに付与することができます。例えば: + +```sql +CREATE ROLE OR REPLACE sql_console_sa_role; +GRANT TO sql_console_sa_role; +CREATE ROLE OR REPLACE sql_console_pm_role; +GRANT TO sql_console_pm_role; +CREATE ROLE OR REPLACE `sql-console-role:christoph@clickhouse.com`; +CREATE ROLE OR REPLACE `sql-console-role:jake@clickhouse.com`; +CREATE ROLE OR REPLACE `sql-console-role:zach@clickhouse.com`; +GRANT sql_console_sa_role to `sql-console-role:christoph@clickhouse.com`; +GRANT sql_console_sa_role to `sql-console-role:jake@clickhouse.com`; +GRANT sql_console_pm_role to `sql-console-role:zach@clickhouse.com`; +``` + + diff --git a/docs/ja/cloud/security/compliance-overview.md b/docs/ja/cloud/security/compliance-overview.md new file mode 100644 index 00000000000..f8225c8e50b --- /dev/null +++ b/docs/ja/cloud/security/compliance-overview.md @@ -0,0 +1,55 @@ +--- +sidebar_label: セキュリティとコンプライアンス +slug: /ja/cloud/security/security-and-compliance +title: セキュリティとコンプライアンス +--- + +# セキュリティとコンプライアンスレポート +ClickHouse Cloud は常にお客様のセキュリティとコンプライアンスのニーズを評価し、追加のレポートが要求されるたびにプログラムを拡大しています。詳しい情報やレポートのダウンロードについては、当社の[信頼センター](https://trust.clickhouse.com)をご覧ください。 + +### SOC 2 タイプ II(2022年から) + +システムと組織の管理(SOC)2 は、組織のシステムに適用されるトラストサービス基準 (TSC) に含まれるセキュリティ、可用性、機密性、処理の完全性、およびプライバシーの基準に焦点を当てたレポートであり、お客様(依拠する第三者)にこれらのコントロールについての保証を提供することを目的としています。ClickHouse は、独立した外部監査人と協力し、ClickHouse Cloud のセキュリティ、可用性、機密性、および処理の完全性に関する監査を少なくとも年に一度実施しています。 + +### ISO 27001(2023年から) + +国際標準化機構(ISO)27001 は、情報セキュリティの国際標準です。それは、リスクを管理し、ポリシーを作成・伝達し、セキュリティコントロールを実装し、コンポーネントが関連性を持ち有効であり続けることを確認するためのプロセスを含む情報セキュリティマネジメントシステム(ISMS)の実装を企業に求めています。ClickHouse は内部監査を実施し、認証発行後2年間の監査および中間検査を受けるために独立した外部監査人と協力しています。 + +### 米国 DPF(2024年から) + +米国データプライバシーフレームワークは、米国から欧州連合/欧州経済地域、英国、およびスイスへの個人データ転送のための信頼できるメカニズムを米国の組織に提供するために開発されました(EU、英国、スイスの法律と一貫しています)。ClickHouse はこのフレームワークに自己認定され、[データプライバシーフレームワークリスト](https://dataprivacyframework.gov/list) に掲載されています。 + +### HIPAA(ベータ版) + +:::note +HIPAA 対応サービスは GCP のベータ版で、**専用** サービスタイプでのみ利用可能です。オンボーディングにはビジネスアソシエイト契約(BAA)が必要です。 詳細については[サポート](https://clickhouse.com/support/program)にお問い合わせください。 +::: + +1996年の医療保険の携行性と責任に関する法律(HIPAA)は、保護された健康情報(PHI)の管理に焦点を当てた米国のプライバシー法です。HIPAAには、電子的個人健康情報(ePHI)の保護に焦点を当てた[セキュリティルール](https://www.hhs.gov/hipaa/for-professionals/security/index.html)などの要求が含まれています。ClickHouse は、指定されたサービスに保存されている ePHI の機密性、完全性およびセキュリティを保証するために、管理的、物理的および技術的な保護措置を実施しています。私たちは、2025年初めにHIPAAをSOC 2に追加して、私たちのコンプライアンスプログラムの外部保証を提供する予定です。 + +ePHIをサービスにロードすることを希望するお客様は、該当するケースごとに適切なコントロールを確認、選択および実装するために、私たちの[共有責任モデル](/docs/ja/cloud/security/shared-responsibility-model)を確認する必要があります。 + +# プライバシーコンプライアンス + +上記の項目に加えて、ClickHouseは一般データ保護規則(GDPR)、カリフォルニア州消費者プライバシー法(CCPA)およびその他関連するプライバシーフレームワークに対応する内部コンプライアンスプログラムを維持しています。ClickHouseが収集する個人データ、その使用方法、保護方法およびその他プライバシー関連情報の詳細については、以下の場所で確認できます。 + +### 法的文書 + +- [プライバシーポリシー](https://clickhouse.com/legal/privacy-policy) +- [クッキーポリシー](https://clickhouse.com/legal/cookie-policy) +- [データプライバシーフレームワーク通知](https://clickhouse.com/legal/data-privacy-framework) +- [データ処理補遺 (DPA)](https://clickhouse.com/legal/agreements/data-processing-addendum) + +### 処理場所 + +- [サブプロセッサーと関連会社](https://clickhouse.com/legal/agreements/subprocessors) +- [データ処理場所](https://trust.clickhouse.com) + +### 追加手続き + +- [個人データアクセス](/docs/ja/cloud/security/personal-data-access) +- [アカウント削除](/docs/ja/cloud/manage/close_account) + +# 支払いコンプライアンス + +ClickHouseは、[PCI SAQ A v4.0](https://www.pcisecuritystandards.org/document_library/)に準拠したクレジットカードによる安全な支払い方法を提供します。 diff --git a/docs/ja/cloud/security/gcp-private-service-connect.md b/docs/ja/cloud/security/gcp-private-service-connect.md new file mode 100644 index 00000000000..540a6d6b21a --- /dev/null +++ b/docs/ja/cloud/security/gcp-private-service-connect.md @@ -0,0 +1,488 @@ +--- +title: "GCP Private Service Connect" +description: "この文書は、Google Cloud Platform (GCP) の Private Service Connect (PSC) を使用して ClickHouse Cloud に接続する方法、および GCP PSC アドレス以外のアドレスから ClickHouse Cloud サービスへのアクセスを ClickHouse Cloud IP アクセスリストを使用して無効にする方法を説明します。" +sidebar_label: "GCP Private Service Connect" +slug: /ja/manage/security/gcp-private-service-connect +--- + +## Private Service Connect + +Private Service Connect (PSC) は、Google Cloud のネットワーク機能であり、消費者が自分の仮想プライベートクラウド (VPC) ネットワーク内で管理サービスにプライベートにアクセスできるようにします。同様に、管理サービスの提供者は、これらのサービスを独自の別の VPC ネットワークにホストし、消費者にプライベート接続を提供できます。 + +サービス提供者は、Private Service Connect サービスを作成することで、消費者に自分のアプリケーションを公開します。サービス消費者は、これらの Private Service Connect タイプのいずれかを通じて、直接そのサービスにアクセスします。 + +![Overview of PSC](@site/docs/ja/cloud/security/images/gcp-psc-overview.png) + +:::important +デフォルトでは、PSC 接続が承認され確立されていても、ClickHouse サービスは Private Service 接続からは利用できません。インスタンスレベルで PSC ID を許可リストに明示的に追加する必要があります。[ステップ](#add-endpoint-id-to-services-allow-list)を完了してください。 +::: + +:::note +GCP Private Service Connect は ClickHouse Cloud Production サービスでのみ有効にできます。 +::: + +リージョン間の接続はサポートされていません。提供者と消費者のリージョンは同じでなければなりません。PSC レベルでグローバルアクセスを有効にすれば、自分の VPC 内の他のリージョンからでも接続できるようになります(以下を参照)。 + +このプロセスは以下の4つのステップに分かれています: + +1. Private Service Connect用のGCPサービスアタッチメントを取得します。 +1. サービスエンドポイントを作成します。 +1. Endpoint ID を ClickHouse Cloud 組織に追加します。 +1. Endpoint ID をサービスの許可リストに追加します。 + +:::note +以下の例では、次の事項を使用します: + - GCP リージョン: `us-central1` + - GCP プロジェクト (顧客のGCPプロジェクト): `my-gcp-project` + - 顧客のGCPプロジェクト内のGCPプライベートIPアドレス: `10.128.0.2` + - 顧客のGCPプロジェクト内のGCP VPC: `default` + +以下に、ClickHouse Cloud サービス内で Private Service Connect を設定する方法を示すコード例を示します。 +::: + +## はじめに + +ClickHouse Cloud サービスに関する情報を取得する必要があります。ClickHouse Cloud コンソールまたは ClickHouse API を通じてこれを行うことができます。ClickHouse API を使用する場合、以下の環境変数を設定してから進めてください: + +```bash +export REGION=us-central1 +export PROVIDER=gcp +export KEY_ID= +export KEY_SECRET= +export ORG_ID= +export INSTANCE_ID=$(curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services" | jq ".result[] | select (.region==\"${REGION:?}\" and .provider==\"${PROVIDER:?}\") | .id " -r | head -1) +``` +:::note + - 自身のOrganization IDはClickHouseコンソール (Organization -> Organization Details)から取得可能です。 + - [新しいキーを作成](https://clickhouse.com/docs/ja/cloud/manage/openapi)するか、既存のものを使用できます。 +::: + +## GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得する + +### オプション 1: ClickHouse Cloud コンソール + +ClickHouse Cloud コンソールで、Private Service Connect 経由で接続したいサービスを開き、**設定** メニューを開きます。**プライベートエンドポイントを設定する** ボタンをクリックします。**サービス名** (`endpointServiceId`) と **DNS 名** (`privateDnsHostname`) をメモしておいてください。次のステップで使用します。 + +![Private Endpoints](./images/gcp-privatelink-pe-create.png) + +### オプション 2: API + +:::note +このステップを実行するために、少なくとも1つのインスタンスがリージョン内でデプロイされている必要があります。 +::: + +GCP サービスアタッチメントと Private Service Connect 用の DNS 名を取得します: + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}/privateEndpointConfig" | jq .result +{ + "endpointServiceId": "projects/.../regions/us-central1/serviceAttachments/production-us-central1-clickhouse-cloud", + "privateDnsHostname": "xb164akwxw.us-central1.p.gcp.clickhouse.cloud" +} +``` + +`endpointServiceId` と `privateDnsHostname` をメモしておいてください。次のステップで使用します。 + +## サービスエンドポイントを作成する + +このセクションでは、サービスエンドポイントを作成します。 + +### Private Service Connection の追加 + +まず最初に、Private Service Connection を作成します。 + +#### オプション 1: Google Cloud コンソールを使用する + +Google Cloud コンソールで、**Network services -> Private Service Connect** に移動します。 + +![Open PSC](@site/docs/ja/cloud/security/images/gcp-psc-open.png) + +**Connect Endpoint** ボタンをクリックして、Private Service Connect 作成ダイアログを開きます。 + +- **Target**: **Published service** を使用してください +- **Target service**: [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップの **endpointServiceId** を使用してください。 +- **Endpoint name**: PSC の **Endpoint name** 名を設定します。 +- **Network/Subnetwork/IP address**: 接続に使用するネットワークを選択してください。Private Service Connect エンドポイントの IP アドレスを新規作成するか既存のものを使用します。例では、名前 **your-ip-address** でIPアドレス `10.128.0.2` を事前に作成して割り当てています。 +- エンドポイントを任意のリージョンから利用可能にするには、**Enable global access** チェックボックスを有効にすることができます。 + +![Enable Global Access](@site/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png) + +**ADD ENDPOINT** ボタンを使って PSC エンドポイントを作成します。 + +接続が承認されると、**Status** 列が **Pending** から **Accepted** に変わります。 + +![Accepted](@site/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png) + +***PSC Connection ID*** をコピーします。この ID を次のステップで ***Endpoint ID*** として使用します。 + +#### オプション 2: Terraform を使用する + +```json +provider "google" { + project = "my-gcp-project" + region = "us-central1" +} + +variable "region" { + type = string + default = "us-central1" +} + +variable "subnetwork" { + type = string + default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/regions/us-central1/subnetworks/default" +} + +variable "network" { + type = string + default = "https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default" +} + +resource "google_compute_address" "psc_endpoint_ip" { + address = "10.128.0.2" + address_type = "INTERNAL" + name = "your-ip-address" + purpose = "GCE_ENDPOINT" + region = var.region + subnetwork = var.subnetwork +} + +resource "google_compute_forwarding_rule" "clickhouse_cloud_psc" { + ip_address = google_compute_address.psc_endpoint_ip.self_link + name = "ch-cloud-${var.region}" + network = var.network + region = var.region + load_balancing_scheme = "" + # service attachment + target = "https://www.googleapis.com/compute/v1/$TARGET" # 以下のノートを参照 +} + +output "psc_connection_id" { + value = google_compute_forwarding_rule.clickhouse_cloud_psc.psc_connection_id + description = "インスタンスレベルで許可リストにGCP PSC接続IDを追加します。" +} +``` + +:::note +TARGET - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **endpointServiceId** を使用してください。 +::: + +## DNS の設定 + +Google Cloud コンソールを使用するものと `gcloud` CLI を使用するものの2つのオプションがあります。 + +### オプション 1: Google Cloud コンソールを使用する + +- **Supported regions** からプライベート DNS ゾーンを作成します。 +- **Network services -> Cloud DNS** を開きます。 +- **Create Zone** を選択します: + +![Create Zone](@site/docs/ja/cloud/security/images/gcp-psc-create-zone.png) + +ゾーンタイプダイアログで以下を設定します: + +- ゾーンタイプ: **Private** +- ゾーン名: 適切なゾーン名を入力します。 +- DNS 名: **Supported regions** テーブルの **Private DNS domain** 列をリージョンに合わせて使用します。 +- ネットワーク: ClickHouse Cloud に PSC を使って接続する予定のネットワークに DNS ゾーンをアタッチします。 + +![Zone Type](@site/docs/ja/cloud/security/images/gcp-psc-zone-type.png) + +#### プライベート DNS ゾーンでの DNS レコードの作成 + +[Private Service Connection の追加](#adding-a-private-service-connection) ステップで作成した IP アドレスを指すように設定します。 + +![DNS Record](@site/docs/ja/cloud/security/images/gcp-psc-dns-record.png) + +### オプション 2: `gcloud` CLI を使用する + +#### DNS ゾーンの作成 + +```bash +gcloud dns \ + --project=my-gcp-project \ + managed-zones create ch-cloud-us-central1 \ + --description="Private DNS zone for PSC" \ + --dns-name="us-central1.p.gcp.clickhouse.cloud." \ + --visibility="private" \ + --networks="https://www.googleapis.com/compute/v1/projects/my-gcp-project/global/networks/default" +``` + +#### DNS レコードの作成 + +```bash +gcloud dns \ + --project=my-gcp-project \ + record-sets create $DNS_RECORD \ + --zone="ch-cloud-us-central1" \ + --type="A" \ + --ttl="300" \ + --rrdatas="10.128.0.2" +``` +:::note +DNS_RECORD - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 +::: + +### オプション 3: Terraform を使用する + +```json +variable "ch_dns_record" { + type = string + default = "$DNS_NAME" # 以下のノートを参照 +} + +resource "google_dns_managed_zone" "clickhouse_cloud_private_service_connect" { + description = "Private DNS zone for accessing ClickHouse Cloud using Private Service Connect" + dns_name = "${var.region}.p.gcp.clickhouse.cloud." + force_destroy = false + name = "clickhouse-cloud-private-service-connect-${var.region}" + visibility = "private" +} + +resource "google_dns_record_set" "psc_dns_record" { + managed_zone = google_dns_managed_zone.clickhouse_cloud_private_service_connect.name + name = "${var.ch_dns_record}" + type = "A" + rrdatas = [google_compute_address.psc_endpoint_ip.address] +} +``` + +:::note +DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 +::: + +## DNS 設定の確認 + +DNS_RECORD - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 + +```bash +ping $DNS_RECORD +``` + +## Endpoint ID を ClickHouse Cloud 組織に追加する + +### オプション 1: ClickHouse Cloud コンソール + +組織にエンドポイントを追加するには、[サービスの許可リストに Endpoint ID を追加](#add-endpoint-id-to-services-allow-list) ステップに進みます。ClickHouse Cloud コンソールを使用して許可リストに `PSC Connection ID` を追加すると、組織にも自動的に追加されます。 + +エンドポイントを削除するには、**Organization details -> Private Endpoints** を開き、削除ボタンをクリックしてエンドポイントを削除します。 + +![endpoints](./images/gcp-pe-remove-private-endpoint.png) + +### オプション 2: API + +コマンドを実行する前に次の環境変数を設定します: + +`ENDPOINT_ID` を、[Private Service Connection の追加](#adding-a-private-service-connection) ステップでの **Endpoint ID** の値に置き換えます。 + +エンドポイントを追加するには、以下を実行します: + +```bash +cat <.p.gcp.clickhouse.cloud" +} +``` + +この例では、`xxxxxxx.yy-xxxxN.p.gcp.clickhouse.cloud` ホスト名への接続が Private Service Connect にルーティングされます。一方、`xxxxxxx.yy-xxxxN.gcp.clickhouse.cloud` はインターネット経由でルーティングされます。 + +## トラブルシューティング + +### DNS 設定のテスト + +DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 + +```bash +nslookup $DNS_NAME +``` + +```response +Non-authoritative answer: +... +Address: 10.128.0.2 +``` + +### Connection reset by peer + +- 最も可能性が高いのは、サービス許可リストに Endpoint ID が追加されていない場合です。[サービスの許可リストに Endpoint ID を追加](#add-endpoint-id-to-services-allow-list) ステップを再確認してください。 + +### 接続テスト + +PSCリンクを使用して接続する際に問題がある場合は、`openssl` を使用して接続をテストしてください。Private Service Connect エンドポイントのステータスが `Accepted` であることを確認してください: + +OpenSSL は接続できるはずです(出力に CONNECTED が表示されます)。`errno=104` は予期されたものです。 + +DNS_NAME - [Private Service Connect 用の GCP サービスアタッチメント取得](#obtain-gcp-service-attachment-for-private-service-connect) ステップでの **privateDnsHostname** を使用します。 + +```bash +openssl s_client -connect ${DNS_NAME}:9440 +``` + +```response +# highlight-next-line +CONNECTED(00000003) +write:errno=104 +--- +no peer certificate available +--- +No client certificate CA names sent +--- +SSL handshake has read 0 bytes and written 335 bytes +Verification: OK +--- +New, (NONE), Cipher is (NONE) +Secure Renegotiation IS NOT supported +Compression: NONE +Expansion: NONE +No ALPN negotiated +Early data was not sent +Verify return code: 0 (ok) +``` + +### エンドポイントフィルターの確認 + +#### REST API + +```bash +curl --silent --user ${KEY_ID:?}:${KEY_SECRET:?} -X GET -H "Content-Type: application/json" "https://api.clickhouse.cloud/v1/organizations/${ORG_ID:?}/services/${INSTANCE_ID:?}" | jq .result.privateEndpointIds +[ + "102600141743718403" +] +``` + +### リモートデータベースへの接続 + +MySQL](../../sql-reference/table-functions/mysql.md) または [PostgreSQL](../../sql-reference/table-functions/postgresql.md) テーブル関数を使用して、ClickHouse Cloud からGCPにホストされたデータベースに接続しようとしているとします。GCP PSC はこの接続を安全に有効にするために使用できません。PSC は一方向で、単方向接続です。内部ネットワークやGCP VPCが ClickHouse Cloud に安全に接続できるようにしますが、ClickHouse Cloud から内部ネットワークに接続することはできません。 + +[GCP Private Service Connect ドキュメント](https://cloud.google.com/vpc/docs/private-service-connect) によると: + +> サービス指向の設計: プロデューサーサービスは、消費者VPCネットワークに単一の IP アドレスを公開するロードバランサーを通じて公開されます。プロデューサーサービスにアクセスする消費者トラフィックは単方向であり、ピアリングされたVPCネットワーク全体にアクセスするのではなく、サービスIPアドレスのみにアクセスできます。 + +このためには、ClickHouse Cloud から内部/プライベートデータベースサービスへの接続を許可するように GCP VPC のファイアウォールルールを構成してください。ClickHouse Cloud リージョンの[デフォルトのEgress IPアドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api)と利用可能な[静的 IP アドレス](https://api.clickhouse.cloud/static-ips.json)を確認してください。 + +## 詳細情報 + +詳細な情報については、[cloud.google.com/vpc/docs/configure-private-service-connect-services](https://cloud.google.com/vpc/docs/configure-private-service-connect-services) を参照してください。 diff --git a/docs/ja/cloud/security/images/activity_log1.png b/docs/ja/cloud/security/images/activity_log1.png new file mode 100644 index 00000000000..05790390b9f Binary files /dev/null and b/docs/ja/cloud/security/images/activity_log1.png differ diff --git a/docs/ja/cloud/security/images/activity_log2.png b/docs/ja/cloud/security/images/activity_log2.png new file mode 100644 index 00000000000..4e2f5479789 Binary files /dev/null and b/docs/ja/cloud/security/images/activity_log2.png differ diff --git a/docs/ja/cloud/security/images/activity_log3.png b/docs/ja/cloud/security/images/activity_log3.png new file mode 100644 index 00000000000..bbfe3212310 Binary files /dev/null and b/docs/ja/cloud/security/images/activity_log3.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-endpoint-settings.png b/docs/ja/cloud/security/images/aws-privatelink-endpoint-settings.png new file mode 100644 index 00000000000..71027ff2a18 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-endpoint-settings.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png b/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png new file mode 100644 index 00000000000..52972f33106 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-endpoints-menu.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-flow.excalidraw b/docs/ja/cloud/security/images/aws-privatelink-flow.excalidraw new file mode 100644 index 00000000000..7bc215e2013 --- /dev/null +++ b/docs/ja/cloud/security/images/aws-privatelink-flow.excalidraw @@ -0,0 +1,611 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 917, + "versionNonce": 94597768, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 676.5, + "y": 710.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 394, + "seed": 1090013588, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1662904263610, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 300, + "versionNonce": 2031817484, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 681.5, + "y": 888, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 39, + "seed": 1493094828, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662925920265, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Your VPC", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Your VPC" + }, + { + "type": "text", + "version": 576, + "versionNonce": 707762444, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1004, + "y": 1156, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 154, + "height": 36, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662925936896, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "AWS Region", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "AWS Region" + }, + { + "type": "rectangle", + "version": 1132, + "versionNonce": 1757040120, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 997.5, + "y": 835, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 133, + "seed": 1345975444, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1662904088791, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 446, + "versionNonce": 1364438408, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1002.5, + "y": 862.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 78, + "seed": 617182356, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662904088791, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "AWS \nPrivateLink", + "baseline": 66, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "AWS PrivateLink" + }, + { + "type": "text", + "version": 875, + "versionNonce": 1521914104, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1300.5, + "y": 816, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 180, + "seed": 1144070700, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662904130802, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Your \nClickHouse \nservice in \nClickHouse \nCloud", + "baseline": 169, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "Your ClickHouse service in ClickHouse Cloud" + }, + { + "type": "rectangle", + "version": 1363, + "versionNonce": 237698612, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1295.5, + "y": 709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 394, + "seed": 378158636, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + } + ], + "updated": 1662925686472, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 1147, + "versionNonce": 1732384904, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1315.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1662904130803, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1598, + "versionNonce": 1799010552, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 995.217005038814, + "y": 905.5521202608265, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 109.21700503881402, + "height": 2.447879739173459, + "seed": 1006009620, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1662904263610, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "gap": 2.282994961186039, + "focus": -0.023096342081524727 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": 0.014599092234048315, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -109.21700503881402, + 2.447879739173459 + ] + ] + }, + { + "type": "arrow", + "version": 2969, + "versionNonce": 937114764, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1293.6396361557422, + "y": 908.2894000233572, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 79.92502428359603, + "height": 1.031792461256714, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1662925716768, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "gap": 1.860363844257874, + "focus": -0.01860928002735619 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "gap": 1.2146118721461183, + "focus": 0.06413755642360305 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -79.92502428359603, + -1.031792461256714 + ] + ] + }, + { + "id": "q6UyjPQniYUq_jNJ9B14G", + "type": "text", + "x": 1376, + "y": 1044, + "width": 108, + "height": 44, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 603208440, + "version": 214, + "versionNonce": 1400458488, + "isDeleted": false, + "boundElements": null, + "updated": 1662904232106, + "link": null, + "locked": false, + "text": "ClickHouse\nAWS account", + "fontSize": 16.923076923076845, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 37, + "containerId": null, + "originalText": "ClickHouse\nAWS account" + }, + { + "type": "text", + "version": 270, + "versionNonce": 1005124344, + "isDeleted": false, + "id": "qXU0J3uJIe9GR7ViB3lOm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 770, + "y": 1045, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 77, + "height": 44, + "seed": 1102179976, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1662904298533, + "link": null, + "locked": false, + "fontSize": 16.923076923076845, + "fontFamily": 1, + "text": "Your AWS\naccount", + "baseline": 37, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": null, + "originalText": "Your AWS\naccount" + }, + { + "type": "rectangle", + "version": 1281, + "versionNonce": 2136517388, + "isDeleted": false, + "id": "hHi2XvG7fY54sO6ehpQEh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 646.5, + "y": 657, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 893, + "height": 493, + "seed": 823428876, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1662925759113, + "link": null, + "locked": false + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + } + } +} \ No newline at end of file diff --git a/docs/ja/cloud/security/images/aws-privatelink-flow.png b/docs/ja/cloud/security/images/aws-privatelink-flow.png new file mode 100644 index 00000000000..9abe122ed1e Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-flow.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-get-dns-names.png b/docs/ja/cloud/security/images/aws-privatelink-get-dns-names.png new file mode 100644 index 00000000000..4ff0798578d Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-get-dns-names.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png b/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png new file mode 100644 index 00000000000..6014e2429be Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-modify-dns-name.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-network-diagram.png b/docs/ja/cloud/security/images/aws-privatelink-network-diagram.png new file mode 100644 index 00000000000..59586558e87 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-network-diagram.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-pe-create.png b/docs/ja/cloud/security/images/aws-privatelink-pe-create.png new file mode 100644 index 00000000000..eaca4de0c0a Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-pe-create.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-pe-dns-name.png b/docs/ja/cloud/security/images/aws-privatelink-pe-dns-name.png new file mode 100644 index 00000000000..abb84188886 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-pe-dns-name.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-pe-filters.png b/docs/ja/cloud/security/images/aws-privatelink-pe-filters.png new file mode 100644 index 00000000000..c21b2e4b367 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-pe-filters.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-select-vpc-and-subnets.png b/docs/ja/cloud/security/images/aws-privatelink-select-vpc-and-subnets.png new file mode 100644 index 00000000000..57c3efd6487 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-select-vpc-and-subnets.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-subnets-tab.png b/docs/ja/cloud/security/images/aws-privatelink-subnets-tab.png new file mode 100644 index 00000000000..8c974031495 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-subnets-tab.png differ diff --git a/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png b/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png new file mode 100644 index 00000000000..6da8aa8ad74 Binary files /dev/null and b/docs/ja/cloud/security/images/aws-privatelink-vpc-endpoint-id.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-basic.png b/docs/ja/cloud/security/images/azure-pe-create-basic.png new file mode 100644 index 00000000000..a7a0127452f Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-basic.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-dns.png b/docs/ja/cloud/security/images/azure-pe-create-dns.png new file mode 100644 index 00000000000..ca82906065c Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-dns.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-resource.png b/docs/ja/cloud/security/images/azure-pe-create-resource.png new file mode 100644 index 00000000000..b0f9104563d Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-resource.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-review.png b/docs/ja/cloud/security/images/azure-pe-create-review.png new file mode 100644 index 00000000000..ed744880b10 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-review.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-tags.png b/docs/ja/cloud/security/images/azure-pe-create-tags.png new file mode 100644 index 00000000000..a99ee794a45 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-tags.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-create-vnet.png b/docs/ja/cloud/security/images/azure-pe-create-vnet.png new file mode 100644 index 00000000000..fe81428f500 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-create-vnet.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-ip.png b/docs/ja/cloud/security/images/azure-pe-ip.png new file mode 100644 index 00000000000..144a365eacd Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-ip.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-provate-ip.png b/docs/ja/cloud/security/images/azure-pe-provate-ip.png new file mode 100644 index 00000000000..6c69912ee97 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-provate-ip.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-remove-private-endpoint.png b/docs/ja/cloud/security/images/azure-pe-remove-private-endpoint.png new file mode 100644 index 00000000000..71034d3e58b Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-remove-private-endpoint.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-resource-guid.png b/docs/ja/cloud/security/images/azure-pe-resource-guid.png new file mode 100644 index 00000000000..cd10a32bb8d Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-resource-guid.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-resource.png b/docs/ja/cloud/security/images/azure-pe-resource.png new file mode 100644 index 00000000000..324a312557a Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-resource.png differ diff --git a/docs/ja/cloud/security/images/azure-pe-view.png b/docs/ja/cloud/security/images/azure-pe-view.png new file mode 100644 index 00000000000..24738b814a5 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe-view.png differ diff --git a/docs/ja/cloud/security/images/azure-pe.png b/docs/ja/cloud/security/images/azure-pe.png new file mode 100644 index 00000000000..3f4dedd14ae Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pe.png differ diff --git a/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png b/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png new file mode 100644 index 00000000000..c20d5904c17 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-pl-dns-wildcard.png differ diff --git a/docs/ja/cloud/security/images/azure-private-link-center.png b/docs/ja/cloud/security/images/azure-private-link-center.png new file mode 100644 index 00000000000..580229a5723 Binary files /dev/null and b/docs/ja/cloud/security/images/azure-private-link-center.png differ diff --git a/docs/ja/cloud/security/images/azure-privatelink-pe-create.png b/docs/ja/cloud/security/images/azure-privatelink-pe-create.png new file mode 100644 index 00000000000..568da552c0d Binary files /dev/null and b/docs/ja/cloud/security/images/azure-privatelink-pe-create.png differ diff --git a/docs/ja/cloud/security/images/azure-privatelink-pe-dns.png b/docs/ja/cloud/security/images/azure-privatelink-pe-dns.png new file mode 100644 index 00000000000..89cecaf88ac Binary files /dev/null and b/docs/ja/cloud/security/images/azure-privatelink-pe-dns.png differ diff --git a/docs/ja/cloud/security/images/azure-privatelink-pe-filter.png b/docs/ja/cloud/security/images/azure-privatelink-pe-filter.png new file mode 100644 index 00000000000..3c26603f2ed Binary files /dev/null and b/docs/ja/cloud/security/images/azure-privatelink-pe-filter.png differ diff --git a/docs/ja/cloud/security/images/gcp-pe-remove-private-endpoint.png b/docs/ja/cloud/security/images/gcp-pe-remove-private-endpoint.png new file mode 100644 index 00000000000..47a55382cb4 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-pe-remove-private-endpoint.png differ diff --git a/docs/ja/cloud/security/images/gcp-privatelink-pe-create.png b/docs/ja/cloud/security/images/gcp-privatelink-pe-create.png new file mode 100644 index 00000000000..615d896ff35 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-privatelink-pe-create.png differ diff --git a/docs/ja/cloud/security/images/gcp-privatelink-pe-dns.png b/docs/ja/cloud/security/images/gcp-privatelink-pe-dns.png new file mode 100644 index 00000000000..4e708b94776 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-privatelink-pe-dns.png differ diff --git a/docs/ja/cloud/security/images/gcp-privatelink-pe-filters.png b/docs/ja/cloud/security/images/gcp-privatelink-pe-filters.png new file mode 100644 index 00000000000..5d2126c4eae Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-privatelink-pe-filters.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png b/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png new file mode 100644 index 00000000000..f6a781901ca Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-copy-connection-id.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-create-zone.png b/docs/ja/cloud/security/images/gcp-psc-create-zone.png new file mode 100644 index 00000000000..359c3efbdaa Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-create-zone.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-dns-record.png b/docs/ja/cloud/security/images/gcp-psc-dns-record.png new file mode 100644 index 00000000000..3a54090a43c Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-dns-record.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png b/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png new file mode 100644 index 00000000000..6044304c50e Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-enable-global-access.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-open.png b/docs/ja/cloud/security/images/gcp-psc-open.png new file mode 100644 index 00000000000..f118fba4026 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-open.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-overview.png b/docs/ja/cloud/security/images/gcp-psc-overview.png new file mode 100644 index 00000000000..f76fe31ef67 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-overview.png differ diff --git a/docs/ja/cloud/security/images/gcp-psc-zone-type.png b/docs/ja/cloud/security/images/gcp-psc-zone-type.png new file mode 100644 index 00000000000..91ae67b0ee3 Binary files /dev/null and b/docs/ja/cloud/security/images/gcp-psc-zone-type.png differ diff --git a/docs/ja/cloud/security/images/ip-filter-add-single-ip.png b/docs/ja/cloud/security/images/ip-filter-add-single-ip.png new file mode 100644 index 00000000000..25317d64b88 Binary files /dev/null and b/docs/ja/cloud/security/images/ip-filter-add-single-ip.png differ diff --git a/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png b/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png new file mode 100644 index 00000000000..c1788532787 Binary files /dev/null and b/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png differ diff --git a/docs/ja/cloud/security/images/pe-remove-private-endpoint.png b/docs/ja/cloud/security/images/pe-remove-private-endpoint.png new file mode 100644 index 00000000000..840561f4cb5 Binary files /dev/null and b/docs/ja/cloud/security/images/pe-remove-private-endpoint.png differ diff --git a/docs/ja/cloud/security/images/secures3.jpg b/docs/ja/cloud/security/images/secures3.jpg new file mode 100644 index 00000000000..55311413e44 Binary files /dev/null and b/docs/ja/cloud/security/images/secures3.jpg differ diff --git a/docs/ja/cloud/security/images/secures3_arn.jpg b/docs/ja/cloud/security/images/secures3_arn.jpg new file mode 100644 index 00000000000..13bdf7a2fd6 Binary files /dev/null and b/docs/ja/cloud/security/images/secures3_arn.jpg differ diff --git a/docs/ja/cloud/security/images/secures3_output.jpg b/docs/ja/cloud/security/images/secures3_output.jpg new file mode 100644 index 00000000000..329a041b963 Binary files /dev/null and b/docs/ja/cloud/security/images/secures3_output.jpg differ diff --git a/docs/ja/cloud/security/images/support-case-form.png b/docs/ja/cloud/security/images/support-case-form.png new file mode 100644 index 00000000000..7966f13b90d Binary files /dev/null and b/docs/ja/cloud/security/images/support-case-form.png differ diff --git a/docs/ja/cloud/security/personal-data-access.md b/docs/ja/cloud/security/personal-data-access.md new file mode 100644 index 00000000000..e26cf405647 --- /dev/null +++ b/docs/ja/cloud/security/personal-data-access.md @@ -0,0 +1,55 @@ +--- +sidebar_label: 個人データアクセス +slug: /ja/cloud/security/personal-data-access +title: 個人データアクセス +--- + +## はじめに +登録ユーザーであれば、ClickHouseを使用してアカウントの個人データを表示および修正することができます。これには、連絡先情報や、役割に応じて組織内の他のユーザーの連絡先情報、APIキーの詳細情報、その他の情報が含まれることがあります。これらはClickHouseのユーザーインターフェース(UI)から自己管理で行うことができます。 + +**データ主体アクセス要求(DSAR)とは** +あなたの所在地によっては、適用法によりClickHouseが保持するあなたの個人データに関する追加の権利(データ主体の権利)が提供される場合があります。この権利については、ClickHouseのプライバシーポリシーで説明されています。データ主体の権利を行使するためのプロセスは、データ主体アクセス要求(DSAR)として知られています。 + +**個人データの範囲** +ClickHouseが収集する個人データの詳細やその使用方法については、ClickHouseのプライバシーポリシーをご確認ください。 + +## セルフサービス +デフォルトでは、ClickHouseはユーザーが自分の個人データをClickHouseのユーザーインターフェース(UI)から直接表示できるようにします。 + +以下に、アカウントを設定しサービスを使用する際にClickHouseが収集するデータの概要と、特定の個人データをClickHouse UI内で表示できる場所を示します。 + +| 場所/URL | 説明 | 個人データ | +|-------------|----------------|-----------------------------------------| +| https://auth.clickhouse.cloud/u/signup/ | アカウント登録 | メール、パスワード | +| https://clickhouse.cloud/profile | 一般的なユーザープロファイル詳細 | 名前、メール | +| https://clickhouse.cloud/organizations/OrgID/members | 組織内のユーザーリスト | 名前、メール | +| https://clickhouse.cloud/organizations/OrgID/keys | APIキーのリストとそれを作成した人 | メール | +| https://clickhouse.cloud/organizations/OrgID/activity | ユーザーごとの行動ログ | メール | +| https://clickhouse.cloud/organizations/OrgID/admin/billing | 請求情報と請求書 | 請求先住所、メール | +| https://control-plane.clickhouse-dev.com/support | ClickHouseサポートとのやり取り | 名前、メール | + +注意: `OrgID`が含まれるURLは、あなたの特定のアカウントに対応するOrgIDに更新する必要があります。 + +### 既存のお客様 +お客様が私たちのアカウントをお持ちで、上記のセルフサービスオプションで個人データの問題が解決せず、プライバシーポリシーに基づいてデータ主体アクセス要求を行いたい場合は、ClickHouseアカウントにログインし、[サポートケースを開いて](https://clickhouse.cloud/support)ください。これにより、あなたの身元を確認し、リクエストを完了するための手順を減らすことができます。 + +サポートケースには以下の詳細を含めてください: + +| 項目 | リクエストに含めるテキスト | +|-------------|---------------------------------------------------| +| 件名 | データ主体アクセス要求(DSAR) | +| 説明 | ClickHouseに探して、収集して、または提供してほしい情報の詳細な説明。 | + +サポートケースフォーム + +### アカウントをお持ちでない方 +アカウントをお持ちでなく、上記のセルフサービスオプションで個人データの問題が解決しない場合は、プライバシーポリシーに基づいてデータ主体アクセス要求を行うことができます。これらのリクエストは、[privacy@clickhouse.com](mailto:privacy@clickhouse.com)にメールで提出してください。 + +## 身元確認 + +メール経由でデータ主体アクセス要求を提出した場合、リクエストを処理しあなたの身元を確認するために特定の情報をお願いすることがあります。適用法により、リクエストを拒否する義務があったり、許可されることがあります。リクエストを拒否する場合は、法的な制限に従いその理由をお伝えします。 + +詳細については、[ClickHouseプライバシーポリシー](https://clickhouse.com/legal/privacy-policy)をご確認ください。 diff --git a/docs/ja/cloud/security/private-link-overview.md b/docs/ja/cloud/security/private-link-overview.md new file mode 100644 index 00000000000..cc4b2a835a7 --- /dev/null +++ b/docs/ja/cloud/security/private-link-overview.md @@ -0,0 +1,13 @@ +--- +sidebar_label: プライベートリンクの概要 +slug: /ja/cloud/security/private-link-overview +title: プライベートリンクの概要 +--- + +# プライベートリンクの概要 + +ClickHouse Cloud は、あなたのクラウド仮想ネットワークにサービスを接続する機能を提供します。以下のプロバイダー向けのガイドを参照してください: + +- [AWS プライベートリンク](/ja/cloud/security/aws-privatelink.md) +- [GCP プライベートサービスコネクト](/ja/cloud/security/gcp-private-service-connect.md) +- [Azure プライベートリンク](/ja/cloud/security/azure-privatelink.md) diff --git a/docs/ja/cloud/security/saml-sso-setup.md b/docs/ja/cloud/security/saml-sso-setup.md new file mode 100644 index 00000000000..069fb1766d9 --- /dev/null +++ b/docs/ja/cloud/security/saml-sso-setup.md @@ -0,0 +1,276 @@ +--- +sidebar_label: SAML SSO設定 +slug: /ja/cloud/security/saml-setup +title: SAML SSO設定 +description: ClickHouse CloudでのSAML SSOの設定方法 +--- + +# SAML SSO設定 + +:::note +SAML SSOはプライベートプレビュー中です。利用可能かどうか、お問い合わせはsupport@clickhouse.comまでご連絡ください。 +::: + +ClickHouse Cloudは、セキュリティアサーションマークアップ言語(SAML)を介したシングルサインオン(SSO)をサポートしています。これにより、アイデンティティプロバイダー(IdP)を使用して安全にClickHouse Cloudの組織にサインインできます。 + +現在、サービスプロバイダー主導のSSO、別々の接続を使用する複数の組織、およびジャストインタイムプロビジョニングをサポートしています。ドメイン間アイデンティティ管理システム(SCIM)や属性マッピングはまだサポートしていません。 + +## 始める前に + +IdPでの管理権限およびClickHouse Cloud組織での**管理者**ロールが必要です。IdP内での接続設定の後、以下の手順で求められる情報を使用してプロセスを完了するためにご連絡ください。 + +SAML接続に加え、**組織への直接リンク**を設定することをお勧めします。これにより、ログインプロセスが簡単になります。各IdPでの設定は異なるため、お使いのIdPについての情報を以下でお読みください。 + +## IdPの設定方法 + +### 全てのIdPs + +全ての設定には組織IDが必要です。組織IDを取得するには次の手順を行います: +1. [ClickHouse Cloud](https://console.clickhouse.cloud)の組織にサインインしてください。 + + Organization ID + +3. 左下隅で、**組織**の下にある組織名をクリックします。 + +4. ポップアップメニューで、**組織の詳細**を選択します。 + +5. 下記で使うための**組織ID**をメモしておいてください。 + +### Okta SAMLの設定 + +各ClickHouse組織に対して、Oktaで2つのアプリ統合を設定します:1つのSAMLアプリと、直接リンクを格納するためのブックマークです。 + +#### アクセスを管理するためのグループを作成: + +1. **管理者**としてOktaインスタンスにログインします。 + +2. 左側で**グループ**を選択します。 + +3. **グループを追加**をクリックします。 + +4. グループの名前と説明を入力します。このグループはSAMLアプリとその関連ブックマークアプリの間のユーザーを一貫させるために使用されます。 + +5. **保存**をクリックします。 + +6. 作成したグループの名前をクリックします。 + +7. このClickHouse組織にアクセスを許可したいユーザーを割り当てるために**人を割り当てる**をクリックします。 + +#### ユーザーがシームレスにログインできるようにブックマークアプリを作成: + +1. 左側で**アプリケーション**を選択し、次に**アプリケーション**のサブヘディングを選択します。 + +2. **アプリカタログを閲覧**をクリックします。 + +3. **ブックマークアプリ**を検索して選択します。 + +4. **統合を追加**をクリックします。 + +5. アプリのラベルを選択します。 + +6. URLとして`https://console.clickhouse.cloud?connection={organizationid}`を入力します。 + +7. **割り当て**タブに移動し、上記で作成したグループを追加します。 + +#### 接続を可能にするSAMLアプリを作成: + +1. 左側で**アプリケーション**を選択し、次に**アプリケーション**のサブヘディングを選択します。 + +2. **アプリ統合を作成**をクリックします。 + +3. SAML 2.0を選択し、次をクリックします。 + +4. アプリケーションの名前を入力し、**アプリケーションアイコンをユーザーに表示しない**のボックスをチェックし、次をクリックします。 + +5. 以下の値を使用して、SAML設定画面を入力します。 + + | フィールド | 値 | + |-----------------|------------------------------------------| + | シングルサインオンURL | https://auth.clickhouse.cloud/login/callback?connection={organizationid} | + | オーディエンスURI (SPエンティティID) | urn:auth0:ch-production:{organizationid} | + | デフォルトリレーステート | 空白のまま | + | Name IDフォーマット | 指定なし | + | アプリケーションユーザー名 | Email | + | アプリケーションユーザー名の更新 | 作成および更新 | + +7. 以下の属性ステートメントを入力します。 + + | フィールド | 値 | + |-----------------|------------| + | Name | email | + | Name format | Basic | + | Value | user.email | + +8. **次へ**をクリックします。 + +9. フィードバック画面で求められる情報を入力し、**完了**をクリックします。 + +10. **割り当て**タブに移動し、上記で作成したグループを追加します。 + +11. 新しいアプリの**サインオン**タブで、**SAMLセットアップ手順を見る**ボタンをクリックします。 + + Okta SAML Setup Instructions + +13. 以下の3つのアイテムを集めて、プロセスを完了するために[サポートケースを提出](#submit-a-support-case)してください。 + - Identity Provider Single Sign-On URL + - Identity Provider Issuer + - X.509 Certificate + +### Google SAMLの設定 + +各組織ごとに1つのSAMLアプリをGoogleに設定し、複数組織SSOを使用する場合はユーザーに直接リンク(`https://console.clickhouse.cloud?connection={organizationId}`)をブックマークとして提供する必要があります。 + +1. Google管理コンソール(admin.google.com)に移動します。 + + Google SAML App + +2. **アプリ**をクリックし、左側で**ウェブとモバイルアプリ**を選択します。 + +3. 上部メニューから**アプリを追加**をクリックし、次に**カスタムSAMLアプリを追加**を選択します。 + +4. アプリの名前を入力し、**続行**をクリックします。 + +5. 以下の2つのアイテムを集め、情報を送信するために[サポートケースを提出](#submit-a-support-case)してください。注意:このデータをコピーする前に設定を完了した場合は、アプリのホーム画面から**メタデータをダウンロード**をクリックしてX.509証明書を取得してください。 + - SSO URL + - X.509 Certificate + +7. 以下のACS URLとエンティティIDを入力します。 + + | フィールド | 値 | + |---------------|---------------------------------------------------------------| + | ACS URL | https://auth.clickhouse.cloud/login/callback?connection={organizationid} | + | エンティティID | urn:auth0:ch-production:{organizationid} | + +8. **署名付き応答**のボックスにチェックを入れます。 + +9. Name IDフォーマットとして**EMAIL**を選択し、Name IDを**基本情報 > プライマリメール**のままにしておきます。 + +10. **続行**をクリックします。 + +11. 以下の属性マッピングを入力します: + + | フィールド | 値 | + |-------------------|---------| + | 基本情報 | プライマリメール | + | アプリ属性 | email | + +13. **完了**をクリックします。 + +14. アプリを有効にするには**オフ**をクリックし、設定を**全員に対してオン**に変更します。左側のオプションを選択して、アクセル制限をグループまたは組織単位へと行うこともできます。 + +### Azure (Microsoft) SAMLの設定 + +Azure (Microsoft) SAMLはAzure Active Directory (AD)やMicrosoft Entraとも呼ばれます。 + +組織ごとに別々のサインオンURLを用意したアプリケーション統合を1つセットアップします。 + +1. Microsoft Entra管理センターにログオンします。 + +2. 左側で**アプリケーション > エンタープライズアプリケーション**に移動します。 + +3. 上部メニューで**新しいアプリケーション**をクリックします。 + +4. 上部メニューで**新しいアプリケーションを作成**をクリックします。 + +5. 名前を入力し、**ギャラリーにない他のアプリケーションを統合する(非ギャラリー)**を選択し、**作成**をクリックします。 + + Azure Non-Gallery App + +6. 左側で**ユーザーとグループ**をクリックしてユーザーを割り当てます。 + +7. 左側で**シングルサインオン**をクリックします。 + +8. **SAML**をクリックします。 + +9. 基本設定SAML構成画面を以下の設定で埋めます。 + + | フィールド | 値 | + |-----------------------------|---------------------------------------------------------------| + | 識別子(エンティティID) | urn:auth0:ch-production:{organizationid} | + | 応答URL(アサーション消費サービスURL) | https://auth.clickhouse.cloud/login/callback?connection={organizationid} | + | サインオンURL | https://console.clickhouse.cloud?connection={organizationid} | + | リレーステート | 空白 | + | ログアウトURL | 空白 | + +11. 以下を属性とクレームの下に(A)を追加または(U)を更新: + + | クレーム名 | フォーマット | ソース属性 | + |------------------------------------------|---------------|------------------| + | (U) 一意のユーザー識別子(Name ID) | メールアドレス | user.mail | + | (A) email | Basic | user.mail | + | (U) /identity/claims/name | 省略された | user.mail | + + Attributes and Claims + +12. 以下の2つのアイテムを収集し、[サポートケースを提出](#submit-a-support-case)してプロセスを完了させてください: + - ログインURL + - 証明書(Base64) + +### サポートケースを提出 + +1. ClickHouse Cloudコンソールに戻ります。 + +2. 左側で**ヘルプ**を選択し、サポートサブメニューを選択します。 + +3. **新しいケース**をクリックします。 + +4. 件名に「SAML SSO設定」と入力します。 + +5. 説明欄に、上記の手順から集めたリンクを貼り付け、証明書をチケットに添付します。 + +6. どのドメインがこの接続に許可されるべきかもお知らせください(例:domain.com、domain.aiなど)。 + +7. 新しいケースを作成します。 + +8. ClickHouse Cloud内での設定を完了し、テスト準備が整った際にお知らせします。 + +9. 元の認証方法でサインインし、新しいSSOアカウントに管理者ロールを割り当ててください。 + - メール + パスワードアカウントの場合は、`https://clickhouse.cloud/?with=email`を使用してください。 + - ソーシャルログインの場合は、適切なボタン(**Googleで続行**または**Microsoftで続行**)をクリックしてください。 + +## 動作方法 + +### サービスプロバイダー主導のSSO + +私たちはサービスプロバイダー主導のSSOのみを利用しています。これは、ユーザーが`https://console.clickhouse.cloud`にアクセスし、メールアドレスを入力してIdPにリダイレクトされることを意味します。IdP経由で既に認証されているユーザーは、ログインページでメールアドレスを入力せずに、直接リンクを使用して自動的に組織にログインできます。 + +### ユーザーロールの割り当て + +ユーザーは、IdPアプリケーションに割り当てられて初めて、ClickHouse Cloudコンソールに表示されます。組織内で少なくとも1人のSSOユーザーが管理者ロールを持つ必要があります。元の認証方法を使用して、SSOロールを更新するにはソーシャルログインまたは`https://clickhouse.cloud?with=email`を使用してログインしてください。 + +### SSOを利用しないユーザーの削除 + +SSOユーザーを設定し、少なくとも1人のユーザーに管理者ロールを割り当てた後、管理者は他の方法(例:ソーシャル認証またはユーザーID + パスワード)を使用しているユーザーを削除できます。Google認証はSSO設定後も機能し続けます。ユーザーID + パスワードのユーザーは、メールドメインに基づいてSSOへ自動的にリダイレクトされますが、`https://clickhouse.cloud?with=email`を使用するとリダイレクトを回避できます。 + +### ユーザー管理 + +ClickHouse Cloudは現在SSOのためにSAMLを実装していますが、ユーザー管理のためのSCIMはまだ実装していません。つまり、SSOユーザーはClickHouse Cloud組織にアクセスするために、IdP内のアプリケーションに割り当てられる必要があります。ユーザーはClickHouse Cloudに一度ログインすると、組織内の**ユーザー**エリアに表示されます。IdPでユーザーが削除されると、SSOを使用してClickHouse Cloudにログインできなくなりますが、SSOユーザーは管理者が手動で削除するまで組織内に表示され続けます。 + +### マルチオーガナイゼーションSSO + +ClickHouse Cloudは、各組織に別々の接続を提供することで、複数組織のSSOをサポートします。各組織にログインするには、直接リンク(`https://console.clickhouse.cloud?connection={organizationid}`)を使用してください。別の組織にログインする前に一度ログアウトすることを忘れずにしてください。 + +## 追加情報 + +認証の際にセキュリティは最優先事項です。そのため、SSOを実装する際にいくつかの決定を行いましたのでお知らせします。 + +- **サービスプロバイダーによって開始される認証フローのみを処理します。** ユーザーは、`https://console.clickhouse.cloud`に移動してメールアドレスを入力し、IdPにリダイレクトされる必要があります。ブックマークアプリケーションまたはショートカットを追加する手順は、ユーザーがURLを覚える必要がないように便宜上提供されています。 + +- **IdP経由でアプリに割り当てられた全てのユーザーは同じメールドメインを持つ必要があります。** ClickHouseアカウントにアクセスしたいベンダー、契約者、またはコンサルタントがいる場合、彼らは従業員と同じドメインのメールアドレス(例:user@domain.com)を持つ必要があります。 + +- **SSOと非SSOアカウントを自動的にリンクしません。** 同じメールアドレスを使用していても、ClickHouseユーザーリストに複数のアカウントが表示されることがあります。 diff --git a/docs/ja/cloud/security/setting-ip-filters.md b/docs/ja/cloud/security/setting-ip-filters.md new file mode 100644 index 00000000000..6cd70f56485 --- /dev/null +++ b/docs/ja/cloud/security/setting-ip-filters.md @@ -0,0 +1,82 @@ +--- +sidebar_label: IPフィルタの設定 +slug: /ja/cloud/security/setting-ip-filters +title: IPフィルタの設定 +--- + +## IPフィルタの設定 + +IPアクセスリストは、ClickHouseサービスへのトラフィックをフィルタリングし、どの送信元アドレスがClickHouseサービスに接続を許可されているかを指定します。リストは各サービスごとに設定可能です。サービスの展開時、またはその後に設定できます。プロビジョニング中にIPアクセスリストを設定しない場合や、最初のリストを変更したい場合は、サービスを選択し、**Security** タブで変更できます。 + +:::important +ClickHouse Cloudサービスに対するIPアクセスリストの作成をスキップした場合、サービスへのトラフィックは許可されません。 +::: + +## 準備 + +開始する前に、アクセスリストに追加すべきIPアドレスまたは範囲を収集します。リモートワーカー、オンコールの場所、VPNなどを考慮に入れてください。IPアクセスリストのユーザーインターフェースは、個々の住所とCIDR表記を受け付けます。 + +クラスレスドメイン間ルーティング(CIDR)表記を使用すると、従来のクラスA、B、C(8、6、または24)サブネットマスクサイズよりも小さいIPアドレス範囲を指定できます。[ARIN](https://account.arin.net/public/cidrCalculator) などの組織はCIDR電卓を提供しており、CIDR表記の詳細については、[クラスレスドメイン間ルーティング (CIDR)](https://www.rfc-editor.org/rfc/rfc4632.html) RFCをご参照ください。 + +## IPアクセスリストの作成または変更 + +ClickHouse Cloudサービスリストからサービスを選択し、**Settings** を選択します。**Security** セクションの下にIPアクセスリストがあります。テキストにあるリンクをクリックします: *このサービスに接続できる場所* **(どこからでも | 特定のx地点から)** + +サイドバーが表示され、以下のオプションを設定できます: + +- どこからでもサービスに対する着信トラフィックを許可 +- 特定の場所からのサービスへのアクセスを許可 +- サービスへのすべてのアクセスを拒否 + +このスクリーンショットは、「NY Office range」として説明されたIPアドレスの範囲からのトラフィックを許可するアクセスリストを示しています: + + ![既存のアクセスリスト](@site/docs/ja/cloud/security/images/ip-filtering-after-provisioning.png) + +### 可能な操作 + +1. 追加のエントリを追加するには、**+ Add new IP** を使用 + + この例では、`London server` と説明された単一のIPアドレスを追加します: + + ![アクセスリストに単一のIPを追加](@site/docs/ja/cloud/security/images/ip-filter-add-single-ip.png) + +2. 既存のエントリを削除 + + クロス(x)をクリックするとエントリが削除されます + +3. 既存のエントリを編集 + + エントリを直接変更 + +4. **Anywhere** からのアクセスを許可するように切り替える + + これは推奨されませんが、許可されています。ClickHouse上に構築されたアプリケーションを公開し、バックエンドのClickHouse Cloudサービスへのアクセスを制限することをお勧めします。 + +変更を反映させるには、**Save** をクリックする必要があります。 + +## 検証 + +フィルタを作成したら、範囲内からの接続を確認し、許可された範囲外からの接続が拒否されることを確認します。簡単な `curl` コマンドを使用して確認できます: +```bash title="許可リスト外からの接続試行が拒否される" +curl https://.clickhouse.cloud:8443 +``` +```response +curl: (35) error:02FFF036:system library:func(4095):Connection reset by peer +``` +または +```response +curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to HOSTNAME.clickhouse.cloud:8443 +``` + +```bash title="許可リスト内からの接続試行が許可される" +curl https://.clickhouse.cloud:8443 +``` +```response +Ok. +``` + +## 制限事項 + +- 現在、IPアクセスリストはIPv4のみをサポートしています + + diff --git a/docs/ja/cloud/security/shared-responsibility-model.md b/docs/ja/cloud/security/shared-responsibility-model.md new file mode 100644 index 00000000000..27b3c135f5b --- /dev/null +++ b/docs/ja/cloud/security/shared-responsibility-model.md @@ -0,0 +1,110 @@ +--- +sidebar_label: 共有責任モデル +slug: /ja/cloud/security/shared-responsibility-model +title: セキュリティ共有責任モデル +--- + +## サービスタイプ + +ClickHouse Cloud は3つのサービスタイプを提供しています。詳細は、[サービスタイプ](/docs/ja/cloud/manage/service-types)ページをご覧ください。 + +- 開発: 小規模なワークロードや開発環境に最適 +- 本番: 中規模のワークロードや顧客向けアプリケーション向け +- 専用: 厳しいレイテンシや分離要件があるアプリケーション向け + +## クラウドアーキテクチャ + +クラウドアーキテクチャは、コントロールプレーンとデータプレーンで構成されています。コントロールプレーンは、組織の作成、コントロールプレーン内のユーザー管理、サービス管理、APIキー管理、および請求を担当しています。データプレーンは、オーケストレーションと管理のためのツールを実行し、顧客サービスを収容します。詳細は、[ClickHouse Cloudアーキテクチャ](/docs/ja/cloud/reference/architecture)図をご覧ください。 + +## BYOCアーキテクチャ + +自身のクラウド(BYOC:Bring Your Own Cloud)を使用すると、顧客は自分のクラウドアカウントでデータプレーンを実行できます。詳細は、[BYOC(Bring Your Own Cloud)](/docs/ja/cloud/reference/byoc)ページをご覧ください。 + +## ClickHouse Cloudの共有責任モデル + +| コントロール | ClickHouse Cloud | 顧客 - クラウド | 顧客 - BYOC | +|-----------------------------------------------------------------------|-------------------|------------------|-----------------| +| 環境の分離を維持する | ✔️ | | ✔️ | +| ネットワーク設定を管理する | ✔️ | ✔️ | ✔️ | +| ClickHouseシステムへのアクセスを安全に管理する | ✔️ | | | +| コントロールプレーンおよびデータベース内の組織ユーザーを安全に管理 | | ✔️ | ✔️ | +| ユーザー管理と監査 | ✔️ | ✔️ | ✔️ | +| データを転送中および保管中に暗号化する | ✔️ | | | +| 顧客管理の暗号化キーを安全に扱う | | ✔️ | ✔️ | +| 冗長インフラストラクチャを提供する | ✔️ | | ✔️ | +| データのバックアップ | ✔️ | | | +| バックアップリカバリ機能を確認する | ✔️ | | | +| データ保持設定を実装する | | ✔️ | ✔️ | +| セキュリティ構成管理 | ✔️ | | ✔️ | +| ソフトウェアおよびインフラの脆弱性修正 | ✔️ | | | +| ペネトレーションテストを実施する | ✔️ | | | +| 脅威の検出と対応 | ✔️ | | ✔️ | +| セキュリティインシデント対応 | ✔️ | | ✔️ | + +## ClickHouse Cloudの設定可能なセキュリティ機能 + +
+ ネットワーク接続 + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | サービスへの接続を制限する[IPフィルタ](/docs/ja/cloud/security/setting-ip-filters) | Available | AWS, GCP, Azure | All | + | サービスへの安全な接続のための[プライベートリンク](/docs/ja/cloud/security/private-link-overview)| Available | AWS, GCP, Azure | Production or Dedicated | + +
+
+ アクセス管理 + + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | コントロールプレーンでの[標準のロールベースアクセス](/docs/ja/cloud/security/cloud-access-management) | Available | AWS, GCP, Azure | All | + | [多要素認証(MFA)](/docs/ja/cloud/security/cloud-authentication#multi-factor-authhentication)利用可能 | Available | AWS, GCP, Azure | All | + | コントロールプレーンへの[SAMLシングルサインオン](/docs/ja/cloud/security/saml-setup)利用可能 | Preview | AWS, GCP, Azure | Qualified Customers | + | データベースにおける[詳細なロールベースアクセス制御](/docs/ja/cloud/security/cloud-access-management#database-roles) | Available | AWS, GCP, Azure | All | + +
+
+ データセキュリティ + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | [クラウドプロバイダーとリージョン](/docs/ja/cloud/reference/supported-regions)の選択 | Available | AWS, GCP, Azure | All | + | 制限付きの[無料のデイリーバックアップ](/docs/ja/cloud/manage/backups#default-backup-policy) | Available | AWS, GCP, Azure | All | + | [カスタムバックアップ設定](/docs/ja/cloud/manage/backups#configurable-backups)利用可能 | Available | GCP, AWS, Azure | Production or Dedicated | + | 顧客管理の暗号化キー(CMEK)による透過的なデータ暗号化利用可能 | Available | AWS | Production or Dedicated | + | 手動キー管理による[フィールドレベル暗号化](/docs/ja/sql-reference/functions/encryption-functions) | Availablle | GCP, AWS, Azure | All | + + +
+
+ データ保持 + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | [有効期限(TTL)](/docs/ja/sql-reference/statements/alter/ttl)設定による保持管理 | Available | AWS, GCP, Azure | All | + | 大量削除アクションのための[ALTER TABLE DELETE](/docs/ja/sql-reference/statements/alter/delete) | Available | AWS, GCP, Azure | All | + | 測定された削除活動のための[軽量DELETE](/docs/ja/sql-reference/statements/delete) | Available | AWS, GCP, Azure | All | + +
+
+ 監査とロギング + + | 設定 | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | コントロールプレーン活動のための[監査ログ](/docs/ja/cloud/security/audit-logging) | Available | AWS, GCP, Azure | All | + | データベース活動のための[セッションログ](/docs/ja/operations/system-tables/session_log) | Available | AWS, GCP, Azure | All | + | データベース活動のための[クエリログ](/docs/ja/operations/system-tables/query_log) | Available | AWS, GCP, Azure | All | + +
+ +## ClickHouse Cloudコンプライアンス + + | フレームワーク | ステータス | クラウド | サービスレベル | + |------------------------------------------------------------------------------------------------------|-----------|-------------------|-------------------------| + | ISO 27001コンプライアンス | Available | AWS, GCP, Azure | All | + | SOC 2 Type IIコンプライアンス | Available | AWS, GCP, Azure | All | + | GDPRおよびCCPAコンプライアンス | Available | AWS, GCP, Azure | All | + | HIPAAコンプライアンス | Beta | GCP, `AWSは間もなく対応予定` | Dedicated | + + 対応しているコンプライアンスフレームワークの詳細については、[セキュリティとコンプライアンス](/docs/ja/cloud/security/security-and-compliance)ページをご覧ください。 diff --git a/docs/ja/cloud/support.md b/docs/ja/cloud/support.md new file mode 100644 index 00000000000..c119bce7c23 --- /dev/null +++ b/docs/ja/cloud/support.md @@ -0,0 +1,8 @@ +--- +sidebar_label: クラウドサポート +--- +# クラウドサポート + +import Content from '@site/docs/ja/about-us/support.md'; + + diff --git a/docs/ja/concepts/glossary.md b/docs/ja/concepts/glossary.md new file mode 100644 index 00000000000..929b45dc246 --- /dev/null +++ b/docs/ja/concepts/glossary.md @@ -0,0 +1,34 @@ +--- +sidebar_label: "用語集" +description: "このページには、ClickHouseに関連する一般的に使用される用語とその定義が掲載されています。" +--- + +# 用語集 + +## 完全性(Atomicity) + +完全性は、トランザクション(データベース操作の一連の処理)が単一かつ不可分の単位として処理されることを保証します。つまり、トランザクション内のすべての操作が実行されるか、もしくは全く実行されないかのどちらかです。例えば、ある銀行口座から別の口座への送金は原子トランザクションの一例です。送金のいずれかのステップが失敗した場合、トランザクションは失敗し、送金元の口座にお金が残ります。完全性は、金銭が失われたり、作り出されたりしないことを保証します。 + +## クラスター + +データの保存と処理を共同で行うノード(サーバー)の集合。 + +## CMEK + +顧客管理による暗号化キー(CMEK)を使用すると、顧客はキー管理サービス(KMS)キーを使用してClickHouseディスクデータキーを暗号化し、保存データを保護することができます。 + +## Dictionary + +Dictionaryはキーと値のペアのマッピングで、さまざまな種類の参照リストに便利です。クエリでDictionaryを効率的に使用するための強力な機能であり、参照テーブルとの`JOIN`を使用するよりも効率的であることが多いです。 + +## パーツ + +テーブルデータの一部をディスクに保存する物理ファイルです。これは、パーティションキーを使用して作成される、テーブルデータの論理的な分割であるパーティションとは異なります。 + +## レプリカ + +ClickHouseデータベースに保存されたデータのコピーです。同一データのレプリカは冗長性と信頼性のために任意の数を持つことができます。レプリカは、データを異なるサーバー間で同期させるClickHouseのReplicatedMergeTreeテーブルエンジンと共に使用されます。 + +## シャード + +データの部分集合です。ClickHouseには必ず少なくとも1つのシャードがあります。データを複数のサーバーに分割しない場合、データは1つのシャードに格納されます。データを複数のサーバー間で分割することにより、単一サーバーの容量を超える負荷を分散することができます。 diff --git a/docs/ja/concepts/olap.md b/docs/ja/concepts/olap.md new file mode 100644 index 00000000000..3a71b40e282 --- /dev/null +++ b/docs/ja/concepts/olap.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 2 +sidebar_label: OLAPとは何か? +description: "OLAPはOnline Analytical Processing(オンライン分析処理)の略です。技術的およびビジネス的観点から広範に理解できる用語です。" +--- + +# OLAPとは何か? + + + +[OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing)は、Online Analytical Processing(オンライン分析処理)の略です。技術的およびビジネス的観点から広範に理解できる用語です。最高レベルでは、この言葉を逆に読むことができます: + +Processing(処理) +: いくつかのソースデータが処理され… + +Analytical(分析) +: …分析レポートや洞察を生成するためであり… + +Online(オンライン) +: …リアルタイムで行われます。 + +## ビジネスの観点から見たOLAP {#olap-from-the-business-perspective} + +近年、ビジネスの関係者はデータの価値を認識し始めています。盲目的に意思決定を行う企業は、競争に遅れないことが多いのです。成功している企業のデータ駆動型アプローチは、ビジネス上の意思決定に少しでも有用である可能性のあるすべてのデータを収集しなければならないことを強制し、彼らがこのデータをタイムリーに分析するためのメカニズムを必要とします。ここで、OLAPデータベース管理システム(DBMS)が登場します。 + +ビジネスの観点から言えば、OLAPは企業が運用活動を継続的に計画し、分析し、報告することを可能にし、これにより効率性を最大化し、経費を削減し、最終的に市場シェアを獲得します。これは、社内システムで行うことも、Web/モバイル分析サービス、CRMサービスなどのSaaSプロバイダーに外注することもできます。OLAPは、多くのBIアプリケーション(ビジネスインテリジェンス)の基盤技術です。 + +ClickHouseは、特定のドメインデータを分析するためのこれらのSaaSソリューションのバックエンドとして非常に頻繁に使用されるOLAPデータベース管理システムです。しかし、依然として一部の企業は第三者プロバイダーとデータを共有することに消極的であり、社内データウェアハウスのシナリオも有効です。 + +## 技術的観点から見たOLAP {#olap-from-the-technical-perspective} + +すべてのデータベース管理システムは、OLAP(Online **Analytical** Processing)とOLTP(Online **Transactional** Processing)の2つのグループに分類できます。前者は、各レポートを大量の履歴データに基づいて構築しますが、それを頻繁には行いません。後者は通常、継続的にデータの現在の状態を変更するトランザクションのストリームを処理します。 + +実際には、OLAPとOLTPは二項カテゴリとして見るのではなく、スペクトルとして見るべきです。ほとんどの実際のシステムは、主にこれらのいずれかに焦点を当てていますが、反対の種類のワークロードが望ましい場合に何らかの解決策や回避策を提供しています。この状況は、多くの企業に複数のストレージシステムを統合して運用することを余儀なくします。これはそれほど大した問題ではないかもしれませんが、多くのシステムを持つことはメンテナンスコストを増加させるため、近年のトレンドは単一のデータベース管理システムで両方の種類のワークロードを等しく処理できるHTAP(**Hybrid Transactional/Analytical Processing**)に向かっています。 + +DBMSが純粋なOLAPまたは純粋なOLTPとして始まったとしても、競争に追いつくためにHTAPの方向に進まざるを得ません。ClickHouseも例外ではありません。当初は[可能な限り高速なOLAPシステム](/ja/concepts/why-clickhouse-is-so-fast)として設計されており、今でも本格的なトランザクションサポートはありませんが、データの一貫した読み取り/書き込みや更新/削除のための変異のような機能が追加されています。 + +OLAPとOLTPシステムの間の基本的なトレードオフは次の通りです: + +- 分析レポートを効率的に構築するには、カラムを個別に読み取ることが重要であり、そのため、ほとんどのOLAPデータベースは[列指向](/knowledgebase/columnar-database)です。 +- カラムを個別に保存すると、行の操作、例えばアペンドやインプレースの修正のコストが、カラムの数(特にシステムがイベントのすべての詳細をちょうど一応収集しようとする場合は非常に多くなる可能性がある)に比例して増加します。したがって、ほとんどのOLTPシステムは、行ごとにデータを配置します。 diff --git a/docs/ja/concepts/why-clickhouse-is-so-fast.md b/docs/ja/concepts/why-clickhouse-is-so-fast.md new file mode 100644 index 00000000000..530e3e609c4 --- /dev/null +++ b/docs/ja/concepts/why-clickhouse-is-so-fast.md @@ -0,0 +1,112 @@ +--- +sidebar_position: 1 +sidebar_label: ClickHouseはなぜ速いのか? +description: "高速に設計されていました。クエリ実行のパフォーマンスは常に開発プロセスで最優先されていましたが、ユーザーフレンドリーさ、スケーラビリティ、セキュリティといった他の重要な特性も考慮され、ClickHouseが現実のプロダクションシステムとなることができました。" +--- + +# ClickHouseはなぜ速いのか? {#why-clickhouse-is-so-fast} + +[データの指向性](/docs/ja/intro#row-oriented-vs-column-oriented-storage)の他にも、データベースのパフォーマンスには多くの要因が寄与します。 +これから、ClickHouseが特に他の列指向データベースと比較して速い理由を詳しく説明します。 + +アーキテクチャの観点から見ると、データベースは少なくともストレージ層とクエリ処理層から成り立っています。ストレージ層はテーブルデータの保存、読み込み、管理を担当し、クエリ処理層はユーザークエリの実行を行います。ClickHouseは他のデータベースと比較して、挿入とSelectクエリを極めて高速に行うことを可能にする両層の革新を提供しています。 + +## ストレージ層: 同時挿入は相互に分離される + +ClickHouseでは、各テーブルは複数の「テーブルパーツ」から構成されています。ユーザーがテーブルにデータを挿入するたびに(INSERT文)、パートが作成されます。クエリは、クエリが開始された時点に存在するすべてのテーブルパーツに対して常に実行されます。 + +パーツが多くたまりすぎないようにするために、ClickHouseはバックグラウンドで複数の(小さな)パーツを単一の大きなパーツに継続的に組み合わせる結合操作を実行します。 + +このアプローチにはいくつかの利点があります。一方で、個々の挿入は「ローカル」であり、グローバル、すなわちテーブル全体のデータ構造を更新する必要がないという点です。結果として、複数の同時挿入は相互の同期や既存のテーブルデータとの同期を必要とせず、ディスクI/Oの速度で挿入を行うことが可能です。 + +## ストレージ層: 同時挿入および選択は分離される + +一方で、パーツの結合はユーザーに見えないバックグラウンド操作であり、同時選択クエリには影響を与えません。実際、このアーキテクチャは挿入と選択を非常に効果的に分離しており、多くの他のデータベースで採用されています。 + +## ストレージ層: 結合時の計算 + +他のデータベースとは異なり、ClickHouseは結合操作中に追加のデータ変換も実行できます。この例には以下が含まれます: + +- **Replacing merges**によって、入力パーツの行の最新バージョンのみを保持し、他のすべての行バージョンを破棄します。Replacing mergesは結合時のクリーンアップ操作と考えることができます。 + +- **Aggregating merges**によって、入力パーツの中間集計状態を新しい集計状態に結合します。これは、実際にはインクリメンタル集計を実装するだけです。 + +- **有効期限 (TTL) の結合** により、特定の時間ベースのルールに基づいて行を圧縮、移動、または削除します。 + +これらの変換のポイントは、ユーザークエリの実行時にかかる作業(計算)を結合時にシフトすることです。これが重要な理由は2つあります: + +一方では、クエリが変換後のデータ(例:事前集計データ)を活用できる場合、ユーザークエリは劇的に速くなる可能性があります。時には1000倍以上速くなることもあります。 + +他方では、結合の実行時間の大部分は、入力パーツの読み込みと出力パーツの保存に費やされます。結合中にデータを変換するための追加作業は、通常、結合の実行時間にあまり影響を与えません。これらの魔法は完全に透明であり、クエリの結果に影響を与えません(パフォーマンスを除いて)。 + +## ストレージ層: データのプルーニング + +実際には、多くのクエリは繰り返し可能であり、変更なしまたはわずかな修正(例:異なるパラメータ値)で定期的な間隔で実行されます。同じまたは類似のクエリを何度も実行することで、インデックスを追加したり、データを再編成して頻繁なクエリがデータにより速くアクセスできるようにします。このアプローチは「データプルーニング」としても知られており、ClickHouseはこれに対して3つの技術を提供しています: + +1. [主キーインデックス](https://clickhouse.com/docs/ja/optimize/sparse-primary-indexes) は、テーブルデータのソート順を定義します。適切に選ばれた主キーは、上記のクエリでのWHERE句のようなフィルタを、フルカラムスキャンではなく高速な二分探索で評価できるようにします。より技術的には、スキャンの実行時間はデータサイズに対して線形ではなく対数になります。 + +2. [テーブルのプロジェクション](https://clickhouse.com/docs/ja/sql-reference/statements/alter/projection) は、異なる主キーでソートされた同じデータを格納するテーブルの別の内部バージョンとして役立ちます。プロジェクションは、複数の頻繁なフィルタ条件がある場合に役立ちます。 + +3. [スキッピングインデックス](https://clickhouse.com/docs/ja/optimize/skipping-indexes) は、最小値や最大値、ユニークな値のセットなど、追加のデータ統計をカラムに埋め込みます。スキッピングインデックスは主キーやテーブルプロジェクションとは直交しており、カラム内のデータ分布に応じて、フィルタの評価を大幅に高速化することができます。 + +これら3つの技術はすべて、フルカラムの読み込み時にできるだけ多くの行をスキップすることを目的としており、データを最も速く読み取る方法は、そもそも読み取らないことです。 + +## ストレージ層: データ圧縮 + +さらに、ClickHouseのストレージ層は生のテーブルデータをさまざまなコーデックを使用して(または必要に応じて)圧縮します。 + +列ストアはこのような圧縮に非常に適しており、同じ型とデータ分布の値が一緒に配置されています。 + +ユーザーは、[設定](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) によって、カラムを様々な一般的な圧縮アルゴリズム(ZSTDなど)や特化したコーデック、例えば浮動小数点数用のGorillaとFPC、整数値用のDeltaとGCD、あるいは暗号化コーデックとしてのAESなどで圧縮することができます。 + +データ圧縮は、データベーステーブルのストレージサイズを削減するだけでなく、多くの場合、ローカルディスクやネットワークI/Oが低スループットに制約されているため、クエリパフォーマンスも向上させます。 + +## 最新鋭のクエリ処理層 + +最後に、ClickHouseはベクトル化されたクエリ処理層を採用しており、最大速度と効率を実現するためにリソースを最大限に活用してクエリの実行を並列化しています。 + +「ベクトル化」とは、クエリプランオペレーターが中間結果の行を単一行ではなくバッチで渡すことを意味します。これにより、CPUキャッシュの利用が向上し、オペレーターがSIMD命令を適用して複数の値を一度に処理できるようになります。実際、多くのオペレーターは複数のバージョンを持っており、それぞれのSIMD命令セット世代に対応しています。ClickHouseは、動作するハードウェアの能力に基づいて、最新かつ最速のバージョンを自動的に選択します。 + +現代のシステムには数十のCPUコアがあります。全てのコアを活用するために、ClickHouseはクエリプランを複数のレーンに展開し、通常はコアごとに1つのレーンを作成します。各レーンはテーブルデータの非重複範囲を処理します。この方法により、データベースのパフォーマンスは利用可能なコア数に応じて「垂直に」拡張されます。 + +単一ノードがテーブルデータを保持するには小さすぎる場合、さらにノードを追加してクラスターを形成できます。テーブルを分割して(「シャーディング」して)ノード間に分散することができます。ClickHouseはテーブルデータを格納するすべてのノードでクエリを実行し、これにより利用可能なノード数に応じて「水平に」スケールされます。 + +## 細部への徹底的なこだわり + +> **「ClickHouseは驚異的なシステムです - ハッシュテーブルの20バージョンがあります。通常のシステムが1つのハッシュテーブルを持つところ、ClickHouseは多様なクエリタイプ、データ構造、分布やインデックス設定にわたり、多数の専門的なコンポーネントを持つため、驚異的なパフォーマンスを実現しています。」** [Andy Pavlo, CMUのデータベース教授](https://www.youtube.com/watch?v=Vy2t_wZx4Is&t=3579s) + +ClickHouseを特別な存在にするのは、低レベルの最適化への徹底的なこだわりです。単に動作するデータベースを構築することも一つのことですが、さまざまなクエリタイプ、データ構造、分布、インデックス設定を横断して高速化を実現するためのエンジニアリングこそが「驚異的なシステム」の芸術が輝くところです。 + +**ハッシュテーブル。** ハッシュテーブルを例に取ってみましょう。ハッシュテーブルは、結合や集計で使用される中心的なデータ構造です。プログラマーとしては、以下の設計決定を検討する必要があります: + +* 選択するハッシュ関数、 +* 衝突の解決: [オープンアドレッシング](https://en.wikipedia.org/wiki/Open_addressing) または [チェイニング](https://en.wikipedia.org/wiki/Hash_table#Separate_chaining)、 +* メモリのレイアウト:キーと値のための1つの配列か、それとも別々の配列か? +* フィルファクタ:いつどのようにリサイズするか?リサイズ時に値をどのように移動するか? +* 削除:ハッシュテーブルはエントリーを削除することを許可すべきか? + +サードパーティのライブラリが提供する標準のハッシュテーブルは機能的には動作しますが、高速ではありません。優れたパフォーマンスは、徹底的なベンチマークと実験を必要とします。 + +[ClickHouseにおけるハッシュテーブルの実装](https://clickhouse.com/blog/hash-tables-in-clickhouse-and-zero-cost-abstractions) は、クエリとデータの特性に基づいて**30を超える事前コンパイルされたハッシュテーブルのバリエーション**から選択しています。 + +**アルゴリズム。** アルゴリズムについても同様です。例えば、ソートの場合を考えてみましょう: + +* 何をソートすべきか:数字、タプル、文字列、または構造体か? +* データはRAMにあるか? +* ソートは安定である必要があるか? +* すべてのデータをソートする必要があるか、部分的なソートで十分か? + +データの特徴に依存するアルゴリズムは、その一般的な対応物よりもパフォーマンスが優れていることがよくあります。データの特性が事前に不明な場合、システムはさまざまな実装を試し、実行時に最適なものを選択できます。例えば、ClickHouseにおけるLZ4デコードの実装方法についての[記事](https://habr.com/en/company/yandex/blog/457612/)を参照してください。 + +## VLDB 2024 論文 + +2024年8月に、私たちの最初の研究論文がVLDBに受理され、公開されました。 +VLDBは非常に大きなデータベースに関する国際会議であり、データ管理の分野で最も権威のある会議の一つと広く見なされています。 +数百件の提出物の中で、VLDBの採択率は通常約20%です。 + +ClickHouseがなぜそこまで高性能なのかについてその最も興味深いアーキテクチャおよびシステムデザインコンポーネントを簡潔に説明する[PDFの論文](https://www.vldb.org/pvldb/vol17/p3731-schulze.pdf)を読むことができます。 + +ClickHouseのCTOであり創設者でもあるAlexey Milovidovが、論文を発表し(スライドは[こちら](https://raw.githubusercontent.com/ClickHouse/clickhouse-presentations/master/vldb_2024/VLDB_2024_presentation.pdf)で入手可能)、時間切れとなった質疑応答を行いました。 +記録されたプレゼンテーションはこちらでご覧になれます: + + diff --git a/docs/ja/data-compression/compression-in-clickhouse.md b/docs/ja/data-compression/compression-in-clickhouse.md new file mode 100644 index 00000000000..a953b4ae17b --- /dev/null +++ b/docs/ja/data-compression/compression-in-clickhouse.md @@ -0,0 +1,220 @@ +--- +slug: /ja/data-compression/compression-in-clickhouse +title: ClickHouseにおける圧縮 +description: ClickHouseの圧縮アルゴリズムの選択 +keywords: [圧縮, コーデック, エンコーディング] +--- + +ClickHouseのクエリパフォーマンスの秘密の一つは圧縮です。 + +ディスク上のデータが少なければ、I/Oが減少し、クエリや挿入が速くなります。通常、CPUに関連する任意の圧縮アルゴリズムのオーバーヘッドは、I/Oの削減によって上回ります。そのため、ClickHouseのクエリを高速化するためには、データの圧縮を改善することに最初に注力するべきです。 + +> ClickHouseがデータをうまく圧縮する理由については、[この記事](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)をお勧めします。要約すると、列指向データベースとして、値はカラム順に書き込まれます。これらの値がソートされている場合、同じ値が互いに隣接します。圧縮アルゴリズムは連続するデータパターンを利用します。さらに、ClickHouseにはコーデックや細かなデータ型が存在し、ユーザーが圧縮技術をさらに調整できるようになっています。 + +ClickHouseにおける圧縮は主に以下の3つの要因に影響されます: +- 順序キー +- データ型 +- 使用されるコーデック + +これらはすべてスキーマを通じて設定されます。 + +## 圧縮を最適化するために適切なデータ型を選択 + +Stack Overflowのデータセットを例にしましょう。以下の`posts`テーブルのスキーマについての圧縮統計を比較します: + +- `posts` - 順序キーのないタイプ最適化がされていないスキーマ。 +- `posts_v3` - 各カラムに適切な型とビットサイズを持ち、順序キー`(PostTypeId, toDate(CreationDate), CommentCount)`を備えたタイプ最適化スキーマ。 + +以下のクエリを使用して、各カラムの現在の圧縮済みおよび未圧縮のサイズを測定できます。最初の`posts`の順序キーなしでの最適化スキーマのサイズを調べてみましょう。 + +```sql +SELECT name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE table = 'posts' +GROUP BY name + +┌─name──────────────────┬─compressed_size─┬─uncompressed_size─┬───ratio─┐ +│ Body │ 46.14 GiB │ 127.31 GiB │ 2.76 │ +│ Title │ 1.20 GiB │ 2.63 GiB │ 2.19 │ +│ Score │ 84.77 MiB │ 736.45 MiB │ 8.69 │ +│ Tags │ 475.56 MiB │ 1.40 GiB │ 3.02 │ +│ ParentId │ 210.91 MiB │ 696.20 MiB │ 3.3 │ +│ Id │ 111.17 MiB │ 736.45 MiB │ 6.62 │ +│ AcceptedAnswerId │ 81.55 MiB │ 736.45 MiB │ 9.03 │ +│ ClosedDate │ 13.99 MiB │ 517.82 MiB │ 37.02 │ +│ LastActivityDate │ 489.84 MiB │ 964.64 MiB │ 1.97 │ +│ CommentCount │ 37.62 MiB │ 565.30 MiB │ 15.03 │ +│ OwnerUserId │ 368.98 MiB │ 736.45 MiB │ 2 │ +│ AnswerCount │ 21.82 MiB │ 622.35 MiB │ 28.53 │ +│ FavoriteCount │ 280.95 KiB │ 508.40 MiB │ 1853.02 │ +│ ViewCount │ 95.77 MiB │ 736.45 MiB │ 7.69 │ +│ LastEditorUserId │ 179.47 MiB │ 736.45 MiB │ 4.1 │ +│ ContentLicense │ 5.45 MiB │ 847.92 MiB │ 155.5 │ +│ OwnerDisplayName │ 14.30 MiB │ 142.58 MiB │ 9.97 │ +│ PostTypeId │ 20.93 MiB │ 565.30 MiB │ 27 │ +│ CreationDate │ 314.17 MiB │ 964.64 MiB │ 3.07 │ +│ LastEditDate │ 346.32 MiB │ 964.64 MiB │ 2.79 │ +│ LastEditorDisplayName │ 5.46 MiB │ 124.25 MiB │ 22.75 │ +│ CommunityOwnedDate │ 2.21 MiB │ 509.60 MiB │ 230.94 │ +└───────────────────────┴─────────────────┴───────────────────┴─────────┘ +``` + +ここでは圧縮済みサイズと未圧縮サイズの両方を表示しています。どちらも重要です。圧縮済みサイズはディスクから読み取る必要があるものを指し、これはクエリのパフォーマンス(およびストレージコスト)を最小化するために減らしたいものです。このデータは読み取る前に解凍する必要があります。この未圧縮サイズはデータ型に依存します。このサイズを最小化することで、クエリのメモリオーバーヘッドを減少させ、クエリで処理する必要があるデータを削減し、キャッシュの利用効率を向上させ、最終的にクエリ時間を短縮します。 + +> 上記のクエリは、システムデータベースの`columns`テーブルに依存しています。このデータベースはClickHouseによって管理され、クエリのパフォーマンスメトリクスからバックグラウンドクラスターログに至るまで、さまざまな有用な情報の宝庫です。好奇心旺盛な読者には、["System Tables and a Window into the Internals of ClickHouse"](https://clickhouse.com/blog/clickhouse-debugging-issues-with-system-tables)や、関連する記事[[1]](https://clickhouse.com/blog/monitoring-troubleshooting-insert-queries-clickhouse)[[2]](https://clickhouse.com/blog/monitoring-troubleshooting-select-queries-clickhouse)をお勧めします。 + +テーブル全体のサイズを要約するには、以下のクエリを簡素化できます: + +```sql +SELECT formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE table = 'posts' + +┌─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ 50.16 GiB │ 143.47 GiB │ 2.86 │ +└─────────────────┴───────────────────┴───────┘ +``` + +最適化された型と順序キーを持つ`posts_v3`テーブルに対してこのクエリを繰り返すことで、未圧縮サイズと圧縮済みサイズが大幅に削減されていることがわかります。 + +```sql +SELECT + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE `table` = 'posts_v3' + +┌─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ 25.15 GiB │ 68.87 GiB │ 2.74 │ +└─────────────────┴───────────────────┴───────┘ +``` + +カラム別の詳細な分析では、データを圧縮前に順序化し、適切な型を使用することで、`Body`、`Title`、`Tags`、`CreationDate`カラムで大きな削減が達成されています。 + +```sql +SELECT + name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE `table` = 'posts_v3' +GROUP BY name + +┌─name──────────────────┬─compressed_size─┬─uncompressed_size─┬───ratio─┐ +│ Body │ 23.10 GiB │ 63.63 GiB │ 2.75 │ +│ Title │ 614.65 MiB │ 1.28 GiB │ 2.14 │ +│ Score │ 40.28 MiB │ 227.38 MiB │ 5.65 │ +│ Tags │ 234.05 MiB │ 688.49 MiB │ 2.94 │ +│ ParentId │ 107.78 MiB │ 321.33 MiB │ 2.98 │ +│ Id │ 159.70 MiB │ 227.38 MiB │ 1.42 │ +│ AcceptedAnswerId │ 40.34 MiB │ 227.38 MiB │ 5.64 │ +│ ClosedDate │ 5.93 MiB │ 9.49 MiB │ 1.6 │ +│ LastActivityDate │ 246.55 MiB │ 454.76 MiB │ 1.84 │ +│ CommentCount │ 635.78 KiB │ 56.84 MiB │ 91.55 │ +│ OwnerUserId │ 183.86 MiB │ 227.38 MiB │ 1.24 │ +│ AnswerCount │ 9.67 MiB │ 113.69 MiB │ 11.76 │ +│ FavoriteCount │ 19.77 KiB │ 147.32 KiB │ 7.45 │ +│ ViewCount │ 45.04 MiB │ 227.38 MiB │ 5.05 │ +│ LastEditorUserId │ 86.25 MiB │ 227.38 MiB │ 2.64 │ +│ ContentLicense │ 2.17 MiB │ 57.10 MiB │ 26.37 │ +│ OwnerDisplayName │ 5.95 MiB │ 16.19 MiB │ 2.72 │ +│ PostTypeId │ 39.49 KiB │ 56.84 MiB │ 1474.01 │ +│ CreationDate │ 181.23 MiB │ 454.76 MiB │ 2.51 │ +│ LastEditDate │ 134.07 MiB │ 454.76 MiB │ 3.39 │ +│ LastEditorDisplayName │ 2.15 MiB │ 6.25 MiB │ 2.91 │ +│ CommunityOwnedDate │ 824.60 KiB │ 1.34 MiB │ 1.66 │ +└───────────────────────┴─────────────────┴───────────────────┴─────────┘ +``` + +## 適切なカラムの圧縮コーデックの選択 + +カラム圧縮コーデックを使用すると、各カラムをエンコードおよび圧縮するために使用されるアルゴリズム(およびその設定)を変更できます。 + +エンコーディングと圧縮は若干異なる仕組みで動作しますが、目的は同じです:データサイズを削減することです。エンコーディングは私たちのデータにマッピングを適用し、データ型の特性を利用した関数に基づいて値を変換します。逆に、圧縮はバイトレベルでデータを圧縮する一般的なアルゴリズムを使用します。 + +通常、エンコーディングは圧縮が使用される前に適用されます。異なるエンコーディングと圧縮アルゴリズムは、異なる値の分布に対して有効なので、データを理解する必要があります。 + +ClickHouseは多くのコーデックと圧縮アルゴリズムをサポートしています。以下は重要度の順にいくつかの推奨事項です: + +- **`ZSTD`を基本とする** - `ZSTD`圧縮は最高の圧縮率を提供します。`ZSTD(1)`は、最も一般的な型のデフォルトとして設定されるべきです。圧縮率を高めるために数値を変更することが試みられますが、挿入速度が遅くなるコストを考慮すると、3以上の値を使用することはほとんどないでしょう。 +- **整数や日付のシーケンスには`Delta`を** - `Delta`ベースのコーデックは、単調なシーケンスや連続する値の間で小さなデルタがある場合にうまく機能します。より具体的には、`Delta`コーデックは、微分が小さな数値を生成する場合によく機能します。そうでない場合は、`DoubleDelta`を試す価値があります(これは通常、`Delta`の最初のレベルの導関数がすでに非常に小さい場合にはさほど影響を与えません)。単調な増加が一定のシーケンス、例えば日付時間フィールドはさらによく圧縮されます。 +- **`Delta`は`ZSTD`を改善する** - `ZSTD`はデルタデータにおいて効果的なコーデックです。逆に、デルタエンコーディングは`ZSTD`の圧縮を改善することができます。`ZSTD`が存在する場合、他のコーデックはさらなる改善をほとんど提供しません。 +- **可能であれば`ZSTD`よりも`LZ4`を** - `LZ4`と`ZSTD`が同等の圧縮を提供する場合、後者のほうが高速な解凍を提供し、より少ないCPUを必要とするため、`LZ4`を選ぶほうが良いでしょう。しかし、ほとんどの場合`ZSTD`は`LZ4`を大幅に上回る性能を発揮します。これらのコーデックの一部は、`LZ4`と組み合わせることで、`ZSTD`に匹敵する圧縮を提供しながら高速に動作する場合がありますが、これにはテストが必要です。 +- **スパースデータや小範囲には`T64`を** - `T64`はスパースデータやブロック内の範囲が小さい場合に効果的です。ランダムな数値には`T64`を避けるべきです。 +- **未知のパターンには`Gorilla`と`T64`を試す** - データが未知のパターンを持つ場合、`Gorilla`と`T64`を試す価値があるかもしれません。 +- **ゲージデータには`Gorilla`を** - `Gorilla`は浮動小数点データ、特にゲージ読み取りを表すデータ、すなわちランダムなスパイクに効果的です。 + +さらに詳しいオプションは[こちら](/ja/sql-reference/statements/create/table#column_compression_codec)を参照してください。 + +以下では、`Id`、`ViewCount`、`AnswerCount`に対して`Delta`コーデックを指定します。これらが順序キーと線形に相関していると仮定し、Deltaエンコードから恩恵を受けるはずです。 + +```sql +CREATE TABLE posts_v4 +( + `Id` Int32 CODEC(Delta, ZSTD), + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), + `Score` Int32, + `ViewCount` UInt32 CODEC(Delta, ZSTD), + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime64(3, 'UTC'), + `LastActivityDate` DateTime64(3, 'UTC'), + `Title` String, + `Tags` String, + `AnswerCount` UInt16 CODEC(Delta, ZSTD), + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime64(3, 'UTC'), + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +これらのカラムの圧縮の改善は以下の通りです: + +```sql +SELECT + `table`, + name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE (name IN ('Id', 'ViewCount', 'AnswerCount')) AND (`table` IN ('posts_v3', 'posts_v4')) +GROUP BY + `table`, + name +ORDER BY + name ASC, + `table` ASC + +┌─table────┬─name────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ posts_v3 │ AnswerCount │ 9.67 MiB │ 113.69 MiB │ 11.76 │ +│ posts_v4 │ AnswerCount │ 10.39 MiB │ 111.31 MiB │ 10.71 │ +│ posts_v3 │ Id │ 159.70 MiB │ 227.38 MiB │ 1.42 │ +│ posts_v4 │ Id │ 64.91 MiB │ 222.63 MiB │ 3.43 │ +│ posts_v3 │ ViewCount │ 45.04 MiB │ 227.38 MiB │ 5.05 │ +│ posts_v4 │ ViewCount │ 52.72 MiB │ 222.63 MiB │ 4.22 │ +└──────────┴─────────────┴─────────────────┴───────────────────┴───────┘ + +6 rows in set. Elapsed: 0.008 sec +``` + +### ClickHouse Cloudにおける圧縮 + +ClickHouse Cloudでは、デフォルトで`ZSTD`圧縮アルゴリズム(デフォルト値は1)を利用しています。このアルゴリズムの圧縮速度は圧縮レベルによって異なりますが(圧縮レベルが高いほど遅くなる)、解凍が一貫して高速(約20%のばらつき)であり、並列化の恩恵を受ける能力を持っているという利点を持っています。過去のテストでは、このアルゴリズムが非常に効果的であり、`LZ4`とコーデックの組み合わせよりも優れている場合が多いことが示されています。ほとんどのデータ型と情報の分布に対して効果的であるため、一般目的のデフォルトとして理にかなっており、最初の圧縮が最適化されていなくてもすでに優れている理由です。 diff --git a/docs/ja/data-compression/compression-modes.md b/docs/ja/data-compression/compression-modes.md new file mode 100644 index 00000000000..def9e50d8a4 --- /dev/null +++ b/docs/ja/data-compression/compression-modes.md @@ -0,0 +1,51 @@ +--- +slug: /ja/data-compression/compression-modes +sidebar_position: 6 +title: 圧縮モード +description: ClickHouseのカラム圧縮モード +keywords: [圧縮, コーデック, エンコーディング, モード] +--- + +# 圧縮モード + +ClickHouseプロトコルは、チェックサム付きで**データブロック**の圧縮をサポートしています。どのモードを選ぶか迷った場合は、`LZ4`を使用してください。 + +:::tip +使用可能な[カラム圧縮コーデック](/docs/ja/sql-reference/statements/create/table.md/#column-compression-codecs)について詳しく学び、テーブル作成時またはその後に指定してください。 +::: + +## モード + +| 値 | 名前 | 説明 | +|--------|--------------------|----------------------------------------------| +| `0x02` | [None](#none-mode) | 圧縮なし、チェックサムのみ | +| `0x82` | LZ4 | 非常に高速で、良好な圧縮 | +| `0x90` | ZSTD | Zstandard、かなり高速で最良の圧縮 | + +LZ4とZSTDは同じ作者によって作られていますが、異なるトレードオフがあります。 +[Facebookのベンチマーク](https://facebook.github.io/zstd/#benchmarks)からのデータ: + +| 名前 | 比率 | エンコーディング | デコーディング | +|----------------------|-------|------------------|------------------| +| **zstd** 1.4.5 -1 | 2.8 | 500 MB/s | 1660 MB/s | +| **lz4** 1.9.2 | 2.1 | 740 MB/s | 4530 MB/s | + +## ブロック + +| フィールド | 型 | 説明 | +|-------------------|---------|--------------------------------------------------------| +| checksum | uint128 | (ヘッダー + 圧縮データ)の[ハッシュ](../native-protocol/hash.md) | +| raw_size | uint32 | ヘッダーなしの生データサイズ | +| data_size | uint32 | 非圧縮データサイズ | +| mode | byte | 圧縮モード | +| compressed_data | binary | 圧縮データのブロック | + +![圧縮ブロック図](../native-protocol/images/ch_compression_block.drawio.svg) + +ヘッダーは(raw_size + data_size + mode)で構成され、生データサイズは(ヘッダー + 圧縮データ)の長さになります。 + +チェックサムは`hash(header + compressed_data)`で、[ClickHouse CityHash](../native-protocol/hash.md)を使用しています。 + +## Noneモード + +*None*モードが使用されている場合、`compressed_data`は元のデータと同じです。圧縮を行わないモードは、チェックサムによって追加のデータ整合性を確保するのに有用であり、ハッシュ処理のオーバーヘッドはごくわずかです。 diff --git a/docs/ja/data-modeling/denormalization.md b/docs/ja/data-modeling/denormalization.md new file mode 100644 index 00000000000..c135820b382 --- /dev/null +++ b/docs/ja/data-modeling/denormalization.md @@ -0,0 +1,375 @@ +--- +slug: /ja/data-modeling/denormalization +title: データの非正規化 +description: クエリパフォーマンスを向上させるためのデータ非正規化の使用法 +keywords: [データの非正規化, 非正規化, クエリ最適化] +--- + +# データの非正規化 + +データの非正規化は、ClickHouseにおいて、テーブルを平坦化して結合を避けることでクエリ遅延を最小化する技術です。 + +## 正規化されたスキーマ vs. 非正規化されたスキーマの比較 + +データの非正規化は、特定のクエリパターンのためにデータベースパフォーマンスを最適化する目的で、意図的に正規化プロセスを逆にします。正規化されたデータベースでは、冗長性を最小化しデータ整合性を確保するために、データは複数の関連したテーブルに分割されます。非正規化は、テーブルを結合し、データを重複させ、計算されたフィールドを単一または少数のテーブルに組み込むことで冗長性を再導入します - つまり、クエリ時に結合するのではなく挿入時に結合させます。 + +このプロセスはクエリ時の複雑な結合の必要性を削減し、読み取り操作を大幅に高速化できるため、重い読み込み要求と複雑なクエリを持つアプリケーションに最適です。しかし、書き込み操作やメンテナンスの複雑さが増し、重複したデータの変更を全てのインスタンスに伝播して整合性を保つ必要があります。 + +ClickHouseにおける非正規化 + +
+ +NoSQLソリューションが普及した一般的な技術は、`JOIN`サポートがない場合にデータを非正規化して、統計や関連する行を親行にカラムやネストされたオブジェクトとして保存することです。例えば、ブログの例のスキーマでは、全ての`Comments`を該当する投稿のオブジェクトの`Array`として保存できます。 + +## 非正規化を使用するべき時 + +一般的に、以下のケースで非正規化をお勧めします: + +- 頻繁に変更されないテーブル、またはデータが分析クエリに利用可能になるまでの遅延が許容できるテーブルを非正規化します。つまり、データをバッチで完全に再ロードできます。 +- 多対多の関係を非正規化しないようにします。1つの元データ行が変更されると多くの行を更新する必要が生じる可能性があります。 +- カーディナリティが高い関係を非正規化しないようにします。テーブル内の各行が別のテーブルに数千の関連エントリを持つ場合、これらは`Array`として表現される必要があります - プリミティブタイプまたはタプルのどちらかです。通常、1000以上のタプルを持つ配列はお勧めしません。 +- 全てのカラムをネストされたオブジェクトとして非正規化するより、Materialized Viewを使用して統計のみを非正規化することを検討してください(以下参照)。 + +全ての情報を非正規化する必要はなく、頻繁にアクセスされる重要な情報のみを非正規化してください。 + +非正規化の作業はClickHouseまたは上流で処理できます。例えば、Apache Flinkを使用します。 + +## 頻繁に更新されるデータでの非正規化を避ける + +ClickHouseのために、非正規化はクエリパフォーマンスを最適化するためにユーザーが使用できるいくつかのオプションの1つですが、注意して使用する必要があります。データが頻繁に更新され、リアルタイムに近い更新が必要な場合、このアプローチは避けるべきです。メインテーブルが主に追加のみであるか、バッチとして定期的に再ロードできる場合に使用します。 + +アプローチとしては主に、書き込みパフォーマンスとデータの更新という1つの主要な課題を抱えています。具体的には、非正規化はデータの結合の責任をクエリ時からインジェスト時に効果的に移します。これによりクエリパフォーマンスが大幅に向上する一方で、インジェストを複雑にし、データパイプラインが変更された場合に行をClickHouseに再挿入する必要があります。つまり、単一の元データ行の変更は、ClickHouse内の多くの行を更新する必要があるかもしれません。複雑なスキーマで、一連の結合から構成された行がある場合、結合のネストされたコンポーネントの1行の変更は、潜在的に何百万もの行を更新しなければならないかもしれません。 + +リアルタイムでこれを達成するのは現実的でないことが多く、大きな技術的努力が必要です。その理由は2つの課題によります: + +1. テーブル行が変更されたときに適切な結合ステートメントをトリガーすることです。理想的には結合の全てのオブジェクトが更新される原因とならないようにする必要があります - 影響を受けたものだけです。高スループット下で正しい行にフィルタリングするために結合を修正し、この作業を実現するには外部ツールやエンジニアリングが必要です。 +1. ClickHouseでの行の更新には慎重な管理が必要で、追加の複雑さが導入されます。 + +
+ +したがって、すべての非正規化されたオブジェクトを定期的に再ロードするバッチ更新プロセスがより一般的です。 + +## 非正規化の実際的なケース + +非正規化が理にかなっている場合と、他の方法が望ましい場合の実際的な例をいくつか考えてみましょう。 + +既に`AnswerCount`や`CommentCount`などの統計が非正規化されている`Posts`テーブルを考えてみます。ソースデータがこの形で提供されています。実際、これは頻繁に変更される可能性が高いため、実際にはこの情報を正規化したいかもしれません。これらの多くのカラムも他のテーブルから利用可能です 例えば、投稿に対するコメントは`PostId`カラムと`Comments`テーブルを介して利用可能です。例示目的のため、投稿がバッチプロセスで再ロードされると仮定します。 + +また、分析のためのメインテーブルとして`Posts`に他のテーブルを非正規化するだけを考えます。非正規化は、同じ考慮事項が適用されるクエリのために他の方向性にも適しています。 + +*以下の各例では、どちらのテーブルも結合で使用されるクエリが存在すると想定します。* + +### Posts と Votes + +Votesは別のテーブルとして表現されています。この最適化されたスキーマは以下に示されており、データをロードするための挿入コマンドも示されています: + +```sql +CREATE TABLE votes +( + `Id` UInt32, + `PostId` Int32, + `VoteTypeId` UInt8, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `BountyAmount` UInt8 +) +ENGINE = MergeTree +ORDER BY (VoteTypeId, CreationDate, PostId) + +INSERT INTO votes SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/votes/*.parquet') + +0 rows in set. Elapsed: 26.272 sec. Processed 238.98 million rows, 2.13 GB (9.10 million rows/s., 80.97 MB/s.) +``` + +一見、これらは投稿テーブルで非正規化するための候補かもしれません。しかし、このアプローチにはいくつかの課題があります。 + +投票は頻繁に投稿に追加されます。時間が経つにつれて投稿ごとに減少するかもしれませんが、以下のクエリは、3万件の投稿に対して時間あたり約4万件の投票があることを示しています。 + +```sql +SELECT round(avg(c)) AS avg_votes_per_hr, round(avg(posts)) AS avg_posts_per_hr +FROM +( + SELECT + toStartOfHour(CreationDate) AS hr, + count() AS c, + uniq(PostId) AS posts + FROM votes + GROUP BY hr +) + +┌─avg_votes_per_hr─┬─avg_posts_per_hr─┐ +│ 41759 │ 33322 │ +└──────────────────┴──────────────────┘ +``` + +遅延が許容できる場合はバッチ処理で対策できますが、これでも更新を処理する必要があり、全ての投稿を定期的に再ロードする(望ましいとは限りません)必要があります。 + +さらに問題なのは、いくつかの投稿には非常に多くの投票があることです: + +```sql +SELECT PostId, concat('https://stackoverflow.com/questions/', PostId) AS url, count() AS c +FROM votes +GROUP BY PostId +ORDER BY c DESC +LIMIT 5 + +┌───PostId─┬─url──────────────────────────────────────────┬─────c─┐ +│ 11227902 │ https://stackoverflow.com/questions/11227902 │ 35123 │ +│ 927386 │ https://stackoverflow.com/questions/927386 │ 29090 │ +│ 11227809 │ https://stackoverflow.com/questions/11227809 │ 27475 │ +│ 927358 │ https://stackoverflow.com/questions/927358 │ 26409 │ +│ 2003515 │ https://stackoverflow.com/questions/2003515 │ 25899 │ +└──────────┴──────────────────────────────────────────────┴───────┘ +``` + +ここでの主な観察点は、各投稿の集計された投票統計がほとんどの分析には十分であるということです - 全ての投票情報を非正規化する必要はありません。例えば、現在の`Score`カラムは例えば総アップ票数と総ダウン票数の差という統計を表しています。理想的には、シンプルなルックアップでクエリ時にこれらの統計を取得できる([dictionaries](/ja/dictionary)参照)と良いでしょう。 + +### Users と Badges + +次に`Users`と`Badges`を考えてみましょう: + +UsersとBadgesのスキーマ + +

+まず以下のコマンドを使ってデータを挿入します: +

+ +```sql +CREATE TABLE users +( + `Id` Int32, + `Reputation` LowCardinality(String), + `CreationDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)), + `DisplayName` String, + `LastAccessDate` DateTime64(3, 'UTC'), + `AboutMe` String, + `Views` UInt32, + `UpVotes` UInt32, + `DownVotes` UInt32, + `WebsiteUrl` String, + `Location` LowCardinality(String), + `AccountId` Int32 +) +ENGINE = MergeTree +ORDER BY (Id, CreationDate) +``` + +```sql +CREATE TABLE badges +( + `Id` UInt32, + `UserId` Int32, + `Name` LowCardinality(String), + `Date` DateTime64(3, 'UTC'), + `Class` Enum8('Gold' = 1, 'Silver' = 2, 'Bronze' = 3), + `TagBased` Bool +) +ENGINE = MergeTree +ORDER BY UserId + +INSERT INTO users SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/users.parquet') + +0 rows in set. Elapsed: 26.229 sec. Processed 22.48 million rows, 1.36 GB (857.21 thousand rows/s., 51.99 MB/s.) + +INSERT INTO badges SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/badges.parquet') + +0 rows in set. Elapsed: 18.126 sec. Processed 51.29 million rows, 797.05 MB (2.83 million rows/s., 43.97 MB/s.) +``` + +ユーザーは頻繁にバッジを獲得する可能性がありますが、このデータセットを1日以上にわたって更新する必要はないかもしれません。バッジとユーザーの関係は一対多です。タプルのリストとしてユーザーにバッジを単純に非正規化できないでしょうか? 可能ですが、以下のクエリから確認する、ユーザーごとのバッジの最高数が理想的でないことを示唆しています: + +```sql +SELECT UserId, count() AS c FROM badges GROUP BY UserId ORDER BY c DESC LIMIT 5 + +┌─UserId─┬─────c─┐ +│ 22656 │ 19334 │ +│ 6309 │ 10516 │ +│ 100297 │ 7848 │ +│ 157882 │ 7574 │ +│ 29407 │ 6512 │ +└────────┴───────┘ +``` + +19k以上のオブジェクトを単一行に非正規化するのは現実的ではないかもしれません。 この関係は別テーブルとして残すか、統計を追加するのが良いでしょう。 + +> バッジの統計をユーザーに対して非正規化したいかもしれません。 このデータセットでの挿入時にdictionariesを使用した例を考慮しています。 + +### Posts と PostLinks + +`PostLinks`はユーザーが関連しているまたは重複していると考える`Posts`を接続します。 以下のクエリはスキーマとロードコマンドを示しています: + +```sql +CREATE TABLE postlinks +( + `Id` UInt64, + `CreationDate` DateTime64(3, 'UTC'), + `PostId` Int32, + `RelatedPostId` Int32, + `LinkTypeId` Enum('Linked' = 1, 'Duplicate' = 3) +) +ENGINE = MergeTree +ORDER BY (PostId, RelatedPostId) + +INSERT INTO postlinks SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/postlinks.parquet') + +0 rows in set. Elapsed: 4.726 sec. Processed 6.55 million rows, 129.70 MB (1.39 million rows/s., 27.44 MB/s.) +``` + +非正規化を防ぐ投稿の多くのリンクがないことを確認できます: + +```sql +SELECT PostId, count() AS c +FROM postlinks +GROUP BY PostId +ORDER BY c DESC LIMIT 5 + +┌───PostId─┬───c─┐ +│ 22937618 │ 125 │ +│ 9549780 │ 120 │ +│ 3737139 │ 109 │ +│ 18050071 │ 103 │ +│ 25889234 │ 82 │ +└──────────┴─────┘ +``` + +同様に、これらのリンクは極端に頻繁に発生するイベントではありません: + +```sql +SELECT + round(avg(c)) AS avg_votes_per_hr, + round(avg(posts)) AS avg_posts_per_hr +FROM +( + SELECT + toStartOfHour(CreationDate) AS hr, + count() AS c, + uniq(PostId) AS posts + FROM postlinks + GROUP BY hr +) + +┌─avg_votes_per_hr─┬─avg_posts_per_hr─┐ +│ 54 │ 44 │ +└──────────────────┴──────────────────┘ +``` + +これを以下の非正規化の例として使用します。 + +### シンプルな統計の例 + +ほとんどの場合、非正規化は親行に単一のカラムまたは統計を追加する必要があります。例えば、複製投稿の数で投稿を豊かにしたい場合は、単一のカラムを追加するだけです。 + +```sql +CREATE TABLE posts_with_duplicate_count +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + ... -other columns + `DuplicatePosts` UInt16 +) ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +このテーブルを埋めるために、重複統計と投稿を結合する`INSERT INTO SELECT`を利用します。 + +```sql +INSERT INTO posts_with_duplicate_count SELECT + posts.*, + DuplicatePosts +FROM posts AS posts +LEFT JOIN +( + SELECT PostId, countIf(LinkTypeId = 'Duplicate') AS DuplicatePosts + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts.Id = postlinks.PostId +``` + +### 多対一の関係に対する複雑な型の活用 + +非正規化を行うためには、複雑な型を活用する必要があることが多いです。一対一の関係が非正規化され、カラムが少ない場合、ユーザーはこれらを元の型のまま行として追加できます。しかし、より大きなオブジェクトや一対多の関係でこれは望ましくないことがあります。 + +複雑なオブジェクトや一対多の関係の場合、ユーザーは以下を使用できます: + +- 名前付きタプル - 複雑な構造を列の集合として表現します。 +- Array(Tuple) または Nested - 名前付きタプルの配列、つまりNested、各エントリがオブジェクトを表現します。一対多の関係に適用されます。 + +例として、`PostLinks`を`Posts`に非正規化する過程を示します。 + +各投稿は他の投稿へのリンクを含むことができます。以前に示した`PostLinks`スキーマとして。ネストされた型として、リンクと重複した投稿を以下のように表現することができます: + +```sql +SET flatten_nested=0 +CREATE TABLE posts_with_links +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + ... -other columns + `LinkedPosts` Nested(CreationDate DateTime64(3, 'UTC'), PostId Int32), + `DuplicatePosts` Nested(CreationDate DateTime64(3, 'UTC'), PostId Int32), +) ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +> ネストデータのフラット化を無効にする設定 `flatten_nested=0` の使用に注意してください。 ネストデータのフラット化を無効にすることを推奨しています。 + +`OUTER JOIN`クエリを使った`INSERT INTO SELECT`でこの非正規化を実行できます: + +```sql +INSERT INTO posts_with_links +SELECT + posts.*, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Linked' AND p.2 != 0, Related)) AS LinkedPosts, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Duplicate' AND p.2 != 0, Related)) AS DuplicatePosts +FROM posts +LEFT JOIN ( + SELECT + PostId, + groupArray((CreationDate, RelatedPostId, LinkTypeId)) AS Related + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts.Id = postlinks.PostId + +0 rows in set. Elapsed: 155.372 sec. Processed 66.37 million rows, 76.33 GB (427.18 thousand rows/s., 491.25 MB/s.) +Peak memory usage: 6.98 GiB. +``` + +> ここでの時間に注意してください。約2分で6600万行を非正規化することができました。後で見るように、これはスケジュールできる操作です。 + +`PostId`ごとに`PostLinks`を配列に圧縮するために`groupArray`関数を使用して結合前に行います。次にこの配列を、`LinkedPosts`と`DuplicatePosts`の2つのサブリストにフィルタリングし、外部結合からの空の結果を除外します。 + +新しい非正規化された構造を見るためにいくつかの行を選択できます: + +```sql +SELECT LinkedPosts, DuplicatePosts +FROM posts_with_links +WHERE (length(LinkedPosts) > 2) AND (length(DuplicatePosts) > 0) +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +LinkedPosts: [('2017-04-11 11:53:09.583',3404508),('2017-04-11 11:49:07.680',3922739),('2017-04-11 11:48:33.353',33058004)] +DuplicatePosts: [('2017-04-11 12:18:37.260',3922739),('2017-04-11 12:18:37.260',33058004)] +``` + +## 非正規化のオーケストレーションとスケジューリング + +### バッチ + +非正規化を利用するには、それを実行し、オーケストレーションできる変換プロセスが必要です。 + +上記で示したように、データをロードした後に`INSERT INTO SELECT`を通じてこの変換を実行できます。これは定期的なバッチ変換に適しています。 + +ユーザーは、定期的なバッチロードプロセスが許容されるものとすると、ClickHouseでこれをオーケストレーションするためのいくつかのオプションを持っています: + +- **外部ツール** - [dbt](https://www.getdbt.com/)や[Airflow](https://airflow.apache.org/)などのツールを利用して変換を定期的にスケジュールします。 [ClickHouseのdbt統合](/ja/integrations/dbt)は、ターゲットテーブルの新しいバージョンが作成され、その後原子に関連するバージョンと交換されることを保証します([EXCHANGE](/ja/sql-reference/statements/exchange)コマンドを介して)。 +- **[Refreshable Materialized Views(エクスペリメンタル)](/ja/materialized-view/refreshable-materialized-view)** - 更新可能なマテリアライズドビューは、クエリの結果がターゲットテーブルに送られるように定期的にスケジュールするために使用されます。クエリが実行されると、ビューはターゲットテーブルが原子に更新されることを保証します。これは、ClickHouseネイティブな方法でこの作業をスケジュールするものです。 + +### ストリーミング + +ユーザーは、代わりにストリーミング技術、例えば[Apache Flink](https://flink.apache.org/)を使用して、ClickHouseの外部で挿入前にこれを実行することを希望するかもしれません。代わりに、インクリメンタルな[マテリアライズドビュー](/ja/guides/developer/cascading-materialized-views)を使用して、データが挿入されるとこのプロセスを実行することができます。 diff --git a/docs/ja/data-modeling/images/denormalization-diagram.png b/docs/ja/data-modeling/images/denormalization-diagram.png new file mode 100644 index 00000000000..54e4def8d3e Binary files /dev/null and b/docs/ja/data-modeling/images/denormalization-diagram.png differ diff --git a/docs/ja/data-modeling/images/denormalization-schema.png b/docs/ja/data-modeling/images/denormalization-schema.png new file mode 100644 index 00000000000..6a1ea8703a2 Binary files /dev/null and b/docs/ja/data-modeling/images/denormalization-schema.png differ diff --git a/docs/ja/data-modeling/images/schema-design-indices.png b/docs/ja/data-modeling/images/schema-design-indices.png new file mode 100644 index 00000000000..381771653df Binary files /dev/null and b/docs/ja/data-modeling/images/schema-design-indices.png differ diff --git a/docs/ja/data-modeling/images/schema-design-types.png b/docs/ja/data-modeling/images/schema-design-types.png new file mode 100644 index 00000000000..94b3782b29d Binary files /dev/null and b/docs/ja/data-modeling/images/schema-design-types.png differ diff --git a/docs/ja/data-modeling/images/stackoverflow-schema.png b/docs/ja/data-modeling/images/stackoverflow-schema.png new file mode 100644 index 00000000000..749a2dc0c36 Binary files /dev/null and b/docs/ja/data-modeling/images/stackoverflow-schema.png differ diff --git a/docs/ja/data-modeling/schema-design.md b/docs/ja/data-modeling/schema-design.md new file mode 100644 index 00000000000..360fd0d740a --- /dev/null +++ b/docs/ja/data-modeling/schema-design.md @@ -0,0 +1,334 @@ +--- +slug: /ja/data-modeling/schema-design +title: スキーマ設計 +description: ClickHouse スキーマのクエリパフォーマンス最適化 +keywords: [スキーマ, スキーマ設計, クエリ最適化] +--- + +効果的なスキーマ設計を理解することは、ClickHouse のパフォーマンスを最適化する鍵であり、これは多くの場合トレードオフを伴う選択肢を含みます。最適なアプローチは提供されるクエリやデータの更新頻度、レイテンシ要件、データ量などの要因に依存します。このガイドでは、ClickHouse のパフォーマンスを最適化するためのスキーマ設計のベストプラクティスとデータモデリング技法の概要を提供します。 + +## Stack Overflow データセット + +このガイドの例では、Stack Overflow データセットのサブセットを使用します。これは、2008年から2024年4月まで、Stack Overflow で発生したすべての投稿、投票、ユーザー、コメント、バッジを含んでいます。このデータは、以下のスキーマを使用して Parquet フォーマットで S3 バケット `s3://datasets-documentation/stackoverflow/parquet/` にて公開されています: + +> 指定された主キーとリレーションシップは制約を通じて強制されているものではなく (Parquet はファイルフォーマットでありテーブルフォーマットではないため)、データがどのように関係しており、どのようなユニークキーを持つかを単に示しています。 + +Stack Overflow スキーマ + +
+ +Stack Overflow データセットには、いくつかの関連テーブルが含まれています。いかなるデータモデリングタスクにおいても、ユーザーはまず主テーブルのロードに集中することをお勧めします。それは必ずしも最大のテーブルである必要はありませんが、むしろあなたが最も分析クエリを受け取ると予想しているテーブルです。これにより、特に OLTP 背景から移行する場合、ClickHouse の主な概念と型に慣れることができます。このテーブルは、ClickHouse の機能を完全に活用し最適なパフォーマンスを得るために、追加のテーブルが追加されるにつれて再モデリングが必要になるかもしれません。 + +上記のスキーマは、このガイドの目的のために意図的に最適化されていません。 + +## 初期スキーマの確立 + +`posts` テーブルはほとんどの分析クエリのターゲットとなるため、このテーブルのスキーマを確立することに焦点を当てます。このデータは S3 のパブリックバケット `s3://datasets-documentation/stackoverflow/parquet/posts/*.parquet` にて年毎のファイルで提供されています。 + +> Parquet フォーマットでの S3 からデータをロードすることは、最も一般的で好ましい ClickHouse にデータをロードする方法です。ClickHouse は Parquet の処理に最適化されており、S3 から毎秒何千万もの行を読み込み、挿入することも可能です。 + +ClickHouse は、データセットの型を自動的に識別するスキーマ推論機能を提供しています。これは、Parquet を含むすべてのデータフォーマットでサポートされています。この機能を活用して、s3 テーブル関数および[`DESCRIBE`](/ja/sql-reference/statements/describe-table) コマンドを通じて ClickHouse の型を識別できます。以下では、パターン `*.parquet` を使用して `stackoverflow/parquet/posts` フォルダ内のすべてのファイルを読み取っています。 + +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') +SETTINGS describe_compact_output = 1 + +┌─name──────────────────┬─type───────────────────────────┐ +│ Id │ Nullable(Int64) │ +│ PostTypeId │ Nullable(Int64) │ +│ AcceptedAnswerId │ Nullable(Int64) │ +│ CreationDate │ Nullable(DateTime64(3, 'UTC')) │ +│ Score │ Nullable(Int64) │ +│ ViewCount │ Nullable(Int64) │ +│ Body │ Nullable(String) │ +│ OwnerUserId │ Nullable(Int64) │ +│ OwnerDisplayName │ Nullable(String) │ +│ LastEditorUserId │ Nullable(Int64) │ +│ LastEditorDisplayName │ Nullable(String) │ +│ LastEditDate │ Nullable(DateTime64(3, 'UTC')) │ +│ LastActivityDate │ Nullable(DateTime64(3, 'UTC')) │ +│ Title │ Nullable(String) │ +│ Tags │ Nullable(String) │ +│ AnswerCount │ Nullable(Int64) │ +│ CommentCount │ Nullable(Int64) │ +│ FavoriteCount │ Nullable(Int64) │ +│ ContentLicense │ Nullable(String) │ +│ ParentId │ Nullable(String) │ +│ CommunityOwnedDate │ Nullable(DateTime64(3, 'UTC')) │ +│ ClosedDate │ Nullable(DateTime64(3, 'UTC')) │ +└───────────────────────┴────────────────────────────────┘ +``` + +> [s3 テーブル関数](/ja/sql-reference/table-functions/s3)は、ClickHouse から S3 内のデータをそのままクエリすることを可能にします。この関数は、ClickHouse がサポートするすべてのファイルフォーマットと互換性があります。 + +これにより、最初の非最適化スキーマが提供されます。デフォルトでは、ClickHouse はこれらを同等の Nullable 型にマッピングします。この型を使用して、簡単な `CREATE EMPTY AS SELECT` コマンドで ClickHouse テーブルを作成できます。 + +```sql +CREATE TABLE posts +ENGINE = MergeTree +ORDER BY () EMPTY AS +SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') +``` + +いくつかの重要な点: + +このコマンドを実行した後、私たちの posts テーブルは空です。データはロードされていません。 +MergeTree をテーブルエンジンとして指定しています。MergeTree はおそらくあなたが最も使用する ClickHouse テーブルエンジンです。これは、鉅大なデータの処理が可能な ClickHouse ボックス内の万能ツールであり、ほとんどの分析ユースケースに対応します。他のテーブルエンジンは、効率的な更新をサポートする必要がある CDC などのユースケースに存在します。 + +句 `ORDER BY ()` はインデックスがなく、より具体的にはデータに順序がないことを意味します。これについては後ほど詳細に説明しますが、今はすべてのクエリが線形スキャンを必要とすることを知っておいてください。 + +テーブルが作成されたことを確認するには: + +```sql +SHOW CREATE TABLE posts + +CREATE TABLE posts +( + `Id` Nullable(Int64), + `PostTypeId` Nullable(Int64), + `AcceptedAnswerId` Nullable(Int64), + `CreationDate` Nullable(DateTime64(3, 'UTC')), + `Score` Nullable(Int64), + `ViewCount` Nullable(Int64), + `Body` Nullable(String), + `OwnerUserId` Nullable(Int64), + `OwnerDisplayName` Nullable(String), + `LastEditorUserId` Nullable(Int64), + `LastEditorDisplayName` Nullable(String), + `LastEditDate` Nullable(DateTime64(3, 'UTC')), + `LastActivityDate` Nullable(DateTime64(3, 'UTC')), + `Title` Nullable(String), + `Tags` Nullable(String), + `AnswerCount` Nullable(Int64), + `CommentCount` Nullable(Int64), + `FavoriteCount` Nullable(Int64), + `ContentLicense` Nullable(String), + `ParentId` Nullable(String), + `CommunityOwnedDate` Nullable(DateTime64(3, 'UTC')), + `ClosedDate` Nullable(DateTime64(3, 'UTC')) +) +ENGINE = MergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') +ORDER BY tuple() +``` + +初期スキーマが定義されたら、s3 テーブル関数を使用してデータを読み取り、`INSERT INTO SELECT` を使用してデータを投入することができます。以下の例では、8コアの ClickHouse Cloud インスタンスで約2分で `posts` データをロードします。 + +```sql +INSERT INTO posts SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 148.140 sec. Processed 59.82 million rows, 38.07 GB (403.80 thousand rows/s., 257.00 MB/s.) +``` + +> 上記のクエリは 60m 行をロードします。ClickHouse にとって小規模のデータですが、インターネット接続が遅いユーザーはデータのサブセットをロードしたい場合があるでしょう。これはパターン e.g. `https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/2008.parquet` または `https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/{2008, 2009}.parquet` を指定することで実現できます。パターンを使ってターゲットファイルのサブセットを指定する方法については[こちら](/ja/sql-reference/table-functions/file#globs-in-path)を参照してください。 + +## 型の最適化 + +ClickHouse クエリパフォーマンスの秘密のひとつは圧縮です。 + +ディスク上のデータが少ないほど、I/O が減り、クエリや挿入が高速になります。CPU に関しては、いかなる圧縮アルゴリズムのオーバーヘッドも I/O の削減によってほとんどの場合上回るでしょう。そのため、ClickHouse クエリが速いことを保証する際には、最初にデータの圧縮を向上することを第一の課題にすべきです。 + +> ClickHouse がデータを非常に効率よく圧縮する理由については、[こちらの記事](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema) をお勧めします。要約すると、列指向データベースであるため、値はカラム順に書き込まれます。これらの値が並べ替えられると、同一の値が隣接して書き込まれ、圧縮アルゴリズムは連続したデータパターンを利用します。これに加えて、ClickHouse にはコーデックや精密なデータ型があり、ユーザーが圧縮技術をさらに調整することが可能です。 + +ClickHouse での圧縮は、3つの主要な要因によって影響を受けます:オーダリングキー、データ型、および使用するコーデック。これらはすべてスキーマを通じて設定されます。 + +最初の大きな圧縮とクエリパフォーマンスの改善は、単純な型最適化のプロセスを通じて得られます。いくつかの簡単なルールを適用することでスキーマを最適化できます: + +- **厳密な型を使用する** - 我々の初期スキーマは多くのカラムで文字列型を使用していますが、これらは明らかに数値です。そのため、適切な型を使用することで、フィルタリングや集計時に期待される意味論を確保できます。同じことが、Parquet ファイルで正しく提供されている日付型にも当てはまります。 +- **Nullable カラムの回避** - 上記のカラムはデフォルトで Null と仮定されています。Nullable 型はクエリが空値と Null 値を区別することを可能にしますが、これにより UInt8 型の別のカラムが作成されます。この追加のカラムは、ユーザーが Nullable カラムを操作するたびに処理される必要があり、追加のストレージが使用され、ほぼ常にクエリパフォーマンスに悪影響を与えます。型のデフォルトの空の値と Null との違いがある場合に限り、Nullable を使用してください。例えば、`ViewCount` カラムの空の値に対して 0 を扱うことは、ほとんどのクエリで問題なく影響を与えない可能性があります。空の値が異なる扱いを必要とする場合、フィルタリングでしばしばクエリから除外することができます。 +- **数値型の最小精度を使用する** - ClickHouse には、異なる数値範囲と精度に合わせた数多くの数値型があります。常にカラムを表すのに使用されるビット数を最小化することを心がけてください。例えば、より小さなビット数の整数など e.g. Int16 に加え、負でないバリアントをサポートし、最小値が 0 の無符号型が存在します。これにより、カラムに使用するビット数を減らすことができます。可能であれば、これらの型を大きな無符号バリアントより優先させるべきです。 +- **日付型の最小精度** - ClickHouse は、いくつかの日付および日時型をサポートしています。Date と Date32 は純粋な日付の保存に使用でき、後者はより大きな日付範囲をサポートしますが、より多くのビットを使用します。DateTime および DateTime64 は日時のサポートを提供します。DateTime は秒単位の精度に制限されており、32 ビットを使用します。DateTime64 はその名の通り 64 ビットを使用しますがナノ秒単位までの精度を提供します。常にクエリに必要な最も粗いバージョンを選び、必要なビット数を最小化してください。 +- **LowCardinality の使用** - 低数のユニーク値を持つ数値、文字列、DateまたはDateTimeカラムは、LowCardinality 型を使用してエンコードできる可能性があります。これは値をディクショナリエンコードしてディスク上のサイズを減少させます。1万未満のユニーク値を持つカラムに対してこれを考慮してください。 +固定長文字列を特別なケースで使用 - 固定長の文字列は FixedString 型でエンコードすることができます、例えば言語や通貨コード。この種のエンコーディングはデータが正確に N バイトの長さを持つ時に効率的です。その他の場合においては、効率を低下させる可能性があり、LowCardinality が推奨されます。 +- **データ検証に対する列挙型の利用** - Enum 型は列挙型を効率的にエンコードするために使用することができます。Enum はユニークな値を格納する必要に応じて 8 ビットまたは 16 ビットになり得ます。この型の利用を検討する際には、登録されていない値を挿入時に拒否する関連検証を必要とする場合や列挙された値に自然な順序があり、クエリのパフォーマンスを向上させる場合などを考慮してください。例として、ユーザーのフィードバックカラムが `Enum(':(' = 1, ':|' = 2, ':)' = 3)` を含む場合が挙げられます。 + +> ヒント: すべてのカラムの範囲およびユニーク値の数を見つけるには、ユーザーは簡単なクエリ `SELECT * APPLY min, * APPLY max, * APPLY uniq FROM table FORMAT Vertical` を使用できます。これはデータの小さなサブセットに対しての実行をお勧めします、というのもこのクエリは高負荷になる可能性があるためです。このクエリが数値を正確に特定するためには、少なくとも定義が必要です。これは文字列でないことを意味します。 + +これらの単純なルールを posts テーブルに適用することにより、各カラムの最適な型を特定することができます: + +Stack Overflow スキーマ + +
+ +上記を元に以下のスキーマが示されます: + +```sql +CREATE TABLE posts_v2 +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense`LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY tuple() +COMMENT 'Optimized types' +``` + +これは前のテーブルから新しいテーブルへデータを読み込んで、この新しいテーブルに挿入することで埋めることができます: + +```sql +INSERT INTO posts_v2 SELECT * FROM posts + +0 rows in set. Elapsed: 146.471 sec. Processed 59.82 million rows, 83.82 GB (408.40 thousand rows/s., 572.25 MB/s.) +``` + +新しいスキーマでは、もはや null 値を保持しません。上記の挿入では、暗黙のうちにそれぞれの型に対するデフォルトの値に null 値を変換します - 整数の場合は 0、文字列の場合は空の値となります。ClickHouse はまた、あらゆる数値を目的の精度に自動的に変換します。 +ClickHouse における主キー (オーダリングキー) +OLTP データベースから来たユーザーは、ClickHouse にある同等の概念を探すことがよくあります。 + +## オーダリングキーの選択 + +ClickHouse が一般的に使用されるスケールでは、メモリとディスクの効率が非常に重要です。データは ClickHouse テーブルにチャンクとして書き込まれ、このチャンクはパートとして知られ、背景でパートを統合するためのルールが適用されます。ClickHouse では、各パートにはそれ自体の主インデックスがあります。複数のパートが統合されると、統合されたパートの主インデックスも統合されます。パートの主インデックスは、行のグループごとに1つのインデックスエントリを持っています - この技法はスペースインデクシングと呼ばれます。 + +ClickHouse におけるスペースインデクシング + +
+ +ClickHouse で選択されたキーは、インデックスだけでなく、ディスク上にデータが書き込まれる順序を決定します。このため、これはクエリパフォーマンスに影響を与える圧縮レベルに大きな影響を及ぼす可能性があります。ほとんどのカラムの値が連続した順序で書き込まれる注文キーは、選択された圧縮アルゴリズム (およびコーデック) がデータをより効果的に圧縮できるようにします。 + +> テーブル内のすべてのカラムは、オーダリングキーとして指定されたカラムの値に基づいてソートされます。キ自体に含まれているかどうかは問わず、すべてがソートされます。例えば、`CreationDate` がキーとして使用される場合、その他すべてのカラムの値の順序は `CreationDate` カラムの値の順序に対応します。複数のオーダリングキーを指定することが可能です - これは `SELECT` クエリで `ORDER BY` 句を使用する際の同じセマンティクスでソートします。 + +オーダリングキーを選択する際に簡単なルールを適用できます。以下は時には衝突することがありますので、順番に検討してください。これにより、プロセスからいくつかのキーを特定することができ、通常4-5つで十分です: + +- 一般的なフィルタと一致するカラムを選択してください。カラムが `WHERE` 句によく使用される場合、優先順位付けし、使用頻度が少ないものよりもこれをキーに含めてください。 +- フィルタリング時に全体の行の大部分を除外するのに役立つカラムを好んで選択してください、これは読み取る必要のあるデータ量を減少させます。 +- テーブル内の他のカラムと非常に相関するカラムを好んで選択してください。これにより、これらの値が連続して保存されることを保証し、圧縮を改善します。 +`GROUP BY` 及び `ORDER BY` 演算はキー内のカラムに対して行うことでよりメモリ効率を高めることができます。 + +オーダリングキーのサブセットを特定する際には、カラムを特定の順序で宣言してください。この順序はクエリの副次キーにおけるフィルタリングの効率性とテーブルのデータファイルの圧縮比率の両方にかなり影響を与えることがあります。一般的には、カーディナリティの昇順でキーを順序づけるのが最適です。これは、キー内の要素の順序がフィルタリングが効率的であることをバランス良く求めることになります。これらの動作をバランスよく取り入れて、アクセスパターンを考慮し(そしてもっと重要なことに異なる要因をテストしましょう)。 + +### 例 + +上記のガイドラインを `posts` テーブルに適用すると、例えば、利用者が日付および投稿タイプでフィルタリングして分析を行いたいと仮定します: + +「直近3ヶ月で最もコメントされた質問はどれですか」。 + +この質問のクエリは、オーダリングキーを持たない `posts_v2` テーブルで型を最適化したものを使用すると次のようになります: + +``` +SELECT + Id, + Title, + CommentCount +FROM posts_v2 +WHERE (CreationDate >= '2024-01-01') AND (PostTypeId = 'Question') +ORDER BY CommentCount DESC +LIMIT 3 + +┌───────Id─┬─Title─────────────────────────────────────────────────────────────┬─CommentCount─┐ +│ 78203063 │ How to avoid default initialization of objects in std::vector? │ 74 │ +│ 78183948 │ About memory barrier │ 52 │ +│ 77900279 │ Speed Test for Buffer Alignment: IBM's PowerPC results vs. my CPU │ 49 │ +└──────────┴───────────────────────────────────────────────────────────────────┴────────────── + +10 rows in set. Elapsed: 0.070 sec. Processed 59.82 million rows, 569.21 MB (852.55 million rows/s., 8.11 GB/s.) +Peak memory usage: 429.38 MiB. +``` + +> ここではクエリがとても高速です、すべての 60m 行が線形スキャンされているにもかかわらず - ClickHouse はただ速いので :) オーダリングキーが TB や PB スケールで価値があると信じてください! + +`PostTypeId` と `CreationDate` をオーダリングキーとして選択しましょう。 + +おそらく私たちの場合、ユーザーは常に `PostTypeId` でフィルタリングすると予想されます。これはカーディナリティが 8 であり、オーダリングキーの最初のエントリとして論理的な選択肢です。日付の粒度のフィルタリングが十分であると認識されるので (それは依然として datetime フィルターの利益を得ます) `toDate(CreationDate)` をキーの2番目の要素として使用します。これにより小さなインデックスも生成され、日付は16で表されることができ、フィルタリングを高速化します。我々の最終キーエントリは `CommentCount` で、最も多くコメントされた投稿を見つけるのを手助けします (最終ソート)。 + +```sql +CREATE TABLE posts_v3 +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +COMMENT 'オーダリングキー' + +--既存のテーブルからテーブルを埋める + +INSERT INTO posts_v3 SELECT * FROM posts_v2 + +0 rows in set. Elapsed: 158.074 sec. Processed 59.82 million rows, 76.21 GB (378.42 thousand rows/s., 482.14 MB/s.) +Peak memory usage: 6.41 GiB. + + +以前のクエリに比べ、クエリ応答時間が3倍以上改善されます: + +SELECT + Id, + Title, + CommentCount +FROM posts_v3 +WHERE (CreationDate >= '2024-01-01') AND (PostTypeId = 'Question') +ORDER BY CommentCount DESC +LIMIT 3 + +10 rows in set. Elapsed: 0.020 sec. Processed 290.09 thousand rows, 21.03 MB (14.65 million rows/s., 1.06 GB/s.) +``` + +特定の型と適切なオーダリングキーを使用することによって達成される圧縮の改善に関心を持つユーザーは、[ClickHouse における圧縮](/ja/data-compression/compression-in-clickhouse) を参照してください。ユーザーが圧縮をさらに改善する必要がある場合、[適切なカラム圧縮コーデックの選択](/ja/data-compression/compression-in-clickhouse#choosing-the-right-column-compression-codec)セクションをお勧めします。 + +## 次へ: データモデリング技法 + +ここまで、私たちは単一のテーブルのみを移行しました。これにより ClickHouse の基本的な概念を紹介することができましたが、残念ながら大半のスキーマはこれほど単純ではありません。 + +以下の一覧の他のガイドでは、最適な ClickHouse クエリのためにスキーマ全体を再構築するためのいくつかの技術を探求します。このプロセスを通じて、`Posts` をほとんどの分析クエリが実行される中心的なテーブルとして維持することを目指します。他のテーブルも独自にクエリすることが可能ですが、我々はほとんどの分析が `posts` を文脈としたものとして実行されることを想定しています。 + +> このセクションを通じて、他のテーブルの最適化されたバリアントを使用します。これらのスキーマは提供しますが、簡潔にするために行われた決定は省略します。これらは前述のルールに基づき、読者に決定を推測することを任せています。 + +次のアプローチはいずれも、読み取りとクエリパフォーマンスを最適化するために JOIN を使用する必要性を最小限に抑えることを目的としています。ClickHouse では JOIN が完全にサポートされていますが、最適なパフォーマンスを達成するためには、JOIN の使用を控えめにすることをお勧めします(JOIN クエリ内で2〜3テーブルにするのが理想です)。 + +> ClickHouse には外部キーの概念がありません。これは結合を禁止するものではありませんが、参照整合性はユーザーがアプリケーションレベルで管理する必要があることを意味します。ClickHouse のような OLAP システムでは、データの整合性は通常、データベース自体ではなくアプリケーションレベルやデータ取り込みプロセスで管理されます。これにより柔軟性が向上し、高速のデータ挿入が可能になります。このアプローチにより、非常に大きなデータセットでの読み取りと挿入クエリの速度とスケーラビリティに重点を置く ClickHouse の利点が最大化されます。 + +ユーザーがクエリ時に JOIN の使用を最小限に抑えるために、以下のツール/アプローチがあります: + +- [**データの非正規化**](/ja/data-modeling/denormalization) - テーブルを組み合わせ、非1:1リレーションシップのために複合型を使用して、データを非正規化します。これには多くの場合、クエリ時間から挿入時間への結合の移動が含まれます。 +- [**ディクショナリ**](/ja/dictionary) - 直接結合およびキー値ルックアップを扱うための ClickHouse 固有の機能。 +- [**インクリメンタルマテリアライズドビュー**](/ja/materialized-view) - 計算のコストをクエリ時間から挿入時間にシフトするための ClickHouse の機能。集計値をインクリメンタルに計算する能力を含みます。 +- [**リフレッシャブルマテリアライズドビュー**](/ja/materialized-view/refreshable-materialized-view) - 他のデータベース製品で使用されるマテリアライズドビューと似ており、クエリの結果を定期的に計算し、結果をキャッシュすることが可能です。 + +これらのアプローチを各ガイドで探求し、Stack Overflow データセットの質問を解決するためにこれを適用する方法を例示する際にどれが適切かを強調します。 diff --git a/docs/ja/deployment-guides/horizontal-scaling.md b/docs/ja/deployment-guides/horizontal-scaling.md new file mode 100644 index 00000000000..f618f5b0be4 --- /dev/null +++ b/docs/ja/deployment-guides/horizontal-scaling.md @@ -0,0 +1,468 @@ +--- +slug: /ja/architecture/horizontal-scaling +sidebar_label: 水平拡張 +sidebar_position: 10 +title: 水平拡張 +--- +import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; +import ConfigFileNote from '@site/docs/ja/_snippets/_config-files.md'; + +## 概要 +この例のアーキテクチャは、スケーラビリティを提供するように設計されています。こちらには3つのノードが含まれています:2つのClickHouseとコーディネーション(ClickHouse Keeper)サーバーが組み合わさったもの、およびこのクォーラムを完成させるためのClickHouse Keeperのみを持つ3番目のサーバーです。この例を使用して、データベース、テーブル、および2つのノードの両方でデータをクエリできる分散テーブルを作成します。 + +## レベル: 基本 + + + +## 環境 +### アーキテクチャ図 +![2シャードと1レプリカのアーキテクチャ図](@site/docs/ja/deployment-guides/images/scaling-out-1.png) + +|ノード|説明| +|----|-----------| +|chnode1|データ + ClickHouse Keeper| +|chnode2|データ + ClickHouse Keeper| +|chnode3|ClickHouse Keeperクォーラムに使用| + +:::note +本番環境では、ClickHouse Keeperを専用ホストで実行することを強くお勧めします。この基本構成では、ClickHouse Serverプロセス内でKeeper機能を実行しています。ClickHouse Keeperをスタンドアロンでデプロイする手順は、[インストールドキュメント](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper)で確認できます。 +::: + +## インストール + +3つのサーバーにClickhouseをインストールし、[アーカイブタイプごとの手順](/docs/ja/getting-started/install.md/#available-installation-options) (.deb, .rpm, .tar.gzなど) に従ってください。この例では、3台のマシンすべてにClickHouse ServerとClientのインストール手順に従います。 + +## 設定ファイルの編集 + + + +## chnode1の設定 + +chnode1には、5つの設定ファイルがあります。これらのファイルを1つのファイルにまとめることもできますが、ドキュメント内で個別に見る方が明確かもしれません。設定ファイルを読み進めると、chnode1とchnode2のほとんどの設定が同じであることがわかります。一部の違いは強調されます。 + +### ネットワークとログ設定 + +これらの値は、お好みでカスタマイズできます。この例の設定は、1000Mで3回ロールオーバーするデバッグログを提供します。ClickHouseはIPv4ネットワークでポート8123と9000でリッスンし、インターサーバー通信にポート9009を使用します。 + +```xml title="network-and-logging.xml on chnode1" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + clickhouse + 0.0.0.0 + 8123 + 9000 + 9009 + +``` + +### ClickHouse Keeper設定 + +ClickHouse Keeperは、データレプリケーションと分散DDLクエリの実行のためのコーディネーションシステムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。この設定では、ポート9181でClickHouse Keeperを有効にします。強調表示されている行は、Keeperのインスタンスに`server_id`を1としていることを示しています。この`enable-keeper.xml`ファイルの違いは3つのサーバーすべてでこれだけです。`chnode2`では`server_id`は`2`に設定され、`chnode3`では`server_id`は`3`に設定されます。raft構成セクションは3つのサーバーすべてで同じであり、下記に強調されて、`server_id`とraft構成内の`server`インスタンスの関係を示します。 + +:::note +何らかの理由でKeeperノードが交換または再構築された場合、既存の`server_id`を再利用しないでください。例えば、`server_id`が`2`であるKeeperノードが再構築された場合は、`server_id`を`4`以上にしてください。 +::: + +```xml title="enable-keeper.xml on chnode1" + + + 9181 + # highlight-next-line + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + # highlight-start + + 1 + chnode1 + 9234 + + # highlight-end + + 2 + chnode2 + 9234 + + + 3 + chnode3 + 9234 + + + + +``` + +### マクロ設定 + +マクロ`shard`と`replica`により、分散DDLの複雑さが軽減されます。設定された値はDDLクエリ内で自動的に置き換えられるため、DDLを簡素化できます。この設定のマクロは、各ノードのシャードとレプリカ番号を指定します。この2シャード1レプリカの例では、レプリカマクロはchnode1とchnode2の両方で`replica_1`に設定されています。シャードマクロはchnode1では`1`、chnode2では`2`です。 + +```xml title="macros.xml on chnode1" + + + # highlight-next-line + 1 + replica_1 + + +``` + +### レプリケーションとシャーディング設定 + +以下の設定の大まかな概要です: +- XMLの`remote_servers`セクションは、環境内の各クラスターを指定します。属性`replace=true`は、デフォルトのClickHouse設定のサンプル`remote_servers`をこのファイルで指定された`remote_servers`設定で置き換えます。この属性がない場合、このファイル内のリモートサーバーはデフォルトのサンプルリストに追加されます。 +- この例では、1つのクラスターが`cluster_2S_1R`という名前で存在します。 +- クラスター`cluster_2S_1R`のためのシークレットが`mysecretphrase`という値で作成されます。環境内のすべてのリモートサーバー間でシークレットが共有され、正しいサーバーが一緒に結合されることを保証します。 +- クラスター`cluster_2S_1R`には2つのシャードがあり、それぞれのシャードに1つのレプリカがあります。文書の冒頭近くのアーキテクチャ図を見て、以下のXMLの2つの`shard`定義と比較してください。各シャード定義には1つのレプリカがあります。レプリカは特定のシャード用です。レプリカのホストとポートが指定されています。最初のシャードの設定のレプリカは`chnode1`に保存され、2番目のシャードの設定のレプリカは`chnode2`に保存されます。 +- シャードの内部レプリケーションはtrueに設定されています。各シャードは設定ファイルで`internal_replication`パラメーターを定義することができ、このパラメーターがtrueに設定されている場合、書き込み操作は最初の正常なレプリカを選択し、データを書き込みます。 + +```xml title="remote-servers.xml on chnode1" + + + + mysecretphrase + + true + + chnode1 + 9000 + + + + true + + chnode2 + 9000 + + + + + +``` + +### Keeperの使用設定 + +上でClickHouse Keeperが設定されました。この設定ファイル`use-keeper.xml`は、レプリケーションと分散DDLのコーディネーションのためにClickHouse ServerがClickHouse Keeperを使用する設定を行っています。このファイルは、ClickHouse Serverがポート9181でchnode1から3のKeeperを使用するように指定しており、ファイルは`chnode1`と`chnode2`で同じです。 + +```xml title="use-keeper.xml on chnode1" + + + + chnode1 + 9181 + + + chnode2 + 9181 + + + chnode3 + 9181 + + + +``` + +## chnode2の設定 + +chnode1とchnode2の設定は非常に似ているため、ここでは違いのみを指摘します。 + +### ネットワークとログ設定 + +```xml title="network-and-logging.xml on chnode2" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + clickhouse + 0.0.0.0 + 8123 + 9000 + 9009 + +``` + +### ClickHouse Keeper設定 + +このファイルにはchnode1とchnode2の違いの一つが含まれています。Keeperの設定で`server_id`が`2`に設定されています。 + +```xml title="enable-keeper.xml on chnode2" + + + 9181 + # highlight-next-line + 2 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + chnode1 + 9234 + + # highlight-start + + 2 + chnode2 + 9234 + + # highlight-end + + 3 + chnode3 + 9234 + + + + +``` + +### マクロ設定 + +マクロ設定にはchnode1とchnode2の違いの一つがあります。`shard`はこのノードでは`2`に設定されています。 + +```xml title="macros.xml on chnode2" + + + # highlight-next-line + 2 + replica_1 + + +``` + +### レプリケーションとシャーディング設定 + +```xml title="remote-servers.xml on chnode2" + + + + mysecretphrase + + true + + chnode1 + 9000 + + + + true + + chnode2 + 9000 + + + + + +``` + +### Keeperの使用設定 + +```xml title="use-keeper.xml on chnode2" + + + + chnode1 + 9181 + + + chnode2 + 9181 + + + chnode3 + 9181 + + + +``` + +## chnode3の設定 + +chnode3はデータを保存せず、ClickHouse Keeperがクォーラムの3番目のノードを提供するために使用されているため、chnode3には、ネットワークとログを設定するファイルとClickHouse Keeperを設定するファイルの2つの設定ファイルのみがあります。 + +### ネットワークとログ設定 + +```xml title="network-and-logging.xml on chnode3" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + clickhouse + 0.0.0.0 + 8123 + 9000 + 9009 + +``` + +### ClickHouse Keeper設定 + +```xml title="enable-keeper.xml on chnode3" + + + 9181 + # highlight-next-line + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + chnode1 + 9234 + + + 2 + chnode2 + 9234 + + # highlight-start + + 3 + chnode3 + 9234 + + # highlight-end + + + +``` + +## テスト + +1. `chnode1`に接続し、上で設定されたクラスター`cluster_2S_1R`が存在することを確認します。 +```sql +SHOW CLUSTERS +``` +```response +┌─cluster───────┐ +│ cluster_2S_1R │ +└───────────────┘ +``` + +2. クラスター上にデータベースを作成します。 +```sql +CREATE DATABASE db1 ON CLUSTER cluster_2S_1R +``` +```response +┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2 │ 9000 │ 0 │ │ 1 │ 0 │ +│ chnode1 │ 9000 │ 0 │ │ 0 │ 0 │ +└─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +3. クラスター上にMergeTreeテーブルエンジンを使用したテーブルを作成します。 +:::note +テーブルエンジンのパラメーターを指定する必要はありません。これらはマクロに基づいて自動的に定義されます。 +::: + +```sql +CREATE TABLE db1.table1 ON CLUSTER cluster_2S_1R +( + `id` UInt64, + `column1` String +) +ENGINE = MergeTree +ORDER BY id +``` +```response +┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode1 │ 9000 │ 0 │ │ 1 │ 0 │ +│ chnode2 │ 9000 │ 0 │ │ 0 │ 0 │ +└─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +4. `chnode1`に接続して1行を挿入します。 +```sql +INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); +``` + +5. `chnode2`に接続して1行を挿入します。 + +```sql +INSERT INTO db1.table1 (id, column1) VALUES (2, 'def'); +``` + +6. `chnode1`または`chnode2`のどちらかに接続し、そのノードのテーブルに挿入された行のみが表示されることを確認します。 +例えば、`chnode2`で +```sql +SELECT * FROM db1.table1; +``` +```response +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +``` + +7. 両方のノードで両方のシャードをクエリする分散テーブルを作成します。 +(この例では、`rand()`関数をシャーディングキーとして設定し、各挿入をランダムに分散させます) +```sql +CREATE TABLE db1.table1_dist ON CLUSTER cluster_2S_1R +( + `id` UInt64, + `column1` String +) +ENGINE = Distributed('cluster_2S_1R', 'db1', 'table1', rand()) +``` +```response +┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2 │ 9000 │ 0 │ │ 1 │ 0 │ +│ chnode1 │ 9000 │ 0 │ │ 0 │ 0 │ +└─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +8. `chnode1`または`chnode2`に接続し、両方の行を確認するために分散テーブルをクエリします。 +``` +SELECT * FROM db1.table1_dist; +``` +```reponse +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +``` + +## さらに詳しい情報: + +- [分散テーブルエンジン](/docs/ja/engines/table-engines/special/distributed.md) +- [ClickHouse Keeper](/docs/ja/guides/sre/keeper/index.md) diff --git a/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.excalidraw b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.excalidraw new file mode 100644 index 00000000000..0e77b31365f --- /dev/null +++ b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.excalidraw @@ -0,0 +1,1796 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 1113, + "versionNonce": 1012871836, + "isDeleted": false, + "id": "6bX_E24wLaoVkuQUL49rE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 902.74609375, + "y": 414.8828125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 361.0546875, + "seed": 1554965524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617310939, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1557, + "versionNonce": 1146325476, + "isDeleted": false, + "id": "YNTKiIr_dIR3MH3HkfcRz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.38671875, + "y": 856.23046875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 1654017836, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 367, + "versionNonce": 1127866140, + "isDeleted": false, + "id": "FvPf0x839jBfeRK1Oi7VH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 924.2421875, + "y": 420.765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 120.98332977294922, + "height": 25, + "seed": 892344108, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + } + ], + "updated": 1680617361728, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-01", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-01", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 683, + "versionNonce": 1514646684, + "isDeleted": false, + "id": "ZImh9dDrhSU9bFSj4RyVP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 798.19921875, + "y": 863.02734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.1999969482422, + "height": 25, + "seed": 1947896212, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + } + ], + "updated": 1680617399915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-keeper-01", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-keeper-01", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1118, + "versionNonce": 1736358052, + "isDeleted": false, + "id": "KSZ6WPivPmlFfEae7MOmZ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 930.76171875, + "y": 462.62890625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 283.26953125, + "seed": 115425684, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1680617289086, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 367, + "versionNonce": 254095524, + "isDeleted": false, + "id": "zJgfnGBoFA0_lAsCwa7ok", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 964.75, + "y": 476.84765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 146.78334045410156, + "height": 25, + "seed": 1140609452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617275111, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_1S_2R", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_1S_2R", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1264, + "versionNonce": 174543772, + "isDeleted": false, + "id": "GJLXUfVbLlM2wK6poU-QC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 948.9453125, + "y": 523.5546875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 205.06249999999994, + "seed": 1173090068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617272029, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 866, + "versionNonce": 1843075100, + "isDeleted": false, + "id": "ftuuNibnMRnfPHFUpjZwu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 973.640625, + "y": 574.84375, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 130.546875, + "seed": 1381841964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + } + ], + "updated": 1680617236476, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 835, + "versionNonce": 110602204, + "isDeleted": false, + "id": "f0u6srndZkKL_EodskHfD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 805.7578125, + "y": 910.84765625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 162401964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 640, + "versionNonce": 152748068, + "isDeleted": false, + "id": "mY3bL5nc3pLNDLQ051PJm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 835.640625, + "y": 929.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.10000610351562, + "height": 25, + "seed": 989889044, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1680616542430, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 836, + "versionNonce": 39439644, + "isDeleted": false, + "id": "vUZRMf0MD0fkmVVh5EFbT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 998.5625, + "y": 637.43359375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 94517780, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hYeY6OHHfBb0xSadzrIUO", + "type": "arrow" + }, + { + "id": "uzhB9dcVibDhLKTA43AqJ", + "type": "arrow" + } + ], + "updated": 1680617100682, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 610, + "versionNonce": 1849252380, + "isDeleted": false, + "id": "8Uy6RO4B05r0YaoY6xozj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1011.875, + "y": 647.30078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 56.41666793823242, + "height": 25, + "seed": 1212490028, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617142629, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 525, + "versionNonce": 867028636, + "isDeleted": false, + "id": "CRUfTbXb5AainVI-px46P", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 964.71484375, + "y": 527.5234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 143.8333282470703, + "height": 25, + "seed": 586798996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617241195, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica1", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 588, + "versionNonce": 11332900, + "isDeleted": false, + "id": "jHqW0NK5gsCGvLnYvHCx6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 992.9453125, + "y": 584.51953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.96666717529297, + "height": 25, + "seed": 65018796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617230665, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1774, + "versionNonce": 343666332, + "isDeleted": false, + "id": "3TaKvrFaS02XpN5DtDPRI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1135.3515625, + "y": 243.8984375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 131.59375, + "height": 70.859375, + "seed": 4729388, + "groupIds": [ + "q2JYxHDMqBGnppLd-e_zx" + ], + "roundness": null, + "boundElements": [ + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1680617339653, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 401, + "versionNonce": 1953814820, + "isDeleted": false, + "id": "VL9EHZ6BBa0MzyG_Ul-8O", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1168.78515625, + "y": 263.09375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 51.25, + "height": 25, + "seed": 1746995884, + "groupIds": [ + "q2JYxHDMqBGnppLd-e_zx" + ], + "roundness": null, + "boundElements": [], + "updated": 1680617339653, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "client", + "lineHeight": 1.25 + }, + { + "type": "arrow", + "version": 875, + "versionNonce": 540882972, + "isDeleted": false, + "id": "jbZVPsflGswjF3TO0mtkh", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1155.583501385608, + "y": 318.25390625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 136.72767491982881, + "height": 96.68672591477593, + "seed": 679203860, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617327380, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": -0.08180572844618887, + "gap": 3.49609375 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -136.72767491982881, + 96.68672591477593 + ] + ] + }, + { + "type": "rectangle", + "version": 1625, + "versionNonce": 255595612, + "isDeleted": false, + "id": "_NgRKPWWRBMhWmORFbqfG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1074.103515625, + "y": 853.1796875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 549292591, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + }, + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 726, + "versionNonce": 268977692, + "isDeleted": false, + "id": "Pw_o-YfuyZUoUg14Bk9B9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1103.5625, + "y": 875.25, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 199.01666259765625, + "height": 25, + "seed": 304529441, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617409398, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-keeper-02", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-keeper-02", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 985, + "versionNonce": 834101988, + "isDeleted": false, + "id": "LCD1WmlJ4y-REz1dTpJ9Q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1092.140625, + "y": 912.42578125, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1815246127, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 713, + "versionNonce": 1328207388, + "isDeleted": false, + "id": "oVA_VcnjylIcDRkS4Umwt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1111.875, + "y": 934.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.10000610351562, + "height": 25, + "seed": 1269328577, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "MJUWDY2EZev-CXvdwbrqg", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1680616542431, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1722, + "versionNonce": 974218852, + "isDeleted": false, + "id": "yu32XFDVxjsltOILQkLVA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1365.177734375, + "y": 855.53515625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 63815567, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 828, + "versionNonce": 126603164, + "isDeleted": false, + "id": "Vx1u3JBG4wFPZTH61H34k", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1394.63671875, + "y": 877.60546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 198.39999389648438, + "height": 25, + "seed": 949683425, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617418925, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-keeper-03", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-keeper-03", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1037, + "versionNonce": 1063188964, + "isDeleted": false, + "id": "TkyDDTKdzhCr1PFXHjU_H", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1383.89453125, + "y": 921.984375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1982657967, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 815, + "versionNonce": 1075950236, + "isDeleted": false, + "id": "ZBfU0ngueuYsWz6I8bCKK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1402.94921875, + "y": 937.25390625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.10000610351562, + "height": 25, + "seed": 126468289, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1680616542431, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1170, + "versionNonce": 78335780, + "isDeleted": false, + "id": "jhjA6EMo6vpUCUZHQr_mX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1208.259765625, + "y": 415.166015625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 356.94921874999994, + "seed": 1369749569, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + }, + { + "id": "hYeY6OHHfBb0xSadzrIUO", + "type": "arrow" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1680617306431, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 432, + "versionNonce": 1158418724, + "isDeleted": false, + "id": "qNOaN3pVAJBSsMo2IDl3A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1223.572265625, + "y": 418.486328125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 129.8000030517578, + "height": 25, + "seed": 1875249185, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617368552, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "clickhouse-02", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-02", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1296, + "versionNonce": 2122700196, + "isDeleted": false, + "id": "rGWPbCPCIaA6wd0vf3cAm", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1236.419921875, + "y": 456.099609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 288.86328125000006, + "seed": 15883265, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617283881, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 476, + "versionNonce": 1412661796, + "isDeleted": false, + "id": "wRq1_meRS7lJ2EKHgKk2W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 6.281358663757188, + "x": 1267.544930397291, + "y": 468.6558154667901, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 146.78334045410156, + "height": 25, + "seed": 1965634529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617278612, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_1S_2R", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_1S_2R", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 1216, + "versionNonce": 1943787940, + "isDeleted": false, + "id": "oluxJzMjFfYOyn5-B0dka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1256.251953125, + "y": 515.349609375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 210.81250000000006, + "seed": 276434881, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617267455, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1003, + "versionNonce": 2082700572, + "isDeleted": false, + "id": "Dz6jzUvxO4147RhI8WZFh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1278.189453125, + "y": 574.775390625, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 134.49218750000003, + "seed": 1761898401, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1680617219354, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 860, + "versionNonce": 150225052, + "isDeleted": false, + "id": "fQkUz2oj2eZkEPDYYWcRA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1299.408203125, + "y": 644.103515625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 1680320321, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow" + }, + { + "id": "hYeY6OHHfBb0xSadzrIUO", + "type": "arrow" + }, + { + "id": "uzhB9dcVibDhLKTA43AqJ", + "type": "arrow" + } + ], + "updated": 1680617100682, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 735, + "versionNonce": 11259044, + "isDeleted": false, + "id": "WbMJv-HlFhemifDr5ojCi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1317.958984375, + "y": 652.669921875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 56.41666793823242, + "height": 25, + "seed": 840111905, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617149028, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 562, + "versionNonce": 103297316, + "isDeleted": false, + "id": "T_zXJHMRuYqBH6Q5bzK86", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1266.513671875, + "y": 529.224609375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 152.64999389648438, + "height": 25, + "seed": 885361409, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617259516, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica2", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica2", + "lineHeight": 1.25 + }, + { + "type": "text", + "version": 663, + "versionNonce": 150592668, + "isDeleted": false, + "id": "bLICR7aFNDfOBor8HGukz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1295.689453125, + "y": 594.177734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.96666717529297, + "height": 25, + "seed": 1153336033, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617224609, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1", + "lineHeight": 1.25 + }, + { + "type": "rectangle", + "version": 585, + "versionNonce": 2069895836, + "isDeleted": false, + "id": "6XFHR168qyQdZGSSAkdVQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.27734375, + "y": 834.29296875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 927.33984375, + "height": 226.73828125, + "seed": 1140814639, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1680616745288, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 422, + "versionNonce": 152229660, + "isDeleted": false, + "id": "vVIDbj6IOHJZPxahYvtay", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1029.014821415791, + "y": 772.0078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 48.793872493344224, + "height": 57.15797501558586, + "seed": 409206113, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617289086, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KSZ6WPivPmlFfEae7MOmZ", + "gap": 26.109375, + "focus": 0.6647589899269046 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 5.127181234414138, + "focus": -0.053496678221884524 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 48.793872493344224, + 57.15797501558586 + ] + ] + }, + { + "type": "arrow", + "version": 581, + "versionNonce": 477915612, + "isDeleted": false, + "id": "rkre42NcpDm8yTNezH5zh", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1012.7137950088186, + "y": 942.859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 76.44618790627374, + "height": 0.9470375155858619, + "seed": 1085866177, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": -0.04919159442148933, + "gap": 5.073170008818579 + }, + "endBinding": { + "elementId": "LCD1WmlJ4y-REz1dTpJ9Q", + "focus": -0.1910241746788114, + "gap": 2.980642084907686 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.44618790627374, + 0.9470375155858619 + ] + ] + }, + { + "type": "arrow", + "version": 816, + "versionNonce": 1195160036, + "isDeleted": false, + "id": "EN1jjvyD4pydVpNBYGCu1", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.8192637588186, + "y": 955.4648437500002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 85.31943709372626, + "height": 2.150618734414138, + "seed": 362368975, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -85.31943709372626, + -2.150618734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1189, + "versionNonce": 1569377884, + "isDeleted": false, + "id": "3ggSRTy32SXrl5tfDxejC", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1476.4091075088186, + "y": 977.5000000000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 546.1514683437263, + "height": 47.83421248441391, + "seed": 1811691279, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -1.1502483311217826, + "gap": 15.246093750000227 + }, + "endBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.7278040192946851, + "gap": 10.16969376558609 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -295.1825450088186, + 35.40234374999977 + ], + [ + -546.1514683437263, + -12.431868734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1379, + "versionNonce": 806671716, + "isDeleted": false, + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 898.9989512588186, + "y": 966.4609375000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 599.6297816562737, + "height": 78.08984374999977, + "seed": 678064929, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.8457577505333682, + "gap": 11.562500000000227 + }, + "endBinding": { + "elementId": "TkyDDTKdzhCr1PFXHjU_H", + "focus": -0.6356670190591646, + "gap": 1.9079750155860893 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 289.9658924911814, + 78.08984374999977 + ], + [ + 599.6297816562737, + 11.939225015585862 + ] + ] + }, + { + "type": "arrow", + "version": 698, + "versionNonce": 676897500, + "isDeleted": false, + "id": "MJUWDY2EZev-CXvdwbrqg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.1825450088186, + "y": 944.21484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 86.67665665627374, + "height": 0.9900062655858619, + "seed": 449797199, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": -0.3219568458920805, + "gap": 15.307545008818579 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 86.67665665627374, + 0.9900062655858619 + ] + ] + }, + { + "type": "arrow", + "version": 873, + "versionNonce": 555518180, + "isDeleted": false, + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1387.1161387588186, + "y": 956.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87.63584334372626, + "height": 1.271256265585862, + "seed": 206368865, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -0.4014460800505109, + "gap": 15.833079991181421 + }, + "endBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": 0.8799195690060025, + "gap": 15.605295415092314 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -87.63584334372626, + 1.271256265585862 + ] + ] + }, + { + "type": "arrow", + "version": 994, + "versionNonce": 1246018852, + "isDeleted": false, + "id": "hYeY6OHHfBb0xSadzrIUO", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1297.1161387588186, + "y": 656.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 206.63584334372626, + "height": 0.2712562655858619, + "seed": 1937283236, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1680617086016, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQkUz2oj2eZkEPDYYWcRA", + "focus": 0.43093221645966545, + "gap": 2.292064366181421 + }, + "endBinding": { + "elementId": "vUZRMf0MD0fkmVVh5EFbT", + "focus": -0.11295173263187792, + "gap": 3.984201665092314 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -206.63584334372626, + 0.2712562655858619 + ] + ] + }, + { + "type": "arrow", + "version": 1016, + "versionNonce": 1595197860, + "isDeleted": false, + "id": "uzhB9dcVibDhLKTA43AqJ", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.397851454096, + "y": 673.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 206.63584334372626, + "height": 0.2712562655858619, + "seed": 879940508, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1680617123754, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQkUz2oj2eZkEPDYYWcRA", + "focus": -0.334099379708353, + "gap": 4.292064366181421 + }, + "endBinding": { + "elementId": "vUZRMf0MD0fkmVVh5EFbT", + "focus": 0.6520798635361406, + "gap": 1.9842016650923142 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 206.63584334372626, + 0.2712562655858619 + ] + ] + }, + { + "type": "arrow", + "version": 278, + "versionNonce": 1497562140, + "isDeleted": false, + "id": "b44c5shkNkGvKfI3BvYTr", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1345.1127923846934, + "y": 774.953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 30.47958511315369, + "height": 58.33984375, + "seed": 1409554959, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617306430, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jhjA6EMo6vpUCUZHQr_mX", + "gap": 2.837890625, + "focus": -0.4532829275804875 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 1, + "focus": 0.08784463162487417 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -30.47958511315369, + 58.33984375 + ] + ] + }, + { + "type": "arrow", + "version": 1033, + "versionNonce": 1150801052, + "isDeleted": false, + "id": "tOhL3LAMqpegl6h9MHUJR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1205.19351783071, + "y": 317.2890625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 154.68974224248336, + "height": 96.876953125, + "seed": 301771727, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1680617327380, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "gap": 2.53125, + "focus": 0.46306101005588857 + }, + "endBinding": { + "elementId": "jhjA6EMo6vpUCUZHQr_mX", + "gap": 1, + "focus": 0.7410412358955756 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 154.68974224248336, + 96.876953125 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png new file mode 100644 index 00000000000..a8d39ee2436 Binary files /dev/null and b/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png differ diff --git a/docs/ja/deployment-guides/images/Architecture.7-nodes.3.CH.Keeper.nodes.4.CH.nodes.excalidraw b/docs/ja/deployment-guides/images/Architecture.7-nodes.3.CH.Keeper.nodes.4.CH.nodes.excalidraw new file mode 100644 index 00000000000..d99984f9da4 --- /dev/null +++ b/docs/ja/deployment-guides/images/Architecture.7-nodes.3.CH.Keeper.nodes.4.CH.nodes.excalidraw @@ -0,0 +1,3484 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 999, + "versionNonce": 1717040740, + "isDeleted": false, + "id": "doz_ZqNC1Q3flhyTKvtq5", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 603.00390625, + "y": 266.80859375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 507.79296875, + "seed": 202448172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1076, + "versionNonce": 1142165980, + "isDeleted": false, + "id": "6bX_E24wLaoVkuQUL49rE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 902.74609375, + "y": 267.8828125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 508.0546875, + "seed": 1554965524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1557, + "versionNonce": 1146325476, + "isDeleted": false, + "id": "YNTKiIr_dIR3MH3HkfcRz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.38671875, + "y": 856.23046875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 1654017836, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1708, + "versionNonce": 65893980, + "isDeleted": false, + "id": "3TaKvrFaS02XpN5DtDPRI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1112.3515625, + "y": 112.8984375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 131.59375, + "height": 70.859375, + "seed": 4729388, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "yo5OoqsCs2uygBiUbUHP4", + "type": "arrow" + }, + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + }, + { + "id": "s-HYeFkwN90Wnid3rJNWl", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 227, + "versionNonce": 1009142492, + "isDeleted": false, + "id": "-FTntIW0fZhWsbhRDx1VV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 623.5390625, + "y": 273.60546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 97, + "height": 25, + "seed": 1952607148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode1-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode1-dr" + }, + { + "type": "text", + "version": 298, + "versionNonce": 945643748, + "isDeleted": false, + "id": "FvPf0x839jBfeRK1Oi7VH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 923.2421875, + "y": 274.765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 106, + "height": 25, + "seed": 892344108, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "jbZVPsflGswjF3TO0mtkh", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode2-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode2-dr" + }, + { + "type": "text", + "version": 662, + "versionNonce": 256937820, + "isDeleted": false, + "id": "ZImh9dDrhSU9bFSj4RyVP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 798.19921875, + "y": 863.02734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87, + "height": 25, + "seed": 1947896212, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chkeeper1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chkeeper1" + }, + { + "type": "rectangle", + "version": 1035, + "versionNonce": 927442020, + "isDeleted": false, + "id": "AatWa1WT64MRIbtUJHkYx", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 631.01953125, + "y": 329.22265625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 418.41796874999994, + "seed": 579706924, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1078, + "versionNonce": 2109621212, + "isDeleted": false, + "id": "KSZ6WPivPmlFfEae7MOmZ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 930.76171875, + "y": 330.62890625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 415.26953125, + "seed": 115425684, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 253, + "versionNonce": 763455580, + "isDeleted": false, + "id": "2lqhMLfXV7dc8MZPEp48A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 646.92578125, + "y": 356.5625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 897234988, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "text", + "version": 334, + "versionNonce": 1944902500, + "isDeleted": false, + "id": "zJgfnGBoFA0_lAsCwa7ok", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 955.75, + "y": 356.84765625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 1140609452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "rectangle", + "version": 1044, + "versionNonce": 1606383068, + "isDeleted": false, + "id": "fZfl-1njFTrlC29HslsoW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 650.9375, + "y": 389.72265625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 337.06640625, + "seed": 901892628, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1229, + "versionNonce": 377513444, + "isDeleted": false, + "id": "GJLXUfVbLlM2wK6poU-QC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 948.9453125, + "y": 394.5546875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 334.06249999999994, + "seed": 1173090068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 761, + "versionNonce": 1153567076, + "isDeleted": false, + "id": "vVj99ZeKac_jZ9gKhUbVl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 670.64453125, + "y": 439.24609375, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 265.8203125, + "seed": 1851706412, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 831, + "versionNonce": 1732816604, + "isDeleted": false, + "id": "ftuuNibnMRnfPHFUpjZwu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 973.640625, + "y": 445.84375, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 259.546875, + "seed": 1381841964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + } + ], + "updated": 1673465757519, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 835, + "versionNonce": 110602204, + "isDeleted": false, + "id": "f0u6srndZkKL_EodskHfD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 805.7578125, + "y": 910.84765625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 162401964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 639, + "versionNonce": 43005796, + "isDeleted": false, + "id": "mY3bL5nc3pLNDLQ051PJm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 835.640625, + "y": 929.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 172, + "height": 25, + "seed": 989889044, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper" + }, + { + "type": "rectangle", + "version": 742, + "versionNonce": 1010266076, + "isDeleted": false, + "id": "ZuIcO9LuMMsXU2q8TNX4t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 693.16796875, + "y": 629.05078125, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 1011039508, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "tkW1YXf04V5gI2gykZZWk", + "type": "arrow" + }, + { + "id": "1WvL53BsCMiWVlo9S9qDj", + "type": "arrow" + } + ], + "updated": 1673465857006, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 833, + "versionNonce": 299608804, + "isDeleted": false, + "id": "vUZRMf0MD0fkmVVh5EFbT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 998.5625, + "y": 637.43359375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 94517780, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + }, + { + "id": "unoFZopHnWdvFsNWTavXu", + "type": "arrow" + }, + { + "id": "5RUswZgGGqCu9DU8-oSb4", + "type": "arrow" + }, + { + "id": "RvqXzcYlAYrBDtzpvQA7I", + "type": "arrow" + }, + { + "id": "boGY68T7ABd6-pM8vIoq1", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 545, + "versionNonce": 1414703844, + "isDeleted": false, + "id": "nuAmSlrm7esiXAbRY2ndR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 710.46484375, + "y": 643.0234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 1708723372, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "AxQowbCdMeLIF6o69yEgK", + "type": "arrow" + }, + { + "id": "1een57Hw-GyI1s8UmYJ8e", + "type": "arrow" + }, + { + "id": "1WvL53BsCMiWVlo9S9qDj", + "type": "arrow" + } + ], + "updated": 1673465854871, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 607, + "versionNonce": 1780388700, + "isDeleted": false, + "id": "8Uy6RO4B05r0YaoY6xozj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1011.875, + "y": 647.30078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 1212490028, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "type": "arrow" + }, + { + "id": "1een57Hw-GyI1s8UmYJ8e", + "type": "arrow" + }, + { + "id": "049uSUUbRTCQs9PJO_e9o", + "type": "arrow" + } + ], + "updated": 1673465866531, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 432, + "versionNonce": 311973724, + "isDeleted": false, + "id": "TPjlSolDR9g-3HcygjMeq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 663.671875, + "y": 398.828125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 145, + "height": 25, + "seed": 1652917932, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica1" + }, + { + "type": "text", + "version": 482, + "versionNonce": 1128291428, + "isDeleted": false, + "id": "CRUfTbXb5AainVI-px46P", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 962.71484375, + "y": 405.5234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 154, + "height": 25, + "seed": 586798996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard1_replica2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard1_replica2" + }, + { + "type": "text", + "version": 563, + "versionNonce": 1933520868, + "isDeleted": false, + "id": "HGgdkIwc4LcjNtxr76kvh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 682.26171875, + "y": 452.109375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 1746101396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "text", + "version": 531, + "versionNonce": 1198993500, + "isDeleted": false, + "id": "jHqW0NK5gsCGvLnYvHCx6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 989.9453125, + "y": 460.51953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 65018796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "text", + "version": 363, + "versionNonce": 648115932, + "isDeleted": false, + "id": "VL9EHZ6BBa0MzyG_Ul-8O", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1150.78515625, + "y": 135.09375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 52, + "height": 25, + "seed": 1746995884, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "client", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "client" + }, + { + "type": "arrow", + "version": 416, + "versionNonce": 662369508, + "isDeleted": false, + "id": "yo5OoqsCs2uygBiUbUHP4", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1119.9719128948714, + "y": 186.63257168045592, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 385.68675664487137, + "height": 326.43774081954405, + "seed": 972317100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.12000836906439498, + "gap": 2.874759180455925 + }, + "endBinding": { + "elementId": "mfP2BtyKXz42duAKGG1wP", + "focus": -0.41223771360231753, + "gap": 3.87890625 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -385.68675664487137, + 326.43774081954405 + ] + ] + }, + { + "type": "arrow", + "version": 708, + "versionNonce": 1501969244, + "isDeleted": false, + "id": "jbZVPsflGswjF3TO0mtkh", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1161.033824898155, + "y": 187.25390625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 126.17799843237572, + "height": 330.68672591477593, + "seed": 679203860, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.02851841252306824, + "gap": 3.49609375 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -126.17799843237572, + 330.68672591477593 + ] + ] + }, + { + "type": "arrow", + "version": 410, + "versionNonce": 361936996, + "isDeleted": false, + "id": "6ZwQTNxgnbNvCbFscx6Wf", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 786.62109375, + "y": 641.2413335655827, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 210.3812421588275, + "height": 3.9088842671210386, + "seed": 769023380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZuIcO9LuMMsXU2q8TNX4t", + "focus": -0.47428717728252356, + "gap": 5.51953125 + }, + "endBinding": { + "elementId": "8Uy6RO4B05r0YaoY6xozj", + "focus": 1.0625631962676507, + "gap": 15.02734375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 210.3812421588275, + 3.9088842671210386 + ] + ] + }, + { + "type": "arrow", + "version": 457, + "versionNonce": 1281257436, + "isDeleted": false, + "id": "AxQowbCdMeLIF6o69yEgK", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 993.64453125, + "y": 668.4932436399571, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 213.38671875, + "height": 1.9319300322227946, + "seed": 1549785132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757520, + "link": null, + "locked": false, + "startBinding": { + "elementId": "vUZRMf0MD0fkmVVh5EFbT", + "focus": -0.4139713939639972, + "gap": 4.91796875 + }, + "endBinding": { + "elementId": "nuAmSlrm7esiXAbRY2ndR", + "focus": 0.8358676393880391, + "gap": 12.79296875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -213.38671875, + -1.9319300322227946 + ] + ] + }, + { + "type": "rectangle", + "version": 1625, + "versionNonce": 255595612, + "isDeleted": false, + "id": "_NgRKPWWRBMhWmORFbqfG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1074.103515625, + "y": 853.1796875, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 549292591, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + }, + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + } + ], + "updated": 1673465757520, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 705, + "versionNonce": 562229092, + "isDeleted": false, + "id": "Pw_o-YfuyZUoUg14Bk9B9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1103.5625, + "y": 875.25, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 96, + "height": 25, + "seed": 304529441, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chkeeper2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chkeeper2" + }, + { + "type": "rectangle", + "version": 985, + "versionNonce": 834101988, + "isDeleted": false, + "id": "LCD1WmlJ4y-REz1dTpJ9Q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1092.140625, + "y": 912.42578125, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1815246127, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rkre42NcpDm8yTNezH5zh", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 712, + "versionNonce": 1913630044, + "isDeleted": false, + "id": "oVA_VcnjylIcDRkS4Umwt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1111.875, + "y": 934.8984375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 172, + "height": 25, + "seed": 1269328577, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "MJUWDY2EZev-CXvdwbrqg", + "type": "arrow" + }, + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper" + }, + { + "type": "rectangle", + "version": 1722, + "versionNonce": 974218852, + "isDeleted": false, + "id": "yu32XFDVxjsltOILQkLVA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1365.177734375, + "y": 855.53515625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 163.015625, + "seed": 63815567, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 807, + "versionNonce": 921280988, + "isDeleted": false, + "id": "Vx1u3JBG4wFPZTH61H34k", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1394.63671875, + "y": 877.60546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 96, + "height": 25, + "seed": 949683425, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chkeeper3", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chkeeper3" + }, + { + "type": "rectangle", + "version": 1037, + "versionNonce": 1063188964, + "isDeleted": false, + "id": "TkyDDTKdzhCr1PFXHjU_H", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1383.89453125, + "y": 921.984375, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 208.04687500000003, + "height": 54.5078125, + "seed": 1982657967, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + }, + { + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 814, + "versionNonce": 630261340, + "isDeleted": false, + "id": "ZBfU0ngueuYsWz6I8bCKK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1402.94921875, + "y": 937.25390625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 172, + "height": 25, + "seed": 126468289, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "type": "arrow" + }, + { + "id": "3ggSRTy32SXrl5tfDxejC", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ClickHouse Keeper", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse Keeper" + }, + { + "type": "rectangle", + "version": 1122, + "versionNonce": 2091785572, + "isDeleted": false, + "id": "jhjA6EMo6vpUCUZHQr_mX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1208.259765625, + "y": 266.166015625, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 505.94921874999994, + "seed": 1369749569, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1224, + "versionNonce": 47700700, + "isDeleted": false, + "id": "4Sga6YK0N6BhYlnzfY-If", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1507.833984375, + "y": 267.642578125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 260.78515625, + "height": 505.75, + "seed": 307406927, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 368, + "versionNonce": 458019044, + "isDeleted": false, + "id": "qNOaN3pVAJBSsMo2IDl3A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1223.572265625, + "y": 273.486328125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 105, + "height": 25, + "seed": 1875249185, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode3-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode3-dr" + }, + { + "type": "text", + "version": 421, + "versionNonce": 693116764, + "isDeleted": false, + "id": "FQeMCzI5wpNs4VKgvsRbJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1528.771484375, + "y": 278.841796875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 105, + "height": 25, + "seed": 1570162287, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "chnode4-dr", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "chnode4-dr" + }, + { + "type": "rectangle", + "version": 1264, + "versionNonce": 1791562852, + "isDeleted": false, + "id": "rGWPbCPCIaA6wd0vf3cAm", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1236.419921875, + "y": 329.099609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 415.86328125000006, + "seed": 15883265, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1213, + "versionNonce": 1363923932, + "isDeleted": false, + "id": "cy7O-CTpJ-KentMW4VdfJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1536.193359375, + "y": 325.974609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 210.33593749999986, + "height": 424.23828125000006, + "seed": 49422479, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 432, + "versionNonce": 418441188, + "isDeleted": false, + "id": "wRq1_meRS7lJ2EKHgKk2W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 6.281358663757188, + "x": 1253.544921875, + "y": 354.646484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 1965634529, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "text", + "version": 434, + "versionNonce": 1490876508, + "isDeleted": false, + "id": "ZNj_OF3A8KOYCPIJxemRv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1557.603515625, + "y": 346.330078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157, + "height": 25, + "seed": 874329775, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "cluster_2S_2R", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "cluster_2S_2R" + }, + { + "type": "rectangle", + "version": 1172, + "versionNonce": 1775389540, + "isDeleted": false, + "id": "oluxJzMjFfYOyn5-B0dka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1256.251953125, + "y": 390.349609375, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 335.81250000000006, + "seed": 276434881, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1189, + "versionNonce": 198544604, + "isDeleted": false, + "id": "ajb0Y-1AIvf3mpC8Gisy9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1555.865234375, + "y": 390.783203125, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 179.11328125, + "height": 337.78125000000006, + "seed": 1472235727, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 933, + "versionNonce": 1874542308, + "isDeleted": false, + "id": "Dz6jzUvxO4147RhI8WZFh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1278.189453125, + "y": 445.775390625, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 263.49218749999994, + "seed": 1761898401, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 960, + "versionNonce": 1808240988, + "isDeleted": false, + "id": "7mjktKEHbPcChuXq2eo5m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1578.818359375, + "y": 439.923828125, + "strokeColor": "#000000", + "backgroundColor": "#4c6ef5", + "width": 136.69531249999997, + "height": 268.22656249999994, + "seed": 1802802927, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 857, + "versionNonce": 958586972, + "isDeleted": false, + "id": "fQkUz2oj2eZkEPDYYWcRA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1299.408203125, + "y": 644.103515625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 1680320321, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Tc6pUBn2VamfWcVF02hrZ", + "type": "arrow" + }, + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow" + } + ], + "updated": 1673465879926, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 905, + "versionNonce": 929709788, + "isDeleted": false, + "id": "OgP2fCzCGSSYc_ZLdu3tr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1607.759765625, + "y": 635.228515625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 87.93359375, + "height": 44.3203125, + "seed": 284830031, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6k5d9f3O3ERrytVDoaHKq", + "type": "arrow" + }, + { + "id": "fqVZi7oKcvz45aVHwi1GP", + "type": "arrow" + }, + { + "id": "fPSg8iqk4AEDCGu9JUbZh", + "type": "arrow" + }, + { + "id": "5KB-9zBxZdK0MPSlVVNg7", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 732, + "versionNonce": 2132948964, + "isDeleted": false, + "id": "WbMJv-HlFhemifDr5ojCi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1317.958984375, + "y": 652.669921875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 840111905, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6k5d9f3O3ERrytVDoaHKq", + "type": "arrow" + }, + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow" + } + ], + "updated": 1673465881826, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 714, + "versionNonce": 1365349732, + "isDeleted": false, + "id": "oMjTSaM1N58ACMutJDQo3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1622.029296875, + "y": 646.466796875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 57, + "height": 25, + "seed": 2108041071, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Tc6pUBn2VamfWcVF02hrZ", + "type": "arrow" + }, + { + "id": "Q2_sAmVp3gwWZ2oKNQ7rL", + "type": "arrow" + } + ], + "updated": 1673465892668, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table1" + }, + { + "type": "text", + "version": 529, + "versionNonce": 518221924, + "isDeleted": false, + "id": "T_zXJHMRuYqBH6Q5bzK86", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1265.513671875, + "y": 408.224609375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 154, + "height": 25, + "seed": 885361409, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard2_replica1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard2_replica1" + }, + { + "type": "text", + "version": 584, + "versionNonce": 1200961500, + "isDeleted": false, + "id": "gtCtR7kY6nZwt9rq7tTlS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1568.044921875, + "y": 407.763671875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 162, + "height": 25, + "seed": 208494991, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "shard2_replica2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "shard2_replica2" + }, + { + "type": "text", + "version": 618, + "versionNonce": 291488740, + "isDeleted": false, + "id": "bLICR7aFNDfOBor8HGukz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1289.689453125, + "y": 457.177734375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 1153336033, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "text", + "version": 658, + "versionNonce": 140106844, + "isDeleted": false, + "id": "pt4oXdVb7fXEfmAyVP0IK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1586.337890625, + "y": 447.916015625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 28, + "height": 25, + "seed": 1317558191, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "db1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "db1" + }, + { + "type": "arrow", + "version": 576, + "versionNonce": 671459172, + "isDeleted": false, + "id": "Tc6pUBn2VamfWcVF02hrZ", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1392.861328125, + "y": 653.3642358962176, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 214.14436429998887, + "height": 7.23265463879045, + "seed": 2123202241, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQkUz2oj2eZkEPDYYWcRA", + "focus": -0.47428717728252356, + "gap": 5.51953125 + }, + "endBinding": { + "elementId": "oMjTSaM1N58ACMutJDQo3", + "focus": 1.062590750239405, + "gap": 15.02734375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 214.14436429998887, + -7.23265463879045 + ] + ] + }, + { + "type": "arrow", + "version": 677, + "versionNonce": 34992348, + "isDeleted": false, + "id": "6k5d9f3O3ERrytVDoaHKq", + "fillStyle": "cross-hatch", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1602.841796875, + "y": 668.5903858023075, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 214.08984375, + "height": 6.469282503233785, + "seed": 438274511, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OgP2fCzCGSSYc_ZLdu3tr", + "focus": -0.4139713939639972, + "gap": 4.91796875 + }, + "endBinding": { + "elementId": "WbMJv-HlFhemifDr5ojCi", + "focus": 0.8358333991526675, + "gap": 13.79296875 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -214.08984375, + 6.469282503233785 + ] + ] + }, + { + "type": "arrow", + "version": 1313, + "versionNonce": 1193482980, + "isDeleted": false, + "id": "ch2PpBqvlYoVfwfXC0ccU", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.5982475475205, + "y": 771.9687500000001, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 34.99830724046308, + "height": 59.742187499999886, + "seed": 2122204719, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "AatWa1WT64MRIbtUJHkYx", + "gap": 24.328125000000114, + "focus": 0.5593528890074575 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 2.58203125, + "focus": -0.6799372564994136 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 34.99830724046308, + 59.742187499999886 + ] + ] + }, + { + "type": "rectangle", + "version": 583, + "versionNonce": 73102684, + "isDeleted": false, + "id": "6XFHR168qyQdZGSSAkdVQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 745.27734375, + "y": 834.29296875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 927.33984375, + "height": 226.73828125, + "seed": 1140814639, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ch2PpBqvlYoVfwfXC0ccU", + "type": "arrow" + }, + { + "id": "b44c5shkNkGvKfI3BvYTr", + "type": "arrow" + }, + { + "id": "2Qvve3RQu79DrGbdGSIoE", + "type": "arrow" + }, + { + "id": "vVIDbj6IOHJZPxahYvtay", + "type": "arrow" + } + ], + "updated": 1673465757521, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 316, + "versionNonce": 424025700, + "isDeleted": false, + "id": "vVIDbj6IOHJZPxahYvtay", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1041.2723887588186, + "y": 772.0078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 44.938375406273735, + "height": 57.15797501558586, + "seed": 409206113, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KSZ6WPivPmlFfEae7MOmZ", + "focus": 0.6647589899269046, + "gap": 26.109375 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "focus": -0.053496678221884524, + "gap": 5.127181234414138 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 44.938375406273735, + 57.15797501558586 + ] + ] + }, + { + "type": "arrow", + "version": 581, + "versionNonce": 477915612, + "isDeleted": false, + "id": "rkre42NcpDm8yTNezH5zh", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1012.7137950088186, + "y": 942.859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 76.44618790627374, + "height": 0.9470375155858619, + "seed": 1085866177, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": -0.04919159442148933, + "gap": 5.073170008818579 + }, + "endBinding": { + "elementId": "LCD1WmlJ4y-REz1dTpJ9Q", + "focus": -0.1910241746788114, + "gap": 2.980642084907686 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.44618790627374, + 0.9470375155858619 + ] + ] + }, + { + "type": "arrow", + "version": 816, + "versionNonce": 1195160036, + "isDeleted": false, + "id": "EN1jjvyD4pydVpNBYGCu1", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.8192637588186, + "y": 955.4648437500002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 85.31943709372626, + "height": 2.150618734414138, + "seed": 362368975, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757521, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -85.31943709372626, + -2.150618734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1189, + "versionNonce": 1569377884, + "isDeleted": false, + "id": "3ggSRTy32SXrl5tfDxejC", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1476.4091075088186, + "y": 977.5000000000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 546.1514683437263, + "height": 47.83421248441391, + "seed": 1811691279, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -1.1502483311217826, + "gap": 15.246093750000227 + }, + "endBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.7278040192946851, + "gap": 10.16969376558609 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -295.1825450088186, + 35.40234374999977 + ], + [ + -546.1514683437263, + -12.431868734414138 + ] + ] + }, + { + "type": "arrow", + "version": 1379, + "versionNonce": 806671716, + "isDeleted": false, + "id": "mTAnUdCoqWUUHAhjuWbQ4", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 898.9989512588186, + "y": 966.4609375000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 599.6297816562737, + "height": 78.08984374999977, + "seed": 678064929, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "mY3bL5nc3pLNDLQ051PJm", + "focus": 0.8457577505333682, + "gap": 11.562500000000227 + }, + "endBinding": { + "elementId": "TkyDDTKdzhCr1PFXHjU_H", + "focus": -0.6356670190591646, + "gap": 1.9079750155860893 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 289.9658924911814, + 78.08984374999977 + ], + [ + 599.6297816562737, + 11.939225015585862 + ] + ] + }, + { + "type": "arrow", + "version": 698, + "versionNonce": 676897500, + "isDeleted": false, + "id": "MJUWDY2EZev-CXvdwbrqg", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.1825450088186, + "y": 944.21484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 86.67665665627374, + "height": 0.9900062655858619, + "seed": 449797199, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": -0.3219568458920805, + "gap": 15.307545008818579 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 86.67665665627374, + 0.9900062655858619 + ] + ] + }, + { + "type": "arrow", + "version": 873, + "versionNonce": 555518180, + "isDeleted": false, + "id": "CCQnVa7FiCpQ1z9gZkFIw", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1387.1161387588186, + "y": 956.75, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 87.63584334372626, + "height": 1.271256265585862, + "seed": 206368865, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZBfU0ngueuYsWz6I8bCKK", + "focus": -0.4014460800505109, + "gap": 15.833079991181421 + }, + "endBinding": { + "elementId": "oVA_VcnjylIcDRkS4Umwt", + "focus": 0.8799195690060025, + "gap": 15.605295415092314 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -87.63584334372626, + 1.271256265585862 + ] + ] + }, + { + "type": "arrow", + "version": 166, + "versionNonce": 1937237852, + "isDeleted": false, + "id": "b44c5shkNkGvKfI3BvYTr", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1333.1940083568848, + "y": 774.953125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 26.673004044225536, + "height": 58.33984375, + "seed": 1409554959, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jhjA6EMo6vpUCUZHQr_mX", + "gap": 2.837890625, + "focus": -0.4532829275804875 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "gap": 1, + "focus": 0.08784463162487417 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -26.673004044225536, + 58.33984375 + ] + ] + }, + { + "type": "arrow", + "version": 118, + "versionNonce": 322608092, + "isDeleted": false, + "id": "2Qvve3RQu79DrGbdGSIoE", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.1379086119434, + "y": 771.7812500000002, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 32.41041515605525, + "height": 60.64843749999977, + "seed": 1501924399, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "cy7O-CTpJ-KentMW4VdfJ", + "focus": -0.460679729792005, + "gap": 21.568359375 + }, + "endBinding": { + "elementId": "6XFHR168qyQdZGSSAkdVQ", + "focus": 0.5993280341824869, + "gap": 1.86328125 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -32.41041515605525, + 60.64843749999977 + ] + ] + }, + { + "type": "arrow", + "version": 738, + "versionNonce": 1211277284, + "isDeleted": false, + "id": "tOhL3LAMqpegl6h9MHUJR", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.8139520877953, + "y": 186.2890625, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 164.54126937196384, + "height": 319.25795742166434, + "seed": 301771727, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.15345616469956536, + "gap": 2.53125 + }, + "endBinding": { + "elementId": "IyEuh1a9LnHG-JUDXlB-i", + "focus": 0.2722825954194206, + "gap": 6.443214453335656 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 164.54126937196384, + 319.25795742166434 + ] + ] + }, + { + "type": "arrow", + "version": 671, + "versionNonce": 28491868, + "isDeleted": false, + "id": "s-HYeFkwN90Wnid3rJNWl", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1217.6726151735345, + "y": 185.75, + "strokeColor": "#000000", + "backgroundColor": "#fd7e14", + "width": 421.75279968733844, + "height": 318.4728011716643, + "seed": 127429455, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3TaKvrFaS02XpN5DtDPRI", + "focus": 0.08901572298861447, + "gap": 1.9921875 + }, + "endBinding": { + "elementId": "voKu0tXBmEaJrouiIomsC", + "focus": 0.3985151838540141, + "gap": 6.150245703335713 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 421.75279968733844, + 318.4728011716643 + ] + ] + }, + { + "type": "rectangle", + "version": 330, + "versionNonce": 403749220, + "isDeleted": false, + "id": "mfP2BtyKXz42duAKGG1wP", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 682.0859375, + "y": 516.94921875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 973303009, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "oaJS_EqromiKeDyr4nClL" + }, + { + "id": "yo5OoqsCs2uygBiUbUHP4", + "type": "arrow" + }, + { + "id": "MP8lFTuT_14mccQcuYSdA", + "type": "arrow" + } + ], + "updated": 1673465845302, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 18, + "versionNonce": 649221340, + "isDeleted": false, + "id": "oaJS_EqromiKeDyr4nClL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 694.392578125, + "y": 527.013671875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 768116271, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757522, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "mfP2BtyKXz42duAKGG1wP", + "originalText": "table1_dist" + }, + { + "type": "rectangle", + "version": 417, + "versionNonce": 1711377380, + "isDeleted": false, + "id": "Vd91FLWRYUL8pd6YtU7Ig", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 985.517578125, + "y": 514.974609375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 768359599, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "Ctzwpzg-cg95BAO7Tv1FS" + }, + { + "id": "GK4Iba9Rr6jxTDbnCF0CO", + "type": "arrow" + } + ], + "updated": 1673465805598, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 110, + "versionNonce": 896268516, + "isDeleted": false, + "id": "Ctzwpzg-cg95BAO7Tv1FS", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 997.82421875, + "y": 525.0390625, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 296118721, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757523, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Vd91FLWRYUL8pd6YtU7Ig", + "originalText": "table1_dist" + }, + { + "type": "rectangle", + "version": 399, + "versionNonce": 1938282844, + "isDeleted": false, + "id": "IyEuh1a9LnHG-JUDXlB-i", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1287.291015625, + "y": 511.990234375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 1249761391, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "2_hYlsGbdDpkQgofRihLh" + }, + { + "id": "tOhL3LAMqpegl6h9MHUJR", + "type": "arrow" + }, + { + "id": "KN4O7IzixCRBlvLndlDry", + "type": "arrow" + } + ], + "updated": 1673465816623, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 91, + "versionNonce": 1187200100, + "isDeleted": false, + "id": "2_hYlsGbdDpkQgofRihLh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1299.59765625, + "y": 522.0546875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 121465345, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757523, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "IyEuh1a9LnHG-JUDXlB-i", + "originalText": "table1_dist" + }, + { + "type": "rectangle", + "version": 414, + "versionNonce": 1278780772, + "isDeleted": false, + "id": "voKu0tXBmEaJrouiIomsC", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1583.408203125, + "y": 510.373046875, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 114.61328125, + "height": 40.12890625, + "seed": 567927759, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "type": "text", + "id": "oShiptiUcsFKb5N0Wzg3C" + }, + { + "id": "s-HYeFkwN90Wnid3rJNWl", + "type": "arrow" + }, + { + "id": "3BvHiCA3kPGONkw1BkNH4", + "type": "arrow" + } + ], + "updated": 1673465835890, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 100, + "versionNonce": 1130762212, + "isDeleted": false, + "id": "oShiptiUcsFKb5N0Wzg3C", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1595.71484375, + "y": 520.4375, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "width": 90, + "height": 18, + "seed": 1812087969, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1673465757523, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "table1_dist", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "voKu0tXBmEaJrouiIomsC", + "originalText": "table1_dist" + }, + { + "id": "WqsIP0xQf7vNqaQ6aUdmI", + "type": "line", + "x": 726.6935763888889, + "y": 596.2447916666666, + "width": 927.4435763888889, + "height": 1.640625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 688969572, + "version": 136, + "versionNonce": 1318437084, + "isDeleted": false, + "boundElements": null, + "updated": 1673465790669, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 927.4435763888889, + -1.640625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "MP8lFTuT_14mccQcuYSdA", + "type": "arrow", + "x": 729.657986111111, + "y": 596.9869791666666, + "width": 2.569444444444514, + "height": 30.837673611111086, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2137248604, + "version": 176, + "versionNonce": 793877604, + "isDeleted": false, + "boundElements": null, + "updated": 1673465840507, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 2.569444444444514, + -30.837673611111086 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "mfP2BtyKXz42duAKGG1wP", + "focus": 0.08032629512951014, + "gap": 9.071180555555543 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "1WvL53BsCMiWVlo9S9qDj", + "type": "arrow", + "x": 729.40625, + "y": 593.8619791666667, + "width": 0.00868055555565661, + "height": 32.8342013888888, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1567607772, + "version": 441, + "versionNonce": 1837770972, + "isDeleted": false, + "boundElements": null, + "updated": 1673465859923, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0.00868055555565661, + 32.8342013888888 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "ZuIcO9LuMMsXU2q8TNX4t", + "focus": -0.17541251232267535, + "gap": 2.354600694444457 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "049uSUUbRTCQs9PJO_e9o", + "type": "arrow", + "x": 1040.9774305555559, + "y": 599.7126736111112, + "width": 0.45572916666674246, + "height": 35.954861111111086, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 640574180, + "version": 542, + "versionNonce": 943795164, + "isDeleted": false, + "boundElements": null, + "updated": 1673465873521, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.45572916666674246, + 35.954861111111086 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "8Uy6RO4B05r0YaoY6xozj", + "focus": -0.005554677651451976, + "gap": 11.633246527777715 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "6-aQPb-PIw6Gb0uCJY8hW", + "type": "arrow", + "x": 1344.5494791666665, + "y": 594.7647569444445, + "width": 1.1631944444443434, + "height": 47.63020833333326, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 1218252772, + "version": 636, + "versionNonce": 492411748, + "isDeleted": false, + "boundElements": null, + "updated": 1673465884314, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.1631944444443434, + 47.63020833333326 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "WbMJv-HlFhemifDr5ojCi", + "focus": -0.006600020736089099, + "gap": 10.274956597222285 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "Q2_sAmVp3gwWZ2oKNQ7rL", + "type": "arrow", + "x": 1654.206597222222, + "y": 590.4592013888889, + "width": 1.1631944444443434, + "height": 47.63020833333326, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 2095530332, + "version": 719, + "versionNonce": 257035868, + "isDeleted": false, + "boundElements": null, + "updated": 1673465892668, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.1631944444443434, + 47.63020833333326 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "oMjTSaM1N58ACMutJDQo3", + "focus": 0.18574203708432807, + "gap": 8.377387152777828 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "GK4Iba9Rr6jxTDbnCF0CO", + "type": "arrow", + "x": 1039.675347222222, + "y": 595.4982638888889, + "width": 0.5555555555554861, + "height": 36.25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 62790628, + "version": 279, + "versionNonce": 1248237412, + "isDeleted": false, + "boundElements": null, + "updated": 1673465824931, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.5555555555554861, + -36.25 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "Vd91FLWRYUL8pd6YtU7Ig", + "focus": 0.0707369614114876, + "gap": 4.144748263888914 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "KN4O7IzixCRBlvLndlDry", + "type": "arrow", + "x": 1344.4756944444443, + "y": 592.5859375, + "width": 0.6684027777778851, + "height": 35.3125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 355364708, + "version": 315, + "versionNonce": 1083789156, + "isDeleted": false, + "boundElements": null, + "updated": 1673465828566, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.6684027777778851, + -35.3125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "IyEuh1a9LnHG-JUDXlB-i", + "focus": 0.021975891860499298, + "gap": 5.154296875 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "3BvHiCA3kPGONkw1BkNH4", + "type": "arrow", + "x": 1652.8871527777778, + "y": 593.0069444444445, + "width": 0.6684027777778851, + "height": 35.3125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "#fab005", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "roundness": null, + "seed": 737200348, + "version": 416, + "versionNonce": 783416924, + "isDeleted": false, + "boundElements": null, + "updated": 1673465835890, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -0.6684027777778851, + -35.3125 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "voKu0tXBmEaJrouiIomsC", + "focus": -0.1904777562411242, + "gap": 7.192491319444457 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/deployment-guides/images/HA-plus-horizontal-scaling-1.png b/docs/ja/deployment-guides/images/HA-plus-horizontal-scaling-1.png new file mode 100644 index 00000000000..e98eb3fc7d0 Binary files /dev/null and b/docs/ja/deployment-guides/images/HA-plus-horizontal-scaling-1.png differ diff --git a/docs/ja/deployment-guides/images/scaling-out-1.png b/docs/ja/deployment-guides/images/scaling-out-1.png new file mode 100644 index 00000000000..36696c1c801 Binary files /dev/null and b/docs/ja/deployment-guides/images/scaling-out-1.png differ diff --git a/docs/ja/deployment-guides/replicated.md b/docs/ja/deployment-guides/replicated.md new file mode 100644 index 00000000000..6c7d859ff2d --- /dev/null +++ b/docs/ja/deployment-guides/replicated.md @@ -0,0 +1,557 @@ +--- +slug: /ja/architecture/replication +sidebar_label: 障害耐性のためのレプリケーション +sidebar_position: 10 +title: 障害耐性のためのレプリケーション +--- +import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; +import ConfigFileNote from '@site/docs/ja/_snippets/_config-files.md'; +import KeeperConfigFileNote from '@site/docs/ja/_snippets/_keeper-config-files.md'; + + +## 説明 +このアーキテクチャでは、5台のサーバーが構成されています。2台はデータのコピーをホストするために使われます。残りの3台のサーバーはデータのレプリケーションを調整するために使われます。この例では、ReplicatedMergeTreeテーブルエンジンを使用して、両方のデータノードにわたってレプリケートされるデータベースとテーブルを作成します。 + +## レベル: 基本 + + + +## 環境 +### アーキテクチャ図 +![ReplicatedMergeTreeを使用した1シャードと2レプリカのアーキテクチャ図](@site/docs/ja/deployment-guides/images/Architecture.1S_2R_ReplicatedMergeTree_5-nodes.3.CH.Keeper.nodes.2.CH.nodes.png) + +|Node|説明| +|----|-----------| +|clickhouse-01|データ| +|clickhouse-02|データ| +|clickhouse-keeper-01|分散コーディネーション| +|clickhouse-keeper-02|分散コーディネーション| +|clickhouse-keeper-03|分散コーディネーション| + +:::note +本番環境では、ClickHouse Keeperのために*専用*のホストを使用することを強くお勧めします。テスト環境では、ClickHouse ServerとClickHouse Keeperを同じサーバー上で組み合わせて実行することが許容されます。他の基本的な例、[スケールアウト](/docs/ja/deployment-guides/horizontal-scaling.md)では、この方法を使用しています。この例では、KeeperとClickHouse Serverを分離する推奨される方法を示します。Keeperサーバーは小さくすることができ、ClickHouse Serversが非常に大きくなるまで、各Keeperサーバーには通常4GB RAMがあれば十分です。 +::: + +## インストール + +2台のサーバー`clickhouse-01`と`clickhouse-02`にClickHouse serverとclientをインストールします。[アーカイブタイプに応じた手順](/docs/ja/getting-started/install.md/#available-installation-options) (.deb, .rpm, .tar.gzなど)に従ってください。 + +3台のサーバー`clickhouse-keeper-01`、`clickhouse-keeper-02`、`clickhouse-keeper-03`にClickHouse Keeperをインストールします。[アーカイブタイプに応じた手順に従ってください](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper) (.deb, .rpm, .tar.gzなど)。 + +## 設定ファイルの編集 + + + +## clickhouse-01の設定 + +clickhouse-01には5つの設定ファイルがあります。これらのファイルを1つのファイルにまとめることもできますが、ドキュメントの明確さのために別々に見るほうが簡単かもしれません。設定ファイルを読み進めると、ほとんどの設定がclickhouse-01とclickhouse-02で同じであることがわかり、違いは強調されています。 + +### ネットワークとログの設定 + +これらの値はお好みに応じてカスタマイズできます。この例の設定では、以下を提供します: +- 1000Mのロールオーバーを3回行うデバッグログ +- `clickhouse-client`で接続したときに表示される名前は `cluster_1S_2R node 1`です +- ClickHouseはポート8123と9000でIPV4ネットワークを介してリッスンします。 + +```xml title="/etc/clickhouse-server/config.d/network-and-logging.xml on clickhouse-01" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + cluster_1S_2R node 1 + 0.0.0.0 + 8123 + 9000 + +``` + +### マクロの設定 + +マクロ`shard`と`replica`は分散DDLの複雑さを軽減します。設定された値はDDLクエリで自動的に置き換えられ、DDLを簡単にします。この設定のマクロは、各ノードのシャード番号とレプリカ番号を指定します。 +この1シャード2レプリカの例では、レプリカマクロはclickhouse-01で`replica_1`、clickhouse-02で`replica_2`です。シャードマクロは、1つのシャードしかないため、clickhouse-01とclickhouse-02の両方で`1`です。 + +```xml title="/etc/clickhouse-server/config.d/macros.xml on clickhouse-01" + + + 01 + + 01 + cluster_1S_2R + + +``` + +### レプリケーションとシャーディングの設定 + +上から始めて: +- XMLのremote_serversセクションは環境内の各クラスタを指定します。属性`replace=true`は、デフォルトのClickHouse設定内のサンプルremote_serversを、このファイル内で指定されたremote_server設定で置き換えます。この属性がない場合、このファイル内のリモートサーバーはデフォルトのサンプルリストに追加されます。 +- この例では、`cluster_1S_2R`という名前のクラスタが1つあります。 +- `cluster_1S_2R`という名前のクラスタには、値`mysecretphrase`のシークレットが作成されます。このシークレットは、環境内のすべてのリモートサーバー間で共有され、正しいサーバーが一緒に参加することを保証します。 +- `cluster_1S_2R`クラスタには1つのシャードと2つのレプリカがあります。このドキュメントの冒頭にあるアーキテクチャ図と、以下のXMLのシャード定義を比較してください。シャード定義には2つのレプリカが含まれています。各レプリカのホストとポートが指定されています。1つのレプリカは`clickhouse-01`に保存され、もう1つのレプリカは`clickhouse-02`に保存されます。 +- シャードの内部レプリケーションはtrueに設定されています。各シャードは、設定ファイルでinternal_replicationパラメータを定義できます。このパラメータがtrueに設定されている場合、書き込み操作は最初に健康なレプリカを選択してデータを書き込みます。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml on clickhouse-01" + + + + mysecretphrase + + true + + clickhouse-01 + 9000 + + + clickhouse-02 + 9000 + + + + + +``` + +### Keeperの使用を設定する + +この設定ファイル`use-keeper.xml`は、ClickHouse Serverがレプリケーションと分散DDLの調整にClickHouse Keeperを使用するように設定しています。このファイルは、ClickHouse Serverがポート9181でノードclickhouse-keeper-01〜03上のKeeperを使用する必要があることを指定しており、`clickhouse-01`および`clickhouse-02`で同じです。 + +```xml title="/etc/clickhouse-server/config.d/use-keeper.xml on clickhouse-01" + + + + + clickhouse-keeper-01 + 9181 + + + clickhouse-keeper-02 + 9181 + + + clickhouse-keeper-03 + 9181 + + + +``` + +## clickhouse-02の設定 + +設定は、clickhouse-01とclickhouse-02で非常に似ているため、ここでは違いのみを指摘します。 + +### ネットワークとログの設定 + +このファイルは、`display_name`を除き、clickhouse-01とclickhouse-02で同じです。 + +```xml title="/etc/clickhouse-server/config.d/network-and-logging.xml on clickhouse-02" + + + debug + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + 1000M + 3 + + + cluster_1S_2R node 2 + 0.0.0.0 + 8123 + 9000 + +``` + +### マクロの設定 + +マクロの設定はclickhouse-01とclickhouse-02で異なります。`replica`はこのノードで`02`に設定されています。 + +```xml title="/etc/clickhouse-server/config.d/macros.xml on clickhouse-02" + + + 01 + + 02 + cluster_1S_2R + + +``` + +### レプリケーションとシャーディングの設定 + +このファイルは、clickhouse-01とclickhouse-02で同じです。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml on clickhouse-02" + + + + mysecretphrase + + true + + clickhouse-01 + 9000 + + + clickhouse-02 + 9000 + + + + + +``` + +### Keeperの使用を設定する + +このファイルは、clickhouse-01とclickhouse-02で同じです。 + +```xml title="/etc/clickhouse-server/config.d/use-keeper.xml on clickhouse-02" + + + + + clickhouse-keeper-01 + 9181 + + + clickhouse-keeper-02 + 9181 + + + clickhouse-keeper-03 + 9181 + + + +``` + +## clickhouse-keeper-01の設定 + + + +ClickHouse Keeperは、データレプリケーションと分散DDLクエリの実行を調整するシステムを提供します。ClickHouse KeeperはApache ZooKeeperと互換性があります。この設定はポート9181でClickHouse Keeperを有効にします。強調されている行は、このKeeperのインスタンスがserver_id 1を持っていることを指定しています。これは、3つのサーバーすべての`enable-keeper.xml`ファイルで唯一の違いです。`clickhouse-keeper-02`では`server_id`が`2`に設定され、`clickhouse-keeper-03`では`server_id`が`3`に設定されます。raft設定セクションは3台のサーバーすべてで同じであり、`server_id`とraft設定内の`server`インスタンスの関係を示すために以下で強調されています。 + +:::note +なんらかの理由でKeeperノードが置き換えられたり再構築されたりした場合、既存の`server_id`を再利用しないでください。例えば、`server_id`が`2`のKeeperノードが再構築された場合、`server_id`を`4`以上に設定してください。 +::: + +```xml title="/etc/clickhouse-keeper/keeper_config.xml on clickhouse-keeper-01" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + trace + + + + + 1 + clickhouse-keeper-01 + 9234 + + + + 2 + clickhouse-keeper-02 + 9234 + + + 3 + clickhouse-keeper-03 + 9234 + + + + +``` + +## clickhouse-keeper-02の設定 + +`clickhouse-keeper-01`と`clickhouse-keeper-02`間には1行の違いしかありません。このノードでは`server_id`が`2`に設定されています。 + +```xml title="/etc/clickhouse-keeper/keeper_config.xml on clickhouse-keeper-02" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 2 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + trace + + + + 1 + clickhouse-keeper-01 + 9234 + + + + 2 + clickhouse-keeper-02 + 9234 + + + + 3 + clickhouse-keeper-03 + 9234 + + + + +``` + +## clickhouse-keeper-03の設定 + +`clickhouse-keeper-01`と`clickhouse-keeper-03`間には1行の違いしかありません。このノードでは`server_id`が`3`に設定されています。 + +```xml title="/etc/clickhouse-keeper/keeper_config.xml on clickhouse-keeper-03" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + 10000 + 30000 + trace + + + + 1 + clickhouse-keeper-01 + 9234 + + + 2 + clickhouse-keeper-02 + 9234 + + + + 3 + clickhouse-keeper-03 + 9234 + + + + + +``` + +## テスト + +ReplicatedMergeTreeとClickHouse Keeperの経験を得るために、以下のコマンドを実行してみてください。これにより、以下の操作が行えます: +- 上記で設定されたクラスタにデータベースを作成する +- ReplicatedMergeTreeテーブルエンジンを使用してデータベースにテーブルを作成する +- 1つのノードにデータを挿入し、別のノードでクエリを実行する +- 1つのClickHouseサーバーノードを停止する +- 動作中のノードにさらにデータを挿入する +- 停止したノードを再起動する +- 再起動したノードでクエリを実行して、データが利用可能であることを確認する + +### ClickHouse Keeperが動作していることを確認する + +`mntr`コマンドは、ClickHouse Keeperが動作していることを確認し、3つのKeeperノードの関係に関する状態情報を得るために使用されます。この例で使用されている設定では、3つのノードが一緒に動作します。ノードはリーダーを選出し、残りのノードはフォロワーになります。`mntr`コマンドは、パフォーマンスに関連する情報や、特定のノードがフォロワーかリーダーであるかを示します。 + +:::tip +Keeperに`mntr`コマンドを送信するために`netcat`をインストールする必要があるかもしれません。ダウンロード情報については[nmap.org](https://nmap.org/ncat/)ページをご覧ください。 +::: + +```bash title="clickhouse-keeper-01、clickhouse-keeper-02、およびclickhouse-keeper-03のシェルで実行" +echo mntr | nc localhost 9181 +``` +```response title="フォロワーからのレスポンス" +zk_version v23.3.1.2823-testing-46e85357ce2da2a99f56ee83a079e892d7ec3726 +zk_avg_latency 0 +zk_max_latency 0 +zk_min_latency 0 +zk_packets_received 0 +zk_packets_sent 0 +zk_num_alive_connections 0 +zk_outstanding_requests 0 +# highlight-next-line +zk_server_state follower +zk_znode_count 6 +zk_watch_count 0 +zk_ephemerals_count 0 +zk_approximate_data_size 1271 +zk_key_arena_size 4096 +zk_latest_snapshot_size 0 +zk_open_file_descriptor_count 46 +zk_max_file_descriptor_count 18446744073709551615 +``` + +```response title="リーダーからのレスポンス" +zk_version v23.3.1.2823-testing-46e85357ce2da2a99f56ee83a079e892d7ec3726 +zk_avg_latency 0 +zk_max_latency 0 +zk_min_latency 0 +zk_packets_received 0 +zk_packets_sent 0 +zk_num_alive_connections 0 +zk_outstanding_requests 0 +# highlight-next-line +zk_server_state leader +zk_znode_count 6 +zk_watch_count 0 +zk_ephemerals_count 0 +zk_approximate_data_size 1271 +zk_key_arena_size 4096 +zk_latest_snapshot_size 0 +zk_open_file_descriptor_count 48 +zk_max_file_descriptor_count 18446744073709551615 +# highlight-start +zk_followers 2 +zk_synced_followers 2 +# highlight-end +``` + +### ClickHouseクラスタの機能を確認する + +1つのシェルで`clickhouse-01`に`clickhouse client`で接続し、もう1つのシェルで`clickhouse-02`に`clickhouse client`で接続します。 + +1. 上記で設定されたクラスタにデータベースを作成する + +```sql title="ノードclickhouse-01またはclickhouse-02のいずれかで実行" +CREATE DATABASE db1 ON CLUSTER cluster_1S_2R +``` +```response +┌─host──────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ clickhouse-02 │ 9000 │ 0 │ │ 1 │ 0 │ +│ clickhouse-01 │ 9000 │ 0 │ │ 0 │ 0 │ +└───────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +2. ReplicatedMergeTreeテーブルエンジンを使用してデータベースにテーブルを作成する +```sql title="ノードclickhouse-01またはclickhouse-02のいずれかで実行" +CREATE TABLE db1.table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree +ORDER BY id +``` +```response +┌─host──────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ clickhouse-02 │ 9000 │ 0 │ │ 1 │ 0 │ +│ clickhouse-01 │ 9000 │ 0 │ │ 0 │ 0 │ +└───────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` +3. 1つのノードでデータを挿入し、別のノードでクエリを実行する +```sql title="ノードclickhouse-01で実行" +INSERT INTO db1.table1 (id, column1) VALUES (1, 'abc'); +``` + +4. ノード`clickhouse-02`でテーブルをクエリする +```sql title="ノードclickhouse-02で実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +``` + +5. 他のノードでデータを挿入し、ノード`clickhouse-01`でクエリを実行する +```sql title="ノードclickhouse-02で実行" +INSERT INTO db1.table1 (id, column1) VALUES (2, 'def'); +``` + +```sql title="ノードclickhouse-01で実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +``` + +6. 1台のClickHouseサーバーノードを停止する +1台のClickHouseサーバーノードを停止するには、ノードの起動に使用したものと似たオペレーティングシステムコマンドを実行します。`systemctl start`でノードを起動した場合、`systemctl stop`を使用して停止します。 + +7. 動作中のノードにさらにデータを挿入する +```sql title="動作中のノードで実行" +INSERT INTO db1.table1 (id, column1) VALUES (3, 'ghi'); +``` + +データを選択します: +```sql title="動作中のノードで実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 3 │ ghi │ +└────┴─────────┘ +``` + +8. 停止したノードを再起動し、そこでも選択する + +```sql title="再起動したノードで実行" +SELECT * +FROM db1.table1 +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 3 │ ghi │ +└────┴─────────┘ +``` + diff --git a/docs/ja/deployment-guides/terminology.md b/docs/ja/deployment-guides/terminology.md new file mode 100644 index 00000000000..5be89bb6107 --- /dev/null +++ b/docs/ja/deployment-guides/terminology.md @@ -0,0 +1,39 @@ +--- +slug: /ja/architecture/introduction +sidebar_label: はじめに +title: はじめに +sidebar_position: 1 +--- +import ReplicationShardingTerminology from '@site/docs/ja/_snippets/_replication-sharding-terminology.md'; + +これらのデプロイメント例は、ClickHouse Support and Services 組織が ClickHouse ユーザーに提供したアドバイスに基づいています。これらは実際に動作する例であり、ぜひ試してみてからニーズに合わせて調整することをお勧めします。ここで、あなたの要件にぴったり合う例を見つけるかもしれません。あるいは、データが2回ではなく3回レプリケートされる必要がある場合、ここで示されているパターンに従ってもう1つのレプリカを追加することができるでしょう。 + + + +## 例 + +### 基本 + +- [**スケールアウト**](/docs/ja/deployment-guides/horizontal-scaling.md)の例は、データを2つのノードにシャードし、分散テーブルを使用する方法を示しています。これにより、データが2つの ClickHouse ノードに存在することになります。2つの ClickHouse ノードは、分散同期を提供する ClickHouse Keeper も実行します。3つ目のノードは、ClickHouse Keeper クォーラムを完了するために単独で ClickHouse Keeper を実行します。 + +- [**フォルトトレランスのためのレプリケーション**](/docs/ja/deployment-guides/replicated.md)の例は、データを2つのノードにレプリケートし、ReplicatedMergeTree テーブルを使用する方法を示しています。これにより、データが2つの ClickHouse ノードに存在することになります。2つの ClickHouse サーバーノードに加えて、レプリケーションを管理するための3つの ClickHouse Keeper 単独ノードがあります。 + +
+ +
+ +### 中級 + +- 近日公開 + +### 上級 + +- 近日公開 diff --git a/docs/ja/dictionary/images/dictionary-left-any-join.png b/docs/ja/dictionary/images/dictionary-left-any-join.png new file mode 100644 index 00000000000..ee121aa073f Binary files /dev/null and b/docs/ja/dictionary/images/dictionary-left-any-join.png differ diff --git a/docs/ja/dictionary/images/dictionary-use-cases.png b/docs/ja/dictionary/images/dictionary-use-cases.png new file mode 100644 index 00000000000..a67ef6271cd Binary files /dev/null and b/docs/ja/dictionary/images/dictionary-use-cases.png differ diff --git a/docs/ja/dictionary/index.md b/docs/ja/dictionary/index.md new file mode 100644 index 00000000000..e04b063cf8c --- /dev/null +++ b/docs/ja/dictionary/index.md @@ -0,0 +1,334 @@ +--- +slug: /ja/dictionary +title: Dictionary +keywords: [dictionary, dictionaries] +description: Dictionaryはデータを高速に検索するためのキー-バリュー表現を提供します。 +--- + +# Dictionary + +ClickHouseのDictionaryは、さまざまな[内部および外部ソース](/ja/sql-reference/dictionaries#dictionary-sources)からデータをインメモリの[キー-バリュー](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)形式で表現し、超低レイテンシーのクエリ検索に最適化します。 + +Dictionaryは以下の用途に役立ちます: +- 特に`JOIN`を使用するクエリのパフォーマンスを向上させる +- インジェストプロセスを遅らせることなく、取り込んだデータをその場で豊かにする + +![Uses cases for Dictionary in ClickHouse](./images/dictionary-use-cases.png) + +## Dictionaryを利用してJOINを高速化する + +Dictionaryは特定の種類の`JOIN`、すなわち結合キーが基底のキー-バリューストレージのキー属性と一致する必要がある[`LEFT ANY`型](/ja/sql-reference/statements/select/join#supported-types-of-join)の速度を向上させるために使用できます。 + +Using Dictionary with LEFT ANY JOIN + +この場合、ClickHouseはDictionaryを利用して[Direct Join](https://clickhouse.com/blog/clickhouse-fully-supports-joins-direct-join-part4#direct-join)を実行できます。これはClickHouseの最速のJOINアルゴリズムであり、右テーブルの[テーブルエンジン](/ja/engines/table-engines)が低レイテンシーのキー-バリューリクエストをサポートする場合に適用されます。ClickHouseには3つのこの要件を満たすテーブルエンジンがあります:[Join](/ja/engines/table-engines/special/join)(基本的に事前計算されたハッシュテーブル)、[EmbeddedRocksDB](/ja/engines/table-engines/integrations/embedded-rocksdb)、および[Dictionary](/ja/engines/table-engines/special/dictionary)です。以下ではDictionaryを利用する方法を説明しますが、メカニズムはこれら3つのエンジンで同じです。 + +直接結合アルゴリズムは、右テーブルがDictionaryでサポートされ、結合されるデータがすでに低レイテンシーのキー-バリューデータ構造の形式でメモリに存在していることを要求します。 + +### 例 + +StackOverflowのデータセットを使用して、次の質問に答えます: +*Hacker Newsで最も議論を呼んでいるSQLに関する投稿は何ですか?* + +議論を呼ぶ投稿とは、賛成票と反対票が似た数であるものと定義します。この絶対差を計算し、0に近い値ほど論争の的になっています。投稿には少なくとも10以上の賛成票と反対票がある必要があると仮定します。投票されない投稿はそれほど議論の的になっていません。 + +データが正規化された状態で、このクエリは`posts`と`votes`テーブルを使用した`JOIN`を要求します: + +```sql +WITH PostIds AS +( + SELECT Id + FROM posts + WHERE Title ILIKE '%SQL%' +) +SELECT + Id, + Title, + UpVotes, + DownVotes, + abs(UpVotes - DownVotes) AS Controversial_ratio +FROM posts +INNER JOIN +( + SELECT + PostId, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes + FROM votes + WHERE PostId IN (PostIds) + GROUP BY PostId + HAVING (UpVotes > 10) AND (DownVotes > 10) +) AS votes ON posts.Id = votes.PostId +WHERE Id IN (PostIds) +ORDER BY Controversial_ratio ASC +LIMIT 1 + +Row 1: +────── +Id: 25372161 +Title: How to add exception handling to SqlDataSource.UpdateCommand +UpVotes: 13 +DownVotes: 13 +Controversial_ratio: 0 + +1 rows in set. Elapsed: 1.283 sec. Processed 418.44 million rows, 7.23 GB (326.07 million rows/s., 5.63 GB/s.) +Peak memory usage: 3.18 GiB. +``` + +>**`JOIN`の右側に小さなデータセットを使用する**:このクエリは必要以上に冗長に見えるかもしれませんが、`PostId`でのフィルタリングを外部およびサブクエリの両方で行っています。これはクエリ応答時間を速くするためのパフォーマンス最適化です。最適なパフォーマンスを得るためには、常に`JOIN`の右側が小さなセットであり、可能な限り小さくすることを確認してください。JOINパフォーマンスを最適化し、使用可能なアルゴリズムを理解するためのヒントについては、[このブログ記事シリーズ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)をお勧めします。 + +このクエリは速いですが、良好なパフォーマンスを実現するために私たちがJOINを慎重に書くことに依存しています。理想的には、投稿を「SQL」を含むものだけにフィルタリングし、そのサブセットのブログに対して`UpVote`と`DownVote`のカウントを確認し、我々の指標を計算するのが望ましいでしょう。 + +#### Dictionaryの適用 + +これらの概念を説明するために、投票データに対してDictionaryを使用します。Dictionaryは通常メモリ内に保持されます([ssd_cache](/ja/sql-reference/dictionaries#ssd_cache)は例外です)、したがってデータのサイズに注意を払う必要があります。我々の`votes`テーブルサイズを確認します: + +```sql +SELECT table, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE table IN ('votes') +GROUP BY table + +┌─table───────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ votes │ 1.25 GiB │ 3.79 GiB │ 3.04 │ +└─────────────────┴─────────────────┴───────────────────┴───────┘ +``` + +Dictionary内にデータを非圧縮で保存するため、すべてのカラムを(しませんが)Dictionaryに保存するならば、少なくとも4GBのメモリが必要です。Dictionaryはクラスタ全体でレプリケートされるため、このメモリ量は*各ノード*ごとに予約する必要があります。 + +> 以下の例では、DictionaryのデータはClickHouseテーブルから取得されています。これがDictionaryの最も一般的なソースを表していますが、[複数のソース](/ja/sql-reference/dictionaries#dictionary-sources)がサポートされています。これにはファイル、http、Postgresを含むデータベースが含まれ、その中には小さなデータセットが完全に更新される理想的な方法として自動的にリフレッシュされ、直接JOINに利用されるものもあります。 + +Dictionaryには、ルックアップが実行される主キーが必要です。これはトランザクションデータベースの主キーと概念的に同一であり、一意である必要があります。先ほどのクエリでは、結合キーである`PostId`でのルックアップが必要です。Dictionaryは`votes`テーブルから`PostId`ごとの賛成票と反対票の合計を含めてオリジナルにする必要があります。このDictionaryデータを取得するためのクエリは次の通りです: + +```sql +SELECT PostId, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes +FROM votes +GROUP BY PostId +``` + +Dictionaryを作成するための以下のDDLが必要です - クエリの使用に注意してください: + +```sql +CREATE DICTIONARY votes_dict +( + `PostId` UInt64, + `UpVotes` UInt32, + `DownVotes` UInt32 +) +PRIMARY KEY PostId +SOURCE(CLICKHOUSE(QUERY 'SELECT PostId, countIf(VoteTypeId = 2) AS UpVotes, countIf(VoteTypeId = 3) AS DownVotes FROM votes GROUP BY PostId')) +LIFETIME(MIN 600 MAX 900) +LAYOUT(HASHED()) + +0 rows in set. Elapsed: 36.063 sec. +``` + +> セルフマネージドのOSSでは、上記のコマンドをすべてのノードで実行する必要があります。ClickHouse Cloudでは、Dictionaryは自動的にすべてのノードにレプリケートされます。上記は64GBのRAMを持つClickHouse Cloudノードで実行され、ロードするのに36秒かかります。 + +Dictionaryが消費するメモリを確認する: + +```sql +SELECT formatReadableSize(bytes_allocated) AS size +FROM system.dictionaries +WHERE name = 'votes_dict' + +┌─size─────┐ +│ 4.00 GiB │ +└──────────┘ +``` + +特定の`PostId`の賛成票と反対票を取得するには、単純な`dictGet`関数を使用できます。以下には投稿`11227902`の値を取得します: + +```sql +SELECT dictGet('votes_dict', ('UpVotes', 'DownVotes'), '11227902') AS votes + +┌─votes──────┐ +│ (34999,32) │ +└────────────┘ +``` + +これを前のクエリで利用して、JOINを削除できます: + +```sql +WITH PostIds AS +( + SELECT Id + FROM posts + WHERE Title ILIKE '%SQL%' +) +SELECT Id, Title, + dictGet('votes_dict', 'UpVotes', Id) AS UpVotes, + dictGet('votes_dict', 'DownVotes', Id) AS DownVotes, + abs(UpVotes - DownVotes) AS Controversial_ratio +FROM posts +WHERE (Id IN (PostIds)) AND (UpVotes > 10) AND (UpVotes > 10) +ORDER BY Controversial_ratio ASC +LIMIT 3 + +3 rows in set. Elapsed: 0.551 sec. Processed 119.64 million rows, 3.29 GB (216.96 million rows/s., 5.97 GB/s.) +Peak memory usage: 552.26 MiB. +``` + +このクエリは単純であるだけでなく、2倍以上速くなりました。更に最適化されたクエリにするために、10票以上の賛成票と反対票を持つ投稿のみをDictionaryにロードし、事前計算された議論値を保存するだけです。 + +## クエリ時のエンリッチメント + +Dictionariesはクエリ時に値をルックアップするために使用できます。これらの値は結果に含めることも、集計に使用することもできます。ユーザーIDをその場所にマッピングするDictionaryを作成したとしましょう: + +```sql +CREATE DICTIONARY users_dict +( + `Id` Int32, + `Location` String +) +PRIMARY KEY Id +SOURCE(CLICKHOUSE(QUERY 'SELECT Id, Location FROM stackoverflow.users')) +LIFETIME(MIN 600 MAX 900) +LAYOUT(HASHED()) +``` + +このDictionaryを使用して投稿の結果を豊かにすることができます: + +```sql +SELECT + Id, + Title, + dictGet('users_dict', 'Location', CAST(OwnerUserId, 'UInt64')) AS location +FROM posts +WHERE Title ILIKE '%clickhouse%' +LIMIT 5 +FORMAT PrettyCompactMonoBlock + +┌───────Id─┬─Title─────────────────────────────────────────────────────────┬─Location──────────────┐ +│ 52296928 │ Comparision between two Strings in ClickHouse │ Spain │ +│ 52345137 │ How to use a file to migrate data from mysql to a clickhouse? │ 中国江苏省Nanjing Shi │ +│ 61452077 │ How to change PARTITION in clickhouse │ Guangzhou, 广东省中国 │ +│ 55608325 │ Clickhouse select last record without max() on all table │ Moscow, Russia │ +│ 55758594 │ ClickHouse create temporary table │ Perm', Russia │ +└──────────┴───────────────────────────────────────────────────────────────┴───────────────────────┘ + +5 rows in set. Elapsed: 0.033 sec. Processed 4.25 million rows, 82.84 MB (130.62 million rows/s., 2.55 GB/s.) +Peak memory usage: 249.32 MiB. +``` + +以前のJOINの例と同様に、同じDictionaryを使ってどこからの投稿が最も多いかを効率的に確認できます: + +```sql +SELECT + dictGet('users_dict', 'Location', CAST(OwnerUserId, 'UInt64')) AS location, + count() AS c +FROM posts +WHERE location != '' +GROUP BY location +ORDER BY c DESC +LIMIT 5 + +┌─location───────────────┬──────c─┐ +│ India │ 787814 │ +│ Germany │ 685347 │ +│ United States │ 595818 │ +│ London, United Kingdom │ 538738 │ +│ United Kingdom │ 537699 │ +└────────────────────────┴────────┘ + +5 rows in set. Elapsed: 0.763 sec. Processed 59.82 million rows, 239.28 MB (78.40 million rows/s., 313.60 MB/s.) +Peak memory usage: 248.84 MiB. +``` + +## インデックス時のエンリッチメント + +上の例では、クエリ時にDictionaryを使用してJOINを削除しましたが、DictionaryはINSERT時に行をエンリッチするためにも使用できます。これは通常、エンリッチメント値が変更されず、Dictionaryを作成するために使用する外部ソースに存在する場合に適しています。この場合、行をINSERT時にエンリッチすることで、クエリ時のDictionaryへのルックアップを回避できます。 + +Stack Overflowのユーザーの`Location`(実際には変わる)は決して変更しないと仮定します - 特に`users`テーブルの`Location`カラムです。投稿テーブルでLocationごとに分析クエリを実行したいと仮定します。投稿テーブルには`UserId`があります。 + +ユーザーIDから場所へのマッピングを提供するDictionaryを作成します。これは`users`テーブルにバックされています: + +```sql +CREATE DICTIONARY users_dict +( + `Id` UInt64, + `Location` String +) +PRIMARY KEY Id +SOURCE(CLICKHOUSE(QUERY 'SELECT Id, Location FROM users WHERE Id >= 0')) +LIFETIME(MIN 600 MAX 900) +LAYOUT(HASHED()) +``` + +> `Id < 0`のユーザーを除外し、`Hashed`字典タイプを使用可能にしています。`Id < 0`のユーザーはシステムユーザーです。 + +投稿テーブルに対してINSERT時にこのDictionaryを利用するには、スキーマを修正する必要があります: + +```sql +CREATE TABLE posts_with_location +( + `Id` UInt32, + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + … + `Location` MATERIALIZED dictGet(users_dict, 'Location', OwnerUserId::'UInt64') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CommentCount) +``` + +この例では、`Location`は`MATERIALIZED`カラムとして宣言されています。これは、`INSERT`クエリの一部として値が提供される可能性があり、常に計算されることを意味します。 + +> ClickHouseはまた、[`DEFAULT`カラム](/ja/sql-reference/statements/create/table#default_values)もサポートしています(値は挿入されるか、提供されていない場合は計算されます)。 + +テーブルをポピュレートするために、通常の`INSERT INTO SELECT`をS3から使用できます: + +```sql +INSERT INTO posts_with_location SELECT Id, PostTypeId::UInt8, AcceptedAnswerId, CreationDate, Score, ViewCount, Body, OwnerUserId, OwnerDisplayName, LastEditorUserId, LastEditorDisplayName, LastEditDate, LastActivityDate, Title, Tags, AnswerCount, CommentCount, FavoriteCount, ContentLicense, ParentId, CommunityOwnedDate, ClosedDate FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 36.830 sec. Processed 238.98 million rows, 2.64 GB (6.49 million rows/s., 71.79 MB/s.) +``` + +これで、最も多くの投稿がどの場所から来ているかを確認できます: + +```sql +SELECT Location, count() AS c +FROM posts_with_location +WHERE Location != '' +GROUP BY Location +ORDER BY c DESC +LIMIT 4 + +┌─Location───────────────┬──────c─┐ +│ India │ 787814 │ +│ Germany │ 685347 │ +│ United States │ 595818 │ +│ London, United Kingdom │ 538738 │ +└────────────────────────┘ + +4 rows in set. Elapsed: 0.142 sec. Processed 59.82 million rows, 1.08 GB (420.73 million rows/s., 7.60 GB/s.) +Peak memory usage: 666.82 MiB. +``` + +## 高度なDictionaryトピック + +### Dictionary`LAYOUT`の選択 + +`LAYOUT`句はDictionaryの内部データ構造を制御します。いくつかのオプションが存在し、[こちら](/ja/sql-reference/dictionaries#ways-to-store-dictionaries-in-memory)にドキュメント化されています。正しいレイアウトを選ぶためのヒントは[こちら](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse#choosing-a-layout)で見つけることができます。 + +### Dictionaryのリフレッシュ + +Dictionaryには`LIFETIME`として`MIN 600 MAX 900`を指定しています。LIFETIMEはDictionaryの更新間隔を指し、ここでの値は600から900秒のランダムな間隔で周期的にリロードされます。このランダムな間隔は、多数のサーバー上で更新する際のDictionaryソースの負荷を分散するために必要です。更新中でも古いバージョンのDictionaryは依然としてクエリ可能で、最初のロードのみがクエリをブロックします。`(LIFETIME(0))`を設定すると、Dictionaryの更新が防止されます。Dictionaryは`SYSTEM RELOAD DICTIONARY`コマンドを使用して強制的にリロードすることができます。 + +ClickHouseやPostgresのようなデータベースソースの場合、Dictionaryが本当に変更された場合のみ(クエリの応答により判断されます)更新するようにクエリを設定することが可能で、周期的な間隔よりも効率的です。詳細は[こちら](/ja/sql-reference/dictionaries#refreshing-dictionary-data-using-lifetime)で確認できます。 + +### 他のDictionaryタイプ + +ClickHouseは[階層型](/ja/sql-reference/dictionaries#hierarchical-dictionaries)、[ポリゴン型](/ja/sql-reference/dictionaries#polygon-dictionaries)および[正規表現](/ja/sql-reference/dictionaries#regexp-tree-dictionary)Dictionaryもサポートしています。 + +### 詳細な読み物 + +- [クエリを加速するためのDictionaryの使用](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) +- [Dictionaryの高度な設定](/ja/sql-reference/dictionaries) diff --git a/docs/ja/faq/_category_.yml b/docs/ja/faq/_category_.yml new file mode 100644 index 00000000000..d3b55f0a328 --- /dev/null +++ b/docs/ja/faq/_category_.yml @@ -0,0 +1,7 @@ +position: 1 +label: 'FAQ' +collapsible: true +collapsed: true +link: + type: doc + id: en/faq/index diff --git a/docs/ja/faq/general/_category_.yml b/docs/ja/faq/general/_category_.yml new file mode 100644 index 00000000000..52163f94150 --- /dev/null +++ b/docs/ja/faq/general/_category_.yml @@ -0,0 +1,4 @@ +position: 10 +label: 'General' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/general/columnar-database.md b/docs/ja/faq/general/columnar-database.md new file mode 100644 index 00000000000..247a308b66b --- /dev/null +++ b/docs/ja/faq/general/columnar-database.md @@ -0,0 +1,26 @@ +--- +slug: /ja/faq/general/columnar-database +title: 列指向データベースとは? +toc_hidden: true +toc_priority: 101 +--- + +# 列指向データベースとは? {#what-is-a-columnar-database} + +列指向データベースは、各カラムのデータを独立して保存します。これにより、クエリで使用されるカラムだけのデータをディスクから読み取ることができます。その代わりに、行全体に影響を与える操作のコストが相対的に高くなります。列指向データベースの同義語は、列指向データベース管理システムです。ClickHouseはそのようなシステムの典型例です。 + +列指向データベースの主要な利点は次の通りです: + +- 多くのカラムの中からほんの数カラムだけを使用するクエリ。 +- 大量のデータに対する集約クエリ。 +- カラム単位でのデータ圧縮。 + +レポート作成時の従来の行指向システムと列指向データベースの違いを以下に示します: + +**従来の行指向** +![従来の行指向](@site/docs/ja/images/row-oriented.gif#) + +**列指向データベース** +![列指向データベース](@site/docs/ja/images/column-oriented.gif#) + +列指向データベースは分析アプリケーションに最適です。なぜなら、テーブルに多くのカラムを用意しておくことができ、未使用のカラムに対してクエリ実行時間中にコストを払う必要がないからです(従来のOLTPデータベースは、データが行で保存されているため、クエリ時にすべてのデータを読み込む必要があります)。列指向データベースはビッグデータ処理とデータウェアハウジングのために設計されており、しばしば安価なハードウェアの分散クラスタを使ってスケールします。ClickHouseは、[分散テーブル](../../engines/table-engines/special/distributed.md)と[レプリケーションテーブル](../../engines/table-engines/mergetree-family/replication.md)の組み合わせでこれを実現します。 diff --git a/docs/ja/faq/general/dbms-naming.md b/docs/ja/faq/general/dbms-naming.md new file mode 100644 index 00000000000..fb391198d24 --- /dev/null +++ b/docs/ja/faq/general/dbms-naming.md @@ -0,0 +1,19 @@ +--- +slug: /ja/faq/general/dbms-naming +title: "「ClickHouse」とはどういう意味ですか?" +toc_hidden: true +toc_priority: 10 +--- + +# 「ClickHouse」とはどういう意味ですか? {#what-does-clickhouse-mean} + +「**Click**stream」と「Data ware**House**」を組み合わせたものです。これは、ClickHouseが元々Yandex.Metricaでの初期のユースケースから名付けられたもので、インターネット上のすべてのクリックを記録することが目的でした。そして現在でもその役割を果たしています。このユースケースについて詳しくは[ClickHouseの歴史](../../about-us/history.md)ページをご覧ください。 + +この二重の意味には、次の2つの結果があります: + +- Click**H**ouseを書く正しい方法は、Hを大文字にすることです。 +- 略す必要がある場合には、**CH**を使用してください。歴史的な理由から、中国ではCKと略すことが人気がありますが、これは主に中国語でのClickHouseに関する最初の講演の一つでこの形が使われたからです。 + +:::info +ClickHouseがその名を取得してから何年も経った後、独立して意味を持つ2つの言葉を組み合わせるこの手法は、[Andy Pavloによる研究](https://www.cs.cmu.edu/~pavlo/blog/2020/03/on-naming-a-database-management-system.html)で、データベースに名前を付ける最良の方法として取り上げられました。彼はカーネギーメロン大学のデータベース准教授です。ClickHouseは、Postgresと共に「今までで最高のデータベース名」賞を受賞しました。 +::: diff --git a/docs/ja/faq/general/index.md b/docs/ja/faq/general/index.md new file mode 100644 index 00000000000..78fe2ad0f44 --- /dev/null +++ b/docs/ja/faq/general/index.md @@ -0,0 +1,23 @@ +--- +slug: /ja/faq/general/ +sidebar_position: 1 +sidebar_label: ClickHouseに関する一般的な質問 +keywords: [clickhouse, faq, 質問, とは] +--- + +# ClickHouseに関する一般的な質問 + +- [ClickHouseとは何ですか?](../../intro.md) +- [なぜClickHouseはこんなに速いのですか?](../../concepts/why-clickhouse-is-so-fast.md) +- [誰がClickHouseを使用していますか?](../../faq/general/who-is-using-clickhouse.md) +- [「ClickHouse」とはどういう意味ですか?](../../faq/general/dbms-naming.md) +- [「Не тормозит」とはどういう意味ですか?](../../faq/general/ne-tormozit.md) +- [OLAPとは何ですか?](../../faq/general/olap.md) +- [カラム型データベースとは何ですか?](../../faq/general/columnar-database.md) +- [どのように主キーを選択すればいいですか?](../../guides/best-practices/sparse-primary-indexes.md) +- [なぜMapReduceのようなものを使わないのですか?](../../faq/general/mapreduce.md) +- [ClickHouseにコードを貢献するにはどうすればよいですか?](/knowledgebase/how-do-i-contribute-code-to-clickhouse) + +:::info お探しの情報が見つからない場合 +[Knowledge Base](/knowledgebase/)をチェックし、ドキュメント内の多数の有用な記事もご参照ください。 +::: diff --git a/docs/ja/faq/general/mapreduce.md b/docs/ja/faq/general/mapreduce.md new file mode 100644 index 00000000000..35d3ebd81ef --- /dev/null +++ b/docs/ja/faq/general/mapreduce.md @@ -0,0 +1,14 @@ +--- +slug: /ja/faq/general/mapreduce +title: MapReduceのようなものを使わない理由 +toc_hidden: true +toc_priority: 110 +--- + +# MapReduceのようなものを使わない理由 {#why-not-use-something-like-mapreduce} + +MapReduceのようなシステムは、分散ソートに基づくreduce操作を行う分散コンピューティングシステムとして参照できます。このクラスで最も一般的なオープンソースソリューションは、[Apache Hadoop](http://hadoop.apache.org)です。 + +これらのシステムは高レイテンシーのため、オンラインクエリには適していません。言い換えれば、ウェブインターフェースのバックエンドとして使用することはできません。リアルタイムデータの更新にも不向きです。分散ソートは、操作結果やすべての中間結果(存在する場合)が単一サーバーのRAMにあるのが通常のオンラインクエリでは、reduce操作を実行する最善の方法ではありません。このような場合、ハッシュテーブルがreduce操作を行うための最適な方法です。map-reduceタスクを最適化する一般的なアプローチは、RAM内でハッシュテーブルを使用した事前集計(部分的なreduce)です。この最適化はユーザーが手動で行います。分散ソートは、簡単なmap-reduceタスクを実行する際のパフォーマンス低下の主な原因の一つです。 + +ほとんどのMapReduceの実装は、クラスター上で任意のコードを実行することを可能にしますが、実験を迅速に実行するためにはOLAPに適した宣言型クエリ言語の方が優れています。例えば、HadoopにはHiveやPigがあります。また、Cloudera ImpalaやShark(廃止された)をSpark用として考慮することもできますし、Spark SQL、Presto、Apache Drillも同様です。このようなタスクを実行する際のパフォーマンスは、専門システムと比較して非常に非効率的ですが、比較的高いレイテンシーにより、これらのシステムをウェブインターフェースのバックエンドとして使用することは現実的ではありません。 diff --git a/docs/ja/faq/general/ne-tormozit.md b/docs/ja/faq/general/ne-tormozit.md new file mode 100644 index 00000000000..7152a6ab3ef --- /dev/null +++ b/docs/ja/faq/general/ne-tormozit.md @@ -0,0 +1,26 @@ +--- +slug: /ja/faq/general/ne-tormozit +title: 「“не тормозит”とは何を意味しますか?」 +toc_hidden: true +toc_priority: 11 +--- + +# 「не тормозит」とは何を意味しますか? {#what-does-ne-tormozit-mean} + +この質問は、公式のClickHouse Tシャツを見たときによく出てきます。Tシャツの前面には大きく「**ClickHouse не тормозит**」と書かれています。 + +ClickHouseがオープンソースになる前は、ロシア最大のIT企業である[Yandex](https://yandex.com/company/)によって社内ストレージシステムとして開発されていました。そのため、最初はロシア語で「не тормозит」(発音は「ネ・トルモジット」)というスローガンが付けられました。オープンソースとしてリリースされた後、ロシアでのイベント用にそのスローガンをそのまま使ったTシャツを最初に製作しました。 + +その後、ロシア国外のイベントでも配布を予定していた次のバッチに対して、スローガンの英語版を作ろうとしました。しかし、ロシア語は物事を表現するのに優雅な言語であるため、スペースの制限があるTシャツにうまく翻訳することができず(多くの選択肢が長すぎたり不正確だったりしました)、国際的なイベント用に製作したTシャツでもロシア語のままスローガンを維持することにしました。この選択は素晴らしい決断となり、世界中の人々がそれを見て好奇心をくすぐられたり、驚いたりしています。 + +では、それは何を意味するのでしょうか?「не тормозит」を翻訳すると以下のようになります。 + +- 文字通りに翻訳すると、「ClickHouseはブレーキペダルを踏まない」という感じです。 +- IT背景を持つロシアの人には、「大規模なシステムが遅れるのは、ClickHouseのせいではない」と聞こえるかもしれません。 +- より短く、しかしそれほど正確ではないバージョンとしては、「ClickHouseは遅くない」「ClickHouseは遅れない」あるいは単に「ClickHouseは高速」のようになります。 + +これらのTシャツを直接見たことがない場合は、ClickHouse関連の多くのビデオでオンラインで見ることができます。例えば、このビデオです: + + + +P.S. これらのTシャツは販売されておらず、ほとんどの[ClickHouse Meetup](https://www.meetup.com/pro/clickhouse/)で、特に優れた質問をしたり、その他の形で積極的に参加した方に無料で配布されます。 diff --git a/docs/ja/faq/general/olap.md b/docs/ja/faq/general/olap.md new file mode 100644 index 00000000000..7e7e35109ca --- /dev/null +++ b/docs/ja/faq/general/olap.md @@ -0,0 +1,40 @@ +--- +slug: /ja/faq/general/olap +title: OLAPとは何ですか? +toc_hidden: true +toc_priority: 100 +--- + +# OLAPとは何ですか? {#what-is-olap} + +[OLAP](https://en.wikipedia.org/wiki/Online_analytical_processing)は、オンライン分析処理(Online Analytical Processing)の略です。技術的視点とビジネス的視点の2つの視点から見ることができますが、非常に高いレベルではこれらの単語を逆から読むだけで理解できます。 + +処理 +: いくつかのソースデータが処理され… + +分析 +: …分析レポートや洞察を生成し… + +オンライン +: …リアルタイムで行われます。 + +## ビジネスの視点から見たOLAP {#olap-from-the-business-perspective} + +近年、ビジネス関係者はデータの価値に気づき始めました。盲目的に意思決定を行う企業は多くの場合、競争に追いつけなくなります。成功している企業のデータ駆動アプローチは、ビジネス決定を行う上で遠くからでも役立つ可能性のあるすべてのデータを収集し、それらをタイムリーに分析するメカニズムを必要とします。そこでOLAPデータベース管理システム(DBMS)が登場します。 + +ビジネスの観点から、OLAPは企業が継続的に計画し、分析し、運用活動を報告することを可能にし、その結果、効率を最大化し、経費を削減し、最終的には市場シェアを獲得することができます。これは社内のシステムで行うことも、ウェブやモバイルの分析サービス、CRMサービスなど、SaaSプロバイダーにアウトソースすることも可能です。OLAPは、多くのBIアプリケーション(ビジネスインテリジェンス)の背後にある技術です。 + +ClickHouseは、特定のドメインデータを分析するためのSaaSソリューションのバックエンドとしてよく使用されるOLAPデータベース管理システムです。しかし、いまだに第三者プロバイダーとデータを共有することを躊躇するビジネスもあり、社内データウェアハウスというシナリオも現実的です。 + +## 技術的視点から見たOLAP {#olap-from-the-technical-perspective} + +すべてのデータベース管理システムは、OLAP(オンライン**分析**処理)とOLTP(オンライン**取引**処理)の2つのグループに分類できます。前者は、大量の履歴データに基づくレポートを作成することに重点を置いていますが、それほど頻繁には行っていません。一方、後者は通常、トランザクションの連続ストリームを処理し、データの現在の状態を常に変更します。 + +実際には、OLAPとOLTPはカテゴリではなく、スペクトラムです。ほとんどの実際のシステムはそのどちらかに焦点を当てていますが、反対の種類のワークロードが望ましい場合に備えて、いくつかのソリューションや回避策を提供しています。この状況は、多くのストレージシステムを統合して操作することを企業に強制し、それは大したことではないかもしれませんが、システムを増やすことでメンテナンスがより高価になります。したがって、最近のトレンドは、HTAP(**ハイブリッド取引/分析処理**)に移行しており、両方の種類のワークロードが単一のデータベース管理システムで同等にうまく処理されます。 + +もしDBMSが純粋なOLAPまたは純粋なOLTPとして始まったとしても、それらは競争に追いつくためにHTAPの方向に進むことを強いられます。ClickHouseも例外ではありません。最初は[できるだけ速いOLAPシステム](/ja/concepts/why-clickhouse-is-so-fast)として設計されており、完全なトランザクションサポートはまだありませんが、一貫した読み書きやデータの更新/削除のためのミューテーションのような機能は追加する必要がありました。 + +OLAPとOLTPシステム間の基本的なトレードオフは変わりません: + +- 分析レポートを効率的に構築するには、カラムを別々に読み取ることが重要であるため、ほとんどのOLAPデータベースは[列指向](/ja/faq/general/columnar-database)です。 +- カラムを別々に保存すると、行の追加やインプレースの修正などの操作のコストが、カラムの数(システムがイベントのすべての詳細を万が一に備えて収集しようとする場合は膨大になる可能性がある)に比例して増加します。したがって、ほとんどのOLTPシステムはデータを行ごとに配置して保存しています。 diff --git a/docs/ja/faq/general/who-is-using-clickhouse.md b/docs/ja/faq/general/who-is-using-clickhouse.md new file mode 100644 index 00000000000..a3531418850 --- /dev/null +++ b/docs/ja/faq/general/who-is-using-clickhouse.md @@ -0,0 +1,20 @@ +--- +slug: /ja/faq/general/who-is-using-clickhouse +title: ClickHouseを使用しているのは誰ですか? +toc_hidden: true +toc_priority: 9 +--- + +# ClickHouseを使用しているのは誰ですか? {#who-is-using-clickhouse} + +オープンソース製品であるため、この質問に答えるのはそれほど簡単ではありません。ClickHouseを使いたい場合、誰にも言う必要はなく、ソースコードや事前コンパイルパッケージを取得するだけです。契約を結ぶ必要はなく、[Apache 2.0 ライセンス](https://github.com/ClickHouse/ClickHouse/blob/master/LICENSE)によって制約のないソフトウェア配布が許可されています。 + +また、技術スタックはしばしばNDAでカバーされているかどうかのグレーゾーンにあります。いくつかの企業は、オープンソースであっても競争上の優位性として技術を使用すると考えており、従業員が公に詳細を共有することを許可しません。一部の企業はPRリスクがあると考えており、実装の詳細の公開はPR部門の承認が必要です。 + +では、ClickHouseを使用しているのは誰なのか、どうやって知るのでしょうか? + +一つの方法は、**周りに聞く**ことです。書面でない場合、人々は自分の会社で使用されている技術や、使用例、使用しているハードウェアの種類、データのボリュームなどをより自由に共有します。私たちは世界中の[ClickHouse Meetup](https://www.youtube.com/channel/UChtmrD-dsdpspr42P_PyRAw/playlists)でユーザーと定期的に会話しており、1000社以上の企業がClickHouseを使用しているという話を耳にしています。残念ながら、それらは再現可能ではなく、潜在的なトラブルを避けるため、そのような話はNDAの下で語られたものと考えています。しかし、今後のミートアップに参加し、直接他のユーザーと話すことができます。ミートアップの発表方法はいくつかあり、例えば[Twitter](http://twitter.com/ClickHouseDB/)に登録できます。 + +二つ目の方法は、ClickHouseを使用していることを**公に発表している**企業を探すことです。これには通常、ブログ投稿、講演ビデオ、スライドデッキなどの具体的な証拠があります。私たちの**[Adopters](../../about-us/adopters.md)**ページには、そのような証拠へのリンク集を収集しており、あなたの雇用主のストーリーや見つけたリンクを自由に提供してください(プロセスでNDAを違反しないように注意してください)。 + +採用者リストには、Bloomberg、Cisco、中国電信、Tencent、Lyftなどの非常に大きな会社の名前が見つかりますが、最初の方法ではそれ以上の企業がいることがわかりました。例えば、[Forbesによる最大のIT企業のリスト(2020年)](https://www.forbes.com/sites/hanktucker/2020/05/13/worlds-largest-technology-companies-2020-apple-stays-on-top-zoom-and-uber-debut/)を見ても、その半分以上が何らかの形でClickHouseを使用しています。また、もともとClickHouseを2016年にオープンソース化し、ヨーロッパで最大のIT企業の一つである[Yandex](../../about-us/history.md)も忘れてはなりません。 diff --git a/docs/ja/faq/integration/_category_.yml b/docs/ja/faq/integration/_category_.yml new file mode 100644 index 00000000000..28e8a6f6134 --- /dev/null +++ b/docs/ja/faq/integration/_category_.yml @@ -0,0 +1,4 @@ +position: 20 +label: 'Integration' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/integration/index.md b/docs/ja/faq/integration/index.md new file mode 100644 index 00000000000..5ff92ea6fcf --- /dev/null +++ b/docs/ja/faq/integration/index.md @@ -0,0 +1,20 @@ +--- +slug: /ja/faq/integration/ +sidebar_position: 1 +sidebar_label: ClickHouseと他のシステムの統合 +keywords: [clickhouse, faq, questions, integrations] +--- + +# ClickHouseと他のシステムの統合に関する質問 + +- [ClickHouseからファイルにデータをエクスポートするにはどうすればよいですか?](https://clickhouse.com/docs/knowledgebase/file-export) +- [JSONをClickHouseにインポートする方法は?](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [KafkaをClickHouseに接続するにはどうすればよいですか?](/docs/ja/integrations/data-ingestion/kafka/index.md) +- [JavaアプリケーションをClickHouseに接続できますか?](/docs/ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md) +- [ClickHouseはMySQLのテーブルを読み取れますか?](/docs/ja/integrations/data-ingestion/dbms/mysql/index.md) +- [ClickHouseはPostgreSQLのテーブルを読み取れますか?](/docs/ja/integrations/data-ingestion/dbms/postgresql/index.md) +- [ODBCを介してOracleに接続するときにエンコーディングの問題が発生した場合はどうすればよいですか?](/docs/ja/faq/integration/oracle-odbc.md) + +:::info お探しの情報が見つかりませんか? +[ナレッジベース](/knowledgebase/)をご覧いただき、このドキュメントにある多くの有益な記事もご参照ください。 +::: diff --git a/docs/ja/faq/integration/json-import.md b/docs/ja/faq/integration/json-import.md new file mode 100644 index 00000000000..625c18d13a5 --- /dev/null +++ b/docs/ja/faq/integration/json-import.md @@ -0,0 +1,35 @@ +--- +slug: /ja/faq/integration/json-import +title: ClickHouseにJSONをインポートする方法 +toc_hidden: true +toc_priority: 11 +--- + +# ClickHouseにJSONをインポートする方法 {#how-to-import-json-into-clickhouse} + +ClickHouseは、[入力および出力のためのデータ形式](../../interfaces/formats.md)を幅広くサポートしています。データ取り込みに最も一般的に使用されるJSONのバリエーションの1つは、[JSONEachRow](../../interfaces/formats.md#jsoneachrow)です。この形式では、1つのJSONオブジェクトが1行に対応し、各オブジェクトが改行で区切られます。 + +## 例 {#examples} + +[HTTPインターフェース](../../interfaces/http.md)を使用する場合: + +``` bash +$ echo '{"foo":"bar"}' | curl 'http://localhost:8123/?query=INSERT%20INTO%20test%20FORMAT%20JSONEachRow' --data-binary @- +``` + +[CLIインターフェース](../../interfaces/cli.md)を使用する場合: + +``` bash +$ echo '{"foo":"bar"}' | clickhouse-client --query="INSERT INTO test FORMAT JSONEachRow" +``` + +データを手動で挿入する代わりに、[インテグレーションツール](../../integrations/index.mdx)を使用することも検討してください。 + +## 便利な設定 {#useful-settings} + +- `input_format_skip_unknown_fields` は、テーブルスキーマに存在しない追加のフィールドがあっても、それらを無視してJSONを挿入できるようにします。 +- `input_format_import_nested_json` は、[Nested](../../sql-reference/data-types/nested-data-structures/index.md)型のカラムにネストされたJSONオブジェクトを挿入できるようにします。 + +:::note +設定は、HTTPインターフェースでは `GET` パラメータとして、`CLI` インターフェースでは `--` で始まる追加のコマンドライン引数として指定されます。 +::: diff --git a/docs/ja/faq/integration/oracle-odbc.md b/docs/ja/faq/integration/oracle-odbc.md new file mode 100644 index 00000000000..56ed5b90b77 --- /dev/null +++ b/docs/ja/faq/integration/oracle-odbc.md @@ -0,0 +1,16 @@ +--- +slug: /ja/faq/integration/oracle-odbc +title: ODBC経由でOracleを使用する際にエンコーディングの問題が発生した場合はどうすればよいですか? +toc_hidden: true +toc_priority: 20 +--- + +# ODBC経由でOracleを使用する際にエンコーディングの問題が発生した場合はどうすればよいですか? {#oracle-odbc-encodings} + +OracleをOracle ODBCドライバーを通じてClickHouse外部Dictionaryのソースとして使用する場合、`/etc/default/clickhouse`で`NLS_LANG`環境変数に正しい値を設定する必要があります。詳細については、[Oracle NLS_LANG FAQ](https://www.oracle.com/technetwork/products/globalization/nls-lang-099431.html)を参照してください。 + +**例** + +``` sql +NLS_LANG=RUSSIAN_RUSSIA.UTF8 +``` diff --git a/docs/ja/faq/operations/_category_.yml b/docs/ja/faq/operations/_category_.yml new file mode 100644 index 00000000000..b1843465799 --- /dev/null +++ b/docs/ja/faq/operations/_category_.yml @@ -0,0 +1,4 @@ +position: 30 +label: 'Operations' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/operations/delete-old-data.md b/docs/ja/faq/operations/delete-old-data.md new file mode 100644 index 00000000000..01f0c27e594 --- /dev/null +++ b/docs/ja/faq/operations/delete-old-data.md @@ -0,0 +1,55 @@ +--- +slug: /ja/faq/operations/delete-old-data +title: ClickHouseテーブルから古いレコードを削除できますか? +toc_hidden: true +toc_priority: 20 +--- + +# ClickHouseテーブルから古いレコードを削除できますか? {#is-it-possible-to-delete-old-records-from-a-clickhouse-table} + +短い答えは「はい」です。ClickHouseは、古いデータを削除してディスクスペースを解放するための複数の仕組みを提供しています。各仕組みは異なるシナリオに対応しています。 + +## 有効期限 (TTL) {#ttl} + +ClickHouseは、条件が発生したときに自動的に値を削除することを可能にします。この条件は、通常はタイムスタンプカラムに対する固定オフセットとして、任意のカラムに基づく式として設定されます。 + +このアプローチの主要な利点は、TTLが設定されると、データの削除がバックグラウンドで自動的に行われ、外部システムがトリガーを必要としないことです。 + +:::note +TTLは、データを[/dev/null](https://en.wikipedia.org/wiki/Null_device)に移動するだけでなく、SSDからHDDへのように、異なるストレージシステム間でのデータの移動にも使用できます。 +::: + +[有効期限 (TTL) の設定](../../engines/table-engines/mergetree-family/mergetree.md#table_engine-mergetree-ttl)に関する詳細情報。 + +## DELETE FROM + +[DELETE FROM](/docs/ja/sql-reference/statements/delete.md)は、ClickHouseでの標準的なDELETEクエリの実行を可能にします。フィルタ句で対象とされた行は削除としてマークされ、将来の結果セットから除外されます。行のクリーンアップは非同期で行われます。 + +:::note +DELETE FROMは、バージョン23.3以降で一般に使用可能です。古いバージョンではエクスペリメンタルであり、以下の設定で有効化する必要があります: +``` +SET allow_experimental_lightweight_delete = true; +``` +::: + +## ALTER DELETE {#alter-delete} + +ALTER DELETEは非同期バッチ操作を使用して行を削除します。DELETE FROMとは異なり、ALTER DELETE後に実行され、バッチ操作が完了する前のクエリは、削除対象の行を含めます。詳細は[ALTER DELETE](/docs/ja/sql-reference/statements/alter/delete.md)ドキュメントを参照してください。 + +`ALTER DELETE`は柔軟に古いデータを削除するために発行できます。定期的に行う必要がある場合の主な欠点は、クエリを送信する外部システムが必要になることです。また、ミューテーションは削除する行が1つしかない場合でも完全なパーツをリライトするため、一部のパフォーマンス上の考慮事項があります。 + +これは、ClickHouseを基にしたシステムを[GDPR](https://gdpr-info.eu)準拠にするための最も一般的なアプローチです。 + +[ミューテーション](../../sql-reference/statements/alter/index.md#alter-mutations)に関する詳細情報。 + +## パーティションの削除 {#drop-partition} + +`ALTER TABLE ... DROP PARTITION`は、パーティション全体を削除するためのコスト効率の良い方法です。柔軟性には欠け、テーブル作成時に適切なパーティションスキームの設定が必要ですが、それでも一般的なケースの多くをカバーします。ミューテーションと同様に、定期的に使用するには外部システムから実行する必要があります。 + +[パーティション操作](../../sql-reference/statements/alter/partition.md#alter_drop-partition)に関する詳細情報。 + +## TRUNCATE {#truncate} + +テーブルからすべてのデータを削除することは極端ですが、場合によってはそれが必要なこともあります。 + +[テーブルトランケーション](/docs/ja/sql-reference/statements/truncate.md)に関する詳細情報。 diff --git a/docs/ja/faq/operations/index.md b/docs/ja/faq/operations/index.md new file mode 100644 index 00000000000..70a9258a10d --- /dev/null +++ b/docs/ja/faq/operations/index.md @@ -0,0 +1,20 @@ +--- +slug: /ja/faq/operations/ +sidebar_position: 3 +sidebar_label: ClickHouseサーバーとクラスタの運用に関する質問 +--- + +# ClickHouseサーバーとクラスタの運用に関する質問 + +- [本番環境で使用すべきClickHouseのバージョンはどれですか?](/docs/ja/faq/operations/production.md) +- [ストレージとコンピュートを分離してClickHouseをデプロイすることは可能ですか?](/docs/ja/faq/operations/separate_storage.md) +- [ClickHouseのテーブルから古いレコードを削除することは可能ですか?](/docs/ja/faq/operations/delete-old-data.md) +- [ClickHouse Keeperをどのように構成しますか?](/docs/ja/guides/sre/keeper/index.md) +- [ClickHouseはLDAPと統合できますか?](/docs/ja/guides/sre/user-management/configuring-ldap.md) +- [ClickHouseでユーザー、ロール、権限をどのように構成しますか?](/docs/ja/guides/sre/user-management/index.md) +- [ClickHouseで行を更新または削除できますか?](/docs/ja/guides/developer/mutations.md) +- [ClickHouseはマルチリージョンレプリケーションをサポートしていますか?](/docs/ja/faq/operations/multi-region-replication.md) + +:::info お探しのものが見つかりませんか? +[ナレッジベース](/knowledgebase/)をチェックし、ドキュメントにある多くの記事を参照してください。 +::: diff --git a/docs/ja/faq/operations/multi-region-replication.md b/docs/ja/faq/operations/multi-region-replication.md new file mode 100644 index 00000000000..b2243cea273 --- /dev/null +++ b/docs/ja/faq/operations/multi-region-replication.md @@ -0,0 +1,14 @@ +--- +slug: /ja/faq/operations/multi-region-replication +title: ClickHouseはマルチリージョンレプリケーションをサポートしていますか? +toc_hidden: true +toc_priority: 30 +--- + +# ClickHouseはマルチリージョンレプリケーションをサポートしていますか? {#does-clickhouse-support-multi-region-replication} + +短く言えば「はい」です。ただし、すべてのリージョン/データセンター間の遅延はできるだけ二桁程度に保つことをお勧めします。さもなければ、分散合意プロトコルを経由するため、書き込みパフォーマンスが低下します。たとえば、米国の東西間のレプリケーションは問題なく動作する可能性がありますが、米国とヨーロッパ間ではそうではないかもしれません。 + +設定に関しては、シングルリージョンのレプリケーションと比べて違いはありません。単に異なる場所にあるホストをレプリカとして使用してください。 + +詳細については、[データレプリケーションに関する完全な記事](../../engines/table-engines/mergetree-family/replication.md)をご覧ください。 diff --git a/docs/ja/faq/operations/production.md b/docs/ja/faq/operations/production.md new file mode 100644 index 00000000000..29f3f39e416 --- /dev/null +++ b/docs/ja/faq/operations/production.md @@ -0,0 +1,67 @@ +--- +slug: /ja/faq/operations/production +title: 本番環境で使用するべき ClickHouse バージョンは? +toc_hidden: true +toc_priority: 10 +--- + +# 本番環境で使用するべき ClickHouse バージョンは? {#which-clickhouse-version-to-use-in-production} + +まず最初に、なぜこの質問がよくあるのかを考えてみましょう。主な理由は2つあります。 + +1. ClickHouseは非常に高い速度で開発されており、通常1年に10以上の安定版リリースがあります。そのため、選択肢が多く、単純ではない選択肢となります。 +2. 一部のユーザーは、自分のユースケースに最適なバージョンを見つけるための時間を節約し、他の人のアドバイスに従いたいと考えています。 + +2番目の理由はより根本的なものなので、まずそれについて話し、その後でさまざまなClickHouseリリースをどうナビゲートするかを解説します。 + +## 推奨する ClickHouse バージョンは? {#which-clickhouse-version-do-you-recommend} + +コンサルタントを雇ったり、知られた専門家を信頼して本番環境の責任をなくすことは、魅力的な方法です。誰かが推奨した特定のClickHouseバージョンをインストールし、それに問題があれば、それはあなたの責任ではなく、他の人の責任です。この考え方は大きな罠です。外部の人物があなたの会社の本番環境で何が起こっているかをあなたよりも知っていることはありません。 + +では、どうやって適切にクリックハウスのバージョンを選んでアップグレードすれば良いのでしょうか?または初めてのClickHouseバージョンをどうやって選ぶべきなのでしょうか?まず第一に、**現実的なプレプロダクション環境**を設定するために投資する必要があります。理想的な世界では、それは完全に同一のシャドウコピーである可能性がありますが、それは通常高価です。 + +以下は、それほど高くないコストでプレプロダクション環境に合理的な忠実度を持たせるための重要なポイントです: + +- プレプロダクション環境は、本番で実行する予定のクエリセットにできるだけ近いものを実行する必要があります: + - 固定データで読み取り専用にしないでください。 + - 単にデータをコピーして典型的なレポートを作成せずに書き込み専用にしないでください。 + - スキーママイグレーションを適用する代わりにデータを削除しないでください。 +- 実際の本番データとクエリのサンプルを使用してください。代表的であり、`SELECT`クエリが合理的な結果を返すようなサンプルを選んでください。あなたのデータが機密であり、内部ポリシーが本番環境から離れることを禁じている場合は、難読化を使用してください。 +- プレプロダクションが、本番環境と同様に監視およびアラートソフトウェアでカバーされていることを確認してください。 +- 本番が複数のデータセンターや地域にまたがっている場合は、プレプロダクションでも同様にしてください。 +- 本番がレプリケーションや分散テーブル、マテリアライズドビューの連鎖などの複雑な機能を使用している場合は、プレプロダクションでも同様に設定してください。 +- プレプロダクションで本番とほぼ同じ数のサーバーやVMを使用するか、より小さいが同じサイズのものを使用するかについてのトレードオフがあります。前者はネットワーク関連の問題をさらに検出する可能性がありますが、後者の方が管理が容易です。 + +次に投資するべき分野は、**自動テストインフラストラクチャ**です。ある種類のクエリが1回実行に成功したからといって、それが永遠に成功し続けるとは思わないでください。ClickHouseがモックされたユニットテストをいくつか持つことは問題ありませんが、製品が実際のClickHouseに対して実行され、すべての重要なユースケースが期待通りに動作しているかを確認する合理的な自動テストセットを持っていることを確認してください。 + +さらに一歩進めて、その自動テストを[ClickHouseのオープンソーステストインフラストラクチャ](https://github.com/ClickHouse/ClickHouse/tree/master/tests)に貢献することもできます。これらは日常的な開発で継続的に使用されます。[実行方法](../../development/tests.md)を学び、そのフレームワークにテストを適用するのに追加の時間と労力が必要になりますが、リリースが安定版として発表される前から既にそれらに対してテストされていることを保証し、問題報告とその後のバグフィックスの報告に時間を無駄にすることを避けることができます。いくつかの企業では、(Googleでは[Beyonce’s Rule](https://www.oreilly.com/library/view/software-engineering-at/9781492082781/ch01.html#policies_that_scale_well)と呼ばれる)そういったテスト貢献を内部ポリシーとしていることもあります。 + +プレプロダクション環境とテストインフラストラクチャを整えたら、最適なバージョンの選択は簡単です: + +1. 新しいClickHouseリリースに対して自動テストを定期的に実行します。それを`testing`としてマークされたClickHouseリリースに対して行うこともできますが、それで今後のステップに進むことは推奨されません。 +2. テストに合格したClickHouseリリースをプレプロダクションにデプロイし、すべてのプロセスが期待通りに動作しているかを確認します。 +3. 発見した問題を[ClickHouse GitHub Issues](https://github.com/ClickHouse/ClickHouse/issues)に報告してください。 +4. 重大な問題がなければ、そのClickHouseリリースを本番環境にデプロイし始めるのが安全です。[カナリアリリース](https://martinfowler.com/bliki/CanaryRelease.html)や[ブルーグリーンデプロイメント](https://martinfowler.com/bliki/BlueGreenDeployment.html)のようなアプローチを実装するための漸進的なリリース自動化に投資すると、本番環境での問題のリスクをさらに軽減できます。 + +お気づきかもしれませんが、上記のアプローチにはClickHouseに特有のものはありません。人々は本番環境を真剣に考える場合、依存するインフラの任意の部分に対してこれを行います。 + +## クリックハウスのリリースを選択する方法は? {#how-to-choose-between-clickhouse-releases} + +ClickHouseのパッケージリポジトリの内容を見てみると、2種類のパッケージがあります: + +1. `stable` +2. `lts` (長期サポート) + +どちらを選ぶかのガイドラインは以下の通りです: + +- `stable`はデフォルトで推奨するパッケージです。おおよそ毎月リリースされ、新機能を合理的な遅延で提供し、最新の安定版リリースのうち3つが診断とバグフィックスのバックポーティングのサポートを受けます。 +- `lts`は半年に一度リリースされ、初期リリースから1年間サポートされます。以下のような場合には、`stable`よりも`lts`を優先するかもしれません: + - 会社の内部ポリシーが頻繁なアップグレードや非LTSソフトウェアの使用を認めていない。 + - ClickHouseを使用する製品が特に複雑な機能を必要としていなかったり、更新を続けるためのリソースが不足している。 + +多くのチームは最初は`lts`が適していると考えていても、製品にとって重要な最近の機能のために`stable`に切り替えることがよくあります。 + +:::tip +ClickHouseをアップグレードする際に覚えておくべきことがあります:リリース間の互換性は常に注意していますが、時には互換性を保つことが合理的でない場合があり、いくつかの小さな詳細が変更されることがあります。アップグレード前に[Changelog](/docs/ja/whats-new/changelog/index.md)を確認して、後方互換性のない変更についての注意点があるかどうかを確認してください。 +::: + diff --git a/docs/ja/faq/operations/separate_storage.md b/docs/ja/faq/operations/separate_storage.md new file mode 100644 index 00000000000..b98590f8a1e --- /dev/null +++ b/docs/ja/faq/operations/separate_storage.md @@ -0,0 +1,11 @@ +--- +slug: /ja/faq/operations/deploy-separate-storage-and-compute +title: ClickHouseをストレージとコンピュートを分離してデプロイすることは可能ですか? +sidebar_label: ClickHouseをストレージとコンピュートを分離してデプロイすることは可能ですか? +toc_hidden: true +toc_priority: 20 +--- + +簡潔に言うと、「はい」です。 + +オブジェクトストレージ (S3, GCS) は、ClickHouseテーブルのデータの弾性主記憶バックエンドとして使用できます。[S3サポートのMergeTree](/docs/ja/integrations/data-ingestion/s3/index.md) と [GCSサポートのMergeTree](/docs/ja/integrations/data-ingestion/gcs/index.md) のガイドが公開されています。この構成では、メタデータのみがコンピュートノードにローカルで保存されます。このセットアップでは、追加のノードがメタデータのみをレプリケーションする必要があるため、コンピュートリソースを簡単にスケールアップおよびスケールダウンできます。 diff --git a/docs/ja/faq/troubleshooting.md b/docs/ja/faq/troubleshooting.md new file mode 100644 index 00000000000..d4397ae3c83 --- /dev/null +++ b/docs/ja/faq/troubleshooting.md @@ -0,0 +1,24 @@ +--- +title: "トラブルシューティング" +slug: /ja/faq/troubleshooting +--- + +## ClickHouse Cloud トラブルシューティング + +### ClickHouse Cloud サービスにアクセスできない + +以下のようなエラーメッセージが表示される場合、IPアクセスリストがアクセスを拒否している可能性があります。 + +```response +curl: (35) error:02FFF036:system library:func(4095):Connection reset by peer +``` +または +```response +curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to HOSTNAME.clickhouse.cloud:8443 +``` +または +```response +Code: 210. DB::NetException: SSL connection unexpectedly closed (e46453teek.us-east-2.aws.clickhouse-staging.com:9440). (NETWORK_ERROR) +``` + +[IPアクセスリスト](/docs/ja/cloud/security/setting-ip-filters)を確認し、許可されたリストの外部から接続を試みている場合、接続は失敗します。 diff --git a/docs/ja/faq/use-cases/_category_.yml b/docs/ja/faq/use-cases/_category_.yml new file mode 100644 index 00000000000..4c0bfa72940 --- /dev/null +++ b/docs/ja/faq/use-cases/_category_.yml @@ -0,0 +1,4 @@ +position: 40 +label: 'Use Cases' +collapsible: true +collapsed: true diff --git a/docs/ja/faq/use-cases/index.md b/docs/ja/faq/use-cases/index.md new file mode 100644 index 00000000000..1285ce5830a --- /dev/null +++ b/docs/ja/faq/use-cases/index.md @@ -0,0 +1,16 @@ +--- +slug: /ja/faq/use-cases/ +sidebar_position: 2 +sidebar_label: ClickHouseのユースケースに関する質問 +--- + +# ClickHouseのユースケースに関する質問 + +- [ClickHouseを時系列データベースとして使用できますか?](/knowledgebase/time-series) +- [ClickHouseをキー・バリュー型ストレージとして使用できますか?](/knowledgebase/key-value) + +:::info お探しの内容が見つかりませんか? +[Knowledge Base](/knowledgebase/)をチェックし、ここでのドキュメント内にある多くの有益な記事もご覧ください。 +::: + + diff --git a/docs/ja/faq/use-cases/key-value.md b/docs/ja/faq/use-cases/key-value.md new file mode 100644 index 00000000000..a65aba07ad2 --- /dev/null +++ b/docs/ja/faq/use-cases/key-value.md @@ -0,0 +1,18 @@ +--- +slug: /ja/faq/use-cases/key-value +title: ClickHouseをキー・バリューストレージとして使用できますか? +toc_hidden: true +toc_priority: 101 +--- + +# ClickHouseをキー・バリューストレージとして使用できますか? {#can-i-use-clickhouse-as-a-key-value-storage} + +短い答えは**「いいえ」**です。キー・バリューのワークロードは、ClickHouseを使用**しない**ほうが良いケースの上位に位置しています。結局のところ、ClickHouseは[OLAP](../../faq/general/olap.md)システムであり、優れたキー・バリューストレージシステムが他にも多く存在しています。 + +しかし、キー・バリューのようなクエリにClickHouseを使用しても意味がある状況もあるかもしれません。通常、低予算のプロダクトで、主なワークロードは分析的でありClickHouseに適しているが、キー・バリューパターンを必要とする高いリクエストスループットが求められず、厳しい遅延要件もない二次プロセスが存在する場合です。予算が無制限であれば、この二次ワークロード用に別のキー・バリューデータベースをインストールするでしょうが、現実には、もう一つのストレージシステムを維持する追加のコスト(監視、バックアップなど)があるため、これを避けることが望ましいかもしれません。 + +推奨に逆らってClickHouseでキー・バリューのようなクエリを実行することを決めた場合、以下のようなヒントがあります: + +- ClickHouseでポイントクエリが高コストとなる主な理由は、メインの[MergeTreeテーブルエンジンファミリー](../..//engines/table-engines/mergetree-family/mergetree.md)のスパースな主キーインデックスです。このインデックスは特定の行に直接ポイントできず、N番目ごとにポイントするため、隣接するN番目の行から目的の行までスキャンする必要があり、その過程で余分なデータを読み取ります。キー・バリューのシナリオでは、`index_granularity`設定でNの値を減らすことが有効かもしれません。 +- ClickHouseは各カラムを別々のファイルセットに保持しているため、1つの完全な行を組み立てるためには各ファイルを通過する必要があります。カラム数が多いほどファイル数は線形に増加するため、キー・バリューシナリオでは多くのカラムの使用を避け、すべてのペイロードを単一の`String`カラムにJSON、Protobuf、または適切なシリアル化形式でエンコードして格納することが価値を持つかもしれません。 +- 通常の`MergeTree`テーブルの代わりに[Join](../../engines/table-engines/special/join.md)テーブルエンジンと[joinGet](../../sql-reference/functions/other-functions.md#joinget)関数を使用してデータを取得する代替アプローチがあります。これによってクエリ性能が向上する可能性がありますが、使い勝手や信頼性の問題が発生する可能性があります。[この使用例](https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/00800_versatile_storage_join.sql#L49-L51)をご覧ください。 diff --git a/docs/ja/faq/use-cases/time-series.md b/docs/ja/faq/use-cases/time-series.md new file mode 100644 index 00000000000..7c64c8ed33d --- /dev/null +++ b/docs/ja/faq/use-cases/time-series.md @@ -0,0 +1,22 @@ +--- +slug: /ja/faq/use-cases/time-series +title: ClickHouseを時系列データベースとして使用できますか? +toc_hidden: true +toc_priority: 101 +--- + +# ClickHouseを時系列データベースとして使用できますか? {#can-i-use-clickhouse-as-a-time-series-database} + +_注: ClickHouseを使用した時系列データ分析の追加例については、ブログ [Working with Time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) をご覧ください。_ + +ClickHouseは、[OLAP](../../faq/general/olap.md) ワークロード向けの汎用データストレージソリューションであり、多くの特化された時系列データベース管理システムが存在します。それにもかかわらず、ClickHouseの[クエリ実行速度への注力](../../concepts/why-clickhouse-is-so-fast.md)は、多くの場合、特化されたシステムを上回ることを可能にします。このテーマに関する独立したベンチマークはたくさんあるので、ここで行うことはありません。その代わり、あなたの用途としてそれを使用する場合に重要なClickHouseの機能に焦点を当てます。 + +まず、典型的な時系列として使用される**[特化されたコーデック](../../sql-reference/statements/create/table.md#specialized-codecs)**があります。`DoubleDelta`や`Gorilla`などの一般的なアルゴリズムやClickHouse特有の`T64`があります。 + +次に、時系列クエリはしばしば最新のデータ、例えば1日や1週間前のデータにのみアクセスします。高速なnVME/SSDドライブと大容量のHDDドライブを備えたサーバーを利用することが理にかなっています。ClickHouseの[有効期限 (TTL)](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/##table_engine-mergetree-multiple-volumes) 機能を使用すると、新しいホットデータを高速ドライブに保持し、それが古くなるにつれて徐々に遅いドライブに移動するように設定できます。要件が必要とする場合には、さらに古いデータのロールアップや削除も可能です。 + +生データの保存と処理を推奨するClickHouseの哲学には反するものの、[Materialized View](../../sql-reference/statements/create/view.md) を使用すると、さらに厳密なレイテンシーやコスト要件に適合させることができます。 + +## 関連コンテンツ + +- ブログ: [Working with time series data in ClickHouse](https://clickhouse.com/blog/working-with-time-series-data-and-functions-ClickHouse) diff --git a/docs/ja/fast-release-24-2.md b/docs/ja/fast-release-24-2.md new file mode 100644 index 00000000000..300d7e6c7e5 --- /dev/null +++ b/docs/ja/fast-release-24-2.md @@ -0,0 +1,240 @@ +--- +slug: /ja/whats-new/changelog/24.2-fast-release +title: v24.2 Changelog (Fast Release) +description: Fast release changelog for v24.2 +keywords: [chaneglog, fast release] +--- + +### ClickHouse release tag: 24.2.2.15987 + +#### Backward Incompatible Change +* Validate suspicious/experimental types in nested types. Previously we didn't validate such types (except JSON) in nested types like Array/Tuple/Map. [#59385](https://github.com/ClickHouse/ClickHouse/pull/59385) ([Kruglov Pavel](https://github.com/Avogar)). +* The sort clause `ORDER BY ALL` (introduced with v23.12) is replaced by `ORDER BY *`. The previous syntax was too error-prone for tables with a column `all`. [#59450](https://github.com/ClickHouse/ClickHouse/pull/59450) ([Robert Schulze](https://github.com/rschu1ze)). +* Add sanity check for number of threads and block sizes. [#60138](https://github.com/ClickHouse/ClickHouse/pull/60138) ([Raúl Marín](https://github.com/Algunenano)). +* Reject incoming INSERT queries in case when query-level settings `async_insert` and `deduplicate_blocks_in_dependent_materialized_views` are enabled together. This behaviour is controlled by a setting `throw_if_deduplication_in_dependent_materialized_views_enabled_with_async_insert` and enabled by default. This is a continuation of https://github.com/ClickHouse/ClickHouse/pull/59699 needed to unblock https://github.com/ClickHouse/ClickHouse/pull/59915. [#60888](https://github.com/ClickHouse/ClickHouse/pull/60888) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Utility `clickhouse-copier` is moved to a separate repository on GitHub: https://github.com/ClickHouse/copier. It is no longer included in the bundle but is still available as a separate download. This closes: [#60734](https://github.com/ClickHouse/ClickHouse/issues/60734) This closes: [#60540](https://github.com/ClickHouse/ClickHouse/issues/60540) This closes: [#60250](https://github.com/ClickHouse/ClickHouse/issues/60250) This closes: [#52917](https://github.com/ClickHouse/ClickHouse/issues/52917) This closes: [#51140](https://github.com/ClickHouse/ClickHouse/issues/51140) This closes: [#47517](https://github.com/ClickHouse/ClickHouse/issues/47517) This closes: [#47189](https://github.com/ClickHouse/ClickHouse/issues/47189) This closes: [#46598](https://github.com/ClickHouse/ClickHouse/issues/46598) This closes: [#40257](https://github.com/ClickHouse/ClickHouse/issues/40257) This closes: [#36504](https://github.com/ClickHouse/ClickHouse/issues/36504) This closes: [#35485](https://github.com/ClickHouse/ClickHouse/issues/35485) This closes: [#33702](https://github.com/ClickHouse/ClickHouse/issues/33702) This closes: [#26702](https://github.com/ClickHouse/ClickHouse/issues/26702) ### Documentation entry for user-facing changes. [#61058](https://github.com/ClickHouse/ClickHouse/pull/61058) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* To increase compatibility with MySQL, function `locate` now accepts arguments `(needle, haystack[, start_pos])` by default. The previous behavior `(haystack, needle, [, start_pos])` can be restored by setting `function_locate_has_mysql_compatible_argument_order = 0`. [#61092](https://github.com/ClickHouse/ClickHouse/pull/61092) ([Robert Schulze](https://github.com/rschu1ze)). +* The obsolete in-memory data parts have been deprecated since version 23.5 and have not been supported since version 23.10. Now the remaining code is removed. Continuation of [#55186](https://github.com/ClickHouse/ClickHouse/issues/55186) and [#45409](https://github.com/ClickHouse/ClickHouse/issues/45409). It is unlikely that you have used in-memory data parts because they were available only before version 23.5 and only when you enabled them manually by specifying the corresponding SETTINGS for a MergeTree table. To check if you have in-memory data parts, run the following query: `SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type`. To disable the usage of in-memory data parts, do `ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT`. Before upgrading from old ClickHouse releases, first check that you don't have in-memory data parts. If there are in-memory data parts, disable them first, then wait while there are no in-memory data parts and continue the upgrade. [#61127](https://github.com/ClickHouse/ClickHouse/pull/61127) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Forbid `SimpleAggregateFunction` in `ORDER BY` of `MergeTree` tables (like `AggregateFunction` is forbidden, but they are forbidden because they are not comparable) by default (use `allow_suspicious_primary_key` to allow them). [#61399](https://github.com/ClickHouse/ClickHouse/pull/61399) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse allows arbitrary binary data in the String data type, which is typically UTF-8. Parquet/ORC/Arrow Strings only support UTF-8. That's why you can choose which Arrow's data type to use for the ClickHouse String data type - String or Binary. This is controlled by the settings, `output_format_parquet_string_as_string`, `output_format_orc_string_as_string`, `output_format_arrow_string_as_string`. While Binary would be more correct and compatible, using String by default will correspond to user expectations in most cases. Parquet/ORC/Arrow supports many compression methods, including lz4 and zstd. ClickHouse supports each and every compression method. Some inferior tools lack support for the faster `lz4` compression method, that's why we set `zstd` by default. This is controlled by the settings `output_format_parquet_compression_method`, `output_format_orc_compression_method`, and `output_format_arrow_compression_method`. We changed the default to `zstd` for Parquet and ORC, but not Arrow (it is emphasized for low-level usages). [#61817](https://github.com/ClickHouse/ClickHouse/pull/61817) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix for the materialized view security issue, which allowed a user to insert into a table without required grants for that. Fix validates that the user has permission to insert not only into a materialized view but also into all underlying tables. This means that some queries, which worked before, now can fail with Not enough privileges. To address this problem, the release introduces a new feature of SQL security for views [https://clickhouse.com/docs/ja/sql-reference/statements/create/view#sql_security](https://clickhouse.com/docs/ja/sql-reference/statements/create/view#sql_security). [#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit)) + +#### New Feature +* Topk/topkweighed support mode, which return count of values and it's error. [#54508](https://github.com/ClickHouse/ClickHouse/pull/54508) ([UnamedRus](https://github.com/UnamedRus)). +* Added new syntax which allows to specify definer user in View/Materialized View. This allows to execute selects/inserts from views without explicit grants for underlying tables. [#54901](https://github.com/ClickHouse/ClickHouse/pull/54901) ([pufit](https://github.com/pufit)). +* Implemented automatic conversion of merge tree tables of different kinds to replicated engine. Create empty `convert_to_replicated` file in table's data directory (`/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/`) and that table will be converted automatically on next server start. [#57798](https://github.com/ClickHouse/ClickHouse/pull/57798) ([Kirill](https://github.com/kirillgarbar)). +* Added table function `mergeTreeIndex`. It represents the contents of index and marks files of `MergeTree` tables. It can be used for introspection. Syntax: `mergeTreeIndex(database, table, [with_marks = true])` where `database.table` is an existing table with `MergeTree` engine. [#58140](https://github.com/ClickHouse/ClickHouse/pull/58140) ([Anton Popov](https://github.com/CurtizJ)). +* Try to detect file format automatically during schema inference if it's unknown in `file/s3/hdfs/url/azureBlobStorage` engines. Closes [#50576](https://github.com/ClickHouse/ClickHouse/issues/50576). [#59092](https://github.com/ClickHouse/ClickHouse/pull/59092) ([Kruglov Pavel](https://github.com/Avogar)). +* Add generate_series as a table function. This function generates table with an arithmetic progression with natural numbers. [#59390](https://github.com/ClickHouse/ClickHouse/pull/59390) ([divanik](https://github.com/divanik)). +* Added query `ALTER TABLE table FORGET PARTITION partition` that removes ZooKeeper nodes, related to an empty partition. [#59507](https://github.com/ClickHouse/ClickHouse/pull/59507) ([Sergei Trifonov](https://github.com/serxa)). +* Support reading and writing backups as tar archives. [#59535](https://github.com/ClickHouse/ClickHouse/pull/59535) ([josh-hildred](https://github.com/josh-hildred)). +* Provides new aggregate function ‘groupArrayIntersect’. Follows up: [#49862](https://github.com/ClickHouse/ClickHouse/issues/49862). [#59598](https://github.com/ClickHouse/ClickHouse/pull/59598) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Implemented system.dns_cache table, which can be useful for debugging DNS issues. [#59856](https://github.com/ClickHouse/ClickHouse/pull/59856) ([Kirill Nikiforov](https://github.com/allmazz)). +* Implemented support for S3Express buckets. [#59965](https://github.com/ClickHouse/ClickHouse/pull/59965) ([Nikita Taranov](https://github.com/nickitat)). +* The codec `LZ4HC` will accept a new level 2, which is faster than the previous minimum level 3, at the expense of less compression. In previous versions, `LZ4HC(2)` and less was the same as `LZ4HC(3)`. Author: [Cyan4973](https://github.com/Cyan4973). [#60090](https://github.com/ClickHouse/ClickHouse/pull/60090) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Implemented system.dns_cache table, which can be useful for debugging DNS issues. New server setting dns_cache_max_size. [#60257](https://github.com/ClickHouse/ClickHouse/pull/60257) ([Kirill Nikiforov](https://github.com/allmazz)). +* Added function `toMillisecond` which returns the millisecond component for values of type`DateTime` or `DateTime64`. [#60281](https://github.com/ClickHouse/ClickHouse/pull/60281) ([Shaun Struwig](https://github.com/Blargian)). +* Support single-argument version for the merge table function, as `merge(['db_name', ] 'tables_regexp')`. [#60372](https://github.com/ClickHouse/ClickHouse/pull/60372) ([豪肥肥](https://github.com/HowePa)). +* Make all format names case insensitive, like Tsv, or TSV, or tsv, or even rowbinary. [#60420](https://github.com/ClickHouse/ClickHouse/pull/60420) ([豪肥肥](https://github.com/HowePa)). +* Added new syntax which allows to specify definer user in View/Materialized View. This allows to execute selects/inserts from views without explicit grants for underlying tables. [#60439](https://github.com/ClickHouse/ClickHouse/pull/60439) ([pufit](https://github.com/pufit)). +* Add four properties to the `StorageMemory` (memory-engine) `min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keep` and `max_rows_to_keep` - Add tests to reflect new changes - Update `memory.md` documentation - Add table `context` property to `MemorySink` to enable access to table parameter bounds. [#60612](https://github.com/ClickHouse/ClickHouse/pull/60612) ([Jake Bamrah](https://github.com/JakeBamrah)). +* Added function `toMillisecond` which returns the millisecond component for values of type`DateTime` or `DateTime64`. [#60649](https://github.com/ClickHouse/ClickHouse/pull/60649) ([Robert Schulze](https://github.com/rschu1ze)). +* Separate limits on number of waiting and executing queries. Added new server setting `max_waiting_queries` that limits the number of queries waiting due to `async_load_databases`. Existing limits on number of executing queries no longer count waiting queries. [#61053](https://github.com/ClickHouse/ClickHouse/pull/61053) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for `ATTACH PARTITION ALL`. [#61107](https://github.com/ClickHouse/ClickHouse/pull/61107) ([Kirill Nikiforov](https://github.com/allmazz)). + +#### Performance Improvement +* Eliminates min/max/any/anyLast aggregators of GROUP BY keys in SELECT section. [#52230](https://github.com/ClickHouse/ClickHouse/pull/52230) ([JackyWoo](https://github.com/JackyWoo)). +* Improve the performance of serialized aggregation method when involving multiple [nullable] columns. This is a general version of [#51399](https://github.com/ClickHouse/ClickHouse/issues/51399) that doesn't compromise on abstraction integrity. [#55809](https://github.com/ClickHouse/ClickHouse/pull/55809) ([Amos Bird](https://github.com/amosbird)). +* Lazy build join output to improve performance of ALL join. [#58278](https://github.com/ClickHouse/ClickHouse/pull/58278) ([LiuNeng](https://github.com/liuneng1994)). +* Improvements to aggregate functions ArgMin / ArgMax / any / anyLast / anyHeavy, as well as `ORDER BY {u8/u16/u32/u64/i8/i16/u32/i64) LIMIT 1` queries. [#58640](https://github.com/ClickHouse/ClickHouse/pull/58640) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize performance of sum/avg conditionally for bigint and big decimal types by reducing branch miss. [#59504](https://github.com/ClickHouse/ClickHouse/pull/59504) ([李扬](https://github.com/taiyang-li)). +* Improve performance of SELECTs with active mutations. [#59531](https://github.com/ClickHouse/ClickHouse/pull/59531) ([Azat Khuzhin](https://github.com/azat)). +* Trivial optimize on column filter. Avoid those filter columns whoes underlying data type is not number being filtered with `result_size_hint = -1`. Peak memory can be reduced to 44% of the original in some cases. [#59698](https://github.com/ClickHouse/ClickHouse/pull/59698) ([李扬](https://github.com/taiyang-li)). +* Primary key will use less amount of memory. [#60049](https://github.com/ClickHouse/ClickHouse/pull/60049) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve memory usage for primary key and some other operations. [#60050](https://github.com/ClickHouse/ClickHouse/pull/60050) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The tables' primary keys will be loaded in memory lazily on first access. This is controlled by the new MergeTree setting `primary_key_lazy_load`, which is on by default. This provides several advantages: - it will not be loaded for tables that are not used; - if there is not enough memory, an exception will be thrown on first use instead of at server startup. This provides several disadvantages: - the latency of loading the primary key will be paid on the first query rather than before accepting connections; this theoretically may introduce a thundering-herd problem. This closes [#11188](https://github.com/ClickHouse/ClickHouse/issues/11188). [#60093](https://github.com/ClickHouse/ClickHouse/pull/60093) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Vectorized function `dotProduct` which is useful for vector search. [#60202](https://github.com/ClickHouse/ClickHouse/pull/60202) ([Robert Schulze](https://github.com/rschu1ze)). +* If the table's primary key contains mostly useless columns, don't keep them in memory. This is controlled by a new setting `primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns` with the value `0.9` by default, which means: for a composite primary key, if a column changes its value for at least 0.9 of all the times, the next columns after it will be not loaded. [#60255](https://github.com/ClickHouse/ClickHouse/pull/60255) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Execute multiIf function columnarly when result_type's underlying type is number. [#60384](https://github.com/ClickHouse/ClickHouse/pull/60384) ([李扬](https://github.com/taiyang-li)). +* As is shown in Fig 1, the replacement of "&&" with "&" could generate the SIMD code. ![image](https://github.com/ClickHouse/ClickHouse/assets/26588299/a5a72ac4-6dc6-4d52-835a-4f512e55f0b9) Fig 1. Code compiled from '&&' (left) and '&' (right). [#60498](https://github.com/ClickHouse/ClickHouse/pull/60498) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Faster (almost 2x) mutexes (was slower due to ThreadFuzzer). [#60823](https://github.com/ClickHouse/ClickHouse/pull/60823) ([Azat Khuzhin](https://github.com/azat)). +* Move connection drain from prepare to work, and drain multiple connections in parallel. [#60845](https://github.com/ClickHouse/ClickHouse/pull/60845) ([lizhuoyu5](https://github.com/lzydmxy)). +* Optimize insertManyFrom of nullable number or nullable string. [#60846](https://github.com/ClickHouse/ClickHouse/pull/60846) ([李扬](https://github.com/taiyang-li)). +* Optimized function `dotProduct` to omit unnecessary and expensive memory copies. [#60928](https://github.com/ClickHouse/ClickHouse/pull/60928) ([Robert Schulze](https://github.com/rschu1ze)). +* Operations with the filesystem cache will suffer less from the lock contention. [#61066](https://github.com/ClickHouse/ClickHouse/pull/61066) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimize ColumnString::replicate and prevent memcpySmallAllowReadWriteOverflow15Impl from being optimized to built-in memcpy. Close [#61074](https://github.com/ClickHouse/ClickHouse/issues/61074). ColumnString::replicate speeds up by 2.46x on x86-64. [#61075](https://github.com/ClickHouse/ClickHouse/pull/61075) ([李扬](https://github.com/taiyang-li)). +* 30x faster printing for 256-bit integers. [#61100](https://github.com/ClickHouse/ClickHouse/pull/61100) ([Raúl Marín](https://github.com/Algunenano)). +* If a query with a syntax error contained COLUMNS matcher with a regular expression, the regular expression was compiled each time during the parser's backtracking, instead of being compiled once. This was a fundamental error. The compiled regexp was put to AST. But the letter A in AST means "abstract" which means it should not contain heavyweight objects. Parts of AST can be created and discarded during parsing, including a large number of backtracking. This leads to slowness on the parsing side and consequently allows DoS by a readonly user. But the main problem is that it prevents progress in fuzzers. [#61543](https://github.com/ClickHouse/ClickHouse/pull/61543) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* While running the MODIFY COLUMN query for materialized views, check the inner table's structure to ensure every column exists. [#47427](https://github.com/ClickHouse/ClickHouse/pull/47427) ([sunny](https://github.com/sunny19930321)). +* Added table `system.keywords` which contains all the keywords from parser. Mostly needed and will be used for better fuzzing and syntax highlighting. [#51808](https://github.com/ClickHouse/ClickHouse/pull/51808) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added support for parameterized view with analyzer to not analyze create parameterized view. Refactor existing parameterized view logic to not analyze create parameterized view. [#54211](https://github.com/ClickHouse/ClickHouse/pull/54211) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Ordinary database engine is deprecated. You will receive a warning in clickhouse-client if your server is using it. This closes [#52229](https://github.com/ClickHouse/ClickHouse/issues/52229). [#56942](https://github.com/ClickHouse/ClickHouse/pull/56942) ([shabroo](https://github.com/shabroo)). +* All zero copy locks related to a table have to be dropped when the table is dropped. The directory which contains these locks has to be removed also. [#57575](https://github.com/ClickHouse/ClickHouse/pull/57575) ([Sema Checherinda](https://github.com/CheSema)). +* Add short-circuit ability for `dictGetOrDefault` function. Closes [#52098](https://github.com/ClickHouse/ClickHouse/issues/52098). [#57767](https://github.com/ClickHouse/ClickHouse/pull/57767) ([jsc0218](https://github.com/jsc0218)). +* Allow declaring enum in external table structure. [#57857](https://github.com/ClickHouse/ClickHouse/pull/57857) ([Duc Canh Le](https://github.com/canhld94)). +* Running `ALTER COLUMN MATERIALIZE` on a column with `DEFAULT` or `MATERIALIZED` expression now writes the correct values: The default value for existing parts with default value or the non-default value for existing parts with non-default value. Previously, the default value was written for all existing parts. [#58023](https://github.com/ClickHouse/ClickHouse/pull/58023) ([Duc Canh Le](https://github.com/canhld94)). +* Enabled a backoff logic (e.g. exponential). Will provide an ability for reduced CPU usage, memory usage and log file sizes. [#58036](https://github.com/ClickHouse/ClickHouse/pull/58036) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Consider lightweight deleted rows when selecting parts to merge. [#58223](https://github.com/ClickHouse/ClickHouse/pull/58223) ([Zhuo Qiu](https://github.com/jewelzqiu)). +* Allow to define `volume_priority` in `storage_configuration`. [#58533](https://github.com/ClickHouse/ClickHouse/pull/58533) ([Andrey Zvonov](https://github.com/zvonand)). +* Add support for Date32 type in T64 codec. [#58738](https://github.com/ClickHouse/ClickHouse/pull/58738) ([Hongbin Ma](https://github.com/binmahone)). +* This PR makes http/https connections reusable for all uses cases. Even when response is 3xx or 4xx. [#58845](https://github.com/ClickHouse/ClickHouse/pull/58845) ([Sema Checherinda](https://github.com/CheSema)). +* Added comments for columns for more system tables. Continuation of https://github.com/ClickHouse/ClickHouse/pull/58356. [#59016](https://github.com/ClickHouse/ClickHouse/pull/59016) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now we can use virtual columns in PREWHERE. It's worthwhile for non-const virtual columns like `_part_offset`. [#59033](https://github.com/ClickHouse/ClickHouse/pull/59033) ([Amos Bird](https://github.com/amosbird)). +* Settings for the Distributed table engine can now be specified in the server configuration file (similar to MergeTree settings), e.g. ``` false ```. [#59291](https://github.com/ClickHouse/ClickHouse/pull/59291) ([Azat Khuzhin](https://github.com/azat)). +* Keeper improvement: cache only a certain amount of logs in-memory controlled by `latest_logs_cache_size_threshold` and `commit_logs_cache_size_threshold`. [#59460](https://github.com/ClickHouse/ClickHouse/pull/59460) ([Antonio Andelic](https://github.com/antonio2368)). +* Instead using a constant key, now object storage generates key for determining remove objects capability. [#59495](https://github.com/ClickHouse/ClickHouse/pull/59495) ([Sema Checherinda](https://github.com/CheSema)). +* Don't infer floats in exponential notation by default. Add a setting `input_format_try_infer_exponent_floats` that will restore previous behaviour (disabled by default). Closes [#59476](https://github.com/ClickHouse/ClickHouse/issues/59476). [#59500](https://github.com/ClickHouse/ClickHouse/pull/59500) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow alter operations to be surrounded by parenthesis. The emission of parentheses can be controlled by the `format_alter_operations_with_parentheses` config. By default in formatted queries the parentheses are emitted as we store the formatted alter operations in some places as metadata (e.g.: mutations). The new syntax clarifies some of the queries where alter operations end in a list. E.g.: `ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c` cannot be parsed properly with the old syntax. In the new syntax the query `ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c)` is obvious. Older versions are not able to read the new syntax, therefore using the new syntax might cause issues if newer and older version of ClickHouse are mixed in a single cluster. [#59532](https://github.com/ClickHouse/ClickHouse/pull/59532) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Bumped Intel QPL (used by codec `DEFLATE_QPL`) from v1.3.1 to v1.4.0 . Also fixed a bug for polling timeout mechanism, as we observed in same cases timeout won't work properly, if timeout happen, IAA and CPU may process buffer concurrently. So far, we'd better make sure IAA codec status is not QPL_STS_BEING_PROCESSED, then fallback to SW codec. [#59551](https://github.com/ClickHouse/ClickHouse/pull/59551) ([jasperzhu](https://github.com/jinjunzh)). +* Add positional pread in libhdfs3. If you want to call positional read in libhdfs3, use the hdfsPread function in hdfs.h as follows. `tSize hdfsPread(hdfsFS fs, hdfsFile file, void * buffer, tSize length, tOffset position);`. [#59624](https://github.com/ClickHouse/ClickHouse/pull/59624) ([M1eyu](https://github.com/M1eyu2018)). +* Check for stack overflow in parsers even if the user misconfigured the `max_parser_depth` setting to a very high value. This closes [#59622](https://github.com/ClickHouse/ClickHouse/issues/59622). [#59697](https://github.com/ClickHouse/ClickHouse/pull/59697) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Unify xml and sql created named collection behaviour in kafka storage. [#59710](https://github.com/ClickHouse/ClickHouse/pull/59710) ([Pervakov Grigorii](https://github.com/GrigoryPervakov)). +* Allow uuid in replica_path if CREATE TABLE explicitly has it. [#59908](https://github.com/ClickHouse/ClickHouse/pull/59908) ([Azat Khuzhin](https://github.com/azat)). +* Add column `metadata_version` of ReplicatedMergeTree table in `system.tables` system table. [#59942](https://github.com/ClickHouse/ClickHouse/pull/59942) ([Maksim Kita](https://github.com/kitaisreal)). +* Keeper improvement: add retries on failures for Disk related operations. [#59980](https://github.com/ClickHouse/ClickHouse/pull/59980) ([Antonio Andelic](https://github.com/antonio2368)). +* Add new config setting `backups.remove_backup_files_after_failure`: ``` true ```. [#60002](https://github.com/ClickHouse/ClickHouse/pull/60002) ([Vitaly Baranov](https://github.com/vitlibar)). +* Use multiple threads while reading the metadata of tables from a backup while executing the RESTORE command. [#60040](https://github.com/ClickHouse/ClickHouse/pull/60040) ([Vitaly Baranov](https://github.com/vitlibar)). +* Now if `StorageBuffer` has more than 1 shard (`num_layers` > 1) background flush will happen simultaneously for all shards in multiple threads. [#60111](https://github.com/ClickHouse/ClickHouse/pull/60111) ([alesapin](https://github.com/alesapin)). +* Support specifying users for specific S3 settings in config using `user` key. [#60144](https://github.com/ClickHouse/ClickHouse/pull/60144) ([Antonio Andelic](https://github.com/antonio2368)). +* Copy S3 file GCP fallback to buffer copy in case GCP returned `Internal Error` with `GATEWAY_TIMEOUT` HTTP error code. [#60164](https://github.com/ClickHouse/ClickHouse/pull/60164) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow "local" as object storage type instead of "local_blob_storage". [#60165](https://github.com/ClickHouse/ClickHouse/pull/60165) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Implement comparison operator for Variant values and proper Field inserting into Variant column. Don't allow creating `Variant` type with similar variant types by default (allow uder a setting `allow_suspicious_variant_types`) Closes [#59996](https://github.com/ClickHouse/ClickHouse/issues/59996). Closes [#59850](https://github.com/ClickHouse/ClickHouse/issues/59850). [#60198](https://github.com/ClickHouse/ClickHouse/pull/60198) ([Kruglov Pavel](https://github.com/Avogar)). +* Improved overall usability of virtual columns. Now it is allowed to use virtual columns in `PREWHERE` (it's worthwhile for non-const virtual columns like `_part_offset`). Now a builtin documentation is available for virtual columns as a comment of column in `DESCRIBE` query with enabled setting `describe_include_virtual_columns`. [#60205](https://github.com/ClickHouse/ClickHouse/pull/60205) ([Anton Popov](https://github.com/CurtizJ)). +* Short circuit execution for `ULIDStringToDateTime`. [#60211](https://github.com/ClickHouse/ClickHouse/pull/60211) ([Juan Madurga](https://github.com/jlmadurga)). +* Added `query_id` column for tables `system.backups` and `system.backup_log`. Added error stacktrace to `error` column. [#60220](https://github.com/ClickHouse/ClickHouse/pull/60220) ([Maksim Kita](https://github.com/kitaisreal)). +* Parallel flush of pending INSERT blocks of Distributed engine on `DETACH`/server shutdown and `SYSTEM FLUSH DISTRIBUTED` (Parallelism will work only if you have multi disk policy for table (like everything in Distributed engine right now)). [#60225](https://github.com/ClickHouse/ClickHouse/pull/60225) ([Azat Khuzhin](https://github.com/azat)). +* Filter setting is improper in `joinRightColumnsSwitchNullability`, resolve [#59625](https://github.com/ClickHouse/ClickHouse/issues/59625). [#60259](https://github.com/ClickHouse/ClickHouse/pull/60259) ([lgbo](https://github.com/lgbo-ustc)). +* Add a setting to force read-through cache for merges. [#60308](https://github.com/ClickHouse/ClickHouse/pull/60308) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Issue [#57598](https://github.com/ClickHouse/ClickHouse/issues/57598) mentions a variant behaviour regarding transaction handling. An issued COMMIT/ROLLBACK when no transaction is active is reported as an error contrary to MySQL behaviour. [#60338](https://github.com/ClickHouse/ClickHouse/pull/60338) ([PapaToemmsn](https://github.com/PapaToemmsn)). +* Added `none_only_active` mode for `distributed_ddl_output_mode` setting. [#60340](https://github.com/ClickHouse/ClickHouse/pull/60340) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Connections through the MySQL port now automatically run with setting `prefer_column_name_to_alias = 1` to support QuickSight out-of-the-box. Also, settings `mysql_map_string_to_text_in_show_columns` and `mysql_map_fixed_string_to_text_in_show_columns` are now enabled by default, affecting also only MySQL connections. This increases compatibility with more BI tools. [#60365](https://github.com/ClickHouse/ClickHouse/pull/60365) ([Robert Schulze](https://github.com/rschu1ze)). +* When output format is Pretty format and a block consists of a single numeric value which exceeds one million, A readable number will be printed on table right. e.g. ``` ┌──────count()─┐ │ 233765663884 │ -- 233.77 billion └──────────────┘ ```. [#60379](https://github.com/ClickHouse/ClickHouse/pull/60379) ([rogeryk](https://github.com/rogeryk)). +* Allow configuring HTTP redirect handlers for clickhouse-server. For example, you can make `/` redirect to the Play UI. [#60390](https://github.com/ClickHouse/ClickHouse/pull/60390) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The advanced dashboard has slightly better colors for multi-line graphs. [#60391](https://github.com/ClickHouse/ClickHouse/pull/60391) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix a race condition in JavaScript code leading to duplicate charts on top of each other. [#60392](https://github.com/ClickHouse/ClickHouse/pull/60392) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Check for stack overflow in parsers even if the user misconfigured the `max_parser_depth` setting to a very high value. This closes [#59622](https://github.com/ClickHouse/ClickHouse/issues/59622). [#60434](https://github.com/ClickHouse/ClickHouse/pull/60434) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Function `substring` now has a new alias `byteSlice`. [#60494](https://github.com/ClickHouse/ClickHouse/pull/60494) ([Robert Schulze](https://github.com/rschu1ze)). +* Renamed server setting `dns_cache_max_size` to `dns_cache_max_entries` to reduce ambiguity. [#60500](https://github.com/ClickHouse/ClickHouse/pull/60500) ([Kirill Nikiforov](https://github.com/allmazz)). +* `SHOW INDEX | INDEXES | INDICES | KEYS` no longer sorts by the primary key columns (which was unintuitive). [#60514](https://github.com/ClickHouse/ClickHouse/pull/60514) ([Robert Schulze](https://github.com/rschu1ze)). +* Keeper improvement: abort during startup if an invalid snapshot is detected to avoid data loss. [#60537](https://github.com/ClickHouse/ClickHouse/pull/60537) ([Antonio Andelic](https://github.com/antonio2368)). +* Added MergeTree read split ranges into intersecting and non intersecting fault injection using `merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_fault_probability` setting. [#60548](https://github.com/ClickHouse/ClickHouse/pull/60548) ([Maksim Kita](https://github.com/kitaisreal)). +* The Advanced dashboard now has controls always visible on scrolling. This allows you to add a new chart without scrolling up. [#60692](https://github.com/ClickHouse/ClickHouse/pull/60692) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* String types and Enums can be used in the same context, such as: arrays, UNION queries, conditional expressions. This closes [#60726](https://github.com/ClickHouse/ClickHouse/issues/60726). [#60727](https://github.com/ClickHouse/ClickHouse/pull/60727) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Update tzdata to 2024a. [#60768](https://github.com/ClickHouse/ClickHouse/pull/60768) ([Raúl Marín](https://github.com/Algunenano)). +* Support files without format extension in Filesystem database. [#60795](https://github.com/ClickHouse/ClickHouse/pull/60795) ([Kruglov Pavel](https://github.com/Avogar)). +* Keeper improvement: support `leadership_expiry_ms` in Keeper's settings. [#60806](https://github.com/ClickHouse/ClickHouse/pull/60806) ([Brokenice0415](https://github.com/Brokenice0415)). +* Always infer exponential numbers in JSON formats regardless of the setting `input_format_try_infer_exponent_floats`. Add setting `input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects` that allows to use String type for ambiguous paths instead of an exception during named Tuples inference from JSON objects. [#60808](https://github.com/ClickHouse/ClickHouse/pull/60808) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a flag for SMJ to treat null as biggest/smallest. So the behavior can be compitable with other SQL systems, like Apache Spark. [#60896](https://github.com/ClickHouse/ClickHouse/pull/60896) ([loudongfeng](https://github.com/loudongfeng)). +* Clickhouse version has been added to docker labels. Closes [#54224](https://github.com/ClickHouse/ClickHouse/issues/54224). [#60949](https://github.com/ClickHouse/ClickHouse/pull/60949) ([Nikolay Monkov](https://github.com/nikmonkov)). +* Add a setting `parallel_replicas_allow_in_with_subquery = 1` which allows subqueries for IN work with parallel replicas. [#60950](https://github.com/ClickHouse/ClickHouse/pull/60950) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* DNSResolver shuffles set of resolved IPs. [#60965](https://github.com/ClickHouse/ClickHouse/pull/60965) ([Sema Checherinda](https://github.com/CheSema)). +* Support detect output format by file exctension in `clickhouse-client` and `clickhouse-local`. [#61036](https://github.com/ClickHouse/ClickHouse/pull/61036) ([豪肥肥](https://github.com/HowePa)). +* Check memory limit update periodically. [#61049](https://github.com/ClickHouse/ClickHouse/pull/61049) ([Han Fei](https://github.com/hanfei1991)). +* Enable processors profiling (time spent/in and out bytes for sorting, aggregation, ...) by default. [#61096](https://github.com/ClickHouse/ClickHouse/pull/61096) ([Azat Khuzhin](https://github.com/azat)). +* Add the function `toUInt128OrZero`, which was missed by mistake (the mistake is related to https://github.com/ClickHouse/ClickHouse/pull/945). The compatibility aliases `FROM_UNIXTIME` and `DATE_FORMAT` (they are not ClickHouse-native and only exist for MySQL compatibility) have been made case insensitive, as expected for SQL-compatibility aliases. [#61114](https://github.com/ClickHouse/ClickHouse/pull/61114) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improvements for the access checks, allowing to revoke of unpossessed rights in case the target user doesn't have the revoking grants either. Example: ```sql GRANT SELECT ON *.* TO user1; REVOKE SELECT ON system.* FROM user1;. [#61115](https://github.com/ClickHouse/ClickHouse/pull/61115) ([pufit](https://github.com/pufit)). +* Fix an error in previeous opt: https://github.com/ClickHouse/ClickHouse/pull/59698: remove break to make sure the first filtered column has minimum size cc @jsc0218. [#61145](https://github.com/ClickHouse/ClickHouse/pull/61145) ([李扬](https://github.com/taiyang-li)). +* Fix `has()` function with `Nullable` column (fixes [#60214](https://github.com/ClickHouse/ClickHouse/issues/60214)). [#61249](https://github.com/ClickHouse/ClickHouse/pull/61249) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Now it's possible to specify attribute `merge="true"` in config substitutions for subtrees ``. In case this attribute specified, clickhouse will merge subtree with existing configuration, otherwise default behavior is append new content to configuration. [#61299](https://github.com/ClickHouse/ClickHouse/pull/61299) ([alesapin](https://github.com/alesapin)). +* Add async metrics for virtual memory mappings: VMMaxMapCount & VMNumMaps. Closes [#60662](https://github.com/ClickHouse/ClickHouse/issues/60662). [#61354](https://github.com/ClickHouse/ClickHouse/pull/61354) ([Tuan Pham Anh](https://github.com/tuanpavn)). +* Use `temporary_files_codec` setting in all places where we create temporary data, for example external memory sorting and external memory GROUP BY. Before it worked only in `partial_merge` JOIN algorithm. [#61456](https://github.com/ClickHouse/ClickHouse/pull/61456) ([Maksim Kita](https://github.com/kitaisreal)). +* Remove duplicated check `containing_part.empty()`, It's already being checked here: https://github.com/ClickHouse/ClickHouse/blob/1296dac3c7e47670872c15e3f5e58f869e0bd2f2/src/Storages/MergeTree/MergeTreeData.cpp#L6141. [#61467](https://github.com/ClickHouse/ClickHouse/pull/61467) ([William Schoeffel](https://github.com/wiledusc)). +* Add a new setting `max_parser_backtracks` which allows to limit the complexity of query parsing. [#61502](https://github.com/ClickHouse/ClickHouse/pull/61502) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Less contention during dynamic resize of filesystem cache. [#61524](https://github.com/ClickHouse/ClickHouse/pull/61524) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disallow sharded mode of StorageS3 queue, because it will be rewritten. [#61537](https://github.com/ClickHouse/ClickHouse/pull/61537) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed typo: from `use_leagcy_max_level` to `use_legacy_max_level`. [#61545](https://github.com/ClickHouse/ClickHouse/pull/61545) ([William Schoeffel](https://github.com/wiledusc)). +* Remove some duplicate entries in blob_storage_log. [#61622](https://github.com/ClickHouse/ClickHouse/pull/61622) ([YenchangChan](https://github.com/YenchangChan)). +* Added `current_user` function as a compatibility alias for MySQL. [#61770](https://github.com/ClickHouse/ClickHouse/pull/61770) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Use managed identity for backups IO when using Azure Blob Storage. Add a setting to prevent ClickHouse from attempting to create a non-existent container, which requires permissions at the storage account level. [#61785](https://github.com/ClickHouse/ClickHouse/pull/61785) ([Daniel Pozo Escalona](https://github.com/danipozo)). +* In the previous version, some numbers in Pretty formats were not pretty enough. [#61794](https://github.com/ClickHouse/ClickHouse/pull/61794) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A long value in Pretty formats won't be cut if it is the single value in the resultset, such as in the result of the `SHOW CREATE TABLE` query. [#61795](https://github.com/ClickHouse/ClickHouse/pull/61795) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Similarly to `clickhouse-local`, `clickhouse-client` will accept the `--output-format` option as a synonym to the `--format` option. This closes [#59848](https://github.com/ClickHouse/ClickHouse/issues/59848). [#61797](https://github.com/ClickHouse/ClickHouse/pull/61797) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* If stdout is a terminal and the output format is not specified, `clickhouse-client` and similar tools will use `PrettyCompact` by default, similarly to the interactive mode. `clickhouse-client` and `clickhouse-local` will handle command line arguments for input and output formats in a unified fashion. This closes [#61272](https://github.com/ClickHouse/ClickHouse/issues/61272). [#61800](https://github.com/ClickHouse/ClickHouse/pull/61800) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Underscore digit groups in Pretty formats for better readability. This is controlled by a new setting, `output_format_pretty_highlight_digit_groups`. [#61802](https://github.com/ClickHouse/ClickHouse/pull/61802) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Fix bug with `intDiv` for decimal arguments [#59243](https://github.com/ClickHouse/ClickHouse/pull/59243) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix_kql_issue_found_by_wingfuzz [#59626](https://github.com/ClickHouse/ClickHouse/pull/59626) ([Yong Wang](https://github.com/kashwy)). +* Fix error "Read beyond last offset" for AsynchronousBoundedReadBuffer [#59630](https://github.com/ClickHouse/ClickHouse/pull/59630) ([Vitaly Baranov](https://github.com/vitlibar)). +* rabbitmq: fix having neither acked nor nacked messages [#59775](https://github.com/ClickHouse/ClickHouse/pull/59775) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix function execution over const and LowCardinality with GROUP BY const for analyzer [#59986](https://github.com/ClickHouse/ClickHouse/pull/59986) ([Azat Khuzhin](https://github.com/azat)). +* Fix scale conversion for DateTime64 [#60004](https://github.com/ClickHouse/ClickHouse/pull/60004) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix INSERT into SQLite with single quote (by escaping single quotes with a quote instead of backslash) [#60015](https://github.com/ClickHouse/ClickHouse/pull/60015) ([Azat Khuzhin](https://github.com/azat)). +* Fix optimize_uniq_to_count removing the column alias [#60026](https://github.com/ClickHouse/ClickHouse/pull/60026) ([Raúl Marín](https://github.com/Algunenano)). +* Fix finished_mutations_to_keep=0 for MergeTree (as docs says 0 is to keep everything) [#60031](https://github.com/ClickHouse/ClickHouse/pull/60031) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible exception from s3queue table on drop [#60036](https://github.com/ClickHouse/ClickHouse/pull/60036) ([Kseniia Sumarokova](https://github.com/kssenii)). +* PartsSplitter invalid ranges for the same part [#60041](https://github.com/ClickHouse/ClickHouse/pull/60041) ([Maksim Kita](https://github.com/kitaisreal)). +* Use max_query_size from context in DDLLogEntry instead of hardcoded 4096 [#60083](https://github.com/ClickHouse/ClickHouse/pull/60083) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix inconsistent formatting of queries [#60095](https://github.com/ClickHouse/ClickHouse/pull/60095) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix inconsistent formatting of explain in subqueries [#60102](https://github.com/ClickHouse/ClickHouse/pull/60102) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix cosineDistance crash with Nullable [#60150](https://github.com/ClickHouse/ClickHouse/pull/60150) ([Raúl Marín](https://github.com/Algunenano)). +* Allow casting of bools in string representation to to true bools [#60160](https://github.com/ClickHouse/ClickHouse/pull/60160) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix system.s3queue_log [#60166](https://github.com/ClickHouse/ClickHouse/pull/60166) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix arrayReduce with nullable aggregate function name [#60188](https://github.com/ClickHouse/ClickHouse/pull/60188) ([Raúl Marín](https://github.com/Algunenano)). +* Fix actions execution during preliminary filtering (PK, partition pruning) [#60196](https://github.com/ClickHouse/ClickHouse/pull/60196) ([Azat Khuzhin](https://github.com/azat)). +* Hide sensitive info for s3queue [#60233](https://github.com/ClickHouse/ClickHouse/pull/60233) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Revert "Replace `ORDER BY ALL` by `ORDER BY *`" [#60248](https://github.com/ClickHouse/ClickHouse/pull/60248) ([Robert Schulze](https://github.com/rschu1ze)). +* Azure Blob Storage : Fix issues endpoint and prefix [#60251](https://github.com/ClickHouse/ClickHouse/pull/60251) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix http exception codes. [#60252](https://github.com/ClickHouse/ClickHouse/pull/60252) ([Austin Kothig](https://github.com/kothiga)). +* fix LRUResource Cache bug (Hive cache) [#60262](https://github.com/ClickHouse/ClickHouse/pull/60262) ([shanfengp](https://github.com/Aed-p)). +* s3queue: fix bug (also fixes flaky test_storage_s3_queue/test.py::test_shards_distributed) [#60282](https://github.com/ClickHouse/ClickHouse/pull/60282) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix use-of-uninitialized-value and invalid result in hashing functions with IPv6 [#60359](https://github.com/ClickHouse/ClickHouse/pull/60359) ([Kruglov Pavel](https://github.com/Avogar)). +* Force reanalysis if parallel replicas changed [#60362](https://github.com/ClickHouse/ClickHouse/pull/60362) ([Raúl Marín](https://github.com/Algunenano)). +* Fix usage of plain metadata type with new disks configuration option [#60396](https://github.com/ClickHouse/ClickHouse/pull/60396) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Don't allow to set max_parallel_replicas to 0 as it doesn't make sense [#60430](https://github.com/ClickHouse/ClickHouse/pull/60430) ([Kruglov Pavel](https://github.com/Avogar)). +* Try to fix logical error 'Cannot capture column because it has incompatible type' in mapContainsKeyLike [#60451](https://github.com/ClickHouse/ClickHouse/pull/60451) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix OptimizeDateOrDateTimeConverterWithPreimageVisitor with null arguments [#60453](https://github.com/ClickHouse/ClickHouse/pull/60453) ([Raúl Marín](https://github.com/Algunenano)). +* Try to avoid calculation of scalar subqueries for CREATE TABLE. [#60464](https://github.com/ClickHouse/ClickHouse/pull/60464) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Merging [#59674](https://github.com/ClickHouse/ClickHouse/issues/59674). [#60470](https://github.com/ClickHouse/ClickHouse/pull/60470) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Correctly check keys in s3Cluster [#60477](https://github.com/ClickHouse/ClickHouse/pull/60477) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in parallel parsing when lots of rows are skipped due to errors [#60516](https://github.com/ClickHouse/ClickHouse/pull/60516) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix_max_query_size_for_kql_compound_operator: [#60534](https://github.com/ClickHouse/ClickHouse/pull/60534) ([Yong Wang](https://github.com/kashwy)). +* Keeper fix: add timeouts when waiting for commit logs [#60544](https://github.com/ClickHouse/ClickHouse/pull/60544) ([Antonio Andelic](https://github.com/antonio2368)). +* Reduce the number of read rows from `system.numbers` [#60546](https://github.com/ClickHouse/ClickHouse/pull/60546) ([JackyWoo](https://github.com/JackyWoo)). +* Don't output number tips for date types [#60577](https://github.com/ClickHouse/ClickHouse/pull/60577) ([Raúl Marín](https://github.com/Algunenano)). +* Fix reading from MergeTree with non-deterministic functions in filter [#60586](https://github.com/ClickHouse/ClickHouse/pull/60586) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix logical error on bad compatibility setting value type [#60596](https://github.com/ClickHouse/ClickHouse/pull/60596) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix inconsistent aggregate function states in mixed x86-64 / ARM clusters [#60610](https://github.com/ClickHouse/ClickHouse/pull/60610) ([Harry Lee](https://github.com/HarryLeeIBM)). +* fix(prql): Robust panic handler [#60615](https://github.com/ClickHouse/ClickHouse/pull/60615) ([Maximilian Roos](https://github.com/max-sixty)). +* Fix `intDiv` for decimal and date arguments [#60672](https://github.com/ClickHouse/ClickHouse/pull/60672) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix: expand CTE in alter modify query [#60682](https://github.com/ClickHouse/ClickHouse/pull/60682) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix system.parts for non-Atomic/Ordinary database engine (i.e. Memory) [#60689](https://github.com/ClickHouse/ClickHouse/pull/60689) ([Azat Khuzhin](https://github.com/azat)). +* Fix "Invalid storage definition in metadata file" for parameterized views [#60708](https://github.com/ClickHouse/ClickHouse/pull/60708) ([Azat Khuzhin](https://github.com/azat)). +* Fix buffer overflow in CompressionCodecMultiple [#60731](https://github.com/ClickHouse/ClickHouse/pull/60731) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove nonsense from SQL/JSON [#60738](https://github.com/ClickHouse/ClickHouse/pull/60738) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove wrong sanitize checking in aggregate function quantileGK [#60740](https://github.com/ClickHouse/ClickHouse/pull/60740) ([李扬](https://github.com/taiyang-li)). +* Fix insert-select + insert_deduplication_token bug by setting streams to 1 [#60745](https://github.com/ClickHouse/ClickHouse/pull/60745) ([Jordi Villar](https://github.com/jrdi)). +* Prevent setting custom metadata headers on unsupported multipart upload operations [#60748](https://github.com/ClickHouse/ClickHouse/pull/60748) ([Francisco J. Jurado Moreno](https://github.com/Beetelbrox)). +* Fix toStartOfInterval [#60763](https://github.com/ClickHouse/ClickHouse/pull/60763) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix crash in arrayEnumerateRanked [#60764](https://github.com/ClickHouse/ClickHouse/pull/60764) ([Raúl Marín](https://github.com/Algunenano)). +* Fix crash when using input() in INSERT SELECT JOIN [#60765](https://github.com/ClickHouse/ClickHouse/pull/60765) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash with different allow_experimental_analyzer value in subqueries [#60770](https://github.com/ClickHouse/ClickHouse/pull/60770) ([Dmitry Novik](https://github.com/novikd)). +* Remove recursion when reading from S3 [#60849](https://github.com/ClickHouse/ClickHouse/pull/60849) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible stuck on error in HashedDictionaryParallelLoader [#60926](https://github.com/ClickHouse/ClickHouse/pull/60926) ([vdimir](https://github.com/vdimir)). +* Fix async RESTORE with Replicated database [#60934](https://github.com/ClickHouse/ClickHouse/pull/60934) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in async inserts to `Log` tables via native protocol [#61055](https://github.com/ClickHouse/ClickHouse/pull/61055) ([Anton Popov](https://github.com/CurtizJ)). +* Fix lazy execution of default argument in dictGetOrDefault for RangeHashedDictionary [#61196](https://github.com/ClickHouse/ClickHouse/pull/61196) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix multiple bugs in groupArraySorted [#61203](https://github.com/ClickHouse/ClickHouse/pull/61203) ([Raúl Marín](https://github.com/Algunenano)). +* Fix Keeper reconfig for standalone binary [#61233](https://github.com/ClickHouse/ClickHouse/pull/61233) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix usage of session_token in S3 engine [#61234](https://github.com/ClickHouse/ClickHouse/pull/61234) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible incorrect result of aggregate function `uniqExact` [#61257](https://github.com/ClickHouse/ClickHouse/pull/61257) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bugs in show database [#61269](https://github.com/ClickHouse/ClickHouse/pull/61269) ([Raúl Marín](https://github.com/Algunenano)). +* Fix logical error in RabbitMQ storage with MATERIALIZED columns [#61320](https://github.com/ClickHouse/ClickHouse/pull/61320) ([vdimir](https://github.com/vdimir)). +* Fix CREATE OR REPLACE DICTIONARY [#61356](https://github.com/ClickHouse/ClickHouse/pull/61356) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix ATTACH query with external ON CLUSTER [#61365](https://github.com/ClickHouse/ClickHouse/pull/61365) ([Nikolay Degterinsky](https://github.com/evillique)). +* fix issue of actions dag split [#61458](https://github.com/ClickHouse/ClickHouse/pull/61458) ([Raúl Marín](https://github.com/Algunenano)). +* Fix finishing a failed RESTORE [#61466](https://github.com/ClickHouse/ClickHouse/pull/61466) ([Vitaly Baranov](https://github.com/vitlibar)). +* Disable async_insert_use_adaptive_busy_timeout correctly with compatibility settings [#61468](https://github.com/ClickHouse/ClickHouse/pull/61468) ([Raúl Marín](https://github.com/Algunenano)). +* Allow queuing in restore pool [#61475](https://github.com/ClickHouse/ClickHouse/pull/61475) ([Nikita Taranov](https://github.com/nickitat)). +* Fix bug when reading system.parts using UUID (issue 61220). [#61479](https://github.com/ClickHouse/ClickHouse/pull/61479) ([Dan Wu](https://github.com/wudanzy)). +* Fix crash in window view [#61526](https://github.com/ClickHouse/ClickHouse/pull/61526) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `repeat` with non native integers [#61527](https://github.com/ClickHouse/ClickHouse/pull/61527) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix client `-s` argument [#61530](https://github.com/ClickHouse/ClickHouse/pull/61530) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix crash in arrayPartialReverseSort [#61539](https://github.com/ClickHouse/ClickHouse/pull/61539) ([Raúl Marín](https://github.com/Algunenano)). +* Fix string search with const position [#61547](https://github.com/ClickHouse/ClickHouse/pull/61547) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix addDays cause an error when used datetime64 [#61561](https://github.com/ClickHouse/ClickHouse/pull/61561) ([Shuai li](https://github.com/loneylee)). +* Fix `system.part_log` for async insert with deduplication [#61620](https://github.com/ClickHouse/ClickHouse/pull/61620) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix Non-ready set for system.parts. [#61666](https://github.com/ClickHouse/ClickHouse/pull/61666) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). diff --git a/docs/ja/get-started/cloud-quick-start.md b/docs/ja/get-started/cloud-quick-start.md new file mode 100644 index 00000000000..b6801aa1387 --- /dev/null +++ b/docs/ja/get-started/cloud-quick-start.md @@ -0,0 +1,251 @@ +--- +sidebar_position: 1 +slug: /ja/cloud-quick-start +sidebar_label: Cloudクイックスタート +keywords: [clickhouse, install, getting started, quick start] +pagination_next: en/get-started/sql-console +--- +import SignUp from '@site/docs/ja/_snippets/_sign_in_or_trial.md'; +import SQLConsoleDetail from '@site/docs/ja/_snippets/_launch_sql_console.md'; +import CheckIPAccess from '@site/docs/ja/_snippets/_check_ip_access_list_detail.md'; + +# ClickHouse Cloud クイックスタート + +ClickHouse をすぐにセットアップして利用を開始する最速かつ最も簡単な方法は、[ClickHouse Cloud](https://clickhouse.cloud)で新しいサービスを作成することです。 + +## 1: ClickHouse を入手する + +[ClickHouse Cloud](https://clickhouse.cloud)で無料の ClickHouse サービスを作成するには、次のステップを完了するだけでサインアップできます: + + - [サインアップページ](https://clickhouse.cloud/signUp)でアカウントを作成 + - 受信したメール内のリンクをクリックしてメールアドレスを確認 + - 作成したユーザー名とパスワードでログイン + +ログインすると、ClickHouse Cloud のオンボーディングウィザードが開始され、新しい ClickHouse サービスの作成をガイドしてくれます。サービスの展開先のリージョンを選択し、新しいサービスに名前を付けます: + +
+ +![New ClickHouse Service](@site/docs/ja/_snippets/images/createservice1.png) +
+ +
+ +ClickHouse Cloud は IP フィルタリングを使用してサービスへのアクセスを制限します。ローカル IP アドレスが既に追加されていることに注意してください。サービスが起動してから追加することもできます。 + +
+ +![IP Filtering](@site/docs/ja/_snippets/images/createservice2.png) +
+ +
+ +ClickHouse Cloud は `default` ユーザーのためにパスワードを生成します。資格情報を必ず保存してください。(後で変更可能です。) + +
+ +![Download Credentials](@site/docs/ja/_snippets/images/createservice3.png) +
+ +新しいサービスがプロビジョニングされ、ClickHouse Cloud ダッシュボードに表示されるはずです: + +
+ +![Download Credentials](@site/docs/ja/_snippets/images/createservice4.png) +
+ +
+ +おめでとうございます!ClickHouse Cloud サービスが起動しました。接続方法やデータのインジェストを開始する方法について、引き続きお読みください。 + +## 2: ClickHouse に接続 + +素早く始めるために、ClickHouse ではウェブベースの SQL コンソールが提供されています。 + + + +:::note +ClickHouse はデータのセキュリティを非常に重視しているため、サービス作成時に IP アクセスリストの設定が求められました。これをスキップしたり誤って閉じたりした場合、サービスに接続できません。 + +ローカル IP アドレスの追加方法については、[IP アクセスリスト](/docs/ja/cloud/security/setting-ip-filters)のドキュメントページを参照してください。 +::: + +1. 接続が正常に動作するか確認するために、簡単なクエリを入力しましょう: + + ```sql + SHOW databases + ``` + + リストには 4 つのデータベースが表示され、追加したものがあればそれも含まれます。 + + これで、新しい ClickHouse サービスを使用する準備が整いました! + +## 3: データベースとテーブルを作成 + +1. ほとんどのデータベース管理システムと同様に、ClickHouse はテーブルを論理的に**データベース**にグループ化します。新しいデータベースを ClickHouse に作成するには `CREATE DATABASE` コマンドを使用します: + ```sql + CREATE DATABASE IF NOT EXISTS helloworld + ``` + +1. `helloworld` データベースに `my_first_table` という名前のテーブルを作成するには次のコマンドを実行します: + ```sql + CREATE TABLE helloworld.my_first_table + ( + user_id UInt32, + message String, + timestamp DateTime, + metric Float32 + ) + ENGINE = MergeTree() + PRIMARY KEY (user_id, timestamp) + ``` + + 上記の例では、`my_first_table` は4つのカラムを持つ MergeTree テーブルです: + + - `user_id`: 32ビットの符号なし整数 + - `message`: 他のデータベースシステムでの VARCHAR, BLOB, CLOB などに置き換わる String データ型 + - `timestamp`: 時間を表す DateTime 値 + - `metric`: 32ビットの浮動小数点数 + + :::note テーブルエンジン + テーブルエンジンは以下を決定します: + - データがどのように、どこに保存されるか + - どのクエリがサポートされるか + - データがレプリケーションされるかどうか + + 選択可能なエンジンは多数ありますが、単一ノードの ClickHouse サーバー上のシンプルなテーブルには [MergeTree](/ja/engines/table-engines/mergetree-family/mergetree.md) が一般的な選択です。 + ::: + + ### 主キーの簡単な紹介 + + 先に進む前に、ClickHouse における主キーの働きについて理解することが重要です(主キーの実装が予想外に思えるかもしれません!): + + - ClickHouse の主キーはテーブルの各行に対して**一意ではありません** + + ClickHouse テーブルの主キーはデータがディスクに書き込まれる際の並び順を決定します。8,192 行または 10MB のデータごとに(**インデックス粒度**として参照される)主キーインデックスファイルにエントリが作成されます。この粒度の概念により、**スパースインデックス**がメモリに簡単に適合し、粒度は `SELECT` クエリ処理時に処理される最小のカラムデータのストライプを表します。 + + 主キーは `PRIMARY KEY` パラメータを使用して定義できます。`PRIMARY KEY`を指定しないでテーブルを定義すると、キーは `ORDER BY` 句に指定されたタプルになります。`PRIMARY KEY` と `ORDER BY` の両方を指定した場合、主キーはソート順のサブセットでなければなりません。 + + 主キーはまたソートキーであり `(user_id, timestamp)` のタプルです。したがって、各カラムファイルに格納されるデータは `user_id`、次に `timestamp` の順にソートされます。 + +## 4: データを挿入 + +ClickHouse ではおなじみの `INSERT INTO TABLE` コマンドを使用できますが、`MergeTree` テーブルへの各挿入がストレージに**パート**を作成することを理解することが重要です。 + +:::tip ClickHouse ベストプラクティス +バッチごとに大量(数万または数百万)の行を挿入してください。心配いりません - ClickHouse はそうしたボリュームを容易に処理でき、それが [コスト削減](/docs/ja/cloud/bestpractices/bulkinserts.md) にも繋がります。 +::: + +1. 簡単な例であっても、複数の行を同時に挿入しましょう: + ```sql + INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES + (101, 'Hello, ClickHouse!', now(), -1.0 ), + (102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ), + (102, 'Sort your data based on your commonly-used queries', today(), 2.718 ), + (101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 ) + ``` + + :::note + `timestamp` カラムがさまざまな **Date** および **DateTime** 関数を使用して埋められていることに注意してください。ClickHouse には多くの便利な関数があります。詳細は[**関数**セクション](/docs/ja/sql-reference/functions/index.md)を参照してください。 + ::: + +1. 挿入が成功したか確認しましょう: + ```sql + SELECT * FROM helloworld.my_first_table + ``` + 挿入された4つの行が表示されるはずです: + +## 5: ClickHouse クライアントを使用する + +コマンドラインツール **clickhouse client** を使用して ClickHouse Cloud サービスに接続することもできます。接続詳細はサービスの **Native** タブに記載されています: + + ![clickhouse client connection details](@site/docs/ja/images/quickstart/CloudClickhouseClientDetails.png) + +1. [ClickHouse](/docs/ja/integrations/clickhouse-client-local.md) をインストールします。 + +2. ホスト名、ユーザー名、パスワードを差し替えてコマンドを実行します: + ```bash + ./clickhouse client --host HOSTNAME.REGION.CSP.clickhouse.cloud \ + --secure --port 9440 \ + --user default \ + --password + ``` + スマイリーフェイスのプロンプトが表示されたら、クエリを実行する準備が整いました! + ```response + :) + ``` + +3. 次のクエリを実行してみましょう: + ```sql + SELECT * + FROM helloworld.my_first_table + ORDER BY timestamp + ``` + 応答が整ったテーブル形式で返ってくることに注目してください: + ```response + ┌─user_id─┬─message────────────────────────────────────────────┬───────────timestamp─┬──metric─┐ + │ 102 │ Insert a lot of rows per batch │ 2022-03-21 00:00:00 │ 1.41421 │ + │ 102 │ Sort your data based on your commonly-used queries │ 2022-03-22 00:00:00 │ 2.718 │ + │ 101 │ Hello, ClickHouse! │ 2022-03-22 14:04:09 │ -1 │ + │ 101 │ Granules are the smallest chunks of data read │ 2022-03-22 14:04:14 │ 3.14159 │ + └─────────┴────────────────────────────────────────────────────┴─────────────────────┴─────────┘ + + 4 rows in set. Elapsed: 0.008 sec. + ``` + +5. `FORMAT`句を追加してその一つを指定すべき [ClickHouse の多くのサポートされている出力形式](/ja/interfaces/formats/) のいずれかを指定してください: + ```sql + SELECT * + FROM helloworld.my_first_table + ORDER BY timestamp + FORMAT TabSeparated + ``` + 上記のクエリでは、出力はタブ区切りで返されます: + ```response + Query id: 3604df1c-acfd-4117-9c56-f86c69721121 + + 102 Insert a lot of rows per batch 2022-03-21 00:00:00 1.41421 + 102 Sort your data based on your commonly-used queries 2022-03-22 00:00:00 2.718 + 101 Hello, ClickHouse! 2022-03-22 14:04:09 -1 + 101 Granules are the smallest chunks of data read 2022-03-22 14:04:14 3.14159 + + 4 rows in set. Elapsed: 0.005 sec. + ``` + +6. `clickhouse client` を終了するには、**exit** コマンドを入力します: + ```bash + exit + ``` + +## 6: CSV ファイルを挿入する + +データベースを始める際に一般的なタスクは、既にファイルにあるデータを挿入することです。ユーザーID、訪問した URL、イベントのタイムスタンプを含むクリックストリームデータを表すサンプルデータをオンラインで提供しています。 + +`data.csv` という名前の CSV ファイルに次のテキストがあるとします: + + ```bash + 102,This is data in a file,2022-02-22 10:43:28,123.45 + 101,It is comma-separated,2022-02-23 00:00:00,456.78 + 103,Use FORMAT to specify the format,2022-02-21 10:43:30,678.90 + ``` + +1. 次のコマンドは `my_first_table` にデータを挿入します: + ```bash + ./clickhouse client --host HOSTNAME.REGION.CSP.clickhouse.cloud \ + --secure --port 9440 \ + --user default \ + --password \ + --query='INSERT INTO helloworld.my_first_table FORMAT CSV' < data.csv + ``` + +2. テーブルに新しい行が表示されることに注目してください: + + ![New rows from CSV file](@site/docs/ja/images/quickstart_04.png) + +## 次は何をすべきか? + +- [チュートリアル](/docs/ja/tutorial.md) では200万行のデータをテーブルに挿入し、分析クエリを書く体験を提供します +- [例データセット](/docs/ja/getting-started/index.md) のリストと、それらを挿入する手順があります +- [ClickHouse の始め方](https://clickhouse.com/company/events/getting-started-with-clickhouse/)に関する25分のビデオをご覧ください +- 外部ソースからデータを取得する場合、メッセージキュー、データベース、パイプラインなどとの接続方法についての[統合ガイドのコレクション](/docs/ja/integrations/index.mdx)を参照してください +- UI/BI 可視化ツールを使用している場合、[UI を ClickHouse に接続するためのユーザーガイド](/docs/ja/integrations/data-visualization.md) を参照してください +- 主キーに関するすべてのことを知るためには、[主キーに関するユーザーガイド](/docs/ja/guides/best-practices/sparse-primary-indexes.md)を参照してください diff --git a/docs/ja/get-started/query-endpoints.md b/docs/ja/get-started/query-endpoints.md new file mode 100644 index 00000000000..effcdf170f9 --- /dev/null +++ b/docs/ja/get-started/query-endpoints.md @@ -0,0 +1,500 @@ +--- +sidebar_title: クエリ API エンドポイント +slug: /ja/get-started/query-endpoints +description: 保存したクエリから簡単にREST APIエンドポイントを作成 +keywords: [api, query api endpoints, query endpoints, query rest api] +--- + +import BetaBadge from '@theme/badges/BetaBadge'; + +# クエリ API エンドポイント + + + +**クエリ API エンドポイント** 機能を使用すると、ClickHouse Cloud コンソール内の任意の保存した SQL クエリから直接 API エンドポイントを作成できます。ネイティブドライバを使ってClickHouse Cloudサービスに接続せずに、HTTP経由でAPIエンドポイントにアクセスして保存したクエリを実行することが可能になります。 + +## クイックスタートガイド + +始める前に、APIキーと管理コンソールのロールを確認してください。[APIキーを作成する](/docs/ja/cloud/manage/openapi)方法についてはこちらを参照してください。 + +### 保存されたクエリを作成 + +すでに保存されたクエリがある場合、このステップをスキップできます。 + +新しいクエリタブを開きます。デモンストレーションのために、約45億レコードを含む [youtube データセット](/docs/ja/getting-started/example-datasets/youtube-dislikes) を使用します。以下の例では、ユーザーが入力する `year` パラメーターに基づいて、ビデオあたりの平均視聴数によるトップ10のアップローダーを返します: + +```sql +with sum(view_count) as view_sum, + round(view_sum / num_uploads, 2) as per_upload +select + uploader, + count() as num_uploads, + formatReadableQuantity(view_sum) as total_views, + formatReadableQuantity(per_upload) as views_per_video +from + youtube +where + toYear(upload_date) = {year: UInt16} +group by uploader +order by per_upload desc +limit 10 +``` + +注意すべきは、このクエリはパラメーター(`year`)を含んでいることです。SQLコンソールのクエリエディタはClickHouseのクエリパラメーター式を自動的に検出し、各パラメーターの入力を提供します。このクエリが機能することを確認するために、速やかに実行してみましょう: + +![例クエリのテスト](@site/docs/ja/cloud/images/sqlconsole/endpoints-testquery.png) + +次に、クエリを保存します: + +![例クエリの保存](@site/docs/ja/cloud/images/sqlconsole/endpoints-savequery.png) + +保存されたクエリに関するさらに詳しいドキュメントは[こちら](/docs/ja/get-started/sql-console#saving-a-query)から確認できます。 + +### クエリ API エンドポイントの設定 + +クエリ API エンドポイントは、クエリビューから直接、**共有** ボタンをクリックし、`API Endpoint` を選択することで設定できます。どのAPIキーがエンドポイントにアクセス可能であるかを指定するようプロンプトが表示されます: + +![クエリエンドポイントの設定](@site/docs/ja/cloud/images/sqlconsole/endpoints-configure.png) + +APIキーを選択すると、クエリAPIエンドポイントが自動的に設定されます。テストリクエストを送信できるように例として `curl` コマンドが表示されます: + +![エンドポイントcurlコマンド](@site/docs/ja/cloud/images/sqlconsole/endpoints-completed.png) + +### クエリ API パラメーター + +クエリ内のパラメーターは `{parameter_name: type}` の構文で指定できます。これらのパラメーターは自動的に検出され、例のリクエストペイロードにはこれらのパラメーターを渡せる `queryVariables` オブジェクトが含まれます。 + +### テストと監視 + +クエリ API エンドポイントが作成されたら、`curl`や他のHTTPクライアントを使って機能することを確認できます: +エンドポイントcurlテスト + +最初のリクエストを送信すると、**共有** ボタンの右側に新しいボタンが直ちに表示されるはずです。これをクリックすると、クエリに関する監視データを含むフライアウトが開きます: + +![エンドポイント監視](@site/docs/ja/cloud/images/sqlconsole/endpoints-monitoring.png) + +## 実装の詳細 + +### 説明 + +このルートは、指定されたクエリエンドポイントでクエリを実行します。異なるバージョン、フォーマット、クエリ変数をサポートしています。応答はストリームとして送信 (_バージョン2のみ_) できるか、単一のペイロードとして返されます。 + +### 認証 + +- **必須**: はい +- **メソッド**: OpenAPIキー/シークレット経由の基本認証 +- **権限**: クエリエンドポイントに対する適切な権限を持つ + +### URL パラメーター + +- `queryEndpointId` (必須):実行するクエリエンドポイントの一意の識別子。 + +### クエリパラメーター + +#### V1 + +なし + +#### V2 + +- `format` (任意):応答のフォーマット。ClickHouseがサポートするすべてのフォーマットをサポート。 +- `param_:name` クエリ内で使用するクエリ変数。`name`はクエリ内の変数名に一致する必要があります。リクエストの本文がストリームの場合にのみ使用します。 +- `:clickhouse_setting` どの[ClickHouse設定](https://clickhouse.com/docs/ja/operations/settings/settings)でもクエリパラメーターとして渡すことが可能です。 + +### ヘッダー + +- `x-clickhouse-endpoint-version` (任意):クエリエンドポイントのバージョン。サポートされているバージョンは`1`と`2`です。提供されない場合、エンドポイントに対して最後に保存されたバージョンがデフォルトで使用されます。 +- `x-clickhouse-endpoint-upgrade` (任意):このヘッダーを設定して、エンドポイントバージョンをアップグレードします。このヘッダーは `x-clickhouse-endpoint-version` ヘッダーと連携します。 + +### リクエストボディ + +- `queryVariables` (任意):クエリ内で使用する変数を含むオブジェクト。 +- `format` (任意):応答のフォーマット。Query API エンドポイントがバージョン2の場合、ClickHouseがサポートする任意のフォーマットが可能。v1でサポートされるフォーマットは: + - TabSeparated + - TabSeparatedWithNames + - TabSeparatedWithNamesAndTypes + - JSON + - JSONEachRow + - CSV + - CSVWithNames + - CSVWithNamesAndTypes + +### 応答 + +- **200 OK**: クエリが正常に実行された。 +- **400 Bad Request**: リクエストが不正であった。 +- **401 Unauthorized**: 認証なしまたは権限が不十分でリクエストが行われた。 +- **404 Not Found**: 指定されたクエリエンドポイントが見つからなかった。 + +### エラーハンドリング + +- リクエストに有効な認証資格情報が含まれていることを確認してください。 +- `queryEndpointId` および `queryVariables` が正しいことを確認してください。 +- サーバーエラーを適切に処理し、適切なエラーメッセージを返します。 + +### エンドポイントバージョンのアップグレード + +エンドポイントバージョンを`v1`から`v2`にアップグレードするには、リクエストに `x-clickhouse-endpoint-upgrade` ヘッダーを含め、それを`1`に設定します。これによりアップグレードプロセスがトリガされ、`v2`で利用可能な機能や改善点を使用できるようになります。 + +## 例 + +### 基本的なリクエスト + +**クエリ API エンドポイント SQL:** + +```sql +SELECT database, name as num_tables FROM system.tables limit 3; +``` + +#### バージョン 1 + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run' \ +--user '' \ +-H 'Content-Type: application/json' \ +-d '{ "format": "JSONEachRow" }' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + format: "JSONEachRow", + }), + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```json +{ + "data": { + "columns": [ + { + "name": "database", + "type": "String" + }, + { + "name": "num_tables", + "type": "String" + } + ], + "rows": [ + ["INFORMATION_SCHEMA", "COLUMNS"], + ["INFORMATION_SCHEMA", "KEY_COLUMN_USAGE"], + ["INFORMATION_SCHEMA", "REFERENTIAL_CONSTRAINTS"] + ] + } +} +``` + +#### バージョン 2 + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONEachRow' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONEachRow", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```application/x-ndjson +{"database":"INFORMATION_SCHEMA","num_tables":"COLUMNS"} +{"database":"INFORMATION_SCHEMA","num_tables":"KEY_COLUMN_USAGE"} +{"database":"INFORMATION_SCHEMA","num_tables":"REFERENTIAL_CONSTRAINTS"} +``` + +### クエリ変数を使用したリクエストおよびJSONCompactEachRowフォーマットのバージョン2 + +**クエリ API エンドポイント SQL:** + +```sql +SELECT name, database FROM system.tables WHERE match(name, {tableNameRegex: String}) AND database = {database: String}; +``` + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONCompactEachRow' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' \ +-d '{ "queryVariables": { "tableNameRegex": "query.*", "database": "system" } }' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONCompactEachRow", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + body: JSON.stringify({ + queryVariables: { + tableNameRegex: "query.*", + database: "system", + }, + }), + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```application/x-ndjson +["query_cache", "system"] +["query_log", "system"] +["query_views_log", "system"] +``` + +### テーブルにデータを挿入するクエリ変数内で配列を使用したリクエスト + +**テーブル SQL:** + +```SQL +CREATE TABLE default.t_arr +( + `arr` Array(Array(Array(UInt32))) +) +ENGINE = MergeTree +ORDER BY tuple() +``` + +**クエリ API エンドポイント SQL:** + +```sql + INSERT INTO default.t_arr VALUES ({arr: Array(Array(Array(UInt32)))}); +``` + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' \ +-d '{ + "queryVariables": { + "arr": [[[12, 13, 0, 1], [12]]] + } +}' +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + body: JSON.stringify({ + queryVariables: { + arr: [[[12, 13, 0, 1], [12]]], + }, + }), + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +**応答:** + +```text +OK +``` + +### max_threads を8にセットしたClickHouse設定を使ったリクエスト + +**クエリ API エンドポイント SQL:** + +```sql +SELECT * from system.tables; +``` + +**cURL:** + +```bash +curl -X POST 'https://console-api.clickhouse.cloud/.api/query-endpoints//run?max_threads=8,' \ +--user '' \ +-H 'Content-Type: application/json' \ +-H 'x-clickhouse-endpoint-version: 2' \ +``` + +**JavaScript:** + +```javascript +fetch( + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?max_threads=8", + { + method: "POST", + headers: { + Authorization: "Basic ", + "Content-Type": "application/json", + "x-clickhouse-endpoint-version": "2", + }, + } +) + .then((response) => response.json()) + .then((data) => console.log(data)) + .catch((error) => console.error("Error:", error)); +``` + +### ストリームとしての応答をリクエストおよび解析 + +**クエリ API エンドポイント SQL:** + +```sql +SELECT name, database from system.tables; +``` + +**Typescript:** + +```typescript +async function fetchAndLogChunks( + url: string, + openApiKeyId: string, + openApiKeySecret: string +) { + const auth = Buffer.from(`${openApiKeyId}:${openApiKeySecret}`).toString( + "base64" + ); + + const headers = { + Authorization: `Basic ${auth}`, + "x-clickhouse-endpoint-version": "2", + }; + + const response = await fetch(url, { + headers, + method: "POST", + body: JSON.stringify({ format: "JSONEachRow" }), + }); + + if (!response.ok) { + console.error(`HTTP error! Status: ${response.status}`); + return; + } + + const reader = response.body as unknown as Readable; + reader.on("data", (chunk) => { + console.log(chunk.toString()); + }); + + reader.on("end", () => { + console.log("Stream ended."); + }); + + reader.on("error", (err) => { + console.error("Stream error:", err); + }); +} + +const endpointUrl = + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=JSONEachRow"; +const openApiKeyId = ""; +const openApiKeySecret = ""; +// Usage example +fetchAndLogChunks(endpointUrl, openApiKeyId, openApiKeySecret).catch((err) => + console.error(err) +); +``` + +**出力** + +```shell +> npx tsx index.ts +> {"name":"COLUMNS","database":"INFORMATION_SCHEMA"} +> {"name":"KEY_COLUMN_USAGE","database":"INFORMATION_SCHEMA"} +... +> Stream ended. +``` + +### ファイルからテーブルにストリームを挿入 + +以下のコンテンツで、ファイル ./samples/my_first_table_2024-07-11.csv を作成します: + +```csv +"user_id","json","name" +"1","{""name"":""John"",""age"":30}","John" +"2","{""name"":""Jane"",""age"":25}","Jane" +``` + +**テーブル作成 SQL:** + +```sql +create table default.my_first_table +( + user_id String, + json String, + name String, +) ENGINE = MergeTree() +ORDER BY user_id; +``` + +**クエリ API エンドポイント SQL:** + +```sql +INSERT INTO default.my_first_table +``` + +**cURL:** + +```bash +cat ./samples/my_first_table_2024-07-11.csv | curl --user '' \ + -X POST \ + -H 'Content-Type: application/octet-stream' \ + -H 'x-clickhouse-endpoint-version: 2' \ + "https://console-api.clickhouse.cloud/.api/query-endpoints//run?format=CSV" \ + --data-binary @- +``` diff --git a/docs/ja/get-started/query-insights.md b/docs/ja/get-started/query-insights.md new file mode 100644 index 00000000000..bda1f39bba8 --- /dev/null +++ b/docs/ja/get-started/query-insights.md @@ -0,0 +1,47 @@ +--- +sidebar_title: クエリインサイト +slug: /ja/get-started/query-insights +description: system.query_logデータを視覚化してクエリのデバッグとパフォーマンス最適化を簡素化 +keywords: [クエリインサイト, クエリログ, クエリログUI, system.query_logインサイト] +--- + +# クエリインサイト + +**クエリインサイト**機能は、さまざまな視覚化とテーブルを通じてClickHouseの組み込みクエリログをより使いやすくします。ClickHouseの`system.query_log`テーブルは、クエリの最適化、デバッグ、クラスター全体の健康状態とパフォーマンスを監視するための重要な情報源です。 + +## クエリ概要 + +サービスを選択すると、左サイドバーの**モニタリング**ナビゲーション項目が展開され、新たに**クエリインサイト**のサブ項目が表示されます。このオプションをクリックすると、新しいクエリインサイトページが開きます: + +![クエリインサイトUI概要](@site/docs/ja/cloud/images/sqlconsole/insights_overview.png) + +## トップレベルメトリクス + +上部の統計ボックスは、選択された期間内の基本的なトップレベルクエリメトリクスを表しています。その下には、クエリの種類(select、insert、その他)ごとに分解されたクエリボリューム、レイテンシ、エラー率を示す3つの時系列チャートがあります。レイテンシチャートは、p50、p90、およびp99レイテンシを表示するようにさらに調整できます: + +![クエリインサイトUIレイテンシチャート](@site/docs/ja/cloud/images/sqlconsole/insights_latency.png) + +## 最近のクエリ + +トップレベルメトリクスの下には、指定された期間内にノーマライズされたクエリハッシュとユーザーでグループ化されたクエリログエントリが表示されるテーブルがあります: + +![クエリインサイトUI最近のクエリテーブル](@site/docs/ja/cloud/images/sqlconsole/insights_recent.png) + +最近のクエリは、利用可能なフィールドでフィルターおよびソートすることができます。また、テーブルは、テーブル、p90、およびp99レイテンシなどの追加フィールドを表示または非表示にするように構成することができます。 + +## クエリ詳細表示 + +最近のクエリテーブルからクエリを選択すると、選択されたクエリに特有のメトリクスと情報を含むフライアウトが開きます: + +![クエリインサイトUIクエリ詳細表示](@site/docs/ja/cloud/images/sqlconsole/insights_drilldown.png) + +このフライアウトからわかるように、この特定のクエリは過去24時間で3000回以上実行されています。**クエリ情報**タブのすべてのメトリクスは集計されたメトリクスですが、**クエリ履歴**タブを選択することで個々の実行からのメトリクスも表示できます: + +クエリインサイトUIクエリ情報 + +
+ +このペインから、各クエリ実行の`設定`および`プロファイルイベント`項目を展開して、追加情報を表示できます。 diff --git a/docs/ja/get-started/sql-console.md b/docs/ja/get-started/sql-console.md new file mode 100644 index 00000000000..bd87dfdb487 --- /dev/null +++ b/docs/ja/get-started/sql-console.md @@ -0,0 +1,290 @@ +--- +sidebar_title: SQLコンソール +slug: /ja/get-started/sql-console +description: SQLコンソールを使用してクエリを実行し、ビジュアライゼーションを作成します。 +keywords: [sqlコンソール, sqlクライアント, クラウドコンソール, コンソール] +--- +# SQLコンソール + +SQLコンソールは、ClickHouse Cloudでデータベースを探索しクエリを実行するための最速かつ最も簡単な方法です。SQLコンソールを使用して以下のことが可能です: +- ClickHouse Cloudサービスに接続 +- テーブルデータの表示、フィルタリング、並べ替え +- クエリを実行し、数クリックで結果データを可視化 +- チームメンバーとクエリを共有し、より効果的にコラボレーション + +## コントロールプレーンからSQLコンソールを開く + +SQLコンソールはサービス概要画面から直接開くことができます。「接続」ボタンをクリックし、「SQLコンソールを開く」を選択します。 + + ![サービスからSQLコンソールを開く](@site/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png) + +SQLコンソールは新しいタブで開き、サービス認証情報の入力を求められます: + + ![認証情報を入力](@site/docs/ja/cloud/images/sqlconsole/enter-credentials.png) + +認証情報を入力後、「接続」をクリックすると、SQLコンソールが接続と認証を試みます。成功すると、SQLコンソールのインターフェースが表示されます: + + ![認証成功](@site/docs/ja/cloud/images/sqlconsole/authentication-success.png) + +## 直接SQLコンソールを読み込む + +SQLコンソールは https://console.clickhouse.cloud から直接開くこともできます。ClickHouse Cloudアカウントにログインすると、サービス一覧が表示されます。1つ選択し、サービス認証画面でサービス認証情報を入力します: + + ![サービスを選択](@site/docs/ja/cloud/images/sqlconsole/select-a-service.png) + +:::note +組織内に1つのサービスしか存在しない場合、SQLコンソールは直ちにサービス認証画面へ移動します。 +::: + +## サービススイッチャーを使用する + +SQLコンソールから直接他のサービスに簡単に切り替えることができます。コンソールの右上隅にあるサービススイッチャーを開き、別のサービスを選択します: + + ![サービスを切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-services.png) + +### テーブルを探索する + +### テーブルリストとスキーマ情報の表示 + +ClickHouseインスタンスに含まれるテーブルの概要は左のサイドバーにあります。左バーの上部にあるデータベースセレクターを使用して、特定のデータベース内のテーブルを表示します + + ![テーブルリストとスキーマ](@site/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png) + +リストのテーブルは展開してカラムとタイプを表示することもできます + + ![カラムを表示](@site/docs/ja/cloud/images/sqlconsole/view-columns.png) + +### テーブルデータを探索する + +リストのテーブルをクリックすると、新しいタブで開きます。テーブルビューでは、データを簡単に表示、選択、コピーできます。Microsoft ExcelやGoogle Sheetsなどのスプレッドシートアプリケーションにコピー貼り付けする際に、構造やフォーマットが保持されます。フッターのナビゲーションを使用して、テーブルデータのページを(30行ごとのページネーションで)切り替えることができます。 + + ![abc](@site/docs/ja/cloud/images/sqlconsole/abc.png) + +### セルデータの検査 + +セルインスペクターツールを使用して、単一のセルに含まれる大量のデータを表示できます。セルを右クリックし、「セルを検査」を選択して開きます。インスペクターの内容は、右上隅のコピーアイコンをクリックしてコピーできます。 + + ![セル内容の検査](@site/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png) + +## テーブルのフィルタリングと並べ替え + +### テーブルの並べ替え + +SQLコンソールでテーブルを並べ替えるには、テーブルを開いてツールバーの「並べ替え」ボタンを選択します。このボタンは、並べ替えを設定するためのメニューを開きます。どのカラムで並べ替えるかを選択し、並べ替えの順序(昇順または降順)を設定できます。「適用」を選択するか、Enterキーを押してテーブルを並べ替えます。 + + ![カラムで降順に並べ替える](@site/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png) + +SQLコンソールでは、複数の並べ替えをテーブルに追加することもできます。「並べ替え」ボタンを再度クリックして、別の並べ替えを追加します。注意:並べ替えは、並べ替えペインで表示される順序(上から下)で適用されます。並べ替えを削除するには、並べ替えの隣にある「x」ボタンをクリックします。 + +### テーブルのフィルタリング + +SQLコンソールでテーブルをフィルタリングするには、テーブルを開いて「フィルター」ボタンを選択します。並べ替えと同様に、このボタンはフィルターを設定するためのメニューを開きます。どのカラムでフィルタリングするかを選択し、必要な条件を設定します。SQLコンソールは、カラムに含まれるデータのタイプに対応するフィルターオプションをインテリジェントに表示します。 + + ![GSMに等しいラジオカラムでフィルタリング](@site/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png) + +フィルターに満足したら、「適用」を選択してデータをフィルタリングします。以下のように追加のフィルターも追加できます。 + + ![2000より大きい範囲にフィルターを追加](@site/docs/ja/cloud/images/sqlconsole/add-more-filters.png) + +並べ替え機能と同様に、フィルターの隣にある「x」ボタンをクリックして、フィルターを削除します。 + +### フィルタリングと並べ替えを同時に行う + +SQLコンソールでは、テーブルをフィルタリングと並べ替えを同時に行うことができます。上記の手順を使用して、すべての必要なフィルターと並べ替えを追加し、「適用」ボタンをクリックします。 + + ![フィルタリングと並べ替えを同時に行う](@site/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png) + +### フィルターと並べ替えからクエリを作成する + +SQLコンソールは、並べ替えとフィルターをクリック1つで直接クエリに変換することができます。ツールバーから並べ替えとフィルターパラメータを選んで「クエリを作成」ボタンを選択します。「クエリを作成」をクリックすると、新しいクエリタブが開き、テーブルビューに含まれるデータに対応するSQLコマンドが事前入力されます。 + + ![並べ替えとフィルターからクエリを作成する](@site/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png) + +:::note +「クエリを作成」機能を使用する際に、フィルターと並べ替えは必須ではありません。 +::: + +クエリの詳細については、(link) クエリドキュメンテーションを参照してください。 + +## クエリの作成と実行 + +### クエリの作成 + +SQLコンソールで新しいクエリを作成する方法は2つあります。 +* タブバーの「+」ボタンをクリックする +* 左サイドバーのクエリリストから「新しいクエリ」ボタンを選択する + + ![クエリの作成](@site/docs/ja/cloud/images/sqlconsole/creating-a-query.png) + +### クエリの実行 + +クエリを実行するには、SQLエディタにSQLコマンドを入力して「実行」ボタンをクリックするか、ショートカット `cmd / ctrl + enter` を使用します。複数のコマンドを順次書き、実行するには、各コマンドの後にセミコロンを追加する必要があります。 + +クエリ実行オプション +デフォルトでは、「実行」ボタンをクリックするとSQLエディタに含まれるすべてのコマンドが実行されます。SQLコンソールは他に2つのクエリ実行オプションをサポートしています: +* 選択したコマンドを実行 +* カーソル位置のコマンドを実行 + +選択したコマンドを実行するには、目的のコマンドまたはコマンドシーケンスをハイライトし、「実行」ボタンをクリックする(または `cmd / ctrl + enter` ショートカットを使用する)。選択が存在する場合、SQLエディタのコンテキストメニュー(エディタ内の任意の場所を右クリックして開く)から「選択したものを実行」を選択することもできます。 + + ![選択したクエリを実行](@site/docs/ja/cloud/images/sqlconsole/run-selected-query.png) + +現在のカーソル位置のコマンドを実行するには、以下の2つの方法があります: +* 拡張実行オプションメニューから「カーソルで」を選択する(または対応する `cmd / ctrl + shift + enter` キーボードショートカットを使用する + + ![カーソルでの実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png) + + * SQLエディタのコンテキストメニューから「カーソルで実行」を選択する + + ![カーソルでの実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor.png) + +:::note +カーソル位置にあるコマンドは、実行時に黄色で点滅します。 +::: + +### クエリのキャンセル + +クエリを実行中に、クエリエディタのツールバーの「実行」ボタンが「キャンセル」ボタンに置き換わります。このボタンをクリックするか、`Esc` を押してクエリをキャンセルします。注意:キャンセル後もすでに返された結果は保持されます。 + + ![クエリをキャンセル](@site/docs/ja/cloud/images/sqlconsole/cancel-a-query.png) + +### クエリの保存 + +クエリを保存することで、後から簡単に見つけたり、チームメンバーと共有したりすることができます。SQLコンソールではクエリをフォルダに整理することもできます。 + +クエリを保存するには、ツールバーの「実行」ボタンの右にある「保存」ボタンをクリックし、目的の名前を入力して「クエリを保存」をクリックします。 + +:::note +ショートカット `cmd / ctrl + s` を使用することでも、現在のクエリタブでの作業は保存されます。 +::: + +![クエリを保存](../images/sql-console-save-query.png) + +また、「無題のクエリ」をクリックして名前を設定し、Enterキーを押すことで、クエリの同時命名と保存を行うこともできます: + +![クエリをリネーム](../images/sql-console-rename.png) + +### クエリの共有 + +SQLコンソールは、クエリをチームメンバーと簡単に共有することができます。SQLコンソールは4つのアクセスレベルをサポートしており、これらはグローバルにも個別のユーザーごとにも調整可能です: + +- 所有者(共有オプションを調整可能) +- 書き込みアクセス +- 読み取り専用アクセス +- アクセスなし + +クエリを保存した後、ツールバーの「共有」ボタンをクリックします。共有オプションが表示されるモーダルが表示されます: + +![クエリを共有](../images/sql-console-share.png) + +サービスにアクセス可能なすべての組織メンバーのクエリアクセスを調整するには、トップラインのアクセスレベルセレクタを調整します: + +![アクセスを編集](../images/sql-console-edit-access.png) + +上記を適用すると、SQLコンソールへのアクセスを持つすべてのチームメンバーはクエリを表示(および実行)できるようになります。 + +特定のメンバーのクエリアクセスを調整するには、「チームメンバーを追加」セレクターから目的のチームメンバーを選択します: + +![チームメンバーを追加](../images/sql-console-add-team.png) + +チームメンバーを選択すると、アクセスレベルセレクターが表示された新しいラインアイテムが出現します: + +![チームメンバーのアクセスを編集](../images/sql-console-edit-member.png) + +### 共有されたクエリにアクセスする + +クエリが共有された場合、それはSQLコンソール左サイドバーの「クエリ」タブに表示されます: + +![クエリにアクセス](../images/sql-console-access-queries.png) + +### クエリへのリンク(パーマリンク) + +保存されたクエリはパーマリンクされており、共有されたクエリへのリンクを送信および受信し、直接開くことができます。 + +クエリにある可能性がある任意のパラメーターの値は、保存されたクエリURLにクエリパラメータとして自動的に追加されます。たとえば、クエリに `{start_date: Date}` と `{end_date: Date}` パラメーターが含まれる場合、パーマリンクは次のようになります:`https://console.clickhouse.cloud/services/:serviceId/console/query/:queryId?param_start_date=2015-01-01¶m_end_date=2016-01-01`。 + +## 高度なクエリ機能 + +### クエリ結果を検索する + +クエリが実行された後、結果ペインの検索入力を使用して返された結果セットを素早く検索できます。この機能は、追加の `WHERE` 句の結果をプレビューしたり、特定のデータが結果セットに含まれていることを確認したりするのに役立ちます。検索入力に値を入力した後、結果ペインが更新され、入力した値に一致するエントリを含むレコードが返されます。この例では、ClickHouseリポジトリの `github_events` テーブルで `alexey-milovidov` のすべてのインスタンスを探します: + + ![GitHubデータを検索](@site/docs/ja/cloud/images/sqlconsole/search-github.png) + +注意:入力した値に一致するフィールドはすべて返されます。たとえば、上記のスクリーンショットの3番目のレコードは、`actor_login` フィールドで「alexey-milovidov」と一致しませんが、`body` フィールドで一致します: + + ![ボディでの一致](@site/docs/ja/cloud/images/sqlconsole/match-in-body.png) + +### ページネーション設定の調整 + +デフォルトでは、クエリ結果ペインはすべての結果レコードを単一のページに表示します。より大きな結果セットのためには、結果をページネーションで表示する方が見やすい場合があります。これは、結果ペインの右下隅にあるページネーションセレクターを使用することで可能です: + ![ページネーションオプション](@site/docs/ja/cloud/images/sqlconsole/pagination.png) + +ページサイズを選択すると、すぐに結果セットにページネーションが適用され、ナビゲーションオプションが結果ペインフッターの中央に表示されます。 + + ![ページネーションナビゲーション](@site/docs/ja/cloud/images/sqlconsole/pagination-nav.png) + +### クエリ結果データのエクスポート + +クエリ結果セットは、SQLコンソールから直接CSV形式で簡単にエクスポートできます。そのためには、結果ペインツールバーの右側にある `•••` メニューを開き、「CSVとしてダウンロード」を選択します。 + + ![CSVとしてダウンロード](@site/docs/ja/cloud/images/sqlconsole/download-as-csv.png) + +## クエリデータのビジュアライゼーション + +データは、チャート形式で表示するとより容易に解釈できることがあります。SQLコンソールからクエリ結果データを使用してビジュアライゼーションを数クリックで迅速に作成できます。例として、NYCタクシーの週ごとの統計を計算するクエリを使用します: + +```sql +select + toStartOfWeek(pickup_datetime) as week, + sum(total_amount) as fare_total, + sum(trip_distance) as distance_total, + count(*) as trip_total +from + nyc_taxi +group by + 1 +order by + 1 asc +``` + + ![タブ形式のクエリ結果](@site/docs/ja/cloud/images/sqlconsole/tabular-query-results.png) + +ビジュアライゼーションがないと、これらの結果は解釈が難しいです。それらをチャートに変換しましょう。 + +### チャートの作成 + +ビジュアライゼーションの作成を開始するには、クエリ結果ペインツールバーから「チャート」オプションを選択します。チャート設定ペインが表示されます: + + ![クエリからチャートに切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png) + +まず、`week` で `trip_total` を追跡する単純な棒グラフを作成します。これを達成するために、`week` フィールドをx軸に、`trip_total` フィールドをy軸にドラッグします: + + ![週ごとのトリップ総数](@site/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png) + +ほとんどのチャートタイプは、数値軸に複数のフィールドをサポートしています。実演のために、`fare_total` フィールドをy軸にドラッグします: + + ![棒グラフ](@site/docs/ja/cloud/images/sqlconsole/bar-chart.png) + +### チャートのカスタマイズ + +SQLコンソールは10種類のチャートタイプをサポートしており、チャート設定ペインのチャートタイプセレクターから選択できます。たとえば、前述の棒グラフからエリアチャートに簡単にタイプを変更できます: + + ![棒グラフからエリアに変更](@site/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png) + +チャートのタイトルは、データを供給するクエリの名前に一致します。クエリの名前を更新すると、チャートのタイトルも更新されます: + + ![クエリ名の更新](@site/docs/ja/cloud/images/sqlconsole/update-query-name.png) + +より高度なチャートの特性を、チャート設定ペインの「高度な設定」セクションで調整することもできます。まず、次の設定を調整します: +- サブタイトル +- 軸タイトル +- x軸のラベルの向き + +これにより、チャートが以下のように更新されます: + + ![サブタイトルなどの更新](@site/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png) + +いくつかのシナリオでは、各フィールドの軸スケールを独立して調整する必要があるかもしれません。これは、チャート設定ペインの「高度な設定」セクションで軸範囲の最小値と最大値を指定することでも可能です。たとえば、上記のチャートは見栄えが良いですが、`trip_total` と `fare_total` フィールドの相関関係を示すために、軸範囲の調整が必要です: + + ![軸スケールを調整](@site/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png) diff --git a/docs/ja/guides/_category_.yml b/docs/ja/guides/_category_.yml new file mode 100644 index 00000000000..5c42e1659b1 --- /dev/null +++ b/docs/ja/guides/_category_.yml @@ -0,0 +1,7 @@ +position: 10 +label: 'User Guides' +collapsible: true +collapsed: true +link: + type: generated-index + title: User Guides \ No newline at end of file diff --git a/docs/ja/guides/best-practices/_category_.yml b/docs/ja/guides/best-practices/_category_.yml new file mode 100644 index 00000000000..92e91f1a2b1 --- /dev/null +++ b/docs/ja/guides/best-practices/_category_.yml @@ -0,0 +1,7 @@ +label: 'Best Practices' +collapsible: true +collapsed: true +link: + type: generated-index + title: Best Practices + slug: /ja/optimize diff --git a/docs/ja/guides/best-practices/asyncinserts.md b/docs/ja/guides/best-practices/asyncinserts.md new file mode 100644 index 00000000000..c496e0a2d37 --- /dev/null +++ b/docs/ja/guides/best-practices/asyncinserts.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/asynchronous-inserts +sidebar_label: 非同期挿入 +title: 非同期挿入 (async_insert) +description: データのバッチ処理の代替として非同期挿入を使用します。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/asyncinserts.md'; + + diff --git a/docs/ja/guides/best-practices/avoidmutations.md b/docs/ja/guides/best-practices/avoidmutations.md new file mode 100644 index 00000000000..75bcc5f7c6d --- /dev/null +++ b/docs/ja/guides/best-practices/avoidmutations.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/avoid-mutations +sidebar_label: 変更を避ける +title: 変更を避ける +description: 変更とは、テーブルデータを操作するALTERクエリを指します +--- + +import Content from '@site/docs/ja/cloud/bestpractices/avoidmutations.md'; + + diff --git a/docs/ja/guides/best-practices/avoidnullablecolumns.md b/docs/ja/guides/best-practices/avoidnullablecolumns.md new file mode 100644 index 00000000000..a41db85a1f3 --- /dev/null +++ b/docs/ja/guides/best-practices/avoidnullablecolumns.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/avoid-nullable-columns +sidebar_label: Nullableカラムを避ける +title: Nullableカラムを避ける +description: Nullableカラム (例. Nullable(String)) は、別のUInt8型のカラムを作成します。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/avoidnullablecolumns.md'; + + diff --git a/docs/ja/guides/best-practices/avoidoptimizefinal.md b/docs/ja/guides/best-practices/avoidoptimizefinal.md new file mode 100644 index 00000000000..a1c4b62fe74 --- /dev/null +++ b/docs/ja/guides/best-practices/avoidoptimizefinal.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/avoidoptimizefinal +sidebar_label: Optimize Final を避ける +title: Optimize Final を避ける +description: OPTIMIZE TABLE ... FINAL クエリを使用すると、データパーツの予定外のマージが開始されます。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/avoidoptimizefinal.md'; + + diff --git a/docs/ja/guides/best-practices/bulkinserts.md b/docs/ja/guides/best-practices/bulkinserts.md new file mode 100644 index 00000000000..9bf909f236c --- /dev/null +++ b/docs/ja/guides/best-practices/bulkinserts.md @@ -0,0 +1,10 @@ +--- +slug: /ja/optimize/bulk-inserts +sidebar_label: バルクインサート +title: バルクインサート +description: 各インサートに多くのデータを含む小さな量のインサートを送信することにより、必要な書き込みの数を減らすことができます。 +--- + +import Content from '@site/docs/ja/cloud/bestpractices/bulkinserts.md'; + + diff --git a/docs/ja/guides/best-practices/images/02-ClickHouse_Index_Design.excalidraw b/docs/ja/guides/best-practices/images/02-ClickHouse_Index_Design.excalidraw new file mode 100644 index 00000000000..1821354d0db --- /dev/null +++ b/docs/ja/guides/best-practices/images/02-ClickHouse_Index_Design.excalidraw @@ -0,0 +1,19542 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 3688, + "versionNonce": 1885549462, + "isDeleted": false, + "id": "JujSi_9FMwHGpiseeR6Pq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1203.8431808894738, + "y": 2259.9076998425608, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 307.5088975694446, + "height": 197.04303257761387, + "seed": 510203220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2750, + "versionNonce": 558627018, + "isDeleted": false, + "id": "4v4G5fa8LsgmBY1fV3eB8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1367.3214111138498, + "y": 2312.4838749918317, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 238006100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4194, + "versionNonce": 1680101590, + "isDeleted": false, + "id": "eBqrP7alszLkhR7-HE38l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1672.3728413331926, + "y": 2262.570754923138, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 307.5088975694446, + "height": 197.04303257761387, + "seed": 1875763948, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4458, + "versionNonce": 463884170, + "isDeleted": false, + "id": "IJJBrumtrc4gF7aKrwG5x", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1538.6583488423046, + "y": 2550.4398955481392, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 307.5088975694446, + "height": 197.04303257761387, + "seed": 2097591020, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3255, + "versionNonce": 340772374, + "isDeleted": false, + "id": "IJ67qOmNDRUeCm_VNfIk9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1835.8510715575694, + "y": 2315.1469300724093, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 936967636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700831, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3518, + "versionNonce": 1846005322, + "isDeleted": false, + "id": "MikIyU8HjODp4w-mQISZD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1702.1365790666812, + "y": 2603.01607069741, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 36964076, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700832, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1863, + "versionNonce": 1525433290, + "isDeleted": false, + "id": "KrOLtjXovP7Is50-wbg18", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -557.3339866730645, + "y": 236.12036171209593, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 188284116, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700832, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1445, + "versionNonce": 1271018966, + "isDeleted": false, + "id": "UeB9NWeMGCQXeUe2lCAWU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -542.7033598073182, + "y": 241.54356773500197, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 1527334740, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700832, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2238, + "versionNonce": 154150614, + "isDeleted": false, + "id": "8mYC83f5VvbPLI-yIYBU3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -126.84302469271188, + "y": 233.46108768035958, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 207581676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2177, + "versionNonce": 2120931722, + "isDeleted": false, + "id": "Bht8HpauLhirSeUtcRjy0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -406.64541368082337, + "y": 235.03246827065914, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 1305925588, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2386, + "versionNonce": 359717910, + "isDeleted": false, + "id": "Yv3nLcJhPtttBvVPPlFyy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.264061029748, + "y": 278.51971904240395, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 825754604, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1327, + "versionNonce": 1537939530, + "isDeleted": false, + "id": "SRVgvQb-at-BnHwkjToPM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 278.5444605833959, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 556499156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1393, + "versionNonce": 1516824918, + "isDeleted": false, + "id": "GBWMlsbQ1sujbbrh-8JYd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.4191550403508, + "y": 278.5444605833959, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2045290092, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1152, + "versionNonce": 200638218, + "isDeleted": false, + "id": "H1xyPIEbOagl1G_DSe72g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.17546551877626, + "y": 279.88635938517615, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1932281428, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1247, + "versionNonce": 2076511690, + "isDeleted": false, + "id": "b1vRTMQiTxXSto2OcOcPK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -313.8086570057543, + "y": 242.05538220263549, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 603478996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1374, + "versionNonce": 1496517590, + "isDeleted": false, + "id": "V9QJgTEebJECbyDcq-jTB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -109.27665599496709, + "y": 242.19861136930336, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 2066414444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 1519, + "versionNonce": 1345635466, + "isDeleted": false, + "id": "KhmuFmBQHujMa8ZL0LLr4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -617.2890876251264, + "y": 280.8859916716468, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1571144020, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1607, + "versionNonce": 231678230, + "isDeleted": false, + "id": "-o7rDZdth2Kl2tp81M-t0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -500.3967708021288, + "y": 352.0904546111291, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 160476652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1739, + "versionNonce": 1392485194, + "isDeleted": false, + "id": "URpkC6epTPHue-Gy4AMzq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -500.3967708021288, + "y": 365.87028415658494, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 394950356, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1748, + "versionNonce": 414617174, + "isDeleted": false, + "id": "yukRr3dksYWcx0rCE0cGY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -500.3967708021288, + "y": 379.0397553104307, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1436291180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1605, + "versionNonce": 1585490442, + "isDeleted": false, + "id": "EULzLCZ_8TlBk-8gEuLA-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.25817566351316, + "y": 350.8605638678378, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1849457748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1721, + "versionNonce": 1186878358, + "isDeleted": false, + "id": "iMYzXSO9YDT88kwz4NF45", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -282.971243845333, + "y": 364.64039341329186, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2132222700, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1730, + "versionNonce": 1236457674, + "isDeleted": false, + "id": "ilT3qpQslCI41RVgsuW0j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -282.94630394148544, + "y": 377.8098645671376, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2073154004, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1651, + "versionNonce": 35352790, + "isDeleted": false, + "id": "Tvi68Js3tnAwYJ22qRX9s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.55856101636357, + "y": 350.9095695496558, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 478930284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1767, + "versionNonce": 1412509578, + "isDeleted": false, + "id": "FRBfSbIIMAV6kMeyQUJRU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.271629198181586, + "y": 364.6893990951099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 782268244, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1776, + "versionNonce": 644015638, + "isDeleted": false, + "id": "5_zWdXezblXxt56bdia25", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.24668929433403, + "y": 377.8588702489556, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1665423340, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2321, + "versionNonce": 1596086358, + "isDeleted": false, + "id": "LA3nFky31RVfhRBcslVH4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -505.3967708021288, + "y": 575.1456375869698, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 292807788, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2496, + "versionNonce": 1561231370, + "isDeleted": false, + "id": "j28_69JFnGAJAoQGcK6b-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.0912377566881, + "y": 310.7438026230182, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 1534847060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1478, + "versionNonce": 555802006, + "isDeleted": false, + "id": "ySEupHwfgAbGF3hAZ7Cai", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 310.69410644246267, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 416577260, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1541, + "versionNonce": 605417162, + "isDeleted": false, + "id": "ji68W23umOuZksmvJ0KmV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.0954782201794, + "y": 310.69410644246267, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1711521236, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1305, + "versionNonce": 1134344918, + "isDeleted": false, + "id": "123Pg3w3GTv_keglZ0AT4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.85178869860488, + "y": 310.78079495324994, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 998160748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1665, + "versionNonce": 1572963722, + "isDeleted": false, + "id": "drH7Kr3YWRju0ofIRqQ98", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -616.965410804955, + "y": 312.9795218393964, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 1274340180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3273, + "versionNonce": 2099965974, + "isDeleted": false, + "id": "sChxNs_gAXJI6YFism3yU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.9875910027811, + "y": 343.24660435953115, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 1153215468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2297, + "versionNonce": 1934378058, + "isDeleted": false, + "id": "tfCJnX3i0ttIwwjeH5kvA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 343.3180019289756, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1940216020, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2365, + "versionNonce": 1774222678, + "isDeleted": false, + "id": "OsaSuhVYPHcwx0Hcpk8Du", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -399.9088502858591, + "y": 343.3180019289756, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 110644844, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2108, + "versionNonce": 1855007498, + "isDeleted": false, + "id": "JCZ6eR_oN-M_nMan445MD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.66516076428456, + "y": 343.4046904397629, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 145432148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2487, + "versionNonce": 1588748950, + "isDeleted": false, + "id": "SFaRmSxjQRRA6otLU6Ibq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -617.7787828706347, + "y": 345.6749390456788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 31170796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3018, + "versionNonce": 1789579082, + "isDeleted": false, + "id": "izleLozEH60YtPZ0_4lRz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.4999757505483, + "y": 406.8097365897543, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 1381519060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2114, + "versionNonce": 94642774, + "isDeleted": false, + "id": "JsOCpO-jnibFs1OcqeVh4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 406.85181624738294, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1496823916, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2182, + "versionNonce": 803624458, + "isDeleted": false, + "id": "ijXUuHYP037tzyeFDiwST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.1971214931342, + "y": 406.85181624738294, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1099912276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 1930, + "versionNonce": 1759078294, + "isDeleted": false, + "id": "A-8nDx9IIO_12ny9wwj4F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.95343197155967, + "y": 406.9385047581702, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1627245292, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2293, + "versionNonce": 964887754, + "isDeleted": false, + "id": "zq8k4l8VeCN8x0fpZneZx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -645.0670540779098, + "y": 408.9974807923321, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 248097236, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3129, + "versionNonce": 1471415510, + "isDeleted": false, + "id": "zYq9Uzws3j3rR4Dlaa-Wq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.9383902085276, + "y": 438.4908009328081, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 1532857708, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2216, + "versionNonce": 823909258, + "isDeleted": false, + "id": "RB7PbAouTLqMord5vTy4o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 438.6393928731747, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1025331028, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2283, + "versionNonce": 1674115606, + "isDeleted": false, + "id": "9Sx86LDkpEBi9-tAE1OYH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.46343458466583, + "y": 438.6393928731747, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 698417132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2032, + "versionNonce": 1424742986, + "isDeleted": false, + "id": "Q1hVICdpxjpA-TpY3mT7q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.2197450630913, + "y": 438.72608138396197, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2095072468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2383, + "versionNonce": 604850006, + "isDeleted": false, + "id": "Y6sQUv6HzTPY_Znc-pe_C", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -646.3333671694432, + "y": 441.1230963910306, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 1943151212, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3343, + "versionNonce": 1674445066, + "isDeleted": false, + "id": "pSdVkx-JCZCbW2AaCn6b2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.5041391910064, + "y": 472.0585767803765, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 61377108, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2360, + "versionNonce": 148237462, + "isDeleted": false, + "id": "TzpGxKfIKXri2vQMeRpjG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 471.2731522084487, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1354429676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2431, + "versionNonce": 155013066, + "isDeleted": false, + "id": "x4cGtDtaJvmdED8em0Pw5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.13975776449445, + "y": 471.2731522084487, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1682710484, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4200, + "versionNonce": 1230292618, + "isDeleted": false, + "id": "zozpqYhRkzeeMU0ikG6eP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.1173989820096, + "y": 504.35506380067744, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 1726022996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3188, + "versionNonce": 942161686, + "isDeleted": false, + "id": "JbuAVVyndg8-5g8_NCWpn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -519.3967708021288, + "y": 504.0210574467409, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 932948460, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3255, + "versionNonce": 1825531210, + "isDeleted": false, + "id": "pT7Typ6370QAD38T3X6eS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -399.95312983017504, + "y": 504.0210574467409, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1623014100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3000, + "versionNonce": 373025878, + "isDeleted": false, + "id": "vQ3inejchrSeZ2AWeZWIu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.7094403086005, + "y": 504.10774595752815, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 15174764, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 1973, + "versionNonce": 1829252106, + "isDeleted": false, + "id": "fZv6GHb4VbpNcPwdkTyMp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 512.7602890221027, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 209109076, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2093, + "versionNonce": 1743253910, + "isDeleted": false, + "id": "hx-SuBqjgW3C9Or-bL6AX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 526.5401185675586, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 731061996, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2102, + "versionNonce": 1610226378, + "isDeleted": false, + "id": "DpMdJ4dmyx09dYrnJvqA1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 539.7095897214043, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1642304980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700845, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1976, + "versionNonce": 1214336726, + "isDeleted": false, + "id": "DeROn1uuPG85tiF18TBW1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.29863196989163, + "y": 511.53039827881145, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1344823660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2092, + "versionNonce": 1681928586, + "isDeleted": false, + "id": "9KMNsFmrs22g01qbUz1ta", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.01170015171147, + "y": 525.3102278242654, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1847180116, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2101, + "versionNonce": 607978518, + "isDeleted": false, + "id": "6hcOgqYZE3lUomd17T6nW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -282.9867602478639, + "y": 538.4796989781113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1710314476, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2022, + "versionNonce": 219508810, + "isDeleted": false, + "id": "YCNqiMxfjALt9EreZ-yKK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.59901732274204, + "y": 511.57940396062946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 728707284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2138, + "versionNonce": 225448278, + "isDeleted": false, + "id": "OXfozcWoiqhSGKCU1Hmg0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.31208550456006, + "y": 525.3592335060835, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1794635372, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2147, + "versionNonce": 1314182922, + "isDeleted": false, + "id": "l6-hMAr309y50JC_EkVt-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.287145600712506, + "y": 538.5287046599293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1501165140, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3442, + "versionNonce": 1908999754, + "isDeleted": false, + "id": "fbKOtlBZosE_Epj0LGU1J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.3536609985991, + "y": 566.8484278789748, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 1800543444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2486, + "versionNonce": 803789654, + "isDeleted": false, + "id": "VPqBPUxprXiingIFf8JDQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -529.3967708021288, + "y": 567.1453752050109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 1074383468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2556, + "versionNonce": 1143319818, + "isDeleted": false, + "id": "dTHxGLWOgqk17Hx3UwT3y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.2375777995136, + "y": 567.1453752050109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1981768276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2301, + "versionNonce": 1008664726, + "isDeleted": false, + "id": "uC0mwB22cKgjWOSevLyo-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.99388827793905, + "y": 567.2320637157982, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 129866988, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2643, + "versionNonce": 1505721290, + "isDeleted": false, + "id": "_mqoVPE9JSTzREp5T8dG9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -657.1075103842874, + "y": 569.6673152033059, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 304609236, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 2500, + "versionNonce": 1088323030, + "isDeleted": false, + "id": "8EtD87pVLZb0pKqInpBFc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -505.3967708021288, + "y": 593.9195813138276, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2119376748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2684, + "versionNonce": 548500106, + "isDeleted": false, + "id": "fIMxIOQ3E11BdKz_KPav9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -505.3967708021288, + "y": 612.6940606892772, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 461495636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2565, + "versionNonce": 322720534, + "isDeleted": false, + "id": "cwja6HbJzF6dcjGqa-A_C", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -285.50335408198544, + "y": 575.2323587542312, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1007964652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2742, + "versionNonce": 196514122, + "isDeleted": false, + "id": "a7Al4JRo8KwkgN0MT2RC6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -285.14285216735834, + "y": 594.0063024810895, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2072187604, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2926, + "versionNonce": 497909846, + "isDeleted": false, + "id": "t1ep_LukFQOJz9MXnq8NV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -285.22308047687284, + "y": 612.7807818565386, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1074476140, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2628, + "versionNonce": 2116671498, + "isDeleted": false, + "id": "6dpUWsXiT3CRU9-ItI3D-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -47.032550987864056, + "y": 575.2076191708977, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 12687444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2805, + "versionNonce": 872875414, + "isDeleted": false, + "id": "HFN_vKhbDdt1tBcH00Zoo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -46.67204907323696, + "y": 593.981562897756, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 402769644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2989, + "versionNonce": 939935434, + "isDeleted": false, + "id": "F3Qobhx90sdkVSapPLJMG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -46.75227738275146, + "y": 612.7560422732051, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 924020180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3812, + "versionNonce": 1736303318, + "isDeleted": false, + "id": "NYj9aBqmdnd0QkM5t1PRh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -562.3729087027565, + "y": 662.9696997320676, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 142739820, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2747, + "versionNonce": 1105649034, + "isDeleted": false, + "id": "haU1kCbuW9_yKTt7njxao", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 662.7064140116544, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1066308436, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2815, + "versionNonce": 1520900118, + "isDeleted": false, + "id": "iOO-ri_0EZbneLndaR4kx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.58428023053386, + "y": 662.7064140116544, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 886438892, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2560, + "versionNonce": 1493605450, + "isDeleted": false, + "id": "3coSLb6snj1VyI5z2Ia0s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.34059070895933, + "y": 662.7931025224416, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 680069332, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 2872, + "versionNonce": 360162646, + "isDeleted": false, + "id": "Isl5zcmy3QLTxg7Jallf0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -688.4542128153113, + "y": 664.4630077725648, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1191681644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 3821, + "versionNonce": 1530954506, + "isDeleted": false, + "id": "FgGIPYssRtFfTkRMcC8jg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.5398085980914, + "y": 695.1366236269752, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 1167642196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2891, + "versionNonce": 1497664150, + "isDeleted": false, + "id": "El7_MD7l_3Rz2hy94pvfT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 694.8011592721494, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 400617708, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2968, + "versionNonce": 856658378, + "isDeleted": false, + "id": "izUvnLeMtdeHiI-B7FdlQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.2606034103625, + "y": 694.8011592721494, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 127132628, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2706, + "versionNonce": 1958922198, + "isDeleted": false, + "id": "qWWGTTonKNG0ixxengBjq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -123.01691388878794, + "y": 694.8878477829367, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1458303852, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4632, + "versionNonce": 1133430922, + "isDeleted": false, + "id": "5L9of5WhUYZ_2lFeHj6JD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -564.5456420361772, + "y": 727.2901364314722, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 1418742100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3714, + "versionNonce": 403135766, + "isDeleted": false, + "id": "gIRP2yDZc1Vh8WnVtQXMA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 727.2404402509167, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 846374380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3787, + "versionNonce": 1417226058, + "isDeleted": false, + "id": "QbzfI5ZJV6Pyr7GHKnT7Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -400.1726927735215, + "y": 727.2404402509167, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1608777428, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3529, + "versionNonce": 679955030, + "isDeleted": false, + "id": "TSWOv_g9-_zzQjxGLRo_d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -122.83028595446854, + "y": 727.327128761704, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2139031660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2505, + "versionNonce": 2116660746, + "isDeleted": false, + "id": "IHUs8beuhrshsf6LM0eoq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 736.2343500529055, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 35980372, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2621, + "versionNonce": 353865622, + "isDeleted": false, + "id": "G5QE9Mv_aOMeSkAveeLtY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 750.0141795983614, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1641749228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2630, + "versionNonce": 362503370, + "isDeleted": false, + "id": "Al--4u4IeZdZp8gRnyuyd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -501.3967708021288, + "y": 763.1836507522071, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 287922644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2506, + "versionNonce": 703409366, + "isDeleted": false, + "id": "5Qw4nqbMq5pB0ZW7MsKlv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.41947761575875, + "y": 735.0044593096143, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1947262316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2621, + "versionNonce": 409547658, + "isDeleted": false, + "id": "y7DjbHb9TFInBC5YRRJJx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.2192343083659, + "y": 748.697600344281, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 939982676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2630, + "versionNonce": 1688019478, + "isDeleted": false, + "id": "jhWOMEZvMo-zetSTiA70d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -283.19429440451836, + "y": 761.8670714981267, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1869238252, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2552, + "versionNonce": 416166474, + "isDeleted": false, + "id": "kp5LK0_W1jhR0HgWCPYm_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.71986296861098, + "y": 735.0534649914323, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1326707924, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2667, + "versionNonce": 1209823062, + "isDeleted": false, + "id": "W4fLIuwBgqmfKLS5I2C4A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.519619661214506, + "y": 748.746606026099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1408332396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2676, + "versionNonce": 698702090, + "isDeleted": false, + "id": "e45V1H8SOju3H8_-NF20T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -45.49467975736695, + "y": 761.9160771799448, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 870726228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3965, + "versionNonce": 119523402, + "isDeleted": false, + "id": "ZnC7tHpssZlkQgmqBbV0J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -563.5309018875965, + "y": 790.8637445869201, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1257431252, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2643, + "versionNonce": 1373059414, + "isDeleted": false, + "id": "dRsyzG0tTDBmsOlm-CVSh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -557.3967708021288, + "y": 790.7841396070945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 986138220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 2803, + "versionNonce": 1163144970, + "isDeleted": false, + "id": "hQEVfBC20A6tLeLrtnrz-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -399.4173630996046, + "y": 790.7841396070945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 755476052, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2524, + "versionNonce": 210869910, + "isDeleted": false, + "id": "nxWW7ddUB-VhTZ6k3Y-ha", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -121.9637281246728, + "y": 790.7841396070945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1164679404, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 2763, + "versionNonce": 1976417738, + "isDeleted": false, + "id": "73I2nurlCUI2VwgThPYvr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -687.4423437187958, + "y": 792.6451422112608, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1265089492, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700846, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 2763, + "versionNonce": 878635722, + "isDeleted": false, + "id": "fdKBZ7au4Vj_VTNmlJ4Gr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1226.25436119329, + "y": 2312.7902346924393, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 677157356, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4081, + "versionNonce": 533148694, + "isDeleted": false, + "id": "0Ts5CSD3IRrXDLrhNs1q4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1218.1612083608773, + "y": 2322.6710607030027, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.3320451760253, + "height": 20.93344520573327, + "seed": 1832570964, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1731, + "versionNonce": 176570442, + "isDeleted": false, + "id": "fxzfvu7a_64f2hx0KYuJG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1234.893413221989, + "y": 2325.6982559087382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 886574828, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 1964, + "versionNonce": 1913497238, + "isDeleted": false, + "id": "sVCTgV1Z59OdhAzemKrPm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1284.6998679744986, + "y": 2366.1726333954784, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1494862676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2080, + "versionNonce": 1005991370, + "isDeleted": false, + "id": "5roG5Q9aoFAAG4mcy70-q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1284.9867997926806, + "y": 2379.9524629409343, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 918176748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2089, + "versionNonce": 1309172694, + "isDeleted": false, + "id": "8RlyVhOIyCfaOI3NrZA-8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1285.0117396965281, + "y": 2393.12193409478, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1542275284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2177, + "versionNonce": 1073802378, + "isDeleted": false, + "id": "g-m-TZYzjeOuydK8GIFFo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1427.1452214491503, + "y": 2364.8560541414, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 354608748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2293, + "versionNonce": 1849260310, + "isDeleted": false, + "id": "dwI2bk25tX3miPELYgnXl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1427.4321532673305, + "y": 2378.635883686854, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1874200148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2302, + "versionNonce": 1191627594, + "isDeleted": false, + "id": "GcxWQOfFzJPaZMSpY8jYa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1427.457093171178, + "y": 2391.8053548406997, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 324221164, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3329, + "versionNonce": 706078294, + "isDeleted": false, + "id": "yR8U23V91OOx3k7ZBaUn0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1218.6059789310486, + "y": 2354.7248390325167, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 1766464468, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3259, + "versionNonce": 1947205834, + "isDeleted": false, + "id": "Y1uKvcu_fQ1ipQYHr-DKd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1219.5715563357744, + "y": 2414.47266065032, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.40791415998257, + "height": 21.73758959076075, + "seed": 468905452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700853, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2085, + "versionNonce": 853622294, + "isDeleted": false, + "id": "ANkNzPYuy9_BsBmF5gR3K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1304.1605892330197, + "y": 2272.1357878225444, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 109, + "height": 25, + "seed": 2011577428, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.mrk" + }, + { + "type": "text", + "version": 1397, + "versionNonce": 1432999498, + "isDeleted": false, + "id": "NNvdCe6tZ_vz6Z_tnQi20", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1111.9723597745635, + "y": 2417.483954693459, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 233399020, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "KuL0PHE0rSQ-wquK_N1zX", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 1507, + "versionNonce": 1870465878, + "isDeleted": false, + "id": "b4uVaa_f56sO1ESMw0Fqe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1140.9489222745635, + "y": 2325.0280395148866, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 704877012, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "VAVd-jpfcqV8eCE3akPbS", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 1514, + "versionNonce": 455900426, + "isDeleted": false, + "id": "sAsS8YABjrT8epHSPTWeZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.3942347745635, + "y": 2358.2233520148866, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 387327340, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2402, + "versionNonce": 578245386, + "isDeleted": false, + "id": "KDUCZDbXse_FRGUztJgjm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1378.4478062031349, + "y": 2487.5513452564546, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 112, + "height": 80, + "seed": 1198692204, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "9Yi3inzhOmDgl8CzNHG8c", + "type": "arrow" + } + ], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "locations of \ngranules in \ndecompressed \nblock data", + "baseline": 74, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "locations of \ngranules in \ndecompressed \nblock data" + }, + { + "type": "text", + "version": 1895, + "versionNonce": 183263690, + "isDeleted": false, + "id": "f1apoAydNSroVvnSulrwE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1370.5369059055165, + "y": 2322.8962733318504, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1790515820, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700854, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1991, + "versionNonce": 836433878, + "isDeleted": false, + "id": "zT-D3QT33UpfTco9LOGnC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1370.9805333564964, + "y": 2355.417974720738, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 2088036052, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1992, + "versionNonce": 659658890, + "isDeleted": false, + "id": "EPKgp0Rg9M8BZANi_0hg5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1370.8725370329673, + "y": 2414.622937956032, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 60912724, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "9Yi3inzhOmDgl8CzNHG8c", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1833, + "versionNonce": 1654230294, + "isDeleted": false, + "id": "qPOOlO6NgpPAbUkodneif", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1234.975937768261, + "y": 2358.382129132503, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1740502868, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 1846, + "versionNonce": 1466038090, + "isDeleted": false, + "id": "gE8lHM6phGgTWynmC_Kii", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1236.8095774741437, + "y": 2417.4538203089733, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 80754004, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ywAsFjf4WphpubAH3rMk8", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2379, + "versionNonce": 1095989846, + "isDeleted": false, + "id": "jLKzuR8Qsnbedkqd6ubFX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1240.5627665338557, + "y": 2488.401778753716, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 80, + "seed": 1693051092, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ywAsFjf4WphpubAH3rMk8", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "locations of \nblocks in \ncompressed \ncolumn file", + "baseline": 74, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "locations of \nblocks in \ncompressed \ncolumn file" + }, + { + "type": "arrow", + "version": 605, + "versionNonce": 1097686230, + "isDeleted": false, + "id": "ywAsFjf4WphpubAH3rMk8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1285.2502665338557, + "y": 2479.960372503716, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 1.15625, + "height": 36.359375, + "seed": 800950252, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jLKzuR8Qsnbedkqd6ubFX", + "focus": -0.09129231596882527, + "gap": 8.44140625 + }, + "endBinding": { + "elementId": "gE8lHM6phGgTWynmC_Kii", + "focus": 0.08240871417353615, + "gap": 6.147177194742653 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.15625, + -36.359375 + ] + ] + }, + { + "type": "arrow", + "version": 642, + "versionNonce": 2090291734, + "isDeleted": false, + "id": "9Yi3inzhOmDgl8CzNHG8c", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1429.144797783857, + "y": 2482.054122503716, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 1.8125, + "height": 37.75, + "seed": 2088078292, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KDUCZDbXse_FRGUztJgjm", + "focus": -0.053841688355087666, + "gap": 5.497222752738708 + }, + "endBinding": { + "elementId": "EPKgp0Rg9M8BZANi_0hg5", + "focus": 0.07415983734863017, + "gap": 9.681184547684097 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.8125, + -37.75 + ] + ] + }, + { + "type": "text", + "version": 2044, + "versionNonce": 953090634, + "isDeleted": false, + "id": "BDZXPQPNfobP6Y1LAJpE-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 961.8791727838568, + "y": 2290.826583441216, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1778324948, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "VAVd-jpfcqV8eCE3akPbS", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "location of \ngranule 0", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "location of \ngranule 0" + }, + { + "type": "text", + "version": 2104, + "versionNonce": 1095802710, + "isDeleted": false, + "id": "ZL-_7v_-1qmBR8x-OIALx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 962.5735087213568, + "y": 2357.472091253716, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 86, + "height": 40, + "seed": 1716250836, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "location of\ngranule 1", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "location of\ngranule 1" + }, + { + "type": "text", + "version": 2119, + "versionNonce": 822880522, + "isDeleted": false, + "id": "kdg1HDiQaDiOfK4DmsKb4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 957.4231180963568, + "y": 2429.444747503716, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 40, + "seed": 753034860, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "KuL0PHE0rSQ-wquK_N1zX", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "location of \ngranule 1082", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "location of \ngranule 1082" + }, + { + "type": "arrow", + "version": 574, + "versionNonce": 1408124054, + "isDeleted": false, + "id": "VAVd-jpfcqV8eCE3akPbS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1063.2444071588568, + "y": 2309.8069950027675, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 76.0693359375, + "height": 21.84099656669332, + "seed": 1565253844, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "BDZXPQPNfobP6Y1LAJpE-", + "focus": -0.49646516033010085, + "gap": 7.365234375 + }, + "endBinding": { + "elementId": "b4uVaa_f56sO1ESMw0Fqe", + "focus": -0.28431140681285944, + "gap": 1.6351791782067266 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 76.0693359375, + 21.84099656669332 + ] + ] + }, + { + "type": "arrow", + "version": 496, + "versionNonce": 1551267786, + "isDeleted": false, + "id": "6gkr09UfyYbzjuh6y6WGW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1057.0920634088568, + "y": 2374.6900936406937, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 79.6728515625, + "height": 7.038138873516118, + "seed": 1989969132, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ZL-_7v_-1qmBR8x-OIALx", + "focus": 0.07433430851635363, + "gap": 8.5185546875 + }, + "endBinding": { + "elementId": "sAsS8YABjrT8epHSPTWeZ", + "focus": 0.2730369878904534, + "gap": 6.629319803206727 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 79.6728515625, + -7.038138873516118 + ] + ] + }, + { + "type": "arrow", + "version": 520, + "versionNonce": 639975894, + "isDeleted": false, + "id": "KuL0PHE0rSQ-wquK_N1zX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1062.0822977838568, + "y": 2448.316108846946, + "strokeColor": "#000000", + "backgroundColor": "#15223c", + "width": 45.2099609375, + "height": 17.944919312151114, + "seed": 623537260, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kdg1HDiQaDiOfK4DmsKb4", + "focus": 0.4938361234900873, + "gap": 1.6591796875 + }, + "endBinding": { + "elementId": "NNvdCe6tZ_vz6Z_tnQi20", + "focus": 0.5864545974028658, + "gap": 4.680101053206727 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 45.2099609375, + -17.944919312151114 + ] + ] + }, + { + "type": "rectangle", + "version": 3269, + "versionNonce": 724102794, + "isDeleted": false, + "id": "moibOvP6fFX4zdVL20rM-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1694.7840216370093, + "y": 2315.453289773017, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 648483284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4586, + "versionNonce": 722114326, + "isDeleted": false, + "id": "g92zEEZnwdPvo_P_-md5F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1686.6908688045967, + "y": 2325.3341157835803, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.3320451760253, + "height": 20.93344520573327, + "seed": 1214948716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2236, + "versionNonce": 1373539658, + "isDeleted": false, + "id": "cKaF5cHMfO-LulnkBmt2Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1703.423073665708, + "y": 2328.361310989316, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1158526804, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2469, + "versionNonce": 722682966, + "isDeleted": false, + "id": "AjuUpQuP3SqjoJPuKbYAw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1753.229528418218, + "y": 2368.835688476056, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 625678316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2585, + "versionNonce": 905073674, + "isDeleted": false, + "id": "Somfi5AGJX6HJu3bfi9Pt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1753.5164602364, + "y": 2382.615518021512, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2055449812, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2594, + "versionNonce": 403982742, + "isDeleted": false, + "id": "SvxSIHuh65r3mvLJkaD6J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1753.5414001402476, + "y": 2395.7849891753576, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 578370156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2682, + "versionNonce": 1499415242, + "isDeleted": false, + "id": "cjQ4gA8-X4lRtYOwtv4cG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1895.67488189287, + "y": 2367.5191092219775, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1218376276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2798, + "versionNonce": 1631758038, + "isDeleted": false, + "id": "PHG97rTLYCp7k2dLcA6rQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1895.9618137110501, + "y": 2381.2989387674315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1254034668, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2807, + "versionNonce": 1187010954, + "isDeleted": false, + "id": "5nujjwIfxJVHvTBivkCnt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1895.9867536148977, + "y": 2394.4684099212773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 238389204, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3834, + "versionNonce": 1194548246, + "isDeleted": false, + "id": "1Q_axHfCOBS1GjaHQCs2i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1687.135639374768, + "y": 2357.3878941130943, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 1067880300, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3765, + "versionNonce": 2102433866, + "isDeleted": false, + "id": "cBo0Wx5inLHFRPfMjwfzb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1688.1012167794931, + "y": 2417.1357157308976, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.40791415998257, + "height": 21.73758959076075, + "seed": 1599958356, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2613, + "versionNonce": 802908502, + "isDeleted": false, + "id": "JIY9Hq_-m2I6qkbYp1Wy9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1786.6902496767389, + "y": 2274.798842903122, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 78, + "height": 25, + "seed": 1635369452, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "ULR.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ULR.mrk" + }, + { + "type": "text", + "version": 1903, + "versionNonce": 1558904586, + "isDeleted": false, + "id": "692pq1q3--XyG8ad3v2EM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1580.5020202182827, + "y": 2420.1470097740366, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 1567400660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2013, + "versionNonce": 2056244886, + "isDeleted": false, + "id": "7_0oMsXxAqKxXzPyrseDf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1609.4785827182827, + "y": 2327.691094595464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 2000856172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2020, + "versionNonce": 302681546, + "isDeleted": false, + "id": "3jcOzdCSifcUTDoTcHBp9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1611.9238952182827, + "y": 2360.886407095464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 251209812, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2400, + "versionNonce": 30033034, + "isDeleted": false, + "id": "onyXlikavkJekRt1K3Uz2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1839.0665663492355, + "y": 2325.559328412428, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 211646828, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2496, + "versionNonce": 173121814, + "isDeleted": false, + "id": "J12iAWfevSlm-X53PwCsU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1839.5101938002153, + "y": 2358.0810298013157, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 824320852, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2498, + "versionNonce": 904209226, + "isDeleted": false, + "id": "H0Aojn7Cbid8n-zJl7wuz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1839.4021974766865, + "y": 2417.2859930366094, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 67333100, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2338, + "versionNonce": 1625886294, + "isDeleted": false, + "id": "FTl5JDMlzhHwP6SFf5gFL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1703.50559821198, + "y": 2361.0451842130806, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1093310676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2352, + "versionNonce": 1219897866, + "isDeleted": false, + "id": "cciu-Eq8n1zaIXfNLDuy_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.3392379178629, + "y": 2420.116875389551, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 788991596, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "rectangle", + "version": 3533, + "versionNonce": 1165743574, + "isDeleted": false, + "id": "kDp1vUzo53V2bnJFP5m6f", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1561.0695291461213, + "y": 2603.322430398018, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 1109606868, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4849, + "versionNonce": 1094032010, + "isDeleted": false, + "id": "EfmM2TO1h8pHboiroHkzx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1552.9763763137087, + "y": 2613.203256408581, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.3320451760253, + "height": 20.93344520573327, + "seed": 1443460460, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2499, + "versionNonce": 1248766742, + "isDeleted": false, + "id": "7sTy4KJa5r6AG57VMjMJH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1569.70858117482, + "y": 2616.2304516143167, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 25421652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2732, + "versionNonce": 1500887370, + "isDeleted": false, + "id": "5BVCBYipLqCGV4KwURJLl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1619.51503592733, + "y": 2656.704829101057, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 915400684, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2848, + "versionNonce": 1825888342, + "isDeleted": false, + "id": "DCe58NiaSdoX4SxL1P4w9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1619.801967745512, + "y": 2670.484658646513, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 682876116, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2857, + "versionNonce": 432275466, + "isDeleted": false, + "id": "wOx6B4E19tLezqgf4ifcZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1619.8269076493596, + "y": 2683.6541298003585, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1386482284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2945, + "versionNonce": 1417895318, + "isDeleted": false, + "id": "nq3gFFNtxlsTWAA1crsjv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1761.9603894019817, + "y": 2655.3882498469784, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 558441044, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3061, + "versionNonce": 773549770, + "isDeleted": false, + "id": "Xruoa6-io7ONSRS7gAn6u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1762.247321220162, + "y": 2669.1680793924324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1292885228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3070, + "versionNonce": 1722759894, + "isDeleted": false, + "id": "1jCJgvbE4dpIUWUmvcyJO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1762.2722611240094, + "y": 2682.337550546278, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 840546260, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4097, + "versionNonce": 186058122, + "isDeleted": false, + "id": "lp3VUJp0FzXRqPPVLe9oK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1553.42114688388, + "y": 2645.257034738095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 1599954796, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4029, + "versionNonce": 434991126, + "isDeleted": false, + "id": "Y3Hv1leLPB9ftKYg2JQoC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1554.3867242886051, + "y": 2705.0048563558994, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 279.40791415998257, + "height": 21.73758959076075, + "seed": 1463524692, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2925, + "versionNonce": 1509016650, + "isDeleted": false, + "id": "U_YNezHPtlhhytJHsUkRS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1622.9757571858506, + "y": 2562.667983528123, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 137, + "height": 25, + "seed": 30839276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.mrk" + }, + { + "type": "text", + "version": 2167, + "versionNonce": 1244855638, + "isDeleted": false, + "id": "q2y_BWoYnHnQT1YoF6rRc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1446.7875277273945, + "y": 2708.0161503990385, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 436523732, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2277, + "versionNonce": 1686547210, + "isDeleted": false, + "id": "kxJbHQHgV7VjPN4DOvHgb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1475.7640902273945, + "y": 2615.560235220465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 327513196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2284, + "versionNonce": 215278230, + "isDeleted": false, + "id": "2s7GiUTdLZp2rzJT-zg4h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1478.2094027273945, + "y": 2648.755547720465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 1762351188, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2663, + "versionNonce": 22067658, + "isDeleted": false, + "id": "ArTZN_DLN8dAr1tYATOc6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.3520738583472, + "y": 2613.428469037429, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1881484756, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2759, + "versionNonce": 76029910, + "isDeleted": false, + "id": "NPxsQofyq94BAoH3DuXlu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.7957013093271, + "y": 2645.9501704263166, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1919699308, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2762, + "versionNonce": 2137714826, + "isDeleted": false, + "id": "KUsQT8a6jgoQDMhQnyg9K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1705.6877049857983, + "y": 2705.155133661611, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 1885885268, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 2601, + "versionNonce": 895595798, + "isDeleted": false, + "id": "xucS1SX2Yzdks84pgrya7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1569.791105721092, + "y": 2648.9143248380815, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1735932908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2616, + "versionNonce": 311447370, + "isDeleted": false, + "id": "Ioj3J7QMkVeqdmcKHNf1J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1571.6247454269749, + "y": 2707.9860160145527, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 405457108, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "rectangle", + "version": 3652, + "versionNonce": 1058788874, + "isDeleted": false, + "id": "1nLDuL3RqTev92zDCVP8m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1008.8597484916295, + "y": 1416.3311926854121, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 327.69087921627045, + "seed": 1306112748, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2637, + "versionNonce": 834398102, + "isDeleted": false, + "id": "zq4wPnaPzVb_m1wUKkCjm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1031.1284655601517, + "y": 1469.262670549996, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 256.8020156926412, + "seed": 1543520724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1916, + "versionNonce": 1174963402, + "isDeleted": false, + "id": "nWaENb6CnQyiTWDg9a9hD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1059.6608301829942, + "y": 1474.491105171026, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 343700844, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 2864, + "versionNonce": 1615234262, + "isDeleted": false, + "id": "g-v0LTRlAltrmO3R1gQxs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1179.8936026582955, + "y": 1468.0006805326339, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 257.10693993506436, + "seed": 1472259924, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3628, + "versionNonce": 284253066, + "isDeleted": false, + "id": "4RNpuOxj3Y_EsXnqZTd00", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1023.035312727739, + "y": 1555.069967148795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 782428140, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1804, + "versionNonce": 906721814, + "isDeleted": false, + "id": "bnCToVqZE3jDASSnyxV_5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1044.6637849499616, + "y": 1557.5388286291002, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 793828564, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "737.456.303", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "737.456.303" + }, + { + "type": "text", + "version": 1907, + "versionNonce": 504453706, + "isDeleted": false, + "id": "Z3gSU-HYdw_t21YATxu0B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.9450349499616, + "y": 1557.1716411291002, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1347881580, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://e.mail.yandsearch...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://e.mail.yandsearch..." + }, + { + "type": "text", + "version": 1712, + "versionNonce": 167757654, + "isDeleted": false, + "id": "Pr8x5pVhR1yUB9GUd2kDh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1281.4688444737708, + "y": 1474.9162311278724, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 1279664724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 2183, + "versionNonce": 1816363274, + "isDeleted": false, + "id": "dHaFoPNhZPZw_Gjd-48Ow", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.5739723413603, + "y": 1666.0379920471532, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 476241132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2299, + "versionNonce": 209218710, + "isDeleted": false, + "id": "-C1-I0-w82I75mQBRCwZx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.8609041595423, + "y": 1679.817821592609, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1970714580, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2308, + "versionNonce": 1728237514, + "isDeleted": false, + "id": "U6zYV0O2mB5wGgJsBfewu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.8858440633899, + "y": 1692.9872927464548, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1280335724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2272, + "versionNonce": 455764438, + "isDeleted": false, + "id": "rIuVZJ0YUkG1z2etFf2dh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1302.019325816012, + "y": 1664.7214127930747, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 653827412, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2388, + "versionNonce": 1382696586, + "isDeleted": false, + "id": "gRqDM_KFA3VHJE--9uJxO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1302.3062576341922, + "y": 1678.5012423385288, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1483313644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2397, + "versionNonce": 355122966, + "isDeleted": false, + "id": "JFhKt6LgsMy3pFeENoH23", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1302.3311975380398, + "y": 1691.6707134923745, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1780601556, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3274, + "versionNonce": 926213450, + "isDeleted": false, + "id": "I6vQn5c2MwYmaX-VftQl9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1023.4800832979104, + "y": 1587.7924035665446, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 532182124, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1967, + "versionNonce": 787377238, + "isDeleted": false, + "id": "7hIRlRKfFo3ty2ih84Qgi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1046.229649270133, + "y": 1588.5151712968495, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 763910228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "742.414.531", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "742.414.531" + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1321053194, + "isDeleted": false, + "id": "1hPKYuTkUId6YkuSpyfxg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1185.4065095122896, + "y": 1589.2651712968493, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 268895980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://rabota.ru/yandex ...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://rabota.ru/yandex ..." + }, + { + "type": "text", + "version": 1982, + "versionNonce": 1989521802, + "isDeleted": false, + "id": "nJ-9UjLwPoInnMqmksQ-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.168884776353, + "y": 1424.8306501506904, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 1552628716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 1593, + "versionNonce": 951775306, + "isDeleted": false, + "id": "Vw9m1zH2jyO1i8swYgB9Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 933.7019328914253, + "y": 1557.8933981665618, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1175772780, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 174", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 174" + }, + { + "type": "text", + "version": 1598, + "versionNonce": 2028114262, + "isDeleted": false, + "id": "Rgf2QWPlwJTU_8iG8htEh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 929.2683391414253, + "y": 1591.0887106665618, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 2030014036, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 175", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 175" + }, + { + "type": "rectangle", + "version": 3525, + "versionNonce": 1375995786, + "isDeleted": false, + "id": "dC8hsfcGRr0jcIjv3ibmH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1021.8892189983467, + "y": 1620.9376351795495, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 408662484, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BltJEdlS1EvGPQMbe6C4b", + "type": "arrow" + } + ], + "updated": 1672163700855, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2210, + "versionNonce": 1170837014, + "isDeleted": false, + "id": "vVOWnf9vIGOpZx4RJKQPP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1044.7598787205693, + "y": 1621.6604029098542, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 1909458284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "747.148.242", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "747.148.242" + }, + { + "type": "text", + "version": 2300, + "versionNonce": 2146338378, + "isDeleted": false, + "id": "dvJr3RpPSD41jrVF33-mb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1183.6778474705693, + "y": 1622.4104029098542, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1462654804, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700855, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://fanati-avtomobile...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://fanati-avtomobile..." + }, + { + "type": "text", + "version": 1852, + "versionNonce": 551246678, + "isDeleted": false, + "id": "lxMcju7oD2UblqnUiAf9g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 927.6774748418616, + "y": 1624.2339422795671, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 990148588, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 176", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 176" + }, + { + "type": "rectangle", + "version": 3633, + "versionNonce": 1905995018, + "isDeleted": false, + "id": "xq1Hmll1rth4pLVjjbbdW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1022.9749704864412, + "y": 1654.2083755069298, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 1167634284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2316, + "versionNonce": 1791066262, + "isDeleted": false, + "id": "QjtKD_-C8GCB2RWZJmP16", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1044.703656777351, + "y": 1654.0731166685464, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 18697556, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "751.802.947", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "751.802.947" + }, + { + "type": "text", + "version": 2412, + "versionNonce": 1015348170, + "isDeleted": false, + "id": "E92tV1UsZ7nLG7fSb64ls", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.7635989586638, + "y": 1655.6811432372335, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 606593516, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://image&img_url=htt...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://image&img_url=htt..." + }, + { + "type": "text", + "version": 1959, + "versionNonce": 1999699414, + "isDeleted": false, + "id": "qxI9BByIy3N9yQghVQ32o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 930.7632263299561, + "y": 1657.5046826069474, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 66, + "height": 20, + "seed": 2083554004, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 177", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 177" + }, + { + "type": "text", + "version": 2130, + "versionNonce": 960257418, + "isDeleted": false, + "id": "zkF-yXsWdsHC_jlId5-Qq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1496.4859621281198, + "y": 1620.3001948044835, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 112, + "height": 20, + "seed": 1553655788, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BltJEdlS1EvGPQMbe6C4b", + "type": "arrow" + } + ], + "updated": 1672163700856, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 818, + "versionNonce": 1298765846, + "isDeleted": false, + "id": "BltJEdlS1EvGPQMbe6C4b", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1448.435180878119, + "y": 1628.874413554484, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 43.55859375, + "height": 1.9140625, + "seed": 1635879020, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700856, + "link": null, + "locked": false, + "startBinding": { + "elementId": "dC8hsfcGRr0jcIjv3ibmH", + "focus": -0.6036155620159408, + "gap": 3.6708435085597557 + }, + "endBinding": { + "elementId": "zkF-yXsWdsHC_jlId5-Qq", + "focus": -0.25250806832497674, + "gap": 4.4921875000009095 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 43.55859375, + 1.9140625 + ] + ] + }, + { + "type": "rectangle", + "version": 4392, + "versionNonce": 2097838934, + "isDeleted": false, + "id": "aEhttCUFLsQDizHodrGDT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1008.2711033584119, + "y": 1001.4133599014169, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 253.11610243055577, + "seed": 2101334498, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3341, + "versionNonce": 191761674, + "isDeleted": false, + "id": "QzdbT54E-9in4lHVmuDIN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1030.539820426934, + "y": 1054.4659315160006, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 182.95714962121258, + "seed": 1422406974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2804, + "versionNonce": 873242774, + "isDeleted": false, + "id": "T_Hmeit4TgUlSfzg9HsX-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1059.0721850497766, + "y": 1059.6943661370306, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 1659848098, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3615, + "versionNonce": 1492900810, + "isDeleted": false, + "id": "UJcRC5CuQD3LDBq0mi8sv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1179.304957525078, + "y": 1053.0867539986384, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 183.92223011363598, + "seed": 2060115326, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4470, + "versionNonce": 706223574, + "isDeleted": false, + "id": "7OXC2HtxOCeebeqv5O7_8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1022.4466675945214, + "y": 1094.2732281148, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 301613410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2639, + "versionNonce": 962712202, + "isDeleted": false, + "id": "D0tiBmfqizIVi8Hymauea", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1083.313421066744, + "y": 1097.7668755264176, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1389264318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 2741, + "versionNonce": 1682043670, + "isDeleted": false, + "id": "i7IvaB8aEXlUaOKzYFRgr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.356389816744, + "y": 1096.5168755264176, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1706018082, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3mRchANiENPPmEHMVvXfw", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2600, + "versionNonce": 1868230986, + "isDeleted": false, + "id": "Lvfk1WNKvo2jjpdLWCPpz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1280.8801993405532, + "y": 1060.119492093877, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 1643386366, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 2890, + "versionNonce": 2097094742, + "isDeleted": false, + "id": "Nwb7n8BjXHjw-llru2plk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.9853272081427, + "y": 1138.2412530131578, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2004799714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3006, + "versionNonce": 776091658, + "isDeleted": false, + "id": "EwOEIL9JGNJuxmfcdtBt2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.2722590263247, + "y": 1152.0210825586137, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1631364670, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3015, + "versionNonce": 2015667606, + "isDeleted": false, + "id": "6YDMWeCVkevT5FVObPUtl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1089.2971989301723, + "y": 1165.1905537124594, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1526097058, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2977, + "versionNonce": 101885642, + "isDeleted": false, + "id": "kmpxdL5vWaF6VRXljdMS9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.4306806827944, + "y": 1136.9246737590793, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1099509374, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3093, + "versionNonce": 384271062, + "isDeleted": false, + "id": "kI0xfD-QXOFG94k__NFL_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.7176125009746, + "y": 1150.7045033045333, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1506115682, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3102, + "versionNonce": 1332166026, + "isDeleted": false, + "id": "m281l4J2WMbgJgpW9-2zx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.7425524048222, + "y": 1163.873974458379, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 798666430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4111, + "versionNonce": 735885334, + "isDeleted": false, + "id": "9DUadkYR7DysB7iitCu6y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1022.8914381646928, + "y": 1126.9956645325492, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 800793634, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8oR4MyfX4jHtsAYeNAcq2", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2791, + "versionNonce": 393935946, + "isDeleted": false, + "id": "pNEG1HCjjczUaiuTbH1Iw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1064.7620978869154, + "y": 1127.8604056941667, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 403842814, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2886, + "versionNonce": 1861829974, + "isDeleted": false, + "id": "7vMo12OgAaj9IsJoQNwhU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1184.6800666369154, + "y": 1127.4748320639576, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1187401698, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8oR4MyfX4jHtsAYeNAcq2", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4008, + "versionNonce": 204006154, + "isDeleted": false, + "id": "nfVvmk0hO2Y8W4qCPTrUL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1023.9282471870656, + "y": 1187.1611102312345, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 423.6151751893943, + "height": 21.2642440025254, + "seed": 728799038, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "xJKd2nkOCNIe1_O4_jlZ-", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2950, + "versionNonce": 1368533654, + "isDeleted": false, + "id": "s4SUiIM79KoA37W4gFdAj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1030.7989069092882, + "y": 1188.7938859778333, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1928725410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3056, + "versionNonce": 1743516106, + "isDeleted": false, + "id": "p4x0HvPYaGEL35sA2ubUl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1182.5813020290789, + "y": 1188.068327794209, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1645674366, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2870, + "versionNonce": 1381787606, + "isDeleted": false, + "id": "dcKDiAd1lj1N_tz6EK3JX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1181.5802396431345, + "y": 1010.0339111166952, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 779698018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2286, + "versionNonce": 1574905994, + "isDeleted": false, + "id": "zhDloC-xc295ZOpxr-Uv2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 916.2578190082077, + "y": 1189.5525743111384, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 4612030, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2435, + "versionNonce": 1366097174, + "isDeleted": false, + "id": "SR2C7tH2X59CODMwzflzZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 945.2343815082077, + "y": 1096.9452919450669, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 1436484386, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2441, + "versionNonce": 96307018, + "isDeleted": false, + "id": "Sx8RA8l1PC2zPej-2K5Vv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 947.6796940082077, + "y": 1130.2919716325669, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 438286334, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2228, + "versionNonce": 1681451606, + "isDeleted": false, + "id": "pBvIHclZrN_kpqVXAZHRZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1503.8530413987787, + "y": 1049.2275185075669, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 203, + "height": 40, + "seed": 1658212066, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3mRchANiENPPmEHMVvXfw", + "type": "arrow" + } + ], + "updated": 1672163700868, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 0", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 0" + }, + { + "type": "arrow", + "version": 890, + "versionNonce": 1424134730, + "isDeleted": false, + "id": "3mRchANiENPPmEHMVvXfw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1497.150753452354, + "y": 1078.2110954643786, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 48.41553489057196, + "height": 23.729966514004445, + "seed": 878495998, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "startBinding": { + "elementId": "pBvIHclZrN_kpqVXAZHRZ", + "focus": 0.5990815490550125, + "gap": 6.7022879464248035 + }, + "endBinding": { + "elementId": "i7IvaB8aEXlUaOKzYFRgr", + "focus": 0.8758659295786526, + "gap": 11.378828745037936 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -48.41553489057196, + 23.729966514004445 + ] + ] + }, + { + "type": "arrow", + "version": 832, + "versionNonce": 1308495702, + "isDeleted": false, + "id": "8oR4MyfX4jHtsAYeNAcq2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1520.9051019937037, + "y": 1134.6878109209931, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 72.49159598081201, + "height": 0.9767917052906796, + "seed": 1668206050, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "startBinding": { + "elementId": "R9dwa1OWCNQUNiEB4_L_8", + "focus": -0.002655559170003563, + "gap": 1 + }, + "endBinding": { + "elementId": "9DUadkYR7DysB7iitCu6y", + "focus": 0.09326585366049274, + "gap": 2.6469494769864923 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -72.49159598081201, + 0.9767917052906796 + ] + ] + }, + { + "type": "arrow", + "version": 634, + "versionNonce": 606976266, + "isDeleted": false, + "id": "xJKd2nkOCNIe1_O4_jlZ-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1522.555531061782, + "y": 1215.9612037134202, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 74.6171875, + "height": 14.890625, + "seed": 1779890494, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700868, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "nfVvmk0hO2Y8W4qCPTrUL", + "focus": -0.7385533528788956, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -74.6171875, + -14.890625 + ] + ] + }, + { + "type": "rectangle", + "version": 4889, + "versionNonce": 274487882, + "isDeleted": false, + "id": "Z6DmDcFKnMIP5y9F7Bmy8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1276.1228956907623, + "y": 3151.816427080022, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 192.7960069444445, + "height": 503.416079452614, + "seed": 1515981819, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "uoInldJRljDzt8fpfGqE5", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4002, + "versionNonce": 1977927510, + "isDeleted": false, + "id": "bDoO6UgGKpeo5RBnu_qJF", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 1308.9060833147685, + "y": 3267.59872895081, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 133.82812500000003, + "height": 104.02223463959439, + "seed": 305595701, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3945, + "versionNonce": 1563328778, + "isDeleted": false, + "id": "qVZmaAyCxLCoGghvfIa9g", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 809.2047906232171, + "y": 3217.163106767522, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 307.40147569444457, + "height": 197.04303257761387, + "seed": 344904859, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2872, + "versionNonce": 868052118, + "isDeleted": false, + "id": "HqTFfxWLU4Zfk0gYeQEI8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 972.4242317850938, + "y": 3269.739281916792, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 131.88867535650718, + "seed": 1609209493, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5866, + "versionNonce": 42848202, + "isDeleted": false, + "id": "p2YUn-HGVRGSyM_BFKymH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1788.7049269407626, + "y": 3363.573558448194, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 82.14952256944427, + "height": 119.4682229662705, + "seed": 1520404795, + "groupIds": [ + "6O3pvmyR2AcHszmmlSSaY" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 2527, + "versionNonce": 298805718, + "isDeleted": false, + "id": "HOwjurdjaB4sRHwxFSc2x", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1799.2323104408306, + "y": 3421.351413681329, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 63.328459017776375, + "height": 56.28633437499965, + "seed": 1206189045, + "groupIds": [ + "6O3pvmyR2AcHszmmlSSaY" + ], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 3856, + "versionNonce": 1150633610, + "isDeleted": false, + "id": "Ss3212zGYasKcx7Tvk1_v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1790.3929694754834, + "y": 3370.829154306329, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 78, + "height": 40, + "seed": 1374726619, + "groupIds": [ + "6O3pvmyR2AcHszmmlSSaY" + ], + "roundness": null, + "boundElements": [ + { + "id": "BltJEdlS1EvGPQMbe6C4b", + "type": "arrow" + }, + { + "id": "Ll35jXXZFdsir3OFSS6WG", + "type": "arrow" + }, + { + "id": "63L6OMYVfF9heOL7sMe5S", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse\nEngine", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse\nEngine" + }, + { + "type": "rectangle", + "version": 2885, + "versionNonce": 1865400086, + "isDeleted": false, + "id": "MViU46vTgBdwBBFbXzMZv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 831.5085490520339, + "y": 3270.0456416173997, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 132.17360182709456, + "seed": 36418901, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2094, + "versionNonce": 738190666, + "isDeleted": false, + "id": "IvHLEtNaAArrWlCbYJ6hn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 889.9540558332426, + "y": 3333.428040320439, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1335146107, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2210, + "versionNonce": 5467222, + "isDeleted": false, + "id": "832vCIG0NLyR1SJrHZ4dx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.2409876514246, + "y": 3347.2078698658947, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 705970869, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2219, + "versionNonce": 1915268106, + "isDeleted": false, + "id": "HdLbqBj_BXJzh1Gu9ivFV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.2659275552721, + "y": 3360.3773410197405, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1649291035, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2307, + "versionNonce": 588214678, + "isDeleted": false, + "id": "-v2IQwGSmYPUDLn4v9N_v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.3994093078943, + "y": 3332.1114610663603, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1413751829, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2423, + "versionNonce": 1829411530, + "isDeleted": false, + "id": "DarNTWkKsw6ndqO-BFqak", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.6863411260745, + "y": 3345.8912906118144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 479171515, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2432, + "versionNonce": 848875222, + "isDeleted": false, + "id": "OPUapY0nDSvbgwW-DhSwX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.711281029922, + "y": 3359.06076176566, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1689311605, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3459, + "versionNonce": 2067837322, + "isDeleted": false, + "id": "C-nMXaKIR9NB3q1TAJ-P-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 823.8601667897926, + "y": 3321.980245957478, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 278.4357801359186, + "height": 20.77857388220443, + "seed": 511403099, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2204, + "versionNonce": 1535411222, + "isDeleted": false, + "id": "Ta3Y_e3w0vmX0CQusRUPQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 909.4147770917632, + "y": 3229.391194747506, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 109, + "height": 25, + "seed": 614458069, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.mrk", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.mrk" + }, + { + "type": "text", + "version": 1606, + "versionNonce": 1879437386, + "isDeleted": false, + "id": "cR2GrgOl-IFb6qLrCBks2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 729.7997898208068, + "y": 3325.478758939848, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1608786171, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 176", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 176" + }, + { + "type": "text", + "version": 2121, + "versionNonce": 1875349846, + "isDeleted": false, + "id": "RUUUoExQzH8Aia3Fpamuf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.2347212152397, + "y": 3322.6733816456995, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 120, + "height": 20, + "seed": 413581365, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule_offset" + }, + { + "type": "text", + "version": 1965, + "versionNonce": 2134202122, + "isDeleted": false, + "id": "OCDZBy_rQCw0eKLQxElg9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 840.2301256270046, + "y": 3325.6375360574634, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 978078107, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "block_offset", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 2270, + "versionNonce": 985069206, + "isDeleted": false, + "id": "mk2hgDdfaJdv6YweUrVYD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.0358412521443, + "y": 3271.5713873337177, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 380301717, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2386, + "versionNonce": 692708810, + "isDeleted": false, + "id": "3bwech_pfXMW4ybZgy6wl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.3227730703263, + "y": 3285.3512168791735, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 853958203, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2395, + "versionNonce": 1426568150, + "isDeleted": false, + "id": "kETD1_cmk8lD2ieaJp8ok", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 890.3477129741739, + "y": 3298.5206880330193, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 467793653, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2483, + "versionNonce": 660511882, + "isDeleted": false, + "id": "4Efi-P_u4VTlPcVDhpQZ8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.481194726796, + "y": 3270.254808079639, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 76865243, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2599, + "versionNonce": 2026817814, + "isDeleted": false, + "id": "fv2_6p8n9c4tZSF-NzQz7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.7681265449762, + "y": 3284.034637625093, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1657884757, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2608, + "versionNonce": 1462664010, + "isDeleted": false, + "id": "7US_mRzDjZMfar7tDDVaB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1032.7930664488238, + "y": 3297.204108778939, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1776962427, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4625, + "versionNonce": 1434531414, + "isDeleted": false, + "id": "KVecjoEAN3h1OjND-NAT0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 970.3894972532623, + "y": 3472.2793177050216, + "strokeColor": "#495057", + "backgroundColor": "#ced4da", + "width": 185.44835069444457, + "height": 255.49811070261416, + "seed": 961445301, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3453, + "versionNonce": 655655434, + "isDeleted": false, + "id": "AQNVgLvtYccz4tnzxt14P", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 982.1844666195782, + "y": 3559.0378291173997, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 161.66015625000003, + "height": 31.67067213959449, + "seed": 657007643, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2410, + "versionNonce": 1676934038, + "isDeleted": false, + "id": "MFZp-TyP7EqUDqY-OgFIu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1015.1785852843075, + "y": 3484.3257650600053, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 377421589, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 2389, + "versionNonce": 34320586, + "isDeleted": false, + "id": "RCJdhNGWbIn2Z82Cpd6hc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 997.920313225484, + "y": 3565.746146493829, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 132, + "height": 20, + "seed": 1413736635, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "compressed block", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "compressed block" + }, + { + "type": "rectangle", + "version": 3606, + "versionNonce": 979114198, + "isDeleted": false, + "id": "x1xbsGQUTLpRRPF8cmV7q", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 982.346094475485, + "y": 3601.7613963615313, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 161.66015625000003, + "height": 31.67067213959449, + "seed": 1893225589, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "uoInldJRljDzt8fpfGqE5", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2544, + "versionNonce": 1001326474, + "isDeleted": false, + "id": "ZC4pVrvW8a6_YpDh3WsNe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 998.0819410813908, + "y": 3608.469713737961, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 132, + "height": 20, + "seed": 1725765979, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + }, + { + "id": "6SAFrhAZi-gFmpbfKrgf0", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "compressed block", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "compressed block" + }, + { + "type": "rectangle", + "version": 3721, + "versionNonce": 1615760918, + "isDeleted": false, + "id": "QhBVWepQpphyAMj-tC5zu", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 985.192774162984, + "y": 3644.5983104240313, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 161.66015625000003, + "height": 31.67067213959449, + "seed": 1411382741, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2658, + "versionNonce": 2084144714, + "isDeleted": false, + "id": "5Ubt_S_uMp85pn12q4XRz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1000.9286207688899, + "y": 3651.306627800461, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 132, + "height": 20, + "seed": 2085041659, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "compressed block", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "compressed block" + }, + { + "type": "text", + "version": 2701, + "versionNonce": 583031638, + "isDeleted": false, + "id": "kSlJMf5FUexzKinlFu-XA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.4216039269702, + "y": 3670.431652394179, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 929790773, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2817, + "versionNonce": 746990858, + "isDeleted": false, + "id": "tZgUcMZJaeYvqtnrrev8z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.7085357451504, + "y": 3684.211481939633, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1669643931, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2826, + "versionNonce": 1745256598, + "isDeleted": false, + "id": "nnh5bib1AhQI433fhM_gT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.733475648998, + "y": 3697.3809530934786, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 320883861, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "line", + "version": 812, + "versionNonce": 1645214666, + "isDeleted": false, + "id": "T82Du1jWAmtKTC18fZGaa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 862.9787691065137, + "y": 3347.622206224925, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1.4532116264103934, + "height": 272.0675993272662, + "seed": 1732784955, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.4532116264103934, + 272.0675993272662 + ] + ] + }, + { + "type": "text", + "version": 2752, + "versionNonce": 64355798, + "isDeleted": false, + "id": "iC1nzwsGcHjR1mz5GvlrK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1311.932031975485, + "y": 3163.575248056329, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 50, + "seed": 921956853, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "decompressed\nblock data", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "decompressed\nblock data" + }, + { + "type": "rectangle", + "version": 2797, + "versionNonce": 1257370250, + "isDeleted": false, + "id": "0nYg04T2hDy1xJllAs1z0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.5841897135751, + "y": 3276.5611886565307, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 1475613659, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2538, + "versionNonce": 188994326, + "isDeleted": false, + "id": "dbwr9kM-1MzDGcG6KgP-h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.13627304691, + "y": 3276.2766989491843, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 1609296725, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "742.414.531", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "742.414.531" + }, + { + "type": "text", + "version": 2544, + "versionNonce": 434573642, + "isDeleted": false, + "id": "amafakoO8IEfWubKbLi0P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.7716318287548, + "y": 3287.7836334209564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1436213371, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2660, + "versionNonce": 683999318, + "isDeleted": false, + "id": "huO253QyknBNJqbui9ajf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.058563646935, + "y": 3301.5634629664105, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 241023157, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2669, + "versionNonce": 1917474826, + "isDeleted": false, + "id": "agtqV0dx2GEO63HbUTdW9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.0835035507826, + "y": 3314.7329341202562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1509890331, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3057, + "versionNonce": 1882097046, + "isDeleted": false, + "id": "ZfzG27phIqOQfWAhN2Wgn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1316.9316367001857, + "y": 3341.3469903656674, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 468638229, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2790, + "versionNonce": 1410778826, + "isDeleted": false, + "id": "AQE8pL3-yttNZLiPJ1F1M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.6411987451356, + "y": 3342.062500658321, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 43204027, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "747.148.242", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "747.148.242" + }, + { + "type": "text", + "version": 3149, + "versionNonce": 850748118, + "isDeleted": false, + "id": "OoIznPgkv0BOUiNU2wUvS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.1544443287546, + "y": 3507.771914670956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 294965109, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3274, + "versionNonce": 132603274, + "isDeleted": false, + "id": "n-UNPVs4Z9U3JSOiub8EN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.4413761469348, + "y": 3521.55174421641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 444190299, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3283, + "versionNonce": 1391368214, + "isDeleted": false, + "id": "mGcJNxM3llQkuP06NvsQp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1063.4663160507823, + "y": 3534.721215370256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1033181397, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 658, + "versionNonce": 183966794, + "isDeleted": false, + "id": "6SAFrhAZi-gFmpbfKrgf0", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 865.2947551897685, + "y": 3619.262190020606, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 117.00390625, + "height": 2.0703125, + "seed": 1686457083, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "ZC4pVrvW8a6_YpDh3WsNe", + "focus": 0.24399918217240393, + "gap": 15.783279641622357 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 117.00390625, + -2.0703125 + ] + ] + }, + { + "type": "text", + "version": 3101, + "versionNonce": 416228694, + "isDeleted": false, + "id": "3nwYU4swX2Anvc1UVX4Yg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.2677255787548, + "y": 3210.4984771709564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 159725109, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3218, + "versionNonce": 2065761034, + "isDeleted": false, + "id": "aXJpJZpcitfVUcqR7_shF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.554657396935, + "y": 3224.2783067164105, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 624440219, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3227, + "versionNonce": 95160982, + "isDeleted": false, + "id": "J_64UiuYtjZngok7be4KJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.5795973007826, + "y": 3237.4477778702562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 273328021, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4266, + "versionNonce": 48239050, + "isDeleted": false, + "id": "B9hasLRMPT-RrBJsAAA-s", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 1309.2400676897685, + "y": 3382.90341645081, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 133.82812500000003, + "height": 104.02223463959439, + "seed": 1824852027, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3058, + "versionNonce": 674908118, + "isDeleted": false, + "id": "gYgE5GLkRlj_bZK1rgmQ1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.9181740885751, + "y": 3391.8658761565307, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 1947921653, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2789, + "versionNonce": 1162823818, + "isDeleted": false, + "id": "0nSqhgjX_T6PkNH4H-AwN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1325.470257421911, + "y": 3391.5813864491843, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 554584283, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "747.148.242", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "747.148.242" + }, + { + "type": "text", + "version": 2805, + "versionNonce": 1888410902, + "isDeleted": false, + "id": "4I2U1Qo-zPPF7Sc0NRNJ6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.1056162037548, + "y": 3403.088320920956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1954252373, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2921, + "versionNonce": 1244243786, + "isDeleted": false, + "id": "Wy6ubQFbs-5drcBfpWlHe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.392548021935, + "y": 3416.86815046641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1202091387, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2930, + "versionNonce": 69126742, + "isDeleted": false, + "id": "sgaW75e5nkX16Qs7-_n_u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1374.4174879257826, + "y": 3430.037621620256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1145172917, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3321, + "versionNonce": 1774857738, + "isDeleted": false, + "id": "Yu5fhbBJs74fITyO54Qk6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.2656210751857, + "y": 3456.651677865667, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 265293339, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3051, + "versionNonce": 297734038, + "isDeleted": false, + "id": "1xKjC3poeJiw_9g4CBieY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.8850600907363, + "y": 3457.3671881583205, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 529773845, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "751.802.947", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "751.802.947" + }, + { + "type": "rectangle", + "version": 4460, + "versionNonce": 959175882, + "isDeleted": false, + "id": "6TsF2ajztP-JcpDvfTdoI", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 1308.4353801897685, + "y": 3501.0245102008093, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 133.82812500000003, + "height": 104.02223463959439, + "seed": 477991611, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3253, + "versionNonce": 631549142, + "isDeleted": false, + "id": "bUfnRGrGRdxe7fSNLzmvn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1317.1134865885751, + "y": 3509.9869699065302, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 568740469, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2983, + "versionNonce": 1978250122, + "isDeleted": false, + "id": "IHtbRE1MXMH91eRGl52tt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.665569921911, + "y": 3510.702480199184, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 240223067, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "751.802.947", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "751.802.947" + }, + { + "type": "text", + "version": 3000, + "versionNonce": 2103747094, + "isDeleted": false, + "id": "CIaVliMv2mnoOe3SaTNJL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.3009287037548, + "y": 3521.209414670956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1543451605, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3116, + "versionNonce": 1916711498, + "isDeleted": false, + "id": "HTp6raiHFIHsd52BifYvW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.587860521935, + "y": 3534.98924421641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1302224891, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3125, + "versionNonce": 1542713174, + "isDeleted": false, + "id": "26WkaQ26WL0iPA7asA_UJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1373.6128004257826, + "y": 3548.1587153702562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 703852853, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3513, + "versionNonce": 17160458, + "isDeleted": false, + "id": "XsLP2OdIryofvPn9pdkp1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1316.4609335751857, + "y": 3574.7727716156674, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 116.38248697916723, + "height": 21.19259982638885, + "seed": 342272155, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3247, + "versionNonce": 1571263638, + "isDeleted": false, + "id": "jOvjTXVPUltjmhIKQvN3o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1324.0130169085205, + "y": 3575.488281908321, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 105, + "height": 20, + "seed": 1227489941, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "752.832.461", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "752.832.461" + }, + { + "type": "line", + "version": 449, + "versionNonce": 1639589834, + "isDeleted": false, + "id": "YNoMgSRtknqq7BZNwV4c4", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1008.7752239397685, + "y": 3343.6918775206063, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1.96875, + "height": 93.48828125, + "seed": 945610043, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.96875, + 93.48828125 + ] + ] + }, + { + "type": "text", + "version": 3590, + "versionNonce": 1278513622, + "isDeleted": false, + "id": "B6luJz0jJP3NC7Zbv9WMg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.1349130787548, + "y": 3598.990664670956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 777447413, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3707, + "versionNonce": 745971338, + "isDeleted": false, + "id": "ODOiZE9_IEFZ4lSWjecPI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.421844896935, + "y": 3612.77049421641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 887324123, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3716, + "versionNonce": 1924130582, + "isDeleted": false, + "id": "dU31U7UQHz90x3i1gCIPd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1373.4467848007826, + "y": 3625.939965370256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 461381973, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 972, + "versionNonce": 1039547722, + "isDeleted": false, + "id": "uoInldJRljDzt8fpfGqE5", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1147.2910355023866, + "y": 3616.675221493787, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 120.93780388257687, + "height": 1.9492749591704523, + "seed": 1963788923, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Iz4RhtaLO452plU5Wtr5J", + "focus": 2.114843304963227, + "gap": 13.730282187381817 + }, + "endBinding": { + "elementId": "Z6DmDcFKnMIP5y9F7Bmy8", + "focus": -0.8272882662943504, + "gap": 7.894056305798927 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 120.93780388257687, + -1.9492749591704523 + ] + ] + }, + { + "type": "text", + "version": 2073, + "versionNonce": 1905169494, + "isDeleted": false, + "id": "Iz4RhtaLO452plU5Wtr5J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1161.0213176897685, + "y": 3583.1215650206072, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 1979395765, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "6gkr09UfyYbzjuh6y6WGW", + "type": "arrow" + }, + { + "id": "uoInldJRljDzt8fpfGqE5", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "decompress", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "decompress" + }, + { + "type": "arrow", + "version": 959, + "versionNonce": 596902922, + "isDeleted": false, + "id": "Jkh8lBk0cbSC0J-UQsI7B", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1013.1736614397685, + "y": 3437.809065020606, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 293.70297228147615, + "height": 1.886237626986258, + "seed": 1570505499, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "startBinding": { + "elementId": "qVZmaAyCxLCoGghvfIa9g", + "focus": 1.2240306758329034, + "gap": 23.60292567547026 + }, + "endBinding": { + "elementId": "B9hasLRMPT-RrBJsAAA-s", + "focus": -0.0996491562710595, + "gap": 2.36343396852385 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 293.70297228147615, + 1.886237626986258 + ] + ] + }, + { + "type": "text", + "version": 2819, + "versionNonce": 312842646, + "isDeleted": false, + "id": "luhOhH2JDwa6eOsUwL0mV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1217.1489218564363, + "y": 3272.0052455761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 1550684181, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 175", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 175" + }, + { + "type": "text", + "version": 2912, + "versionNonce": 122352330, + "isDeleted": false, + "id": "zwTzFuVNTQAvQjK7ktj0F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1216.0512656064363, + "y": 3386.0482143261593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 386066363, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 176", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 176" + }, + { + "type": "text", + "version": 3084, + "versionNonce": 489289430, + "isDeleted": false, + "id": "5zaozhWnau3QPikbOvc_E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1217.4653281064363, + "y": 3503.950558076159, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 2093794677, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 177", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 177" + }, + { + "type": "text", + "version": 3010, + "versionNonce": 464914826, + "isDeleted": false, + "id": "wDUa-cmfDR7oEoBuYX0BQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1449.6918906064366, + "y": 3274.4974330761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 112, + "height": 20, + "seed": 392443995, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.433.600", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.433.600" + }, + { + "type": "text", + "version": 3132, + "versionNonce": 699444246, + "isDeleted": false, + "id": "2EDet1OaDkn7DbT-9i-9s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1452.3207968564366, + "y": 3341.7943080761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 95, + "height": 20, + "seed": 710823637, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.441.791", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.441.791" + }, + { + "type": "text", + "version": 3230, + "versionNonce": 135284810, + "isDeleted": false, + "id": "wIt7_Ju6OG6_LFIqsmqKR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1452.0434531064366, + "y": 3390.3021205761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 20, + "seed": 1821537531, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ll35jXXZFdsir3OFSS6WG", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.441.792", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.441.792" + }, + { + "type": "text", + "version": 3272, + "versionNonce": 1982773590, + "isDeleted": false, + "id": "NtYNSFy-whbZIid7xeJmD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1450.7700156064366, + "y": 3456.6906510323734, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 111, + "height": 20, + "seed": 867675189, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "63L6OMYVfF9heOL7sMe5S", + "type": "arrow" + } + ], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.449.983", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.449.983" + }, + { + "type": "text", + "version": 3400, + "versionNonce": 1412738826, + "isDeleted": false, + "id": "s8aMbA9Mmgn4vXWLwvBMl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1449.6254843564366, + "y": 3508.001339326159, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 110, + "height": 20, + "seed": 1175461275, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.449.984", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.449.984" + }, + { + "type": "text", + "version": 3490, + "versionNonce": 972627606, + "isDeleted": false, + "id": "Lo23rQFd0Avk_iVT6aWrg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1451.1254843564366, + "y": 3573.7825893261593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 20, + "seed": 2025741717, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700876, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1.458.175", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1.458.175" + }, + { + "type": "text", + "version": 4076, + "versionNonce": 375911562, + "isDeleted": false, + "id": "Bp_OjPrmGcEi6dRrneEhC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1627.5043906064357, + "y": 3334.2630580761593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 116, + "height": 80, + "seed": 1752412891, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700877, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "all 8192 rows \nof granule 176\nare streamed\ninto ClickHouse", + "baseline": 74, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "all 8192 rows \nof granule 176\nare streamed\ninto ClickHouse" + }, + { + "type": "arrow", + "version": 1223, + "versionNonce": 1263326026, + "isDeleted": false, + "id": "Ll35jXXZFdsir3OFSS6WG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 80, + "angle": 0, + "x": 1551.3202837280069, + "y": 3387.079154306329, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 234.4677734375, + "height": 39.3115234375, + "seed": 1946044853, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700877, + "link": null, + "locked": false, + "startBinding": { + "elementId": "wIt7_Ju6OG6_LFIqsmqKR", + "focus": -0.45215935910385624, + "gap": 3.222966269830067 + }, + "endBinding": { + "elementId": "Ss3212zGYasKcx7Tvk1_v", + "focus": -1.2887866917668438, + "gap": 7.9443359375 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 34.1064453125, + -4.16015625 + ], + [ + 46.455078125, + 0.4248046875 + ], + [ + 49.0576171875, + 13.0078125 + ], + [ + 50.9375, + 25.673828125 + ], + [ + 56.26953125, + 35.1513671875 + ], + [ + 96.455078125, + 34.8828125 + ], + [ + 234.4677734375, + 31.6943359375 + ] + ] + }, + { + "type": "arrow", + "version": 1077, + "versionNonce": 343148746, + "isDeleted": false, + "id": "63L6OMYVfF9heOL7sMe5S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 80, + "angle": 0, + "x": 1542.7810271344842, + "y": 3479.2215910125433, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 244.39863159352217, + "height": 61.611328125, + "seed": 1695447835, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700877, + "link": null, + "locked": false, + "startBinding": { + "elementId": "NtYNSFy-whbZIid7xeJmD", + "focus": 1.1689823066050393, + "gap": 2.530939980169933 + }, + "endBinding": { + "elementId": "Ss3212zGYasKcx7Tvk1_v", + "focus": -1.2184134905993005, + "gap": 7.163085937499545 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 46.04413940602217, + 0.3819773562854607 + ], + [ + 59.90644409352217, + -15.79478045621454 + ], + [ + 61.93769409352217, + -41.69321795621454 + ], + [ + 67.60663940602217, + -52.29868670621454 + ], + [ + 97.03535034352217, + -56.63950701871454 + ], + [ + 244.39863159352217, + -61.22935076871454 + ] + ] + }, + { + "type": "text", + "version": 2230, + "versionNonce": 527905686, + "isDeleted": false, + "id": "R9dwa1OWCNQUNiEB4_L_8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1521.9051019937037, + "y": 1113.2972125092788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 196, + "height": 40, + "seed": 1498844490, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8oR4MyfX4jHtsAYeNAcq2", + "type": "arrow" + } + ], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1" + }, + { + "type": "rectangle", + "version": 1953, + "versionNonce": 1224542998, + "isDeleted": false, + "id": "Wiarv-8t9VQnxkUlojxsC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1036.3692977255103, + "y": 234.94051825362084, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 2135112598, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1535, + "versionNonce": 427645258, + "isDeleted": false, + "id": "jQVofhsMHssMFAvmpT9Ao", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1050.9999245912566, + "y": 240.3637242765269, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 1984983242, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2328, + "versionNonce": 1251424342, + "isDeleted": false, + "id": "JWcu2wIZgbUlnKpPKVlUy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1466.860259705863, + "y": 232.2812442218845, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 700668118, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2267, + "versionNonce": 936878090, + "isDeleted": false, + "id": "nPYoRwi-k7atwl3DVWImu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1187.0578707177515, + "y": 233.85262481218405, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 1230751626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1337, + "versionNonce": 184139158, + "isDeleted": false, + "id": "VyF77oCL1iZbYtoUI3ZNj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1279.8946273928204, + "y": 240.8755387441604, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 1102430358, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1464, + "versionNonce": 146476746, + "isDeleted": false, + "id": "2Y-_8zgs2gstfoyrz7Prq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1484.4266284036078, + "y": 241.01876791082827, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 771013578, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2411, + "versionNonce": 1062836950, + "isDeleted": false, + "id": "qNgMkIDpGu8IAvTPpYZdz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.306513596446, + "y": 573.9657941284946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1882052630, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2590, + "versionNonce": 818062730, + "isDeleted": false, + "id": "7EtQCslXAd6YyoT7bOe_A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.306513596446, + "y": 592.7397378553525, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 843816534, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2774, + "versionNonce": 776720406, + "isDeleted": false, + "id": "WcpC8JNUEow5syDT-lSBh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1088.306513596446, + "y": 611.514217230802, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 545561098, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2655, + "versionNonce": 153707594, + "isDeleted": false, + "id": "h-3pnyDUkn79NnzL1kaZ1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1308.1999303165894, + "y": 574.052515295756, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 187786134, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2832, + "versionNonce": 63266134, + "isDeleted": false, + "id": "sFKI3WDdokcox4fW4b1u4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1308.5604322312165, + "y": 592.8264590226144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 95996106, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3016, + "versionNonce": 197806858, + "isDeleted": false, + "id": "8NCgSdfWzTqvl20WiPH6A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1308.480203921702, + "y": 611.6009383980635, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1705803990, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2718, + "versionNonce": 622543510, + "isDeleted": false, + "id": "vKyMaKKYSiRNZCY1C7SVb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1546.6707334107107, + "y": 574.0277757124226, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2046369674, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2895, + "versionNonce": 1059084746, + "isDeleted": false, + "id": "iubGWa41U1NhCKpnd7tZ6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1547.0312353253378, + "y": 592.8017194392809, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 357692950, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3079, + "versionNonce": 84049878, + "isDeleted": false, + "id": "TIcN1Q-CbLToEmt4zu6-f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1546.9510070158233, + "y": 611.57619881473, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 427859530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4704, + "versionNonce": 575049866, + "isDeleted": false, + "id": "P1FXiVWkjFCTe_XCb5L8B", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 894.7115608355889, + "y": 274.5175730727937, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1629141846, + "groupIds": [ + "a7f9zaB8n_8P-t8iMsIJW" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5382, + "versionNonce": 2005931286, + "isDeleted": false, + "id": "jKrOvtSdbVSH_uP-cvpmx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.7676852736147, + "y": 273.51839931494743, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 1311319626, + "groupIds": [ + "a7f9zaB8n_8P-t8iMsIJW" + ], + "roundness": null, + "boundElements": [ + { + "id": "GkiYx80xAbmpjHnxJ7KXx", + "type": "arrow" + } + ], + "updated": 1672163700912, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2480, + "versionNonce": 1153454282, + "isDeleted": false, + "id": "sN7LqVozphO5hoJhmZq93", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.4392233688268, + "y": 277.33987558392886, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 1624100374, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1422, + "versionNonce": 583104726, + "isDeleted": false, + "id": "KhJ3mbvURq3KzNIaRQQxg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 277.3646171249208, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 911099466, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1488, + "versionNonce": 2127538058, + "isDeleted": false, + "id": "AMDb-U0BCJy0MkDYPiz09", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.284129358224, + "y": 277.3646171249208, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1364695894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1246, + "versionNonce": 1426583062, + "isDeleted": false, + "id": "t7Vrh9UgW0xxmfbLk6xFK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.5278188797986, + "y": 278.70651592670106, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1174596874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1613, + "versionNonce": 1380329034, + "isDeleted": false, + "id": "xkJUUPxw00NjP0bKmNIiu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.4141967734483, + "y": 279.70614821317173, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1704803798, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1701, + "versionNonce": 2035137366, + "isDeleted": false, + "id": "9LJB99J5_K09L5mrhTbJV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.306513596446, + "y": 350.91061115265404, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1010741898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1833, + "versionNonce": 1476316426, + "isDeleted": false, + "id": "5JsPwnpfh0zYOCl36AiiO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.306513596446, + "y": 364.6904406981099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 841159446, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1842, + "versionNonce": 1172824214, + "isDeleted": false, + "id": "fSpj0tMfZCpda3liRX31-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.306513596446, + "y": 377.85991185195564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1134285130, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1699, + "versionNonce": 1433705418, + "isDeleted": false, + "id": "NtISqBYOhvjQmFihnC7ie", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.4451087350617, + "y": 349.6807204093627, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 834420822, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1815, + "versionNonce": 1586191830, + "isDeleted": false, + "id": "ExIN_KifsomgpIySVBtGC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.7320405532419, + "y": 363.46054995481677, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 124196874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1824, + "versionNonce": 683840138, + "isDeleted": false, + "id": "auSGetdr07XJzyWwj5s6g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.7569804570894, + "y": 376.6300211086625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1480443286, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1745, + "versionNonce": 676147990, + "isDeleted": false, + "id": "Jcxi9IuR5w1v52AKJfNP8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.1447233822112, + "y": 349.72972609118074, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 664504010, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1861, + "versionNonce": 883142986, + "isDeleted": false, + "id": "8O8jEFQjaXPL-B6x81yAk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.4316552003932, + "y": 363.5095556366348, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1457300182, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1870, + "versionNonce": 497180758, + "isDeleted": false, + "id": "FHDp9nYzRfva5YRKCGirr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.4565951042407, + "y": 376.6790267904805, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 215227786, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2590, + "versionNonce": 1282603018, + "isDeleted": false, + "id": "f2C59pIQsZ8QGjB08SM8f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.6120466418868, + "y": 309.5639591645431, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 1414257738, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1572, + "versionNonce": 576710038, + "isDeleted": false, + "id": "S-IG85sraUiYKpdAE93nK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 309.5142629839876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1277584726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1635, + "versionNonce": 539715274, + "isDeleted": false, + "id": "UVHDZeKonXESdYoOfkTyZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.6078061783953, + "y": 309.5142629839876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1004389130, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1399, + "versionNonce": 1471857366, + "isDeleted": false, + "id": "pKFawK3dgoH0dx2ktI1Mq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.85149569997, + "y": 309.60095149477485, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1276856982, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1759, + "versionNonce": 677903754, + "isDeleted": false, + "id": "z3pgb_xK_Z9u7up197veV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 976.7378735936197, + "y": 311.7996783809213, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 235196874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3367, + "versionNonce": 1883764758, + "isDeleted": false, + "id": "w2jEoeeD---7EjJ8-O-2u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.7156933957938, + "y": 342.066760901056, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 1589741526, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2391, + "versionNonce": 308526154, + "isDeleted": false, + "id": "B1NsNgleD3yeRYodD7Egd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 342.13815847050057, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 232523914, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2459, + "versionNonce": 66880854, + "isDeleted": false, + "id": "CSrZOJdlTdTo6w0M2J-fw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.7944341127156, + "y": 342.13815847050057, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1412308246, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2202, + "versionNonce": 737780490, + "isDeleted": false, + "id": "lIJYYt-AeK-j0SZqdpqQR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1471.0381236342903, + "y": 342.2248469812878, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1662936906, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2581, + "versionNonce": 1680698006, + "isDeleted": false, + "id": "97AsS_UGQVpLg2ATac8EI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 975.92450152794, + "y": 344.49509558720376, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 836110934, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3112, + "versionNonce": 1336193482, + "isDeleted": false, + "id": "2SMO7jRL-DGEddiExwUNC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.2033086480265, + "y": 405.62989313127923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 103214602, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2208, + "versionNonce": 1871685590, + "isDeleted": false, + "id": "shwrqvH-X7JWDj_sz2LyP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 405.67197278890785, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 109989782, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2276, + "versionNonce": 1350559882, + "isDeleted": false, + "id": "-ifH1k-FmymKu2xkG7dcW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.5061629054405, + "y": 405.67197278890785, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 737189066, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2024, + "versionNonce": 1714961686, + "isDeleted": false, + "id": "cBJM8NbVjeG9nn-sWgnR_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.7498524270152, + "y": 405.75866129969506, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1049357526, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2387, + "versionNonce": 1715881802, + "isDeleted": false, + "id": "d00kK9Qnv7E-Kv8QqWkgo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 948.636230320665, + "y": 407.8176373338571, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 840332170, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 5252, + "versionNonce": 1033644630, + "isDeleted": false, + "id": "xOV8xa8SN2JbzNrsymR1m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 894.4183834872588, + "y": 434.93176308508674, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 643828810, + "groupIds": [ + "HrR_ARvvEjdPll0Lk4N2Q" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5930, + "versionNonce": 424857098, + "isDeleted": false, + "id": "chehznvRTylGXnyCR9RaI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.4745079252843, + "y": 433.93258932724035, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 2024617302, + "groupIds": [ + "HrR_ARvvEjdPll0Lk4N2Q" + ], + "roundness": null, + "boundElements": [ + { + "id": "3WI04rxxvXSjHIfous1og", + "type": "arrow" + } + ], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3224, + "versionNonce": 1955622806, + "isDeleted": false, + "id": "O7nOLj3p7plkP96NpwQ1I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.7648941900472, + "y": 437.19145782877354, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 2003034646, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2312, + "versionNonce": 782269642, + "isDeleted": false, + "id": "kerXQoUlsPMLNF2wHsMAh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 437.34004976914014, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 181629514, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2379, + "versionNonce": 1732906198, + "isDeleted": false, + "id": "_dLZhGSEbNBZITX5N1Rr-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.239849813909, + "y": 437.34004976914014, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1410019158, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2127, + "versionNonce": 332026762, + "isDeleted": false, + "id": "LXDpFrfd5JPY4vBM5txib", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.4835393354836, + "y": 437.42673827992746, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 688036106, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2478, + "versionNonce": 593363478, + "isDeleted": false, + "id": "0XIN9-RWyD5sgHGLRv4HZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 947.3699172291316, + "y": 439.82375328699607, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 1356256406, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3438, + "versionNonce": 1259033162, + "isDeleted": false, + "id": "p6ySQJ_foDdWAhHI5G_Hv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.1991452075683, + "y": 470.759233676342, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 1813964746, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2455, + "versionNonce": 1002524502, + "isDeleted": false, + "id": "_ep0Vqmc7fkgZRRcVSs_E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 469.97380910441416, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 393990614, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2526, + "versionNonce": 1463712010, + "isDeleted": false, + "id": "-P2USAO2VxJ8IQ_85gsyF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.5635266340803, + "y": 469.97380910441416, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 205741706, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4299, + "versionNonce": 482931862, + "isDeleted": false, + "id": "tol1691g-FTuKcuji6cA_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.5858854165651, + "y": 501.0557206966429, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 1393501974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3287, + "versionNonce": 668911562, + "isDeleted": false, + "id": "bo1X2KQrQ3NbZfjp3QHWF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1074.306513596446, + "y": 500.7217143427064, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 103480650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3354, + "versionNonce": 1613361622, + "isDeleted": false, + "id": "aOYGlP1e05XHLxTJocUZ0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.7501545683997, + "y": 500.7217143427064, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 67490902, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3099, + "versionNonce": 84360842, + "isDeleted": false, + "id": "9LQrHaz85QHSicWMy1nUE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.9938440899743, + "y": 500.8084028534936, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 120636426, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2072, + "versionNonce": 553207574, + "isDeleted": false, + "id": "vTJDvgFMWV4A56kE_RqQK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 509.4609459180682, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1412749718, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2192, + "versionNonce": 2071125322, + "isDeleted": false, + "id": "bd1dfwX19t8A-t00pyE8k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 523.2407754635241, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1498395338, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2201, + "versionNonce": 1336669270, + "isDeleted": false, + "id": "tD3P6Ai3HuprA_ORZwVTr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.306513596446, + "y": 536.4102466173698, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1792095958, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2075, + "versionNonce": 1216128010, + "isDeleted": false, + "id": "sFbPRpuIN5z-8W2wnOj1t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.4046524286832, + "y": 508.2310551747769, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1327679882, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2191, + "versionNonce": 102168982, + "isDeleted": false, + "id": "CD-HstjW1h3S9QujY9LRk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.6915842468634, + "y": 522.0108847202308, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1081076758, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2200, + "versionNonce": 1176474314, + "isDeleted": false, + "id": "gq1xWaZE-XhBqMf-8PdhZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.716524150711, + "y": 535.1803558740768, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 803539018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2121, + "versionNonce": 1534023382, + "isDeleted": false, + "id": "nnS6YuBTRzIv8NM-F5hLj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.1042670758327, + "y": 508.2800608565949, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1929771350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2237, + "versionNonce": 1459005834, + "isDeleted": false, + "id": "rOFNKc2TWjTz009v3DvLa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.3911988940147, + "y": 522.0598904020488, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 594636554, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2246, + "versionNonce": 944376854, + "isDeleted": false, + "id": "gQNmVdGM-aUXmIvDvBc_g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.4161387978622, + "y": 535.2293615558948, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 434658966, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3541, + "versionNonce": 1379723338, + "isDeleted": false, + "id": "GlYjoKrN39RMxb4VCGoBe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.3496233999756, + "y": 563.5490847749403, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 507706826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2585, + "versionNonce": 714873174, + "isDeleted": false, + "id": "PFOE-trbLGwmt4FzZotc0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1064.306513596446, + "y": 563.8460321009762, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 432806870, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2655, + "versionNonce": 1875726090, + "isDeleted": false, + "id": "g0zIwtHgYJ5YJUAaMg1Cw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.4657065990611, + "y": 563.8460321009762, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1299494026, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2400, + "versionNonce": 968523414, + "isDeleted": false, + "id": "7ZOLRyjOVxrznqzpWsAh1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.7093961206358, + "y": 563.9327206117636, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2026254614, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2742, + "versionNonce": 874700234, + "isDeleted": false, + "id": "pkkc_YhVwYsIk7vb1ML_X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 936.5957740142875, + "y": 566.3679720992712, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 46240586, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4880, + "versionNonce": 978992086, + "isDeleted": false, + "id": "LuX7Fpej4nAk8sD572q7G", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 894.372576942194, + "y": 658.7441360943783, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 2021674838, + "groupIds": [ + "P6tHtuIUAYxSvJEzJ24r8" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5558, + "versionNonce": 1549309066, + "isDeleted": false, + "id": "MQERmG_TTHLhJwKfqehAr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 892.42870138022, + "y": 657.744962336532, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 166689034, + "groupIds": [ + "P6tHtuIUAYxSvJEzJ24r8" + ], + "roundness": null, + "boundElements": [ + { + "id": "3kgcfqKSC119Vts5h_nWg", + "type": "arrow" + } + ], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3906, + "versionNonce": 579883286, + "isDeleted": false, + "id": "__SVNO9hLIe1Mqz7onLdF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1031.2108760502588, + "y": 661.7898562735926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 857129814, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2842, + "versionNonce": 1244230474, + "isDeleted": false, + "id": "tn6VoybdvXfsMUUO_KPIZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 661.5265705531793, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1093289226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2910, + "versionNonce": 1574026838, + "isDeleted": false, + "id": "A4fOWu39OwVcywFuPt6Ng", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1192.9995045224814, + "y": 661.5265705531793, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1901062294, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2654, + "versionNonce": 1878030858, + "isDeleted": false, + "id": "4K3M0bCq4xlLFKiMZVXWJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.243194044056, + "y": 661.6132590639664, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2054230986, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 2966, + "versionNonce": 552829846, + "isDeleted": false, + "id": "19VqruzPfWRjVW6K2x3lm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 905.1295719377041, + "y": 663.2831643140897, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1873962454, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 3915, + "versionNonce": 1017686218, + "isDeleted": false, + "id": "o6RiAfEK6_hC_jOr7fVDs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.043976154924, + "y": 693.9567801685001, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 1735395978, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2985, + "versionNonce": 1042981078, + "isDeleted": false, + "id": "4L8mA8Ckfe23nWBJT34eX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 693.6213158136744, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 257112854, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3062, + "versionNonce": 132972426, + "isDeleted": false, + "id": "GA4Bu9iq1wG963-RtmhFY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.3231813426528, + "y": 693.6213158136744, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 786573642, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2800, + "versionNonce": 2030835222, + "isDeleted": false, + "id": "4DzDdL3kkJRx5x-kBPbMs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.5668708642274, + "y": 693.7080043244615, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1185376342, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4726, + "versionNonce": 2113437258, + "isDeleted": false, + "id": "hLsQVwev3SN3adAAmfj3M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1029.0381427168381, + "y": 726.1102929729972, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 1747087370, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3808, + "versionNonce": 1519182678, + "isDeleted": false, + "id": "WrS7VAFY1bfp7wfKxtVl8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 726.0605967924415, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1971580310, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3881, + "versionNonce": 195437834, + "isDeleted": false, + "id": "eon42bZOpPXz6rEO9tLkM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1193.411091979494, + "y": 726.0605967924415, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 120315594, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3623, + "versionNonce": 84019350, + "isDeleted": false, + "id": "9kXMTTpRhLdeNrZy7it-E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1470.7534987985468, + "y": 726.1472853032288, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 958253782, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2599, + "versionNonce": 1248916426, + "isDeleted": false, + "id": "yTa0PqJZh3PTcNlYBNMMw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.1870139508865, + "y": 735.0545065944303, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1218016650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2715, + "versionNonce": 136349142, + "isDeleted": false, + "id": "oM4FQNn-Mvi72e6XCVcLS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.1870139508865, + "y": 748.8343361398862, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1074397206, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2724, + "versionNonce": 1819536010, + "isDeleted": false, + "id": "Ye-d6hQnU2M48gLxGunW1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1092.1870139508865, + "y": 762.0038072937319, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 497431626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2600, + "versionNonce": 889019158, + "isDeleted": false, + "id": "BbTuAf2VuGHXFMirGRPV_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.1643071372566, + "y": 733.8246158511391, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 507350358, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700913, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2715, + "versionNonce": 678037834, + "isDeleted": false, + "id": "EUH07YvDkOYB433W6z0Fr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.3645504446495, + "y": 747.5177568858059, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 405609226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2724, + "versionNonce": 1913489494, + "isDeleted": false, + "id": "RtlASmtbxNdARl2D54g1c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1310.389490348497, + "y": 760.6872280396516, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 554529430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2646, + "versionNonce": 632180746, + "isDeleted": false, + "id": "ipHD6wPu79s8Qu-bHHYA7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1547.8639217844043, + "y": 733.8736215329571, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1453926858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2761, + "versionNonce": 254152086, + "isDeleted": false, + "id": "LCAKPpe09w2Je8IhcONMo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.0641650918008, + "y": 747.5667625676239, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 590262230, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2770, + "versionNonce": 1748745930, + "isDeleted": false, + "id": "_vIqxjHjb_YOjdlDiMJ23", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1548.0891049956483, + "y": 760.7362337214696, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1882546314, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4059, + "versionNonce": 427551446, + "isDeleted": false, + "id": "e-FHjlOvv0hJppkmVyfZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1030.0528828654187, + "y": 789.683901128445, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1622557974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2737, + "versionNonce": 1017992586, + "isDeleted": false, + "id": "WDUAmEYWfFdwFzbHkQ2tz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1036.1870139508865, + "y": 789.6042961486195, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1619836746, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 2897, + "versionNonce": 799285270, + "isDeleted": false, + "id": "gX3fHoVZ1AnvTdybGAyDl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1194.1664216534107, + "y": 789.6042961486195, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1259942486, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2618, + "versionNonce": 608048202, + "isDeleted": false, + "id": "rkSx4vh5rlOYbuMCnocyh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1471.6200566283426, + "y": 789.6042961486195, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1946830346, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 2857, + "versionNonce": 1435741526, + "isDeleted": false, + "id": "ZVHJt1y6EbxU9i66uwLd_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 906.1414410342196, + "y": 791.4652987527858, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1563195286, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 1777, + "versionNonce": 1218417302, + "isDeleted": false, + "id": "IhL2-OJrSbi3EJ_cNKNTp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 717.989017400923, + "y": 284.8446568103518, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 606921546, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "GkiYx80xAbmpjHnxJ7KXx", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1733, + "versionNonce": 1086917066, + "isDeleted": false, + "id": "GkiYx80xAbmpjHnxJ7KXx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 847.4688284044247, + "y": 305.78029017015615, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.73828125, + "height": 0.9079272975623098, + "seed": 738020950, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "startBinding": { + "elementId": "IhL2-OJrSbi3EJ_cNKNTp", + "focus": 0.12412743246042555, + "gap": 10.479811003501709 + }, + "endBinding": { + "elementId": "jKrOvtSdbVSH_uP-cvpmx", + "focus": 0.6408863246638227, + "gap": 8.560575619190104 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.73828125, + -0.9079272975623098 + ] + ] + }, + { + "type": "text", + "version": 2491, + "versionNonce": 1400688598, + "isDeleted": false, + "id": "SpWNTXzUj6aN5NPSUhRAY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 721.2735133993058, + "y": 437.9595550258464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 943125206, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3WI04rxxvXSjHIfous1og", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1679, + "versionNonce": 1264140426, + "isDeleted": false, + "id": "3WI04rxxvXSjHIfous1og", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 848.9141383993067, + "y": 460.4928562436967, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 39.8359375, + "height": 1.008672810209191, + "seed": 1090964874, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "startBinding": { + "elementId": "SpWNTXzUj6aN5NPSUhRAY", + "focus": 0.037566857262255365, + "gap": 8.64062500000091 + }, + "endBinding": { + "elementId": "chehznvRTylGXnyCR9RaI", + "focus": 0.4556907888569733, + "gap": 3.724432025977535 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.8359375, + 1.008672810209191 + ] + ] + }, + { + "type": "text", + "version": 2770, + "versionNonce": 574645526, + "isDeleted": false, + "id": "VlXyMPCdRQCg7m9ThEtTy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 715.8710167352311, + "y": 669.2559365499744, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 123, + "height": 40, + "seed": 2058369354, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "3kgcfqKSC119Vts5h_nWg", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1082\nwith 3937 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1082\nwith 3937 rows" + }, + { + "type": "arrow", + "version": 1417, + "versionNonce": 1815387978, + "isDeleted": false, + "id": "3kgcfqKSC119Vts5h_nWg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 847.316329235232, + "y": 685.8621354970959, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 37.82667994643066, + "height": 2.2924149685511566, + "seed": 1921144918, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "startBinding": { + "elementId": "VlXyMPCdRQCg7m9ThEtTy", + "focus": 0.03561765500796156, + "gap": 8.44531250000091 + }, + "endBinding": { + "elementId": "MQERmG_TTHLhJwKfqehAr", + "focus": 0.7478290302818336, + "gap": 7.285692198557172 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 37.82667994643066, + -2.2924149685511566 + ] + ] + }, + { + "type": "text", + "version": 2314, + "versionNonce": 375345750, + "isDeleted": false, + "id": "e_TJfU5-f0tr0032g1I2m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1500.8747505666038, + "y": 1200.0338608147845, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 231, + "height": 40, + "seed": 865405462, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1082", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1082" + }, + { + "type": "rectangle", + "version": 1997, + "versionNonce": 447649686, + "isDeleted": false, + "id": "pWOj9caE7KB3XHDbMSg0S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2507.3467238219796, + "y": 243.6977036981849, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 1065365142, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1579, + "versionNonce": 517526730, + "isDeleted": false, + "id": "66Cg7L-YsfE3ZFXe-2LQL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2521.977350687726, + "y": 249.12090972109104, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 449850826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2372, + "versionNonce": 2002990294, + "isDeleted": false, + "id": "Wj8PWU5wnkz7U8lvblU3U", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2937.8376858023325, + "y": 241.03842966644868, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 1542056918, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2311, + "versionNonce": 188197770, + "isDeleted": false, + "id": "pRV42FOTjYkKJYnUgKb6l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2658.035296814221, + "y": 242.60981025674812, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 551281802, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1381, + "versionNonce": 638724630, + "isDeleted": false, + "id": "AERP1ARLHUZdaIQPJRCGu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.87205348929, + "y": 249.63272418872452, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 1453981974, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1508, + "versionNonce": 453880394, + "isDeleted": false, + "id": "MLAorr83tAGsrUS9fcYKo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2955.4040545000776, + "y": 249.7759533553924, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 1103283018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2455, + "versionNonce": 632321878, + "isDeleted": false, + "id": "dtTYmwaotDlgQQlg7Xbns", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.2839396929153, + "y": 582.7229795730589, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1127575126, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2634, + "versionNonce": 624283914, + "isDeleted": false, + "id": "jJiUXlgovk-ViFbfXi1cC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.2839396929153, + "y": 601.4969232999167, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1205848586, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2818, + "versionNonce": 1318263958, + "isDeleted": false, + "id": "cMfpU_9RWO_ldt64kULAL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.2839396929153, + "y": 620.2714026753663, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2120299414, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2699, + "versionNonce": 1831542730, + "isDeleted": false, + "id": "_hICWBWri3Vb4bKy89BKH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2779.177356413059, + "y": 582.8097007403203, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2049833162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2876, + "versionNonce": 644815318, + "isDeleted": false, + "id": "k3ijfVNOzI51IpN-U0f7n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2779.537858327686, + "y": 601.5836444671786, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 39997654, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3060, + "versionNonce": 252221066, + "isDeleted": false, + "id": "mczF970BUWR9dCA0Rfwlg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2779.4576300181716, + "y": 620.3581238426277, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 138956682, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2762, + "versionNonce": 878276374, + "isDeleted": false, + "id": "d6j-29IKQf4PU1W1Ckrs4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3017.6481595071805, + "y": 582.7849611569868, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 986564118, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2939, + "versionNonce": 1804154186, + "isDeleted": false, + "id": "gLPBiGV-Fpz3ohYs6CWCQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3018.0086614218076, + "y": 601.5589048838451, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1986645578, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3123, + "versionNonce": 1422335062, + "isDeleted": false, + "id": "ypRIUdLWGuoNWXQbMNQas", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3017.928433112293, + "y": 620.3333842592942, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1486394198, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4748, + "versionNonce": 336067594, + "isDeleted": false, + "id": "PaA6_N4i8mBfh6IWtJgsV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2365.6889869320585, + "y": 283.2747585173578, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 158168330, + "groupIds": [ + "LqyJbO82T9Tz_zh9FaXqX" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5427, + "versionNonce": 227352982, + "isDeleted": false, + "id": "Gw2eBgsuxsg2VlKRwbtKO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2363.745111370084, + "y": 282.2755847595116, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 639088790, + "groupIds": [ + "LqyJbO82T9Tz_zh9FaXqX" + ], + "roundness": null, + "boundElements": [ + { + "id": "_YjTxlDG87CIdOOLU9b08", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2524, + "versionNonce": 914352842, + "isDeleted": false, + "id": "p0DVISkFBiGtIIbd6AsVu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.4166494652964, + "y": 286.09706102849293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 852378570, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1466, + "versionNonce": 1642102486, + "isDeleted": false, + "id": "lWLTYQPIBBONW7KEC20Zq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 286.1218025694849, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1526740438, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1532, + "versionNonce": 160170378, + "isDeleted": false, + "id": "9dQM9xr4iE3Q8KkNb6ZjL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.2615554546933, + "y": 286.1218025694849, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2091334282, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1290, + "versionNonce": 643183638, + "isDeleted": false, + "id": "vTCSThHVsBtVi_-9zwayc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.5052449762684, + "y": 287.4637013712652, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1885801238, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1657, + "versionNonce": 946290762, + "isDeleted": false, + "id": "4RSGzIhqjwypztdfOZ-aM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2447.3916228699177, + "y": 288.4633336577359, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1974688074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1745, + "versionNonce": 1424179542, + "isDeleted": false, + "id": "DBDnsNNIqoGgZc53sz0pb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2564.2839396929153, + "y": 359.66779659721817, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1958819926, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1877, + "versionNonce": 1324132106, + "isDeleted": false, + "id": "NjY_7TWm_jNBkBoDggCU9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2564.2839396929153, + "y": 373.44762614267404, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 491626506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1886, + "versionNonce": 1625073302, + "isDeleted": false, + "id": "hsPFUyCfIdD25xowKMR3k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2564.2839396929153, + "y": 386.6170972965198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1608760726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1743, + "versionNonce": 630666698, + "isDeleted": false, + "id": "Ot7FznlQfCbvOnn6seKd5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.4225348315313, + "y": 358.43790585392685, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1332809418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1859, + "versionNonce": 183985110, + "isDeleted": false, + "id": "YXQ2Fs-Sn2aRlbFc2Xwfy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.7094666497114, + "y": 372.2177353993809, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1728289494, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1868, + "versionNonce": 1300360330, + "isDeleted": false, + "id": "fGKh6RPdkCWqrk6wlkhIY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.734406553559, + "y": 385.38720655322663, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 817407370, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1789, + "versionNonce": 893942038, + "isDeleted": false, + "id": "OdvaidDYe_wDJ5HegSRka", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.122149478681, + "y": 358.48691153574487, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1354092566, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1905, + "versionNonce": 2087177034, + "isDeleted": false, + "id": "6nkhaaiDymQFURub_drPm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.409081296863, + "y": 372.2667410811989, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 442459210, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1914, + "versionNonce": 927262294, + "isDeleted": false, + "id": "OupMWQIO8HkIzJP3F3gX1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.4340212007105, + "y": 385.43621223504465, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1223646550, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2634, + "versionNonce": 2024002058, + "isDeleted": false, + "id": "L5M1FEAdApBDgAPURIhNP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.589472738356, + "y": 318.32114460910725, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 104876810, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1616, + "versionNonce": 834775958, + "isDeleted": false, + "id": "wHvXC7k1v1lDEBUBOwnD2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 318.2714484285517, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 889537174, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1679, + "versionNonce": 87097546, + "isDeleted": false, + "id": "9stpsGPgDZRK48xEqx5go", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.5852322748647, + "y": 318.2714484285517, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2060868042, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1443, + "versionNonce": 1660143830, + "isDeleted": false, + "id": "Kfl__Y3G27Rg_DhKu9xyi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.8289217964398, + "y": 318.35813693933903, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 128745430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1803, + "versionNonce": 1303009162, + "isDeleted": false, + "id": "WOjhBbun-WrZaKsluuPm-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2447.715299690089, + "y": 320.5568638254855, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 2000457866, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3412, + "versionNonce": 2054176278, + "isDeleted": false, + "id": "6TycpKEFxVMASLkw0QA3d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.693119492263, + "y": 350.82394634562013, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 351933718, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlRGFFrc3VVyCZZcg8VsU", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2435, + "versionNonce": 1380636234, + "isDeleted": false, + "id": "GEzNqcYGjHLXojcholYji", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 350.8953439150647, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1596845898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "258.382", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2503, + "versionNonce": 1831603030, + "isDeleted": false, + "id": "t6rKejep6V0ALzUNP2_ss", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.771860209185, + "y": 350.8953439150647, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1717764694, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2246, + "versionNonce": 1408072970, + "isDeleted": false, + "id": "k1LLV6XmP8aiHepeNbCPH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2942.01554973076, + "y": 350.9820324258519, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1728411146, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2625, + "versionNonce": 1232875670, + "isDeleted": false, + "id": "_g_bU1RV-5EVKLLHtitbT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2446.9019276244094, + "y": 353.2522810317679, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 247220118, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3156, + "versionNonce": 1074613194, + "isDeleted": false, + "id": "Xh7_8qca1VJs2lw9dACUZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.180734744496, + "y": 414.38707857584336, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 2143167690, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2252, + "versionNonce": 185970134, + "isDeleted": false, + "id": "YacFD9jL89-waL0-M4IVW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 414.429158233472, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 2117788886, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2320, + "versionNonce": 482689674, + "isDeleted": false, + "id": "tH5ZVq3Qskxyz0i_VyHVg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.48358900191, + "y": 414.429158233472, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1123220362, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2068, + "versionNonce": 1863156502, + "isDeleted": false, + "id": "xfKKb37kmK-4DBrH_xGST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.727278523485, + "y": 414.5158467442592, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1450433046, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2431, + "versionNonce": 1959813450, + "isDeleted": false, + "id": "5Ld0zQneqRNaceeYMBS3x", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2419.6136564171347, + "y": 416.5748227784212, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 1591671370, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 5296, + "versionNonce": 1205383254, + "isDeleted": false, + "id": "qCOACf_-BqBXPXxg1DVFo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2365.3958095837284, + "y": 443.68894852965093, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1046226774, + "groupIds": [ + "WbhmfdmEQzI5ceP26x_NP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5975, + "versionNonce": 1133094922, + "isDeleted": false, + "id": "E45ogxhmy1byRnHG7lRjI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2363.451934021754, + "y": 442.68977477180454, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 39657738, + "groupIds": [ + "WbhmfdmEQzI5ceP26x_NP" + ], + "roundness": null, + "boundElements": [ + { + "id": "-04dLzEB2MhYPnVa6qYiw", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3268, + "versionNonce": 1363948950, + "isDeleted": false, + "id": "ojui0YA6_zg1L0giHfrSb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.742320286517, + "y": 445.94864327333767, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 910740630, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2356, + "versionNonce": 1626085066, + "isDeleted": false, + "id": "BwFh7s9wPF9O5-JfnrbQm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 446.09723521370427, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1223192522, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2423, + "versionNonce": 77402838, + "isDeleted": false, + "id": "cpneQfHnsrxTTw7d_G6NA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.2172759103782, + "y": 446.09723521370427, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1810811350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2171, + "versionNonce": 1838329226, + "isDeleted": false, + "id": "Wb6shCrHs1dxXj_6khnIa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.4609654319534, + "y": 446.1839237244916, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 647751306, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2522, + "versionNonce": 1818249238, + "isDeleted": false, + "id": "iXlbtlfx_VRhIhWjZGeRk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2418.3473433256013, + "y": 448.5809387315602, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 241377046, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3482, + "versionNonce": 1052273738, + "isDeleted": false, + "id": "p7gwyelhvWMyE3SgyViDY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.176571304038, + "y": 479.51641912090616, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 1412597066, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2499, + "versionNonce": 2022364502, + "isDeleted": false, + "id": "lS25rbCjdQfw2YvfibjSg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 478.73099454897823, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 572181590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2570, + "versionNonce": 1245205258, + "isDeleted": false, + "id": "NF1KXJK-5z5yDHE3wK9lz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.5409527305496, + "y": 478.73099454897823, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 990333962, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4344, + "versionNonce": 1383185046, + "isDeleted": false, + "id": "kt_dGcsR7ef7M6F49EQSp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.5633115130345, + "y": 509.8129061412071, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 1424675222, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hicqNte9JKDbcQ-UbMc4P", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3331, + "versionNonce": 311255498, + "isDeleted": false, + "id": "KjHJ8T8_-vsz0O8LndffR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2545.2839396929153, + "y": 509.4788997872706, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 1628781258, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3398, + "versionNonce": 818542550, + "isDeleted": false, + "id": "OXvqeLygwrPzAmx4GimdM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.727580664869, + "y": 509.4788997872706, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 1376267990, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3143, + "versionNonce": 315791498, + "isDeleted": false, + "id": "uXZFdanVAFIwAdvPMCerI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.971270186444, + "y": 509.5655882980577, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1425494410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2116, + "versionNonce": 732466454, + "isDeleted": false, + "id": "4ICG-etq8I2892YZ3mTVu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 518.2181313626324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 369615894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2236, + "versionNonce": 717420362, + "isDeleted": false, + "id": "q3VH05johldBe24_VZdbv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 531.9979609080883, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 434671690, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2245, + "versionNonce": 276986454, + "isDeleted": false, + "id": "dTA_h83l8unSmBf8DARz3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.2839396929153, + "y": 545.167432061934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1121907030, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2119, + "versionNonce": 179928586, + "isDeleted": false, + "id": "UUx9UnBRuuZIaSELgYEP8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.382078525153, + "y": 516.988240619341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 331609866, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2235, + "versionNonce": 908902294, + "isDeleted": false, + "id": "yCoN-rptdoaSKEIVeenX1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.669010343333, + "y": 530.7680701647951, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1944213142, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2244, + "versionNonce": 531705034, + "isDeleted": false, + "id": "ML-Xvh5mc0M9Uefhf1gHg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.6939502471805, + "y": 543.937541318641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1929676234, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2165, + "versionNonce": 1356618966, + "isDeleted": false, + "id": "szLD0TowT11CnzigHzKga", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.0816931723025, + "y": 517.037246301159, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 298259414, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2281, + "versionNonce": 2135229322, + "isDeleted": false, + "id": "OCMFfxPQQH7Iac3HyDTWi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.3686249904845, + "y": 530.8170758466131, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 549797002, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2290, + "versionNonce": 1176916502, + "isDeleted": false, + "id": "gX2_CEHworkrbQ7D6F8GN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.393564894332, + "y": 543.986547000459, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 648161558, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3585, + "versionNonce": 1404043850, + "isDeleted": false, + "id": "6dTmfGDapN_vOOxpfuX2v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.327049496445, + "y": 572.3062702195045, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 717298506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2629, + "versionNonce": 16752470, + "isDeleted": false, + "id": "wb--3FvQNraygmIX9r1qu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2535.2839396929153, + "y": 572.6032175455405, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 837326422, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2699, + "versionNonce": 1204627722, + "isDeleted": false, + "id": "ypnwujl6UjVWz_dFoP_ER", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.4431326955305, + "y": 572.6032175455405, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 793977354, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2444, + "versionNonce": 1170031766, + "isDeleted": false, + "id": "WZxkIggKKWAfSvLfzzLBI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.6868222171056, + "y": 572.6899060563278, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2087672726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2786, + "versionNonce": 1930917834, + "isDeleted": false, + "id": "wc744o3Sxw3002itW9wKH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2407.573200110757, + "y": 575.1251575438355, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 1232490698, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4924, + "versionNonce": 101990870, + "isDeleted": false, + "id": "nal558VBswtmh0fsQQ-SM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2365.3500030386635, + "y": 667.5013215389424, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1818982614, + "groupIds": [ + "7h8JcUbe6uzMUGYZd-4cZ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5603, + "versionNonce": 1168764554, + "isDeleted": false, + "id": "tDMAG6WJUKTBF5siocecU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2363.4061274766896, + "y": 666.5021477810963, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 2093328266, + "groupIds": [ + "7h8JcUbe6uzMUGYZd-4cZ" + ], + "roundness": null, + "boundElements": [ + { + "id": "PM05sS8aLlBRdIXcZwKbQ", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3950, + "versionNonce": 890869526, + "isDeleted": false, + "id": "L4Z2jH_7U6_rfqD8KxdCM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2502.1883021467283, + "y": 670.5470417181568, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 1500638742, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2886, + "versionNonce": 1950321994, + "isDeleted": false, + "id": "bmxIrKK4vj6-mniHV4rC5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 670.2837559977436, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 561784394, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 2954, + "versionNonce": 457327702, + "isDeleted": false, + "id": "ZrToI0TrtVt9kMn7qGNSd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2663.976930618951, + "y": 670.2837559977436, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1618459478, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2698, + "versionNonce": 1681085450, + "isDeleted": false, + "id": "AjUPqk8Da_o_UtGlGtKms", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.2206201405256, + "y": 670.3704445085307, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1349831946, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3010, + "versionNonce": 711149974, + "isDeleted": false, + "id": "4DQWOr6aIXh9VrCb9F4B5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2376.1069980341736, + "y": 672.040349758654, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 936501398, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 3959, + "versionNonce": 394281674, + "isDeleted": false, + "id": "4NDRPe58KxcR9OwKtyg84", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.0214022513933, + "y": 702.7139656130644, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 1328192458, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3029, + "versionNonce": 1370597078, + "isDeleted": false, + "id": "ye3n9ViOVdNowHg4ToOSK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 702.3785012582387, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 53829078, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3106, + "versionNonce": 415324554, + "isDeleted": false, + "id": "YzkJwHQaKNS4uRpRIxoAQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.3006074391224, + "y": 702.3785012582387, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2075693706, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2844, + "versionNonce": 1371692054, + "isDeleted": false, + "id": "WlXMnS8hjom5YoP3nAvsj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.544296960697, + "y": 702.4651897690258, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 666317590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4771, + "versionNonce": 1731303498, + "isDeleted": false, + "id": "b9Ma96rWblzVxxpmCWx2x", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2500.0155688133077, + "y": 734.8674784175614, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 953790794, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vU55N_-jUk6NTTBoCvPcl", + "type": "arrow" + } + ], + "updated": 1672163700914, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3852, + "versionNonce": 277506390, + "isDeleted": false, + "id": "-G4rQ16FDCrEv9jGWTjFu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 734.8177822370058, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 533487702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3925, + "versionNonce": 1655439114, + "isDeleted": false, + "id": "389SeaHiJkWVwkR0pDakl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2664.3885180759635, + "y": 734.8177822370058, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1508440074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700914, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3667, + "versionNonce": 1834929814, + "isDeleted": false, + "id": "c-m83xxuyfBPwUzmghk5b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2941.7309248950164, + "y": 734.9044707477931, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1330242966, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2643, + "versionNonce": 933989834, + "isDeleted": false, + "id": "32FplZcKqnjFXju2EZ1FX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.164440047356, + "y": 743.8116920389946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 249652938, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2759, + "versionNonce": 351570902, + "isDeleted": false, + "id": "ffZHT1qmW18EDOK8nGatL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.164440047356, + "y": 757.5915215844504, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1466221270, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2768, + "versionNonce": 1263223946, + "isDeleted": false, + "id": "rXzbuozFp3A41bgX8AecV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2563.164440047356, + "y": 770.7609927382962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1348337034, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2644, + "versionNonce": 1432396054, + "isDeleted": false, + "id": "790kshXeZMzXamnCCVUaW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.1417332337264, + "y": 742.5818012957034, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1790048278, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2759, + "versionNonce": 658907978, + "isDeleted": false, + "id": "m30ibOMGuMJB5yyLKvDaB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.341976541119, + "y": 756.2749423303701, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1268366410, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2768, + "versionNonce": 1914179158, + "isDeleted": false, + "id": "Ff9R2zjUljTPPVPwPkEO5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2781.3669164449666, + "y": 769.4444134842158, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 556172630, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2690, + "versionNonce": 1710696970, + "isDeleted": false, + "id": "AMFQ4PliEitPXY1sQqHj1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3018.841347880874, + "y": 742.6308069775214, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1315939082, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2805, + "versionNonce": 2012205974, + "isDeleted": false, + "id": "DEUAbTbsTJo9tVddYMGun", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.0415911882706, + "y": 756.3239480121881, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1276603030, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2814, + "versionNonce": 509171914, + "isDeleted": false, + "id": "UkDmB1iNHNOJj5MNm4fYC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3019.066531092118, + "y": 769.4934191660338, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 861581770, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4103, + "versionNonce": 287109334, + "isDeleted": false, + "id": "0sIwnhyibrNzAZCYtvjv1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2501.0303089618883, + "y": 798.4410865730092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1245292502, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2781, + "versionNonce": 1342680970, + "isDeleted": false, + "id": "axgtTftR1DFWrwfGTsNS1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2507.164440047356, + "y": 798.3614815931837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1299572874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 2941, + "versionNonce": 1496606230, + "isDeleted": false, + "id": "Y0qQiaxjpb74usFWOHNvs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2665.14384774988, + "y": 798.3614815931837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1537359126, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2662, + "versionNonce": 1329409610, + "isDeleted": false, + "id": "RlUnl-FH8d0tPyRufc7gd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2942.5974827248124, + "y": 798.3614815931837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1417430858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 2901, + "versionNonce": 824914774, + "isDeleted": false, + "id": "SXOVtYO90RmHS4Mvd_twC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2377.118867130689, + "y": 800.22248419735, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1975921238, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 1822, + "versionNonce": 819254538, + "isDeleted": false, + "id": "-40-8yAvmOGaO7N9VpPFw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2188.9664434973924, + "y": 293.60184225491594, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 1355337226, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "_YjTxlDG87CIdOOLU9b08", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1780, + "versionNonce": 324425878, + "isDeleted": false, + "id": "_YjTxlDG87CIdOOLU9b08", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 2318.446254500894, + "y": 314.5374756147203, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.73828125, + "height": 0.9079272975623098, + "seed": 393899926, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-40-8yAvmOGaO7N9VpPFw", + "focus": 0.12412743246042555, + "gap": 10.479811003501709 + }, + "endBinding": { + "elementId": "Gw2eBgsuxsg2VlKRwbtKO", + "focus": 0.6408863246638227, + "gap": 8.560575619190104 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.73828125, + -0.9079272975623098 + ] + ] + }, + { + "type": "text", + "version": 2536, + "versionNonce": 910795722, + "isDeleted": false, + "id": "YEOH1zgGsxDb7E2LcL8IA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2192.2509394957756, + "y": 446.7167404704105, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 123108554, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-04dLzEB2MhYPnVa6qYiw", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1726, + "versionNonce": 1735054806, + "isDeleted": false, + "id": "-04dLzEB2MhYPnVa6qYiw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 2319.8915644957765, + "y": 469.25004168826075, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 39.8359375, + "height": 1.008672810209191, + "seed": 485756118, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YEOH1zgGsxDb7E2LcL8IA", + "focus": 0.037566857262252715, + "gap": 8.64062500000091 + }, + "endBinding": { + "elementId": "E45ogxhmy1byRnHG7lRjI", + "focus": 0.45569078885697434, + "gap": 3.7244320259774213 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.8359375, + 1.008672810209191 + ] + ] + }, + { + "type": "text", + "version": 2815, + "versionNonce": 968268426, + "isDeleted": false, + "id": "Y9KxOYR3E59kj1hukW9io", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2186.8484428317006, + "y": 678.0131219945386, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 123, + "height": 40, + "seed": 1707103114, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "PM05sS8aLlBRdIXcZwKbQ", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1082\nwith 3937 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1082\nwith 3937 rows" + }, + { + "type": "arrow", + "version": 1464, + "versionNonce": 1451076374, + "isDeleted": false, + "id": "PM05sS8aLlBRdIXcZwKbQ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 2318.2937553317015, + "y": 694.6193209416601, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 37.82667994643066, + "height": 2.2924149685511566, + "seed": 331874838, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Y9KxOYR3E59kj1hukW9io", + "focus": 0.03561765500796531, + "gap": 8.44531250000091 + }, + "endBinding": { + "elementId": "tDMAG6WJUKTBF5siocecU", + "focus": 0.7478290302818332, + "gap": 7.285692198557399 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 37.82667994643066, + -2.2924149685511566 + ] + ] + }, + { + "type": "rectangle", + "version": 4498, + "versionNonce": 433502538, + "isDeleted": false, + "id": "fdy-50lmxNxu7hkQfN3YW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3281.83941706825, + "y": 373.16261314321514, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 253.11610243055577, + "seed": 1412657738, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vU55N_-jUk6NTTBoCvPcl", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3446, + "versionNonce": 520345686, + "isDeleted": false, + "id": "lsLjZQxTVRzodEv9JkDKL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3304.108134136772, + "y": 426.21518475779885, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 182.95714962121258, + "seed": 1353396054, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2909, + "versionNonce": 637861898, + "isDeleted": false, + "id": "Bi2qF4khGXVkg9kju39Yh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3332.6404987596147, + "y": 431.44361937882877, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 1180866826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3720, + "versionNonce": 1758616982, + "isDeleted": false, + "id": "GlbybtP_On5KGAdjGjONf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3452.873271234916, + "y": 424.83600724043663, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 183.92223011363598, + "seed": 964088982, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4575, + "versionNonce": 171732682, + "isDeleted": false, + "id": "yI6YLYqWrB2TXXIey4Lb9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3296.0149813043595, + "y": 466.0224813565983, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 1568597962, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2744, + "versionNonce": 421411542, + "isDeleted": false, + "id": "DdS2U6EZQGpfv306_ABg6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3356.881734776582, + "y": 469.5161287682158, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 68, + "height": 20, + "seed": 1813762518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "240.923", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 2847, + "versionNonce": 991430026, + "isDeleted": false, + "id": "sCFGX-236ejMqZ1datnXG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3455.924703526582, + "y": 468.2661287682158, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1369661066, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hkhoeNjFEoC21b0x7dDgo", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2705, + "versionNonce": 645689366, + "isDeleted": false, + "id": "O_JJJ2ygDlQH8PLhQARRq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3554.4485130503913, + "y": 431.86874533567516, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 330245910, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 2995, + "versionNonce": 1641202762, + "isDeleted": false, + "id": "UaXlA7ebrV89Unxrv6qop", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3362.553640917981, + "y": 509.990506254956, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 529202506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3111, + "versionNonce": 1826749782, + "isDeleted": false, + "id": "aWfqLTqx9KVfE2ieqoLDV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3362.840572736163, + "y": 523.7703358004119, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 816174166, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3120, + "versionNonce": 1212656394, + "isDeleted": false, + "id": "6uaGFybhLsxSmBGrUpIvl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3362.8655126400104, + "y": 536.9398069542576, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1955644426, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3082, + "versionNonce": 27517590, + "isDeleted": false, + "id": "LZFFvqJC5gQ7815X-mBfs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3574.9989943926325, + "y": 508.6739270008775, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1825888662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3198, + "versionNonce": 1156692426, + "isDeleted": false, + "id": "EL7VNVMBK49T6e_eOH3Gq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3575.2859262108127, + "y": 522.4537565463315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 447722186, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3207, + "versionNonce": 125247446, + "isDeleted": false, + "id": "LRyXlsOoALxApYV4hDiVl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3575.3108661146603, + "y": 535.6232277001773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1869690582, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4217, + "versionNonce": 652996746, + "isDeleted": false, + "id": "vUt5x25ixJXerhfpTOVmS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3296.459751874531, + "y": 498.7449177743474, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 1686292874, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8AhUM4jsXM6vQonhRP5Vn", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2896, + "versionNonce": 40940822, + "isDeleted": false, + "id": "WWKZt1ntiYKr5KTkj4nFO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3338.3304115967535, + "y": 499.60965893596494, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86, + "height": 20, + "seed": 823127062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2991, + "versionNonce": 569462602, + "isDeleted": false, + "id": "PjRm6Dkk6a3-XSs_XAyU8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3458.2483803467535, + "y": 499.2240853057558, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 20, + "seed": 423954506, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4113, + "versionNonce": 738566742, + "isDeleted": false, + "id": "Qfx40EWL_yJoAjymWKvzJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3297.4965608969037, + "y": 558.9103634730327, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 423.6151751893943, + "height": 21.2642440025254, + "seed": 1336277334, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3055, + "versionNonce": 979162634, + "isDeleted": false, + "id": "hXAIL6pFcCr0G_vfdQ5qV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3304.3672206191263, + "y": 560.5431392196315, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1624338186, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3162, + "versionNonce": 1191896982, + "isDeleted": false, + "id": "faWWPxWLgAgH2Fnzjlan9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3456.149615738917, + "y": 559.8175810360071, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1653104278, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "TyOVJdp7tv778ruJgy3Iv", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2975, + "versionNonce": 824804554, + "isDeleted": false, + "id": "6tN6iOxfRSwixeOm4WMUW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3455.1485533529726, + "y": 381.7831643584934, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 799210954, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2392, + "versionNonce": 1941275862, + "isDeleted": false, + "id": "guRf-DGiVFYAHaPXQuYGg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3189.8261327180458, + "y": 561.3018275529366, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 1315707862, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "vU55N_-jUk6NTTBoCvPcl", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2541, + "versionNonce": 1878154122, + "isDeleted": false, + "id": "otbmwMA9DieAcgaKiiwQ8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3218.8026952180458, + "y": 468.69454518686507, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 852800650, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlRGFFrc3VVyCZZcg8VsU", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2547, + "versionNonce": 60455446, + "isDeleted": false, + "id": "UnKL1QNuvNo22NWVnKgcF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3221.2480077180458, + "y": 502.04122487436507, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 426127638, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlRGFFrc3VVyCZZcg8VsU", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2334, + "versionNonce": 1962039882, + "isDeleted": false, + "id": "DJTD1dOn11IaXToM1h-sW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3777.4213551086164, + "y": 420.97677174936507, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 203, + "height": 40, + "seed": 1008833354, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "hkhoeNjFEoC21b0x7dDgo", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 0", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 0" + }, + { + "type": "arrow", + "version": 1114, + "versionNonce": 1303299926, + "isDeleted": false, + "id": "hkhoeNjFEoC21b0x7dDgo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3770.7190671621925, + "y": 449.9603487061768, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 48.41553489057196, + "height": 23.729966514004445, + "seed": 1055628886, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "DJTD1dOn11IaXToM1h-sW", + "focus": 0.6315527656085902, + "gap": 6.702287946423894 + }, + "endBinding": { + "elementId": "sCFGX-236ejMqZ1datnXG", + "focus": 0.875865929578657, + "gap": 11.37882874503839 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -48.41553489057196, + 23.729966514004445 + ] + ] + }, + { + "type": "arrow", + "version": 1056, + "versionNonce": 1057259786, + "isDeleted": false, + "id": "8AhUM4jsXM6vQonhRP5Vn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3794.4734157035423, + "y": 506.43706416279133, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 72.49159598081201, + "height": 0.9767917052906796, + "seed": 769956362, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Fob6PQcyHTpjDCWe_cAzs", + "focus": -0.0026555591700033686, + "gap": 1 + }, + "endBinding": { + "elementId": "vUt5x25ixJXerhfpTOVmS", + "focus": 0.09326585366049385, + "gap": 2.646949476986947 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -72.49159598081201, + 0.9767917052906796 + ] + ] + }, + { + "type": "arrow", + "version": 799, + "versionNonce": 38235286, + "isDeleted": false, + "id": "TyOVJdp7tv778ruJgy3Iv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3796.12384477162, + "y": 587.7104569552184, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 74.6171875, + "height": 14.890625, + "seed": 64054166, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "faWWPxWLgAgH2Fnzjlan9", + "focus": -0.6914733701556606, + "gap": 10.357041532703079 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -74.6171875, + -14.890625 + ] + ] + }, + { + "type": "text", + "version": 2336, + "versionNonce": 967036874, + "isDeleted": false, + "id": "Fob6PQcyHTpjDCWe_cAzs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3795.4734157035423, + "y": 485.046465751077, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 196, + "height": 40, + "seed": 1729677514, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8AhUM4jsXM6vQonhRP5Vn", + "type": "arrow" + } + ], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1" + }, + { + "type": "text", + "version": 2419, + "versionNonce": 2132371926, + "isDeleted": false, + "id": "QkSUhuBq3IJkHub-09Ab4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 3774.4430642764423, + "y": 571.7831140565827, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 231, + "height": 40, + "seed": 1246527702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "key column values \nof first row of granule 1082", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "key column values \nof first row of granule 1082" + }, + { + "type": "arrow", + "version": 529, + "versionNonce": 686507658, + "isDeleted": false, + "id": "vU55N_-jUk6NTTBoCvPcl", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3141.122983196827, + "y": 754.1871684878633, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 87.80580015746273, + "height": 164.10832427172465, + "seed": 531785238, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "b9Ma96rWblzVxxpmCWx2x", + "focus": 1.027785426680333, + "gap": 9.23713780407411 + }, + "endBinding": { + "elementId": "guRf-DGiVFYAHaPXQuYGg", + "focus": -0.15098585348692564, + "gap": 8.777016663202062 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 87.80580015746273, + -164.10832427172465 + ] + ] + }, + { + "type": "arrow", + "version": 453, + "versionNonce": 590987030, + "isDeleted": false, + "id": "hicqNte9JKDbcQ-UbMc4P", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3142.362019983864, + "y": 512.8125568107583, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 62.86609707639809, + "height": 0.7083324747919733, + "seed": 929881354, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kt_dGcsR7ef7M6F49EQSp", + "focus": -0.7803713931671208, + "gap": 8.360252613271996 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.86609707639809, + 0.7083324747919733 + ] + ] + }, + { + "type": "arrow", + "version": 546, + "versionNonce": 362145098, + "isDeleted": false, + "id": "OlRGFFrc3VVyCZZcg8VsU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3145.092160585339, + "y": 368.04004887401055, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 65.59221172581238, + "height": 88.44427935692812, + "seed": 274717514, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "startBinding": { + "elementId": "6TycpKEFxVMASLkw0QA3d", + "focus": -1.002715617808851, + "gap": 13.644565578390711 + }, + "endBinding": { + "elementId": "otbmwMA9DieAcgaKiiwQ8", + "focus": -0.554738507787712, + "gap": 12.210216955926398 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 65.59221172581238, + 88.44427935692812 + ] + ] + }, + { + "type": "text", + "version": 2349, + "versionNonce": 589130838, + "isDeleted": false, + "id": "yXMjDxyl8sGOd0hgO2xLT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.0006501169164, + "y": 1499.6077771985297, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 24904022, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2465, + "versionNonce": 956214282, + "isDeleted": false, + "id": "-QrwXjYMBBNdBaYqONhY7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.2875819350966, + "y": 1513.3876067439837, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1698686730, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2474, + "versionNonce": 1553559958, + "isDeleted": false, + "id": "SWRxX7CnLCkFGI79Kr-y6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1299.3125218389441, + "y": 1526.5570778978295, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2086495894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1763744458, + "isDeleted": false, + "id": "TGznz2D1iTZwx2y2kIton", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1087.365732888588, + "y": 1499.23864214908, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 717583562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2535, + "versionNonce": 719507158, + "isDeleted": false, + "id": "7N5H1VeOX4Hyzu6S278Fk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1087.652664706768, + "y": 1513.0184716945341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1712362710, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2544, + "versionNonce": 76984714, + "isDeleted": false, + "id": "t6iQ_8U3tMlfedALMboAJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1087.6776046106156, + "y": 1526.1879428483799, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 814762890, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672163700915, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/03-Using_multiple-primary_indexes.excalidraw b/docs/ja/guides/best-practices/images/03-Using_multiple-primary_indexes.excalidraw new file mode 100644 index 00000000000..70fd87be90b --- /dev/null +++ b/docs/ja/guides/best-practices/images/03-Using_multiple-primary_indexes.excalidraw @@ -0,0 +1,45782 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 6824, + "versionNonce": 2097790282, + "isDeleted": false, + "id": "5ZxJvUdKKFbADItwC72g7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 4764.519916255, + "y": 2712.2757953292135, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 286.53253069673764, + "height": 190.76982807013113, + "seed": 1249442682, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728655, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6986, + "versionNonce": 1609638934, + "isDeleted": false, + "id": "ehdSrK7xnucULy6jgHhg_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2112.814558997129, + "y": 2966.2789366615452, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 987625854, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7609, + "versionNonce": 775114826, + "isDeleted": false, + "id": "Nx7TcWB4qb3vzLoXkaJIV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2110.00161863388, + "y": 2966.3646123525123, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1698096482, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7123, + "versionNonce": 2107650390, + "isDeleted": false, + "id": "l_xBG63oCgTdNAh8m2ts9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2111.3718506638024, + "y": 2899.0445616615452, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1511922110, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7517, + "versionNonce": 1354151690, + "isDeleted": false, + "id": "S1Ur7AwT0czeXk2vw9QFT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2109.638337383888, + "y": 2834.48440401918, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1907878178, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6892, + "versionNonce": 1148950166, + "isDeleted": false, + "id": "FLB4RIJPYcbcCcuBHA7KY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2112.532006913805, + "y": 2834.398728328213, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 351285758, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4595, + "versionNonce": 60769738, + "isDeleted": false, + "id": "BhAK0DZ0qMav-BiUxZCEg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2173.2729479298796, + "y": 2798.1717317770435, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 123.92578124999996, + "height": 340.8218005952383, + "seed": 383939810, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3902, + "versionNonce": 2100843478, + "isDeleted": false, + "id": "a-RfaFs7S4ftHvSUUMcfu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2185.1369076771116, + "y": 2803.193553674859, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 25, + "seed": 374686270, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728702, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 5355, + "versionNonce": 1342700682, + "isDeleted": false, + "id": "hV4wi4lbEh7VbpXIyXxYH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2321.8033549143875, + "y": 2797.1666862041257, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 87.64195261437878, + "height": 342.412946428571, + "seed": 373655714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5291, + "versionNonce": 300640534, + "isDeleted": false, + "id": "XbPu9E6KM5z6iMuB7z3st", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.187252483831, + "y": 2839.858526481903, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 19810942, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4085, + "versionNonce": 1672207178, + "isDeleted": false, + "id": "s3wneKc5lBoFqCiGKBtEc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2226.2818705393865, + "y": 2840.5221549541257, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 663757922, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4134, + "versionNonce": 1644811862, + "isDeleted": false, + "id": "IWl8vz-ByuNiJugOk_tAC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2358.6881205393875, + "y": 2840.3528841207935, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1950108350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 3973, + "versionNonce": 2095440394, + "isDeleted": false, + "id": "AyAQhUVmdz9DpqLMYHooy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2331.2809404798627, + "y": 2804.494563188253, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 71, + "height": 25, + "seed": 881936418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "rectangle", + "version": 5205, + "versionNonce": 375954326, + "isDeleted": false, + "id": "odFU6CJ50br3KdGRwLkZT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.5109293040023, + "y": 2871.983306649652, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 236995326, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2R8FpSvMDNmt2sCccOp2b", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6026, + "versionNonce": 1454444746, + "isDeleted": false, + "id": "ABodgSp0HUfSFjyEvOP_J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.6975572383226, + "y": 2906.5732551059336, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 355988450, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4225, + "versionNonce": 1966913750, + "isDeleted": false, + "id": "9cN--cIWvFhTn4sKacIpc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.5769447229814, + "y": 2873.1093131572507, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1901802302, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4338, + "versionNonce": 346580874, + "isDeleted": false, + "id": "cuZ53R8xr2P8AilW8Tg9g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.5014238896492, + "y": 2907.6613964905846, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1267935138, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4255, + "versionNonce": 907750934, + "isDeleted": false, + "id": "SVZu2mftv_h3-eDreIuUI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.0248613896492, + "y": 2873.1119173239185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1213078398, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 4347, + "versionNonce": 788981322, + "isDeleted": false, + "id": "9zkrAsa-3t8WTEqcSk7hU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2352.6732988896492, + "y": 2906.5832714905846, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1070719842, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "rectangle", + "version": 5616, + "versionNonce": 1442380630, + "isDeleted": false, + "id": "smUZOSK4GQVuuHOVXv9sU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.27036005407, + "y": 2936.530794819577, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 1228536766, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4414, + "versionNonce": 1588038922, + "isDeleted": false, + "id": "j6t0W0M3uUCFSWQ8V8wRS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2226.2438843596246, + "y": 2937.1944232918013, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 2084775714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4460, + "versionNonce": 1797988502, + "isDeleted": false, + "id": "_sqoNYY4EYi2EdLRH1i0g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2355.1579468596265, + "y": 2937.0251524584673, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 977261566, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W3" + }, + { + "type": "rectangle", + "version": 5527, + "versionNonce": 151346122, + "isDeleted": false, + "id": "da1BMP8F8XNbA8-zPi1K0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.665268491888, + "y": 2968.534481237326, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1767240418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6353, + "versionNonce": 2036768214, + "isDeleted": false, + "id": "eNE335b2gsPO3ERqZ1R8r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2165.7806648085607, + "y": 3003.2455234436093, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 1969267774, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "1aFeMp86G_Vn7zhrHjFLZ", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4551, + "versionNonce": 742085258, + "isDeleted": false, + "id": "H-Q3l6mXJIhLSKYFLzx-w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.6600522932204, + "y": 2969.7815814949263, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 161040034, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4666, + "versionNonce": 1170240278, + "isDeleted": false, + "id": "KU0Q20pmKb2nr5rc1DtfT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2225.5845314598864, + "y": 3004.3336648282584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1820159102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4579, + "versionNonce": 1258582346, + "isDeleted": false, + "id": "tod1UqsN3yE_bNx1kBEC4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.7251564598864, + "y": 2969.7841856615923, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 901522018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W4" + }, + { + "type": "text", + "version": 4675, + "versionNonce": 716021846, + "isDeleted": false, + "id": "-MPdOPJHcTgdNM_HP3P1W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.2564064598882, + "y": 3003.2555398282584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 760687806, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W4" + }, + { + "type": "text", + "version": 4558, + "versionNonce": 1488697354, + "isDeleted": false, + "id": "BeJZDUFl4HlhFc7BnWZJW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2113.9636089770765, + "y": 2840.8657606825946, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 1485669922, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 4631, + "versionNonce": 1812145558, + "isDeleted": false, + "id": "rZIZ7LvjJ1G4VU14lV5-H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2115.2292339770765, + "y": 2873.20083012704, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 40, + "height": 20, + "seed": 1703863550, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "EIOF3EPTwu2X2yK4S4cFx", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "text", + "version": 4666, + "versionNonce": 626796234, + "isDeleted": false, + "id": "NKK6RmioR78Y_pA9JZVr2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.396768699299, + "y": 2904.845795404817, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 721187298, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "text", + "version": 4641, + "versionNonce": 183894742, + "isDeleted": false, + "id": "oWpXpnS_RUsFqvqPy71os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.0712478659652, + "y": 2937.0636773492624, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1722127678, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "gSdOMX7r_67h9iMy6uc_l", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 3", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 3" + }, + { + "type": "text", + "version": 4617, + "versionNonce": 1233173898, + "isDeleted": false, + "id": "xzgXiU63XHs6Jl3c_zOtL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.4792339770765, + "y": 2970.765934293706, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1880614306, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 4", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 4" + }, + { + "type": "text", + "version": 4621, + "versionNonce": 437991446, + "isDeleted": false, + "id": "orm-PSE4OCLXN_JmgLFI7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.3681228659652, + "y": 3003.986420404817, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 20, + "seed": 704396670, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "1dOOjUMqDLdFcktB-gRg8", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 5", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 5" + }, + { + "type": "rectangle", + "version": 7749, + "versionNonce": 308575306, + "isDeleted": false, + "id": "_Au7e5I2HkB5LrDuzf-J0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2108.4156811338853, + "y": 2899.130237352514, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 317, + "height": 58.68447577621506, + "seed": 823058786, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZoOy6zcVf_A308U8XrjDJ", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7162, + "versionNonce": 292013398, + "isDeleted": false, + "id": "AiKDcbGLX147-LvpMse_b", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2111.7258179313367, + "y": 3034.7298177808043, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1423171006, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7787, + "versionNonce": 1843553034, + "isDeleted": false, + "id": "aCiNrtIVoeEA8BwTfTrgF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2108.9128775680883, + "y": 3034.8154934717713, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 2033214754, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5703, + "versionNonce": 573614742, + "isDeleted": false, + "id": "IcOul4HQsS7ySIU51-tw8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2164.5765274260966, + "y": 3036.985362356585, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1011709438, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6536, + "versionNonce": 1450537418, + "isDeleted": false, + "id": "1xl2TUVEwjnnkCca2vEMW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2164.691923742769, + "y": 3071.6964045628683, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 300642530, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "c0fzQD_BcJb-2-zqdD-e3", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4726, + "versionNonce": 187361238, + "isDeleted": false, + "id": "BNt06YCT3AmmKRfScPR2M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.571311227429, + "y": 3038.2324626141854, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1768556094, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4846, + "versionNonce": 1060677770, + "isDeleted": false, + "id": "k4-OgUdfCRm-xRNHIkE3f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.495790394095, + "y": 3072.7845459475175, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1053754530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4757, + "versionNonce": 1818983702, + "isDeleted": false, + "id": "Q9zZqktZSMyORp-hAjiqd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2352.636415394095, + "y": 3038.2350667808514, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 487231102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W5", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W5" + }, + { + "type": "text", + "version": 4857, + "versionNonce": 2145847114, + "isDeleted": false, + "id": "MR1kuaRKWUKXjkH0JeXfN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2352.1676653940967, + "y": 3071.7064209475175, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 2039095394, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W6", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W6" + }, + { + "type": "text", + "version": 4795, + "versionNonce": 459762262, + "isDeleted": false, + "id": "mTUKZSRYWfRt2Vh-1vclf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2111.390492911284, + "y": 3039.216815412965, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1408241342, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 6", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 6" + }, + { + "type": "text", + "version": 4802, + "versionNonce": 1088130570, + "isDeleted": false, + "id": "5dmJNYXmkNOBvwYrSi_Sp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2111.279381800173, + "y": 3072.4373015240762, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 44, + "height": 20, + "seed": 770425890, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "OlCfen_-Yp9OwbDRJvDOx", + "type": "arrow" + } + ], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 7", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 7" + }, + { + "type": "text", + "version": 4924, + "versionNonce": 1995681686, + "isDeleted": false, + "id": "C3hyejITH6H86llsqbar-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2231.807843647889, + "y": 3084.5170900781086, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1253803774, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5042, + "versionNonce": 1729182922, + "isDeleted": false, + "id": "ahOGTNm7nz8kLX7e-Shdy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2232.094775466071, + "y": 3098.2969196235645, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1977806818, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5051, + "versionNonce": 994397398, + "isDeleted": false, + "id": "OFin0H5KyTNA5E37MVH96", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2232.1197153699186, + "y": 3111.46639077741, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 32372542, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5100, + "versionNonce": 2298762, + "isDeleted": false, + "id": "ILPEs9gDdQgBJGDqDSuPu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2364.2531971225408, + "y": 3083.20051082403, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1434362786, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5226, + "versionNonce": 1441874454, + "isDeleted": false, + "id": "W4Z9FVp6utADZ7oekh4TU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2364.540128940721, + "y": 3096.980340369484, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1105747838, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5235, + "versionNonce": 776737354, + "isDeleted": false, + "id": "AoQCz2UJrbKjv5sBo7miK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2364.5650688445685, + "y": 3110.14981152333, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1995300706, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728703, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 6215, + "versionNonce": 61641226, + "isDeleted": false, + "id": "ynToXztLDxXyPLG-ujgbg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2558.0833403183005, + "y": 2810.5035653893992, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 251.25889756944446, + "height": 263.3309461805559, + "seed": 1261123618, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5052, + "versionNonce": 1218767766, + "isDeleted": false, + "id": "eybtNOoKuhzwIYXCBKtSH", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2580.6645573868227, + "y": 2863.556137003983, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 197.2833214962126, + "seed": 979194622, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4415, + "versionNonce": 824295626, + "isDeleted": false, + "id": "Fl7yaLppSn2pwkhsSzomu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2609.1969220096653, + "y": 2868.633204437512, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 73, + "height": 25, + "seed": 588506082, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 5430, + "versionNonce": 997132502, + "isDeleted": false, + "id": "ER0hvl2LPDsBr8aEuGxbn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2729.4296944849666, + "y": 2862.05195948662, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 60.780841503267865, + "height": 199.05406605113606, + "seed": 863388478, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6282, + "versionNonce": 1032001418, + "isDeleted": false, + "id": "C3nI6jj5qV1pqyxs8KhRW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2572.57140455441, + "y": 2905.5323789152826, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 224.41844223484904, + "height": 19.07958491161571, + "seed": 410064802, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4343, + "versionNonce": 562265622, + "isDeleted": false, + "id": "PgPBBpU2WTlPXasE7yZjs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2740.0049363004423, + "y": 2869.0583303943586, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 42, + "height": 25, + "seed": 881273726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "rectangle", + "version": 5936, + "versionNonce": 1225496138, + "isDeleted": false, + "id": "_3ThBkVr5tP4Xuezzfc_U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2573.0161751245814, + "y": 2936.4930965830317, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 223.03527462121252, + "height": 20.091303661616152, + "seed": 460444514, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-HRw9-i3s1WFaEyOW7EY_", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5818, + "versionNonce": 1339509590, + "isDeleted": false, + "id": "7ieK5Yf5SDD18kN8divCI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2574.0529841469543, + "y": 2965.232761031717, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 1808862142, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "RmF54tXFilnBgKFYfzosl", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4578, + "versionNonce": 882261258, + "isDeleted": false, + "id": "MFRW6jrz-foZfaIBVrUat", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2633.704976603023, + "y": 2818.9727494171766, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 1046812450, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 4044, + "versionNonce": 884961430, + "isDeleted": false, + "id": "Phqzht_TtG0nTrcWog7XI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2495.3591184680954, + "y": 2906.0354974330494, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 393536510, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2R8FpSvMDNmt2sCccOp2b", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 4056, + "versionNonce": 228461514, + "isDeleted": false, + "id": "2hcFSCkVOGBNEpQpcLXFC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2494.8044309680954, + "y": 2937.2308099330494, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 50, + "height": 20, + "seed": 1908007650, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZoOy6zcVf_A308U8XrjDJ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 3880, + "versionNonce": 737209814, + "isDeleted": false, + "id": "sbGTFiedpGLLthzwL7fES", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.508393021666, + "y": 2906.0353656746174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 158577726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4038, + "versionNonce": 2050884234, + "isDeleted": false, + "id": "mq_M393rAjSAZFpPXuvTb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.770111771666, + "y": 2937.2580219246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1073690274, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4108, + "versionNonce": 1384170262, + "isDeleted": false, + "id": "g5nEAL53sxWgR2axnh8dF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.172455521666, + "y": 2967.3752094246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 732855422, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 3827, + "versionNonce": 623976778, + "isDeleted": false, + "id": "xMfa9QXvx72Y5GMARK1nv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.406830521667, + "y": 2906.3283344246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 165941858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 3967, + "versionNonce": 1524887638, + "isDeleted": false, + "id": "YnLYRGy_a4KeqkMWodF9D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2746.8130805216665, + "y": 2937.1877094246174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 65420478, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 4009, + "versionNonce": 701655050, + "isDeleted": false, + "id": "t1mZGeZaLC3ANp7QShc3F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.5787055216665, + "y": 2965.9338031746174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1110930978, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W4" + }, + { + "type": "text", + "version": 4134, + "versionNonce": 1626305942, + "isDeleted": false, + "id": "Y9lJE5Z43I5bRw5IDybo-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2490.649018021666, + "y": 2967.0822406746174, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 57, + "height": 20, + "seed": 935064830, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "1aFeMp86G_Vn7zhrHjFLZ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 2", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 2" + }, + { + "type": "text", + "version": 4763, + "versionNonce": 1889994, + "isDeleted": false, + "id": "3k_ag_aV8iba0OEmS0hLj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2842.0396430216715, + "y": 2904.2580219246174, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 122, + "height": 20, + "seed": 703095266, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "exclude granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "exclude granule" + }, + { + "type": "arrow", + "version": 8218, + "versionNonce": 1037587158, + "isDeleted": false, + "id": "FbY8kaSjKSSR9_mpWstIe", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2796.9035753133326, + "y": 2913.09300149931, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 42.593750000000455, + "height": 1.1352127296454455, + "seed": 280012094, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ER0hvl2LPDsBr8aEuGxbn", + "focus": -0.49308173705066843, + "gap": 6.693039325098198 + }, + "endBinding": { + "elementId": "3k_ag_aV8iba0OEmS0hLj", + "focus": -0.1421234942671109, + "gap": 2.542317708338487 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 42.593750000000455, + 1.1352127296454455 + ] + ] + }, + { + "type": "text", + "version": 4942, + "versionNonce": 1756065162, + "isDeleted": false, + "id": "JQiWAHQtr0Z586-dYZN76", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.0624075731903, + "y": 3009.311607958487, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 201708962, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5062, + "versionNonce": 1546881046, + "isDeleted": false, + "id": "IQZZAJVTw4HRhoiZHolI0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.3493393913723, + "y": 3023.091437503943, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2444670, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5071, + "versionNonce": 1488530506, + "isDeleted": false, + "id": "wub8r77wGyriwF_VS-avO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.37427929522, + "y": 3036.2609086577886, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2042548578, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5126, + "versionNonce": 200676694, + "isDeleted": false, + "id": "9ZJFeTmsZkMdRZu_gENRT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2758.5077610478425, + "y": 3007.9950287044085, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 593161662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5246, + "versionNonce": 1713443594, + "isDeleted": false, + "id": "EcPy_OO5GQvhC4pGietJT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2758.7946928660226, + "y": 3021.7748582498625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 107107618, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 5255, + "versionNonce": 1450506902, + "isDeleted": false, + "id": "Up3XH3RweoEltwU3Xe6FC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2758.81963276987, + "y": 3034.9443294037083, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1198687742, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5996, + "versionNonce": 861807050, + "isDeleted": false, + "id": "sCtxWGvWZnlQf-_rLbkNR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2574.005327552113, + "y": 2997.3642776765646, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 56582370, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "HbVWCD9Ywn6x7Uz6fTxNQ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4284, + "versionNonce": 1382365142, + "isDeleted": false, + "id": "lzz19Fp4n5X9u9cBZjB5A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.124798926825, + "y": 2999.648327631965, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1835865662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 4183, + "versionNonce": 1535858826, + "isDeleted": false, + "id": "8fpx0fBmfwjqP2nLqEzbB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.5310489268254, + "y": 2998.065319819465, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1011152034, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W5", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W5" + }, + { + "type": "text", + "version": 4309, + "versionNonce": 2010893590, + "isDeleted": false, + "id": "tWAtGodo4lkywsUJOvNib", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2491.601361426825, + "y": 2999.213757319465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 1311481470, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "c0fzQD_BcJb-2-zqdD-e3", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 3" + }, + { + "type": "text", + "version": 4884, + "versionNonce": 1583593290, + "isDeleted": false, + "id": "MSBvbyhLtOMrK4nXtfV0-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2841.7629503133358, + "y": 2935.9532181671766, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 851578978, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + }, + { + "id": "-HRw9-i3s1WFaEyOW7EY_", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "text", + "version": 4999, + "versionNonce": 1951251030, + "isDeleted": false, + "id": "U_kdR9a7Y4JT-7LY639rf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2842.1991482300036, + "y": 2965.4519160838445, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 122, + "height": 20, + "seed": 1584340670, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + }, + { + "id": "RmF54tXFilnBgKFYfzosl", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "exclude granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "exclude granule" + }, + { + "type": "arrow", + "version": 7173, + "versionNonce": 2123366294, + "isDeleted": false, + "id": "-HRw9-i3s1WFaEyOW7EY_", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2797.1379503133307, + "y": 2945.2891556671766, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 39.407552083333485, + "height": 2.12239583333303, + "seed": 1389926142, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "_3ThBkVr5tP4Xuezzfc_U", + "focus": -0.45566325229548293, + "gap": 1.0865005675370867 + }, + "endBinding": { + "elementId": "MSBvbyhLtOMrK4nXtfV0-", + "focus": -0.365346377370317, + "gap": 5.217447916671517 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.407552083333485, + 2.12239583333303 + ] + ] + }, + { + "type": "arrow", + "version": 7205, + "versionNonce": 1914825930, + "isDeleted": false, + "id": "RmF54tXFilnBgKFYfzosl", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2797.553576003016, + "y": 2973.161248532484, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 43.51536389365083, + "height": 2.7579643258513897, + "seed": 1440669666, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "7ieK5Yf5SDD18kN8divCI", + "focus": -0.5531776293254858, + "gap": 1 + }, + "endBinding": { + "elementId": "U_kdR9a7Y4JT-7LY639rf", + "focus": -0.3161215814063423, + "gap": 1.1302083333366681 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 43.51536389365083, + 2.7579643258513897 + ] + ] + }, + { + "type": "text", + "version": 4195, + "versionNonce": 86695766, + "isDeleted": false, + "id": "O90FfPdBOVpaNffUrmvFm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1983.77558034926, + "y": 2846.4430553853235, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 694341566, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 2 rows" + }, + { + "type": "text", + "version": 4286, + "versionNonce": 1593174282, + "isDeleted": false, + "id": "B_YGDnWOZFi_gF09kFHcp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1984.36151784926, + "y": 2912.7399303853235, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 784438050, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 2 rows" + }, + { + "type": "text", + "version": 4379, + "versionNonce": 578847894, + "isDeleted": false, + "id": "wPS1XXANdi_yeJFyUFhho", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1985.13886159926, + "y": 2975.4860241353235, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1177430014, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 2\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 2\nwith 2 rows" + }, + { + "type": "text", + "version": 4558, + "versionNonce": 656947146, + "isDeleted": false, + "id": "j2JRx4fO2D9-W3WRiWxfp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1983.87712946204, + "y": 3043.9369052545826, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 421977826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 3\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 3\nwith 2 rows" + }, + { + "type": "arrow", + "version": 632, + "versionNonce": 705484566, + "isDeleted": false, + "id": "gSdOMX7r_67h9iMy6uc_l", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2072.079439125594, + "y": 2930.562724925605, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.35850694444434, + "height": 0.5598958333334849, + "seed": 1815812926, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "oWpXpnS_RUsFqvqPy71os", + "focus": 1.499965817649534, + "gap": 5.941056590324024 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.35850694444434, + 0.5598958333334849 + ] + ] + }, + { + "type": "arrow", + "version": 627, + "versionNonce": 1797279050, + "isDeleted": false, + "id": "1dOOjUMqDLdFcktB-gRg8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2072.4396821811492, + "y": 2996.7389402033823, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 35.64670138888914, + "height": 0, + "seed": 1781906110, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "orm-PSE4OCLXN_JmgLFI7", + "focus": 1.7247480201434882, + "gap": 7.2474802014348825 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 35.64670138888914, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 626, + "versionNonce": 265126998, + "isDeleted": false, + "id": "OlCfen_-Yp9OwbDRJvDOx", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2069.813814125594, + "y": 3063.4490096478276, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 35.824652777777374, + "height": 0, + "seed": 1702784354, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "5dmJNYXmkNOBvwYrSi_Sp", + "focus": 1.89882918762487, + "gap": 8.988291876248695 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 35.824652777777374, + 0 + ] + ] + }, + { + "type": "text", + "version": 3376, + "versionNonce": 1803979158, + "isDeleted": false, + "id": "ycDjYz4VHBIH9n0EvKAsN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1981.069890514476, + "y": 2717.519322147822, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 340, + "height": 50, + "seed": 1048957694, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Searching for rows with URL = W3\nwhen UserID has low cardinality", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Searching for rows with URL = W3\nwhen UserID has low cardinality" + }, + { + "type": "rectangle", + "version": 6029, + "versionNonce": 320183318, + "isDeleted": false, + "id": "7UjVIYTTPuZqNHA_5jK1A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1966.4026813130877, + "y": 2705.095385515877, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1009.0225694444454, + "height": 452.9728732638886, + "seed": 394755198, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 397, + "versionNonce": 129128522, + "isDeleted": false, + "id": "EIOF3EPTwu2X2yK4S4cFx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2072.3928071811433, + "y": 2863.305780481156, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 33.916015625, + "height": 2.05078125, + "seed": 986478114, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "rZIZ7LvjJ1G4VU14lV5-H", + "focus": 1.4424947274438729, + "gap": 8.920411170933221 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 33.916015625, + 2.05078125 + ] + ] + }, + { + "type": "arrow", + "version": 354, + "versionNonce": 2014301142, + "isDeleted": false, + "id": "2R8FpSvMDNmt2sCccOp2b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2430.544592895429, + "y": 2867.911528249, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 62.75111607142867, + "height": 45.6640625, + "seed": 2086203070, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "odFU6CJ50br3KdGRwLkZT", + "focus": -1.125899389945349, + "gap": 12.01152817475986 + }, + "endBinding": { + "elementId": "Phqzht_TtG0nTrcWog7XI", + "focus": -0.6392384352629061, + "gap": 2.063409501237402 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.75111607142867, + 45.6640625 + ] + ] + }, + { + "type": "arrow", + "version": 348, + "versionNonce": 713294986, + "isDeleted": false, + "id": "ZoOy6zcVf_A308U8XrjDJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2428.0111107525718, + "y": 2932.1414389632864, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 62.24330357142867, + "height": 15.452008928570649, + "seed": 318118434, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "_Au7e5I2HkB5LrDuzf-J0", + "focus": -0.5287987231200575, + "gap": 2.5954296186864667 + }, + "endBinding": { + "elementId": "2hcFSCkVOGBNEpQpcLXFC", + "focus": -0.48641496639845494, + "gap": 5.550016644095194 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 62.24330357142867, + 15.452008928570649 + ] + ] + }, + { + "type": "arrow", + "version": 343, + "versionNonce": 856940822, + "isDeleted": false, + "id": "1aFeMp86G_Vn7zhrHjFLZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.428521466858, + "y": 2997.3758139632864, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 57.08147321428555, + "height": 15.965401785714675, + "seed": 985315902, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "eNE335b2gsPO3ERqZ1R8r", + "focus": 0.5354276161442509, + "gap": 10.196033741631027 + }, + "endBinding": { + "elementId": "Y9lJE5Z43I5bRw5IDybo-", + "focus": 0.27707474574018387, + "gap": 5.139023340522726 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 57.08147321428555, + -15.965401785714675 + ] + ] + }, + { + "type": "arrow", + "version": 308, + "versionNonce": 560390986, + "isDeleted": false, + "id": "c0fzQD_BcJb-2-zqdD-e3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.155083966858, + "y": 3061.728492534715, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 59.17410714285711, + "height": 45.25111607142844, + "seed": 908542718, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "1xl2TUVEwjnnkCca2vEMW", + "focus": 0.8195738091729939, + "gap": 11.011337307422536 + }, + "endBinding": { + "elementId": "tWAtGodo4lkywsUJOvNib", + "focus": 0.5300716069445183, + "gap": 3.272170317110067 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 59.17410714285711, + -45.25111607142844 + ] + ] + }, + { + "type": "text", + "version": 5055, + "versionNonce": 390731978, + "isDeleted": false, + "id": "YELLDPCdrutYZQMCgdceW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2840.2808280144764, + "y": 2998.6400748759925, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 122, + "height": 20, + "seed": 1538706402, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + }, + { + "id": "RmF54tXFilnBgKFYfzosl", + "type": "arrow" + }, + { + "id": "HbVWCD9Ywn6x7Uz6fTxNQ", + "type": "arrow" + } + ], + "updated": 1672253728704, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "exclude granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "exclude granule" + }, + { + "type": "arrow", + "version": 343, + "versionNonce": 1821913302, + "isDeleted": false, + "id": "HbVWCD9Ywn6x7Uz6fTxNQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2798.133258570032, + "y": 3005.818894320435, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 40.90711805555543, + "height": 2.6866319444443434, + "seed": 1675981374, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728704, + "link": null, + "locked": false, + "startBinding": { + "elementId": "sCtxWGvWZnlQf-_rLbkNR", + "focus": -0.5325546962262563, + "gap": 1.4971308285246323 + }, + "endBinding": { + "elementId": "YELLDPCdrutYZQMCgdceW", + "focus": -0.2805570161616386, + "gap": 1.2404513888886868 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 40.90711805555543, + 2.6866319444443434 + ] + ] + }, + { + "type": "text", + "version": 5198, + "versionNonce": 1363374986, + "isDeleted": false, + "id": "tBDjrw4HxMxjd_bx2aUzi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8119.168947300781, + "y": 5254.717566659101, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 426, + "height": 36, + "seed": 408330453, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728725, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by URL first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by URL first" + }, + { + "type": "text", + "version": 5119, + "versionNonce": 1837556246, + "isDeleted": false, + "id": "2v9cs9kzw6sMzKOlb6z0_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8100.538087925781, + "y": 3918.526160409101, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 470, + "height": 36, + "seed": 914375419, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728725, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by UserID first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by UserID first" + }, + { + "type": "rectangle", + "version": 6807, + "versionNonce": 1097315658, + "isDeleted": false, + "id": "-e444xpyLXFfuz2oDiix-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8063.220538541571, + "y": 3965.532050786069, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 167233109, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "2swlMAJG8K9dg3yX2zAP0", + "type": "arrow" + }, + { + "id": "8Soo57-vZQs3nl-5U7MtZ", + "type": "arrow" + } + ], + "updated": 1672253728730, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6565, + "versionNonce": 848983702, + "isDeleted": false, + "id": "dsGztSKtIczoHTUBcsYuL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8061.954080323045, + "y": 4648.26724958645, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 1404440731, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "C9Z-DlShPPwOi7jVOPEmD", + "type": "arrow" + }, + { + "id": "AS1siV7Lg1QtQEyT8lHwM", + "type": "arrow" + } + ], + "updated": 1672253728731, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4598, + "versionNonce": 2080005654, + "isDeleted": false, + "id": "ruMl8gNZmzBzapKmiFkbL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8197.972278373225, + "y": 3983.5373747200465, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 1269254235, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728732, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_UserID_URL table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_UserID_URL table" + }, + { + "type": "rectangle", + "version": 6470, + "versionNonce": 657404938, + "isDeleted": false, + "id": "0eKc-t9Ey7YPF7RyPIXpE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7627.9938401421405, + "y": 4213.769183770271, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 277.02836153542506, + "height": 92.61439970619708, + "seed": 1271189429, + "groupIds": [ + "pEEv72I7N_kh4iw8Mz-St" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3618, + "versionNonce": 227895702, + "isDeleted": false, + "id": "d7y1jhu63tRE5TlDGF-QL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7635.194789028617, + "y": 4221.5917658713315, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 264, + "height": 71, + "seed": 1534652955, + "groupIds": [ + "pEEv72I7N_kh4iw8Mz-St" + ], + "roundness": null, + "boundElements": [ + { + "id": "2swlMAJG8K9dg3yX2zAP0", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 28.28265871540131, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "rectangle", + "version": 6946, + "versionNonce": 1342186186, + "isDeleted": false, + "id": "98JkcLTIw6ZS5ERD7JCaD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7637.457660826665, + "y": 4892.013417401224, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 271.3671624420534, + "height": 93.76674345619676, + "seed": 1784353045, + "groupIds": [ + "DuTRDuPWR27yAXYXzrhOU" + ], + "roundness": null, + "boundElements": [ + { + "id": "C9Z-DlShPPwOi7jVOPEmD", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4042, + "versionNonce": 1235207894, + "isDeleted": false, + "id": "IaWdj7iRnoGUh073NKLgx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7661.755581446041, + "y": 4899.013822138759, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 223, + "height": 72, + "seed": 1231681211, + "groupIds": [ + "DuTRDuPWR27yAXYXzrhOU" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 28.63456236221491, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 62, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 3906, + "versionNonce": 1984248202, + "isDeleted": false, + "id": "PfwPRNgIoR94-ZLMxZXeu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7643.363432156031, + "y": 4557.073779456701, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 253, + "height": 101, + "seed": 1398941301, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "8Soo57-vZQs3nl-5U7MtZ", + "type": "arrow" + }, + { + "id": "AS1siV7Lg1QtQEyT8lHwM", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 26.6729166666667, + "fontFamily": 1, + "text": "Insert statements\n(need to be routed\nto both tables) ", + "baseline": 91, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements\n(need to be routed\nto both tables) " + }, + { + "type": "arrow", + "version": 261, + "versionNonce": 1726774294, + "isDeleted": false, + "id": "2swlMAJG8K9dg3yX2zAP0", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7912.146939767312, + "y": 4261.1586473882635, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 148.69140625, + "height": 0.322265625, + "seed": 1182208539, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "d7y1jhu63tRE5TlDGF-QL", + "focus": 0.127040771514781, + "gap": 12.730721244193319 + }, + "endBinding": { + "elementId": "-e444xpyLXFfuz2oDiix-", + "focus": 0.010937820565666832, + "gap": 2.382192524260063 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 148.69140625, + -0.322265625 + ] + ] + }, + { + "type": "arrow", + "version": 286, + "versionNonce": 691632202, + "isDeleted": false, + "id": "C9Z-DlShPPwOi7jVOPEmD", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7914.077278308978, + "y": 4942.411902596597, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 145.8203125, + "height": 1.6003988816937635, + "seed": 225160347, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "98JkcLTIw6ZS5ERD7JCaD", + "focus": 0.10349399757588981, + "gap": 5.25245504025952 + }, + "endBinding": { + "elementId": "dsGztSKtIczoHTUBcsYuL", + "focus": 0.027823366811839147, + "gap": 2.0564895140660155 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 145.8203125, + -1.6003988816937635 + ] + ] + }, + { + "type": "arrow", + "version": 276, + "versionNonce": 997230934, + "isDeleted": false, + "id": "8Soo57-vZQs3nl-5U7MtZ", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7904.480924142314, + "y": 4592.001746346599, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 157.87109375, + "height": 103.26822916666606, + "seed": 1619676539, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PfwPRNgIoR94-ZLMxZXeu", + "focus": 0.5509461109856089, + "gap": 8.587960736282184 + }, + "endBinding": { + "elementId": "-e444xpyLXFfuz2oDiix-", + "focus": -0.10976486703900913, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 157.87109375, + -103.26822916666606 + ] + ] + }, + { + "type": "arrow", + "version": 319, + "versionNonce": 1488445194, + "isDeleted": false, + "id": "AS1siV7Lg1QtQEyT8lHwM", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7905.075090808979, + "y": 4614.045281583165, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149.54906250000022, + "height": 83.82777694818833, + "seed": 408084027, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PfwPRNgIoR94-ZLMxZXeu", + "focus": -0.5710586997878563, + "gap": 8.711658652948245 + }, + "endBinding": { + "elementId": "dsGztSKtIczoHTUBcsYuL", + "focus": 0.21531842663100562, + "gap": 7.3299270140641966 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 149.54906250000022, + 83.82777694818833 + ] + ] + }, + { + "type": "text", + "version": 4970, + "versionNonce": 377548438, + "isDeleted": false, + "id": "1-_wN65ZhuvlbKg54HIXZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8206.74838744564, + "y": 4665.791008768891, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 1441203413, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728733, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_URL_UserID table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_URL_UserID table" + }, + { + "type": "rectangle", + "version": 6863, + "versionNonce": 1094413770, + "isDeleted": false, + "id": "twURJO4mwDfz2qy3VlyHF", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8052.859210416578, + "y": 5685.880413714487, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 350696411, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "TF119TH8IEW69RTU435SM", + "type": "arrow" + }, + { + "id": "WYIytTWhG_OaRo1gwIGj9", + "type": "arrow" + } + ], + "updated": 1672253728733, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6601, + "versionNonce": 1866874762, + "isDeleted": false, + "id": "pfTG3rJoJFk5gHtQIZ_7I", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8051.350564698052, + "y": 6368.793163401104, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 21041915, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ft4zSnsjdQySQToTkIjRp", + "type": "arrow" + }, + { + "id": "WYIytTWhG_OaRo1gwIGj9", + "type": "arrow" + } + ], + "updated": 1672253728734, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4652, + "versionNonce": 1466431818, + "isDeleted": false, + "id": "LTxujyBlZJbGLB-rrnT5h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8187.610950248232, + "y": 5703.885737648467, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 499285531, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728735, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_UserID_URL table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_UserID_URL table" + }, + { + "type": "rectangle", + "version": 6524, + "versionNonce": 726963978, + "isDeleted": false, + "id": "xJXztDrR-t32vxmsyHoH3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7617.632512017148, + "y": 5934.11754669869, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 277.02836153542506, + "height": 92.61439970619708, + "seed": 1304456693, + "groupIds": [ + "80CS_RqfnJ7t1mKpb64vf" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3673, + "versionNonce": 1395373718, + "isDeleted": false, + "id": "N1fWlp7o53vHgHG55h-7u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7624.833460903625, + "y": 5941.94012879975, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 264, + "height": 71, + "seed": 1060984795, + "groupIds": [ + "80CS_RqfnJ7t1mKpb64vf" + ], + "roundness": null, + "boundElements": [ + { + "id": "TF119TH8IEW69RTU435SM", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28.28265871540131, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "rectangle", + "version": 7003, + "versionNonce": 260122058, + "isDeleted": false, + "id": "kzcOys8pqIg83tQrhVcJg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7627.0963327016725, + "y": 6612.361780329644, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 271.3671624420534, + "height": 93.76674345619676, + "seed": 1607001941, + "groupIds": [ + "p-nQh4MCR8GmpIVoByvsA" + ], + "roundness": null, + "boundElements": [ + { + "id": "0oOhZTED1gVD6uv24_6pR", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4097, + "versionNonce": 14971862, + "isDeleted": false, + "id": "nJsp_t_x3SjjBMI2Qr3rW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7651.394253321048, + "y": 6619.362185067177, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 223, + "height": 72, + "seed": 186360955, + "groupIds": [ + "p-nQh4MCR8GmpIVoByvsA" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28.63456236221491, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 62, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 4062, + "versionNonce": 1152244874, + "isDeleted": false, + "id": "sw11QL3zMuxfZle_deumV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7627.3067915310385, + "y": 6160.8596423851195, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 248, + "height": 34, + "seed": 20657333, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rFhMfoT4Bkp7RpKR4TzNy", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 26.6729166666667, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 24, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 428, + "versionNonce": 185829654, + "isDeleted": false, + "id": "TF119TH8IEW69RTU435SM", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7901.785611642319, + "y": 5981.507010316684, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 148.69140625, + "height": 0.322265625, + "seed": 717708571, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "N1fWlp7o53vHgHG55h-7u", + "focus": 0.12704077151483206, + "gap": 12.730721244193319 + }, + "endBinding": { + "elementId": "twURJO4mwDfz2qy3VlyHF", + "focus": 0.010937820565660738, + "gap": 2.382192524260063 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 148.69140625, + -0.322265625 + ] + ] + }, + { + "type": "text", + "version": 5175, + "versionNonce": 1007205270, + "isDeleted": false, + "id": "3LIoa5FynBn0QKdFaxDmI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8250.644871820647, + "y": 6386.139371697311, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 181, + "height": 31, + "seed": 1090589275, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "implicit table 2", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "implicit table 2" + }, + { + "type": "rectangle", + "version": 6417, + "versionNonce": 1923281098, + "isDeleted": false, + "id": "x-p6jLxQf_c32SmEv6Evw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 7938.09578253202, + "y": 6370.817825837577, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 74.33017905392987, + "height": 599.9941431013729, + "seed": 973173755, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ft4zSnsjdQySQToTkIjRp", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 5055, + "versionNonce": 836294870, + "isDeleted": false, + "id": "rBpFzVKDKjaoecF8v8FSc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.562374043350375, + "x": 7732.59687836195, + "y": 6641.939436788496, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 483, + "height": 31, + "seed": 2013011253, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 24.27686099119398, + "fontFamily": 1, + "text": "mv_hits_URL_UserID materialized view", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "mv_hits_URL_UserID materialized view" + }, + { + "type": "arrow", + "version": 223, + "versionNonce": 536921674, + "isDeleted": false, + "id": "0oOhZTED1gVD6uv24_6pR", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7903.181630987556, + "y": 6656.916180870407, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 36.261160714285325, + "height": 0.6305803571422075, + "seed": 186603291, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kzcOys8pqIg83tQrhVcJg", + "focus": 0.0022868252753708296, + "gap": 4.718135843830169 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.261160714285325, + -0.6305803571422075 + ] + ] + }, + { + "type": "arrow", + "version": 302, + "versionNonce": 1913461590, + "isDeleted": false, + "id": "Ft4zSnsjdQySQToTkIjRp", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8016.04435420184, + "y": 6655.9731005132635, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 31.431919642857792, + "height": 0.7038480707151393, + "seed": 1806251547, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "x-p6jLxQf_c32SmEv6Evw", + "focus": -0.05237206736672402, + "gap": 3.618392615890116 + }, + "endBinding": { + "elementId": "pfTG3rJoJFk5gHtQIZ_7I", + "focus": 0.01349302486895752, + "gap": 3.874290853353159 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 31.431919642857792, + 0.7038480707151393 + ] + ] + }, + { + "type": "text", + "version": 5323, + "versionNonce": 1432710410, + "isDeleted": false, + "id": "L8UMcztoxcfdVF0DZCX10", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8085.0278921482695, + "y": 5643.515790245401, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 470, + "height": 36, + "seed": 1009489429, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by UserID first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by UserID first" + }, + { + "type": "text", + "version": 5374, + "versionNonce": 800800918, + "isDeleted": false, + "id": "allbUluIr3lSel0nIGzUc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8098.3169546482695, + "y": 6971.965008995401, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 426, + "height": 36, + "seed": 1371527701, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by URL first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by URL first" + }, + { + "type": "arrow", + "version": 244, + "versionNonce": 755448778, + "isDeleted": false, + "id": "rFhMfoT4Bkp7RpKR4TzNy", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7886.8716421482695, + "y": 6179.181805870401, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 166.884765625, + "height": 1.85546875, + "seed": 767279483, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": { + "elementId": "sw11QL3zMuxfZle_deumV", + "focus": 0.1539507484478187, + "gap": 11.564850617231059 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 166.884765625, + -1.85546875 + ] + ] + }, + { + "type": "arrow", + "version": 293, + "versionNonce": 1995619798, + "isDeleted": false, + "id": "WYIytTWhG_OaRo1gwIGj9", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8434.220631429085, + "y": 6280.814266224911, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.3696070222940762, + "height": 85.03746152049098, + "seed": 1836056571, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728736, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "pfTG3rJoJFk5gHtQIZ_7I", + "focus": 0.46320140713743546, + "gap": 2.941435655701298 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.3696070222940762, + 85.03746152049098 + ] + ] + }, + { + "type": "rectangle", + "version": 6948, + "versionNonce": 503029642, + "isDeleted": false, + "id": "Z_7e2g7YscsvJVGgJ3AqQ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8041.347443111283, + "y": 7232.943437226015, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 2143156469, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "v1AE_CoFKHPMf9WRkFt_J", + "type": "arrow" + }, + { + "id": "Bev9_Lln4zav5DCs11J-V", + "type": "arrow" + }, + { + "id": "KK3gr8mnCDr1zS5NiHoM2", + "type": "arrow" + } + ], + "updated": 1672253728736, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6682, + "versionNonce": 230775114, + "isDeleted": false, + "id": "hCNlVRkD-sfGtxuksHy9H", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8039.811223180199, + "y": 7916.134123222537, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 528.790329916914, + "height": 595.9835614109332, + "seed": 2006947797, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ewgb1B7fEL3BdjpW_cOHv", + "type": "arrow" + }, + { + "id": "KK3gr8mnCDr1zS5NiHoM2", + "type": "arrow" + } + ], + "updated": 1672253728738, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4731, + "versionNonce": 1787624202, + "isDeleted": false, + "id": "h-QfKMvHXxy7q2kvC9Va8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8175.829421230379, + "y": 7251.2266974699, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 295, + "height": 31, + "seed": 58387125, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728739, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hits_UserID_URL table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hits_UserID_URL table" + }, + { + "type": "rectangle", + "version": 6794, + "versionNonce": 1643104470, + "isDeleted": false, + "id": "eetdhKawBsuVyikGZtLQC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7605.8509829992945, + "y": 7368.4585065201245, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 277.02836153542506, + "height": 92.61439970619708, + "seed": 300277819, + "groupIds": [ + "YUkymRHYRKke4_IGeCvYh" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3946, + "versionNonce": 1282299786, + "isDeleted": false, + "id": "oTTY226Oi7p3vALeQ9CbC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7613.051931885771, + "y": 7376.281088621185, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 264, + "height": 71, + "seed": 1343460597, + "groupIds": [ + "YUkymRHYRKke4_IGeCvYh" + ], + "roundness": null, + "boundElements": [ + { + "id": "v1AE_CoFKHPMf9WRkFt_J", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28.28265871540131, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "rectangle", + "version": 7267, + "versionNonce": 971783702, + "isDeleted": false, + "id": "JCTMLk-mYcKjStD_24zPy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 7611.135116183819, + "y": 7668.666281817743, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 271.3671624420534, + "height": 93.76674345619676, + "seed": 475275483, + "groupIds": [ + "cHnyxUd3QHtwzViQE-LtO" + ], + "roundness": null, + "boundElements": [ + { + "id": "Ewgb1B7fEL3BdjpW_cOHv", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4360, + "versionNonce": 1485755978, + "isDeleted": false, + "id": "zJmWF62PQIyStRG7mvDe2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7635.433036803195, + "y": 7675.666686555276, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 223, + "height": 72, + "seed": 455028309, + "groupIds": [ + "cHnyxUd3QHtwzViQE-LtO" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28.63456236221491, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 62, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 4416, + "versionNonce": 1562905430, + "isDeleted": false, + "id": "X9VJ8NC7FRPpuEFFes6ix", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7615.115106263185, + "y": 7550.14461262322, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 248, + "height": 34, + "seed": 208751995, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Bev9_Lln4zav5DCs11J-V", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 26.6729166666667, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 24, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "text", + "version": 5244, + "versionNonce": 1509437590, + "isDeleted": false, + "id": "Ve6s-AV1UA3cwzjqTfw-c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8238.863342802793, + "y": 7933.480331518744, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 146, + "height": 31, + "seed": 629138971, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 24.27686099119399, + "fontFamily": 1, + "text": "hidden table", + "baseline": 22, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hidden table" + }, + { + "type": "text", + "version": 5403, + "versionNonce": 957636938, + "isDeleted": false, + "id": "LYNjmWQV_sVLjKZufR3Z5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8073.246363130416, + "y": 7190.856750066836, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 470, + "height": 36, + "seed": 1603197909, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by UserID first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by UserID first" + }, + { + "type": "text", + "version": 5454, + "versionNonce": 1507110998, + "isDeleted": false, + "id": "PMsztz095pgjXHe-PuC4p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8086.535425630416, + "y": 8519.305968816834, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 426, + "height": 36, + "seed": 1245526011, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "FbY8kaSjKSSR9_mpWstIe", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "rows are ordered by URL first", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "rows are ordered by URL first" + }, + { + "type": "text", + "version": 7407, + "versionNonce": 1680873162, + "isDeleted": false, + "id": "TYSZDzLSRzTAgt1ZTo-Dj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8448.771056210771, + "y": 7844.469194263265, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 337, + "height": 60, + "seed": 451914389, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 23.740985576923116, + "fontFamily": 1, + "text": "Data is automatically kept \nin sync with the hidden table", + "baseline": 51, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically kept \nin sync with the hidden table" + }, + { + "type": "arrow", + "version": 733, + "versionNonce": 1876707350, + "isDeleted": false, + "id": "Ewgb1B7fEL3BdjpW_cOHv", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7882.891452416132, + "y": 7716.0175573585, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 232.09635416666697, + "height": 197.2460937500009, + "seed": 256393269, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "JCTMLk-mYcKjStD_24zPy", + "focus": 0.018315066168853755, + "gap": 1 + }, + "endBinding": { + "elementId": "hCNlVRkD-sfGtxuksHy9H", + "focus": -0.6433915395529685, + "gap": 3.332711697369632 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 158.02083333333303, + -0.46223958333393966 + ], + [ + 226.27604166666697, + 46.60807291666697 + ], + [ + 232.09635416666697, + 196.78385416666697 + ] + ] + }, + { + "type": "arrow", + "version": 275, + "versionNonce": 1090284618, + "isDeleted": false, + "id": "v1AE_CoFKHPMf9WRkFt_J", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7886.628356254965, + "y": 7415.233589064104, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 151.90395162372624, + "height": 0.44369186711264774, + "seed": 280695387, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "oTTY226Oi7p3vALeQ9CbC", + "focus": 0.10567869992573134, + "gap": 9.576424369193319 + }, + "endBinding": { + "elementId": "Z_7e2g7YscsvJVGgJ3AqQ", + "focus": 0.39136505740374905, + "gap": 2.8151352325921835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 151.90395162372624, + -0.44369186711264774 + ] + ] + }, + { + "type": "arrow", + "version": 261, + "versionNonce": 747033942, + "isDeleted": false, + "id": "Bev9_Lln4zav5DCs11J-V", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 7869.134941999466, + "y": 7565.809224025168, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 171.2125011118178, + "height": 0.7914602852943062, + "seed": 1921260315, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "X9VJ8NC7FRPpuEFFes6ix", + "focus": -0.04638153040439678, + "gap": 6.019835736280584 + }, + "endBinding": { + "elementId": "Z_7e2g7YscsvJVGgJ3AqQ", + "focus": -0.10980672692889652, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 171.2125011118178, + -0.7914602852943062 + ] + ] + }, + { + "type": "text", + "version": 6790, + "versionNonce": 1677480714, + "isDeleted": false, + "id": "qTEEGX0PbmViwqq-MG-4e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 7690.224785749468, + "y": 7841.466776108502, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 402, + "height": 63, + "seed": 417310907, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 24.760416666666444, + "fontFamily": 1, + "text": "ClickHouse automatically choses \nthe most effective table version", + "baseline": 54, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse automatically choses \nthe most effective table version" + }, + { + "type": "arrow", + "version": 246, + "versionNonce": 653114006, + "isDeleted": false, + "id": "KK3gr8mnCDr1zS5NiHoM2", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8423.15707741613, + "y": 7835.245421941838, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 4.3359375, + "height": 74.65625, + "seed": 35349051, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Z_7e2g7YscsvJVGgJ3AqQ", + "focus": -0.35406380187828085, + "gap": 6.318423304890075 + }, + "endBinding": { + "elementId": "hCNlVRkD-sfGtxuksHy9H", + "focus": 0.5003709721725933, + "gap": 6.232451280699024 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 4.3359375, + 74.65625 + ] + ] + }, + { + "type": "text", + "version": 7435, + "versionNonce": 1406230986, + "isDeleted": false, + "id": "XRp-HuyTTq1kecRKcMBuY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8461.93832741613, + "y": 6295.018859441838, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 337, + "height": 60, + "seed": 46765717, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 23.740985576923116, + "fontFamily": 1, + "text": "Data is automatically kept \nin sync with the hidden table", + "baseline": 51, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically kept \nin sync with the hidden table" + }, + { + "type": "image", + "version": 162, + "versionNonce": 365295574, + "isDeleted": false, + "id": "Pch4taxj4RvusHnRQcTSx", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 9324.274292970846, + "y": 7284.873973078202, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 479.3451143451143, + "height": 809, + "seed": 819925371, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "status": "saved", + "fileId": "76f7965db97d0c2ccdf9386a266c1e3488b8ba3e5f45567dec96fcf5f9f279525ad39fee2918979a507aabbd12a9ed8d", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 436, + "versionNonce": 194418826, + "isDeleted": false, + "id": "ZtrzPPqnOPKIalBxb4FSg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 9381.965316052494, + "y": 7551.057211714564, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 419.8828124999997, + "height": 406.3906249999999, + "seed": 2012955605, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1452, + "versionNonce": 1822998422, + "isDeleted": false, + "id": "N6dIDN7vX4unxZ-bloMhX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9412.884073943902, + "y": 8029.262270111027, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 30151797, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1574, + "versionNonce": 1473797334, + "isDeleted": false, + "id": "Y5G1bq9UYKIrmMOVblHdx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9413.288903489356, + "y": 7961.527974025164, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 2005816277, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1569, + "versionNonce": 1980302218, + "isDeleted": false, + "id": "O-dA70_HJPyOEmmVviw7o", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9413.097142125722, + "y": 7457.387349025161, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 875206171, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1740, + "versionNonce": 228741654, + "isDeleted": false, + "id": "6Avt6AQUL25R0hZhfX7NX", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 40, + "angle": 0, + "x": 9413.651119398452, + "y": 7524.230388797885, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 26.712200126260473, + "seed": 538183221, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1750, + "versionNonce": 1374945866, + "isDeleted": false, + "id": "HFj52AfmdNVkOp4c60LxV", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.514755762086, + "y": 7894.372434252431, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 1523192475, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1882, + "versionNonce": 2029756246, + "isDeleted": false, + "id": "NxVkmmvhixkKmzHRNHOru", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.60353417118, + "y": 7827.486780843337, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 1672588085, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1842, + "versionNonce": 1569794314, + "isDeleted": false, + "id": "RuT_pknQ-MsLu5IYEFWrd", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.237767125724, + "y": 7727.243172888795, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 56.38549558080553, + "seed": 1030288213, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1887, + "versionNonce": 1580811414, + "isDeleted": false, + "id": "ZU2o3HvOBt_cifAgzMOgc", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9437.62484098936, + "y": 7792.238201297887, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 358.5199652777785, + "height": 26.712200126260473, + "seed": 368888283, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 445, + "versionNonce": 811300810, + "isDeleted": false, + "id": "Z7_nJRqDhZYSyLmTkdj6U", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9571.990455843254, + "y": 6562.79834236295, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 695.9854910714289, + "height": 94.3947933234529, + "seed": 935460955, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "status": "saved", + "fileId": "272da4c5523dd5f697196765350e6241b6e449522d5b653f0076f658fa6591ad739c21d038062715cb4daf0dd29467e5", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 903, + "versionNonce": 789594582, + "isDeleted": false, + "id": "jpqj16ml3jClhCgI_xRrt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 0, + "opacity": 20, + "angle": 0, + "x": 9607.611549593254, + "y": 6566.722153543549, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 659.828125000001, + "height": 30.473772321428363, + "seed": 59080283, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "e1a0kx3SZ5TALwhYSdmUF", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 768, + "versionNonce": 1586861846, + "isDeleted": false, + "id": "qFOLMNR2ZjoMXwRMK7yvs", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9825.342500785104, + "y": 6688.433091043546, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 433.9677868150695, + "height": 413.4375000000009, + "seed": 1135176411, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "status": "saved", + "fileId": "a39443537553a91afe6fdab1761775c30499581821e6b7c09836e0f5357eb9cde4f4f95904222e161a4e277879f13708", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 1974, + "versionNonce": 813927754, + "isDeleted": false, + "id": "yHDvEdfIrFFus9PHnxZ-y", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 20, + "angle": 0, + "x": 9827.465716259927, + "y": 6686.352315373901, + "strokeColor": "transparent", + "backgroundColor": "#ffc029", + "width": 433.71961805555475, + "height": 416.74707031249994, + "seed": 488733051, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "e1a0kx3SZ5TALwhYSdmUF", + "type": "arrow" + } + ], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 735, + "versionNonce": 893273174, + "isDeleted": false, + "id": "4JIRWad-5pcIerpc52Xci", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9324.470637824888, + "y": 8088.936129237984, + "strokeColor": "transparent", + "backgroundColor": "#ffffff", + "width": 479.7645399305556, + "height": 8.712022569443418, + "seed": 1986378907, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 1004, + "versionNonce": 2012697610, + "isDeleted": false, + "id": "VUE4b6afgqa4Z1O91JHuQ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9572.159352267992, + "y": 6652.239155747069, + "strokeColor": "transparent", + "backgroundColor": "#ffffff", + "width": 695.4787493322644, + "height": 6.232855902777367, + "seed": 1226314235, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 746, + "versionNonce": 314852042, + "isDeleted": false, + "id": "e1a0kx3SZ5TALwhYSdmUF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 10037.178754742521, + "y": 6598.057036976088, + "strokeColor": "#ffc029", + "backgroundColor": "#ffffff", + "width": 2.066973597152355, + "height": 86.82061826485824, + "seed": 1696479157, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "startBinding": { + "elementId": "jpqj16ml3jClhCgI_xRrt", + "focus": -0.3028865187706572, + "gap": 1 + }, + "endBinding": { + "elementId": "yHDvEdfIrFFus9PHnxZ-y", + "focus": -0.06405934507366456, + "gap": 1.474660132954341 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.066973597152355, + 86.82061826485824 + ] + ] + }, + { + "type": "rectangle", + "version": 2033, + "versionNonce": 481142486, + "isDeleted": false, + "id": "DtCxBD6yVKGI9wfd1jVZk", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9910.215828994393, + "y": 7040.61881547536, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 56.38549558080553, + "seed": 1247446651, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2142, + "versionNonce": 193288586, + "isDeleted": false, + "id": "FfFPhiiOOrjCyEyFJrKtY", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9910.044930556893, + "y": 6972.75260453786, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 56.38549558080553, + "seed": 1152923317, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2241, + "versionNonce": 1564367894, + "isDeleted": false, + "id": "CbW4WoxH_JrwIql0BfjXm", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9909.385750869393, + "y": 6871.05338578786, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 56.38549558080553, + "seed": 973968763, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2449, + "versionNonce": 1635096650, + "isDeleted": false, + "id": "T7jj_g3DXoJJMiMkGPHpw", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 9909.083993056893, + "y": 6934.91373735036, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 341.9476996527785, + "height": 28.924558080805543, + "seed": 1605045365, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5363, + "versionNonce": 1310374218, + "isDeleted": false, + "id": "EZjfEEEoSVPCynr5giBbv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 4626.687090016218, + "y": 2475.873001833646, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 574.1115434808286, + "height": 209.4985212519491, + "seed": 1876311162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4029, + "versionNonce": 1090508886, + "isDeleted": false, + "id": "Fw_XtYwjmSw6yYPdJokly", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4643.883552788515, + "y": 2519.889788848918, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 120.04052217913272, + "height": 151.42952949282065, + "seed": 1293246502, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3471, + "versionNonce": 835256330, + "isDeleted": false, + "id": "JH_cQIIkgQLjRR-d8U1t-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4670.240790878718, + "y": 2524.2172469246884, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 21, + "seed": 1099734330, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494137, + "fontFamily": 1, + "text": "granules", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules" + }, + { + "type": "rectangle", + "version": 4322, + "versionNonce": 1800297878, + "isDeleted": false, + "id": "Cm8vPeB7qvZsMiF3PPP0_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4784.483052721605, + "y": 2518.7482745491307, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 188.1717824359662, + "height": 152.22830497217703, + "seed": 1627548518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5504, + "versionNonce": 2105568970, + "isDeleted": false, + "id": "NUwdBWkmkrTKkGQRDCMv3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4636.543717970744, + "y": 2551.727618325574, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 551.9063917871771, + "height": 18.57679310887235, + "seed": 2000217594, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3324, + "versionNonce": 1813658326, + "isDeleted": false, + "id": "D2hDI5vsA7GuLHay0K3lv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4672.714650940634, + "y": 2554.366537412698, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 70, + "height": 17, + "seed": 1638665894, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995324, + "fontFamily": 1, + "text": "0, 1, 2, 3 ", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "0, 1, 2, 3 " + }, + { + "type": "text", + "version": 3384, + "versionNonce": 635176330, + "isDeleted": false, + "id": "VRI2yPOORBOAFH6C3apmp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4786.9096492260105, + "y": 2554.6944121140314, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 180, + "height": 17, + "seed": 1776162490, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "goal://22013/10/stremena...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://22013/10/stremena..." + }, + { + "type": "text", + "version": 3241, + "versionNonce": 972582934, + "isDeleted": false, + "id": "OZzl2hgo_VwNTPDKx76ZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4868.554602306207, + "y": 2524.5691141447096, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 24, + "height": 21, + "seed": 1002392038, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.55355145249415, + "fontFamily": 1, + "text": "min", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "min" + }, + { + "type": "text", + "version": 3537, + "versionNonce": 1410778186, + "isDeleted": false, + "id": "U5GL3hBTRIJjvkpHpmCiy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4699.908658626797, + "y": 2589.228743591547, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1511993210, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3653, + "versionNonce": 819854678, + "isDeleted": false, + "id": "UMpaAcbyriMuz62v8I2oS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4700.146145657573, + "y": 2600.633999460905, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1044978982, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3662, + "versionNonce": 1376496394, + "isDeleted": false, + "id": "TAJKuXkpFbA42F9gf3cyg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4700.166787856646, + "y": 2611.5340753782766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 2084515898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3616, + "versionNonce": 1713365654, + "isDeleted": false, + "id": "seW36Qa3GkXfD8L03Ynqg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4885.563774819813, + "y": 2588.139040470358, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1320585318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3732, + "versionNonce": 1983232458, + "isDeleted": false, + "id": "QHv5Q10bv9KgugcvuCKf4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4885.801261850598, + "y": 2599.5442963397254, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 69277946, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3741, + "versionNonce": 2087919574, + "isDeleted": false, + "id": "z1ZRxA6X0zalljDL0QG9U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4885.821904049675, + "y": 2610.4443722570813, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 483691430, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5055, + "versionNonce": 263188618, + "isDeleted": false, + "id": "t_5zaGsqy3Ck4s3T3R4q9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4637.077409689986, + "y": 2576.860386561766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 552.7450513303977, + "height": 20.1520926180047, + "seed": 826796474, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3528, + "versionNonce": 2012001558, + "isDeleted": false, + "id": "hraNZIjPgMoKUKjDL5N0l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4788.931909983894, + "y": 2581.257507260244, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 171, + "height": 17, + "seed": 1456482022, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995312, + "fontFamily": 1, + "text": "goal://auto.rg.ru/moskva...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://auto.rg.ru/moskva..." + }, + { + "type": "rectangle", + "version": 5026, + "versionNonce": 1379225418, + "isDeleted": false, + "id": "ratmuhEBZpvTrZkzw88v7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4639.510318120584, + "y": 2628.474379072063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 551.5885871464857, + "height": 20.07152876880092, + "seed": 1524015738, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3594, + "versionNonce": 302096982, + "isDeleted": false, + "id": "-IrSQgI079EJPFmDWa3nZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4648.544457945982, + "y": 2632.5589369072954, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 113, + "height": 17, + "seed": 1563843110, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "1080, 1081, 1082", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "1080, 1081, 1082" + }, + { + "type": "text", + "version": 3753, + "versionNonce": 226944918, + "isDeleted": false, + "id": "Khb_NYwOQQNpH4rWYq2cH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4800.394466498392, + "y": 2483.114402058014, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 260, + "height": 21, + "seed": 1995711846, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 16.55355145249416, + "fontFamily": 1, + "text": "skp_idx_url_skipping_index.idx2", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "skp_idx_url_skipping_index.idx2" + }, + { + "type": "text", + "version": 3427, + "versionNonce": 544048330, + "isDeleted": false, + "id": "t878vW0fE0tkKb14cBunt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4672.029837040707, + "y": 2579.5428632483063, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 71, + "height": 17, + "seed": 1037552634, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 13.242841161995324, + "fontFamily": 1, + "text": "4, 5, 6, 7 ", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "4, 5, 6, 7 " + }, + { + "type": "text", + "version": 3152, + "versionNonce": 179406038, + "isDeleted": false, + "id": "0jNnTUlpDHqjSZ3LQRIIp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4559.45471458458, + "y": 2552.9531908607014, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 60, + "height": 22, + "seed": 713078650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 0", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 3222, + "versionNonce": 1528199702, + "isDeleted": false, + "id": "LmfYXbu3WBr17MbXpQ2hW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4563.023373228718, + "y": 2579.224229558663, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 22, + "seed": 426580966, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 1", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 3267, + "versionNonce": 1664506442, + "isDeleted": false, + "id": "njooOnI2x3ijCXskfLXE2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4544.603266701602, + "y": 2631.456941169645, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 22, + "seed": 1948092538, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728740, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 271", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 271" + }, + { + "type": "rectangle", + "version": 5127, + "versionNonce": 1153990922, + "isDeleted": false, + "id": "glPTz_hjWNG0A9lDMTuz_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4911.131900857454, + "y": 2761.2230577975415, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.73313247461166, + "height": 122.34873768360643, + "seed": 585824698, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5076, + "versionNonce": 717450390, + "isDeleted": false, + "id": "Dn2cs5H_l-GYQug1e1mtu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4780.378775578767, + "y": 2761.5072575026747, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 114.96182565642971, + "height": 122.61305449408903, + "seed": 279320294, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6471, + "versionNonce": 1726468042, + "isDeleted": false, + "id": "t6o77gSFrXrKijoStYMia", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4772.871026863802, + "y": 2771.855899578434, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 268.9033265008711, + "height": 18.236732489293967, + "seed": 1167569530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4041, + "versionNonce": 940927446, + "isDeleted": false, + "id": "9Q-xZLkgEDmiw5T2L0yj1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4787.703940629022, + "y": 2773.4815994811547, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 19, + "seed": 1187924518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.842667860953062, + "fontFamily": 1, + "text": "block_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 4276, + "versionNonce": 229590666, + "isDeleted": false, + "id": "qtkr-R2fkuTnNOmpWbgGa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4834.596728398677, + "y": 2811.02833335081, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 196039482, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4392, + "versionNonce": 1555414806, + "isDeleted": false, + "id": "6xOANJvYvP6UMKdO9h7T3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4834.862905503429, + "y": 2823.8114229210482, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 1208882534, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4401, + "versionNonce": 1104799050, + "isDeleted": false, + "id": "KriGiFDI74REXgQrFkqat", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4834.88604142276, + "y": 2836.0283033111045, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 395631610, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4496, + "versionNonce": 1293511766, + "isDeleted": false, + "id": "pFsANL14D6q1Jax6WykUE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4971.738545271197, + "y": 2809.806986564504, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 2108848294, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4612, + "versionNonce": 1019390986, + "isDeleted": false, + "id": "Ks8JUS5QTEeiLsMlB-Xm6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4972.004722375945, + "y": 2822.5900761347375, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 1196117178, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4621, + "versionNonce": 1729458582, + "isDeleted": false, + "id": "dZIZMeUmHaTFExco9wgpD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4972.027858295278, + "y": 2834.806956524795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 24, + "seed": 526939110, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 18.553334826191342, + "fontFamily": 1, + "text": ".", + "baseline": 17, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5716, + "versionNonce": 1415879370, + "isDeleted": false, + "id": "EfuQ6jNHf3XBRzQlhzoQn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4773.283625729264, + "y": 2801.4085952589403, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 269.3964650954019, + "height": 19.27559192236466, + "seed": 1081451898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5655, + "versionNonce": 98488022, + "isDeleted": false, + "id": "_h2AEPhHPqFjBl0AwYWlY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 4774.179359773789, + "y": 2854.5242929212927, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 269.74075308853065, + "height": 21.365522990494803, + "seed": 1732052774, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4216, + "versionNonce": 697143638, + "isDeleted": false, + "id": "DNYqQ1E15zTpJZrZTggZ5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4914.3848981383835, + "y": 2770.882293434845, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 121, + "height": 19, + "seed": 191504314, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.84266786095307, + "fontFamily": 1, + "text": "granules_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules_offset" + }, + { + "type": "text", + "version": 4305, + "versionNonce": 751785738, + "isDeleted": false, + "id": "zVYJtDTsANgFAVTj5Wy8T", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4911.79643657019, + "y": 2801.051594184121, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 121, + "height": 19, + "seed": 1335120102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.84266786095307, + "fontFamily": 1, + "text": "granules_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules_offset" + }, + { + "type": "text", + "version": 4311, + "versionNonce": 1270675094, + "isDeleted": false, + "id": "5DrenLaY0MaBmvesQoSIH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4912.696251972668, + "y": 2855.974069497955, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 121, + "height": 19, + "seed": 1598167162, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.84266786095307, + "fontFamily": 1, + "text": "granules_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granules_offset" + }, + { + "type": "text", + "version": 4143, + "versionNonce": 329508298, + "isDeleted": false, + "id": "Rbg0ECJPtFhK1kNUYQLnN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4787.7804959059395, + "y": 2803.801341648017, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 19, + "seed": 1071989798, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.842667860953062, + "fontFamily": 1, + "text": "block_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 4158, + "versionNonce": 1431155670, + "isDeleted": false, + "id": "JZa5GvhMelVXlu2C0BS4X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4789.481502476632, + "y": 2858.6001849053396, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 19, + "seed": 253557050, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 14.842667860953062, + "fontFamily": 1, + "text": "block_offset", + "baseline": 13, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "block_offset" + }, + { + "type": "text", + "version": 4442, + "versionNonce": 1222924298, + "isDeleted": false, + "id": "h3EwxBTH1L5Z65GOxt9Oz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4694.396915823361, + "y": 2772.175586628996, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 60, + "height": 22, + "seed": 965343654, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 0", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 4535, + "versionNonce": 1748272534, + "isDeleted": false, + "id": "whUyRrP8BzVeEw5Jvpl55", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4698.068557422044, + "y": 2801.4721935087755, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 22, + "seed": 2003327930, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 1", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 4598, + "versionNonce": 1198573258, + "isDeleted": false, + "id": "UchKoSskYpqh4HsL9b0WD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4678.430411122202, + "y": 2855.658030119758, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 22, + "seed": 1453839590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.0059628180379, + "fontFamily": 1, + "text": "mark 271", + "baseline": 15, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 271" + }, + { + "type": "text", + "version": 4627, + "versionNonce": 972776150, + "isDeleted": false, + "id": "6y5kKJs6Dqk6tP3muFBIn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4775.373071088217, + "y": 2728.292917085145, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 270, + "height": 23, + "seed": 2086069818, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 17.819931517158327, + "fontFamily": 1, + "text": "skp_idx_url_skipping_index.mrk", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "skp_idx_url_skipping_index.mrk" + }, + { + "type": "rectangle", + "version": 4468, + "versionNonce": 89482, + "isDeleted": false, + "id": "AQEIO92grlV-EwQyoWn_o", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4985.584145928198, + "y": 2517.8373949463735, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 196.54580587346618, + "height": 152.22830497217703, + "seed": 1763633062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3546, + "versionNonce": 24418326, + "isDeleted": false, + "id": "hN_wI4OLb-eE3h1CCJ5WL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4988.010742432603, + "y": 2553.783532511274, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 190, + "height": 17, + "seed": 1784761786, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "https://wwwww.hurriyet.com/...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https://wwwww.hurriyet.com/..." + }, + { + "type": "text", + "version": 3405, + "versionNonce": 1875975242, + "isDeleted": false, + "id": "Jo4fWyt7nkDV4BukNFPbw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5069.655695512798, + "y": 2523.6582345419524, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 33, + "height": 21, + "seed": 1634665190, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.55355145249415, + "fontFamily": 1, + "text": "max", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "max" + }, + { + "type": "text", + "version": 3777, + "versionNonce": 110437718, + "isDeleted": false, + "id": "P4pxFD9XZU2D7av8jfGjJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5086.664868026406, + "y": 2587.2281608676008, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1931708026, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3893, + "versionNonce": 884671242, + "isDeleted": false, + "id": "Y9jeGZId6Gpy-B4hliG_t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5086.902355057189, + "y": 2598.6334167369682, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1738126886, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3902, + "versionNonce": 1253182102, + "isDeleted": false, + "id": "pQr7826QaOMf8ZrbYnSq4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5086.922997256266, + "y": 2609.533492654324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 21, + "seed": 1084270394, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16.553551452494144, + "fontFamily": 1, + "text": ".", + "baseline": 15, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3691, + "versionNonce": 2033848778, + "isDeleted": false, + "id": "7Ih08DGaAYAdc1tFLBrow", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4990.033003190487, + "y": 2580.346627657487, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 185, + "height": 17, + "seed": 344719718, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.242841161995312, + "fontFamily": 1, + "text": "https://yandex.ru/yandex.k...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https://yandex.ru/yandex.k..." + }, + { + "type": "text", + "version": 3848, + "versionNonce": 1551910870, + "isDeleted": false, + "id": "UFSmjp1fK0uPU2YLfgvS0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4988.40811404751, + "y": 2630.498505120336, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 185, + "height": 17, + "seed": 1262202874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.24284116199533, + "fontFamily": 1, + "text": "https://yandsearch?lr=65&...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https://yandsearch?lr=65&..." + }, + { + "type": "text", + "version": 3551, + "versionNonce": 1617512586, + "isDeleted": false, + "id": "XoRvQeHSWUywtc-7D6Okf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4786.503493945569, + "y": 2631.4737773880333, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 166, + "height": 17, + "seed": 744537530, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 13.242841161995322, + "fontFamily": 1, + "text": "goal://cars.auto.yandex...", + "baseline": 12, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://cars.auto.yandex..." + }, + { + "type": "rectangle", + "version": 6347, + "versionNonce": 739564822, + "isDeleted": false, + "id": "LAlitqCgryfRePyezvtKD", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4717.123839431744, + "y": 6886.177132753239, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 189.53819444444457, + "height": 65.4920038728636, + "seed": 1388526246, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZA4thJKPNw7H3CWK6qmss", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6381, + "versionNonce": 1912842058, + "isDeleted": false, + "id": "YffaJtBF5K1T4WsmiFJAY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4712.015580503174, + "y": 6736.7139631103855, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 196.21788194444466, + "height": 65.4920038728636, + "seed": 438282938, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6017, + "versionNonce": 1592052310, + "isDeleted": false, + "id": "1r43Bj6XLcqQ-XFO_f5xe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4718.6372322888865, + "y": 5321.225123824679, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 189.53819444444457, + "height": 65.4920038728636, + "seed": 1494283750, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "5YGvoDE58PCeFAbhdoGmz", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5815, + "versionNonce": 107228682, + "isDeleted": false, + "id": "eHphIrShW_-UDRvoO7Ypy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4710.64476577103, + "y": 5013.312921443729, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 195.89980158730228, + "height": 65.4920038728636, + "seed": 890127226, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5353, + "versionNonce": 600117142, + "isDeleted": false, + "id": "MdWZDPkelSEbwlzRyht_i", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5207.872836636801, + "y": 4977.569825347107, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 478497062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3591, + "versionNonce": 847633610, + "isDeleted": false, + "id": "k_J7rP92x8a_hsyU2aUg3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5223.709316671524, + "y": 4988.133285216232, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1345045562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5052, + "versionNonce": 116042966, + "isDeleted": false, + "id": "1d4R5EECHyhXWI4vOv-AU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5024.772400939687, + "y": 4927.355507438453, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 1821193318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3497, + "versionNonce": 872657802, + "isDeleted": false, + "id": "6pyBo-W6p4RmEWZNawpMt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5071.325828089794, + "y": 4939.793180334134, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 68, + "height": 25, + "seed": 1432038650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table 1", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table 1" + }, + { + "type": "rectangle", + "version": 5190, + "versionNonce": 1173004822, + "isDeleted": false, + "id": "GMq1kJ27BEai-yd8UBgYB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5212.839789063715, + "y": 5025.636912231577, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 586528678, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5262, + "versionNonce": 1561899594, + "isDeleted": false, + "id": "G1Saap_NERPjsf1dx46JD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5212.91190444833, + "y": 5040.6055119911925, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 2048884154, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5315, + "versionNonce": 599387990, + "isDeleted": false, + "id": "dMwDWrG3XlDqIIbI78TzS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5213.329572717562, + "y": 5057.453468721962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1475072742, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3530, + "versionNonce": 10475786, + "isDeleted": false, + "id": "Krd-uMV_0QWt3BNWjxdbV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5286.534600762431, + "y": 5056.386084596796, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1268495994, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3646, + "versionNonce": 1018008726, + "isDeleted": false, + "id": "ptnDERRJKvVZ7vQejeXFR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5286.821532580611, + "y": 5070.16591414225, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 368870950, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3655, + "versionNonce": 1578379210, + "isDeleted": false, + "id": "lr4AWmdoMY855SdgrpmTi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5286.846472484459, + "y": 5083.335385296095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 982701882, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5212, + "versionNonce": 1517982166, + "isDeleted": false, + "id": "Rf7e032SPaYOjtuHI1wAR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.809140025255, + "y": 5060.520527049357, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 236245350, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5284, + "versionNonce": 227581578, + "isDeleted": false, + "id": "B6GHi4N8cq2f15EqpHMI4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.8812554098695, + "y": 5075.489126808972, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 661118970, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5340, + "versionNonce": 1211492118, + "isDeleted": false, + "id": "wXR4Uczr_MUPJkpgpORoN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.298923679102, + "y": 5092.337083539742, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1266791590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3544, + "versionNonce": 1808809290, + "isDeleted": false, + "id": "1sMq6z7ZkoSEJRCz80iZ8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5098.503951723971, + "y": 5091.269699414574, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1847447738, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3660, + "versionNonce": 643077206, + "isDeleted": false, + "id": "ybCDCiRsLret0sjmXwlWv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5098.790883542151, + "y": 5105.049528960029, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1743794150, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3669, + "versionNonce": 103678986, + "isDeleted": false, + "id": "qoiubAVC7eR9b42UZSg-W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5098.815823445999, + "y": 5118.219000113873, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1918347642, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5336, + "versionNonce": 1051433366, + "isDeleted": false, + "id": "Cm4qHccRS_vB5vAbeOYlN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.289308294485, + "y": 5011.233759129776, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1064125222, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5408, + "versionNonce": 111473354, + "isDeleted": false, + "id": "Pp234yKhjNOpz_PIuQVmW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.3614236791, + "y": 5026.202358889392, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 727214650, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5467, + "versionNonce": 1483732694, + "isDeleted": false, + "id": "-WrAzdrn4asKMJg4ntry_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.779091948332, + "y": 5043.050315620161, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 610659942, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ivpUh5nfWVWUrUgAB2g2v", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5457, + "versionNonce": 533727626, + "isDeleted": false, + "id": "BC0vsLPFazAhCKSOhFqmA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.597301082948, + "y": 4979.179805861384, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 805507834, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5529, + "versionNonce": 204909590, + "isDeleted": false, + "id": "3VXf8qlOgPVs6WkHIgr5I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5030.669416467564, + "y": 4994.148405620999, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 329724326, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5647, + "versionNonce": 2028619850, + "isDeleted": false, + "id": "bZpJSz7lgKHUHpYh6nGWp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5209.0146760799125, + "y": 5292.019645058646, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 1121625018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3883, + "versionNonce": 401914198, + "isDeleted": false, + "id": "X1WR5AL4cr4r34tpg3Q0y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5225.867897186064, + "y": 5302.583104927771, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1750994150, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5350, + "versionNonce": 432975626, + "isDeleted": false, + "id": "0zIxRwoKAIBDyo5qs7IP0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5025.914240382797, + "y": 5241.805327149992, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 1577196666, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YPRe37mSkziXzuMT2QDAL", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3789, + "versionNonce": 855580310, + "isDeleted": false, + "id": "Cvs3bojJManol8p-wTlCP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5069.467667532905, + "y": 5254.024436057578, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 25, + "seed": 269975590, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table 2" + }, + { + "type": "rectangle", + "version": 5484, + "versionNonce": 1459109322, + "isDeleted": false, + "id": "VN8VJ9grJJsp7yZGfuHPy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5213.981628506826, + "y": 5340.086731943116, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1060928826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5556, + "versionNonce": 1644878806, + "isDeleted": false, + "id": "v82tcY7elmSAM5_ZYqLPo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5214.053743891441, + "y": 5355.055331702732, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1052805990, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5609, + "versionNonce": 1031926922, + "isDeleted": false, + "id": "Pg5dyBUXpmy3HU0ilPgxe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5214.471412160672, + "y": 5371.903288433501, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1944897018, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3824, + "versionNonce": 1261236502, + "isDeleted": false, + "id": "98nt9qVI2nY-Dg5jsi5iS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5287.676440205541, + "y": 5370.835904308335, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 581316262, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3940, + "versionNonce": 2133250890, + "isDeleted": false, + "id": "OQJ5OY5e230uv8orsxkjL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5287.963372023722, + "y": 5384.615733853789, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1695938234, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3949, + "versionNonce": 165305942, + "isDeleted": false, + "id": "g6C4lauzU6usffrhgkuNM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5287.988311927569, + "y": 5397.785205007634, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 410348006, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5506, + "versionNonce": 1581373962, + "isDeleted": false, + "id": "EStQ4RG89UnKVpJfoZwwR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.950979468365, + "y": 5374.970346760896, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1666912122, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5578, + "versionNonce": 48767894, + "isDeleted": false, + "id": "psXaM7_bfMep8A3LN_IPE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5032.023094852981, + "y": 5389.938946520511, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1597717798, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5631, + "versionNonce": 432933066, + "isDeleted": false, + "id": "BAv03uyO1eK-S8dKdz0wC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5032.440763122213, + "y": 5406.786903251281, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 855576634, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3838, + "versionNonce": 948650198, + "isDeleted": false, + "id": "ZMdl_Q6iIkPYxYYTowK6M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5099.645791167082, + "y": 5405.719519126113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1281665126, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3954, + "versionNonce": 1499881354, + "isDeleted": false, + "id": "7nAmA1UmaJv-_a4AIKheu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5099.932722985262, + "y": 5419.499348671568, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 400881914, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3963, + "versionNonce": 509130262, + "isDeleted": false, + "id": "BjpnokBLmhOHrWfgUjTNJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5099.95766288911, + "y": 5432.668819825412, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2143202214, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5630, + "versionNonce": 424009290, + "isDeleted": false, + "id": "SL38jWA2VOo8lHqmH289E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.431147737596, + "y": 5325.6835788413155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1636813242, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5702, + "versionNonce": 1833272150, + "isDeleted": false, + "id": "PRejrF9jNuuRo6zxQr95u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.503263122211, + "y": 5340.652178600931, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 393627366, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5761, + "versionNonce": 373785866, + "isDeleted": false, + "id": "Wmqus0uLs61cm6k19ksMF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.920931391443, + "y": 5357.5001353317, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1998750330, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "5YGvoDE58PCeFAbhdoGmz", + "type": "arrow" + } + ], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5751, + "versionNonce": 2007410838, + "isDeleted": false, + "id": "xnvdUC0l4PylvfPzxruWO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.739140526059, + "y": 5293.629625572923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1679325734, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5823, + "versionNonce": 971396042, + "isDeleted": false, + "id": "rUSEXSklj4q3yXijW3bfv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5031.811255910674, + "y": 5308.598225332538, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1667244858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2807, + "versionNonce": 2100372950, + "isDeleted": false, + "id": "WnLuqtvs94DN9SJdfunTP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5036.662591911906, + "y": 4868.960600587494, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 334, + "height": 50, + "seed": 479348070, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on UserID ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on UserID " + }, + { + "type": "text", + "version": 2905, + "versionNonce": 104680074, + "isDeleted": false, + "id": "YAaev0dZzgo9PGOVvqh1V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5046.175938266072, + "y": 5475.21320475416, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 303, + "height": 50, + "seed": 1621863418, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on URL ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on URL " + }, + { + "type": "text", + "version": 3836, + "versionNonce": 2130311958, + "isDeleted": false, + "id": "z4roqsMad3AywYxe7c-kd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5057.330343648019, + "y": 7264.175498590968, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 303, + "height": 50, + "seed": 305178790, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hidden table with primary index\noptimized for filtering on URL ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "hidden table with primary index\noptimized for filtering on URL " + }, + { + "type": "text", + "version": 6447, + "versionNonce": 34040138, + "isDeleted": false, + "id": "jgLZ4IFyCCw9GbBpfpJUt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4821.35477321151, + "y": 6961.354845069147, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 261, + "height": 40, + "seed": 1695030458, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse automatically choses \nthe most effective table version", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse automatically choses \nthe most effective table version" + }, + { + "type": "rectangle", + "version": 5695, + "versionNonce": 326510678, + "isDeleted": false, + "id": "H9-92dARAD-yU-G-kzREU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5211.823034632166, + "y": 6762.724974776669, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 1688249318, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728741, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3931, + "versionNonce": 614445066, + "isDeleted": false, + "id": "xjX0TvMQuASlXBesKaGE0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5228.659514666889, + "y": 6773.288434645794, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 773354874, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5423, + "versionNonce": 981118358, + "isDeleted": false, + "id": "8cgc9w6f-UhmPaby7LiOV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5028.722598935053, + "y": 6712.510656868017, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 904869670, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3847, + "versionNonce": 1107369674, + "isDeleted": false, + "id": "XTY7e8Y9Pgq9nEXrZqnc7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5080.27602608516, + "y": 6724.729765775603, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 25, + "seed": 1293923898, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table" + }, + { + "type": "rectangle", + "version": 5532, + "versionNonce": 826051286, + "isDeleted": false, + "id": "9O_m7kapNjWzk495xF7sF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5216.78998705908, + "y": 6810.792061661141, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1586061926, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5604, + "versionNonce": 1992734090, + "isDeleted": false, + "id": "qdCJEat5zfPIJ_YaygBV6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5216.862102443695, + "y": 6825.760661420754, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 855695098, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5657, + "versionNonce": 1179697174, + "isDeleted": false, + "id": "v9kThuT_1RwLZWYdJh5R_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5217.2797707129275, + "y": 6842.608618151524, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 557589926, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3872, + "versionNonce": 338392138, + "isDeleted": false, + "id": "InrkM6S2fYIeevqqsyPx8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5290.484798757797, + "y": 6841.541234026357, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1010757562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3988, + "versionNonce": 766266710, + "isDeleted": false, + "id": "mR67NC7dvys-Ocx9pVKHD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5290.771730575977, + "y": 6855.321063571813, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1597276390, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3997, + "versionNonce": 202005258, + "isDeleted": false, + "id": "j_521rMuc7ss2mjRBoPS6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5290.796670479825, + "y": 6868.490534725657, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1023207546, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5554, + "versionNonce": 1420046998, + "isDeleted": false, + "id": "OGZ0rmTBhLuxJ2XhSmX_W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.759338020621, + "y": 6845.675676478921, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1275032614, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5626, + "versionNonce": 1558079946, + "isDeleted": false, + "id": "PcyLwOcAd82NSRaC2rPwQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.831453405235, + "y": 6860.644276238534, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 217958714, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5679, + "versionNonce": 904753110, + "isDeleted": false, + "id": "Sn6OR2U2VX1sEh7j4jtex", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5035.2491216744675, + "y": 6877.492232969304, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 562691942, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3886, + "versionNonce": 2109907082, + "isDeleted": false, + "id": "ObTDWxkhGxQnvtAcCTo5H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5102.454149719337, + "y": 6876.424848844137, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 329552378, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4002, + "versionNonce": 765265174, + "isDeleted": false, + "id": "Gcr4Wd7aDS9IfjpPI6_sg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5102.741081537517, + "y": 6890.204678389591, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1411457702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4011, + "versionNonce": 1248984906, + "isDeleted": false, + "id": "Mh34Wvp_lWv2QF-NEzyzx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5102.7660214413645, + "y": 6903.374149543437, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1408516794, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5678, + "versionNonce": 1294463574, + "isDeleted": false, + "id": "vbMOrTfCcCzxN79jFsoby", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.23950628985, + "y": 6796.38890855934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1181867494, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5750, + "versionNonce": 1866958346, + "isDeleted": false, + "id": "ezF4F0qJ54blYFHpcOkhb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.311621674466, + "y": 6811.3575083189535, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 2022693754, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5808, + "versionNonce": 795031446, + "isDeleted": false, + "id": "AwO5g4fd338CZBjv2PilL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.729289943698, + "y": 6828.205465049723, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 2106143014, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BrO3BBILYAphiNG5IB4dO", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5799, + "versionNonce": 1430140106, + "isDeleted": false, + "id": "2Yjdgjaw1sn_iuEnaAGL6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.547499078314, + "y": 6764.334955290946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1606048826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5876, + "versionNonce": 1283708118, + "isDeleted": false, + "id": "jcChYC29vf5fyXnUh2EUd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5034.619614462929, + "y": 6779.303555050563, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1423187046, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rtZMNuAtAXbzldr7ItEr4", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5983, + "versionNonce": 233900938, + "isDeleted": false, + "id": "HwXdDaFmCWId70Jeh6GTC", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5212.964874075277, + "y": 7080.174794488208, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 659997946, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4218, + "versionNonce": 1310640662, + "isDeleted": false, + "id": "YoF5qPVhSTDsgzP1TK8pH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5229.622782681429, + "y": 7090.738254357333, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 840933286, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5683, + "versionNonce": 1067125322, + "isDeleted": false, + "id": "l7M0RdL4_C1h4nJItQSqS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5029.864438378163, + "y": 7029.960476579556, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 954734010, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4194, + "versionNonce": 1663637334, + "isDeleted": false, + "id": "iW5b2kmSijlyaaSk1nIuc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5049.41786552827, + "y": 7042.374897987142, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 120, + "height": 25, + "seed": 966310630, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ZA4thJKPNw7H3CWK6qmss", + "type": "arrow" + }, + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hidden table", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hidden table" + }, + { + "type": "rectangle", + "version": 5820, + "versionNonce": 286732554, + "isDeleted": false, + "id": "Gi029rIZB4NPSknEpVB2I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5217.931826502191, + "y": 7128.24188137268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1435586170, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5892, + "versionNonce": 335002774, + "isDeleted": false, + "id": "Sqeq26qPt7ATXx7h2s1MG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5218.003941886806, + "y": 7143.210481132293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 30174758, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5945, + "versionNonce": 367034314, + "isDeleted": false, + "id": "M5wMZO35nQ_DrutzLhizo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5218.421610156037, + "y": 7160.058437863063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 571830074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4160, + "versionNonce": 373275094, + "isDeleted": false, + "id": "6nGEbve45UR3dcCOUb5ys", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5291.626638200906, + "y": 7158.991053737896, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1202174310, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4276, + "versionNonce": 974255754, + "isDeleted": false, + "id": "L12TUJzaKTdrJPSKJcCrB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5291.913570019086, + "y": 7172.770883283352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 852981754, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4285, + "versionNonce": 555093782, + "isDeleted": false, + "id": "JsLbKQV-DNd3ibR-8ZH81", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5291.938509922934, + "y": 7185.940354437196, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 578264230, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5842, + "versionNonce": 778474826, + "isDeleted": false, + "id": "uhM58HqEFaqnYdzqia8gG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.901177463731, + "y": 7163.12549619046, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 400189626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5914, + "versionNonce": 1089453142, + "isDeleted": false, + "id": "QZ-WA8n8i4X_YHr5IcB1K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.973292848346, + "y": 7178.094095950073, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 938022886, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5967, + "versionNonce": 1413045258, + "isDeleted": false, + "id": "xHkflXD8fa8_fa_IjepEc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5036.390961117579, + "y": 7194.942052680843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1757495674, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4174, + "versionNonce": 732021142, + "isDeleted": false, + "id": "poJmGPIPSS1GZ8BzyvcFB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5103.595989162448, + "y": 7193.874668555676, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1879649062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4290, + "versionNonce": 696601290, + "isDeleted": false, + "id": "3VwxZauqDL2wukPV3uJlj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5103.882920980628, + "y": 7207.65449810113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1355743802, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4299, + "versionNonce": 341909206, + "isDeleted": false, + "id": "HbpOrR7LKW-D0XjUmFV7F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5103.907860884476, + "y": 7220.823969254976, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 692377190, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5966, + "versionNonce": 887447946, + "isDeleted": false, + "id": "XEJfSsiwXvfT6BISvXBK-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.381345732962, + "y": 7113.838728270879, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 451324666, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6038, + "versionNonce": 2143474710, + "isDeleted": false, + "id": "ci-QNFS2Oubbcw5fe1EgU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.453461117577, + "y": 7128.8073280304925, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1818827174, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6094, + "versionNonce": 1905565770, + "isDeleted": false, + "id": "Q8BXvttUcHsJNorvW3Fos", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.871129386809, + "y": 7145.655284761262, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1032534970, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6087, + "versionNonce": 398188886, + "isDeleted": false, + "id": "4cBNxbPV_Q7om5qvgFwod", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.689338521424, + "y": 7081.784775002485, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 547550438, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6159, + "versionNonce": 997066506, + "isDeleted": false, + "id": "h-9lPf5v9yxY-55UzfDKR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5035.76145390604, + "y": 7096.753374762102, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1725936762, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2727, + "versionNonce": 2141275798, + "isDeleted": false, + "id": "QnhXGIS1o6o8kW46TO5Iu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5037.854977407272, + "y": 6655.30455210039, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 334, + "height": 50, + "seed": 1065314342, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on UserID ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on UserID " + }, + { + "type": "text", + "version": 2953, + "versionNonce": 988583370, + "isDeleted": false, + "id": "knCJW9EkedIpL2EGasu9E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4715.080312646039, + "y": 5018.844637665867, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 188, + "height": 50, + "seed": 145167674, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ivpUh5nfWVWUrUgAB2g2v", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "text", + "version": 3113, + "versionNonce": 673711062, + "isDeleted": false, + "id": "a8yNE7MnBj2vetggnDZDs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4735.486190622229, + "y": 5326.114602943644, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 156, + "height": 50, + "seed": 149648230, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 3408, + "versionNonce": 1361792138, + "isDeleted": false, + "id": "GgUuZsspv3Y7w-9kvFsnp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4715.031701534932, + "y": 6740.879793915876, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 188, + "height": 50, + "seed": 1682202106, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "rtZMNuAtAXbzldr7ItEr4", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "text", + "version": 3527, + "versionNonce": 593828118, + "isDeleted": false, + "id": "nnZpsoyE7Rt169VhAEYFj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4734.924930701598, + "y": 6889.905835582542, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 156, + "height": 50, + "seed": 926160550, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "text", + "version": 3381, + "versionNonce": 65350474, + "isDeleted": false, + "id": "GxqNrQTVg8Rn5sTTShN3R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4713.37545153492, + "y": 5159.043298380158, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 190, + "height": 75, + "seed": 381324986, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "q9WkxkAiDiOyfybt6ABuP", + "type": "arrow" + }, + { + "id": "YPRe37mSkziXzuMT2QDAL", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert statements\n(need to be routed\nto both tables) ", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements\n(need to be routed\nto both tables) " + }, + { + "type": "text", + "version": 3847, + "versionNonce": 2026735190, + "isDeleted": false, + "id": "ir1pOdj2fKMP6hx9mMZKm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4720.86373278492, + "y": 6833.533067725393, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 187, + "height": 25, + "seed": 856052198, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BrO3BBILYAphiNG5IB4dO", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 722, + "versionNonce": 1769288202, + "isDeleted": false, + "id": "ivpUh5nfWVWUrUgAB2g2v", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4907.654097368249, + "y": 5045.85294209377, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 118.87834821428578, + "height": 0.11806745524609141, + "seed": 615294842, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "knCJW9EkedIpL2EGasu9E", + "focus": 0.07613332501017665, + "gap": 5.0737847222098935 + }, + "endBinding": { + "elementId": "-WrAzdrn4asKMJg4ntry_", + "focus": 0.32933805427905405, + "gap": 4.246646365797915 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 118.87834821428578, + 0.11806745524609141 + ] + ] + }, + { + "type": "arrow", + "version": 892, + "versionNonce": 2033601430, + "isDeleted": false, + "id": "5YGvoDE58PCeFAbhdoGmz", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4909.254543796819, + "y": 5354.3346794008285, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 117.09484857946109, + "height": 0.18038529274963366, + "seed": 1198466342, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "1r43Bj6XLcqQ-XFO_f5xe", + "focus": 0.015542030223939405, + "gap": 1.0791170634888658 + }, + "endBinding": { + "elementId": "Wmqus0uLs61cm6k19ksMF", + "focus": 1.7254661610668003, + "gap": 5.571539015163125 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 117.09484857946109, + -0.18038529274963366 + ] + ] + }, + { + "type": "arrow", + "version": 1439, + "versionNonce": 349593802, + "isDeleted": false, + "id": "rtZMNuAtAXbzldr7ItEr4", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4909.716597368252, + "y": 6769.83586134637, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 116.33534957931579, + "height": 0.04513131541943949, + "seed": 106801210, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "GgUuZsspv3Y7w-9kvFsnp", + "focus": 0.1595735658798593, + "gap": 7.184895833320297 + }, + "endBinding": { + "elementId": "jcChYC29vf5fyXnUh2EUd", + "focus": 3.097189479823459, + "gap": 9.512825019611682 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 116.33534957931579, + -0.04513131541943949 + ] + ] + }, + { + "type": "arrow", + "version": 1851, + "versionNonce": 315910358, + "isDeleted": false, + "id": "ZA4thJKPNw7H3CWK6qmss", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4909.934231296824, + "y": 6919.788238970294, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 185.43578360246693, + "height": 112.20982142857156, + "seed": 1440452710, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "LAlitqCgryfRePyezvtKD", + "focus": 0.08732103170904873, + "gap": 3.2721974206347113 + }, + "endBinding": { + "elementId": "iW5b2kmSijlyaaSk1nIuc", + "focus": -0.21080484532050084, + "gap": 13.412700797473008 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 136.64732142857156, + -3.035863209197032 + ], + [ + 181.11160714285734, + 20.970833219374526 + ], + [ + 185.43578360246693, + 109.17395821937453 + ] + ] + }, + { + "type": "arrow", + "version": 1460, + "versionNonce": 27506570, + "isDeleted": false, + "id": "BrO3BBILYAphiNG5IB4dO", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4917.263472368252, + "y": 6847.113728601762, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 114.3568193558458, + "height": 2.513077009440167, + "seed": 867209466, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "ir1pOdj2fKMP6hx9mMZKm", + "focus": 0.22978675597423878, + "gap": 9.89973958333212 + }, + "endBinding": { + "elementId": "AwO5g4fd338CZBjv2PilL", + "focus": -1.6534824753822683, + "gap": 7.378101630983565 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 114.3568193558458, + -2.513077009440167 + ] + ] + }, + { + "type": "arrow", + "version": 1357, + "versionNonce": 624746006, + "isDeleted": false, + "id": "a1HyqPD6QQTt6pbXbIYXq", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5153.7392713591935, + "y": 6940.865098975384, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1.803003594184247, + "height": 80.65830920237954, + "seed": 169382822, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fQQTRB6f9JAFiiAR4CF41", + "focus": 1.108065294804133, + "gap": 13.813449520963331 + }, + "endBinding": { + "focus": 0.581822592016921, + "gap": 8.437068401791521, + "elementId": "l7M0RdL4_C1h4nJItQSqS" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.803003594184247, + 80.65830920237954 + ] + ] + }, + { + "type": "rectangle", + "version": 5999, + "versionNonce": 1586762, + "isDeleted": false, + "id": "dhsCL-WWAogv32Mqm6WBU", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4716.861177804092, + "y": 6233.620972659004, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 189.53819444444457, + "height": 65.4920038728636, + "seed": 807952826, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "gw5xntt9h-7rsAez4s0Ml", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5838, + "versionNonce": 1432660822, + "isDeleted": false, + "id": "7iiH088Pasev93wHj4vXa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 40, + "angle": 0, + "x": 4709.868711286235, + "y": 5894.708770278052, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 195.89980158730228, + "height": 65.4920038728636, + "seed": 240332518, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5356, + "versionNonce": 554622218, + "isDeleted": false, + "id": "lFYRZqqGriUI3TzI2RxBj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5205.096782152008, + "y": 5882.965674181432, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 384309882, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3594, + "versionNonce": 1637929110, + "isDeleted": false, + "id": "x_1It5ZQiKdqe0t1v7HJP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5222.933262186731, + "y": 5893.5291340505555, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1058562598, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5059, + "versionNonce": 570600394, + "isDeleted": false, + "id": "j4GphQ4O53Yv2OLWnzcwu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 5021.996346454893, + "y": 5832.985731272778, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 649247546, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3510, + "versionNonce": 1973833174, + "isDeleted": false, + "id": "9d6pZ7VekDL_1Umh9ZhD2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5075.549773605, + "y": 5845.36760059703, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 53, + "height": 25, + "seed": 1599417702, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "table" + }, + { + "type": "rectangle", + "version": 5193, + "versionNonce": 1494131338, + "isDeleted": false, + "id": "Ug5-6jMlziPE7KlLZt7P5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5210.063734578922, + "y": 5931.032761065902, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1307263994, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5265, + "versionNonce": 2122982166, + "isDeleted": false, + "id": "9YWnbuASwPAi_zkmDMmAW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5210.135849963535, + "y": 5946.001360825518, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1280741542, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5318, + "versionNonce": 552452426, + "isDeleted": false, + "id": "qnE4bQlYfawMEGgh2OY18", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5210.553518232768, + "y": 5962.849317556287, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 915715258, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3533, + "versionNonce": 2126598230, + "isDeleted": false, + "id": "jDNpI0bUih9426fVx07o7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5283.758546277637, + "y": 5961.781933431119, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 835292134, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3649, + "versionNonce": 1157302282, + "isDeleted": false, + "id": "cGcqOwjor5ufmvAraQ7sQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5284.045478095817, + "y": 5975.561762976573, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1381109114, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3658, + "versionNonce": 1646318998, + "isDeleted": false, + "id": "JepxNViHCjsekmVEMp5Q2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5284.070417999665, + "y": 5988.731234130419, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1035673382, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5215, + "versionNonce": 1831958218, + "isDeleted": false, + "id": "QIWTwDFrgSwSHMMfez5CL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.033085540461, + "y": 5965.91637588368, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1717980730, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5287, + "versionNonce": 1373483734, + "isDeleted": false, + "id": "qwBKiClh-AlsLUCbcQuHM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.105200925076, + "y": 5980.884975643297, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1419266662, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5346, + "versionNonce": 170659210, + "isDeleted": false, + "id": "amuG-2Bi4eUTXQaPeeaqi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.522869194308, + "y": 5997.732932374067, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 397702906, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "_1LCD99pxoxMTc9Gv9tPw", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3547, + "versionNonce": 143452182, + "isDeleted": false, + "id": "r2ilPv2y3GVkc6nPKYViK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5095.727897239178, + "y": 5996.665548248899, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1160646054, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3663, + "versionNonce": 1092996170, + "isDeleted": false, + "id": "apxGn4YL5D_6BLm8vavQv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5096.014829057358, + "y": 6010.445377794353, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1992263610, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3672, + "versionNonce": 639858006, + "isDeleted": false, + "id": "bY8n13qkDp7fFAeYjsjW7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5096.0397689612055, + "y": 6023.614848948198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2091477222, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5339, + "versionNonce": 1475982090, + "isDeleted": false, + "id": "dN9FJXVy7W-pqH3-1Vrql", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.513253809691, + "y": 5916.6296079641, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 195723386, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5414, + "versionNonce": 66476694, + "isDeleted": false, + "id": "bd-leMKBGUVF9w9vSg7kO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.585369194307, + "y": 5931.598207723717, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 982998054, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ip87GtGCCgviSwQ-vUlo9", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5470, + "versionNonce": 555925962, + "isDeleted": false, + "id": "B9DSJ_woMyRj5DDF275W9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5028.003037463539, + "y": 5948.4461644544845, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1647862074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5460, + "versionNonce": 146446294, + "isDeleted": false, + "id": "BXCgf1G14uSA0AxcNqwLD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.821246598154, + "y": 5884.575654695709, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1155852134, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5532, + "versionNonce": 1740372106, + "isDeleted": false, + "id": "-DMZZU1w-QHjPpCiENkB6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5027.893361982769, + "y": 5899.544254455324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 365701626, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5849, + "versionNonce": 2089102614, + "isDeleted": false, + "id": "uqcmhOPyyQ5qJ1PXWPfh1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5208.238621595119, + "y": 6201.415493892971, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.9249131944446, + "height": 135.7498163728636, + "seed": 467602086, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4083, + "versionNonce": 1535137610, + "isDeleted": false, + "id": "vpB42ooStFglhTsSSNgnp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5227.075101629842, + "y": 6211.9789537620945, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 126, + "height": 25, + "seed": 1567152826, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary index", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary index" + }, + { + "type": "rectangle", + "version": 5551, + "versionNonce": 1556814422, + "isDeleted": false, + "id": "90jMqh8wwpPQdUx4XqPSt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 5025.138185898004, + "y": 6151.201175984317, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 160.4799011752141, + "height": 226.56336805555574, + "seed": 775079398, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4060, + "versionNonce": 2093669898, + "isDeleted": false, + "id": "PfztNZLH6JXrlH0SXGzSv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.691613048111, + "y": 6163.420284891903, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 150, + "height": 25, + "seed": 397505402, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "implicit table 2", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "implicit table 2" + }, + { + "type": "rectangle", + "version": 5686, + "versionNonce": 811687830, + "isDeleted": false, + "id": "yeornJi9LN5bM4-uKWVj1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5213.205574022033, + "y": 6249.482580777441, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 216865062, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5759, + "versionNonce": 144084170, + "isDeleted": false, + "id": "nxk7EvK1h3kQ3BjzKFgJ1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5213.5589394066465, + "y": 6265.302743037057, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1458107450, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5811, + "versionNonce": 1534917846, + "isDeleted": false, + "id": "1T-TD8047KdDHWcyMbBGP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5213.695357675879, + "y": 6281.299137267826, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 528155750, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4026, + "versionNonce": 1686004618, + "isDeleted": false, + "id": "-5QQ-Qz6Z3_KDrdT2j0Sb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5286.900385720748, + "y": 6280.231753142658, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1827822842, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4142, + "versionNonce": 1941107222, + "isDeleted": false, + "id": "MaU_kjWk8T7JULQy2mUMu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5287.187317538928, + "y": 6294.011582688112, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1470728102, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4151, + "versionNonce": 180183626, + "isDeleted": false, + "id": "u6E86cflJSTgLupHLb5EM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5287.212257442776, + "y": 6307.181053841958, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2001776058, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5708, + "versionNonce": 335036246, + "isDeleted": false, + "id": "KBaBMm86mJ7A-qq0YhMsB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.174924983572, + "y": 6284.366195595219, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1705353958, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5780, + "versionNonce": 1982761226, + "isDeleted": false, + "id": "IB6DxVd2Yzsi-oOs3fid7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.247040368187, + "y": 6299.334795354836, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1797711482, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5833, + "versionNonce": 815916182, + "isDeleted": false, + "id": "XCU17JiK2OeNwhGfV8QGW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.66470863742, + "y": 6316.182752085606, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1811699238, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4040, + "versionNonce": 239917002, + "isDeleted": false, + "id": "sjJcIPPkr0b9MSWJwew5H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5098.869736682289, + "y": 6315.115367960438, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 557319994, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4156, + "versionNonce": 1801773526, + "isDeleted": false, + "id": "5h-dG2Jx_c5dAtdr4M_m-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5099.156668500469, + "y": 6328.895197505892, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 865771878, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4165, + "versionNonce": 322129546, + "isDeleted": false, + "id": "rOYRrV6ng7KV7c9pWWCOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5099.181608404317, + "y": 6342.064668659737, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1642532858, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5832, + "versionNonce": 1733703446, + "isDeleted": false, + "id": "fr65sy7nU8d9ngUOtXrTG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5030.6550932528025, + "y": 6235.079427675639, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1607304358, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5904, + "versionNonce": 161279306, + "isDeleted": false, + "id": "0nLNN0XFcmW_9ZA1qf5dm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5030.727208637418, + "y": 6250.048027435256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1899430074, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5965, + "versionNonce": 485155926, + "isDeleted": false, + "id": "LsWUbnyYTmZ6nClojEWer", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.14487690665, + "y": 6266.8959841660235, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 574750694, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Urj7GRImtQ-_jf8kXKei0", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5955, + "versionNonce": 652522506, + "isDeleted": false, + "id": "sOemb4C3A2lmqcofw2qk3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5030.963086041265, + "y": 6203.025474407248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 449501562, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6025, + "versionNonce": 771221910, + "isDeleted": false, + "id": "bcQ286_2M0pyhNne5ZOYE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 30, + "angle": 0, + "x": 5031.035201425881, + "y": 6217.994074166863, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 149.660629734849, + "height": 9.017084911615706, + "seed": 1862603558, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2820, + "versionNonce": 1023779530, + "isDeleted": false, + "id": "PYv0E33Pd-h7JoEbtQ67u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5030.886537427112, + "y": 5776.356449421819, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 334, + "height": 50, + "seed": 1038457402, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "table with primary index \noptimized for filtering on UserID ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "table with primary index \noptimized for filtering on UserID " + }, + { + "type": "text", + "version": 2978, + "versionNonce": 967984854, + "isDeleted": false, + "id": "KfzwR1lDMYxxfF7eN-N9i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4714.304258161244, + "y": 5900.240486500192, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 188, + "height": 50, + "seed": 813940326, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ip87GtGCCgviSwQ-vUlo9", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query \nfiltering on UserID", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query \nfiltering on UserID" + }, + { + "type": "text", + "version": 3091, + "versionNonce": 647674250, + "isDeleted": false, + "id": "yVw-kXVIuCTqAxMdBUYVP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4733.710136137435, + "y": 6238.510451777969, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 156, + "height": 50, + "seed": 1500136186, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Query\nfiltering on URL", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Query\nfiltering on URL" + }, + { + "type": "rectangle", + "version": 5544, + "versionNonce": 816774166, + "isDeleted": false, + "id": "tu8pRySDLpojlW2kZi8Wb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 4944.616155709221, + "y": 6150.51421851904, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 49.38615117521417, + "height": 226.56336805555574, + "seed": 2072707494, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Urj7GRImtQ-_jf8kXKei0", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4161, + "versionNonce": 853473354, + "isDeleted": false, + "id": "h9obGfxVtHD68frZ1DS5F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 1.5685749593264884, + "x": 4881.286904479649, + "y": 6250.4677763132, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 170, + "height": 25, + "seed": 400282554, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "gw5xntt9h-7rsAez4s0Ml", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Materialized View" + }, + { + "type": "arrow", + "version": 756, + "versionNonce": 685967702, + "isDeleted": false, + "id": "Urj7GRImtQ-_jf8kXKei0", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4997.106106296828, + "y": 6266.246491021739, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 29.717785951007045, + "height": 0.013766459125690744, + "seed": 1128783078, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "tu8pRySDLpojlW2kZi8Wb", + "focus": 0.021744171490670924, + "gap": 3.1037994123939825 + }, + "endBinding": { + "elementId": "LsWUbnyYTmZ6nClojEWer", + "focus": 1.14642988531582, + "gap": 4.320984658813813 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 29.717785951007045, + -0.013766459125690744 + ] + ] + }, + { + "type": "text", + "version": 3895, + "versionNonce": 296574730, + "isDeleted": false, + "id": "WK28zDzxGiAzic6FUQG5A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4711.996731296828, + "y": 6006.436527546819, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 187, + "height": 25, + "seed": 1532841082, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "BrO3BBILYAphiNG5IB4dO", + "type": "arrow" + }, + { + "id": "_1LCD99pxoxMTc9Gv9tPw", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert statements", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert statements" + }, + { + "type": "arrow", + "version": 396, + "versionNonce": 832794262, + "isDeleted": false, + "id": "ip87GtGCCgviSwQ-vUlo9", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4910.246731296828, + "y": 5927.818459313345, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 111.43377177709408, + "height": 1.5849349128602626, + "seed": 222777382, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KfzwR1lDMYxxfF7eN-N9i", + "focus": 0.04284237201216683, + "gap": 8.442473135583896 + }, + "endBinding": { + "elementId": "bd-leMKBGUVF9w9vSg7kO", + "focus": 0.99680382763453, + "gap": 5.904866120383758 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 111.43377177709408, + 1.5849349128602626 + ] + ] + }, + { + "type": "arrow", + "version": 362, + "versionNonce": 1065414090, + "isDeleted": false, + "id": "_1LCD99pxoxMTc9Gv9tPw", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4912.324856296828, + "y": 6016.470300982066, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 107.91939955055614, + "height": 0.01622560595296818, + "seed": 1236380986, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "WK28zDzxGiAzic6FUQG5A", + "focus": -0.19836116131514064, + "gap": 13.828125 + }, + "endBinding": { + "elementId": "amuG-2Bi4eUTXQaPeeaqi", + "focus": -3.1544689506849837, + "gap": 9.736509302336799 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 107.91939955055614, + 0.01622560595296818 + ] + ] + }, + { + "type": "arrow", + "version": 303, + "versionNonce": 665136086, + "isDeleted": false, + "id": "gw5xntt9h-7rsAez4s0Ml", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4908.542629734328, + "y": 6264.010680652937, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 35.72613987564637, + "height": 0.9014403207347641, + "seed": 628513638, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "dhsCL-WWAogv32Mqm6WBU", + "focus": -0.13665233604385063, + "gap": 2.1432574857913096 + }, + "endBinding": { + "elementId": "h9obGfxVtHD68frZ1DS5F", + "focus": -0.029294096529644393, + "gap": 9.522399646169106 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 35.72613987564637, + 0.9014403207347641 + ] + ] + }, + { + "type": "arrow", + "version": 305, + "versionNonce": 1903469706, + "isDeleted": false, + "id": "q9WkxkAiDiOyfybt6ABuP", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4915.871731296832, + "y": 5180.761193047398, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 109.34244791666697, + "height": 60.05643633391992, + "seed": 1480324602, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "GxqNrQTVg8Rn5sTTShN3R", + "focus": 0.4838734344756022, + "gap": 12.996279761911865 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 109.34244791666697, + -60.05643633391992 + ] + ] + }, + { + "type": "arrow", + "version": 456, + "versionNonce": 150814998, + "isDeleted": false, + "id": "YPRe37mSkziXzuMT2QDAL", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 4917.2844917135, + "y": 5201.932352818856, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 107.62974866929744, + "height": 69.77915843737992, + "seed": 1377959590, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728742, + "link": null, + "locked": false, + "startBinding": { + "elementId": "GxqNrQTVg8Rn5sTTShN3R", + "focus": -0.6603382992041156, + "gap": 14.409040178579744 + }, + "endBinding": { + "elementId": "0zIxRwoKAIBDyo5qs7IP0", + "focus": 0.1857526586548959, + "gap": 1.0000000000004547 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 107.62974866929744, + 69.77915843737992 + ] + ] + }, + { + "type": "text", + "version": 6809, + "versionNonce": 21201738, + "isDeleted": false, + "id": "Hyfv6DYXvvdbsJVck3aJD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5165.848293796832, + "y": 6067.931319213483, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 222, + "height": 75, + "seed": 1476339386, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + }, + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728742, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Data is automatically\nkept in sync with \nthe hidden table", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically\nkept in sync with \nthe hidden table" + }, + { + "type": "text", + "version": 4019, + "versionNonce": 1226878550, + "isDeleted": false, + "id": "zaNdvwOkdl1eewqZe110O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4999.969387546829, + "y": 6385.462569213481, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 407, + "height": 50, + "seed": 133642726, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728743, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "implicitly created table with primary index\noptimized for filtering on URL ", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "implicitly created table with primary index\noptimized for filtering on URL " + }, + { + "type": "arrow", + "version": 1289, + "versionNonce": 1497926154, + "isDeleted": false, + "id": "jIZfRkvBm-8h6YG1lOMd7", + "fillStyle": "hachure", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5151.0337561920705, + "y": 6062.734077944899, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 0.09692072858069878, + "height": 85.45114751858819, + "seed": 27148154, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728743, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Hyfv6DYXvvdbsJVck3aJD", + "focus": 1.1385931004955787, + "gap": 15.314537604761426 + }, + "endBinding": { + "elementId": "90jMqh8wwpPQdUx4XqPSt", + "focus": 0.565231736644087, + "gap": 3.015950520829847 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.09692072858069878, + 85.45114751858819 + ] + ] + }, + { + "type": "text", + "version": 6863, + "versionNonce": 618951574, + "isDeleted": false, + "id": "fQQTRB6f9JAFiiAR4CF41", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 5167.052720880157, + "y": 6945.5680379634905, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 222, + "height": 75, + "seed": 503516454, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + }, + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728743, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Data is automatically\nkept in sync with \nthe hidden table", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically\nkept in sync with \nthe hidden table" + }, + { + "type": "text", + "version": 7965, + "versionNonce": 1618917578, + "isDeleted": false, + "id": "wVaNwoEEGopLJzxF5O1HI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 0, + "angle": 0, + "x": 5167.400377130155, + "y": 5164.168298380157, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 222, + "height": 75, + "seed": 22822970, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "a1HyqPD6QQTt6pbXbIYXq", + "type": "arrow" + }, + { + "id": "jIZfRkvBm-8h6YG1lOMd7", + "type": "arrow" + } + ], + "updated": 1672253728743, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Data is automatically\nkept in sync with \nthe hidden table", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Data is automatically\nkept in sync with \nthe hidden table" + }, + { + "type": "rectangle", + "version": 4725, + "versionNonce": 1211883402, + "isDeleted": false, + "id": "_hoczvIT2eHHRo0cEV_k6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2622.0821419549434, + "y": 4982.051370566501, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 451.64952256944457, + "height": 253.11610243055577, + "seed": 589074940, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3801, + "versionNonce": 1369126422, + "isDeleted": false, + "id": "yWnPMFqnMTso7m7rj39JB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2919.3833463045835, + "y": 5032.053124782894, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 182.95714962121258, + "seed": 405445572, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4037, + "versionNonce": 292249162, + "isDeleted": false, + "id": "SWwd1_7R7OeffeEFoKfjX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2645.6463524832657, + "y": 5032.128641654072, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 256.999591503268, + "height": 183.92223011363598, + "seed": 1244721788, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2571, + "versionNonce": 339215190, + "isDeleted": false, + "id": "zgEovkLdgMWixy32BlE2O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1674.7851890289728, + "y": 4752.093604114574, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 258.90957266803287, + "height": 594.0956012893664, + "seed": 1667924804, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2317, + "versionNonce": 1841104138, + "isDeleted": false, + "id": "G8rlFdVFM8gO1PqduYjG0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1955.6255205762143, + "y": 4753.090988462556, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 127.02013262761585, + "height": 593.2427235943161, + "seed": 1088766716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4868, + "versionNonce": 474556566, + "isDeleted": false, + "id": "ui4j85f9Hl6BoX2JI_nrN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 1528.376997588213, + "y": 4792.816670116261, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 490830532, + "groupIds": [ + "-iggjnNeu56DFGUdItm7I" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5549, + "versionNonce": 111924170, + "isDeleted": false, + "id": "lsI78-QqmdT4q25J4qArV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1526.433122026239, + "y": 4791.817496358415, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 1841005436, + "groupIds": [ + "-iggjnNeu56DFGUdItm7I" + ], + "roundness": null, + "boundElements": [ + { + "id": "pKrz8kJm0Y7ZGuVeaDwrd", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2490, + "versionNonce": 1770235350, + "isDeleted": false, + "id": "TtvBkIM1Pr41kiJC4gPdB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2100.5256964584873, + "y": 4750.580341265352, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 187.54419978513067, + "height": 596.0708074323217, + "seed": 5079620, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1626, + "versionNonce": 508742282, + "isDeleted": false, + "id": "JObfCT0z6vgeOcvEkHxdg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2118.0920651562315, + "y": 4759.317864954296, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 130, + "height": 25, + "seed": 385201148, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2880, + "versionNonce": 1023179542, + "isDeleted": false, + "id": "OY2lgtj8re-NrT349DVvg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2180.3361701633344, + "y": 5092.32687275589, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1131190724, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3057, + "versionNonce": 2070735178, + "isDeleted": false, + "id": "XjpWwfRTLR6MlR0s3rfqP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2180.6966720779615, + "y": 5111.100816482749, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 1788204156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3241, + "versionNonce": 1831381078, + "isDeleted": false, + "id": "C2ZwoBjZwridBaFRivJJL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2180.616443768447, + "y": 5129.875295858197, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 297582916, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2642, + "versionNonce": 1431646218, + "isDeleted": false, + "id": "l2DVPrwRdU1TUH6rake5X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.104660121451, + "y": 4795.6389726273965, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.3968293978423, + "height": 20.04948308198391, + "seed": 106816764, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1409, + "versionNonce": 970796438, + "isDeleted": false, + "id": "CMfkPVYojz8KbO-evCgPR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.1932556324223, + "y": 4797.005612970169, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 43776196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 1775, + "versionNonce": 1074175690, + "isDeleted": false, + "id": "blR0d3xGDcs5iJZPmOzb6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1610.0796335260727, + "y": 4798.00524525664, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 2144331132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1907, + "versionNonce": 542051030, + "isDeleted": false, + "id": "MjzYuYgtw9d1OY-Elg_Fx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.810160134835, + "y": 4868.0288231346485, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 296239172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2023, + "versionNonce": 404501898, + "isDeleted": false, + "id": "5awb-lAQptaSdw4qDzz7e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.097091953017, + "y": 4881.808652680103, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1814943228, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2032, + "versionNonce": 789790742, + "isDeleted": false, + "id": "HUNG6XSM3vC5K_RBAYZAZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.1220318568644, + "y": 4894.978123833948, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 381654980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2752, + "versionNonce": 1859187786, + "isDeleted": false, + "id": "1KE4ph3pUHqgG0LyGLus4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.2774833945111, + "y": 4827.863056208011, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3340592712975, + "height": 19.900607638888914, + "seed": 1752807036, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1562, + "versionNonce": 1511968086, + "isDeleted": false, + "id": "RWyALgDzDUsAPOjNxPhRn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.5169324525937, + "y": 4827.900048538242, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1040187204, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 1921, + "versionNonce": 1979702026, + "isDeleted": false, + "id": "rWsrT2JYBJ-eEwWlY_Wsn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1610.403310346244, + "y": 4830.098775424389, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 20, + "seed": 561350396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3533, + "versionNonce": 1321644694, + "isDeleted": false, + "id": "B1pa7K8ZW30IK2C2WZowd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.3811301484182, + "y": 4860.365857944524, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.7544755146852, + "height": 20.142795138888914, + "seed": 2143778500, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2365, + "versionNonce": 1814292938, + "isDeleted": false, + "id": "aX2Zg4WJogrivysSTPufg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.703560386915, + "y": 4860.523944024755, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1537427324, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 2743, + "versionNonce": 1203761110, + "isDeleted": false, + "id": "E-AzA2HRZfPOUDvDxzioQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1609.5899382805635, + "y": 4862.794192630671, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 414449220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3274, + "versionNonce": 139993226, + "isDeleted": false, + "id": "F2gzo8nVGkaw5pJdKG36X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1662.8687454006501, + "y": 4923.928990174747, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.5134081994029, + "height": 19.900607638888914, + "seed": 2068117500, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2187, + "versionNonce": 1629455638, + "isDeleted": false, + "id": "2mISM_Ffr52gsY4oAoONw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.41528917964, + "y": 4924.057758343162, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 27497924, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 2549, + "versionNonce": 1717010250, + "isDeleted": false, + "id": "WeeRrOhcCJ-8tC0Rw_v9c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1582.3016670732893, + "y": 4926.116734377325, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 20, + "seed": 207394940, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 5414, + "versionNonce": 1817866838, + "isDeleted": false, + "id": "amPLPi4_peJhoBoto913J", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 1528.0838202398825, + "y": 4953.230860128555, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 1739865412, + "groupIds": [ + "VyNj7DH9GhyYMDDthJdvy" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 6095, + "versionNonce": 1920796170, + "isDeleted": false, + "id": "W_a57TQXOeR2j7OO8yq5v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1526.1399446779085, + "y": 4952.231686370707, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 1252796668, + "groupIds": [ + "VyNj7DH9GhyYMDDthJdvy" + ], + "roundness": null, + "boundElements": [ + { + "id": "z8HDYmz-gMP_Hi5lLEI8J", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3386, + "versionNonce": 1145419670, + "isDeleted": false, + "id": "mj_JIVL1-qH926Fy_7fpQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.430330942672, + "y": 4955.490554872242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.2954661285185, + "height": 20.297183880733197, + "seed": 608433348, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2291, + "versionNonce": 1438889162, + "isDeleted": false, + "id": "Yp4joyQdFDuxeqNQpmnGr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.0477786230513, + "y": 4955.624637858338, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 699771260, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 2640, + "versionNonce": 555111638, + "isDeleted": false, + "id": "pY4HRRtbmMowePTOF_50c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1581.0353539817559, + "y": 4958.122850330464, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77, + "height": 20, + "seed": 888192068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3600, + "versionNonce": 1640401802, + "isDeleted": false, + "id": "hYBbXIb2vkm9aT52unEuU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.8645819601932, + "y": 4989.05833071981, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.5856676424751, + "height": 18.42915085614445, + "seed": 1555765756, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4465, + "versionNonce": 1818315286, + "isDeleted": false, + "id": "wtycwVZqCb1sbtbRnZq4v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1664.2513221691895, + "y": 5019.354817740111, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 632.438455857557, + "height": 19.331987292126826, + "seed": 865637316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3262, + "versionNonce": 2092993098, + "isDeleted": false, + "id": "WGw_W4jrf0UQuBHD_Q9-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.659280842599, + "y": 5019.107499896962, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1589541500, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2283, + "versionNonce": 354129750, + "isDeleted": false, + "id": "CiywWZUY80skHxz0Fdb2w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.7697038284564, + "y": 5026.5791579000625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1314487108, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2399, + "versionNonce": 227324170, + "isDeleted": false, + "id": "P_y-c3pHmoDVk51h4Sk8c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.0566356466384, + "y": 5040.3589874455165, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2055326460, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2408, + "versionNonce": 1671052438, + "isDeleted": false, + "id": "IxatrIlYNAlfLN73EN7-L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2182.081575550486, + "y": 5053.528458599363, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1066496708, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3703, + "versionNonce": 1738932170, + "isDeleted": false, + "id": "7DxcqFL4KQliqcxQY0xeQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.0150601526, + "y": 5081.848181818408, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 633.4556360399567, + "height": 20.593894652071985, + "seed": 1384582012, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2563, + "versionNonce": 1301428694, + "isDeleted": false, + "id": "lCwrE5NTjgZyQ38CAbo15", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.3748328732595, + "y": 5082.231817655231, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1172208196, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 2904, + "versionNonce": 925333130, + "isDeleted": false, + "id": "kNAh9Xbnrtv2a5lTqGnVE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1570.2612107669117, + "y": 5084.667069142739, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 1762671612, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 5043, + "versionNonce": 1243123478, + "isDeleted": false, + "id": "nN2EO8u7z6ZajekWuGx0R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 1528.0380136948186, + "y": 5177.948057531298, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 773.2456351692409, + "height": 151.18724556550592, + "seed": 471765444, + "groupIds": [ + "ED-wfCihYd9BhWaVE4s2Z" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5724, + "versionNonce": 1825314122, + "isDeleted": false, + "id": "_8qZd05P7LkoyeqB71OhG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1526.0941381328446, + "y": 5176.948883773452, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 776.7457386363642, + "height": 154.2443443800131, + "seed": 673143932, + "groupIds": [ + "ED-wfCihYd9BhWaVE4s2Z" + ], + "roundness": null, + "boundElements": [ + { + "id": "K9W0uLYUq-eU7Uxvhgrvr", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4068, + "versionNonce": 631389270, + "isDeleted": false, + "id": "h7CTynhkj6c_J5l5fChs4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1664.876312802883, + "y": 5180.08895331706, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 629.5127418132788, + "height": 19.4734285591735, + "seed": 1903147332, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2818, + "versionNonce": 703519754, + "isDeleted": false, + "id": "nbP7lNunZlZgeKxG--_Uc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2103.807433331623, + "y": 5179.8111586423765, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1769368828, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3128, + "versionNonce": 1443119510, + "isDeleted": false, + "id": "yNdLP1hptivXsOTDT3QTp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1538.7950086903281, + "y": 5181.582261357557, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1630531780, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4077, + "versionNonce": 747293386, + "isDeleted": false, + "id": "dgG9GfgfAZPFyHE7HFbQ_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.7094129075483, + "y": 5212.255877211968, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.3754464133191, + "height": 19.329071290348566, + "seed": 2123853180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2964, + "versionNonce": 1316200150, + "isDeleted": false, + "id": "ewKSQp2o0MkZWmEUIgLUf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.232307616852, + "y": 5211.9059039028725, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1794979908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 4892, + "versionNonce": 993714570, + "isDeleted": false, + "id": "4znaigKepBh3LnMY49gIN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1662.7035794694618, + "y": 5244.409390016464, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 631.8702765794457, + "height": 19.900607638888914, + "seed": 952393212, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3787, + "versionNonce": 1401246742, + "isDeleted": false, + "id": "Ql9oniAxV-s0HZoANIc2M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2104.5171566201975, + "y": 5244.446382346697, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1790283716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 2808, + "versionNonce": 289022026, + "isDeleted": false, + "id": "fN5gRHCo64YXqRP2NOaea", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.5293585370287, + "y": 5252.172718576425, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1895775868, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2923, + "versionNonce": 1328439638, + "isDeleted": false, + "id": "60PnmQOXePmyyyLGM-swh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.7296018444245, + "y": 5265.865859611092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 276232004, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2932, + "versionNonce": 1248036618, + "isDeleted": false, + "id": "roYpBiHIahgImXpPplakp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2181.754541748272, + "y": 5279.035330764937, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 269094652, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4221, + "versionNonce": 616810134, + "isDeleted": false, + "id": "OqZJYd1DfAjMAMvBxh86m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1663.7183196180429, + "y": 5307.982998171912, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 630.0506824293966, + "height": 19.840790040348676, + "seed": 1486843588, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1640, + "versionNonce": 1328682442, + "isDeleted": false, + "id": "-cg_BvDIy8tGEal9F2u04", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1767.6219457040413, + "y": 4759.1165180465505, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70, + "height": 25, + "seed": 375836540, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 2958, + "versionNonce": 83526614, + "isDeleted": false, + "id": "ifvstiWrGeSLp3d1p3Oxt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1795.9272486278103, + "y": 5092.293494598144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 63764036, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3135, + "versionNonce": 1086377098, + "isDeleted": false, + "id": "ck--u3j1MSoE8QxNGfGjw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1796.2877505424374, + "y": 5111.0674383250025, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 609714172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3319, + "versionNonce": 1105697046, + "isDeleted": false, + "id": "i5OddiBqILZZLXT3VKQhS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1796.2075222329229, + "y": 5129.841917700452, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 249400772, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1796, + "versionNonce": 1691003722, + "isDeleted": false, + "id": "fYLQmxF8aDee1Hl871KOT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.011447669445, + "y": 4795.504398962254, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 31334524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2002, + "versionNonce": 587204182, + "isDeleted": false, + "id": "_HtjIYpX11lEiUUmiAmew", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.1724270462826, + "y": 4867.921699711752, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 720319812, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2118, + "versionNonce": 296399370, + "isDeleted": false, + "id": "l2XzYXJrX6Gv8jQLOKidH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4593588644627, + "y": 4881.701529257206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 649900284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2127, + "versionNonce": 957926294, + "isDeleted": false, + "id": "-lTAm4tV_OTStewxzcnhQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4842987683103, + "y": 4894.871000411051, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 895478980, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1950, + "versionNonce": 442228938, + "isDeleted": false, + "id": "XrGYWIUWHn3bYQOHvtdEM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.3351244896164, + "y": 4827.755242286376, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1114976636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 2771, + "versionNonce": 845605078, + "isDeleted": false, + "id": "K2SxX6hQIrIhKF5gVPnv8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.5217524239358, + "y": 4860.37913777289, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 802010180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 2595, + "versionNonce": 981022602, + "isDeleted": false, + "id": "CO8mrPdHBO85E0yskTA8R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.2334812166607, + "y": 4923.811754626239, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1145676284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2683, + "versionNonce": 780099094, + "isDeleted": false, + "id": "pulK1b7vfIo758tkAmfW1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1680.967168125129, + "y": 4955.581029071529, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 941001668, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2830, + "versionNonce": 37598794, + "isDeleted": false, + "id": "LpqcPl60xIK1zdsMHANFY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.2908449453005, + "y": 4988.214788406803, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1664877180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3659, + "versionNonce": 307702614, + "isDeleted": false, + "id": "0rvn4-IYUTTFX5MsN303n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.4774728796199, + "y": 5019.060914714121, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 5796676, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2378, + "versionNonce": 1115970826, + "isDeleted": false, + "id": "5XyV6uEzAyXxqoyV-VYkt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.131970739904, + "y": 5026.472034477165, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 638472956, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2494, + "versionNonce": 1547915414, + "isDeleted": false, + "id": "yj9DvpoWnTvUXzIlLhK1r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4189025580843, + "y": 5040.251864022619, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1190226628, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2503, + "versionNonce": 2026384330, + "isDeleted": false, + "id": "6PCIVWHlWKYM_uKzwOXs8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.4438424619318, + "y": 5053.421335176466, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1799525244, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2962, + "versionNonce": 2012794326, + "isDeleted": false, + "id": "UbDDBxqT6sFoM0sckEvLx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.1930249102822, + "y": 5082.087011403364, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1316975172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3218, + "versionNonce": 992223882, + "isDeleted": false, + "id": "dX-qrhOZHXOx4_u1hirNU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1680.7268228337023, + "y": 5179.767549855567, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1897579516, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3368, + "versionNonce": 311206678, + "isDeleted": false, + "id": "JMFHvzji21XGd3s7iXCr0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1680.9493021888165, + "y": 5211.761097651005, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1440778692, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4187, + "versionNonce": 609435978, + "isDeleted": false, + "id": "6KbMH8u1bdkhjArx4Chwu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.1384102907148, + "y": 5244.081322788528, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1570301052, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 2903, + "versionNonce": 1853083734, + "isDeleted": false, + "id": "jGB8Ske5iiDPmH9-Qks9D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1797.8916254484773, + "y": 5252.065595153526, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 271757636, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3018, + "versionNonce": 1068533770, + "isDeleted": false, + "id": "TLki30n8DRh3tehb1UwDp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.0918687558703, + "y": 5265.758736188194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1182725372, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3027, + "versionNonce": 931354006, + "isDeleted": false, + "id": "DKXyKgxu6Hf00ltsiDFEY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1798.116808659718, + "y": 5278.92820734204, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 483649732, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3209, + "versionNonce": 1966536394, + "isDeleted": false, + "id": "1UeDp6TUllfeYkYEhDHBw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1681.8937399646309, + "y": 5307.642880520893, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 961475964, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 2782, + "versionNonce": 1458582230, + "isDeleted": false, + "id": "qvZFWhAOpqcdyDE27-dlu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2105.2854933809663, + "y": 5307.802195727031, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 2137141316, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3019, + "versionNonce": 1971424650, + "isDeleted": false, + "id": "5ZgVZObzZp0x9YRkSQkvx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1539.8068777868436, + "y": 5309.764395796254, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 121, + "height": 20, + "seed": 1128982012, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 1942, + "versionNonce": 1196386326, + "isDeleted": false, + "id": "PWUw0SmCb-IzFBCwDlyng", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1351.6544541535475, + "y": 4803.143753853819, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 398165956, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "pKrz8kJm0Y7ZGuVeaDwrd", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1904, + "versionNonce": 634080330, + "isDeleted": false, + "id": "pKrz8kJm0Y7ZGuVeaDwrd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 1481.1342651570483, + "y": 4824.079387213624, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.73828125, + "height": 0.9079272975623098, + "seed": 2037696124, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "startBinding": { + "elementId": "PWUw0SmCb-IzFBCwDlyng", + "focus": 0.1241274324604245, + "gap": 10.4798110035008 + }, + "endBinding": { + "elementId": "lsI78-QqmdT4q25J4qArV", + "focus": 0.6408863246638249, + "gap": 8.5605756191909 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.73828125, + -0.9079272975623098 + ] + ] + }, + { + "type": "text", + "version": 2656, + "versionNonce": 1754658134, + "isDeleted": false, + "id": "icuTSnemB_UwMZkwKTD0s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1354.9389501519306, + "y": 4956.258652069314, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 119, + "height": 40, + "seed": 436072260, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "z8HDYmz-gMP_Hi5lLEI8J", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 8192 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 8192 rows" + }, + { + "type": "arrow", + "version": 1850, + "versionNonce": 200225546, + "isDeleted": false, + "id": "z8HDYmz-gMP_Hi5lLEI8J", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 1482.5795751519306, + "y": 4978.791953287164, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 39.8359375, + "height": 1.008672810209191, + "seed": 9344764, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "startBinding": { + "elementId": "icuTSnemB_UwMZkwKTD0s", + "focus": 0.03756685726227266, + "gap": 8.640625 + }, + "endBinding": { + "elementId": "W_a57TQXOeR2j7OO8yq5v", + "focus": 0.4556907888570512, + "gap": 3.7244320259779897 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.8359375, + 1.008672810209191 + ] + ] + }, + { + "type": "text", + "version": 2935, + "versionNonce": 1410914966, + "isDeleted": false, + "id": "Tr4CsJduoGQhH0NewfphC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1349.5364534878552, + "y": 5187.555033593442, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 123, + "height": 40, + "seed": 109536964, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "K9W0uLYUq-eU7Uxvhgrvr", + "type": "arrow" + } + ], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1082\nwith 3937 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1082\nwith 3937 rows" + }, + { + "type": "arrow", + "version": 1590, + "versionNonce": 979911114, + "isDeleted": false, + "id": "K9W0uLYUq-eU7Uxvhgrvr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 90, + "angle": 0, + "x": 1480.981765987856, + "y": 5204.161232540564, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 37.82667994643066, + "height": 2.0531503382990195, + "seed": 354047868, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Tr4CsJduoGQhH0NewfphC", + "focus": 0.03561765500799312, + "gap": 8.44531250000091 + }, + "endBinding": { + "elementId": "_8qZd05P7LkoyeqB71OhG", + "focus": 0.7478290302818356, + "gap": 7.2856921985579675 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 37.82667994643066, + -2.0531503382990195 + ] + ] + }, + { + "type": "rectangle", + "version": 4801, + "versionNonce": 814553046, + "isDeleted": false, + "id": "jTNf1d9BeoxNPcAOr7xVG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2636.257706191053, + "y": 5074.911238779883, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.551254734849, + "height": 21.39989741161571, + "seed": 569765444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4445, + "versionNonce": 1011972234, + "isDeleted": false, + "id": "t_412R9R_LVx_WKZyzlPM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2636.7024767612243, + "y": 5107.633675197632, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 422.8751183712125, + "height": 20.649897411616156, + "seed": 324667388, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4339, + "versionNonce": 101166358, + "isDeleted": false, + "id": "ogj6vCBmJtNFl8bYoP8xV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2637.739285783597, + "y": 5167.799120896318, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 423.6151751893943, + "height": 21.2642440025254, + "seed": 1831306692, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3263, + "versionNonce": 23451466, + "isDeleted": false, + "id": "WeQ8f5HiU5mDMFUXfsRzb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2947.9157109274256, + "y": 5037.281559403923, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 72, + "height": 25, + "seed": 2135926908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "text", + "version": 3100, + "versionNonce": 301832790, + "isDeleted": false, + "id": "-cj4w3sINXo5SRQyLfFxh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2915.95913992634, + "y": 5075.35406879331, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 490351940, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 3349, + "versionNonce": 1241538058, + "isDeleted": false, + "id": "X2IbyhcNAZHJ2Rwke-6Fy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2977.8288530857917, + "y": 5115.82844628005, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 213727484, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3465, + "versionNonce": 457432982, + "isDeleted": false, + "id": "0RxMsL13oCPOtTi2WJVYb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2978.1157849039737, + "y": 5129.608275825506, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 327935172, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3474, + "versionNonce": 320605386, + "isDeleted": false, + "id": "bf_23DxfB0ZpeM6R4xUVE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2978.1407248078212, + "y": 5142.777746979352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 656718204, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3251, + "versionNonce": 1175420118, + "isDeleted": false, + "id": "6KHbxVrtlTUcyrX-EMs6H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2906.6056237645644, + "y": 5105.447598961059, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 1438297156, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3410, + "versionNonce": 39052170, + "isDeleted": false, + "id": "CKYVvRY9IGyoE9IbFgqh9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2919.6424327869377, + "y": 5166.381079244727, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 2043161084, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3165, + "versionNonce": 1744138774, + "isDeleted": false, + "id": "WykKOVwDzK101j6AawBgH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2648.6977847749317, + "y": 5075.6568973271105, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 94667716, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 3020, + "versionNonce": 1373823562, + "isDeleted": false, + "id": "YFIlXJdx1Vs4lNyE6G-PQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.221594298741, + "y": 5039.25951389457, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 41, + "height": 25, + "seed": 2007599740, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3397, + "versionNonce": 1542111062, + "isDeleted": false, + "id": "NOPCqCqmPZEYOnC3JBuGx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2767.772075640982, + "y": 5116.064695559772, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1499949892, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3513, + "versionNonce": 1017383178, + "isDeleted": false, + "id": "wtbGwMY3jw1jCMRM1XpYx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2768.0590074591623, + "y": 5129.844525105226, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1670044412, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3522, + "versionNonce": 1447322774, + "isDeleted": false, + "id": "dwpjsXZD1K7OsIO9ULT0I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2768.08394736301, + "y": 5143.013996259072, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 325149380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3307, + "versionNonce": 1779587018, + "isDeleted": false, + "id": "-orJOZIa9E9puaPUL6nnF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2651.021461595103, + "y": 5106.61485386465, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 1475222396, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3480, + "versionNonce": 951542230, + "isDeleted": false, + "id": "WKZKxhAzpCDf36B5oJmhR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2648.9226969872675, + "y": 5167.208349594902, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 255, + "height": 20, + "seed": 2049993284, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3201, + "versionNonce": 1514720906, + "isDeleted": false, + "id": "F435cbi9gZlbEyBrNb21P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2795.391278239666, + "y": 4990.671921781778, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 1326795772, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2621, + "versionNonce": 1717090070, + "isDeleted": false, + "id": "UYBGI7mES40seRbbHJYxq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2530.06885760474, + "y": 5170.1905849762215, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 84, + "height": 20, + "seed": 1353875908, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1082", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1082" + }, + { + "type": "text", + "version": 2770, + "versionNonce": 1375890762, + "isDeleted": false, + "id": "rnVCrDuqyUsQ7C61nuHs5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2559.04542010474, + "y": 5077.58330261015, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 721579132, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2773, + "versionNonce": 396190806, + "isDeleted": false, + "id": "yN8klqLg-MzW7tvUcU-2z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2561.49073260474, + "y": 5110.92998229765, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49, + "height": 20, + "seed": 1308993860, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 1897, + "versionNonce": 163890902, + "isDeleted": false, + "id": "ZBfnLP9rXKnm_EO9sY61v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1970.2561474419606, + "y": 4758.609031195423, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 102, + "height": 25, + "seed": 785852484, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 2773, + "versionNonce": 1995454858, + "isDeleted": false, + "id": "EBHHaH5bgK9igknIOTg8D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2007.56273644715, + "y": 5092.211101047391, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 734096892, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2952, + "versionNonce": 1517386774, + "isDeleted": false, + "id": "17ol-fPelwunEq9ZbF3df", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2007.56273644715, + "y": 5110.985044774248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 2110881732, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3136, + "versionNonce": 1552185418, + "isDeleted": false, + "id": "S6JKotvLCSQLe1cFgZl4z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2007.56273644715, + "y": 5129.759524149698, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 23, + "height": 44, + "seed": 567955068, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": ".", + "baseline": 35, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1788, + "versionNonce": 1985317206, + "isDeleted": false, + "id": "t1UVmW6Mo0TrF5xX675Zp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 4795.609924043816, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 982837060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2063, + "versionNonce": 1789058826, + "isDeleted": false, + "id": "8HTUpVQrctmAmVWhkgZDk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2012.56273644715, + "y": 4869.15591807155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 318971644, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2195, + "versionNonce": 751169174, + "isDeleted": false, + "id": "WihaOPWsBIwiPu6IcPW7I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2012.56273644715, + "y": 4882.935747617006, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1769955012, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2204, + "versionNonce": 1573285322, + "isDeleted": false, + "id": "isvSLGD_25dcFqidATgBu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2012.56273644715, + "y": 4896.105218770852, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2008932220, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1938, + "versionNonce": 444050390, + "isDeleted": false, + "id": "4FQpR4KgPATdPcLMnyWcI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 4827.759569902883, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1395582532, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 2757, + "versionNonce": 722085002, + "isDeleted": false, + "id": "8Kr7mI1WZKdH-tz566dtv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 4860.383465389396, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1749848060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 2573, + "versionNonce": 2105524502, + "isDeleted": false, + "id": "7xpjJ0Nhe5fZ7Yr4z57LU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 4923.714884777691, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 2088861124, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2676, + "versionNonce": 1814627146, + "isDeleted": false, + "id": "VPJfrL15NXQsfbvhHTBkM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 4955.4841592229795, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 615592060, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2818, + "versionNonce": 156446294, + "isDeleted": false, + "id": "EfpbB3lhGZkVWv95p42hK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 4988.219116023311, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 513090884, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3650, + "versionNonce": 1266551306, + "isDeleted": false, + "id": "hlJqZmQZveu1R6W31BPPQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1946.56273644715, + "y": 5018.967021261602, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 133, + "height": 20, + "seed": 481149180, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2434, + "versionNonce": 986117014, + "isDeleted": false, + "id": "vqon-t3vLiOxXJULnKuy2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.56273644715, + "y": 5027.706252836964, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 516414660, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2554, + "versionNonce": 1879324874, + "isDeleted": false, + "id": "-45lrmve_35eU2ZHjJxPU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.56273644715, + "y": 5041.48608238242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 2009350524, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2563, + "versionNonce": 739250390, + "isDeleted": false, + "id": "FRnbi3I1yQTgI5ScXCVvd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.56273644715, + "y": 5054.655553536266, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 112698436, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2948, + "versionNonce": 1767280522, + "isDeleted": false, + "id": "mo7eWjSL5hmUjGKV959m5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.56273644715, + "y": 5082.091339019873, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 490123772, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3206, + "versionNonce": 1757644310, + "isDeleted": false, + "id": "gpQHRZuU6UACW2WIUx-XK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.3420393365332, + "y": 5179.771877472076, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 2084731844, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3348, + "versionNonce": 464522826, + "isDeleted": false, + "id": "ukMbo6F6R4A8AsbuZeakf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.4432368015903, + "y": 5211.86662273257, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 1007096444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4172, + "versionNonce": 1104565078, + "isDeleted": false, + "id": "5JQv78s7-nBO-QDV33E5K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.4432368015903, + "y": 5244.204706246281, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 965108548, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 2961, + "versionNonce": 736867594, + "isDeleted": false, + "id": "-PX1IhDrrE1KaD7QOWMhW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.4432368015903, + "y": 5253.299813513327, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 1391944444, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3077, + "versionNonce": 563968150, + "isDeleted": false, + "id": "lfMpeAM37i4jf-9rk56N4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.4432368015903, + "y": 5267.0796430587825, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 81877700, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3086, + "versionNonce": 1803846602, + "isDeleted": false, + "id": "DSkuj9larYJfUI0MUzQdb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2011.4432368015903, + "y": 5280.249114212627, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14, + "height": 24, + "seed": 948544380, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 3, + "text": ".", + "baseline": 20, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3101, + "versionNonce": 1607333334, + "isDeleted": false, + "id": "3JNZef4SmD6kkXulXVYNq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1955.4432368015903, + "y": 5307.748405602459, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 124, + "height": 20, + "seed": 686907972, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2350, + "versionNonce": 1856757770, + "isDeleted": false, + "id": "C4cW6hZgTLX-7HTW8isMd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2106.4839639890974, + "y": 4988.554559242124, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 180, + "height": 20, + "seed": 1743470276, + "groupIds": [], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 16, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 5084, + "versionNonce": 2018497814, + "isDeleted": false, + "id": "XTM9mkzsOyCIjx3xmbOBv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8634.11398619021, + "y": 4862.221437039244, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.880479020459, + "height": 175.9067584677423, + "seed": 199933636, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4160, + "versionNonce": 1427386186, + "isDeleted": false, + "id": "Pe8R70Ta_Frbd-3-vGfCq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8840.727831155089, + "y": 4896.970891607506, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 86.12404450345402, + "height": 127.14876224516367, + "seed": 205029244, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4396, + "versionNonce": 1493221974, + "isDeleted": false, + "id": "elCJvh4cao0pnDYwjY8Wj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8650.490280902735, + "y": 4897.02337316791, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.6056463210472, + "height": 127.81945912873799, + "seed": 1361987140, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5160, + "versionNonce": 1176745482, + "isDeleted": false, + "id": "WTPfAN6DuKgMmyiISCDj_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8643.965503064406, + "y": 4926.755768329523, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.65820978251435, + "height": 14.872173477198414, + "seed": 635417852, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4804, + "versionNonce": 1738672022, + "isDeleted": false, + "id": "_XNMnDs_nn96hcDYMX75H", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8644.274602914275, + "y": 4949.496706832209, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.88328358031396, + "height": 14.35094994545205, + "seed": 1893673156, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4698, + "versionNonce": 1628726474, + "isDeleted": false, + "id": "uM5bZCn4Dfm0bRKYP4G7l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8644.995148594791, + "y": 4991.309568293785, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 294.3975969516018, + "height": 14.777899145225708, + "seed": 1855436156, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3622, + "versionNonce": 879273174, + "isDeleted": false, + "id": "xzuILWPcKfXZHvZE-kcJj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8860.556817632158, + "y": 4900.604469152412, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 50.037459047680535, + "height": 17.374117724889075, + "seed": 805662788, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "text", + "version": 3459, + "versionNonce": 528563082, + "isDeleted": false, + "id": "xhm5FvpaX0F2KD2w4qZoH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8838.348128565893, + "y": 4927.063519560939, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.1756239154498, + "height": 13.899294179911259, + "seed": 1367057916, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 11.899294179911259, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 3708, + "versionNonce": 15309334, + "isDeleted": false, + "id": "lrp9KF2mcwrtk_J9okur7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8881.345395767388, + "y": 4955.191783532787, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.72950592593788, + "height": 16.67915301589351, + "seed": 1375127492, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 3, + "text": ".", + "baseline": 13.679153015893512, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3824, + "versionNonce": 262486602, + "isDeleted": false, + "id": "Jb5ag2wZhXsZAAtHzvOR6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8881.544803254914, + "y": 4964.768278762853, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.72950592593788, + "height": 16.67915301589351, + "seed": 59606652, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 3, + "text": ".", + "baseline": 13.679153015893512, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3833, + "versionNonce": 337241942, + "isDeleted": false, + "id": "XVCawdy4sMnW7Gszil-4L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8881.562135607934, + "y": 4973.920596450912, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.72950592593788, + "height": 16.67915301589351, + "seed": 1792094020, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 3, + "text": ".", + "baseline": 13.679153015893512, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3610, + "versionNonce": 1079730442, + "isDeleted": false, + "id": "yUNf24O1Ta1or1w6wOTaV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8831.847764928438, + "y": 4947.977460996618, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 92.43030629640987, + "height": 13.899294179911259, + "seed": 1234130684, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 11.899294179911259, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3769, + "versionNonce": 240028822, + "isDeleted": false, + "id": "bxphi2BYF4xtX7vb_RgnI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8840.907887116902, + "y": 4990.324079390044, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.1756239154498, + "height": 13.899294179911259, + "seed": 1525851844, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 11.899294179911259, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3524, + "versionNonce": 756985802, + "isDeleted": false, + "id": "NuAet_so5dyzwsFpfRKVk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8652.610918657334, + "y": 4927.273974704807, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 177.21600079386855, + "height": 13.899294179911259, + "seed": 202620, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 11.899294179911259, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 3379, + "versionNonce": 1027377622, + "isDeleted": false, + "id": "LRtU2yUj9hop5RqgEjjOn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8721.081489272181, + "y": 4901.979077719412, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.49355306881808, + "height": 17.374117724889075, + "seed": 1190735428, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": "URL", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3756, + "versionNonce": 705308298, + "isDeleted": false, + "id": "YWT5iDae4RPllOhxtBb3J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8735.36334855791, + "y": 4955.355968444719, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.86475296296894, + "height": 17.374117724889075, + "seed": 590006268, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": ".", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3872, + "versionNonce": 1878581014, + "isDeleted": false, + "id": "pFMe5wu1Cxf6deiVQbGlD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8735.562756045434, + "y": 4964.932463674785, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.86475296296894, + "height": 17.374117724889075, + "seed": 264422852, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": ".", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3881, + "versionNonce": 1339606346, + "isDeleted": false, + "id": "G5WqpvTCLp9AIONu6m6nE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8735.580088398454, + "y": 4974.0847813628425, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.86475296296894, + "height": 17.374117724889075, + "seed": 1460168828, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": ".", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3666, + "versionNonce": 1257802838, + "isDeleted": false, + "id": "HyDPJY1chK535z3jwJIpp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8654.225792042464, + "y": 4948.788661961015, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 177.21600079386855, + "height": 13.899294179911259, + "seed": 1248685380, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 11.899294179911259, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3839, + "versionNonce": 1743096842, + "isDeleted": false, + "id": "hvBg-yPegJjxU-fMsJ27K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8652.767224707528, + "y": 4990.899003088214, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 177.21600079386855, + "height": 13.899294179911259, + "seed": 1868429564, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 11.119435343929007, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 11.899294179911259, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3560, + "versionNonce": 470847894, + "isDeleted": false, + "id": "nYLi9j2JjaE_RoqNhRgvE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8754.557719654595, + "y": 4868.21241590595, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.19143560855186, + "height": 17.374117724889075, + "seed": 945235140, + "groupIds": [ + "AXIEJxQQW3FkJiTpTio0F" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 13.899294179911259, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.374117724889075, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2887, + "versionNonce": 515744790, + "isDeleted": false, + "id": "iLFOasAmnQV_C5OeipR8t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8168.818334460782, + "y": 4757.624383752309, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.77029716022477, + "height": 382.67221620130925, + "seed": 1416835068, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2633, + "versionNonce": 1886310474, + "isDeleted": false, + "id": "cACU6T60lJ-AgeVpl7rsZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8349.714795970767, + "y": 4758.2668245951945, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.81692567543335, + "height": 382.1228558003817, + "seed": 1133829572, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2806, + "versionNonce": 786215254, + "isDeleted": false, + "id": "ihJs0TRsXfGZJ8oyeqPOP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8443.048716155477, + "y": 4756.649652333746, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.8020298613876, + "height": 383.94449714487905, + "seed": 1739350268, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1942, + "versionNonce": 1065498378, + "isDeleted": false, + "id": "Vq2kTt4KEuwHGh_CmGDTr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8454.36366483644, + "y": 4762.277715471905, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.73633468789095, + "height": 16.10314128613287, + "seed": 8600772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 3196, + "versionNonce": 438834838, + "isDeleted": false, + "id": "5CQSd27jXzdplfcusLZag", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.45668952277, + "y": 4976.777359559265, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 703521148, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3373, + "versionNonce": 217761226, + "isDeleted": false, + "id": "r6tDvC6X2UUrTVWm6ftDz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.688898053379, + "y": 4988.870138292526, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1510409284, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3557, + "versionNonce": 1767166934, + "isDeleted": false, + "id": "EcSZYcCYSkVjoXXCCPilT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.637220941248, + "y": 5000.963262050783, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1896698364, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2958, + "versionNonce": 569605258, + "isDeleted": false, + "id": "i1sSKHMwppd_RcZHt1O1P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.294606168998, + "y": 4785.673072613057, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.69889405639157, + "height": 12.914386351324707, + "seed": 1856363460, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1725, + "versionNonce": 1182263574, + "isDeleted": false, + "id": "UgT6sAyqPB8SQ1SshHN67", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.411085097603, + "y": 4786.553360714136, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 470397564, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 2092, + "versionNonce": 1814518602, + "isDeleted": false, + "id": "9RPJtAyKmyL-NVj0h2_iw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8127.139826370346, + "y": 4787.197249511865, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 1216201540, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2223, + "versionNonce": 1359369814, + "isDeleted": false, + "id": "HqjjiCp9eIFg8dJVaxWvA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.406124273388, + "y": 4832.301232229069, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1504051964, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2339, + "versionNonce": 1777426954, + "isDeleted": false, + "id": "Om2QENqWej6DlO8V5BaPh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.590944417694, + "y": 4841.177173911841, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2112666308, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2348, + "versionNonce": 1909791638, + "isDeleted": false, + "id": "FtfbssK2Pj7epC2AiR9eD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.607008849507, + "y": 4849.659968098001, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 811877244, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3068, + "versionNonce": 374116554, + "isDeleted": false, + "id": "rMUHazSS00pDKuHKKM7Z8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.405926072343, + "y": 4806.429431441648, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.01433655629427, + "height": 12.818491859556932, + "seed": 697352772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1878, + "versionNonce": 790182102, + "isDeleted": false, + "id": "-b_N5kHA8_RwpZ1cEZcXU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.619573640253, + "y": 4806.453259150458, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 109474812, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 2238, + "versionNonce": 1423173514, + "isDeleted": false, + "id": "AytQc2_VbqAnZWTzrLXIU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8127.348314912997, + "y": 4807.869515538347, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.120900406367284, + "height": 12.882513028906299, + "seed": 1648875972, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3849, + "versionNonce": 6794774, + "isDeleted": false, + "id": "nN_u9Lgpe6mLHah-RPdE3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.472687605225, + "y": 4827.365319783978, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.2851374429445, + "height": 12.974491040766345, + "seed": 705598588, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2681, + "versionNonce": 1573021258, + "isDeleted": false, + "id": "SiCCOcqkCDgCGtra2BZQN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.739785480026, + "y": 4827.467147083391, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 858784068, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 3060, + "versionNonce": 582318934, + "isDeleted": false, + "id": "HpSgbcAYHggf_UqgfVCSo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8126.824401101322, + "y": 4828.92947244562, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 1488889084, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3590, + "versionNonce": 703794442, + "isDeleted": false, + "id": "isnAUSieV-Q9ZSSa8_SIL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.142647445778, + "y": 4868.307963739675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.1298598014461, + "height": 12.818491859556932, + "seed": 329726148, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2503, + "versionNonce": 1817682070, + "isDeleted": false, + "id": "6n0lfcOWQo2FzpVlCreJk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.554102600845, + "y": 4868.390906620041, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1209574780, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 2866, + "versionNonce": 1591794634, + "isDeleted": false, + "id": "_cGE6bpieOIkQbXwCQCmM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8109.2473256331195, + "y": 4869.717145899356, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 12.882513028906299, + "seed": 1598783556, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3702, + "versionNonce": 553852374, + "isDeleted": false, + "id": "vWfxC8FMWs2OWSpTO4ofs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.504379098875, + "y": 4888.637577161083, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6336033745057, + "height": 13.073936789682616, + "seed": 1167226492, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2607, + "versionNonce": 984011402, + "isDeleted": false, + "id": "WwSuRi2q_JWDq7_TR1Y79", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.317379624172, + "y": 4888.72394345185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1809006404, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 2957, + "versionNonce": 1171059478, + "isDeleted": false, + "id": "DjWDlp6HwcsaYuxGHGgOn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.431660888102, + "y": 4890.333106187907, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.59767516128925, + "height": 12.882513028906299, + "seed": 1568032508, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3917, + "versionNonce": 2147479882, + "isDeleted": false, + "id": "h2PTfuR76zvjHX8I_Fkez", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.669726238164, + "y": 4910.2594426464675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.8205296137334, + "height": 11.870688800798026, + "seed": 288536260, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728754, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4781, + "versionNonce": 1965695062, + "isDeleted": false, + "id": "CONbQpIwQfa-tQWdM5PXk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8162.033200607487, + "y": 4929.774187084923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.36983237831794, + "height": 12.45222890827374, + "seed": 1502349180, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3578, + "versionNonce": 1648834570, + "isDeleted": false, + "id": "36YEancDo9Tvd1No0tZFO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.711263889696, + "y": 4929.614883318091, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1521958468, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2599, + "versionNonce": 854566294, + "isDeleted": false, + "id": "I2laWgChnv-u7EphwoV4D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.380065328687, + "y": 4934.427569896716, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1041610748, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2715, + "versionNonce": 1903666890, + "isDeleted": false, + "id": "mfB7-YvYZkcAx8L8Jf1Kl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.564885472993, + "y": 4943.3035115794855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 557766084, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2724, + "versionNonce": 1079149270, + "isDeleted": false, + "id": "ipgOl46q_S60cOiq2H15i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.580949904806, + "y": 4951.786305765647, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 924145788, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4019, + "versionNonce": 103562634, + "isDeleted": false, + "id": "3t4HcTrLkqCuSBstREFzS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.236892530694, + "y": 4970.027765932866, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0250242259434, + "height": 13.265055808562055, + "seed": 1910996292, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2879, + "versionNonce": 1877456918, + "isDeleted": false, + "id": "_0ne7vL5ae6DvyWyP6pAN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.528043656144, + "y": 4970.274875616177, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 541911292, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 3221, + "versionNonce": 765459530, + "isDeleted": false, + "id": "PIGzltRmJ5XYDkegZe-Hr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8101.491758871077, + "y": 4971.843483567001, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68305732718771, + "height": 12.882513028906299, + "seed": 101659844, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4384, + "versionNonce": 2040808790, + "isDeleted": false, + "id": "MUbrBIAMLgydeK2Ws6d3i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8162.435773106561, + "y": 5033.307166872926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.4853049136045, + "height": 12.54333485655143, + "seed": 1361828348, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3134, + "versionNonce": 363717386, + "isDeleted": false, + "id": "dd7u2PZ1zVqdyOkDPBNNl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.162567056757, + "y": 5033.128232197127, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 194237380, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3445, + "versionNonce": 1323117206, + "isDeleted": false, + "id": "G1A2w4NSJWDgeDxUmeQ1a", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8081.223570959986, + "y": 5034.269044887318, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.65095252199248, + "height": 12.882513028906299, + "seed": 118962812, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4393, + "versionNonce": 2026959306, + "isDeleted": false, + "id": "f78JVgELD-T4kp8_Jj0vs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.684142951307, + "y": 5054.0267076817245, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.04099507611033, + "height": 12.450350636728704, + "seed": 82623300, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3280, + "versionNonce": 1850173398, + "isDeleted": false, + "id": "0JT-g6JZWPFxNuxfkUu6r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.436239482513, + "y": 5053.801280896015, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 432179964, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 5208, + "versionNonce": 170141834, + "isDeleted": false, + "id": "NBUIuWNc4XNG2JvboYDXY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.036259832755, + "y": 5074.737610063176, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.00385353066673, + "height": 12.818491859556932, + "seed": 1102885572, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4103, + "versionNonce": 938999062, + "isDeleted": false, + "id": "NZHUam7V_zPHM7v7CgVb5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.619718032356, + "y": 5074.761437771985, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1269812092, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 3124, + "versionNonce": 1633847114, + "isDeleted": false, + "id": "I8NljSc1Ej5eZmuPd1Qrd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.225252761273, + "y": 5079.738169129245, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1621211716, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3239, + "versionNonce": 1097067094, + "isDeleted": false, + "id": "fxiYQHuHqHK2Y0jIYFTaw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.354234612098, + "y": 5088.558272518532, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1059126268, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3248, + "versionNonce": 1726418442, + "isDeleted": false, + "id": "lVLMbT4bwM9GJgo-CG7Mt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8495.37029904391, + "y": 5097.041066704693, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2088358340, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4537, + "versionNonce": 694169494, + "isDeleted": false, + "id": "nA69uKhm3de-edu_ff_Og", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.689879992006, + "y": 5115.687001831034, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.8318062634003, + "height": 12.779961809929308, + "seed": 2115509372, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1956, + "versionNonce": 1068285130, + "isDeleted": false, + "id": "TqFtnQQLXmpMMb6AFVW4P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8228.616870832182, + "y": 4762.148022763788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 16.10314128613287, + "seed": 610466116, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 3274, + "versionNonce": 1814154454, + "isDeleted": false, + "id": "VTGah6UmKF3WyxnNTkjSk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8246.84904251731, + "y": 4976.755859831664, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 39267580, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3451, + "versionNonce": 961450890, + "isDeleted": false, + "id": "vaQIhw_7918UcsJ953lZs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.081251047915, + "y": 4988.848638564923, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1404776644, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3635, + "versionNonce": 926794262, + "isDeleted": false, + "id": "voJjo1Jea8ORPwIAzcH23", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.029573935786, + "y": 5000.941762323182, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1029713276, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2114, + "versionNonce": 906465866, + "isDeleted": false, + "id": "G0yG8l61FHIB4slmJTASi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.828827363644, + "y": 4785.472025183069, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1780512836, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2318, + "versionNonce": 1034489686, + "isDeleted": false, + "id": "xkkOvyQRGzKGQcPP9BiS1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.295219528718, + "y": 4832.232231284512, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 544546300, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2434, + "versionNonce": 414365962, + "isDeleted": false, + "id": "QrDUq2t360awQYNrHdvVM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.480039673024, + "y": 4841.1081729672815, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 594595780, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2443, + "versionNonce": 196654230, + "isDeleted": false, + "id": "q9SAAymlcDFjYc0Pc7lYc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.496104104837, + "y": 4849.590967153443, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 613940860, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2266, + "versionNonce": 818612170, + "isDeleted": false, + "id": "PrKooB1iFm1o801REWaIA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.037315906295, + "y": 4806.35998572914, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 264910660, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 3087, + "versionNonce": 1528934870, + "isDeleted": false, + "id": "yvMEmi5k435cXP1laZZ9K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.157527746065, + "y": 4827.373873662075, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1384828668, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 2911, + "versionNonce": 644578954, + "isDeleted": false, + "id": "63EgSRoT_HDMuUHpI2wwW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.971844866887, + "y": 4868.232449315619, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 193638084, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3000, + "versionNonce": 1727596310, + "isDeleted": false, + "id": "tsAGTFbP0w-XzJ-kLhOR4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.800305773316, + "y": 4888.695853913638, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1255116668, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3146, + "versionNonce": 1716460874, + "isDeleted": false, + "id": "pHwG-tUQQ9tOcn4L-VeSz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.008794315966, + "y": 4909.716095404579, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 928003652, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3975, + "versionNonce": 1068741718, + "isDeleted": false, + "id": "qGgn-knVOrfekdGlJBnYg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.1290061557365, + "y": 4929.584876606845, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1302872060, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2694, + "versionNonce": 231793674, + "isDeleted": false, + "id": "tVWzSiFrFBOLZFZnED4Ho", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.26916058402, + "y": 4934.358568952156, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1878576580, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2810, + "versionNonce": 522631574, + "isDeleted": false, + "id": "oqMf6HiKkCCIp8PMPkAEM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.453980728324, + "y": 4943.234510634927, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1125572732, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2819, + "versionNonce": 1458295498, + "isDeleted": false, + "id": "7c1B6_sMO2CvD0KlIyQCU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.470045160137, + "y": 4951.717304821088, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1185051972, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3278, + "versionNonce": 1015486166, + "isDeleted": false, + "id": "FNRZxLXaWjv0s9Mlb8SeX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.945785922185, + "y": 4970.18160219486, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1121808636, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3536, + "versionNonce": 70969738, + "isDeleted": false, + "id": "6c-jIZNsr2ZM9AJBBht9l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.645493205902, + "y": 5033.211144060343, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2024484036, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3684, + "versionNonce": 543804438, + "isDeleted": false, + "id": "pFCsIHHitRi2ZhUtZJA6p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.788797865448, + "y": 5053.708007474698, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 478015868, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4503, + "versionNonce": 1291397194, + "isDeleted": false, + "id": "iIOgPUeacSb3Alv-V-Vhv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.910607244777, + "y": 5074.526293546263, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1739650116, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 3219, + "versionNonce": 2026101078, + "isDeleted": false, + "id": "osP2WP8UVaQebr0aNoplx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.114348016607, + "y": 5079.669168184685, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1597661692, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3334, + "versionNonce": 1224838922, + "isDeleted": false, + "id": "Rw7Rk-JjGrXWypyGNqBMs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.243329867428, + "y": 5088.489271573973, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 294767556, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3343, + "versionNonce": 1827290774, + "isDeleted": false, + "id": "V9ZxMTjYixskOBg0dbC48", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.259394299243, + "y": 5096.972065760135, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1645527676, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3525, + "versionNonce": 1557077450, + "isDeleted": false, + "id": "ZE-bxacxCg_SbcKwzaApA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.397134463045, + "y": 5115.467923327504, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 141275972, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 3098, + "versionNonce": 1905392598, + "isDeleted": false, + "id": "NqMAtiDmnyzgkNVxZQd1-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8446.114623448917, + "y": 5115.570542338441, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1271862012, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3336, + "versionNonce": 628937866, + "isDeleted": false, + "id": "9JZrYFWd3UUnq7UP1SuKg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8081.875341800956, + "y": 5116.834445736295, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.93920382488311, + "height": 12.882513028906299, + "seed": 1788652228, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 2213, + "versionNonce": 483397910, + "isDeleted": false, + "id": "5584mfvXR9yFZO8g1jmNn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8359.138758031719, + "y": 4761.8211374652055, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70081644742213, + "height": 16.10314128613287, + "seed": 1621083076, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.8825130289063, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 3089, + "versionNonce": 1690678090, + "isDeleted": false, + "id": "O9Kvj6eLM6H6hmPPvWNo9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8383.168888977889, + "y": 4976.702788032109, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1291995772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3268, + "versionNonce": 2048491094, + "isDeleted": false, + "id": "xve1-V0HBTOqzzQos71oI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8383.168888977889, + "y": 4988.79556676537, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 855288644, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3452, + "versionNonce": 1829026314, + "isDeleted": false, + "id": "R6_Ze1cuukQW2r5fD3SST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8383.168888977889, + "y": 5000.888690523628, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 265001724, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2105, + "versionNonce": 1581466518, + "isDeleted": false, + "id": "CMYpBijGLpfUgY23dKLjA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4785.654361675235, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1485611716, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2379, + "versionNonce": 221571274, + "isDeleted": false, + "id": "QbmJIOUGJnQOJUlO78ZxI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8386.389517235117, + "y": 4833.027222989542, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1041685372, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2511, + "versionNonce": 998400214, + "isDeleted": false, + "id": "cV8PN7qA8BJw_lONOJwOq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8386.389517235117, + "y": 4841.903164672314, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2012457540, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2520, + "versionNonce": 2096185226, + "isDeleted": false, + "id": "Q8qmim-K5AsAoL15OvtG8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8386.389517235117, + "y": 4850.3859588584755, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1915096060, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2254, + "versionNonce": 1970001430, + "isDeleted": false, + "id": "sqcEz8otkdaSy92f5nfaL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4806.3627732579425, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 873316804, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 3073, + "versionNonce": 1215610442, + "isDeleted": false, + "id": "d97TU4XaCU4To7bOVfpfI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4827.376661190876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 771435644, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 2889, + "versionNonce": 888447830, + "isDeleted": false, + "id": "Zc6JvrIVPgzc5jZnoFfil", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4868.170052961317, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 603515204, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2994, + "versionNonce": 1016751370, + "isDeleted": false, + "id": "SMKGMZrd45opis06sl9wx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4888.744458960766, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1666727164, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3134, + "versionNonce": 1014089878, + "isDeleted": false, + "id": "Yrk7GMG7j8BZKuvoSTm0d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4909.718882933382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1259544772, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3966, + "versionNonce": 1390228426, + "isDeleted": false, + "id": "II9RfHWQ2KMFRkc67os3I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8343.877224239724, + "y": 4929.524397425575, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 2076130684, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2750, + "versionNonce": 999835094, + "isDeleted": false, + "id": "cnt3z3GTBhQ09J3B0WNhJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.74539158367, + "y": 4935.153560657187, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 284846148, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2870, + "versionNonce": 492317322, + "isDeleted": false, + "id": "IC0t4QlFORaU1qJEw5tKY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.74539158367, + "y": 4944.029502339959, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1618095612, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2879, + "versionNonce": 595401494, + "isDeleted": false, + "id": "cVweW6Adrgs2fPfcLmsPy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.74539158367, + "y": 4952.512296526121, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 965525444, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3264, + "versionNonce": 851855690, + "isDeleted": false, + "id": "NImXcG7vkVN2hWfxkLr-1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.674355102732, + "y": 4970.184389723663, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 41094780, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3523, + "versionNonce": 2056603734, + "isDeleted": false, + "id": "ScGYzx9UzD1vz14-Pv7Sp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.532198432586, + "y": 5033.102930187718, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1558718276, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3664, + "versionNonce": 444764170, + "isDeleted": false, + "id": "3LuSvU6DtPYErlO3xi9Os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.59738231569, + "y": 5053.775978886604, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1652809468, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4488, + "versionNonce": 817221014, + "isDeleted": false, + "id": "_elyFz5agi2d_FEa7otku", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.59738231569, + "y": 5074.605767996367, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1600822980, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 3277, + "versionNonce": 948436682, + "isDeleted": false, + "id": "1FnWGMB9u8Yn0ymZOeQc7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.668418796628, + "y": 5080.464159889717, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 421961596, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3393, + "versionNonce": 1930668758, + "isDeleted": false, + "id": "cTGrtsFamyu4xzfDALDIN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.668418796628, + "y": 5089.3401015724885, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1773282884, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3402, + "versionNonce": 963745162, + "isDeleted": false, + "id": "ARbFnzkoEspeQP1sNUI41", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8385.668418796628, + "y": 5097.82289575865, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1587367932, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3417, + "versionNonce": 4448278, + "isDeleted": false, + "id": "OD9F4CaDCaf5P6aTtaULQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8349.59738231569, + "y": 5115.53589473941, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1620884932, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2666, + "versionNonce": 2121946186, + "isDeleted": false, + "id": "n3pvWNSkHIM7joRjUTmx2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8446.886589110118, + "y": 4909.934950515223, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 317321340, + "groupIds": [ + "KqZQ05ORsE1ZUyjHC_Ufe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 2138, + "versionNonce": 2084269398, + "isDeleted": false, + "id": "5-H16PQoIjD4ZQIblkmti", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8164.543208936322, + "y": 4090.473777544993, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.82694091047381, + "height": 382.16963157670887, + "seed": 1291159108, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1720, + "versionNonce": 159202058, + "isDeleted": false, + "id": "HnNLeCfvm6fBi4fEXF4Au", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8173.968324587369, + "y": 4093.967431264302, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70885890457433, + "height": 16.105112476611357, + "seed": 1270870012, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2513, + "versionNonce": 1146049174, + "isDeleted": false, + "id": "nfjCIlO8AyrqyBB_r2DOo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8441.86742345065, + "y": 4088.760661249503, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.81681727502402, + "height": 383.9914959088835, + "seed": 1148460484, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2452, + "versionNonce": 1760905674, + "isDeleted": false, + "id": "VIndRubLnsp77kVrLqxW3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8261.617465615525, + "y": 4089.772951695516, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.790711563602, + "height": 382.719059225012, + "seed": 45650044, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2661, + "versionNonce": 1127518166, + "isDeleted": false, + "id": "ra_mwfEPuhceTu0DMEKdR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.078823856897, + "y": 4117.787634294618, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.7486781931217, + "height": 12.915967205330695, + "seed": 255051076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1602, + "versionNonce": 603816074, + "isDeleted": false, + "id": "SicCtOVCveHa_fR5EUR1B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4117.803572906639, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 46735612, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "240.923", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1668, + "versionNonce": 1157637398, + "isDeleted": false, + "id": "5etj8mlI95-RFAaS7iCdY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.628449444059, + "y": 4117.803572906639, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1116896452, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1427, + "versionNonce": 642834250, + "isDeleted": false, + "id": "YPcWUleALYB0NWSJIaK3z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.230081571084, + "y": 4118.6680301520355, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1131651452, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1522, + "versionNonce": 1260851798, + "isDeleted": false, + "id": "UhralLSWCEfXttinDw2hv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8321.423321944158, + "y": 4094.2971444470377, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 16.105112476611357, + "seed": 405685316, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1649, + "versionNonce": 743073290, + "isDeleted": false, + "id": "jDAufKiD0BGFnHDHS-DKu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8453.183757197963, + "y": 4094.389413320603, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.74658487837905, + "height": 16.105112476611357, + "seed": 2079986172, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 1794, + "versionNonce": 1618892694, + "isDeleted": false, + "id": "gL-15ZB9q_ehT-G6sSrYF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8125.919863161142, + "y": 4119.311997768389, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1709513668, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1882, + "versionNonce": 786765002, + "isDeleted": false, + "id": "I2JiSUqH_-g3_t0Wrn0JC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8201.222419564583, + "y": 4165.182233147472, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 727609980, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2014, + "versionNonce": 1832580310, + "isDeleted": false, + "id": "LiRFN3GfCwsONuiUEAsRm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8201.222419564583, + "y": 4174.059261336996, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 366281540, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2023, + "versionNonce": 1337715594, + "isDeleted": false, + "id": "OXU8eEFbGyi3-SNmIsR4j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8201.222419564583, + "y": 4182.543093904603, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 543343356, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1880, + "versionNonce": 183626262, + "isDeleted": false, + "id": "QbPomE02QBrH75jySEDS6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.104079473414, + "y": 4164.389931997287, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 509344452, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1996, + "versionNonce": 1158277706, + "isDeleted": false, + "id": "z6aYCXY6zg7TIuLXq5RsY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.28892224161, + "y": 4173.266960186809, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 25756540, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2005, + "versionNonce": 1486370646, + "isDeleted": false, + "id": "7POB5mehMLTlo6AuMsMbt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.304988639875, + "y": 4181.750792754417, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2048393796, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1926, + "versionNonce": 1168773386, + "isDeleted": false, + "id": "DIqWkKTZTNTD5Z3mltXKs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.231240654995, + "y": 4164.421501677994, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1427321852, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2042, + "versionNonce": 1317198998, + "isDeleted": false, + "id": "DgKPLNlnKK1Um294lbiC2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.416083423193, + "y": 4173.298529867517, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 535239108, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2051, + "versionNonce": 1964466122, + "isDeleted": false, + "id": "8rLzyg5GPxf2d-k99g2-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.432149821458, + "y": 4181.782362435123, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 151213180, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2596, + "versionNonce": 308730326, + "isDeleted": false, + "id": "_rYCxJorKZ5maZK7omNpT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8198.001397069262, + "y": 4308.875385560154, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2061975876, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2771, + "versionNonce": 1332532874, + "isDeleted": false, + "id": "ZMCK_glr_Mxp8iLUTlUJG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.190157386944, + "y": 4138.546533915479, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.06403689613023, + "height": 12.820060975088683, + "seed": 2065392892, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1753, + "versionNonce": 1264135958, + "isDeleted": false, + "id": "k8-9t15onY56r1Ei5OcsA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4138.514519412379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 1651931332, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1816, + "versionNonce": 358970698, + "isDeleted": false, + "id": "DJjZ811bNOg2-sqablL7b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.836963507856, + "y": 4138.514519412379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 14509436, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1580, + "versionNonce": 1976491094, + "isDeleted": false, + "id": "fHvdpBpz9rouiOt1Ymnxc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.438595634881, + "y": 4138.570364541045, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 305315908, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 1940, + "versionNonce": 945568778, + "isDeleted": false, + "id": "m-atRuda2BodxLUtBrBGC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8126.128377224939, + "y": 4139.986794293315, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.123975463513712, + "height": 12.884089981289083, + "seed": 1871402492, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3548, + "versionNonce": 933028246, + "isDeleted": false, + "id": "EGbWldjPMGXB_pqwy-H-R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.256927092125, + "y": 4159.484985026341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.3348709316003, + "height": 12.976079252205857, + "seed": 570038212, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728755, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2572, + "versionNonce": 1179396810, + "isDeleted": false, + "id": "2oG4TBuSQavzr0N7ScGLp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4159.530979661799, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 606549628, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2640, + "versionNonce": 871907030, + "isDeleted": false, + "id": "aMHVg-PTa9_NSpeJuBa8R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.957190062794, + "y": 4159.530979661799, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 2112520004, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2383, + "versionNonce": 1439711626, + "isDeleted": false, + "id": "LsSqilbUJJsE6lpwRIfBM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.558822189822, + "y": 4159.5868247904655, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 192087804, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2762, + "versionNonce": 1601565718, + "isDeleted": false, + "id": "39z68M3DBH2LW0lHSl4gJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8125.604399280814, + "y": 4161.049329156392, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1583478468, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3293, + "versionNonce": 1914929226, + "isDeleted": false, + "id": "oiLAUvleaLAUW14fxl_m8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8159.92684653236, + "y": 4200.43264078368, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.17957428251805, + "height": 12.820060975088683, + "seed": 703645564, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2389, + "versionNonce": 1410007382, + "isDeleted": false, + "id": "3i9LtVbVWN0B3OAXyjvLF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4200.459748688442, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1073643076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2457, + "versionNonce": 119596810, + "isDeleted": false, + "id": "4mRMuYBVgyrkkqOqJ7VPx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.771484454117, + "y": 4200.459748688442, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 602044412, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2205, + "versionNonce": 621569686, + "isDeleted": false, + "id": "2P7AUnzIXk5JdD5RWTUpt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.373116581144, + "y": 4200.515593817109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1537086916, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2568, + "versionNonce": 1296266698, + "isDeleted": false, + "id": "_eqCnGsttVViwydviHEDH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.025172197396, + "y": 4201.841995441781, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 12.884089981289083, + "seed": 1162483836, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3404, + "versionNonce": 858727382, + "isDeleted": false, + "id": "OdhN-IRm8XPo4dn_69uvh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.288622465139, + "y": 4220.841724968625, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6833795189834, + "height": 13.075537174306843, + "seed": 509525316, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2491, + "versionNonce": 900082826, + "isDeleted": false, + "id": "223sA0kmQvs5PxqC1ju_u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4220.937448565134, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 166308092, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2558, + "versionNonce": 8927510, + "isDeleted": false, + "id": "md2vH6dKKcdsdbGvXjo2F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.599924362394, + "y": 4220.937448565134, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 564032708, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2307, + "versionNonce": 1443105610, + "isDeleted": false, + "id": "hvH6KQeT0QqZyFXN0aE8k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.20155648942, + "y": 4220.9932936938, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 625158524, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2658, + "versionNonce": 76326486, + "isDeleted": false, + "id": "8N0q7emNnWmuhq2yg91pP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8107.209407606606, + "y": 4222.5374615456785, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.603746427962975, + "height": 12.884089981289083, + "seed": 586890308, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3618, + "versionNonce": 1421349386, + "isDeleted": false, + "id": "UijtMLcj2YGnWZ-0DM7BZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.568368924351, + "y": 4242.466237193215, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.87032863990953, + "height": 11.872141895465793, + "seed": 177773052, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2635, + "versionNonce": 1141654, + "isDeleted": false, + "id": "OFA7GNpthSbpEzV3bjppf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4241.960263150304, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 2085819332, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2706, + "versionNonce": 1421689034, + "isDeleted": false, + "id": "CCkv3Akfm9D7Wfv8scNK2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.808438426191, + "y": 4241.960263150304, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1961622140, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4475, + "versionNonce": 1363904726, + "isDeleted": false, + "id": "RtmmAgRfBCrHxo8PiUyan", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.817508706956, + "y": 4263.27177943567, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.4196986448144, + "height": 12.453753189444956, + "seed": 465828676, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3463, + "versionNonce": 1638832010, + "isDeleted": false, + "id": "gXJy-C-R10lkpMWD_0YTB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.982534082359, + "y": 4263.0566110397485, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1862224636, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3530, + "versionNonce": 1204813334, + "isDeleted": false, + "id": "7Rt67uyoLzvrWDqxSy7rr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.928664981131, + "y": 4263.0566110397485, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2074866372, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3275, + "versionNonce": 1539774026, + "isDeleted": false, + "id": "ouNV5B-xDgmg-wJ5WqRvq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.530297108156, + "y": 4263.112456168415, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1532267388, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2248, + "versionNonce": 2022951766, + "isDeleted": false, + "id": "_coMNt7V4NVIkO6UQcb6o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4268.686463338962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 447281732, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2368, + "versionNonce": 1675738378, + "isDeleted": false, + "id": "FXYLBDI6jkoZxLePhdMy6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4277.563491528486, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2083372028, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2377, + "versionNonce": 300675222, + "isDeleted": false, + "id": "FKPP6B-ub-5ZwQ1JITe8z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4286.047324096093, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1939411396, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2251, + "versionNonce": 1199147978, + "isDeleted": false, + "id": "pXE_Vb1LThYWfpg-sseTU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.07801733883, + "y": 4267.894162188777, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2072829052, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2367, + "versionNonce": 797797846, + "isDeleted": false, + "id": "UpbmEzy2iNh8CL64Ap0n4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.262860107026, + "y": 4276.771190378299, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1973041476, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2376, + "versionNonce": 1823048330, + "isDeleted": false, + "id": "X0xjqF5lL0dXgMfocKLKy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.27892650529, + "y": 4285.255022945907, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1932782844, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2297, + "versionNonce": 781009686, + "isDeleted": false, + "id": "0fswizsqIMXnlSH0jg1__", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.205178520411, + "y": 4267.925731869484, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2081059012, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2413, + "versionNonce": 1043112266, + "isDeleted": false, + "id": "77IZEo25LdPIVbiqZzbhN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.39002128861, + "y": 4276.802760059006, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1956965756, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2422, + "versionNonce": 23097430, + "isDeleted": false, + "id": "SRRxPQdorEpl4EAeFMdF2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.406087686873, + "y": 4285.286592626613, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1183299652, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3717, + "versionNonce": 392030218, + "isDeleted": false, + "id": "tUYk9IUYIjII8pdITVhw-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.021103153846, + "y": 4303.530285736582, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0749706946756, + "height": 13.266679588124175, + "seed": 287432188, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2761, + "versionNonce": 64746902, + "isDeleted": false, + "id": "du5MaoTWL5p-RgRACoBhT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.540489091714, + "y": 4303.72158054, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 61.843631910187604, + "height": 12.884089981289083, + "seed": 1894780868, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2831, + "versionNonce": 808998602, + "isDeleted": false, + "id": "HnPioX-NmSD9mPg6Y03CL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.745422319533, + "y": 4303.72158054, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1638710908, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2576, + "versionNonce": 1328861910, + "isDeleted": false, + "id": "zhTWjAXWx0AfDBCK67uVj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.34705444656, + "y": 4303.777425668666, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1801549636, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 2918, + "versionNonce": 156691850, + "isDeleted": false, + "id": "zaFVWh9X8Iu4JTtIpWxLT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8100.2686560740385, + "y": 4305.346225633272, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68999591767197, + "height": 12.884089981289083, + "seed": 252153596, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 2775, + "versionNonce": 234883094, + "isDeleted": false, + "id": "DwtKLXA8mAgAtk8R4DXK9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8198.001397069262, + "y": 4320.969644574178, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1916399300, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2959, + "versionNonce": 1475652682, + "isDeleted": false, + "id": "hzYdOLT7hR0JmFlA15GE_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8198.001397069262, + "y": 4333.064248655436, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1504989052, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2840, + "versionNonce": 1345492310, + "isDeleted": false, + "id": "qfCsU-Jmig9Y32VjsFl0S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8339.657725435032, + "y": 4308.931251726268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 102200900, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3017, + "versionNonce": 1911329546, + "isDeleted": false, + "id": "w8atK3lzklq62XGgZBSxu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8339.889962390356, + "y": 4321.025510740293, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 569704444, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3201, + "versionNonce": 1596029590, + "isDeleted": false, + "id": "dIbHx1-Z6uXRZdjNp8D9u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8339.838278952415, + "y": 4333.1201148215505, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1675103684, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2903, + "versionNonce": 968466890, + "isDeleted": false, + "id": "9s1rO8PxQNmwy-hYMhFwh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8493.28168968378, + "y": 4308.915314375379, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1875615868, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3080, + "versionNonce": 293713878, + "isDeleted": false, + "id": "bx1wVaoiWTaf-q9YqVw12", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8493.513926639103, + "y": 4321.009573389404, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2090448196, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3264, + "versionNonce": 175560842, + "isDeleted": false, + "id": "f3TQcnoMBR_Z2oNqVxJ9P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8493.462243201162, + "y": 4333.104177470662, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2063216892, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4087, + "versionNonce": 526929174, + "isDeleted": false, + "id": "exAsU_Q8cO859ieYnteEU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8161.297112694359, + "y": 4365.452041520142, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.5349404945144, + "height": 12.5448702900298, + "seed": 1840934084, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3022, + "versionNonce": 601831242, + "isDeleted": false, + "id": "dSI8PDxoRgJe-ZqN1j3On", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4365.282431674513, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 855814524, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3090, + "versionNonce": 1984576086, + "isDeleted": false, + "id": "_IL1NZ-X8U3RnmwgE1vXF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.522075053634, + "y": 4365.282431674513, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 2027435076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2835, + "versionNonce": 374193674, + "isDeleted": false, + "id": "_wiKXkinUtPkIw0RVqaet", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.123707180659, + "y": 4365.338276803179, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1193746940, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3147, + "versionNonce": 217874326, + "isDeleted": false, + "id": "XOHaqa42PkHAC_HEl-8Zu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8080.074969337138, + "y": 4366.4140372783195, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.66033538867005, + "height": 12.884089981289083, + "seed": 2077297604, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4096, + "versionNonce": 784166090, + "isDeleted": false, + "id": "Ctm0h5VnfpqJcZO29PVyv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.545390531826, + "y": 4386.174118614305, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.0906986792239, + "height": 12.451874687980121, + "seed": 778666620, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3166, + "versionNonce": 934550742, + "isDeleted": false, + "id": "bMknO3jgMotthVkocvvTB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4385.958010967651, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 1757606724, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3243, + "versionNonce": 1657357194, + "isDeleted": false, + "id": "MzBfcD3cZHYD8WfcNEz9M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.730589117431, + "y": 4385.958010967651, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 797692668, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2981, + "versionNonce": 2080772630, + "isDeleted": false, + "id": "U8WZgRjUXECE7emqki-S0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.332221244456, + "y": 4386.013856096318, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1040968388, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 4907, + "versionNonce": 1017922122, + "isDeleted": false, + "id": "q9Yg7QYhvg2dfGMNn0Tgv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8159.8974281057035, + "y": 4406.887556223689, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.05367499757995, + "height": 12.820060975088683, + "seed": 1762661244, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3989, + "versionNonce": 1692884822, + "isDeleted": false, + "id": "qy7h07retrv7hCuomrChz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4406.855541720589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 2118775364, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 4062, + "versionNonce": 1195469066, + "isDeleted": false, + "id": "mfzYWRJrS_kOhJE7AzuRE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8265.787221545199, + "y": 4406.855541720589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1496859644, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3804, + "versionNonce": 1454179478, + "isDeleted": false, + "id": "xX7l4AMXxcwjCCKt1Ju1e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8444.452447799396, + "y": 4406.911386849255, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 677054916, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2780, + "versionNonce": 2047064010, + "isDeleted": false, + "id": "o5wl0ubOB494-FQTl1e1w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4412.649458879209, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1711694972, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2896, + "versionNonce": 1661731286, + "isDeleted": false, + "id": "HUj9ygNCZk9YBSOFL3Oyx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4421.526487068733, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 794636612, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2905, + "versionNonce": 621686410, + "isDeleted": false, + "id": "SgdnWHdrjzaLglwZbP-z_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8200.57821506552, + "y": 4430.010319636341, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1698460924, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2781, + "versionNonce": 488199958, + "isDeleted": false, + "id": "tgwqzJs6reSQ8BwnH6rks", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.00016803007, + "y": 4411.857157729024, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1924032708, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2896, + "versionNonce": 1562103114, + "isDeleted": false, + "id": "-8gQ287vjpgaJF1FS6S2L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.1291656696, + "y": 4420.67834078988, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 610039164, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2905, + "versionNonce": 1833567318, + "isDeleted": false, + "id": "EPZ1FPo1way9vjvQt57v6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.145232067865, + "y": 4429.1621733574875, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 904704068, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2827, + "versionNonce": 1736938506, + "isDeleted": false, + "id": "GYHImLEs5SAWd3ZMZTkKc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.12732921165, + "y": 4411.8887274097315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1890084348, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2942, + "versionNonce": 1702037910, + "isDeleted": false, + "id": "ghoL38oTRlwZJRUWVypuy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.256326851182, + "y": 4420.709910470587, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 418777028, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2951, + "versionNonce": 642548426, + "isDeleted": false, + "id": "HwJMFBWnRzTv-8ezhhzEu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8494.272393249446, + "y": 4429.193743038194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 522339964, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4240, + "versionNonce": 348743382, + "isDeleted": false, + "id": "uSconJ3cXahhwx9h4herL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8160.551128274799, + "y": 4447.841960619189, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.881484259647, + "height": 12.78152620898583, + "seed": 266891076, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2918, + "versionNonce": 67475850, + "isDeleted": false, + "id": "WWqexOkF8TOjOhoPnyVNB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.502763117909, + "y": 4447.790678733038, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 344725244, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 3078, + "versionNonce": 1541544982, + "isDeleted": false, + "id": "fJd-8RUnGnuVrAjT4cZse", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8266.273808319413, + "y": 4447.790678733038, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1528948420, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2799, + "versionNonce": 1609422922, + "isDeleted": false, + "id": "HBLDeQoWpyHplcLXKzTEN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8445.01068825205, + "y": 4447.790678733038, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1298651004, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 3038, + "versionNonce": 1085417814, + "isDeleted": false, + "id": "xWXRy-GEKUQe5h6-ngIiw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8080.726819961577, + "y": 4448.989544983412, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.94874438679896, + "height": 12.884089981289083, + "seed": 2134928964, + "groupIds": [ + "SFjs2eP4Qk18T47rjVn5-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 4594, + "versionNonce": 2044739338, + "isDeleted": false, + "id": "tLLMWNqbQJQBg289zzcvL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8628.889204560171, + "y": 4208.455819988283, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 240255044, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3543, + "versionNonce": 1116638870, + "isDeleted": false, + "id": "WoZuW6EiWStyGlbffEhtN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8644.341818150597, + "y": 4245.269835210445, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 939529724, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3006, + "versionNonce": 1582812618, + "isDeleted": false, + "id": "ZZmzvsAD55e4l0vCrUmSy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.140875455123, + "y": 4248.897928361612, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1479628740, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3817, + "versionNonce": 774654934, + "isDeleted": false, + "id": "TwARQcO_ozN7_xXiWlyZL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8747.57229039697, + "y": 4244.312802203882, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 259708, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4672, + "versionNonce": 1383040138, + "isDeleted": false, + "id": "QZ7vKFM6_GLD0TlYFTakW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8638.725851902398, + "y": 4272.892745435941, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1798946628, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2841, + "versionNonce": 1906336022, + "isDeleted": false, + "id": "tvMygkREm3tH0LeW6EnH7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8680.962251018516, + "y": 4275.317042413032, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1303889660, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 2945, + "versionNonce": 1071801162, + "isDeleted": false, + "id": "KOSGU46wM-Yy34eNia9Ct", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8749.689727335766, + "y": 4274.4496477208, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1607022276, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2802, + "versionNonce": 1885326934, + "isDeleted": false, + "id": "tMfnXCr5mOiOA5Mgypdhy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8818.056950887241, + "y": 4249.192929960411, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 1167951740, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3092, + "versionNonce": 554396170, + "isDeleted": false, + "id": "vGCIGLDFnE7HQsE6VVnAq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8684.89807604402, + "y": 4303.402850575718, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 310230596, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3208, + "versionNonce": 1463784342, + "isDeleted": false, + "id": "99TdHICzQ0lqFqOKuC8Pw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8685.09718255292, + "y": 4312.964891381781, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 737622012, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3217, + "versionNonce": 1826986186, + "isDeleted": false, + "id": "HSz2waOXLDV6epfNcgTPW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8685.114488745097, + "y": 4322.103394884451, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 473257412, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3179, + "versionNonce": 1886695638, + "isDeleted": false, + "id": "qGfv5ZeYCiqJsAJ41Np0F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8832.317253638486, + "y": 4302.489255490206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1824970876, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3295, + "versionNonce": 51113866, + "isDeleted": false, + "id": "V2gu_TxL3PSdpAZ4_w7z-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8832.516360147383, + "y": 4312.0512962962675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1242430788, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3304, + "versionNonce": 2006197782, + "isDeleted": false, + "id": "ydD1HKsXFz6YEomSK6Bsl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8832.533666339561, + "y": 4321.189799798937, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 600729852, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4315, + "versionNonce": 398028362, + "isDeleted": false, + "id": "qf0yhexwBjimhSLkqph-5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8639.03448520786, + "y": 4295.599359568441, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 358986948, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2993, + "versionNonce": 1838347094, + "isDeleted": false, + "id": "UqpW8hB8t97_OtXbc7WPg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8668.089195610477, + "y": 4296.199417083434, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 613411196, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3088, + "versionNonce": 533271818, + "isDeleted": false, + "id": "FDV27XyimCkqP5y0RbpaT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8751.302163287988, + "y": 4295.931861467188, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 467303492, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4210, + "versionNonce": 1824921750, + "isDeleted": false, + "id": "m3dAQmkvd0DAYuhgjbXAk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8639.75394332215, + "y": 4337.34911017225, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 38623740, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3152, + "versionNonce": 1018553290, + "isDeleted": false, + "id": "yTgOQagoQjaZuexlO2k0G", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8644.521602342294, + "y": 4338.482118985213, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 390747076, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3260, + "versionNonce": 2095224278, + "isDeleted": false, + "id": "jdjij0FkzNjIAx7aUirKV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8749.845797463124, + "y": 4337.978642731308, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 403225212, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3072, + "versionNonce": 681237130, + "isDeleted": false, + "id": "n5yXnT6yEzdfdGOIRUMZV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8749.151144502997, + "y": 4214.437756282874, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 1439906628, + "groupIds": [ + "7EauSx6LMJIRyWpUtln5B" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728756, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2235, + "versionNonce": 974062666, + "isDeleted": false, + "id": "tMJHH9xDGv7l-YOVB9Olh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8154.5483900876625, + "y": 5801.4695152643535, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.82694091047381, + "height": 382.16963157670887, + "seed": 962946684, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1817, + "versionNonce": 1971961174, + "isDeleted": false, + "id": "QTDJG-6VzZ9ZwERAzL994", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8163.97350573871, + "y": 5804.963168983663, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70885890457433, + "height": 16.105112476611357, + "seed": 115822404, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2610, + "versionNonce": 1325132554, + "isDeleted": false, + "id": "z6GNnLrwh40CDh9qaXalO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8431.872604601991, + "y": 5799.756398968863, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.81681727502402, + "height": 383.9914959088835, + "seed": 963327740, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2549, + "versionNonce": 525574806, + "isDeleted": false, + "id": "CvO-ZTWVJmnoVB20GDlf0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8251.622646766866, + "y": 5800.7686894148765, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.790711563602, + "height": 382.719059225012, + "seed": 1329907396, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2758, + "versionNonce": 1797126602, + "isDeleted": false, + "id": "N3e0tK-nGSqKjveCswdfw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.084005008237, + "y": 5828.783372013978, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.7486781931217, + "height": 12.915967205330695, + "seed": 1231222652, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1699, + "versionNonce": 1496244182, + "isDeleted": false, + "id": "0CqvMrOtiLf5KThIAD4eO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5828.799310625999, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 738676292, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "240.923", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1765, + "versionNonce": 1032859786, + "isDeleted": false, + "id": "51qBjF1iCt5vwPO94Hpti", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.6336305954, + "y": 5828.799310625999, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1972283388, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1524, + "versionNonce": 1194358038, + "isDeleted": false, + "id": "3PJqxIpSSrF87oji1ekoj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.235262722425, + "y": 5829.663767871395, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1846339012, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1619, + "versionNonce": 1510838090, + "isDeleted": false, + "id": "nyTumWhlHJmboxX9angpn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8311.428503095498, + "y": 5805.292882166398, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 16.105112476611357, + "seed": 1911572604, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1746, + "versionNonce": 1120756310, + "isDeleted": false, + "id": "cCDYA7WGkGb-EkALX5mt7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8443.188938349303, + "y": 5805.3851510399645, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.74658487837905, + "height": 16.105112476611357, + "seed": 443780420, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 1891, + "versionNonce": 619779594, + "isDeleted": false, + "id": "OUhG7K13uhTVIfbOW1sG6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8115.925044312482, + "y": 5830.307735487749, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 575265020, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 1979, + "versionNonce": 786081686, + "isDeleted": false, + "id": "cJnH18CbtyfkxB4Lp1gGb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8191.2276007159235, + "y": 5876.177970866832, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1654211780, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2111, + "versionNonce": 1060488394, + "isDeleted": false, + "id": "ndcf2a1JEpeOAJwB0u1u5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8191.2276007159235, + "y": 5885.054999056357, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 572348796, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2120, + "versionNonce": 1267549398, + "isDeleted": false, + "id": "XoQ3Vtdh3dC4snmoTvvQE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8191.2276007159235, + "y": 5893.538831623963, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 471600196, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 1977, + "versionNonce": 1920375690, + "isDeleted": false, + "id": "8gA_vCpXXRPyOAnTxv2Tm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.109260624755, + "y": 5875.3856697166475, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1286392316, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2093, + "versionNonce": 175782422, + "isDeleted": false, + "id": "BiWnIZACXW76-aOb-dhil", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.294103392951, + "y": 5884.262697906171, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 953803716, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2102, + "versionNonce": 485399114, + "isDeleted": false, + "id": "Ipu3HaB5ay0a2NMS5Y8aZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.310169791215, + "y": 5892.746530473777, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1157245564, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2023, + "versionNonce": 1654032214, + "isDeleted": false, + "id": "iASlv7vBVXBhTpV0YTOrv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.236421806334, + "y": 5875.417239397354, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1055968068, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2139, + "versionNonce": 494453002, + "isDeleted": false, + "id": "0U_Ze_8tB-rEjM3hBY9a9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.421264574532, + "y": 5884.294267586877, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2110225148, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2148, + "versionNonce": 607595670, + "isDeleted": false, + "id": "kBDSNyhwbxmpSQd8l44is", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.437330972796, + "y": 5892.778100154484, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1086243524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2693, + "versionNonce": 1066405834, + "isDeleted": false, + "id": "ogmq7lj04ospfMJIeK7Nl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.006578220602, + "y": 6019.871123279515, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1100397436, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 2868, + "versionNonce": 1292970454, + "isDeleted": false, + "id": "d0MB-1vFF33ax25FBTt5f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.195338538284, + "y": 5849.542271634839, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.06403689613023, + "height": 12.820060975088683, + "seed": 1424083524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1850, + "versionNonce": 659523210, + "isDeleted": false, + "id": "IAd5vDK8YJBDJKLnC5apo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5849.510257131739, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 984214524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 1913, + "versionNonce": 1547271958, + "isDeleted": false, + "id": "oCRaWV1sykBJ-qn0ZU2PU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.842144659196, + "y": 5849.510257131739, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 238543300, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1677, + "versionNonce": 1030890826, + "isDeleted": false, + "id": "rLYn8sqzOYTBp_xVhw6ZU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.443776786222, + "y": 5849.566102260406, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 2063797372, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 2037, + "versionNonce": 639970390, + "isDeleted": false, + "id": "2hCCp_dGiQMqdxmfuJTfx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8116.133558376279, + "y": 5850.982532012676, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.123975463513712, + "height": 12.884089981289083, + "seed": 1943996740, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3645, + "versionNonce": 458419210, + "isDeleted": false, + "id": "WXaUqvGsC_h79XNjh1JM0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.262108243465, + "y": 5870.480722745701, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.3348709316003, + "height": 12.976079252205857, + "seed": 73669884, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2669, + "versionNonce": 682176918, + "isDeleted": false, + "id": "fopC9hjwrPetggXkDEnMf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5870.52671738116, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 2033533124, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2737, + "versionNonce": 1995233994, + "isDeleted": false, + "id": "Dx0rUTmWINJVGC8MNQRhZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.962371214135, + "y": 5870.52671738116, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1347362172, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2480, + "versionNonce": 1593478870, + "isDeleted": false, + "id": "yRs66yiyIr3DRjvEk1zxy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.564003341162, + "y": 5870.582562509825, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1977124932, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 2859, + "versionNonce": 249229706, + "isDeleted": false, + "id": "-SexBZ9sV47LV5PLt84hL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8115.609580432154, + "y": 5872.045066875752, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1476791804, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3390, + "versionNonce": 363742230, + "isDeleted": false, + "id": "q75lZrJdEYqPLFYTh1Dmd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8149.932027683701, + "y": 5911.428378503041, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.17957428251805, + "height": 12.820060975088683, + "seed": 497475524, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2486, + "versionNonce": 374878282, + "isDeleted": false, + "id": "S6mpwe2w0tQWBVBnxDBCc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5911.455486407803, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 478867068, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2554, + "versionNonce": 1052332374, + "isDeleted": false, + "id": "uBpkoLV1aOVVECSeuoyxp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.776665605457, + "y": 5911.455486407803, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2025736004, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2302, + "versionNonce": 557815562, + "isDeleted": false, + "id": "T2ZjKX96-gH8eMP3VH1an", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.378297732484, + "y": 5911.51133153647, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 782221052, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2665, + "versionNonce": 1165014678, + "isDeleted": false, + "id": "FWpJ9rCnqP4LQrLlLP_ep", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8098.030353348737, + "y": 5912.837733161142, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 12.884089981289083, + "seed": 1534901956, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3501, + "versionNonce": 269231562, + "isDeleted": false, + "id": "8ImvMmUsEfkbYihIfTof5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.29380361648, + "y": 5931.837462687986, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6833795189834, + "height": 13.075537174306843, + "seed": 918978428, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2588, + "versionNonce": 1653175254, + "isDeleted": false, + "id": "D_8yt1Ad_T7Bd8LpD2gU2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5931.933186284495, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1585464900, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2655, + "versionNonce": 2077809802, + "isDeleted": false, + "id": "b6D4lojDl9I0D_vWxUhgR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.605105513734, + "y": 5931.933186284495, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2101424124, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2404, + "versionNonce": 1880656150, + "isDeleted": false, + "id": "xKmKcev8RE1QkRiHAs57k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.206737640761, + "y": 5931.989031413162, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1453776324, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2755, + "versionNonce": 576764746, + "isDeleted": false, + "id": "xE91qIgI91dMfzE3jUX-v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8097.214588757946, + "y": 5933.533199265038, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.603746427962975, + "height": 12.884089981289083, + "seed": 1913770108, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3715, + "versionNonce": 1033041494, + "isDeleted": false, + "id": "rak3HO3nctRMWnMverxdw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.573550075691, + "y": 5953.461974912577, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.87032863990953, + "height": 11.872141895465793, + "seed": 1292797252, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2732, + "versionNonce": 1375650314, + "isDeleted": false, + "id": "dW-wqHtGuhYbr0d5RtkEb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5952.9560008696635, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 888824060, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2803, + "versionNonce": 1674427286, + "isDeleted": false, + "id": "K7hfLwAQDs190trTgMSFu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.813619577531, + "y": 5952.9560008696635, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1997880516, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4572, + "versionNonce": 1437462730, + "isDeleted": false, + "id": "0zm4BAn5EMMbXhdqQID3S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.822689858296, + "y": 5974.267517155032, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.4196986448144, + "height": 12.453753189444956, + "seed": 494723452, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3560, + "versionNonce": 419289302, + "isDeleted": false, + "id": "cg2Z3Pt6rOZka0FyhAwLX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8178.987715233699, + "y": 5974.052348759108, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 777585732, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3627, + "versionNonce": 1627998090, + "isDeleted": false, + "id": "qa5r1KIySBrmFxx7ARGEb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.933846132471, + "y": 5974.052348759108, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1121669628, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3372, + "versionNonce": 79187478, + "isDeleted": false, + "id": "FXSp61p59sxx_i16YN2uy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.535478259495, + "y": 5974.108193887775, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1756879812, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2345, + "versionNonce": 2085340746, + "isDeleted": false, + "id": "qLBQ2sgwPimN1SMdRaFOr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5979.682201058323, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 68661884, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2465, + "versionNonce": 334633814, + "isDeleted": false, + "id": "ekMNO9cK1ERQyQQ3SlIAu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5988.559229247846, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 810533700, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2474, + "versionNonce": 1884318986, + "isDeleted": false, + "id": "Oo5tzz9_znerLf2dZBtMu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 5997.043061815452, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 267649788, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2348, + "versionNonce": 1291862166, + "isDeleted": false, + "id": "eC9ZWLDkPsYvQPwFxLMKu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.08319849017, + "y": 5978.889899908138, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 461290180, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2464, + "versionNonce": 848444362, + "isDeleted": false, + "id": "qshrm1GEylcXM2OiBY-pZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.268041258367, + "y": 5987.76692809766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1827816316, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2473, + "versionNonce": 597147094, + "isDeleted": false, + "id": "nFAkRhkZM6XzhErRfMCU_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.284107656631, + "y": 5996.250760665268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1155711556, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2394, + "versionNonce": 1361851018, + "isDeleted": false, + "id": "o9z3mEt-upAy8W9nhSVgB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.21035967175, + "y": 5978.921469588843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 22311932, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2510, + "versionNonce": 1288540950, + "isDeleted": false, + "id": "nQ7RHr2DHXd91NDT6PeZq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.395202439948, + "y": 5987.798497778366, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1129961924, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2519, + "versionNonce": 1591300426, + "isDeleted": false, + "id": "JShrwIiZ7Q8cNSCKRakVL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.411268838212, + "y": 5996.282330345973, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 454857852, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3814, + "versionNonce": 320258134, + "isDeleted": false, + "id": "p055Rix90urW7eyLOQnqj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.026284305186, + "y": 6014.526023455942, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0749706946756, + "height": 13.266679588124175, + "seed": 570556740, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2858, + "versionNonce": 1593088010, + "isDeleted": false, + "id": "YS54xQkRA5ufn92rNEhxT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8172.545670243055, + "y": 6014.717318259361, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 61.843631910187604, + "height": 12.884089981289083, + "seed": 2014094588, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 2928, + "versionNonce": 709379478, + "isDeleted": false, + "id": "6IhtpNjUBKJv3X9XT8nFk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.750603470873, + "y": 6014.717318259361, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1480145092, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2673, + "versionNonce": 830015178, + "isDeleted": false, + "id": "L7QmQmYHFpoIJ-EQloHmQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.3522355979, + "y": 6014.773163388028, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1302766972, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 3015, + "versionNonce": 60236502, + "isDeleted": false, + "id": "jvw-B8H_zFLe4jMAykvdl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8090.273837225379, + "y": 6016.341963352633, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68999591767197, + "height": 12.884089981289083, + "seed": 1100841028, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 2872, + "versionNonce": 2130812298, + "isDeleted": false, + "id": "berO2PFT-n6YVo9ZAYorw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.006578220602, + "y": 6031.965382293539, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1361876476, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3056, + "versionNonce": 563632150, + "isDeleted": false, + "id": "Q1m0-cIfEV4oe_QTnAYBT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8188.006578220602, + "y": 6044.059986374797, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 369940420, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2937, + "versionNonce": 617176138, + "isDeleted": false, + "id": "iuvrlmHdzMu2Z5Mi9xkJB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8329.662906586373, + "y": 6019.926989445629, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1067480700, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3114, + "versionNonce": 1816192342, + "isDeleted": false, + "id": "_ruJpQLkJgfq01_UeZ-0b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8329.895143541697, + "y": 6032.021248459653, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1638219588, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3298, + "versionNonce": 548094730, + "isDeleted": false, + "id": "6xnsQD0Bz4-7EGcvSQC-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8329.843460103755, + "y": 6044.115852540911, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1707362044, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3000, + "versionNonce": 82168470, + "isDeleted": false, + "id": "AuRxkkcQawO4ed-ASofTe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8483.28687083512, + "y": 6019.911052094739, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 2093266628, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3177, + "versionNonce": 2099401162, + "isDeleted": false, + "id": "4kmqaGsX4VQ6kSipSP3Ov", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8483.519107790442, + "y": 6032.0053111087645, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 672794492, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3361, + "versionNonce": 440141782, + "isDeleted": false, + "id": "58p5amzcrtOaNqx63Ay7A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8483.4674243525, + "y": 6044.099915190022, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 67714628, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4184, + "versionNonce": 1028229258, + "isDeleted": false, + "id": "Lrw2NpyOkeBePipt1F6Nl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8151.3022938457, + "y": 6076.447779239504, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.5349404945144, + "height": 12.5448702900298, + "seed": 182695932, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3119, + "versionNonce": 1012440342, + "isDeleted": false, + "id": "gDIBbtTCsImhGjuE7r3u7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6076.278169393873, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 1347474884, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3187, + "versionNonce": 1222371146, + "isDeleted": false, + "id": "uBFs-oxX-H1FqLjHXe2ps", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.527256204974, + "y": 6076.278169393873, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 975394940, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 2932, + "versionNonce": 816876118, + "isDeleted": false, + "id": "Qms17krviGXmkqgDRtTgZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.128888331998, + "y": 6076.33401452254, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1857649988, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3244, + "versionNonce": 1479831050, + "isDeleted": false, + "id": "BxjSc-Xi8vm75CYuDzzVD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8070.0801504884785, + "y": 6077.40977499768, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.66033538867005, + "height": 12.884089981289083, + "seed": 295364860, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4193, + "versionNonce": 1176031126, + "isDeleted": false, + "id": "8ltjUjES_FLmy8yVKGVs3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.550571683167, + "y": 6097.169856333666, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.0906986792239, + "height": 12.451874687980121, + "seed": 413217988, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3263, + "versionNonce": 1615731914, + "isDeleted": false, + "id": "86vQD_jDUskxxVmyb4UrV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6096.953748687011, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 617376124, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3340, + "versionNonce": 684092630, + "isDeleted": false, + "id": "pa2ZFWImeEXpGKnQAIlZJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.735770268771, + "y": 6096.953748687011, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 732298308, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3078, + "versionNonce": 2126771082, + "isDeleted": false, + "id": "GU80FgsMvQG3VbbEDSmPV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.337402395795, + "y": 6097.009593815678, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1190779388, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 5004, + "versionNonce": 911106582, + "isDeleted": false, + "id": "ENU1NKg_hZzGpCmpZrKDZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8149.902609257044, + "y": 6117.8832939430495, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.05367499757995, + "height": 12.820060975088683, + "seed": 564515780, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4086, + "versionNonce": 1708192330, + "isDeleted": false, + "id": "FIuoWoP8J91DnI1FvEFel", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6117.851279439949, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 321206908, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 4159, + "versionNonce": 1369812822, + "isDeleted": false, + "id": "n_oRf4kzwvXqopjmcv5p6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8255.79240269654, + "y": 6117.851279439949, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 146717508, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 3901, + "versionNonce": 1213208842, + "isDeleted": false, + "id": "qxjoUaGmAAEvkdhOwiqQf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8434.457628950735, + "y": 6117.907124568616, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1947241212, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 2877, + "versionNonce": 924931222, + "isDeleted": false, + "id": "PRpV1-U849EATpBN-XCY6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 6123.64519659857, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2068755140, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2993, + "versionNonce": 1169975242, + "isDeleted": false, + "id": "iCzaafzSmvjsbrnKvm85i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 6132.522224788095, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 742247292, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3002, + "versionNonce": 1349931478, + "isDeleted": false, + "id": "C0hbAL-l7u-CN0sEeTNfe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8190.58339621686, + "y": 6141.006057355701, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 401848900, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2878, + "versionNonce": 1446043274, + "isDeleted": false, + "id": "p0hOvnbpzHghUTnydKq_z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.00534918141, + "y": 6122.852895448384, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1575943164, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2993, + "versionNonce": 146384662, + "isDeleted": false, + "id": "xd9UovGwM5ja-X-Ihx2Uh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.13434682094, + "y": 6131.67407850924, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2039206340, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3002, + "versionNonce": 912817482, + "isDeleted": false, + "id": "xCMqWDrtYfMFXgwNd5zCN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8331.150413219206, + "y": 6140.157911076848, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 321264764, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2924, + "versionNonce": 543183958, + "isDeleted": false, + "id": "Km2baSQl7-neDygPWwAW4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.13251036299, + "y": 6122.884465129092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 792000836, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3039, + "versionNonce": 1404978186, + "isDeleted": false, + "id": "DmsIX2cxtbu2MUZcSL-E8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.26150800252, + "y": 6131.705648189948, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1168452860, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3048, + "versionNonce": 20928918, + "isDeleted": false, + "id": "OcBmqiynEaRvFGdw3MK9Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8484.277574400785, + "y": 6140.1894807575545, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 877473988, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4337, + "versionNonce": 942486218, + "isDeleted": false, + "id": "EdAY3WKef5kosG2jI83eK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8150.55630942614, + "y": 6158.837698338549, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.881484259647, + "height": 12.78152620898583, + "seed": 1726885244, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3015, + "versionNonce": 311146198, + "isDeleted": false, + "id": "6ESrC-t-GesFM98Fq4wSd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8154.5079442692495, + "y": 6158.786416452399, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 1752332356, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 3175, + "versionNonce": 1984973194, + "isDeleted": false, + "id": "23k3oBSHlIy8mzl6pHyrz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8256.278989470753, + "y": 6158.786416452399, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1749229052, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 2896, + "versionNonce": 215641110, + "isDeleted": false, + "id": "EJ_csQZuIW0tzc0YBgWH5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8435.015869403389, + "y": 6158.786416452399, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 126013380, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 3135, + "versionNonce": 358778954, + "isDeleted": false, + "id": "QKCExuEMOgIcGDSyf7Rfm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8070.732001112918, + "y": 6159.985282702773, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.94874438679896, + "height": 12.884089981289083, + "seed": 1118174844, + "groupIds": [ + "cndet3BLl6yk4VOot-dtS" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 4697, + "versionNonce": 1310751062, + "isDeleted": false, + "id": "6G9GZJboiPdWQcM5AXaBc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8618.787942548099, + "y": 5885.393575219705, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 727060220, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3646, + "versionNonce": 2101276426, + "isDeleted": false, + "id": "LTGeVFxytyC4lxJ5xaEro", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8634.240556138522, + "y": 5922.207590441869, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 1746104004, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3109, + "versionNonce": 766697110, + "isDeleted": false, + "id": "vfvZe_Pmz9_w0nqstGOIG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8654.03961344305, + "y": 5925.8356835930335, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1748160380, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3920, + "versionNonce": 1650490826, + "isDeleted": false, + "id": "YZuTg-jZyuVrdIMmEyFPd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8737.471028384896, + "y": 5921.250557435304, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 79754820, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4775, + "versionNonce": 1346804694, + "isDeleted": false, + "id": "nD13jZZFVl2BdfitZcOkx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8628.624589890327, + "y": 5949.830500667364, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1554219004, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2944, + "versionNonce": 836908170, + "isDeleted": false, + "id": "YRtRTdTfny4XKdWgfq7ne", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8670.860989006445, + "y": 5952.254797644455, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1364299204, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3048, + "versionNonce": 2079371542, + "isDeleted": false, + "id": "2xZBgll2tHrYmN7-YTsKf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.588465323692, + "y": 5951.387402952223, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1353326716, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2905, + "versionNonce": 2105480010, + "isDeleted": false, + "id": "xpaC_W4PkdkvQ859b83rX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.955688875167, + "y": 5926.1306851918325, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 2128819524, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3195, + "versionNonce": 1814437462, + "isDeleted": false, + "id": "JHflMnctSg3CAcVVutW1Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8674.796814031948, + "y": 5980.34060580714, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1007202556, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3311, + "versionNonce": 1737628170, + "isDeleted": false, + "id": "FoMpoWNyhe94ptoGcEzYM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8674.995920540847, + "y": 5989.902646613204, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1792273604, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3320, + "versionNonce": 633070486, + "isDeleted": false, + "id": "Uc1QKKXk0paZ-WMurpdct", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.013226733025, + "y": 5999.041150115872, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1312895356, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3282, + "versionNonce": 253118666, + "isDeleted": false, + "id": "iTOLyxLb4uUK5pzQNTypj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.215991626412, + "y": 5979.427010721629, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 381793348, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3398, + "versionNonce": 1256653014, + "isDeleted": false, + "id": "1h-WByntj_P_RgnMNXVac", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.41509813531, + "y": 5988.989051527691, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1989517820, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3407, + "versionNonce": 2074517386, + "isDeleted": false, + "id": "HbwfSZuNkkNY4GHKCcjwb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.432404327488, + "y": 5998.12755503036, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 545950660, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4418, + "versionNonce": 1866233366, + "isDeleted": false, + "id": "Cx5P4hvhO7uDtqk3CJntU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8628.933223195787, + "y": 5972.537114799865, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 1812464252, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3096, + "versionNonce": 159260234, + "isDeleted": false, + "id": "ak64gVj6ZmRIswCx0XiLo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8657.987933598406, + "y": 5973.137172314857, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 978088772, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3191, + "versionNonce": 1806779222, + "isDeleted": false, + "id": "phAoR5SUrinGPf18YCFjr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8741.200901275914, + "y": 5972.86961669861, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 895111932, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4313, + "versionNonce": 1433912586, + "isDeleted": false, + "id": "bRykkPcQs5bjuQxZmMcHM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8629.652681310077, + "y": 6014.286865403674, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 577071812, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728757, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3255, + "versionNonce": 848980118, + "isDeleted": false, + "id": "s53ECfHbDAdJ3a0LUOAjI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8634.420340330222, + "y": 6015.419874216635, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 823038844, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3363, + "versionNonce": 688821194, + "isDeleted": false, + "id": "KCL6Bnmq1utxXOEQnquGe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.744535451051, + "y": 6014.916397962732, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 460550724, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3175, + "versionNonce": 598533590, + "isDeleted": false, + "id": "gCge3TBZE4ByhNj1bSaZZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.049882490925, + "y": 5891.375511514298, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 493274108, + "groupIds": [ + "ddpyzw9s3m8abLBF74cW-" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2988, + "versionNonce": 1717406346, + "isDeleted": false, + "id": "U-rhe64emYO9ah81j5ioy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8151.643151635286, + "y": 6479.877389517542, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.77029716022477, + "height": 382.67221620130925, + "seed": 890332228, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2734, + "versionNonce": 1610464022, + "isDeleted": false, + "id": "iB73ZHL8LoJfjEQfHOWEn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8332.539613145269, + "y": 6480.519830360428, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.81692567543335, + "height": 382.1228558003817, + "seed": 1784214012, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2907, + "versionNonce": 1948232010, + "isDeleted": false, + "id": "yO2enWkKCNJcuh9oYm6kO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8425.873533329981, + "y": 6478.902658098979, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.8020298613876, + "height": 383.94449714487905, + "seed": 962870212, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2043, + "versionNonce": 503441494, + "isDeleted": false, + "id": "Iu6C492xeLdmCd6Yxzwch", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8437.188482010944, + "y": 6484.530721237139, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.73633468789095, + "height": 16.10314128613287, + "seed": 719409788, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 3297, + "versionNonce": 699396106, + "isDeleted": false, + "id": "sXadieokQNE1PW7FmvWaI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8477.281506697273, + "y": 6699.030365324497, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1819288388, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3474, + "versionNonce": 2106486166, + "isDeleted": false, + "id": "qPgqr23dxcPSBGfy4bwlO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8477.51371522788, + "y": 6711.123144057759, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1820959484, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3658, + "versionNonce": 990469834, + "isDeleted": false, + "id": "3eWQmkUFUc0-WnLxHGhYW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8477.462038115751, + "y": 6723.216267816015, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 882055876, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3059, + "versionNonce": 1540901590, + "isDeleted": false, + "id": "3L0iHLMxJAmmc7T0h-TqG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.119423343502, + "y": 6507.92607837829, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.69889405639157, + "height": 12.914386351324707, + "seed": 1708385148, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1826, + "versionNonce": 617018762, + "isDeleted": false, + "id": "A26QnHxe-ynY0HF3BTYBM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.235902272107, + "y": 6508.806366479368, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 2087395908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 2193, + "versionNonce": 661946390, + "isDeleted": false, + "id": "22TlvAepiVAHk_qIiDd52", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8109.9646435448485, + "y": 6509.450255277099, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 755110908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2324, + "versionNonce": 404993098, + "isDeleted": false, + "id": "rQLV6lbwIDs5n2eagRs0w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.230941447891, + "y": 6554.554237994302, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 718682564, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2440, + "versionNonce": 878185814, + "isDeleted": false, + "id": "SXyS4EoClOnSka5rbYGRZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.415761592198, + "y": 6563.430179677074, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1075197052, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2449, + "versionNonce": 1727699722, + "isDeleted": false, + "id": "_ifsyt_Qt17AM9UP23rfK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.43182602401, + "y": 6571.912973863235, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 452092228, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3169, + "versionNonce": 265810582, + "isDeleted": false, + "id": "bHqD6-2iMVoO8T-owHOeI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.230743246848, + "y": 6528.682437206882, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.01433655629427, + "height": 12.818491859556932, + "seed": 215106812, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1979, + "versionNonce": 1875290570, + "isDeleted": false, + "id": "A97TEs2k8fYY4ZMznbpW9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.444390814755, + "y": 6528.706264915691, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 337483972, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 2339, + "versionNonce": 1420373974, + "isDeleted": false, + "id": "8vBIDFo9StKuKj597vG3Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8110.173132087501, + "y": 6530.12252130358, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.120900406367284, + "height": 12.882513028906299, + "seed": 2025342332, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3950, + "versionNonce": 161669258, + "isDeleted": false, + "id": "RuVEhqXNviy-R-7ZIzfNb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.297504779726, + "y": 6549.618325549211, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.2851374429445, + "height": 12.974491040766345, + "seed": 1106632772, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2782, + "versionNonce": 2128659734, + "isDeleted": false, + "id": "907W7vqRh631fzzLCY4CU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.56460265453, + "y": 6549.720152848624, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1762276860, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 3161, + "versionNonce": 1883914058, + "isDeleted": false, + "id": "HnhUpMuQBF-M0ZCgxj3su", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8109.649218275827, + "y": 6551.182478210854, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 744044484, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3691, + "versionNonce": 1072935510, + "isDeleted": false, + "id": "ifi4UaQzOsOjfBUoEdThH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8143.96746462028, + "y": 6590.560969504908, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.1298598014461, + "height": 12.818491859556932, + "seed": 1254758012, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2604, + "versionNonce": 806864394, + "isDeleted": false, + "id": "5p8AgpB9PvlacO3SuVonM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.378919775347, + "y": 6590.643912385274, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 795189060, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 2967, + "versionNonce": 1387722646, + "isDeleted": false, + "id": "xSzP0PVPsnffhdg0CPC3v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8092.072142807625, + "y": 6591.970151664589, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 12.882513028906299, + "seed": 448390908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3803, + "versionNonce": 302413002, + "isDeleted": false, + "id": "tLb-sbCXiuNHOfLZapN7d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.329196273378, + "y": 6610.890582926315, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6336033745057, + "height": 13.073936789682616, + "seed": 1937315524, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2708, + "versionNonce": 1331664086, + "isDeleted": false, + "id": "IRHmj09ifo3Z7th-jFe-S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.142196798675, + "y": 6610.9769492170835, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1834723196, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 3058, + "versionNonce": 129059722, + "isDeleted": false, + "id": "7u4O_-yrb2RMJGBAm61aC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8091.256478062605, + "y": 6612.58611195314, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.59767516128925, + "height": 12.882513028906299, + "seed": 1697750596, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 4018, + "versionNonce": 2139261462, + "isDeleted": false, + "id": "g4xgf4dCX5O7rDsu9joAe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.494543412668, + "y": 6632.5124484117005, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.8205296137334, + "height": 11.870688800798026, + "seed": 1995528188, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4882, + "versionNonce": 391334474, + "isDeleted": false, + "id": "jQ7QXvYwGMAiTJpX8d0B6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.8580177819895, + "y": 6652.027192850155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.36983237831794, + "height": 12.45222890827374, + "seed": 762131908, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3679, + "versionNonce": 840226646, + "isDeleted": false, + "id": "_nBRg6I0GkQ8PG9vfSL2F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.536081064198, + "y": 6651.8678890833235, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 326957180, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2700, + "versionNonce": 1204252938, + "isDeleted": false, + "id": "RmRKSh2WoYXegIKG-8Bvd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.204882503192, + "y": 6656.680575661949, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 692706628, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2816, + "versionNonce": 258702486, + "isDeleted": false, + "id": "0ewci9XAfX1aEKa5OfILl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.389702647499, + "y": 6665.556517344719, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1321240828, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2825, + "versionNonce": 210288586, + "isDeleted": false, + "id": "xCfixMQ05d4jZLnyu3680", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.405767079308, + "y": 6674.03931153088, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1646630084, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4120, + "versionNonce": 1832614358, + "isDeleted": false, + "id": "H9cGUA_ArQ5PO5utPakP8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.061709705198, + "y": 6692.280771698099, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0250242259434, + "height": 13.265055808562055, + "seed": 1816004988, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2980, + "versionNonce": 833762954, + "isDeleted": false, + "id": "MDF7O9yYDzjoGmvt8S9jR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.352860830648, + "y": 6692.527881381409, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 94264388, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 3322, + "versionNonce": 580505366, + "isDeleted": false, + "id": "O12kqrws0NvQBq74gMuYN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8084.316576045581, + "y": 6694.096489332234, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68305732718771, + "height": 12.882513028906299, + "seed": 1865906684, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4485, + "versionNonce": 1207883082, + "isDeleted": false, + "id": "l0DuARsinPaOCpgdlKDjf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8145.260590281065, + "y": 6755.560172638159, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.4853049136045, + "height": 12.54333485655143, + "seed": 1569862596, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3235, + "versionNonce": 1543208022, + "isDeleted": false, + "id": "rwbIyE79EMs_nOPn3Z-ym", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8427.987384231263, + "y": 6755.38123796236, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 581884540, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3546, + "versionNonce": 281648138, + "isDeleted": false, + "id": "6fmUU_DnF4X0gCQlDxKVf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8064.048388134488, + "y": 6756.522050652551, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.65095252199248, + "height": 12.882513028906299, + "seed": 1209998148, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4494, + "versionNonce": 1865777558, + "isDeleted": false, + "id": "RMX3f4-R2op9FLLKvsQwX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.508960125811, + "y": 6776.2797134469565, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.04099507611033, + "height": 12.450350636728704, + "seed": 560343804, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3381, + "versionNonce": 1779272394, + "isDeleted": false, + "id": "tshzLSz9nGrsGYoXTeeS5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.261056657018, + "y": 6776.054286661247, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 799216324, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 5309, + "versionNonce": 796712662, + "isDeleted": false, + "id": "Au4o2ImDqaVjjkcVjuXY8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8143.861077007259, + "y": 6796.990615828408, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.00385353066673, + "height": 12.818491859556932, + "seed": 1574923132, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4204, + "versionNonce": 979739018, + "isDeleted": false, + "id": "K6mCs-FEeg0FvF3o-p7zN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.444535206861, + "y": 6797.0144435372185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 45881924, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 3225, + "versionNonce": 1097241622, + "isDeleted": false, + "id": "fODbegb0OJbn1h81zxZF1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.050069935776, + "y": 6801.991174894478, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 710712316, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3340, + "versionNonce": 1561124938, + "isDeleted": false, + "id": "9zFSdECLGb7AC7R_foKPm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.1790517866, + "y": 6810.811278283765, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 742928836, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728758, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3349, + "versionNonce": 1860673878, + "isDeleted": false, + "id": "EjsO4sSVP3r0jqZkAn6FQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8478.195116218416, + "y": 6819.294072469926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1088404604, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4638, + "versionNonce": 232670986, + "isDeleted": false, + "id": "_xcmOsR3UTz6SSF3ERfts", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8144.514697166509, + "y": 6837.940007596268, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.8318062634003, + "height": 12.779961809929308, + "seed": 191191364, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2057, + "versionNonce": 2069169814, + "isDeleted": false, + "id": "PghpiMCAcDLqXO0B2U_t-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8211.441688006686, + "y": 6484.401028529021, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 16.10314128613287, + "seed": 1261096188, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 3375, + "versionNonce": 1431623114, + "isDeleted": false, + "id": "GrYRhPI7PW9INAknGmE0F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8229.673859691811, + "y": 6699.008865596896, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1802604740, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3552, + "versionNonce": 2003026902, + "isDeleted": false, + "id": "LsoxXD1QFuk49rtvo5CFJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8229.906068222419, + "y": 6711.101644330156, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1790954876, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3736, + "versionNonce": 1955302538, + "isDeleted": false, + "id": "NTeDSI0nfhliKEBTiEHUg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8229.85439111029, + "y": 6723.194768088415, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 2081085508, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2215, + "versionNonce": 354998550, + "isDeleted": false, + "id": "d4Rk65_l6fSGbuLXx5xAa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.653644538146, + "y": 6507.725030948301, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1088470524, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2419, + "versionNonce": 1362979658, + "isDeleted": false, + "id": "jV4GUqwiiHdD2MPA1I4-t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.120036703222, + "y": 6554.485237049745, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1225732036, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2535, + "versionNonce": 2082031190, + "isDeleted": false, + "id": "klUU8rnJxzVpQpfijP9g8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.304856847528, + "y": 6563.361178732515, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1989123708, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2544, + "versionNonce": 1640329738, + "isDeleted": false, + "id": "b-KMzZSObvC77q-8JdF2Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.32092127934, + "y": 6571.843972918676, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 849123140, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2367, + "versionNonce": 487197590, + "isDeleted": false, + "id": "g7iSpjygYya3TR5NqBZKI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.862133080798, + "y": 6528.612991494372, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1150185212, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 3188, + "versionNonce": 421437642, + "isDeleted": false, + "id": "ALYfggJ6txNrDg91Q6aT5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.982344920569, + "y": 6549.626879427307, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1695616708, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 3012, + "versionNonce": 103819478, + "isDeleted": false, + "id": "5mYBBcI__-b2kFBzS8AZS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.79666204139, + "y": 6590.485455080852, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2069835644, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3101, + "versionNonce": 1390671754, + "isDeleted": false, + "id": "H9EJzTYZWfMgkVwgcHFlA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.625122947818, + "y": 6610.948859678871, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1359648324, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3247, + "versionNonce": 924884502, + "isDeleted": false, + "id": "wYO0QXh2-QEgVwGsUx6dN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.8336114904705, + "y": 6631.969101169812, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 188997628, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 4076, + "versionNonce": 1062237770, + "isDeleted": false, + "id": "F4PRb7TNAXs2r0P3mcz0P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.953823330241, + "y": 6651.837882372078, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 593964484, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2795, + "versionNonce": 1959816022, + "isDeleted": false, + "id": "jclGTyFX3aikuZpd5IBuU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.093977758523, + "y": 6656.611574717388, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 205422716, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2911, + "versionNonce": 1329536266, + "isDeleted": false, + "id": "TJCB3bYHOgKOBi1lAvkbw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.278797902825, + "y": 6665.487516400159, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1027921220, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2920, + "versionNonce": 496275606, + "isDeleted": false, + "id": "nW65yW034rk27h7hiLLKt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.294862334642, + "y": 6673.970310586321, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1175523580, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3379, + "versionNonce": 539683786, + "isDeleted": false, + "id": "GCuql9eRu2_DMNU3hbPba", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.770603096687, + "y": 6692.434607960093, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 738299076, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3637, + "versionNonce": 2099383766, + "isDeleted": false, + "id": "3WdX3wXvPs-6r0fDOnKxv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.470310380406, + "y": 6755.464149825575, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 943559036, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3785, + "versionNonce": 1747903114, + "isDeleted": false, + "id": "VG0-YBxg96wuwapnmPemi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.613615039951, + "y": 6775.96101323993, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 557536324, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4604, + "versionNonce": 546169622, + "isDeleted": false, + "id": "PLKSYJV41j661JMIXrYKY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8155.735424419279, + "y": 6796.779299311496, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 570819068, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 3320, + "versionNonce": 1644560714, + "isDeleted": false, + "id": "btgYFIdbjUROSJpADxkw4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8230.93916519111, + "y": 6801.922173949917, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1792027588, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3435, + "versionNonce": 709693526, + "isDeleted": false, + "id": "1yzzdMRuHlSvN0ZIhUXu1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.068147041933, + "y": 6810.742277339206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 174875260, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3444, + "versionNonce": 957040650, + "isDeleted": false, + "id": "Mi0XGD7uNc0-xjrqL1cBu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8231.084211473746, + "y": 6819.225071525367, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1792938820, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3626, + "versionNonce": 640980374, + "isDeleted": false, + "id": "c58ddDlxotM6mrvBMuc1a", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8156.221951637548, + "y": 6837.720929092737, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1211282172, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 3199, + "versionNonce": 1966716618, + "isDeleted": false, + "id": "25vIXtUYoBgX-GvoAnUZ4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8428.93944062342, + "y": 6837.823548103674, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 264440516, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3437, + "versionNonce": 1568240342, + "isDeleted": false, + "id": "piLdDoWuUVBKPp4_DkBX9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8064.700158975462, + "y": 6839.0874515015275, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.93920382488311, + "height": 12.882513028906299, + "seed": 165344124, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 2314, + "versionNonce": 1730956682, + "isDeleted": false, + "id": "DQpjL4x4rBlNhY75HICo9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8341.96357520622, + "y": 6484.0741432304385, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70081644742213, + "height": 16.10314128613287, + "seed": 1276973636, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.8825130289063, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 3190, + "versionNonce": 716220438, + "isDeleted": false, + "id": "OvsClU3i7v6vuyuuUXgqw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8365.993706152392, + "y": 6698.955793797342, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1571234812, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3369, + "versionNonce": 337513546, + "isDeleted": false, + "id": "d8451jVpQUAE9SdREMreR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8365.993706152392, + "y": 6711.0485725306025, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 248129988, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3553, + "versionNonce": 1305425238, + "isDeleted": false, + "id": "HwpG1dgmOSYxUvqKkXK_I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8365.993706152392, + "y": 6723.14169628886, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 966345852, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2206, + "versionNonce": 568980234, + "isDeleted": false, + "id": "3svV0XoRwjKCbmfE-TG_K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6507.907367440468, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 988303684, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2480, + "versionNonce": 1076501142, + "isDeleted": false, + "id": "ne_joCkbQpmVgc1b7t6Kb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8369.214334409622, + "y": 6555.280228754775, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 57890044, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2612, + "versionNonce": 1124794826, + "isDeleted": false, + "id": "SK5vfbOzbl6dvsse-TJZ5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8369.214334409622, + "y": 6564.156170437547, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 534087876, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2621, + "versionNonce": 141973462, + "isDeleted": false, + "id": "EmqIY3ALYVRy1JEtuUZ1D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8369.214334409622, + "y": 6572.638964623709, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 414668156, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2355, + "versionNonce": 580663434, + "isDeleted": false, + "id": "ah_2sI5FJIdW62Ud3iD8p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6528.6157790231755, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1898958916, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 3174, + "versionNonce": 248048918, + "isDeleted": false, + "id": "j6zTCtxb656kYoKuy2sbm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6549.629666956109, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1453803004, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 2990, + "versionNonce": 1347983178, + "isDeleted": false, + "id": "Fsof2oDYOseTuSswATF1_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6590.42305872655, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1054156740, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3095, + "versionNonce": 1888934486, + "isDeleted": false, + "id": "LA_W2-in3gE7zcNeKa-rx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6610.997464725999, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 574957180, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3235, + "versionNonce": 748363274, + "isDeleted": false, + "id": "N9rWUoJ7OUn-1zZcEMB9S", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6631.971888698614, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1826852676, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 4067, + "versionNonce": 1421156246, + "isDeleted": false, + "id": "NTurjweg3zgjYauWJM5VL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.702041414228, + "y": 6651.777403190808, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1884485372, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2851, + "versionNonce": 1415498954, + "isDeleted": false, + "id": "hpHyX_LSFTkfv0PxjGGqe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.570208758174, + "y": 6657.40656642242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 733546180, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2971, + "versionNonce": 1062780118, + "isDeleted": false, + "id": "o4TY4rY3eaYjQunrxXBRu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.570208758174, + "y": 6666.282508105192, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1297266556, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2980, + "versionNonce": 222208906, + "isDeleted": false, + "id": "sPFCAGhzM2tORTL4D_ndu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.570208758174, + "y": 6674.765302291353, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1878232644, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3365, + "versionNonce": 1712763414, + "isDeleted": false, + "id": "hvmJFpm7YcIIvItJmRwQu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.499172277236, + "y": 6692.437395488896, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1703307260, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3624, + "versionNonce": 829792842, + "isDeleted": false, + "id": "1uUmrrgfFRh0-fR9RfUMd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.35701560709, + "y": 6755.355935952952, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1785800132, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3765, + "versionNonce": 65273686, + "isDeleted": false, + "id": "ba7A_kMuZwnd4AHXGPC4Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.422199490193, + "y": 6776.028984651837, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 217057404, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4589, + "versionNonce": 467585290, + "isDeleted": false, + "id": "DJwoK4w58jpqZidahlh-k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.422199490193, + "y": 6796.8587737616, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 5229892, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 3378, + "versionNonce": 756393110, + "isDeleted": false, + "id": "p2CplEbSL_IDSJitVDvSO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.493235971131, + "y": 6802.717165654949, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1196529916, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3494, + "versionNonce": 334829514, + "isDeleted": false, + "id": "ijkfn8RuHNDSBj_jbuRST", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.493235971131, + "y": 6811.593107337721, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1122862276, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3503, + "versionNonce": 593535446, + "isDeleted": false, + "id": "L-wAbMC5SsyPvCx_Tr9B1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8368.493235971131, + "y": 6820.075901523882, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1345132924, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3518, + "versionNonce": 970165898, + "isDeleted": false, + "id": "faCN2184JPv5kY4DsJZwR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8332.422199490193, + "y": 6837.788900504644, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1743277124, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2767, + "versionNonce": 702150422, + "isDeleted": false, + "id": "jhtx131CpvoMsw1u57dUd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8429.71140628462, + "y": 6632.187956280455, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 583305724, + "groupIds": [ + "j-Q-ESJBqXzIcHdEYkywe" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 4742, + "versionNonce": 1916087626, + "isDeleted": false, + "id": "EIceUFcedivv316Pf7-On", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8620.75415075364, + "y": 6574.202156464479, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 304.57312989326493, + "height": 170.69067870387278, + "seed": 1950369045, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4789, + "versionNonce": 1492558934, + "isDeleted": false, + "id": "qo2gdV30XDiIoZ4TReXA1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8619.520378568464, + "y": 6571.201115006993, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 804833092, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3738, + "versionNonce": 1383396362, + "isDeleted": false, + "id": "tTTATkL0Url2kbTlsMaTe", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8634.972992158888, + "y": 6608.015130229157, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 2118991612, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3201, + "versionNonce": 1921755542, + "isDeleted": false, + "id": "IHLb1b240GILNvNCTB6Zt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8654.77204946342, + "y": 6611.643223380322, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1197948612, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 4012, + "versionNonce": 210625226, + "isDeleted": false, + "id": "EuTtXZ1tgiA_568zQyDUK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8738.203464405262, + "y": 6607.058097222592, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 885260156, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4867, + "versionNonce": 902694614, + "isDeleted": false, + "id": "XfsHEp-q-6LT5b29b3X-u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8629.357025910693, + "y": 6635.638040454652, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1763362372, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3036, + "versionNonce": 1528494474, + "isDeleted": false, + "id": "d36VR8Wtml61O61ZXBgAr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8671.593425026811, + "y": 6638.062337431741, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1603186684, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3140, + "versionNonce": 861060118, + "isDeleted": false, + "id": "Y40urMPAw71F1wVGjXlqD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8740.320901344057, + "y": 6637.194942739509, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 703684036, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2997, + "versionNonce": 1834432586, + "isDeleted": false, + "id": "0v1o__GIj5GLKN96UPihK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8808.688124895532, + "y": 6611.938224979121, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 783241340, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3287, + "versionNonce": 554617174, + "isDeleted": false, + "id": "xKv_QkPhpcj5hWksUwSp3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.529250052314, + "y": 6666.148145594428, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1393100100, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3403, + "versionNonce": 1394450186, + "isDeleted": false, + "id": "-270a4ZrAcxZoIef-oIPo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.728356561216, + "y": 6675.710186400492, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 31973628, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3412, + "versionNonce": 777465494, + "isDeleted": false, + "id": "myyr6yJurixURFNyW6mhl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8675.74566275339, + "y": 6684.84868990316, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1505737924, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3374, + "versionNonce": 1760112074, + "isDeleted": false, + "id": "BLNzHlH5Df9llXYfA_Nc0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8822.948427646777, + "y": 6665.234550508915, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1891262844, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3490, + "versionNonce": 1474358230, + "isDeleted": false, + "id": "hRl2eh58iD4R4BtDhLdxx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8823.14753415568, + "y": 6674.796591314979, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1471382596, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3499, + "versionNonce": 1138025610, + "isDeleted": false, + "id": "HGEHaAZiWp43VHMeL1hRZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8823.164840347854, + "y": 6683.935094817648, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1382601212, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4510, + "versionNonce": 1002504470, + "isDeleted": false, + "id": "z05mzTYJd1ASOMKb2JAre", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8629.665659216153, + "y": 6658.344654587153, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 46291908, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3188, + "versionNonce": 496747338, + "isDeleted": false, + "id": "JmE-iAJ_kglcvtJWD5dk_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8658.720369618772, + "y": 6658.944712102145, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 1173697148, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3283, + "versionNonce": 1835822678, + "isDeleted": false, + "id": "3CLKh8J2BJudjOm2b3uMC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8741.93333729628, + "y": 6658.677156485898, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 621429572, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4405, + "versionNonce": 1083755018, + "isDeleted": false, + "id": "aaqUwFVB7_rDoHLQi5qjF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8630.385117330443, + "y": 6700.094405190962, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 975274748, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3347, + "versionNonce": 1236808598, + "isDeleted": false, + "id": "FLYgVWMlfL5O-gEMO13Fg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8635.152776350587, + "y": 6701.2274140039235, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 350829252, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728759, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3455, + "versionNonce": 1942419658, + "isDeleted": false, + "id": "MY6nDho_VGOWw1RI40xT3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8740.47697147142, + "y": 6700.72393775002, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1970258812, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3267, + "versionNonce": 1255755990, + "isDeleted": false, + "id": "vuFTqhpkMLvwzswj_Ws9s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8739.782318511294, + "y": 6577.183051301586, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 754795076, + "groupIds": [ + "0KcuMn6GYu5UEI1PRZWxj" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 2386, + "versionNonce": 1723944842, + "isDeleted": false, + "id": "eyWQLirkWgBeWCOfQnogf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8146.6859553354625, + "y": 7346.249436011928, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.82694091047381, + "height": 382.16963157670887, + "seed": 341736444, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1968, + "versionNonce": 1550108182, + "isDeleted": false, + "id": "pusmS4Ljf3rv3o6ChNDqf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8156.11107098651, + "y": 7349.743089731238, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70885890457433, + "height": 16.105112476611357, + "seed": 1137988036, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 2761, + "versionNonce": 499306058, + "isDeleted": false, + "id": "ng4GoKh69PcFNOWusIjq2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8424.01016984979, + "y": 7344.536319716438, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.81681727502402, + "height": 383.9914959088835, + "seed": 1336253564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2700, + "versionNonce": 793744214, + "isDeleted": false, + "id": "MEKkSaqZkqGGhUGTaHVwh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8243.760212014666, + "y": 7345.548610162453, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.790711563602, + "height": 382.719059225012, + "seed": 476936516, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2909, + "versionNonce": 1571190026, + "isDeleted": false, + "id": "fpGp_XFjZxtG6Qsqy0C2y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.221570256035, + "y": 7373.5632927615525, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.7486781931217, + "height": 12.915967205330695, + "seed": 1177857276, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1850, + "versionNonce": 233748630, + "isDeleted": false, + "id": "tUlfkLfGgu6bxGotf6I_u", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7373.579231373574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 1718988996, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "240.923", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 1916, + "versionNonce": 401032138, + "isDeleted": false, + "id": "Va-OsOBHAswqLfC-MMWrX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.771195843197, + "y": 7373.579231373574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 697150844, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 1675, + "versionNonce": 804730326, + "isDeleted": false, + "id": "WbeN7ETZ9pPRKwX94CLSD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.372827970226, + "y": 7374.44368861897, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1099626564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-23 04:39:21", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-23 04:39:21" + }, + { + "type": "text", + "version": 1770, + "versionNonce": 1453341322, + "isDeleted": false, + "id": "KL8SCNVpDcWYVbikJrTUM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8303.566068343298, + "y": 7350.072802913973, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 16.105112476611357, + "seed": 720543228, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 1897, + "versionNonce": 243141398, + "isDeleted": false, + "id": "tzvLZjZQnxlpRpELVRxb5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8435.326503597105, + "y": 7350.165071787539, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.74658487837905, + "height": 16.105112476611357, + "seed": 696995780, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.105112476611357, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 2042, + "versionNonce": 680286538, + "isDeleted": false, + "id": "zuPRjxPY0E9b--V67WQj0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.062609560282, + "y": 7375.087656235323, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 56983164, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2130, + "versionNonce": 939014230, + "isDeleted": false, + "id": "V7SmIzKjKLzHwyyeX7ICq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8183.365165963725, + "y": 7420.957891614406, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1855240004, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2262, + "versionNonce": 218537994, + "isDeleted": false, + "id": "JlIsJsLpfs7P3ba8BAIvr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8183.365165963725, + "y": 7429.834919803933, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2074627836, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2271, + "versionNonce": 607829398, + "isDeleted": false, + "id": "fCJNcsMHfcWbclsY1Y6yE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8183.365165963725, + "y": 7438.31875237154, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 755314372, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2128, + "versionNonce": 1611271882, + "isDeleted": false, + "id": "b3Ge1YFCwB9yrKz-FDyQI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.246825872557, + "y": 7420.165590464222, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1950158716, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2244, + "versionNonce": 142252758, + "isDeleted": false, + "id": "WRa6ZxuguE8HP24yP7CP5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.431668640751, + "y": 7429.042618653745, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1165669956, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2253, + "versionNonce": 1177658762, + "isDeleted": false, + "id": "Il3SrWQwkzSbt4oMOfOeb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.447735039015, + "y": 7437.526451221352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1835384828, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2174, + "versionNonce": 726454294, + "isDeleted": false, + "id": "rxjHpaESbzq_zY3oiOrHb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.373987054132, + "y": 7420.19716014493, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1423134148, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2290, + "versionNonce": 414737482, + "isDeleted": false, + "id": "eMNiRyUxWXXlxjUK6raRx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.55882982233, + "y": 7429.0741883344535, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 254042236, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2299, + "versionNonce": 950426966, + "isDeleted": false, + "id": "smfY8k4tMAxHnJtwSJ7tO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.574896220598, + "y": 7437.55802090206, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 741143876, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2844, + "versionNonce": 1366903562, + "isDeleted": false, + "id": "QGy2MOBwSQYKpyZuYcyiH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8180.144143468402, + "y": 7564.651044027091, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 825946364, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3019, + "versionNonce": 366756502, + "isDeleted": false, + "id": "dZ88qHjfn7Uw7Zm2FCCAQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.332903786082, + "y": 7394.322192382414, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.06403689613023, + "height": 12.820060975088683, + "seed": 1223011524, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2001, + "versionNonce": 1995397578, + "isDeleted": false, + "id": "_J5jVf8txcgcOO5ntxOYr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7394.290177879314, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 1663791484, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2064, + "versionNonce": 899907542, + "isDeleted": false, + "id": "KNmAbPFRbdGp-vyKGjuKe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.979709906998, + "y": 7394.290177879314, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1285256260, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 1828, + "versionNonce": 137728138, + "isDeleted": false, + "id": "uOgzgMKQLos69DzNUURPG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.58134203402, + "y": 7394.346023007981, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1949819388, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:03:28", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:03:28" + }, + { + "type": "text", + "version": 2188, + "versionNonce": 1813058838, + "isDeleted": false, + "id": "UQdyNToBv3Xou0tapjPXp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8108.271123624079, + "y": 7395.76245276025, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.123975463513712, + "height": 12.884089981289083, + "seed": 1965837252, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 3796, + "versionNonce": 1762062154, + "isDeleted": false, + "id": "YsrvFR5baUk_Xxyib_rRu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.399673491265, + "y": 7415.260643493276, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.3348709316003, + "height": 12.976079252205857, + "seed": 2070037116, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2820, + "versionNonce": 1117389398, + "isDeleted": false, + "id": "Bu_0ggY_S9Tge8XF1Fp0Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7415.306638128736, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 43.805905936382885, + "height": 12.884089981289083, + "seed": 347484996, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "258.382", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "258.382" + }, + { + "type": "text", + "version": 2888, + "versionNonce": 1304327690, + "isDeleted": false, + "id": "V78XIuG54iSbnDyvYzuAh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.099936461935, + "y": 7415.306638128736, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1600951036, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​gruzochno​.​ru​/​ekat...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​gruzochno​.​ru​/​ekat..." + }, + { + "type": "text", + "version": 2631, + "versionNonce": 1276331926, + "isDeleted": false, + "id": "54Np45AE5uTDPoThaRwS_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.701568588964, + "y": 7415.3624832574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 160901828, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 01:04:08", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 01:04:08" + }, + { + "type": "text", + "version": 3010, + "versionNonce": 660022474, + "isDeleted": false, + "id": "vPa80CNvOv6wgyfz9rhfL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8107.747145679954, + "y": 7416.8249876233285, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.633406956964894, + "height": 12.884089981289083, + "seed": 1591268220, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3541, + "versionNonce": 2024924374, + "isDeleted": false, + "id": "QqTUoBRIdTsdL9coBOmgT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.069592931501, + "y": 7456.208299250616, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.17957428251805, + "height": 12.820060975088683, + "seed": 913125956, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2637, + "versionNonce": 258734986, + "isDeleted": false, + "id": "nzG3bYM28gIh8xtHz64v_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7456.235407155379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 401146876, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2705, + "versionNonce": 1779096086, + "isDeleted": false, + "id": "BTLpD34QjYtoPSWczR4t3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.914230853257, + "y": 7456.235407155379, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 2048281028, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2453, + "versionNonce": 876083786, + "isDeleted": false, + "id": "ajs3bWqKHWc52NX73FbyW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.515862980283, + "y": 7456.291252284046, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 278865020, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:26:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:26:41" + }, + { + "type": "text", + "version": 2816, + "versionNonce": 1192437590, + "isDeleted": false, + "id": "r21v1jglDJ4RWw417dL8e", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8090.167918596537, + "y": 7457.617653908718, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.09431493451179, + "height": 12.884089981289083, + "seed": 665874756, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3652, + "versionNonce": 1150689546, + "isDeleted": false, + "id": "UFAt8q8kr0_8Srg_Qw8O5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.43136886428, + "y": 7476.617383435562, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6833795189834, + "height": 13.075537174306843, + "seed": 1052587260, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2739, + "versionNonce": 270519446, + "isDeleted": false, + "id": "M11cAoGIT7-czsRrZLigW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7476.713107032069, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 2123999428, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2806, + "versionNonce": 1543598026, + "isDeleted": false, + "id": "2Ri6lo1tUkBrjGQhmS9hV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.742670761534, + "y": 7476.713107032069, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 264582524, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 2555, + "versionNonce": 1927662038, + "isDeleted": false, + "id": "0Bi8S_vMo5TF6Kyu7E8oP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.34430288856, + "y": 7476.768952160736, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 577761348, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 00:27:07", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 00:27:07" + }, + { + "type": "text", + "version": 2906, + "versionNonce": 1855252106, + "isDeleted": false, + "id": "Zw_-yf_ZdvJk4yog3fBs0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8089.352154005748, + "y": 7478.313120012613, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.603746427962975, + "height": 12.884089981289083, + "seed": 1895376380, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 3866, + "versionNonce": 511319830, + "isDeleted": false, + "id": "jfAVVRU9ZK3PGJWFuzebv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.711115323491, + "y": 7498.241895660151, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.87032863990953, + "height": 11.872141895465793, + "seed": 319899588, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2883, + "versionNonce": 889947466, + "isDeleted": false, + "id": "hAAzjxYUHXrDH8L09QaVR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7497.735921617238, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 1465583228, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 2954, + "versionNonce": 391236694, + "isDeleted": false, + "id": "Gt4AFPkDfGx9LeNIZBMdg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.951184825331, + "y": 7497.735921617238, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 614182724, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4723, + "versionNonce": 415255562, + "isDeleted": false, + "id": "Cpd5KzWYjFxnUSdgjtgW2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.960255106096, + "y": 7519.047437902606, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.4196986448144, + "height": 12.453753189444956, + "seed": 1202509564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3711, + "versionNonce": 188862870, + "isDeleted": false, + "id": "hzmUC0_V0DfzCi8IhyTpl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8171.125280481501, + "y": 7518.832269506683, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 55.401586919543064, + "height": 12.884089981289083, + "seed": 2003642052, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3778, + "versionNonce": 531512010, + "isDeleted": false, + "id": "WoJxNwThuryhSZLhUOGIU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.071411380271, + "y": 7518.832269506683, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 122.39885482224629, + "height": 12.884089981289083, + "seed": 1584437116, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "text", + "version": 3523, + "versionNonce": 629092054, + "isDeleted": false, + "id": "YrMdFf4ficdmk1pS9eMTy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.673043507297, + "y": 7518.88811463535, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1881386564, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:25:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:25:12" + }, + { + "type": "text", + "version": 2496, + "versionNonce": 1483755914, + "isDeleted": false, + "id": "cHjk1qQTD6V6YwGbeBTlh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7524.462121805897, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1474840572, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2616, + "versionNonce": 1654580246, + "isDeleted": false, + "id": "Zh2GpaVPjmS9rOJ53F-Ch", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7533.3391499954205, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 798836164, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2625, + "versionNonce": 1178701898, + "isDeleted": false, + "id": "cAzonjakSb1GH47ELfWrs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7541.822982563027, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 404088956, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2499, + "versionNonce": 1687548246, + "isDeleted": false, + "id": "9zyI0wCHNBsveZW1Rxozd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.220763737969, + "y": 7523.669820655713, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 184020292, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2615, + "versionNonce": 1291646730, + "isDeleted": false, + "id": "sbmYpg9fPU7d_hSmWw_aV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.405606506167, + "y": 7532.546848845236, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 851147004, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2624, + "versionNonce": 1186551446, + "isDeleted": false, + "id": "vp9ZeymaOkcd_45kcxTEi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.421672904431, + "y": 7541.030681412843, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 59876548, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2545, + "versionNonce": 488474058, + "isDeleted": false, + "id": "yptsoLQvdlhujEhAPvGXu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.347924919552, + "y": 7523.701390336418, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1935341948, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2661, + "versionNonce": 1908282326, + "isDeleted": false, + "id": "coRo4THkUXGSiikDQvW2A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.53276768775, + "y": 7532.578418525941, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1057516612, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2670, + "versionNonce": 532561034, + "isDeleted": false, + "id": "-c2T5uxn3Sy4Ykhap2DOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.54883408601, + "y": 7541.062251093547, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1698064892, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3965, + "versionNonce": 1874405654, + "isDeleted": false, + "id": "thnI8Q-fNbpd1wfUNd2zy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.163849552984, + "y": 7559.305944203516, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0749706946756, + "height": 13.266679588124175, + "seed": 2134524868, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3009, + "versionNonce": 1654266698, + "isDeleted": false, + "id": "TPCjDTmriAO_W98JC9JS7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8164.683235490855, + "y": 7559.497239006935, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 61.843631910187604, + "height": 12.884089981289083, + "seed": 1531955836, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "10.487.847", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "10.487.847" + }, + { + "type": "text", + "version": 3079, + "versionNonce": 1075811926, + "isDeleted": false, + "id": "nnrOgIjKhiJdq3Tg40SFC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.888168718673, + "y": 7559.497239006935, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 440740676, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http://doc/1437831&is_mo...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http://doc/1437831&is_mo..." + }, + { + "type": "text", + "version": 2824, + "versionNonce": 67904010, + "isDeleted": false, + "id": "6-aR8x_3e64tQX8K0Jj77", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.489800845702, + "y": 7559.553084135602, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 2020154108, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-17 05:50:01", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 05:50:01" + }, + { + "type": "text", + "version": 3166, + "versionNonce": 734419862, + "isDeleted": false, + "id": "I7ji7fXd3wikuwLAzDBld", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8082.411402473179, + "y": 7561.121884100209, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68999591767197, + "height": 12.884089981289083, + "seed": 1921458884, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "text", + "version": 3023, + "versionNonce": 521097418, + "isDeleted": false, + "id": "0940Kad3RPAD5L4-gGvQy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8180.144143468402, + "y": 7576.745303041113, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 923032444, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3207, + "versionNonce": 417495254, + "isDeleted": false, + "id": "ZKEujwwWYvwJ1MmtG7hZh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8180.144143468402, + "y": 7588.839907122373, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1855859268, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3088, + "versionNonce": 926853002, + "isDeleted": false, + "id": "dWbwBWV6pLyeaLFMVaIiw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8321.800471834173, + "y": 7564.706910193204, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1902349308, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3265, + "versionNonce": 1594420758, + "isDeleted": false, + "id": "Zfd4-5KLBkvpWaUZcRph7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8322.032708789498, + "y": 7576.80116920723, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1902657988, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3449, + "versionNonce": 617948746, + "isDeleted": false, + "id": "VvHJoZGDtfb4b84rRU0Ye", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8321.981025351553, + "y": 7588.8957732884855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1770564732, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3151, + "versionNonce": 456047446, + "isDeleted": false, + "id": "SIlz3HEvAz4cFS7DjtL6K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8475.424436082918, + "y": 7564.690972842313, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1375955268, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3328, + "versionNonce": 11390218, + "isDeleted": false, + "id": "liSDDdw78J3nmDpQYb4ME", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8475.65667303824, + "y": 7576.785231856339, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1362476284, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3512, + "versionNonce": 61399190, + "isDeleted": false, + "id": "M8HnbNsOlbROyg4oTB-BG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8475.604989600302, + "y": 7588.879835937599, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.816703478482447, + "height": 28.344997958835986, + "seed": 1405984964, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 23.19136196632035, + "fontFamily": 3, + "text": ".", + "baseline": 23.344997958835986, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4335, + "versionNonce": 272866250, + "isDeleted": false, + "id": "uBjx41ruBNauavGJObspT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8143.439859093502, + "y": 7621.227699987078, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.5349404945144, + "height": 12.5448702900298, + "seed": 1374469500, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3270, + "versionNonce": 1009540566, + "isDeleted": false, + "id": "JlB64R0v9REeNPNzQaLSZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7621.058090141448, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 509929540, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3338, + "versionNonce": 833720970, + "isDeleted": false, + "id": "r8VMfI4bt7ic83NP6VuW-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.664821452774, + "y": 7621.058090141448, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 351251964, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3083, + "versionNonce": 701379350, + "isDeleted": false, + "id": "ZnM2JB-lQvi_w-_k59ymj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.266453579796, + "y": 7621.113935270115, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 900153284, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 16:22:00", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 16:22:00" + }, + { + "type": "text", + "version": 3395, + "versionNonce": 1202893130, + "isDeleted": false, + "id": "DXhM3_3k8HpCbiXcD_i9o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8062.2177157362785, + "y": 7622.189695745256, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.66033538867005, + "height": 12.884089981289083, + "seed": 1262521980, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4344, + "versionNonce": 1191403606, + "isDeleted": false, + "id": "H1NDxJDukTHqqjRXLDoEY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.688136930967, + "y": 7641.949777081242, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.0906986792239, + "height": 12.451874687980121, + "seed": 1907533636, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3414, + "versionNonce": 631371786, + "isDeleted": false, + "id": "xF7gYZaXCP1oHM2_V-5u-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7641.733669434588, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 899768060, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3491, + "versionNonce": 2007033238, + "isDeleted": false, + "id": "rgsmyACQ-NYgZFLgujAD7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.873335516571, + "y": 7641.733669434588, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 1994727108, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3229, + "versionNonce": 2071619274, + "isDeleted": false, + "id": "6gpA-61VSGEjIxSbYW4XZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.474967643597, + "y": 7641.789514563255, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 747904892, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-22 18:02:12", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 18:02:12" + }, + { + "type": "rectangle", + "version": 5155, + "versionNonce": 1557906134, + "isDeleted": false, + "id": "9Eaw4gcysIO1ZZaE43eeP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.040174504844, + "y": 7662.663214690624, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.05367499757995, + "height": 12.820060975088683, + "seed": 769435204, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4237, + "versionNonce": 1104608650, + "isDeleted": false, + "id": "YZn_gbCOWmPo7yz5QKKJQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7662.631200187524, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 677040124, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 4310, + "versionNonce": 692647958, + "isDeleted": false, + "id": "k2yuj_u3AVjQfa_pHtYVm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8247.92996794434, + "y": 7662.631200187524, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 997670340, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "http​:​/​/​sozcu​.​com​.​tr​/​oaut...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sozcu​.​com​.​tr​/​oaut..." + }, + { + "type": "text", + "version": 4052, + "versionNonce": 636664906, + "isDeleted": false, + "id": "3ovu2yMS_lB79F5PSF9LJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8426.595194198533, + "y": 7662.687045316191, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 1224175740, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-19 00:09:42", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 00:09:42" + }, + { + "type": "text", + "version": 3028, + "versionNonce": 1960674646, + "isDeleted": false, + "id": "nhitQKzr6FC_fbgyg0zWn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7668.425117346146, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 2027087172, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3144, + "versionNonce": 1973986058, + "isDeleted": false, + "id": "Pu7A0iOqTj2m9i_1NfMP-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7677.302145535669, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1579942140, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3153, + "versionNonce": 284060310, + "isDeleted": false, + "id": "ZBLCh-GyiK_Qw6Io38BDV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8182.72096146466, + "y": 7685.785978103276, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1800248516, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3029, + "versionNonce": 192131530, + "isDeleted": false, + "id": "musZGaxV6ZvYKV7ezd0gF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.142914429212, + "y": 7667.632816195958, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1870299516, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3144, + "versionNonce": 1546692566, + "isDeleted": false, + "id": "XW592hY2pY89GusqIU75q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.27191206874, + "y": 7676.453999256814, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1015374916, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3153, + "versionNonce": 980347018, + "isDeleted": false, + "id": "EA2zz9adx5T5pBmNmbZOS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8323.287978467008, + "y": 7684.937831824424, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1143271932, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3075, + "versionNonce": 381238550, + "isDeleted": false, + "id": "nDQ83b0Gf5ma04vBkORUL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.270075610788, + "y": 7667.6643858766665, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 844643268, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3190, + "versionNonce": 978667338, + "isDeleted": false, + "id": "2jol4ntdHr4A0NW_b1G3W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.399073250323, + "y": 7676.485568937523, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 1798132348, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3199, + "versionNonce": 905783894, + "isDeleted": false, + "id": "JGUSqJpJnk9YK-wdbUUit", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8476.415139648583, + "y": 7684.969401505129, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.01886298690236, + "height": 15.460907977546901, + "seed": 652485444, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 12.884089981289083, + "fontFamily": 3, + "text": ".", + "baseline": 12.460907977546901, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4488, + "versionNonce": 327273994, + "isDeleted": false, + "id": "cYN493zc-2IKzMjTvtHr5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8142.69387467394, + "y": 7703.617619086123, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.881484259647, + "height": 12.78152620898583, + "seed": 1129685756, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3166, + "versionNonce": 953249686, + "isDeleted": false, + "id": "I5UQC6eXb4ETJvt_MV6BS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8146.6455095170495, + "y": 7703.5663371999735, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.88135788399232, + "height": 12.884089981289083, + "seed": 8854212, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "4.294.961.484", + "baseline": 9.884089981289083, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.294.961.484" + }, + { + "type": "text", + "version": 3326, + "versionNonce": 183467210, + "isDeleted": false, + "id": "L5LGZDfS0Ktf6DqvulprB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8248.416554718555, + "y": 7703.5663371999735, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.27214726143583, + "height": 12.884089981289083, + "seed": 52421500, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "https​:​/​/​m​.​sport​.​airway​/​?...", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​m​.​sport​.​airway​/​?..." + }, + { + "type": "text", + "version": 3047, + "versionNonce": 2070613206, + "isDeleted": false, + "id": "9JFHwZXHfSJmpknoIbyuZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8427.15343465119, + "y": 7703.5663371999735, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.95680983160176, + "height": 12.884089981289083, + "seed": 702489156, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 3, + "text": "2014-03-21 12:05:41", + "baseline": 9.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 12:05:41" + }, + { + "type": "text", + "version": 3286, + "versionNonce": 238637962, + "isDeleted": false, + "id": "BcBe4B6Cpkz6sfJLPeYDB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8062.869566360718, + "y": 7704.765203450349, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.94874438679896, + "height": 12.884089981289083, + "seed": 1087247356, + "groupIds": [ + "TqoJdP4TMAuLs4Zn1jCsF" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 10.307271985031267, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.884089981289083, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "rectangle", + "version": 4745, + "versionNonce": 530207306, + "isDeleted": false, + "id": "ZpLhNpS92lB0t_LVrZQMv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8604.160310147388, + "y": 7442.278034049657, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 1932035396, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3694, + "versionNonce": 2074234710, + "isDeleted": false, + "id": "OYb5oPNw0Oc0Hu5ec3oKg", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8619.612923737812, + "y": 7479.092049271821, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 360734972, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3157, + "versionNonce": 1106082058, + "isDeleted": false, + "id": "V6euQ-CSVo59DCPiu09DD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8639.411981042344, + "y": 7482.720142422986, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 1240415428, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 3968, + "versionNonce": 948565142, + "isDeleted": false, + "id": "icu7xzANGPdRcnYFaDfpS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8722.843395984186, + "y": 7478.135016265256, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 2101535100, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4823, + "versionNonce": 1689110474, + "isDeleted": false, + "id": "cjDNDKbfk7nZ8y_qnwUfI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8613.996957489617, + "y": 7506.714959497316, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 368247876, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2992, + "versionNonce": 1540026838, + "isDeleted": false, + "id": "RaDlEETS9wxXSFnxpPFNt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8656.233356605735, + "y": 7509.139256474406, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 971067900, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3096, + "versionNonce": 1341537930, + "isDeleted": false, + "id": "KN5g13QkRxreCij8b4l3s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8724.960832922981, + "y": 7508.271861782174, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 1293016004, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 2953, + "versionNonce": 8013590, + "isDeleted": false, + "id": "Qrog8vp-UMxEKMiWSywLu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8793.328056474456, + "y": 7483.015144021785, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 710783612, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728760, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3243, + "versionNonce": 276946250, + "isDeleted": false, + "id": "flH3d03MxteX9Rn49h-jo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.169181631238, + "y": 7537.225064637092, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 2036974404, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3359, + "versionNonce": 386724950, + "isDeleted": false, + "id": "fdk1WhYizrIKJJYCcRS89", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.36828814014, + "y": 7546.787105443156, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 2105148156, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3368, + "versionNonce": 1672193034, + "isDeleted": false, + "id": "iQiUT-U8ZZX8JGVD4McYC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.385594332314, + "y": 7555.925608945825, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 827898564, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3330, + "versionNonce": 962066838, + "isDeleted": false, + "id": "Mt0HtWMNRYEZS_J4bWpC6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.588359225701, + "y": 7536.31146955158, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 968377212, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3446, + "versionNonce": 594449098, + "isDeleted": false, + "id": "S8CMnpUeeyZ6XauAHHkwF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.787465734604, + "y": 7545.873510357644, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 259834436, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3455, + "versionNonce": 2123388630, + "isDeleted": false, + "id": "T9iwyHOHOb3M2dAY2pUSF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8807.804771926778, + "y": 7555.012013860312, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1163555836, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4466, + "versionNonce": 845523338, + "isDeleted": false, + "id": "StEESHST8sKYxSFrkKGdn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8614.305590795077, + "y": 7529.421573629817, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 716429764, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3144, + "versionNonce": 1330318358, + "isDeleted": false, + "id": "CKwKxu_-RTpMzWKNsfL_O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8643.360301197696, + "y": 7530.021631144809, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 1851954300, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3239, + "versionNonce": 1741416522, + "isDeleted": false, + "id": "-IgqprAYjIywkZbv-mP90", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8726.573268875203, + "y": 7529.754075528563, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 236716356, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4361, + "versionNonce": 964499798, + "isDeleted": false, + "id": "y_lIhIr-drTf14pvjZxdq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8615.025048909367, + "y": 7571.171324233626, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 1922213116, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3303, + "versionNonce": 2071744266, + "isDeleted": false, + "id": "_dCwdtkTvRQ5LAatWiAyY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8619.792707929511, + "y": 7572.304333046588, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 823343300, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3411, + "versionNonce": 1148944022, + "isDeleted": false, + "id": "kwLnWCV83ZCmpm-AQb1wN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8725.116903050344, + "y": 7571.8008567926845, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 124560764, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3223, + "versionNonce": 1911676362, + "isDeleted": false, + "id": "yAnvLI224dqTejnO4d2-4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8724.422250090218, + "y": 7448.25997034425, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 1865908292, + "groupIds": [ + "zeZm_vKZAKSbojGC86XLJ" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 4837, + "versionNonce": 1157315542, + "isDeleted": false, + "id": "KjiX31M6SpynnehLETfvy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8609.636698357337, + "y": 8142.220721795301, + "strokeColor": "#15223c", + "backgroundColor": "#ffc029", + "width": 304.57312989326493, + "height": 170.69067870387278, + "seed": 1629703548, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4884, + "versionNonce": 138908810, + "isDeleted": false, + "id": "tJJ6DNAVHvwIXLOGvY7f-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8608.40292617216, + "y": 8139.219680337815, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 313.4067189003712, + "height": 175.64125101319777, + "seed": 798971972, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3833, + "versionNonce": 823218454, + "isDeleted": false, + "id": "om1XGvHKuJZ6gywUGj3ZR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8623.855539762584, + "y": 8176.033695559978, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 85.99405190947766, + "height": 126.9568483897424, + "seed": 517225980, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3296, + "versionNonce": 540570442, + "isDeleted": false, + "id": "bS4hWc_GgvVX6nCHRvkQr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8643.654597067116, + "y": 8179.661788711142, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.96193427251357, + "height": 17.347893844622767, + "seed": 370388932, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "UserID", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 4107, + "versionNonce": 1949482582, + "isDeleted": false, + "id": "Wz7bTSdxYi3DXKEeBNkaW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 8727.086012008958, + "y": 8175.0766625534125, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 178.33606526040433, + "height": 127.6265329471055, + "seed": 1242766972, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4962, + "versionNonce": 740260362, + "isDeleted": false, + "id": "7qBUzqCrHcPwwzVaSbT2h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8618.23957351439, + "y": 8203.656605785472, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.2149724420926, + "height": 14.849725943301076, + "seed": 1796282180, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3131, + "versionNonce": 1127515030, + "isDeleted": false, + "id": "Qkm-1jBDFeLQk8X1XEZcC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8660.475972630507, + "y": 8206.080902762562, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 47.186271257373924, + "height": 13.878315075698213, + "seed": 1537339132, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "240.923", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "240.923" + }, + { + "type": "text", + "version": 3235, + "versionNonce": 452438218, + "isDeleted": false, + "id": "lm1H3Daz5d1urnn5oTKto", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8729.203448947754, + "y": 8205.21350807033, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 452300484, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​showtopics​.​html%3...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​showtopics​.​html%3..." + }, + { + "type": "text", + "version": 3092, + "versionNonce": 1884004566, + "isDeleted": false, + "id": "0CcrtQpzSpkyhMSWnJ3f-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8797.570672499229, + "y": 8179.956790309941, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 28.450545905181336, + "height": 17.347893844622767, + "seed": 1677897596, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "URL", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "text", + "version": 3382, + "versionNonce": 1146879882, + "isDeleted": false, + "id": "H4ropKYW02ljfa1GGUMwP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.41179765601, + "y": 8234.166710925248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 1449072196, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3498, + "versionNonce": 1057822230, + "isDeleted": false, + "id": "pmHwx1GLsZpxQiqGxRAbA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.610904164912, + "y": 8243.728751731313, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 326590460, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3507, + "versionNonce": 1418165834, + "isDeleted": false, + "id": "OVCTfdJW28j89ckwXdaN3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8664.628210357087, + "y": 8252.867255233981, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.71482055298875, + "height": 16.653978090837857, + "seed": 170634692, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 3, + "text": ".", + "baseline": 13.653978090837857, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3469, + "versionNonce": 946725718, + "isDeleted": false, + "id": "DsjLrXhzLMMfzG-RsocMW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8811.830975250474, + "y": 8233.253115839736, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1107427452, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3585, + "versionNonce": 945104138, + "isDeleted": false, + "id": "oSjxQPJEThNTKOB4suHQq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8812.030081759376, + "y": 8242.8151566458, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 1467569476, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3594, + "versionNonce": 2126710934, + "isDeleted": false, + "id": "X2WqYF5erRzKAT3WIycAT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8812.04738795155, + "y": 8251.953660148469, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 4.857410276494375, + "height": 17.347893844622767, + "seed": 2003079420, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": ".", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4605, + "versionNonce": 155186122, + "isDeleted": false, + "id": "aqsXeVll8YI44xSF_sPKw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8618.548206819849, + "y": 8226.363219917974, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.43970652144327, + "height": 14.3292891279627, + "seed": 195431620, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3283, + "versionNonce": 566330838, + "isDeleted": false, + "id": "876hU6te76N_4vNSYPbeK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8647.602917222468, + "y": 8226.963277432966, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 59.676754825502314, + "height": 13.878315075698213, + "seed": 1931547004, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.073.710", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.073.710" + }, + { + "type": "text", + "version": 3378, + "versionNonce": 2036525706, + "isDeleted": false, + "id": "a-JeeNkdRGCq8A51_Qz7P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8730.815884899976, + "y": 8226.695721816719, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 131.843993219133, + "height": 13.878315075698213, + "seed": 407884868, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.102652060558569, + "fontFamily": 3, + "text": "http​:​/​/​mk​.​ru&pos=3_0", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​mk​.​ru&pos=3_0" + }, + { + "type": "rectangle", + "version": 4500, + "versionNonce": 1920883478, + "isDeleted": false, + "id": "oG_ZUxIgYFHzUzOYREXpi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8619.26766493414, + "y": 8268.112970521783, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 293.9532436062755, + "height": 14.755593905678678, + "seed": 880378364, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3442, + "versionNonce": 1064896842, + "isDeleted": false, + "id": "mbtqxQjCU4n0-e-VRlSIs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8624.035323954284, + "y": 8269.245979334744, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 86.04555346932892, + "height": 13.878315075698213, + "seed": 190098372, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "4.292.714.039", + "baseline": 11.878315075698213, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "4.292.714.039" + }, + { + "type": "text", + "version": 3550, + "versionNonce": 1466861654, + "isDeleted": false, + "id": "o1owyyFfRs227nqeo3E8J", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8729.359519075117, + "y": 8268.74250308084, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 176.9485172151522, + "height": 13.878315075698213, + "seed": 40886908, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 11.10265206055857, + "fontFamily": 3, + "text": "http​:​/​/​sosyal-mansetleri...", + "baseline": 11.878315075698213, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "http​:​/​/​sosyal-mansetleri..." + }, + { + "type": "text", + "version": 3362, + "versionNonce": 48058378, + "isDeleted": false, + "id": "uezVAywY70rzFqPo411oz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8728.66486611499, + "y": 8145.201616632407, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 70.08549113227598, + "height": 17.347893844622767, + "seed": 114463556, + "groupIds": [ + "bkQmwua_qQ4S8m_Ab4QsP" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 13.878315075698213, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 12.347893844622767, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "rectangle", + "version": 3092, + "versionNonce": 543624598, + "isDeleted": false, + "id": "vE52bshJZTZBbsVv0Xpxh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8145.806489127222, + "y": 8036.034614093186, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 166.77029716022477, + "height": 382.67221620130925, + "seed": 180803396, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2838, + "versionNonce": 1200275146, + "isDeleted": false, + "id": "eLtBmTHE_EUVRSTXc-7UE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8326.702950637206, + "y": 8036.677054936073, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 81.81692567543335, + "height": 382.1228558003817, + "seed": 187182844, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3011, + "versionNonce": 1520233174, + "isDeleted": false, + "id": "Hv8dKzK6DhqZGdrHKhAnr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 8420.036870821918, + "y": 8035.059882674624, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 120.8020298613876, + "height": 383.94449714487905, + "seed": 1039355588, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2147, + "versionNonce": 1511806346, + "isDeleted": false, + "id": "sPLtd0u-5eAtZaiGoIVIY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8431.351819502881, + "y": 8040.687945812783, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 83.73633468789095, + "height": 16.10314128613287, + "seed": 1220603772, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "EventTime.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "EventTime.bin" + }, + { + "type": "text", + "version": 3401, + "versionNonce": 614801430, + "isDeleted": false, + "id": "8KEXqpW4sFrW8rsCNs9-P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8471.44484418921, + "y": 8255.187589900144, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1403311684, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3578, + "versionNonce": 1003295818, + "isDeleted": false, + "id": "waAkMp3axyzBuYLSjwi6Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8471.677052719817, + "y": 8267.280368633406, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1181589500, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3762, + "versionNonce": 41200982, + "isDeleted": false, + "id": "HwbPjhFgvEM-YIYu2fRbe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8471.625375607688, + "y": 8279.373492391662, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1488547268, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3163, + "versionNonce": 242744074, + "isDeleted": false, + "id": "XNRh5wP8_JmG207BUAV4I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.282760835438, + "y": 8064.083302953934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.69889405639157, + "height": 12.914386351324707, + "seed": 1009795196, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1930, + "versionNonce": 828412566, + "isDeleted": false, + "id": "e6O7cFxkmc1xwBGZm0xDu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.399239764043, + "y": 8064.963591055012, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 240063812, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-18 09:59:01", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-18 09:59:01" + }, + { + "type": "text", + "version": 2297, + "versionNonce": 9963978, + "isDeleted": false, + "id": "Hp8OPDJ6jyXr811RZQSHW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8104.127981036785, + "y": 8065.607479852743, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 298504444, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 0", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2428, + "versionNonce": 2082328534, + "isDeleted": false, + "id": "xm7KiTahX4I3n_sZjO-bX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.394278939828, + "y": 8110.711462569946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1640221892, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2544, + "versionNonce": 961036426, + "isDeleted": false, + "id": "VMlOleZl92KeJkxIvnhin", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.579099084134, + "y": 8119.587404252718, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1723814268, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2553, + "versionNonce": 247555350, + "isDeleted": false, + "id": "sDkzwi3g0f8u7evr3HnoE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.595163515947, + "y": 8128.070198438879, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1689621572, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 3273, + "versionNonce": 1145282378, + "isDeleted": false, + "id": "jNkbFZy6pnl_TUOEo2BAk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.394080738784, + "y": 8084.8396617825265, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.01433655629427, + "height": 12.818491859556932, + "seed": 441434620, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2083, + "versionNonce": 1254117974, + "isDeleted": false, + "id": "H5RJoeJjfmHhDgGptJFI6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.607728306692, + "y": 8084.863489491335, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1157786564, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-22 05:55:22", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-22 05:55:22" + }, + { + "type": "text", + "version": 2443, + "versionNonce": 2112169482, + "isDeleted": false, + "id": "U0LpI7sUhmKzAQAHVrbRT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8104.336469579437, + "y": 8086.279745879224, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 25.120900406367284, + "height": 12.882513028906299, + "seed": 1400775292, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 1", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "rectangle", + "version": 4054, + "versionNonce": 451909526, + "isDeleted": false, + "id": "jjO5H9UO2bK4tAJ6nlsoP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.460842271663, + "y": 8105.775550124855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.2851374429445, + "height": 12.974491040766345, + "seed": 1153979204, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2886, + "versionNonce": 2133316810, + "isDeleted": false, + "id": "dKeQxvGIQ7qJuIhM1maWN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.727940146466, + "y": 8105.877377424268, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 151810812, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 05:23:19", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 05:23:19" + }, + { + "type": "text", + "version": 3265, + "versionNonce": 1199846614, + "isDeleted": false, + "id": "kFOxhiyOxIOWPwQc45wut", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8103.812555767763, + "y": 8107.3397027864985, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 29.629779966484488, + "height": 12.882513028906299, + "seed": 845499076, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 2", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "rectangle", + "version": 3795, + "versionNonce": 161917834, + "isDeleted": false, + "id": "l3bYGW2GEx-WP8biA5Bs5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.130802112217, + "y": 8146.718194080552, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.1298598014461, + "height": 12.818491859556932, + "seed": 159167356, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2708, + "versionNonce": 1242769942, + "isDeleted": false, + "id": "l9ZCHX_-mRZTLGgOLjvK1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.542257267283, + "y": 8146.8011369609185, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1618432580, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:24:50", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:24:50" + }, + { + "type": "text", + "version": 3071, + "versionNonce": 1939647050, + "isDeleted": false, + "id": "HU43L2-0QiwSupT85WXNk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8086.2354802995615, + "y": 8148.127376240233, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 12.882513028906299, + "seed": 51438588, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.191", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.191" + }, + { + "type": "rectangle", + "version": 3907, + "versionNonce": 563181398, + "isDeleted": false, + "id": "IV23blO3YUrVV8mAVex7Q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.492533765315, + "y": 8167.047807501959, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.6336033745057, + "height": 13.073936789682616, + "seed": 500984260, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2812, + "versionNonce": 333762826, + "isDeleted": false, + "id": "_51jMTzl6O3yDDnta8kVP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.305534290612, + "y": 8167.134173792728, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 197854332, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:25:15", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:25:15" + }, + { + "type": "text", + "version": 3162, + "versionNonce": 643046550, + "isDeleted": false, + "id": "FIVViUHpYRs7_a0-0f2Dz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8085.419815554542, + "y": 8168.743336528784, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 49.59767516128925, + "height": 12.882513028906299, + "seed": 766677316, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.192", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.192" + }, + { + "type": "rectangle", + "version": 4122, + "versionNonce": 771366858, + "isDeleted": false, + "id": "S1nlyP7B3SKuMAUbmLmgc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.657880904604, + "y": 8188.669672987344, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.8205296137334, + "height": 11.870688800798026, + "seed": 695014652, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4986, + "versionNonce": 1578113494, + "isDeleted": false, + "id": "314M9tHwDbncP4oYqtUO9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8139.021355273926, + "y": 8208.1844174258, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.36983237831794, + "height": 12.45222890827374, + "seed": 1062717636, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3783, + "versionNonce": 1576507018, + "isDeleted": false, + "id": "jyCsOfmk95zBd3c1XzVc0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.699418556134, + "y": 8208.025113658969, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1501107580, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:33:02", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:33:02" + }, + { + "type": "text", + "version": 2804, + "versionNonce": 1339715350, + "isDeleted": false, + "id": "JRuYYt13S2a6d0hrKtrcf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.368219995129, + "y": 8212.837800237594, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1718227012, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2920, + "versionNonce": 77083978, + "isDeleted": false, + "id": "alGYHOaxJ37pT6n4iMHQo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.553040139435, + "y": 8221.713741920365, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 422643196, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2929, + "versionNonce": 1479023702, + "isDeleted": false, + "id": "cNLf6A6QC9R6LIlleR1Oe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.569104571245, + "y": 8230.196536106525, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 315058116, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4224, + "versionNonce": 859241482, + "isDeleted": false, + "id": "Pmp4mJ8zkSd5jK1PqXMrL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.225047197135, + "y": 8248.437996273746, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 408.0250242259434, + "height": 13.265055808562055, + "seed": 1838605948, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3084, + "versionNonce": 2093883798, + "isDeleted": false, + "id": "63T6023XE1sJ8IRw005zT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.516198322584, + "y": 8248.685105957056, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 143511364, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 05:29:42", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 05:29:42" + }, + { + "type": "text", + "version": 3426, + "versionNonce": 399436490, + "isDeleted": false, + "id": "EACSr0-Xo0wZh3JtR4FHv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8078.479913537518, + "y": 8250.25371390788, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56.68305732718771, + "height": 12.882513028906299, + "seed": 1802286844, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 16.383", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 16.383" + }, + { + "type": "rectangle", + "version": 4589, + "versionNonce": 1090617046, + "isDeleted": false, + "id": "SNJY6dRh1UIrruLdVW0Rz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8139.423927773001, + "y": 8311.717397213806, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.4853049136045, + "height": 12.54333485655143, + "seed": 1478182596, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3339, + "versionNonce": 1761280394, + "isDeleted": false, + "id": "omOfLNLofV4DH0Pappnq6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.1507217232, + "y": 8311.538462538008, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1060403068, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-17 03:55:28", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-17 03:55:28" + }, + { + "type": "text", + "version": 3650, + "versionNonce": 2035758102, + "isDeleted": false, + "id": "rtgERUhZQuNWLHSH9bdGq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8058.211725626425, + "y": 8312.6792752282, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 76.65095252199248, + "height": 12.882513028906299, + "seed": 1443745348, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.863.744", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.863.744" + }, + { + "type": "rectangle", + "version": 4598, + "versionNonce": 1375092810, + "isDeleted": false, + "id": "OU2yTaSKQxjJB--RYIyLv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.672297617748, + "y": 8332.436938022607, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 406.04099507611033, + "height": 12.450350636728704, + "seed": 892348412, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3485, + "versionNonce": 532955478, + "isDeleted": false, + "id": "yaaV7M1HnqNynFHGUX5hz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.424394148955, + "y": 8332.211511236897, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 323184068, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:39", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:39" + }, + { + "type": "rectangle", + "version": 5413, + "versionNonce": 1587259146, + "isDeleted": false, + "id": "JcHBQk8Inna4xmYx7SFHh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.024414499196, + "y": 8353.147840404055, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 407.00385353066673, + "height": 12.818491859556932, + "seed": 1096927356, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 4308, + "versionNonce": 664643222, + "isDeleted": false, + "id": "D68gajzwJaZpXOvFZoo7s", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8422.607872698798, + "y": 8353.171668112866, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 1423576388, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-20 07:31:54", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-20 07:31:54" + }, + { + "type": "text", + "version": 3329, + "versionNonce": 1734751690, + "isDeleted": false, + "id": "_1u0nYKW2uaTor8eIv5Ki", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.213407427713, + "y": 8358.148399470125, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 126572796, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3444, + "versionNonce": 1368941526, + "isDeleted": false, + "id": "knzN8z5igWBTSVcciIHSa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.342389278536, + "y": 8366.968502859416, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 204457156, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3453, + "versionNonce": 2104552586, + "isDeleted": false, + "id": "nH1cTfst6XwC99sgPojTH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8472.358453710352, + "y": 8375.451297045574, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1664014716, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4742, + "versionNonce": 2143910166, + "isDeleted": false, + "id": "RZxPjX_XWU50IpQwTmEJD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 8138.6780346584455, + "y": 8394.097232171918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 405.8318062634003, + "height": 12.779961809929308, + "seed": 1323469892, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2161, + "versionNonce": 1450625866, + "isDeleted": false, + "id": "vRE06jwRcEyJU5zPthrXT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8205.605025498622, + "y": 8040.558253104665, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45.088795601172045, + "height": 16.10314128613287, + "seed": 1871596028, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "text", + "version": 3479, + "versionNonce": 161867350, + "isDeleted": false, + "id": "QmPSQHbJ93D3a8tfaNh82", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8223.837197183748, + "y": 8255.166090172543, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1322279876, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3656, + "versionNonce": 953340426, + "isDeleted": false, + "id": "yXDkJf8ey9PNTt4A30ysn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8224.069405714356, + "y": 8267.258868905801, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 262908540, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3840, + "versionNonce": 268610454, + "isDeleted": false, + "id": "AhXxnfA3zRwp0mDQ0eqjA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8224.017728602226, + "y": 8279.35199266406, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1377258308, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2319, + "versionNonce": 1736442058, + "isDeleted": false, + "id": "eoKtzyNgaDs4x5i9cIU6F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.816982030083, + "y": 8063.882255523945, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1984494332, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "​/​clck​.​yandex​.​ru​/​file​.​com​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "​/​clck​.​yandex​.​ru​/​file​.​com​..." + }, + { + "type": "text", + "version": 2523, + "versionNonce": 1360316630, + "isDeleted": false, + "id": "oqZVa6lVC6TPFdPsACXGw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.283374195158, + "y": 8110.642461625389, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 722813636, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2639, + "versionNonce": 236541834, + "isDeleted": false, + "id": "_z6oskwSOQ5JEnR4LtO3Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.468194339464, + "y": 8119.51840330816, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 770194300, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2648, + "versionNonce": 2087796246, + "isDeleted": false, + "id": "3giiwJKr20_NDmLOknFX-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.484258771277, + "y": 8128.00119749432, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 812141124, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2471, + "versionNonce": 752473674, + "isDeleted": false, + "id": "VNOgEdDXfQmOBNuRlS8PR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.025470572735, + "y": 8084.770216070016, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 550202364, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "/clck/jsredircnt=1395412...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "/clck/jsredircnt=1395412..." + }, + { + "type": "text", + "version": 3292, + "versionNonce": 118295382, + "isDeleted": false, + "id": "fngnUsqe7JvhhzyZz1hld", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.145682412505, + "y": 8105.784104002952, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 888037828, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal://200906&uinfo=ww-1...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal://200906&uinfo=ww-1..." + }, + { + "type": "text", + "version": 3116, + "versionNonce": 77364490, + "isDeleted": false, + "id": "eSazmN22o1Hk35UGsNbSp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.9599995333265, + "y": 8146.6426796564965, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 552897660, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3205, + "versionNonce": 2134716566, + "isDeleted": false, + "id": "Ut_QtoFawTC_Bk5HkY2y7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.788460439755, + "y": 8167.106084254515, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2143652164, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 3351, + "versionNonce": 47991754, + "isDeleted": false, + "id": "lR124Cl3uWkN3D94M20xF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.996948982407, + "y": 8188.126325745456, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1881513212, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 4180, + "versionNonce": 1622584790, + "isDeleted": false, + "id": "a6n3vbAP7b8ZXXVcAeIdE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.1171608221775, + "y": 8207.995106947721, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1145815236, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​mail​.​yandex​.​ru​/​Ma..." + }, + { + "type": "text", + "version": 2899, + "versionNonce": 766788234, + "isDeleted": false, + "id": "uGERFW6M8MXHM34UctpIA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.25731525046, + "y": 8212.768799293033, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1205902716, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3015, + "versionNonce": 1754170134, + "isDeleted": false, + "id": "JXQDI2BrzKs1FYdTibdFF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.442135394762, + "y": 8221.644740975804, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 438241348, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3024, + "versionNonce": 266297674, + "isDeleted": false, + "id": "LH6-m5sELFToNd2CGXgfE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.458199826578, + "y": 8230.127535161964, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1634176508, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3483, + "versionNonce": 1765388374, + "isDeleted": false, + "id": "wCWNZkVC3Yo5pwDb1l6Ng", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.933940588624, + "y": 8248.59183253574, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1964859332, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "goal​:​/​/​r52-echo/#compose...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "goal​:​/​/​r52-echo/#compose..." + }, + { + "type": "text", + "version": 3741, + "versionNonce": 616081418, + "isDeleted": false, + "id": "T1q_10VRsZ_ONDc3AJ8K7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.633647872342, + "y": 8311.621374401222, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 2109501052, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​php?show​/​7...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​php?show​/​7..." + }, + { + "type": "text", + "version": 3889, + "versionNonce": 512570774, + "isDeleted": false, + "id": "kgm7PW3qc2KcNzh70vSF7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.776952531887, + "y": 8332.11823781558, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 493143876, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/..." + }, + { + "type": "text", + "version": 4708, + "versionNonce": 1144723146, + "isDeleted": false, + "id": "ExJihQDKFRan2InMpI3pE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8149.898761911216, + "y": 8352.936523887145, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 1839283964, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "https​:​/​/​wroad​.​rt​.​com​.​tr​/​..." + }, + { + "type": "text", + "version": 3424, + "versionNonce": 29233878, + "isDeleted": false, + "id": "f1cr6Z96I4fUIWHbxohMq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.102502683047, + "y": 8358.079398525564, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 659766980, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3539, + "versionNonce": 251768202, + "isDeleted": false, + "id": "Jo388ybktmvar-Djik82v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.23148453387, + "y": 8366.899501914855, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 429391740, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3548, + "versionNonce": 492914710, + "isDeleted": false, + "id": "ZgOT41oqq9gEjuLcRgIad", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8225.247548965683, + "y": 8375.382296101017, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1803994692, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3730, + "versionNonce": 1514630218, + "isDeleted": false, + "id": "ZzurVdTmCPiHrQE0eD5Os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8150.385289129485, + "y": 8393.878153668387, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 164.2520411185553, + "height": 12.882513028906299, + "seed": 165851132, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "res​:​/​/​m​.​me​/​politic/stati...", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "res​:​/​/​m​.​me​/​politic/stati..." + }, + { + "type": "text", + "version": 3303, + "versionNonce": 1634456918, + "isDeleted": false, + "id": "gHxvKEeyY_WrbgLr8XS2t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8423.102778115357, + "y": 8393.980772679324, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 2128436676, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-19 10:48:46", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-19 10:48:46" + }, + { + "type": "text", + "version": 3541, + "versionNonce": 468144906, + "isDeleted": false, + "id": "EkO3y19k4g3Vvj6pYh9tL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8058.863496467398, + "y": 8395.244676077176, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 77.93920382488311, + "height": 12.882513028906299, + "seed": 1854099580, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 1, + "text": "row 8.867.680", + "baseline": 8.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 8.867.680" + }, + { + "type": "text", + "version": 2418, + "versionNonce": 1999813270, + "isDeleted": false, + "id": "ESFBHfshBNzlaUHb3xzq6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8336.126912698157, + "y": 8040.231367806083, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 65.70081644742213, + "height": 16.10314128613287, + "seed": 712312132, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.8825130289063, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 11.103141286132871, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "text", + "version": 3294, + "versionNonce": 1448894922, + "isDeleted": false, + "id": "9IxSXS-ZYt0wfpnhEF97O", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8360.157043644329, + "y": 8255.11301837299, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 658235644, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3473, + "versionNonce": 359331798, + "isDeleted": false, + "id": "EdUPsCpXHB_sjnER9SXR-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8360.157043644329, + "y": 8267.205797106248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1672199364, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3657, + "versionNonce": 79796362, + "isDeleted": false, + "id": "dsjrKKCeUVOJ_8DZKOno_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8360.157043644329, + "y": 8279.298920864507, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 14.814889983242244, + "height": 28.341528663593856, + "seed": 1267622268, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 23.18852345203134, + "fontFamily": 3, + "text": ".", + "baseline": 23.341528663593856, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2310, + "versionNonce": 1412009238, + "isDeleted": false, + "id": "YBDq5bV5pxsGsbMxMc5fE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8064.064592016112, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1142916164, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.644.125.792", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.644.125.792" + }, + { + "type": "text", + "version": 2584, + "versionNonce": 114423626, + "isDeleted": false, + "id": "fwqD6w0t95-gpv6vJVESs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8363.377671901559, + "y": 8111.437453330419, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 851235324, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2716, + "versionNonce": 14907990, + "isDeleted": false, + "id": "TrtYHXPqAr_csZhhDb4A8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8363.377671901559, + "y": 8120.313395013191, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 28203972, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2725, + "versionNonce": 216563210, + "isDeleted": false, + "id": "bdTV_MqMUm3WJ8J-wZM0A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8363.377671901559, + "y": 8128.796189199354, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 2076783228, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2459, + "versionNonce": 1919795094, + "isDeleted": false, + "id": "Dsh9QnKpPNjl3qIyyD4rK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8084.77300359882, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1719026500, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.550.392.492", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.550.392.492" + }, + { + "type": "text", + "version": 3278, + "versionNonce": 67120330, + "isDeleted": false, + "id": "Zi1iWUv0-p2j6EQzO6KVv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8105.786891531753, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 360022780, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2.479.498.648", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2.479.498.648" + }, + { + "type": "text", + "version": 3094, + "versionNonce": 1560108246, + "isDeleted": false, + "id": "B8slU_xUMwWVQiRlT5-Ah", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8146.580283302194, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1221933764, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3199, + "versionNonce": 28574602, + "isDeleted": false, + "id": "IyW8tbPtBTQLPqM56vdxm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8167.154689301643, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 1178846076, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 3339, + "versionNonce": 640111126, + "isDeleted": false, + "id": "2sGSxPNRBg1QT5039zFmy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8188.129113274259, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 57229892, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 4171, + "versionNonce": 809435722, + "isDeleted": false, + "id": "1Yl2bWBWmjchcus8HlIY7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8320.865378906165, + "y": 8207.934627766452, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 85.66871164222688, + "height": 12.882513028906299, + "seed": 880145404, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 10.306010423125038, + "fontFamily": 3, + "text": " 2.137.667.438", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": " 2.137.667.438" + }, + { + "type": "text", + "version": 2955, + "versionNonce": 954244950, + "isDeleted": false, + "id": "-n1Q8Sn-frVKJ6uP6ujDC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.73354625011, + "y": 8213.563790998065, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1829788100, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728761, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3075, + "versionNonce": 981215498, + "isDeleted": false, + "id": "ni5zpiRcjO4SXQKlFWGAp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.73354625011, + "y": 8222.439732680836, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1846416508, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3084, + "versionNonce": 1501447318, + "isDeleted": false, + "id": "8-Uw67hABtc-8GNJosbwa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.73354625011, + "y": 8230.922526866996, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1357414724, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3469, + "versionNonce": 937850826, + "isDeleted": false, + "id": "0TO5teHby6Az8lLWIbTyM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.662509769172, + "y": 8248.594620064543, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1892558076, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.524.699.296", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.524.699.296" + }, + { + "type": "text", + "version": 3728, + "versionNonce": 2041922006, + "isDeleted": false, + "id": "HtIZa5f_x8LZd-9ppt7Zx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.520353099026, + "y": 8311.513160528599, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1716500676, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "1.878.658.680", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "1.878.658.680" + }, + { + "type": "text", + "version": 3869, + "versionNonce": 412675722, + "isDeleted": false, + "id": "DFOHAWAXqcRnxnwg8KBCD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.58553698213, + "y": 8332.186209227488, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 842540412, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 4693, + "versionNonce": 211457814, + "isDeleted": false, + "id": "mhU5NYCqRYT9fiBTUAS61", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.58553698213, + "y": 8353.015998337249, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 1222901828, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.849.470.917", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.849.470.917" + }, + { + "type": "text", + "version": 3482, + "versionNonce": 290360650, + "isDeleted": false, + "id": "hqezwyPHAQvXGlGQoZ7pG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.656573463068, + "y": 8358.874390230596, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 663623164, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3598, + "versionNonce": 1520649302, + "isDeleted": false, + "id": "lIHeclXKtsr3TRGpYa8vb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.656573463068, + "y": 8367.75033191337, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1887655876, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3607, + "versionNonce": 123884554, + "isDeleted": false, + "id": "2xvULGhgUbs93lVLE3Pf7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8362.656573463068, + "y": 8376.233126099532, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 9.017759120234409, + "height": 15.459015634687558, + "seed": 1305605756, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 12.882513028906299, + "fontFamily": 3, + "text": ".", + "baseline": 12.459015634687558, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3622, + "versionNonce": 1436830102, + "isDeleted": false, + "id": "FiiGVOu--JKhCuXN1N9hC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8326.58553698213, + "y": 8393.946125080294, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 79.87158077921906, + "height": 12.882513028906299, + "seed": 692830020, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "3.560.941.935", + "baseline": 9.882513028906299, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3.560.941.935" + }, + { + "type": "text", + "version": 2871, + "versionNonce": 2093957834, + "isDeleted": false, + "id": "Tj1_DY_Tyzq7tsyTcZlpg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 8423.874743776556, + "y": 8188.3451808561, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 115.9426172601567, + "height": 12.882513028906299, + "seed": 835045116, + "groupIds": [ + "0tRD0ANS8vIzg6_NmFXS4" + ], + "roundness": null, + "boundElements": [], + "updated": 1672253728762, + "link": null, + "locked": false, + "fontSize": 10.30601042312504, + "fontFamily": 3, + "text": "2014-03-21 08:32:43", + "baseline": 9.882513028906299, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "2014-03-21 08:32:43" + }, + { + "type": "rectangle", + "version": 5710, + "versionNonce": 641225738, + "isDeleted": false, + "id": "MBAoilmli5tnopdFFP_Ed", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1964.4943391092702, + "y": 3215.232654807995, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 1009.3106553819443, + "height": 464.17078993055617, + "seed": 655234902, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4715, + "versionNonce": 925780374, + "isDeleted": false, + "id": "YyzVKd1wCSXmgp6RcfkLh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2114.5138887979588, + "y": 3478.3817123710746, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 704786698, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5339, + "versionNonce": 1357202122, + "isDeleted": false, + "id": "XkHNscGBF72a9jfUaowHG", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2111.7009484347104, + "y": 3478.4673880620435, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 322747542, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4852, + "versionNonce": 219981526, + "isDeleted": false, + "id": "I9CITwXNg2dVrpxHgEqmT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2113.071180464632, + "y": 3411.1473373710764, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1500217290, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5247, + "versionNonce": 1569085834, + "isDeleted": false, + "id": "4uzj8xICbwmCmQKKqWtZ3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2111.3376671847177, + "y": 3346.5871797287114, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1692711382, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4621, + "versionNonce": 1741511702, + "isDeleted": false, + "id": "m1hTR4pUFI9wZ_eZwSvi-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2114.2313367146357, + "y": 3346.5015040377425, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 1413281418, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2323, + "versionNonce": 1263966282, + "isDeleted": false, + "id": "lGXYEpyOd7HlHt52rlLvV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2174.97227773071, + "y": 3310.274507486573, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 123.92578124999996, + "height": 340.8218005952383, + "seed": 1394282262, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1630, + "versionNonce": 758475094, + "isDeleted": false, + "id": "V-WDNavdcuK5eK-eg9a_d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2186.836237477942, + "y": 3315.29632938439, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 103, + "height": 25, + "seed": 1261540682, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID.bin" + }, + { + "type": "rectangle", + "version": 3083, + "versionNonce": 2050031370, + "isDeleted": false, + "id": "YpRIBr8Op06sCSJ3Kp7pn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2323.5026847152185, + "y": 3309.269461913655, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 87.64195261437878, + "height": 342.412946428571, + "seed": 1783938134, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3019, + "versionNonce": 1017761430, + "isDeleted": false, + "id": "6wIpicwR9gXvELcwQy4Rm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.8865822846615, + "y": 3351.9613021914324, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 530865162, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1814, + "versionNonce": 378572234, + "isDeleted": false, + "id": "Kul3-vbfqfbba4qIiX_T2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2227.981200340216, + "y": 3352.624930663657, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1617346966, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 1863, + "versionNonce": 1121946582, + "isDeleted": false, + "id": "uC72G_cuPa16MqjEBsy9f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2360.3874503402185, + "y": 3352.455659830323, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1334856394, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 1701, + "versionNonce": 93340810, + "isDeleted": false, + "id": "pf2YMa5R3Tl3-Qs26E8Fy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2332.9802702806937, + "y": 3316.5973388977823, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 71, + "height": 25, + "seed": 1753620182, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL.bin", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL.bin" + }, + { + "type": "rectangle", + "version": 2934, + "versionNonce": 914134166, + "isDeleted": false, + "id": "QtYlOzalTt6ga6i4-dkbj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.210259104833, + "y": 3384.0860823591834, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1636852106, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-RM7a2Tnsb21UOJBgN549", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3754, + "versionNonce": 1357587274, + "isDeleted": false, + "id": "dk3Bq89x8j5gCm_4MDI_6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.3968870391523, + "y": 3418.676030815465, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 122147862, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1954, + "versionNonce": 506930070, + "isDeleted": false, + "id": "j1e1EhbG4bZ3h3qVJ3wtT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.6536680314844, + "y": 3385.212088866782, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1356832842, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253754304, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U2" + }, + { + "type": "text", + "version": 2067, + "versionNonce": 1911010838, + "isDeleted": false, + "id": "epTZ2a_3a-EaiD6gvYt9w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.70075369048, + "y": 3419.764172200116, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1721819478, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253758691, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U2" + }, + { + "type": "text", + "version": 1999, + "versionNonce": 1286748054, + "isDeleted": false, + "id": "a8HMkb_iTbC7vkR4GWads", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2354.7241911904803, + "y": 3385.214693033448, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 2035877642, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253783795, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2084, + "versionNonce": 1319914634, + "isDeleted": false, + "id": "2JT-nd63hJakj8PaVaGYA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2354.3714290369417, + "y": 3418.645258979808, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 702957206, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253815409, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "rectangle", + "version": 3344, + "versionNonce": 1904734422, + "isDeleted": false, + "id": "MBTEMlrDKA5Shqj3epxWn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.9696898549005, + "y": 3448.633570529108, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.0572916666672, + "height": 19.56467013888845, + "seed": 58168778, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2145, + "versionNonce": 371334858, + "isDeleted": false, + "id": "M-M6cGr3mxj402as5gN1W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.9024259401476, + "y": 3449.256410781023, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1103954902, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253770428, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U3" + }, + { + "type": "text", + "version": 2191, + "versionNonce": 2121287318, + "isDeleted": false, + "id": "AoPN1VmxKDmRHKbiZn14N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2360.3572766604575, + "y": 3449.215502876306, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1347832970, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253812300, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "rectangle", + "version": 3255, + "versionNonce": 2120363594, + "isDeleted": false, + "id": "WVYVS6hyE55aBzf24Vrmr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.3645982927187, + "y": 3480.637256946857, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1080695062, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4082, + "versionNonce": 1492818326, + "isDeleted": false, + "id": "pU_CI0NHbneRQ2VjLRdgs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2167.4799946093913, + "y": 3515.3482991531405, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 1706044234, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "zja_33DOJDMG2acFn04Rm", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2281, + "versionNonce": 336360522, + "isDeleted": false, + "id": "EW8PuY0acw9kW-Qx_uQ2p", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.359382094051, + "y": 3481.923945771225, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 758285910, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253773488, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U3" + }, + { + "type": "text", + "version": 2394, + "versionNonce": 411003338, + "isDeleted": false, + "id": "JRPw4Sv65RCLq82Hgo3Hw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2224.283861260717, + "y": 3516.476029104559, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1507865098, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253776753, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2312, + "versionNonce": 985018890, + "isDeleted": false, + "id": "ZyAxzo7Pj9lRkizeFfP33", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2354.9244862607175, + "y": 3481.9265499378926, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1492863894, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253823047, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2404, + "versionNonce": 74113366, + "isDeleted": false, + "id": "fBicEIQGc1-xP2qBKa-9r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2357.9557362607193, + "y": 3515.3583155377896, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1071734986, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253809500, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 2287, + "versionNonce": 519805578, + "isDeleted": false, + "id": "WGh5jnVjDBunJ1rNuAnvp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2115.662938777906, + "y": 3352.9685363921258, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 838428886, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 0", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 0" + }, + { + "type": "text", + "version": 2361, + "versionNonce": 393847318, + "isDeleted": false, + "id": "McmBj7OV8kHbC0pR8INiD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2116.928563777906, + "y": 3385.303605836571, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 40, + "height": 20, + "seed": 323925898, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "tCLdnNvIf4VsYmhf6WCEv", + "type": "arrow" + } + ], + "updated": 1672253748106, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 1", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 1" + }, + { + "type": "text", + "version": 2395, + "versionNonce": 242989386, + "isDeleted": false, + "id": "Ic8k_bcYS0I0jwbkjpjbN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2114.096098500129, + "y": 3416.9485711143484, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 47, + "height": 20, + "seed": 398581270, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 2", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 2" + }, + { + "type": "text", + "version": 2371, + "versionNonce": 1024724886, + "isDeleted": false, + "id": "ixwBsfHzwzNHktPcTalk8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2113.770577666795, + "y": 3449.166453058792, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 610481738, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "ki86qmcsAtMTZrgcgWzAT", + "type": "arrow" + } + ], + "updated": 1672253748105, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 3", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 3" + }, + { + "type": "text", + "version": 2346, + "versionNonce": 1040842762, + "isDeleted": false, + "id": "iisCSuXxWKRnLr2NCAuUf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2114.178563777906, + "y": 3482.868710003237, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 793357142, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 4", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 4" + }, + { + "type": "text", + "version": 2352, + "versionNonce": 1802039126, + "isDeleted": false, + "id": "vgtMTyIZGfll-h3GajFbQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2114.067452666795, + "y": 3516.0891961143484, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 20, + "seed": 66706698, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "bC8jtDTgkwE6zHu9X1f-6", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 5", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 5" + }, + { + "type": "rectangle", + "version": 5480, + "versionNonce": 1514465046, + "isDeleted": false, + "id": "8eZNABrVLwkJeBUlkccQJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2110.115010934716, + "y": 3411.2330130620435, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 317, + "height": 58.68447577621506, + "seed": 921030806, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ahs63f6BAd7RZnQxB8dqN", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2486, + "versionNonce": 512309974, + "isDeleted": false, + "id": "52RV0b6O9d69QVVN904O-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1985.7723854612245, + "y": 3359.466657896334, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1871555530, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 0\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 0\nwith 2 rows" + }, + { + "type": "text", + "version": 2578, + "versionNonce": 1440548234, + "isDeleted": false, + "id": "TIivEtu9MJez2TVfP9-KS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1986.3583229612245, + "y": 3425.763532896334, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1514884566, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 1\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 1\nwith 2 rows" + }, + { + "type": "text", + "version": 2671, + "versionNonce": 1183281174, + "isDeleted": false, + "id": "ltsIA0A2gw-bkGb6i2A5q", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1987.1356667112245, + "y": 3488.509626646334, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 1027187338, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 2\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 2\nwith 2 rows" + }, + { + "type": "rectangle", + "version": 4891, + "versionNonce": 1542964298, + "isDeleted": false, + "id": "oGwv0Gdb8xw3JeseX0TAL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 30, + "angle": 0, + "x": 2113.4251477321664, + "y": 3546.8325934903337, + "strokeColor": "#ffc029", + "backgroundColor": "#ffc029", + "width": 310.9393660873455, + "height": 58.71926364969739, + "seed": 110043926, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5516, + "versionNonce": 1401748822, + "isDeleted": false, + "id": "nL5D0bpeLnQ5noEp3pgXM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2110.612207368918, + "y": 3546.9182691813025, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 316.37334280303065, + "height": 58.68447577621506, + "seed": 1203290442, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3433, + "versionNonce": 902605578, + "isDeleted": false, + "id": "eh4QmQEnObGMEhqug5JzH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.2758572269263, + "y": 3549.0881380661162, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.02213541666703, + "height": 19.412326388888925, + "seed": 1042698326, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4269, + "versionNonce": 516271126, + "isDeleted": false, + "id": "gat2m4EG_lZAaSKNQ2Fa4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2166.391253543599, + "y": 3583.7991802723977, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 253.45182291666657, + "height": 17.51779513888891, + "seed": 1516636170, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "r0V3y2HfMunry04qr3-WA", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2455, + "versionNonce": 44827926, + "isDeleted": false, + "id": "rVEJWEEv_cbSFPxdvCnZj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.2706410282585, + "y": 3550.3352383237147, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1827001750, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253778843, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2574, + "versionNonce": 2137137110, + "isDeleted": false, + "id": "WHAD-C06aXkTq6CHpnevN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2223.1951201949246, + "y": 3584.8873216570487, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 490501834, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2495, + "versionNonce": 273461974, + "isDeleted": false, + "id": "q_8L_3dYbq92ozIIK5rSr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2357.3345455413864, + "y": 3550.377431057152, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1006809814, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253857327, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 2587, + "versionNonce": 374461462, + "isDeleted": false, + "id": "VLsty7uozuV1BDW_fMIgD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2353.4065837616963, + "y": 3583.848785223818, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 14093706, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253803589, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2524, + "versionNonce": 1637240650, + "isDeleted": false, + "id": "8lZVXh63-e86ZqKIPQ2th", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2113.089822712114, + "y": 3551.319591122496, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 46, + "height": 20, + "seed": 1712449558, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 6", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 6" + }, + { + "type": "text", + "version": 2531, + "versionNonce": 509193430, + "isDeleted": false, + "id": "OziR1Af9DXZ1NB0FHyU1l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2112.9787116010025, + "y": 3584.5400772336075, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 44, + "height": 20, + "seed": 712035402, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "YeF1EvrR3elZJ4Y9KX_C5", + "type": "arrow" + } + ], + "updated": 1672253748105, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "row 7", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "row 7" + }, + { + "type": "text", + "version": 2850, + "versionNonce": 1029821962, + "isDeleted": false, + "id": "HFrhERx2Se2gFkmfXEk6I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1985.8739345740046, + "y": 3556.960507765593, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 94, + "height": 40, + "seed": 185103702, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "granule 3\nwith 2 rows", + "baseline": 34, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "granule 3\nwith 2 rows" + }, + { + "type": "text", + "version": 2652, + "versionNonce": 584443798, + "isDeleted": false, + "id": "pgSnAvFhdzrOpumJzFvwF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2233.5071734487187, + "y": 3596.61986578764, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1608823562, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2770, + "versionNonce": 193889482, + "isDeleted": false, + "id": "kAX8rM9mLb8oQyvqUt5XL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2233.7941052669007, + "y": 3610.3996953330957, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 70998678, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2779, + "versionNonce": 505447638, + "isDeleted": false, + "id": "7H6nrZRmXOfoiUgsJTGOr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2233.8190451707483, + "y": 3623.5691664869414, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1940767178, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2827, + "versionNonce": 901208970, + "isDeleted": false, + "id": "FnAmFlmXmuQRRX-8dmA6r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2365.952526923371, + "y": 3595.3032865335613, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 945788886, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2954, + "versionNonce": 681933334, + "isDeleted": false, + "id": "N5wVDJirGnrXg7odzEfbh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2366.239458741551, + "y": 3609.0831160790153, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 820443274, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2963, + "versionNonce": 974608970, + "isDeleted": false, + "id": "iLAZdHXSIzE4IHlG93hYY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2366.2643986453986, + "y": 3622.252587232861, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1871326486, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 5028, + "versionNonce": 721017814, + "isDeleted": false, + "id": "dJlcyPulTIDc8OW31V6Ve", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2561.237944370635, + "y": 3325.2660516954015, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 251.25889756944446, + "height": 263.3309461805559, + "seed": 1196119882, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "PEKPTd-LhAGxWQY97JD3i", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3864, + "versionNonce": 394887434, + "isDeleted": false, + "id": "KBzXO0i7G--GT-h8VT8fh", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2583.819161439157, + "y": 3378.3186233099855, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 123.92578124999996, + "height": 197.2833214962126, + "seed": 657463894, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3227, + "versionNonce": 546466966, + "isDeleted": false, + "id": "MXhV1sD4oh6AW50btk_2-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2612.3515260619997, + "y": 3383.3956907435145, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 73, + "height": 25, + "seed": 926277130, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "UserID", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "UserID" + }, + { + "type": "rectangle", + "version": 4259, + "versionNonce": 302225430, + "isDeleted": false, + "id": "2Xp3FaqTyhKkyNfMAD81N", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2732.584298537301, + "y": 3376.8144457926223, + "strokeColor": "#15223c", + "backgroundColor": "#15223c", + "width": 60.780841503267865, + "height": 199.05406605113606, + "seed": 1713790870, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "d2WKSFZDAQkBOakKFezKv", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 5093, + "versionNonce": 470051286, + "isDeleted": false, + "id": "DI2DA9IKEcrtFUd_4uBQe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2575.7260086067445, + "y": 3420.294865221285, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 224.41844223484904, + "height": 19.07958491161571, + "seed": 1033997514, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3155, + "versionNonce": 1680885386, + "isDeleted": false, + "id": "ALoE0geVJqF180sjdpcUm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2743.1595403527763, + "y": 3383.820816700361, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 42, + "height": 25, + "seed": 279051478, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "URL", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "URL" + }, + { + "type": "rectangle", + "version": 4745, + "versionNonce": 1132530326, + "isDeleted": false, + "id": "MfVMPD_2cTT2vB3-dbSQq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2576.170779176916, + "y": 3451.255582889034, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 223.03527462121252, + "height": 20.091303661616152, + "seed": 1076454282, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "sdkAUpLy8SdwX0_3UU5Sj", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4630, + "versionNonce": 2099502358, + "isDeleted": false, + "id": "kTNr71hKZIAYg7teJhilD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2577.2075881992887, + "y": 3479.9952473377193, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 1010299414, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "aYYMc2myv4sefG8YIl23J", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3390, + "versionNonce": 1095265366, + "isDeleted": false, + "id": "Jtg7K8_AzeNxeFSUcLAqV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.8595806553576, + "y": 3333.735235723179, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 101, + "height": 25, + "seed": 956850762, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "primary.idx", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "primary.idx" + }, + { + "type": "text", + "version": 2856, + "versionNonce": 1114214870, + "isDeleted": false, + "id": "oeEvMJgISdMZ4tlvuKO68", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2498.51372252043, + "y": 3420.7979837390517, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 64831318, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "-RM7a2Tnsb21UOJBgN549", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 0", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 0" + }, + { + "type": "text", + "version": 2868, + "versionNonce": 511939670, + "isDeleted": false, + "id": "p_AnsPaLV3dXq4uQMPn5y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2497.95903502043, + "y": 3451.9932962390517, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 50, + "height": 20, + "seed": 588876042, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "Ahs63f6BAd7RZnQxB8dqN", + "type": "arrow" + } + ], + "updated": 1672253748107, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 1" + }, + { + "type": "text", + "version": 2692, + "versionNonce": 1317378762, + "isDeleted": false, + "id": "0U6pkwBhZjXk23DZtXTQb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2639.6629970740005, + "y": 3420.7978519806197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1541858454, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U1" + }, + { + "type": "text", + "version": 2852, + "versionNonce": 1238359306, + "isDeleted": false, + "id": "XwOQFIAx4beCfbY-qoG8K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2636.3540677078913, + "y": 3451.9498601145106, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1708644298, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253832635, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U2" + }, + { + "type": "text", + "version": 2920, + "versionNonce": 596987350, + "isDeleted": false, + "id": "iU8YIh60OAoEJ0KeCz2HB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.3270595740005, + "y": 3482.1376957306197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 1711923670, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253836000, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U3", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U3" + }, + { + "type": "text", + "version": 2639, + "versionNonce": 1687782422, + "isDeleted": false, + "id": "pqzLAxYiXpn3maCQT_qd9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2753.5614345740005, + "y": 3421.0908207306197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 1096699530, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 2779, + "versionNonce": 1858138186, + "isDeleted": false, + "id": "FzG6say1zA6ok7kViI9NC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2749.9676845740005, + "y": 3451.9501957306197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 1163605782, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2821, + "versionNonce": 87820298, + "isDeleted": false, + "id": "bXHUnpH_a-UA0OEvpH4pw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2750.2333095740005, + "y": 3480.6962894806197, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 25, + "height": 20, + "seed": 979889482, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253847922, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W2", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W2" + }, + { + "type": "text", + "version": 2946, + "versionNonce": 1356789462, + "isDeleted": false, + "id": "vFHrT8I4LSZajCvaenmuH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2493.8036220740005, + "y": 3481.8447269806197, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 57, + "height": 20, + "seed": 1917838422, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "zja_33DOJDMG2acFn04Rm", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 2", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 2" + }, + { + "type": "text", + "version": 3563, + "versionNonce": 759440726, + "isDeleted": false, + "id": "zfCGlhx93zYFnGewlD2EG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2845.194247074007, + "y": 3419.0205082306197, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 105886730, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "d2WKSFZDAQkBOakKFezKv", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 4495, + "versionNonce": 867310666, + "isDeleted": false, + "id": "d2WKSFZDAQkBOakKFezKv", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.0581793656675, + "y": 3427.8525394806197, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 42.59375, + "height": 1.18359375, + "seed": 247261590, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748103, + "link": null, + "locked": false, + "startBinding": { + "elementId": "2Xp3FaqTyhKkyNfMAD81N", + "focus": -0.4933611925763207, + "gap": 6.693039325098653 + }, + "endBinding": { + "elementId": "zfCGlhx93zYFnGewlD2EG", + "focus": -0.1431536845471553, + "gap": 2.5423177083393966 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 42.59375, + 1.18359375 + ] + ] + }, + { + "type": "text", + "version": 3754, + "versionNonce": 440185814, + "isDeleted": false, + "id": "0GO2M_YqAp9L2fTeOE4I9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2642.2170116255247, + "y": 3524.0740942644893, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1997578954, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3874, + "versionNonce": 1006214282, + "isDeleted": false, + "id": "TTiwLjVCn4IQ9JZmmuRwD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2642.5039434437067, + "y": 3537.853923809945, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 970409686, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3883, + "versionNonce": 1331939606, + "isDeleted": false, + "id": "UjnGA44oIUC-MVMAgF85N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2642.5288833475543, + "y": 3551.023394963791, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1732622730, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3938, + "versionNonce": 543783754, + "isDeleted": false, + "id": "pZ96NjNhpMplig5CbbV59", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2761.6623651001764, + "y": 3522.7575150104108, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1681128470, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4058, + "versionNonce": 292959830, + "isDeleted": false, + "id": "f0frKnRvSL4CBr08rpFbj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2761.9492969183566, + "y": 3536.537344555865, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 640284746, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4067, + "versionNonce": 284131850, + "isDeleted": false, + "id": "YDKlLiwZT5HG3XkhcqWD2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2761.974236822204, + "y": 3549.7068157097106, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 600312150, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "rectangle", + "version": 4808, + "versionNonce": 768482966, + "isDeleted": false, + "id": "WiTP9xXzdUsQm4LL2hUjr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2577.1599316044476, + "y": 3512.126763982567, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 222.6308001893943, + "height": 21.131431502525395, + "seed": 1670930186, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "PEKPTd-LhAGxWQY97JD3i", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3095, + "versionNonce": 396990422, + "isDeleted": false, + "id": "n4MA25q3Bl2J1DsmCJWqw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2637.2794029791594, + "y": 3514.4108139379673, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 24, + "height": 20, + "seed": 132673174, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253877492, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "U4", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "U4" + }, + { + "type": "text", + "version": 2994, + "versionNonce": 1423078742, + "isDeleted": false, + "id": "p_c2dV3iKDn6djGoJgNmH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2753.6856529791594, + "y": 3512.8278061254673, + "strokeColor": "#ffc029", + "backgroundColor": "#000000", + "width": 18, + "height": 20, + "seed": 470543818, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253862922, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "W1", + "baseline": 14, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "W1" + }, + { + "type": "text", + "version": 3121, + "versionNonce": 10729814, + "isDeleted": false, + "id": "KwIm32XKO1fKHCCypCjMB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2494.7559654791594, + "y": 3513.9762436254673, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 56, + "height": 20, + "seed": 1833577430, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "r0V3y2HfMunry04qr3-WA", + "type": "arrow" + } + ], + "updated": 1672253748108, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "mark 3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "mark 3" + }, + { + "type": "text", + "version": 3696, + "versionNonce": 1668237270, + "isDeleted": false, + "id": "NaksSlA21Y52KW_zkMc4n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2844.917554365673, + "y": 3450.715704473179, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 77571210, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "sdkAUpLy8SdwX0_3UU5Sj", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "text", + "version": 3799, + "versionNonce": 907266646, + "isDeleted": false, + "id": "t8M-kjtp4oQh61IYl_SBv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2845.353752282339, + "y": 3480.214402389846, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 1375879446, + "groupIds": [], + "roundness": null, + "boundElements": [ + { + "id": "aYYMc2myv4sefG8YIl23J", + "type": "arrow" + } + ], + "updated": 1672253748103, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 3431, + "versionNonce": 2027622858, + "isDeleted": false, + "id": "sdkAUpLy8SdwX0_3UU5Sj", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.2925543656656, + "y": 3460.051641973179, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 39.407552083333485, + "height": 2.12239583333303, + "seed": 1997439818, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748103, + "link": null, + "locked": false, + "startBinding": { + "elementId": "MfVMPD_2cTT2vB3-dbSQq", + "focus": -0.4556632522954561, + "gap": 1.0865005675375414 + }, + "endBinding": { + "elementId": "NaksSlA21Y52KW_zkMc4n", + "focus": -0.3666566984698796, + "gap": 5.217447916673791 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 39.407552083333485, + 2.12239583333303 + ] + ] + }, + { + "type": "arrow", + "version": 3446, + "versionNonce": 1030006602, + "isDeleted": false, + "id": "aYYMc2myv4sefG8YIl23J", + "fillStyle": "cross-hatch", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.3771897823317, + "y": 3487.873907598179, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 44.212239583333485, + "height": 2.916666666666515, + "seed": 696626774, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748103, + "link": null, + "locked": false, + "startBinding": { + "elementId": "kTNr71hKZIAYg7teJhilD", + "focus": -0.5620611078781369, + "gap": 1 + }, + "endBinding": { + "elementId": "t8M-kjtp4oQh61IYl_SBv", + "focus": -0.31716976539648145, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 44.212239583333485, + 2.916666666666515 + ] + ] + }, + { + "type": "arrow", + "version": 553, + "versionNonce": 1034235402, + "isDeleted": false, + "id": "ki86qmcsAtMTZrgcgWzAT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2076.8579840531816, + "y": 3446.380960549572, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 33.8720703125, + "height": 0.9912109375, + "seed": 1572047370, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748105, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "ixwBsfHzwzNHktPcTalk8", + "focus": 1.3621904407139551, + "gap": 3.7767034467196936 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 33.8720703125, + -0.9912109375 + ] + ] + }, + { + "type": "arrow", + "version": 438, + "versionNonce": 1504107722, + "isDeleted": false, + "id": "YeF1EvrR3elZJ4Y9KX_C5", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2074.1236090531816, + "y": 3575.052835549572, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 36.30859375, + "height": 0, + "seed": 816411542, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748105, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "OziR1Af9DXZ1NB0FHyU1l", + "focus": 1.9487241684035328, + "gap": 9.487241684035325 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 36.30859375, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 460, + "versionNonce": 1325708170, + "isDeleted": false, + "id": "tCLdnNvIf4VsYmhf6WCEv", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2070.6195251211825, + "y": 3377.3068735580023, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 40.95052083333303, + "height": 0.1649305555556566, + "seed": 529119434, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748106, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "McmBj7OV8kHbC0pR8INiD", + "focus": 1.758799553983158, + "gap": 7.831801723013086 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 40.95052083333303, + 0.1649305555556566 + ] + ] + }, + { + "type": "text", + "version": 2962, + "versionNonce": 1418523274, + "isDeleted": false, + "id": "VhxN827jn2HhKhohxtFtG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1979.5679843225648, + "y": 3230.075862273274, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 340, + "height": 50, + "seed": 1101172950, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Searching for rows with URL = W3\nwhen UserID has high cardinality", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Searching for rows with URL = W3\nwhen UserID has high cardinality" + }, + { + "type": "arrow", + "version": 434, + "versionNonce": 1878635082, + "isDeleted": false, + "id": "bC8jtDTgkwE6zHu9X1f-6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2076.695914010065, + "y": 3505.748713835774, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 31.640625, + "height": 0, + "seed": 204214154, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748107, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "vgtMTyIZGfll-h3GajFbQ", + "focus": 2.0340482278574195, + "gap": 10.3404822785742 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 31.640625, + 0 + ] + ] + }, + { + "type": "arrow", + "version": 398, + "versionNonce": 1823811530, + "isDeleted": false, + "id": "-RM7a2Tnsb21UOJBgN549", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2427.0686818672075, + "y": 3377.7183008893467, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 68.51004464285734, + "height": 51.21651785714221, + "seed": 671483414, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748107, + "link": null, + "locked": false, + "startBinding": { + "elementId": "QtYlOzalTt6ga6i4-dkbj", + "focus": -1.1100701193001765, + "gap": 6.83628734570766 + }, + "endBinding": { + "elementId": "oeEvMJgISdMZ4tlvuKO68", + "focus": -0.6874116316600608, + "gap": 2.934996010365012 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 68.51004464285734, + 51.21651785714221 + ] + ] + }, + { + "type": "arrow", + "version": 417, + "versionNonce": 103890250, + "isDeleted": false, + "id": "Ahs63f6BAd7RZnQxB8dqN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.3622086529213, + "y": 3441.127899103632, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 64.67075892857156, + "height": 21.294642857143117, + "seed": 1205177930, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748107, + "link": null, + "locked": false, + "startBinding": { + "elementId": "8eZNABrVLwkJeBUlkccQJ", + "focus": -0.6424145019487615, + "gap": 2.2471977182053706 + }, + "endBinding": { + "elementId": "p_AnsPaLV3dXq4uQMPn5y", + "focus": -0.5459624308582374, + "gap": 3.926067438937025 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 64.67075892857156, + 21.294642857143117 + ] + ] + }, + { + "type": "arrow", + "version": 370, + "versionNonce": 1019605706, + "isDeleted": false, + "id": "zja_33DOJDMG2acFn04Rm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2429.4961372243506, + "y": 3506.1781223179173, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 61.69642857142867, + "height": 12.834821428570649, + "seed": 1959318358, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748108, + "link": null, + "locked": false, + "startBinding": { + "elementId": "pU_CI0NHbneRQ2VjLRdgs", + "focus": 0.29086110609133803, + "gap": 9.170176835223174 + }, + "endBinding": { + "elementId": "vFHrT8I4LSZajCvaenmuH", + "focus": 0.31223210666640894, + "gap": 2.61105627822144 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 61.69642857142867, + -12.834821428570649 + ] + ] + }, + { + "type": "arrow", + "version": 372, + "versionNonce": 1523271754, + "isDeleted": false, + "id": "r0V3y2HfMunry04qr3-WA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2427.476047938635, + "y": 3574.8109348179173, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 65.30691964285711, + "height": 45.675223214286234, + "seed": 929117450, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748108, + "link": null, + "locked": false, + "startBinding": { + "elementId": "gat2m4EG_lZAaSKNQ2Fa4", + "focus": 0.7826516271118303, + "gap": 8.98824545448042 + }, + "endBinding": { + "elementId": "KwIm32XKO1fKHCCypCjMB", + "focus": 0.5342067936915732, + "gap": 1.972997897667483 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 65.30691964285711, + -45.675223214286234 + ] + ] + }, + { + "type": "text", + "version": 3934, + "versionNonce": 1603389130, + "isDeleted": false, + "id": "BpkQGbBTw3AgIsXrDWsau", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2843.150775121174, + "y": 3513.093424897265, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 113, + "height": 20, + "seed": 1379924118, + "groupIds": [], + "roundness": null, + "boundElements": null, + "updated": 1672253747864, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "select granule", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "select granule" + }, + { + "type": "arrow", + "version": 376, + "versionNonce": 1956199882, + "isDeleted": false, + "id": "PEKPTd-LhAGxWQY97JD3i", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.574386232285, + "y": 3523.345161008377, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 43.61545138888914, + "height": 0.542534722221717, + "seed": 1816789962, + "groupIds": [], + "roundness": { + "type": 2 + }, + "boundElements": null, + "updated": 1672253748108, + "link": null, + "locked": false, + "startBinding": { + "elementId": "WiTP9xXzdUsQm4LL2hUjr", + "focus": -0.06206704117319776, + "gap": 1 + }, + "endBinding": { + "elementId": "dJlcyPulTIDc8OW31V6Ve", + "focus": -0.4878789719383463, + "gap": 31.692995681095 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 43.61545138888914, + 0.542534722221717 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "76f7965db97d0c2ccdf9386a266c1e3488b8ba3e5f45567dec96fcf5f9f279525ad39fee2918979a507aabbd12a9ed8d": { + "mimeType": "image/png", + "id": "76f7965db97d0c2ccdf9386a266c1e3488b8ba3e5f45567dec96fcf5f9f279525ad39fee2918979a507aabbd12a9ed8d", + "dataURL": "data:image/png;base64,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b/Jq3TSpUqWKieBKJMF0NWPGDNm6dat07NjxoDJdqUYn/Jv03XffyayZM+V///uftIvCdHWoEp1vvvlGZs+aJaeccopc3aZNeCC1hSKgCCQcAkp08iE6mK7G/3uCHHdMCSlaJEVSk8mlk2RITFEfhAbxiT/JL3jcZIlPfFZzk5NcMNOf3S4V52UsXVn45IhwHZ60P8Mv6X6/7MvMlN//3C19Sm2WatWyo7dU4oOAEp344JjfKIcq0Sl45PQJioAiUNAIHNREZ9euXVK6dOmIMPLax5quXsw6RY4slu0cXDQpSVJzcgKm41hMHh0///rNv2hpiMxCihFhnuWX/T6f0fb4/b5sP2TYDSYrSJFPjPkqXbJkX1qW7N6XJl2TvzJEB1+HWIU1/Pjjj4Y0HXvsscbJ2aukp6cL3/JxLq1xwgleux3wdtu3b5dt27ZJ9erVAxgmMtH5448/zHxx7vZKbkliSR/64s9VoUIFSU6GansXN5y89N63b5/8unWrZGZlGc1j0aJFTbd4Eh0iEn/99Vfhb5X39qijjvIytUCbcGv7b88eE1G5b/9+gx0YarLPiCDWxorAQYXAQUt05s6ZI6iVzzjzTLniiis8gY5D7XsbN0qFihXlhhtuyLcPJOGHH36QKVmnScmi5MxJNpFWRFwh6bjb8MHvkyxfliRDZ/w+Sc+2XUmJlGxGtBfjFmQoK9u85TedsktJcIXjKTtsPV327suQ61MjJzp//fWXXNaokXle//79DSZPPP64vP/++4E1coi2bddO+vTpk4fwDBs2zKjny5QtK7NmzZIHBwyQDz74QAixr1ipkixdulQ4HC6++GIz7zvuvFO6dOniCfP8Gn3++efS9dprTZNnn31WLrjwwjzNiea54frrzfVx48cHnGSD18xB9eKLLxpihwwaNEiuatXKfI430el7223yzjvvGJynTJniusTeN98sGzZskHPOOcc49zoFXEeNHClvvvWWbN+2LXCLQ71jp05yzTXXuB68mA9feP55Y0Jk/VYgAm3btpUbb7opjxO7V5yeefppsxZ8w9559908a/r7779l9KhR8tprrwnzQCD/jS67TPr27SvTp0+PyhnZ+e4xNuOwRkzHVs486yzjRF6rVq1c8/K6NtuJ923smDGydu3aXOMcd9xxJpKwU6dOedY9evRomfbii4Y0s18qioAicPAh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", + "created": 1648744551489 + }, + "272da4c5523dd5f697196765350e6241b6e449522d5b653f0076f658fa6591ad739c21d038062715cb4daf0dd29467e5": { + "mimeType": "image/png", + "id": "272da4c5523dd5f697196765350e6241b6e449522d5b653f0076f658fa6591ad739c21d038062715cb4daf0dd29467e5", + "dataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9wAAACGCAYAAAAvrYIRAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQecXFXZxp87ZUs6IXQICYQOoSO9qggCAgrSi4BITQBRaYIgRaVLl6pSVVAUBenSFFE6ElronYSWZHdn5t7v9z+zZ7+bYfqdTbLJ++qy2Zlbzn3Oueec561BFEWRTAwBQ8AQMAQMAUPAEDAEDAFDwBAwBAwBQ6ClCARGuFuKp13MEDAEDAFDwBAwBAwBQ8AQMAQMAUPAEHAIGOG2gWAIGAKGgCFgCBgChoAhYAgYAoaAIWAI9AMCRrj7AVS7pCFgCBgChoAhYAgYAoaAIWAIGAKGgCFghNvGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCHQDwgY4e4HUO2ShoAhYAgYAoaAIWAIGAKGgCFgCBgChoARbhsDhoAhYAgYAoaAIWAIGAKGgCFgCBgChkA/IGCEux9AtUsaAoaAIWAIGAKGgCFgCBgChoAhYAgYAka4bQwYAoaAIWAIGAKGgCFgCBgChoAhYAgYAv2AgBHufgDVLmkIGAKGgCFgCBgChoAhYAgYAoaAIWAIGOG2MWAIGAKGgCFgCBgChoAhYAgYAoaAIWAI9AMCRrj7AVS7pCFgCBgChoAhYAgYAoaAIWAIGAKGgCFghNvGgCFgCBgChoAhYAgYAoaAIWAIGAKGgCHQDwi0jHBHUSR+ykkqleqHptslDQFDwBAwBAwBQ8AQMAQMAUPAEDAEDIE5F4FEhDsMQ0eyu7q6FASB+LtU+Dybzbof/m1iCBgChoAhYAgYAoaAIWAIGAKGgCFgCMwLCDRNuCHX3d3duvWJyfrrGwUF2UGCThcUCnt2NpNWQZGiri4t3zFDB22yrAYNGiSs3WbxnheGlj2jIWAIGAKGgCFgCBgChoAhYAgYAvM2Ak0T7kKhoI8++kjfvf1NdWUHK1WQCpEURQVHuFOZtDBopxQom440OvehfrzVChoyZIgymUxZ1LGAm1v6vD0g7ekNAUPAEDAEDAFDwBAwBAwBQ8AQmFsQaJpwT58+Xe+88472unuaeqJAPdm0ZuRDBYVQUSClM4FSQaBUvqDBmYwy2ZQWDT7VnssM0RpjF9bQzqzS6fRMBBuyDemOE28+4zikvb3d/fZ/zy2dYM9hCBgChoAhYAgYAoaAIWAIGAKGgCEw9yGQiHC/+uqr+ua9OU3LR+pOpdQdRSpg5lakIBOoB+t2T0HZVKBsW0bDsyl1ZlJqx608y3EpKcQsHigfFl3RC+lQ6UgqBJmia7oKSgeBBqtLuy+Z0U5rj1NbW9uAcEvv6elxbe1PmTRpkn77299qhRVW0G677daftxrw106CVS6X0+9+9zunIFp77bW17LLLznY8ZsX4ij8k+D399NOaPHmyBg8erP33379fx3eS58vn84nCVwiX8Qq+ZjoaDyBTDlZHLkn/NtMnc+M5hHYx1vt7nUmC3UDu508//VRPPPGEnnnmGWFk2HDDDbXuuusmgWPAnTuQ+w+wZ+Vc/Pzzz+s///mPMxp9+9vfHjDGoTmxj+vdc9WzL6l2zE033STutfLKK2vVVVcdcO/nnNrgpHuoWflcs2r8N024P//8c7fx3vz+UFN7QhW6cwRwSzkiuSNlM5niP/O4mEdSW9pZuQeFUkcqUAg5x1rdHiiI+Lu4QU0FRWt2TyGvNj7HSp4OlE5nNL9m6K5vL6mRI0dWdEuv1kkPPPCA/vrXv7rFc/XVV9c222yjddZZp2q/TpkyRWeddZYjWjvvvLNWW221isczsf/hD3/Qv//9b/33v//VW2+9pbFjx2qNNdbQV77yFW266aZlz73wwgvdsfXIQgstpAkTJvQduuOOO+q5555zf19zzTX60pe+VM9l5sljkmD18ccf9220jjnmGO29994zYcg4gZDff//9LkHgJptsop122klDhw6tivXvf/97N1bmn39+HXXUUVWPnR3jyzfol7/8pRincfnXv/6l4cOHu494t/72t7/VNa5+/OMfq6Oj4wvHNvt8/kIsqrzf4PnUU0+5OYIFlPdv991313zzzVe1fcxn559/vtswvf/++06psMwyy2jffffVlltuWfPZXn75Zf3617/Wfffdpw8++MDdn/OZMw499NCa9yf55F/+8hen1OCHkJ3llltOK620kjbaaCP3HLWE8+gL5rj//e9/GjZsmNtI8LP11lv39Ve56wzE+ZE+XXDBBR1OzOXN5geZMWOGzjjjDLfxQpZYYgkddNBBZeFuxViv1Y/VvodgM9fceOONbg1ms7Dooou6MXLIIYdogQUWqHj6QJ2nWtXPd9xxh5ujveyzzz4Vladvvvmm9tprL7399tt9x++555467rjjknRfonPn9f6rF7yk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nHGGbrzhBnfuwYccogMOOOALTZ7VhLuVz1/6MChJ8Oi4/W9/0+9///s+8r3b7rvr6F4lB5nuL7/8cqXTaZcQjUzj9crsINzHHXec/nrbba6JvzjzTH25tyxZvW224wwBQ8AQMAQMAUPAEDAEDAFDoDoCiQg31tqrXg909R4bacutthG1izHeOuO1UvrPY4/o0PteV8fw+dXR1u4IdMEFc0fOcl2sx41LuZTutYjjZu4s3sWLKBcGCqNQhXxB07rz+m7b/xIlTesvC7evk9zIgDvv3HN19dVXu1PqsUjXunbcRXiFFVbQtdddVzVO/PjjjtNtvYSLEljr9dYb5z61CDd1zLfbdltNmzbNxTQT/4ubfFxmNeFu5fNXwxpL99ZbbeXKvS233HK64cYb3eFxzK759a81fvz4Wl3W9/2sJtyUNrvsssvc/YcMGaK77r67IQVB3Q9mBxoChoAhYAgYAoaAIWAIGALzMAKJCDfloK78aH6tmv5IR31jE6259nrq6e4uxmhHKT315H90xL1vqm34fL0JpFKirjZcOuytx+2rcTvC/f+e1kVreCB1wczDUPkcSdNy+k5mziHcuAbvsfvubvjE43H9eCLx1n8ee8zV5D7t9NNdfe64/OmPfxREHSmt59zsmNx/v/30n//8x51OfPiPTzyxLOm+9tprdeYvfuGOI0P17bff7kpVealFuDnusksv1cUXX1zx+Wc14aYhrXj+1157ra+++le33LJsAjMIN2XR4jXU33vvPX1tyy0dHssuu6zIVF6aYA3X9F/04n74hAl9bv+zinBjqb/uuuv6+p62nnjiidp+hx2aHXJ2niFgCBgChoAhYAgYAoaAIWAIVECgacL96aef6plnntbdqWV14kaL6eenn6Frr73OWacp+YW88PyzOvyeN9U5bISynZ1KqZgkDcbdQ3Y1V3c7pVRQrNfdW1HM/c6SrTyQphekKB+qEIaa3pPTvunntNRSSzWdpbyVFu6pU6dq8944aZKK7bf//lprrbU0eoklNGjwYMVdtldeZRUdduihIu4X0kOs7xmnn+4yRFN66u933ulckZMKSoCDvvc9EWOPbLzxxs5VePyqqzri/+STT+qfjzyim2++2X3PPU897TRt2UsUGyHclEzDys0zEItOHWcSrHnxhHuxxRabKT683DOOGTOmatxzvbi04vmJ3ea5fGK4iUcc4YjxEkss4cqh4Q3gXbF/+KMfaZdddulr3i/PP9+VR0Po652+9S1HyrGG33fvvbrqqqvcvyHit99xh7MuI60m3IxzSL8XrPIoCKj7zjN42frrX9epp55aL7x2nCFgCBgChoAhYAgYAoaAIWAINIBA04R7ykcf6amnn9bC49fV6/95QBMnTKTQl7Omjhg+XB9//IkmT35Je938jNqGzqdMRzGeFZpNHHdPIXSJ07JkWqPudoF47aIrOdfJZIr1w7ryJFQLFRLHnS/o6AXenWNcymlf3KLqcYfAbr311uru7naxzcS6e4GYQui8EOeLFZrjWyWTJk3SwQcdJNy+q0k2m9XPfv7zssnV6rFwc+3f3XSTTjvtNHebDTbYQBdceGHfLT3hrue5dthhB4dDK6QVz0/G9xOOP36m7PIoJwqFvrp2Trly1tlnz1QODWXK8ccf30fIyz1PW1ubzj//fH1p3XX7vm414a6FI89C7P2+++7b8vJ0te5t3xsChoAhYAgYAoaAIWAIGALzCgJNE26sZO+9+66znH7pS+tp6pSpWmCBUbrggvO19Lhx2mnnXfTQA/dr/9tf1eChI6RBHa4sGFnMCdOmzjYSUC4sILt5MYjbZy8PCgSDF7OekzSN+t3dPTkdMuTFprKUr7/ees6yuM8++2jCxIll+3etNdd0hAqSDBlBKA+1Xi8xwtK59957z3QuccPXXHONI1g+izXu49TbRrjelVdcoZtvuUXvvvNO37lYNldccUX94Ic/nMkq3KqB9+rkyY4Ik0gsnhXdX5/YY8qjxUlf/N7333+/Jk6Y4D6q5u5OpvJv7rijyHiOxGOXd9t1VxF2UI+Uc8mv57xKxyR9fq770ksv6WdnnKFnnnnGjYPi+AycpZt67ng0oEApFUrAXXLxxc6LIJ7ZHJK7+RZbiFJqcU8Azo97S5DM7Fs77VT20ar1S/y70pNRrhDSsPDCC2ujjTd27R81alQSiO1cQ8AQMAQMAUPAEDAEDAFDwBCogUDThJs4V8jGPffcp2OPPVbLjBunG2/6nW5+4iXd+fgLOmXnzbXWSstqh98+qkFD51eqo825kOdc6rRA6QIEm2xpxRYWsGtHRes3BLwnLCiFe3pIxvOCwjBQrqdHx4/5pCkLd3+PBIgnLtaQ2+HDh5e9HQnGcFPGnXjRRRf9gmWRa8QtqI20mb6AVJUKCoEXX3jBJbSDLA4fMUJjllxSY8aObeTys+xYvAKaFSzHPGNcWvH8eCTQbyhsFl98cQ0aNKiuJtKXxHVDuikdtsgii8wUJ1/XRewgQ8AQMAQMAUPAEDAEDAFDwBAYsAg0TbhffvlljZp/fu233/6aNOkF3XXP3Tr7zif0YvdgDR61iD5/7UmtsvAwTR6+rNoGD1eYzShSSoMKkfIBedCKJu6o140ccl00cnNUqHQQuHrc0HNId093ToVPpuiEZadr9OjRfbGvAxb5Mg2Pl2lq9LmI173xppsaPW2OOj5eF7yZhrUi03sz97VzDAFDwBAwBAwBQ8AQMAQMAUPAECiHQNOEe/LkyVpi8SW01lpr6rTTz9CLwfy6c0pag0ctqXQ6pXy+Wz0ff6BBCy2hgLjldNH1ti2izJeUh0WTP603nNmVBosihSkod6CMy3ReJNy4oOc//lTLf/KU9txgOWcdrtfKOJC6/ZhjjnF1npuRZZZZxiUtG8jy6quvaoftt2/6Ec486yxtscUWTZ9vJxoChoAhYAgYAoaAIWAIGAKGgCHQSgSaJtxvvPGGq7t8yimn6IiJE3XBZVdovgUWVSadVkB6cZceDemtqx1FzlW8KL3x2vwzRZI051Puy3IX3YKjYvI0jhzUntaCI4Y4oo1L73zzzVfWfbqVwMyOaz333HMzZZBupA3Dhg3TOuus08gpc9yxxEk/+OCDTbdrtdVWs7jkptGzEw0BQ8AQMAQMAUPAEDAEDAFDoNUINE24KQVFXOvqq6+mO27/uwYNHqTOjg6XAQ2SHDqCHSPWuIz3FdouknD+5z/j2HhyL/d3GCmdSSudSqmjs9PFwfJDZu9yyapaDY5dzxAwBAwBQ8AQMAQMAUPAEDAEDAFDwBBoFoGmCTeZmMne/Owzz2r8quOd5TmTybiSV/HEVZDoSn/77+K/eRBH03sJOGQbes61/Y+R7Wa7284zBAwBQ8AQMAQMAUPAEDAEDAFDwBCYVQg0TbhnVQPtPoaAIWAIGAKGgCFgCBgChoAhYAgYAobAQETACPdA7DVrsyFgCBgChoAhYAgYAoaAIWAIGAKGwByPgBHuOb6LrIGGgCFgCBgChoAhYAgYAoaAIWAIGAIDEQEj3AOx16zNhoAhYAgYAoaAIWAIGAKGgCFgCBgCczwCQRRPDT7HN9caaAgYAoaAIWAIGAKGgCFgCBgChoAhYAgMDASMcA+MfrJWGgKGgCFgCBgChoAhYAgYAoaAIWAIDDAEjHAPsA6z5hoChoAhYAgYAoaAIWAIGAKGgCFgCAwMBIxwD4x+slYaAoaAIWAIGAKGgCFgCBgChoAhYAgMMASMcA+wDrPmGgKGgCFgCBgChoAhYAgYAoaAIWAIDAwEWka4wzCs+MSpVGpgoGGtNAQMAUPAEDAEDAFDwBAwBAwBQ8AQMARahEAiwl0oFESS856eHteccqQbsp3JZNyPEe8W9ZpdxhAwBAwBQ8AQMAQMAUPAEDAEDAFDYI5HoGnCDbmGaP/p8Vf0tzdDhelOpYIA2u1+INihIqW6u7VMxzQdtPFyGjRokCPdRrzn+HFhDTQEDAFDwBAwBAwBQ8AQMAQMAUPAEEiIQNOEG+v2Rx99pAPueFPdmcEKokhhIVAQFaRISrdlxD9wJk+nA43Nf6gTvra8hgwZ4sh4EATOOl6PcCw/JoaAIWAIGAKGgCFgCBgChoAhYAgYAobAQEGgacI9ffp0vfPOO9r7numaEUqFTFrdhVAFF8sdKZ1JKxWESuWlzkxKHW1pLRJ+qj2WH6o1xiykoZ3ZPks3xBurtyfg/PYkG0t6Op12eLa1tbnP/d8DBWRrpyFgCBgChoAhYAgYAoaAIWAIGAKGwLyHQCLC/eqrr+qbd+c0LYw0I51SDq6dD9WTktpSgcJAinoKUiqlQW0pDc+mNDiTUToVKJMNii7nBUkYrwuRc0YvpEMFERbttBRESoehOgKpLejRnkumtdPa4xzxbtQt/aabblIul9PKK6+sVVddte6ehvD/5je/0eTJk7XXXntpqaWWqvtcO9AQMAQMAUPAEDAEDAFDwBAwBAwBQ2DeRaBpwv3555/rlVde0Vfuj/R+LlSqK690Qcrloc0pKZt27uRhDsItZdtSyqRTGqTQxXpDqh3TbpfyCpSKINqRMims2YHCXE55zg9SCjIpZVIpLRx0686dR2vkyJHOLb0RGT9+vIs5/853vqMf/OAHdZ96zz336OCDD3bHr7322o58z6nyzDPP6LrrrnPNO/DAA7XkkktWbeqMGTN0yimnuGO22GIL9zOny4UXXqi33npLY8eO1QEHHDBTc/135Z5hvvnm04ILLqjllltO66yzTsMKm1q4tBL7559/Xr/+9a8r3nLhhRfWaqutJsb0iBEjyh4Xv8b+++9viqJaHWjfGwKGgCFgCBgChoAhYAgYAv2AQGLCvcZdeUVdkcIZeaUKBaVyRcu2Mhll5Ql4pGxG6iYOOwyVInQ77+i4ws6Uy7OWIgYcqt5rGXfm8ihQRpHC9pTS2TaFnaEm7TBCEI7Bgwc3BEezhPvee+/VQQcd5O4FUYsToXfffVfXXnut+26bbbZxZG52yl//+lcdeeSRrgm0k/ZWk6lTp2q99dZzh/CMEyZMmJ3Nr+ve3/jGNzRp0iStvvrquv7662c6x39X60KLLLKI9tlnH+ex0KrcAK3E/q677tKhhx5a6zHc9ygdjjrqqC8cG7/GFVdcoQ022KCu69lBhoAhYAgYAoaAIWAIGAKGgCHQOgQSE+6t7wv0jfGLaeTwdmUzGRUKsOlA7UGkCE5NcrQAQk2jIwXw6N72w8vzuI9j2W6TyKEWhli7I3ceLud4pOfyBU2Z0a2/PfO2/rZJylk3Ozs7G0KhWcKNS/lvf/tb4T6/xx57zGQp/O9//6vddtvNtePnP/+5tttuu4ba1OqDW0n6Wt22Vl2vHsJNNnz62wueDe+9955QkJDsz8tmm22mM888s2HlTblnaSX2cbK84oorav7555/pWd544w29/fbbfZ/tvPPOOumkk2ay2hvhbtWIs+sYAoaAIWAIGAKGgCFgCBgCzSPQNOH+7LPPXFzzOe8vqkXnH6zO9oyyQeAINISauGt+Q7YD/pGGdAeKQsh0pDAoEuscmc0DKZstEm/4Osc7K7mknjyJ2KQZhYLe+fhzHTXybUd6yXbeiDRLuKvdwwh3Iz3QmmPrIdzlrN/cnaz6v/vd7/TLX/6yj3hvv/32OuOMMxI3rr8IdyXr9D//+U8XGvH++++7tuNpseaaa/Y9hxHuxF1qFzAEDAFDwBAwBAwBQ8AQMAQSI9A04fYx3JdNH6uhHVllUyllgpSyqSJhzhcTixfJczGq20m+wN+BBmWKdu4uR8txNS9awYNUkagXXIw32csD9RQi5XM9+qwrrwMHv9oywt3d3a2XXnpJo0eP1tChQxsGs1HCTdI24t6xzi+xxBItc2f2DW8l6SsF48MPP3QW4jFjxtSt7MA7gHM4FystoQCNZJgHrxdeeEHt7e0aN26ca1ISwu2f6ZZbbtExxxzT94iXXHKJNt1004b7P35CK7Gvlyw/+OCDIj4bOfzww/tyDfB3vddI9NB2siFgCBgChoAhYAgYAoaAIWAIVEUgMeG++POl1dGRVlYpV2870+tCXvBlsyn5FaWUUqhCKhAevRDqQcUk5OryxxUiRVi9e63iGMIh6m2BlCuE6ikUNKOroEOGvqKll166YTfguIV7q622clbNp556ymUuR5ZZZhntsssu2n333WcCrKury1kOKVX2/e9/3yVdg7Add9xxglDGxWdOP+uss8Q9vGCN5DMSWfn7QbqxxJ544ok1k5vVO4ZbSfq4J0nVfvazn4k4dlyyvSy22GLOvZ446HIx0Pl8XpdeeqlzxSdO3AsJvsCY+OTSpHckbyMme9SoUfrTn/6kH/7wh/r3v//t2kDMNW1AWkG4uc7ll1/u3MkRXMsvvvjiemEue1wrsa+XLDMm11hjDYfRuuuuq6uvvrqvbfVeI9FD28mGgCFgCBgChoAhYAgYAoaAIVAVgcSE+7xpY12N7c4g7SzcvfZq5VJFJp0mHlsQ8WI7cu53pKg3dhvXclzKvbj4bQVK90Z69yhQIQpFMPe0nrwOGzbZxXA3apH2hPvLX/6ysExPmTKlLDAQ4F133bXvO+qNQ2oQklORpOr3v/+9jj/++IrA/uIXv9C2227rvid5GeTek3MIqq83zvfEG1900UWOMCWVVpI+XJWxnmJh9lLa9k022cQR61IhnviGG26o+DjEHJ988skzfQ/uN954o4YNGybillFSeOkPws21N954Y+eSnc1m9dBDD7l7NyutxL4RsrzWWmsJb5NSN/pGrtHsM9t5hoAhYAgYAoaAIWAIGAKGgCFQHYHEhPvcz8eqoz2jIUE6lrQpUjeEO4rUHgUqKOol3IEj3LiOFxTIRXtj5naB3o6H90majwKph7juMFLYHaorl3OEO0kMNzegjvcRRxyh9ddf37l333333Tr33HOFizmkEsuqjxEvR7j57IMPPnAW8qOPPtq1Gev3V77yFfdvyk9xXazjZAHHAolV+NRTT3XWcs7FYvvTn/7UkW8+89nOkwzYVpI+lADnn3++a87ee+/tFA0Q0ieeeMJ9/thjj7nvsKrGlQVXXXWVs4ojkECSyq200kr63//+5yzejz/+uPsO3Pbbb7++x/WE238AJmR+X3755fuuxT9aZeHmWpR7o+wbgoKAUlvNSiuxr5csk60dPBAS9pG4z0u912j2ee08Q8AQMAQMAUPAEDAEDAFDwBCojUBiwn3hJ0upvT2lVDrjamX3RGQXl4ZksWJL3SGcOlIbDFqRChTXdiHbxb/53BHrXOTIrjOMB1KXS6YWqtMdHOrzoKCuXF6Hdbzi4nmbLQsGJNRrLq05jaX2nHPOcYjFS2qVI9we1lox3BD5Qw45xB3OteNu5nxGTW+IEYJLM9buJNJK0rfDDjs4koxyg+vGhZjsY4891ikottxyy75M7Xy+0UYbOSXCsssu62qCx5PbkWgPl/KXX37ZuZSDH8oPJE64v/rVrzoXfCzPpdJKwh1XKpBIzStMmumDVmJfD1kmSzmu+c8995xrLs+y+eab9zW9nms085x2jiFgCBgChoAhYAgYAoaAIWAI1I9A04R72rRpjjj98pOl1NmeVjqVUpBOK0/MNlnKM2Qdl7oxYEdSW28StXy+SKwLEb+l9l5f824+j4gDDx0Z7yaIW9JgBQrDgmYo1Ix8Xod3JrNwlyOQ3IdSS55wET+87777uvsnIdzxGt4HHnigs6r3p7SS9H3zm9/Us88+q5EjR7qY9YUWWqhm0++77z5973vfc8eVZs32J8eVEGQMX2WVVb5AuP/4xz/2Wbb7k3DHSSlu8CgDmpVWYh9vF27viy++eF+zyAHw1ltvOWUFHhQIIQ/gHY+nN8LdbE/aeYaAIWAIGAKGgCFgCBgChkDrEGiacPss5biUD8qm1ZbKKEgXY7j5T9olRYuV/3Je44EiyiBTHqxYmFvtsPFUsWQYMsPVEAvU1ute3iMM3KGL48alfMKgZIQbC6l3eY7DCJHx5A/SOHHiRPd1EsL98ccfO4uvT5QGMcJN+ktf+pKzHJdLOJaka1tJ+nBPvvLKK11zcCWn3SQXw028Ukm2Cy64QPwg/O7o6PjC47zzzjs64YQT3OfxeHlv4cZzAXf1Sti00sJNkraf/OQnri3xuPtm+qCV2MfJcrW2gBHx8EceeaSGDx8+06FGuJvpRTvHEDAEDAFDwBAwBAwBQ8AQaC0CTRNuLNwvvviizv14CbVnpYxSSgVphUHoLNttadzM0yqkSaaW6a2rHeEd7gh1EBQTp+FQHCoSHudw8K7eJGokT4OC53st3FjEZ+TyOnzQK4liuMkyTv3icrLCCis4d+hWEW7ugdX3sMMO6yPd/r6UyYLEYknG/boV0krSh/WUGOeHH354pqaRiX3ttdcWLudf+9rXZiLVBx10UF828Xqe59vf/nYf4fWEe7755tMjjzxS8fRWEm4S35EADymNRa+n/fFjWol9nCwTPgEmXlBYvPnmm+5PwhUYW+XECHejPWjHGwKGgCFgCBgChoAhYAgYAq1HoGnCTTzupEnP6+x35ldbSupsg1gHzoU8pUDZAOu2FGY6lB0y3MV3Q6EzEOyg6HaOxZv/O+M2lm9KgIWBoiDUoFQxFhxzeb4QqSvKq6enoMMGJ7Nwz2rCzROQJI1SV5Ay4qLjWcohsGQxJ+lVUrn99tv7LPNYmMnIXk1ee+01F4ONQK6p5RwXPAsgv7h4P/DAA8JiH5dVV11Vv/rVr/qye5PVnNrQyMorr1zx1s8884z7nphj7ovMDsLt49S5/5133ulqozcrrcS+Gll+/fXXtfXWW4vSa7j533HHHWU9CYxwN9uTdp4hYAgYAoaAIWAIGAKGgCHQOgSaAlmLBQAACu5JREFUJty4lJOx+rVhy2nXVRZwgdpBqhivjUAqp3aFOuHhd9UxYqQymWICrJQri1Uk11FQtGzDuLF8Y9Xu6f27A0ZeLCCmgiPcBRfDfVjCGO7ZQbjj3YWigpJXJBTzllxcg7Ekxy2ZzXTxo48+qr322sudWu05/bWJzT7mmGPcnz/+8Y/7kp+Vuzf9+dJLL+m2225zGb09+eZ+JFBDyPR+ySWXKJ1Ouxjj9vb2uh9jVhNunmX77bd3xJUa7H/+85/rbmu5A1uJfS2yTM1yn9V+woQJwrOgVGpdI9HD2smGgCFgCBgChoAhYAgYAoaAIVAXAk0Tbogj1toLX+jWNXtspK9tva3eff8DBWExuzjy2GP/1GH3vqGO4fOrPQv5ipSPihnKyYlGHjVIt6u7HS8L1lslDAt5ISzGcOfyBc3ozmvC0Fe0dIIs5f1FuCn5hXt4I3LmmWfq8ssvd6fUY5Gude333ntP1MZGqGX9hz/8oWqcOK71t956qzuedmy44Ya1buG+nzp1qrNOU+6Msl1YwJE4yWu0zNasJNy4ZZMgDbwQktmR1C6JtBL7WmT5o48+EpncCesg5h0r96hRo2Zqfq1rJHlWO9cQMAQMAUPAEDAEDAFDwBAwBOpDIBHhpiTRhW8P1qqpKTrqGxtrrbXXVVd3D3RaYRDo6Sce18R7X1fH8JFqby8m0MqFuJMXa3O7bGmKXOw2Gcv54WOczyNXH6x4fB7Snc9rendBhwx7RUuNXapi4q5Kjz1+/Hj19PRUtfw2GsP99NNPa6eddnK3jMcj+zaQeAzLJ+W+INfU544LhPi4445zHyWNIfbX3XPPPV0dcQQFALW+yyUgu+aaa3T66ae74yBrxJpTqgt59dVXXV1xBPdllBSlAuGmNFW8hvi7776rTTfd1B263HLLOStsaYI1XNNPO+00d8xRRx3V5/Y+qwg3xJgM9K+88oprw5gxY1wWduqmJ5VWYE8b6iHLlLajlFmlsVfPNZI+r51vCBgChoAhYAgYAoaAIWAIGALVEWiacH/yySeCcP65ZwmdvNHiOuP00/Tba693cdkucVoYaNKkZ3X4vW+oc9h8ynZ0OndyDNrQ7FwYKgoCtbls5f9fBqwY0C1l08XPewpSoVBQWIg0oyeng4bMOTHcU6ZM0frrr+/aO2LECJdsbZ111tGSSy7pLI9xl20IP5bU1VZbzbnbQzxPPvlkYa2k9BZ/44qdVOgTCDIeCAgEmDhtsotDKh9//HE99NBDoiQXwj3J0A2x9oJHARZUn5zr6KOPdsR49OjRriTVeeed1+eCTeKxPfbYo+/cs88+W5dddpn7mxhvLMlrrbWWy/ZOSTBivrGMgw8kf+jQoe7YVhJuymjF49FRtLz//vuuzBn3ZDwhKAOuuuqqvuz0cwL2tKEesgyelLFj/JAHgBwBuMZ7iV+D8YAnQjUhAZ6viZ4UBzvfEDAEDAFDwBAwBAwBQ8AQMASKCDRNuD/88EM9+eSTGrHc6nr9sQf7knURyD18+FB98vGnmjz5Je1187PKDB2h9o42FSj35YzYgbNcB4qU7bVkQ6wh2MRs8zuVKSgVpdRTCJUrSGGhoJ58XieO/kRjx46dIyzctDhu1fSDypeY6u7udjHV4OQFcgSh9UKcM1bobbfdtmVjElf//fbbTygEqkk2m9U555xTNrkaCd6oR+5LmnEdyLknq/yNcgEra7wkFcoEXNWrxURD7Ij19soKrtVKwl0PkFjgzz//fKccaaW0Avt6CDdtjpc1o/wcygwv9ZYW88fff//9ddVabyVWdi1DwBAwBAwBQ8AQMAQMAUNgbkegacKNpZOf5VdYXuuus76mTJ2iUaMW0IUXnq+lxi2jnXfaWQ899A9996+vqn34fEp3dgijdZdDNFJboZgVLcpECiJczIvlwUitVsxaHjlX6FwUKVcIFRQi9XQXdMSo17T00ks3TLix8GJZJZO2d5cu7dyVVlrJEUqSUJGMCqE8FlZpBEsvRDYuuChfccUVLhbaJxLDfZySXwjXu/TSS51FmdhhL1hXydSNS3ncMtmqAYfLNDWmcWmPZ0X318fiCTGOk97Se7/wwgtOGfDUU085HBD6BEs35bmw6KNAKBVIOkT8pptumimzOYQdqyzlrEqfmbZCIHFv95nOy2Gx4447ilCGuCu7P85/V+48PBDI6k0JNpKlrbfeemXb3gr8k2J/zz339GVvrxZqQMK3r3/96yLbPBKPm49fo55nwsNigQUWqOdQO8YQMAQMAUPAEDAEDAFDwBAwBOpEoGnCPXnyZOULBd1511067pjjNG6ZcY5g/fHxl3T74y/plG9vrjVXGKcdr/23OoYWCTe2a6y71OAOCi5lGgW8HcN2lm1n3IZtky0trwL/DqU854SRuntyOn35bke4cUmekwTyQxIryC3krpyQ2R03bcj2Yost9oXYaq4RtyA38nwQXyzWpYJCYNKkSc6lGrJM2/AQWGqppeq+PH1Gu3FjhmwTk16P8CzEdZNkbdiwYVp00UX74sTrOX9WHjOnYj8rMbB7GQKGgCFgCBgChoAhYAgYAoZAaxFomnC/+NKLGjpkqPbd5zua9MIk3XXPPTrzzif1Ys8gDZ1/YX322lNadaGhemnE8uocPFT5bBYarWyYKsZwF6K+DOWUA4Nb54NAKYXKwL1dbDd1xigZFroa3N2ffKSfrRo5N+DSZFythWX2XA0LerPlqXCRJo7XpDkEDPvmcLOzDAFDwBAwBAwBQ8AQMAQMAUOgMgJNE+6XX35ZCyy4oNZcYw2ddvrpejFYQHdOSWvo/EsoyGSUz3ep+5MPNXjBxRUQt5xKS0FBbVHRBZmY7SCCdBdrd6ddQrXejGpEeaciRf/X3v2kOBFEcQB+LRFxMgwiLswiNxidbbZzFy8w3mA8huDCc4zHCK6dbAMuxKyEtLxKJzoyCyk6Q3ryNYRA6D+Vr3rzo6pe5b5g3bruX99/xPnqa7y7PC+jw/87yjqkzs+q3bnPdc2RU6W3W3zVXH/s17A/9jfA/ydAgAABAgQIECDQv0B14F4sFjEen8b1h+u4en8VHz99jhevJjF6OoonTbeuN8N0FkdrNlPGs4L53anjbVlHm7+13ZrtnJK9OT+nmmfwbmL8bBSvX57FZDIpo9s5LfoxVlSez+dlXXzNkYXLZrNZzaWuiQj2XgMCBAgQIECAAAECBPoWqA7cy+Uybm+/xZu3F/Hl5qas0T15flKWX/97ZIguwTpHsLvCW7vgXXL1JmSXoN2dsz0vf8tiW7mlVT4jP1nZ+75iXX3juB8BAgQIECBAgAABAgQIEKgVqA7cubdxVq/OkcGs4j2dTktBrG1g3o1Ud2H6vhCeYXoXwLug/Xco34bwPCdDdxYFy2cI27Xd7ToCBAgQIECAAAECBAgQeCiB6sD9UA30HAIECBAgQIAAAQIECBAgMEQBgXuIvabNBAgQIECAAAECBAgQIHDwAgL3wXeRBhIgQIAAAQIECBAgQIDAEAUE7iH2mjYTIECAAAECBAgQIECAwMELND9Xq03pcAcBAgQIECBAgAABAgQIECDQm4DA3RulGxEgQIAAAQIECBAgQIAAgT8CAre3gQABAgQIECBAgAABAgQI7EFA4N4DqlsSIECAAAECBAgQIECAAAGB2ztAgAABAgQIECBAgAABAgT2INBb4F6v13ea1zRNtG0b+Z0fBwECBAgQIECAAAECBAgQOCaB32kC1o1La609AAAAAElFTkSuQmCC", + "created": 1648745237223 + }, + "a39443537553a91afe6fdab1761775c30499581821e6b7c09836e0f5357eb9cde4f4f95904222e161a4e277879f13708": { + "mimeType": "image/png", + "id": "a39443537553a91afe6fdab1761775c30499581821e6b7c09836e0f5357eb9cde4f4f95904222e161a4e277879f13708", + "dataURL": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABMoAAASQCAYAAAAN5qOoAAAAAXNSR0IArs4c6QAAIABJREFUeF7svQmUZGV5///U0nv3dM/GNsDMALLKMoCAIKKoiBJFMSpJJJsn8RzRaOISo/5PzPkZk2hyThKNGjBiMBg1iCgiIiqgyCrrsG+yw7DMdPf03lV1/+fzvPetul3TM9Pd03t/r6lUd/Wtu3zuW6X3M9/neXNJkiSmRQREQAREQAREQAREQAREQAREQAREQAREQASWOIGcRNkSHwE6fREQAREQAREQAREQAREQAREQAREQAREQAScgUaaBIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQCChRppEgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhJlGgMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAgoUaaRIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQCChRppEgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhJlGgMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAgoUaaRIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQCChRppEgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAhJlGgMiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiEAgoUaaRIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAISZRoDIiACIiACIiACIiACIiACIiACIiACIiACIhAIKFGmkSACIiACIiACIiACIiACIiACIiACIiACIiACEmUaAyIgAiIgAiIgAiIgAiIgAiIgAiIg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vGnZJZspu0xD6uWsmDMrsX0z2y2XWE+lZEc3lO0961vt5P27bL89OqyxodFyhXDzvxT7aSG3fv7zn9vXv/51e+aZZ+zAAw+0vfbayx+ILh5r167dZpQikBBk9957r913332eSHv44Ydt48aN9trXvtbOPvtsO/HEE2316tUzMMJndpN8bhCAnA9JuTg2kEgIoYMOOshe9rKXuTBbDAvni+gkWfjss89WJSHfIVGSIc3ggCCiHJdnzh8pymO33XbzUtuFLg+5xvHaI5HjtScpiRDkuvMZQZZpEQEREAEREAEREAEREAEREIGZICBRNgNUoyijb1RWlP3k6bz91wtpyovkValiNhqTYWl4C6tUTXOloixNiGWb77so87RYGhXDUlGfySPTR4xUGA7MU2dpai3ItlSL5c1Gi+YN/uMbSbYx8ybPLPkk7+8f9RLQxBos77JutBJFX+K7jaKNclHW9/5pubyNMC2nmQ0Oo+7K9rcva7Y3H9RuL1vTbs3NLVZsaKreEC81WYYcu/TSS+3cc8+tjkQEF6WTp556qp100kn+c/2COHjooYc8jcbjrrvusuuuu85Xo2zzS1/6kr9/jz32mIERPr2bjMkpJAmPzZs32/3332833XSTPyNISEpt2rTJBeJZZ53lXDjPhbjESRji+SKEuJa33Xab3XrrrS49b7/99u2e2r777utyjLThhg0bXByRPkSWwSTyWghsxrv2Dz74oF97JHA8l+eff96TlVz7V73qVV6SrEUEREAEREAEREAEREAEREAEZoKARNkMUB0jyvp7rZtE2bMjdsVTOfuvZxBhyLGK2UjZrMQjtVYIMhJayLL0JU+Ueff92Hw/bfZfFWXpCbgki8mwVJZFkVYtu8wFCVebYDG8h+iXC7a0RJOd+/Yzx5FJtfkefeZNn1WgJut4PU2UVVNwSL74QAwWE/vUy5rs9ANb7MA1bdbS0moNjbWysaUoyn7wgx/Y+9///upIPOWUU2y//faz17zmNZ4K254oI3GFJPvNb35j99xzj1199dW+jX322cf+6Z/+yZNlC0GUUW5HfzVkCAm73/72t56uQpggjejbxrj45S9/6ZLkL/7iL+x1r3vdgpUlnC8SPZbOIslIB3LeyCGet2zZssNvJqTY/vvv7wkrpBljhOu+9957++8LRSTxXcm1R4Jy7bne8drDIXvtTzjh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fju6qdfWtyfW0dll7cu65rUoC3xqijHbTH1XvyaWQo8y2FFiiPBAFl177bX2d3/3d46O5BRLa2uryyJET3t7u8shUlg0vieBRC8r0lMLVZQxsyNN6r/3ve95ioreYchBJCDJrw0bNthhhx1mr3jFK1ycwWBHC8kyuNDXjUTeF77wBV8dwQRjls9//vN25pln+mtztXDtkWDx2iMH/+Ef/sHot5a99lx3rn+89si17LVnVlAWibK5upLarwiIgAiIgAiIgAiIgAgsHQJzKsoQStxIkRyY7WUm910vyrb09NpvBxrtjtJyu99arKuxYJ0NeSvQpN8b59OjjOcwo2RMbVUTYlUTllKqmwwvxxsyUqva9h9JlabTKNdEoOVzSVWAeZosJsHibtNm/p5gS0sq2Wt1l5myy9Dgf+wxhWRa2C/JOC/BtFCC2TNStsGRkh2R77fDG7ptXWvFlnXNf1HGTTuJIBrKM14phUN0TIfgXSqijDQRsuPuu++26667zi644IJtPvLvfe97PVFFqSASiHWRPvxMEglWC02URcmK6KNx/9e+9jW76qqr7IADDvDzomfZySefbGeffbYde+yxtn79em/gH1NkO5NlJPLY7qWXXmq/+MUvfHbQuLz//e+3d77znV5+mS3hnM3vWs6f84zXnmP9r//6r20O4U/+5E+cAz3ZXnzxxeq1Z9wgSEmdSZTN5pXTvkRABERABERABERABERg6RKYM1HGDRSpAm7s6M9DQ+rZXNg34oNeOIiP6VzGNPPf2m0uygab7Y7ycnsgabWOYs4fNOnPW87yaX+yXD407Ud8VVuQMWtkWuLILXD19SRINZrp5xFTfgJBkcV1EFWUQvrf2BcllbnEZ9oMZZw5n5WSv/PsS+xTlrq3qiBLm/pnOXnz/sz72HtIoYXX2X8plaHlcsW6Rys2UirbyxFlxW7bt61snZ1dXnqJeJqPs15yLUm2kOChNJBxS/qJpvIc864uS0GUwZCySfqQUXKI/LrsssuqpZb05KJckFLB0047zZNGrI/4ueGGG1yc8B6kyUITZQhWElWkxyiRPO+883x2R86ZxBzX/13vepchikiWdXV1TWpIIZDi7JmUsGZnDP2zP/sz54koI60VZ5Gc1A52cWU+L/XX/oorrvDPFEvsx8a1p/cYZaJINa49vJBs9CejzJRFibJdvCB6uwiI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Nt1P5dWYQ88KtGx55RiTNabx2bjii22OSZQhvYIrC0tdCzR/rdqrjPgbqZHai0iwKMuQY6RJ4jM/S5LN4ADUpkVABERABERABERABERABERABERABCZFQKJsUrgmv3K2DDOWP2Wf499jmir+jT1lG11nU2auoTIps/i3+BxLnNxrZdJpkzn67LYm8r54PPWpsJgqi8Isll7F17PHOpH9aB0REAEREAEREAEREAEREAEREAEREAERmCkCEmUzRTaz3azIimIs+5wVXzGFFl9DJI0nu6KQyv5tLkVZvbzLYo1SLHtOEmSzMPC0CxEQAREQAREQAREQAREQAREQAREQgUkRkCibFK6pr1wvu3aU9BrToyxNjo33Gkezve2MJ9KmfvQ7fmeUeTvqMTZe0mymjkfbFQEREAEREAEREAEREAEREAEREAEREIGpEJAomwo1vUcEREAEREAEREAEREAEREAEREAEREAERGDREZAoW3SXVCckAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwFQISZVOhpveIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAgsOgISZYvukuqEREAEREAEREAEREAEREAEREAEREAEREAEpkJAomwq1PQeERABERABERABERABERABERABERABERCBRUdAomzRXVKdkAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwFQISJRNhZreIwIiIAIiIAIiIAIiIAIiIAIiIAIiIAIisOgIzJooS0CXJGa5XHjWIgIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIALziMAMi7LEnViUZEmShJ9TaVbzZeFV6bN5NDJ0KCIgAiIgAiIgAiIgAiIgAiIgAiIgAiKwxAjMmChDimHJkF/8XOHn9IESc0nmq4QfwrNk2RIbfzpdERABERABERABERABERABERABERABEZg3BKZVlFVlV0aKZSWZizCXZ2nMzJ+qkTMlyubNsNCBiIAIiIAIiIAIiIAIiIAIiIAIiIAIiMDSIzBtoiymxVyMVRJLKpWQIsukxSLeKNSWHm6dsQiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIwHwlsMuiLCvIgiRLBRmyrE6U5Wjkr0UEREAEREAEREAEREAEREAEREAEREAEREAE5iGBXRZlnh5LKkGQRUmWdvDPtO6fh6euQxIBERABERABERAB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WXyyCF111VXjNWLEiDdcRs6TPHRL/crfBcqol1IMway1E+aADpIvbgUqKqANK6ZPn57++vDD6Z577knPPvtsmjtnTiJ8H/D75vXXT9tuu21af/31416KnWGXcBgm18UlhpPs8cceS/fee2965JFH0uxZs9K8bng9YdVVo12bbrppGjduXNzz+Q67FSUYkMPoGzo+9eST6d777gvtgfzAMvowdqWV0rbbbpM222zzeIblztwBabAvagWsgBWwAlbAClgBK2AFWlgBg7IWHpzB0LT+gLJasEyhSPkxtT7nv2nXSsDWnDlzehacuF9Y2OP+kvtMY1TL+aW8QZyjxP4BFJZbLhw1LHJ55aCsJ78TF3BS/8FwK3REH5nD3B8vvvhiuuuuu9Jvb7wx/f3vf0+vLViQZs+ZE/fTju98Z9pzzz3TJptskkaNGhUur6UByrjXZs+enR5+6KF0yy23pD/fcUeaO29eXP+ll19K6633prT/fvult223XcAk7v92AWX0jX4A/37/u9+lW2+9NSAgTr6XX345rTZxYtp///3TDjvsEI45/WNAR0w6d8IKWAErYAWsgBWwAlbACjRZAYOyJgvq6upToL+grAyW5S0oc5P15TBTm1gkK+cPC3w+K3RSdQiC5fnF8h3/5LABHvC98jXloGzYsGEBzATKeI86hpDxybtf1jejfPRAKiBQxk6xf/zjH9MvLrww3XLzzeFoeuyxxwKUfeSjH01HHHFE2mqrrdIKK6wQ99XSBGW43K644or0iwsuSMstv3xc//HHHw832Sc/+cm08847p4mTJgUoK9thdyD1Lbs2YaXLDxsW/XjwgQfT1b++Op1/7rnh4AOIPfrooxE2/u+f+1x61+67pzXXWiu+l7O11frj9lgBK2AFrIAVsAJWwApYgYFWwKBsoEdgkF+/HlC28sorx255C7pzCvUFxPR7WR6zIiwrOtDy/GIsKFmE6hV5f7pDxYpQLN+5UjnH8l0tFZ752sKFUQdOMvIHAcuUpyx3ltGHVs9Tlrcv15FdC5bmvoZqB+BALrxaUHSQ33q9zqv+QCvmLnP6ueeeS7///e/TWWeeGVBqxdGj04yZM0Py97///ekDRx+dttlmm6UKyrjHyJ129113pYsvvjideuqpadmhQ3ueJ+uss0468UtfSrvuumvk82ofULZMWn5YF/C7//770xWX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lqURaSoef9NlAd9++22OKOvfv78p21gIxjHKknUQASRyhMUikxsTXeyGKcWZiLH4BsyWusDktlIw5SZRSEguSwAn6turVy9T7PFe7Yk6xfXkZ+pK/bEPCB7i3WFTffr0caKsQIPrUg3sBbsRluDIxix2ia52u/HyOwKOgCNQDQhMnTo1TJw40dZHkGadO3e2w0TGYy5gYr3jhxfV0JJexkpBgDXirFmzbJ0zZ84c61daL/bu3dv6li41q5QyezkcgZaOgBNlLb2FK7x+WYkyFmByvYyJsoaQZcnvJokyyDA25dOmTTMFyzrrrGMLQRRAECFyuVQdROKJaJNyin+LFIsJM8gSXpBExVwxK7wZMxcPPD///PMwadIkW2BzWQNx4Kj/gAEDwve//30jI6sxSS3G4oZ64bKL7eA+TF2JtwfZw9+xg6222ioMGjTI7MpPCfO3OH0N7NiYffbZZ2Y/YAqOkIxbbrll2GijjSyWoSdHwBFwBByBxkWATfyECRPCa6+9Ft555x0bn4nfusUWW4Tvfe979jMHm5BlnhwBRyAbAqwbp0yZEiZPnhyI0cy/Weew59h4443DZpttZgesnhwBR6DpEHCirOmw9ielIFAOoqzcZJmILm7f5HRHRNl6661nCiAWf7rtMibJYuIsLcA/hFgywH/shhkry1qq+yUEx7vvvhveeustIz0gk3iB3a677hp23333sMEGG1RlX4EYhRCjXl988YURO7zYVLCRwJbkyottHX744WHo0KG2sUClKIl9VVa+EQsNriwcP/jgg/Dhhx8aycoLuwG7fffdN2y99dYtQonYiDB61o6AI+AINAgBxmLmM+Y3CLIXXnghjBkzxjbzhKVg7h44cKAdePEzKjNPjoAjkA0B9au3337b1o6QZayZUc7vueeeYeedd67ag+RsCPinHIHKQ8CJssprk1ZVoixEWffu3W1yiF0vs8YgKxTEPxnAX8CLKMNNLkmUrb322kaUxeqxuA7xzyLTUMRAjEhZFqvK4gD/rcEFk8n/1VdfDaNGjTLig9OzV155xaD/3e9+Fw499FA7OavGhK1AAL788stGBkLqcOqO3dK2IlL5DOmcc84JBx54oNWX2BOklupy25D2pB9iK6gX3nzzzfD++++H+++/37KEXP31r38dhgwZEvr27duQx/h3HQFHwBFwBAoggPobRS/j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ZnQMvHfqe0QvSTRRFl2cgPRY+JIka4eTWKckAiIgAiIgAiIgAiIgAiIgAiLQ5ghIlLW5S9ZxBhxkVKbvbY1EtEl/VJ5xHmrg39aupsYrAiIgAiIgAiIgAiIgAiIgAiLQHglIlLXHq6pzEgEREAEREAEREAEREAEREAEREAEREAERyJmARFnOyPQCERABERABERABERABERABERABERABERCB9khAoqw9XlWdkwiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIQM4EJMpyRqYXiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAItEcCEmXt8arqnERABERABERABERABERABERABERABERABHImIFGWMzK9QAREQAREQAREQAREQAREQAREQAREQAREoD0SkChrj1dV5yQCIiACIiACIiACIiACIiACIiACIiACIpAzgVYTZfX19TkPTi8QAREQAREQAREQAREQAREQAREQAREQAREQgdYi0MKirN7wY0GS8d11WUKaferO2E8irbUuut5HBERABERABERABERABERABERABERABETgcAItJspciiXkV13iz+FnUXHm5swFWoMoky7TNBUBERABERABERABERABERABERABERABETgSBPIqylyA+f/XW31dvbkg4/+CKHMTFkmPJfZNxMwkyY7EDNB7ioAIiIAIiIAIiIAIiIAIiIAIiIAIiIAIOIG8ibKkDEsIsrq6uoggOzQnpjJLzT4REAEREAEREAEREAEREAEREAEREAEREIFCI9BsURYtp+TPCLK6umiK7NMEWVFRUaGdv8YjAiIgAiIgAiIgAiIgAiIgAiIgAiIgAiIgAk6g2aLMpVhdndXW1zYIMpJkHDmUVQq0CIiACIiACIiACIiACIiACIiACIiACIiACLQBAk0WZQ19+uutrrbOauuQZHXek4wv5cbawJXXEEVABERABERABERABERABERABERABERABA4h0CRR1lBuSV/+OqutpdSytqFxf2jUX1QkWaaJJgIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0KYINEmUeaN+yi29H1lDkkwN+tvUdddgRUAEREAEREAEREAEREAEREAEREAEREAEUgjkJMqCDEOO1dZ+Wm4ZkmRq1q/5JQIiIAIiIAIiIAIiIAIiIAIiIAIiIAIi0FYJ5CzKwsqWNQlRpiRZW730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7MTx4+34sWNd9HH/cL8GYdY6lPUuIiACIiACIiACIiACItA8AhJlzeOnV+eJQGOJssZ6lMWRXwwx12RZeE1IjJGwImGBfKE8asSIES7K2EK6KdrAOjVZhoRBvpDK4kG5UJOZoak4UofSsCefeMKef+45T7pUdOni4ua0iRPts5/9rE2YMMFlUj5EGUwQkQsWLLBZs2bZx0uWuFR67513bNuOHXbHHXfYTTfdZKecemqjoowU3Kuvvmp/fOwx27F9u4+Z8bEgBHOABFdG+ZTowRjkFsmxrt26+XXu1r27CzJ/6C8rs8FDhniqbvDgwV6CGpJC0QUdmBsci3Nj/nB+yIePPvrIZs2cab/73e98/lx+2WU29fzzbfz48V7S27tPHz/mIf2g8nSf6TBHlkBSlK1aZdNeeMHuvvvu5IDOOfdcl0tIssmTJ9uoUaNaXJQFSV11sMr27N1jmzdtshWffGILFy605cuWuTDnPiT9yM+4f9JtA486yhNk3DPDhg9PfkaOO+EE/x8V+Jzw8vPIogBH9kro3UVABERABERABERABEQgMwGJMs2OgiCQTZSFsp1cxVj05HKVZSEthghLFWVIkiDKouV30URZEB2pDf7Dw2khyrIgykh3IXN+/etf2+OPP+7ljjwM8xB966232vU33GCTJk3yxAjpruYkn0JvI0TknDlzXHTNnz/f1q9bZx988IFfQiTZl7/yFTvttNNcIqUmykh2wXv58uU2bdo0++63v207d+/2EllKMPn31NUmM038MNe47nyRBoNHdLv22mvtsssvd7mFOI2mZqJzNMhRStZI6TC++R9+aG+++aY999xzfkikyGWXXeZpuREjR/rxkHISZQXx0ZTXQSBU+UKY/uXFF+2uu+7y43MfnXrqqTb06KN9Ppx++ukuYlu69DJ87iLENm3caMuWLfMk6bPPPmvvv/++3zPIYMbBPcSiAyFByQqtIXHL/cgX9xo/417m8+GWW26xiaef7uWYlGXyOcLW0qWkeb1oOpgIiIAIiIAIiIAIiECHIyBR1uEueWGecDZRFhUxrSnLECWhv1QovUxNlAWiQbCkJsuiDf7Z1xNLJSX+EFposiwqyihhfPCXv7Q//elPfoqkykiX8PB744032qTJk/MmykpLSm3T5k0uyl5++WUXZOvWrvUUC9sNN9xgX/3qVz3NlkmUsR8r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qWkUbYlAVJT5KpDV1da5vNybvZeVlRkN4KONr1PPLZdkWazeZGlK0LK9LuMY6I1UVNTQvJqm2qEpeV2dnycrRvJvFRUV/qXVH9vSzNVYRUAEREAEREAEREAEREAEREAE2hOBrKKMk4026g5N/bOVVrUnSDqXlicQ5hNN7ffv3+8liYgxJBlf5WVlniyLrhYYJykWRp5Ncvl+TZBjqcfPJuzCvVRTW2M11TVW7SvK1vh5de7c2b8kylp+vukdREAEREAEREAEREAEREAEREAERCAdgdiijAf86OqXwikC+SRAM3j+H1FGwoqkFckrmowjjjxRVlx8yFumlV8J4eU7RlfN8xXvGvqCJRa9a0h4pWz+k5SfJ/dKJMPCvx9yrEyvix4rsfIerwvCrGGYRS4Fy8vLXQpKlOVzZulYIiACIiACIiACIiACIiACIiACIhCfQCxR1uAAEqKsptbLMOtdOWgTgfwRQBghY5FkJMqQZtEv/s2b+vv8S2yZpFZzhpWvY6ZIsrBgQXFJg/jji5Rc+B5KTCXKmnPx9FoREAEREAEREAEREAEREAEREAERaDqBnERZQ5+yOqutq7X6OlSZZFnT0euVqQRIeoX+XUGWIcwOHDjg4oyvsKhEctXExEFCSqwgqRZ5Xs6TYyEdV1Ze7uWkIUUWlWQSZQV5FTUoERABERABERABERABERABERCBDkAgtiiDBaKsLiHKahMN/vm5+pV1gJnSSqfoibH6+mSSLAgzvpMuSxVlrTSs5r9NkVlxUXFSlB2SIutUap1KO/m/8aVNBERABERABERABERABERABERABETgyBDISZQlm/onVsBEnGkTgXwTCLLMe+Il5Bh/DpIszLvGGufne0zNPV5YhCDIMHqShS+kGcknUm8AACAASURBVD+PLlTQ3PfT60VABERABERABERABERABERABERABHInkLMoi66ASaqsLcmK3PHoFUeKQJBlnmJMzLPw3eec/3/bKf0NqctQfpkqzpQkO1IzTe8rAiIgAiIgAiIgAiIgAiIgAiIgAp8SyEmU8bIgyoLA8O+JcjmVYGpq5ZNAVMJm+nM+36+lj5V6fyTlWWLFz5Z+fx1fBERABERABERABERABERABERABESgcQI5i7LGZJlgi0C+CWSSS/l+n9Y6XroEplKZrUVf7yMCIiACIiACIiACIiACIiACIiACLSTKOGxdXX1Dg/+62obviWQZ/6Z0maZeSxBgXiGWss2v6D5x9o81Vko+ixrW1wzHTHfsjD+zojZVLhqLiXYSAREQAREQAREQAREQAREQAREQgXZEoEmJsnD+eINDRFlClrUjPjoVERABERABERABERABERABERABERABERCBDkKgWaIMRtGeZeHPDb3W65ON/kNpWbYUUAdhrtMUAREQAREQAREQAREQAREQAREQAREQAREoQALNFmVBlh26SmGDJKurb1gVk/8romG5NhEQAREQAREQAREQAREQAREQAREQAREQAREoUAJ5EWVBlpnLsQZJVk//svBnq/fTP6RpeSJ1lo0L6bTURQEjraIafXnipYfsE14b/bfGjtfoe6V7g3Qj8nNNtrfKdsoJVoefd8M/NPw87ub8Ut473Tkd9rPU90n8PXW/JM9P23cdMsbDhtsYi5jnFuf6R/eJs38snpHxpT3vxEGy8fXDJK7LYdcyGx+/mJ+ONu31CNOk6PDp0lQWydclxl1flGYaxrx+sVhHdorDk/si0T7usMOnuwfCTtmO3dhYG5sDuZxjY+Nr+Nw89Nyy3qtZ2OUytkM/PA//7GnyJY/5wkY/m3P7KPSbobHPYX+vRu6vWEMOO2W6vzNcm6bel8nDNeV3TDp+sU6y4V0P+UzI4XdSnHsquk8UZbZ7JXlfR35Xphtaumudy+/W1P9+SP0de8j4I/dv6mdGcrqk+fyKcymS+8TZOfX3U+rv9ByOke5zIfy3mrNIOVa263bYXIreR3mYW5n+eyDbuLJ9/h1y/6X8Tjzknm7C/RmZwocOo5HfdalzOOPvjhjXOjpXm7Qwd6b/hox87iTfI3Gyyd/hjfBq7L+f0v4+D++X5jM57eduDDb5/B2a67GyXZdcf5c4ljCn0px7rv/9FOd8Uj8/M/63W66/49P8fs31v5+y8mNupvvv35T3Tv2dkHUcjT3eHQIsPpTGOGea5hmnf+SezMoozSSIdVtF2UZ+BzT2323p/hu50TmYYSCpv4MO+Z2R8vkU61yy3AhNYZj13sp0/ybma67vedhHeOJzItPnZrrrlO09m/LvzbqXovdp9HdDI/+dkTdR1jBZG34TNXxLCLOoPPN0WcMOvm/iF1fD6xKvzToTtIMIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAI5J9AXkVZ6vBCOWZD+WWDSGsQZEGYBbn2aT+z/J+ijigCIiACIiACIiACIiACIiACIiACIiACIiAC2Qm0qCjj7ZMps4a/hBBZiJ35CEMCLftwtYcIiIAIiIAIiIAIiIAIiIAIiIAIiIAIiIAItAyBFhdlLTNsHVUEREAEREAEREAEREAEREAEREAEREAEREAE8ktAoiy/PHU0ERABERABERABERABERABERABERABERCBNkpAoqyNXjgNWwREQAREQAREQAREQAREQAREQAREQAREIL8EJMryy1NHEwEREAEREAEREAEREAEREAEREAEREAERaKMEJMra6IXTsEVABERABERABERABERABERABERABERABPJLQKIsvzx1NBEQAREQAREQAREQAREQAREQAREQAREQgTZKQKKsjV44DVsEREAEREAEREAEREAEREAEREAEREAERCC/BCTK8stTRxMBERABERABERABERABERABERABERABEWijBCTK2uiF07BFQAREQAREQAREQAREQAREQAREQAREQATyS0CiLL88dTQREAEREAEREAEREAEREAEREAEREAEREIE2SkCirI1eOA1bBERABERABERABERABERABERABERABEQgvwQkyvLLU0cTAREQAREQAREQAREQAREQAREQAREQARFoowQkytrohdOwm0+gvr7eDxK+pztiUVHRIT9O/XvzR6EjiIAIiIAIiIAIiIAIiIAIiIAIiIAIFAoBibJCuRIaxyEEkFfpvsJOjcmtVJRhXyQXf+Z7TU2N7dy103bs2GFVVdVWUlxiaLO62lqrr69LyLMi69y5s1V27WKVlV2srKzcOpV2stLSUispKbHi4mJdNREQAREQAREQAREQAREQAREQAREQgXZEQKKsHV3M9nQqdXV1Fr5qXV7V+98bS4Glk2fpfobg2rdvny1fsdzmzf/QNm/eYl06V5rV1duBg/utquqg1dTUWXFRsQ0ZOtiGjxxmgwcPsh5du1uXikrrUtHFOpU1CDMlzNrTrNO5iIAIiIAIiIAIiIAIiIAIiIAIdHQCEmUdfQYU2PmHFBlSDEEWFWaNibKoEMuWNistKbXde3bbB/M/sGl//YvNfP9969+tn9XXFtn+A/vtYNU+27B5h+3aXW233HCJnXXOGXbsqFFW2aXSyjqVW2VlpSfNysrKPFmGLJMwK7CJpOGI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ihUrPJnJteO+GTFihKejBg4c6H/n/k3duGc4Btd3zZo1LpDWr1/vCdJsMiZ6H4d7meQm7xNkDjKVHoIsuIH05vPjSG4IwaVLl9q8efPso48+8j+///77fn/dcMMNdtttt/lnDAK+tTdSZNOmTbNnnnnG5SX/YwFjHDNmjF199dV+zyHzSL4hxrWJgAiIgAiIgAiIgAiIQEcgIFHWEa5yGzrHTKIs12b+0VOOlniF5tk82K9Yvtw+nD/fNmzcZEWlnayiS6X17T/AKrt0sY0bN9jSRQtt8MAB/hDLgz8P9ogykk1IIh4cOXZIPQVZFi3BRJoFwRQaY7cF0cPD/Zw5c+y5556zd99918tIERGIMUrFpkyZ4r3b8lkuhhQj0cL7IhNI3tBDjve/99577frrr7dTTjnFhYq2I0OAuY0ko4SQazN79mx79dVXPY3EvLjooovs1FNPdVmG+EFUpW7cL9xLyDHSTO+884699dZbvm/YP1N/wfBz5Fc0PcbrEHPMUwQZpdHIMu5R5myQdvy5tYU1nzWc58yZM+29995zZnPnznUszOdvfetbds4557iMau0NYffrX//afvSjHx321nfeeaede+65fl0HDx7s/wOBNhEQAREQAREQAREQARHoCAQkyjrCVW5D59iYKOM0cln5Mp0s42cIKxprk4ZZMH++7di9xyp79rIevftY/wGDvGRr7epVNu/9WdaraxebNGmyP3TTywdRxoM4yZmQsGDMqZIsNPcPgg9BhyALK2IWerIMUTZr1ix79NFH7bHHHvPzhQvniji88sor/3/23gNMruJK368Z5YyEJEQWQgSDBAKLnEQONllksImLWWQbvNi/Xdvr3WfXeNf248V/bGwDJpgMDoDJQZgschICkZGEhFBCEQml+T/vmTk9NVe3u2/3dI96NN+1m55wQ9VX596eevWdU2H06NH2s0ptpKK98cYbBk0ALziWnn32WXOVfetb3zLnDdcs5jqqVHt0njUVIJ5Z0AInGPX9AC24kYBm1LQ67rjjbIxwIeE8THMhEUM4BnGi4Wgizu66664c2PJ7JunM5J6JQZlDb+AXL+4tL0SP25MXAI0YJVUauM0iHECztnSZAcoAwABfABl9fvzxx03c/fffP3z3u9+1NMe1AaIYv+uuuy5cccUVqaBsv/32C9tvv71AmR4GUkAKSAEpIAWk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", + "created": 1648745429881 + } + } +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/04-Ordering_key_columns_efficiently.excalidraw b/docs/ja/guides/best-practices/images/04-Ordering_key_columns_efficiently.excalidraw new file mode 100644 index 00000000000..0423333e644 --- /dev/null +++ b/docs/ja/guides/best-practices/images/04-Ordering_key_columns_efficiently.excalidraw @@ -0,0 +1,2499 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 2838, + "versionNonce": 52205387, + "isDeleted": false, + "id": "qtX6x84ifEWpmMlvjuwhm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 385.26381756295194, + "y": -4873.5835302275245, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 299.2631095638441, + "seed": 1499470394, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + } + ], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2575, + "versionNonce": 1007916773, + "isDeleted": false, + "id": "Lrjtc8i7RDtRgEMzCyc2O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 14.532151266623146, + "y": -4876.301753193795, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 301.1095767910746, + "seed": 2146516582, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2687, + "versionNonce": 1908504043, + "isDeleted": false, + "id": "YaUuLC54Jft-Q1TmGCg0n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 6.0590924196161495, + "y": -4832.473690197763, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 563397370, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + } + ], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1828, + "versionNonce": 497644101, + "isDeleted": false, + "id": "ZG7xIJmYU_01zBa6E4IOM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 128.4332335151239, + "y": -4830.028272260108, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 21528998, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 2692, + "versionNonce": 26312843, + "isDeleted": false, + "id": "uP1orLYT3sg-lBzvmtKp1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5.863796025501756, + "y": -4799.272459137157, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 1991660474, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3491, + "versionNonce": 984408485, + "isDeleted": false, + "id": "KJNPSV2FX9EbB9AUWVVXe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 3.647522174107735, + "y": -4768.285747288017, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 894786790, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1959, + "versionNonce": 1011300139, + "isDeleted": false, + "id": "eSid1nhor4D8oJbUtO7uA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 52.61542690531667, + "y": -4865.53779188645, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 235, + "height": 25, + "seed": 2062011514, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "low cardinality column cl", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low cardinality column cl" + }, + { + "type": "rectangle", + "version": 3901, + "versionNonce": 973241445, + "isDeleted": false, + "id": "Y3XoRfqQf-NLr3lE7JnMN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 5.451470492958094, + "y": -4704.339245230425, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 304339814, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3527, + "versionNonce": 1113749413, + "isDeleted": false, + "id": "ONKeuz9pVhxRHOaFetGq5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 174.7365697763001, + "y": -4757.2240361838685, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 730583270, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3631, + "versionNonce": 1692270891, + "isDeleted": false, + "id": "-HvFH8HPNIoXqNg7o4GK1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 175.02350159448025, + "y": -4743.4442066384145, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 8558714, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3634, + "versionNonce": 1625176837, + "isDeleted": false, + "id": "wj08ZywhI7w7csrHoqqy0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 175.0484414983278, + "y": -4730.274735484569, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 820823078, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2075, + "versionNonce": 474211563, + "isDeleted": false, + "id": "kZsLE3jpmPz1Q9HP50zTT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 423.5356465388398, + "y": -4864.597721248145, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 246, + "height": 25, + "seed": 818562598, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "high cardinality column ch", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "high cardinality column ch" + }, + { + "type": "text", + "version": 1827, + "versionNonce": 804130699, + "isDeleted": false, + "id": "sovQZLFZhWlrgZZEN7Onl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 534.942638101621, + "y": -4828.874510744283, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 1586818554, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v1" + }, + { + "type": "text", + "version": 1898, + "versionNonce": 426033829, + "isDeleted": false, + "id": "TKuOOFwXXx8if2hOOwVvm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 532.4485832537756, + "y": -4797.424552349724, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 21, + "height": 20, + "seed": 1152533114, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v2", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v2" + }, + { + "type": "text", + "version": 1999, + "versionNonce": 775546411, + "isDeleted": false, + "id": "e-xdBVQQ-6WHMcQ9W56bZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 534.4252205718773, + "y": -4767.596246790877, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 20, + "height": 20, + "seed": 143083450, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3" + }, + { + "type": "text", + "version": 2105, + "versionNonce": 1465853445, + "isDeleted": false, + "id": "yrHiTgCA5gWUbt6nLBOJu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 538.2390809430202, + "y": -4703.998054559754, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 17, + "height": 20, + "seed": 2086876454, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "vn", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "vn" + }, + { + "type": "rectangle", + "version": 3015, + "versionNonce": 1758873957, + "isDeleted": false, + "id": "FCCUs0_i4qLdB0Ej94E4Y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 390.83654539798164, + "y": -4312.63594729479, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 241.50809398580586, + "seed": 1914513466, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + } + ], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2736, + "versionNonce": 1838754667, + "isDeleted": false, + "id": "jgFXbXeH8YIKeQ2gURwgW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 19.861398564808013, + "y": -4315.35417026106, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 239.25119804797578, + "seed": 668209254, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2823, + "versionNonce": 879875269, + "isDeleted": false, + "id": "o6Ok6BRVTyY0YZICjpu1r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11.457897918761972, + "y": -4271.526107265028, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 2071990522, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + } + ], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2826, + "versionNonce": 1329919013, + "isDeleted": false, + "id": "e1w5nDBdprtkB0GjJBMVk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 11.436523860531423, + "y": -4238.324876204422, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 1376248250, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3625, + "versionNonce": 1791986859, + "isDeleted": false, + "id": "9mEd9Pc5kSLTLJP76KICb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 9.220250009137402, + "y": -4207.338164355282, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 472624870, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756422, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2173, + "versionNonce": 356329349, + "isDeleted": false, + "id": "9K9GA5Xsx7Linr6bzdWXg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 430.99068170730413, + "y": -4301.428285389093, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 235, + "height": 25, + "seed": 1356307066, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "low cardinality column cl", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low cardinality column cl" + }, + { + "type": "text", + "version": 3665, + "versionNonce": 1949935755, + "isDeleted": false, + "id": "ZVy4SXPgb8AN-xRWRSzZd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.30929761132978, + "y": -4192.276453251134, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1392447654, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3769, + "versionNonce": 1140537765, + "isDeleted": false, + "id": "zs9dJsuDRPlb1lxvSFJT-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.59622942950995, + "y": -4178.49662370568, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 750007482, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3772, + "versionNonce": 2007654187, + "isDeleted": false, + "id": "HIw5GXLWPA088s4648m9j", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 180.6211693333575, + "y": -4165.327152551834, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1331825638, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2149, + "versionNonce": 91672683, + "isDeleted": false, + "id": "o5Iyk91ZX6NHnkpCdNoMq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 126.61669812534177, + "y": -4239.368643462498, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 1175505510, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "larger value" + }, + { + "type": "text", + "version": 2288, + "versionNonce": 1151963781, + "isDeleted": false, + "id": "GahQ9RQkP70w-ToYDmci_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 53.666320191733945, + "y": -4304.755056684555, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 246, + "height": 25, + "seed": 1041891450, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "high cardinality column ch", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "high cardinality column ch" + }, + { + "type": "text", + "version": 2043, + "versionNonce": 88013285, + "isDeleted": false, + "id": "S9EAguDXECpjTanurYF92", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 505.2946637966753, + "y": -4269.467830075513, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 448258362, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "some value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "some value" + }, + { + "type": "text", + "version": 1923, + "versionNonce": 849643211, + "isDeleted": false, + "id": "gxjeT_-XlqLq3Soh1LyCn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 130.16653022905263, + "y": -4799.959769238338, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 2098985658, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 1978, + "versionNonce": 484728677, + "isDeleted": false, + "id": "EANFDhLMVVj_cUw-jXS5K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 128.82537610354728, + "y": -4769.680317299848, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 446104038, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 2107, + "versionNonce": 1503622507, + "isDeleted": false, + "id": "QqhxE25m1vjZKIcjFyv_-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 129.9347258122986, + "y": -4703.98032260843, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 14130298, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 3995, + "versionNonce": 709700293, + "isDeleted": false, + "id": "5aWnqxdg_GK3aF9xgcy-z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 6.716100664771005, + "y": -4662.45154636205, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 1188888890, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2202, + "versionNonce": 1283690507, + "isDeleted": false, + "id": "G4cSyyf6j_eXEv-ZUcXR-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 542.5037111148331, + "y": -4662.251094087263, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 1650083686, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "...", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 2248, + "versionNonce": 1531284005, + "isDeleted": false, + "id": "0-Zu47vlyIleKnDquRUwp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 113.06450111395831, + "y": -4662.374100531826, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1021102586, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "different value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "different value" + }, + { + "type": "arrow", + "version": 1942, + "versionNonce": 1725230565, + "isDeleted": false, + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 700.1163393610292, + "y": -4837.17969566948, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 102.01905034388096, + "height": 78.0457406876982, + "seed": 624469542, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293780194, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YaUuLC54Jft-Q1TmGCg0n", + "focus": 0.8787880374605471, + "gap": 4.706005471717162 + }, + "endBinding": { + "elementId": "3p2klKHZ3xRJgdfEZWb2u", + "focus": 0.507689627061049, + "gap": 3.1361614618572844 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -8.259218862988307 + ], + [ + 15.779906463149969, + 0.8433709402347214 + ], + [ + 16.66393948236995, + 25.82459982511837 + ], + [ + 17.30249991839189, + 50.97062533050765 + ], + [ + 19.11368951874503, + 69.7865218247099 + ], + [ + 32.76395546279845, + 69.2533562877799 + ], + [ + 102.01905034388096, + 61.64491894859428 + ] + ] + }, + { + "type": "arrow", + "version": 1246, + "versionNonce": 1336217323, + "isDeleted": false, + "id": "rh-38xKn85IlMvAGLOUuV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 708.787358024008, + "y": -4676.67684185521, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 92.75934039482536, + "height": 97.14706067288162, + "seed": 1705315578, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293780194, + "link": null, + "locked": false, + "startBinding": { + "elementId": "5aWnqxdg_GK3aF9xgcy-z", + "focus": -1.623767504357262, + "gap": 14.225295493160502 + }, + "endBinding": { + "elementId": "3p2klKHZ3xRJgdfEZWb2u", + "focus": 0.5002702869307034, + "gap": 3.724852747934108 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 9.390209912397566, + 0.3407545017945566 + ], + [ + 13.652890747270717, + -24.746349152546944 + ], + [ + 14.277503366963296, + -64.90994643073208 + ], + [ + 16.020713106057247, + -81.35703038401603 + ], + [ + 25.070088728382185, + -88.08882487502407 + ], + [ + 92.75934039482536, + -96.80630617108707 + ] + ] + }, + { + "type": "text", + "version": 313, + "versionNonce": 939577253, + "isDeleted": false, + "id": "3p2klKHZ3xRJgdfEZWb2u", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 805.2715511667674, + "y": -4797.3005241711, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 337, + "height": 50, + "seed": 1917678758, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Rows with the same cl value \nare ordered ascending by ch value", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Rows with the same cl value \nare ordered ascending by ch value" + }, + { + "type": "text", + "version": 610, + "versionNonce": 1626417451, + "isDeleted": false, + "id": "lGplLR8Z6jWDoJktrIipg", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 736.8301707406551, + "y": -4688.162934495756, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 511, + "height": 75, + "seed": 84608038, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Good data locality:\nSimilar ch data is placed close to each other,\nand therefore that data will be compressed better", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Good data locality:\nSimilar ch data is placed close to each other,\nand therefore that data will be compressed better" + }, + { + "type": "arrow", + "version": 487, + "versionNonce": 875030853, + "isDeleted": false, + "id": "kx0Y5XeLPP8gELJRVQBS8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 956.9471743771608, + "y": -4744.119863639449, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.8971719581269326, + "height": 40.45578583351107, + "seed": 998502630, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293780194, + "link": null, + "locked": false, + "startBinding": { + "elementId": "3p2klKHZ3xRJgdfEZWb2u", + "focus": 0.10694674091478802, + "gap": 3.180660531650574 + }, + "endBinding": { + "elementId": "lGplLR8Z6jWDoJktrIipg", + "focus": -0.12050265110988508, + "gap": 15.50114331018176 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.8971719581269326, + 40.45578583351107 + ] + ] + }, + { + "type": "text", + "version": 3651, + "versionNonce": 1580897547, + "isDeleted": false, + "id": "PIsgcoP-1CloIIpQqrMNU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 543.3773587517943, + "y": -4756.378846180702, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 92313594, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3755, + "versionNonce": 674059557, + "isDeleted": false, + "id": "Atwr3a8M6kiymsFpsJ9OJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 543.6642905699745, + "y": -4742.599016635248, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 40926374, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3758, + "versionNonce": 1004125099, + "isDeleted": false, + "id": "xrULyUeXjGsYNLsPYaT6K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 543.689230473822, + "y": -4729.429545481402, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2019526842, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3619, + "versionNonce": 1416718469, + "isDeleted": false, + "id": "BKVYbxey2QmitkdhvVkVj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.6784348211513, + "y": -4648.858702720743, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1231286182, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3723, + "versionNonce": 1947930187, + "isDeleted": false, + "id": "jaRokGmuyH-UX_Q_RqO9Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.9653666393315, + "y": -4635.078873175289, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1657849274, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3726, + "versionNonce": 966528997, + "isDeleted": false, + "id": "IUw1dFIp5HXlIvaVZ0QLh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 545.990306543179, + "y": -4621.909402021443, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 64162534, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3676, + "versionNonce": 1238961387, + "isDeleted": false, + "id": "Ayu8jCN0JwCyp99wqkWQJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 175.9159546240246, + "y": -4649.51435179256, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1098385062, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3780, + "versionNonce": 632998725, + "isDeleted": false, + "id": "KK8FVzfNzvvlmQnJfDRBX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 176.20288644220477, + "y": -4635.734522247106, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 921542330, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3783, + "versionNonce": 1084110731, + "isDeleted": false, + "id": "Yvddr7Umq1L32GhZFH1TO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 176.22782634605232, + "y": -4622.56505109326, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 793526758, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 314, + "versionNonce": 1227561637, + "isDeleted": false, + "id": "ie9gUcV3zGfunavl0g5D9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -32.300865930757936, + "y": -5105.988560748006, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1079, + "height": 50, + "seed": 292855782, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Compression algorithm benefits from run length of data (the more data it sees the better for compression) \nand locality (the more similar the data is the better the compression is)", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Compression algorithm benefits from run length of data (the more data it sees the better for compression) \nand locality (the more similar the data is the better the compression is)" + }, + { + "type": "text", + "version": 2154, + "versionNonce": 111480363, + "isDeleted": false, + "id": "mAHet1TZcuvaagMWEtn2g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 156.5164996874937, + "y": -4270.257376751229, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 42, + "height": 20, + "seed": 981121530, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "value" + }, + { + "type": "text", + "version": 2249, + "versionNonce": 1822064133, + "isDeleted": false, + "id": "gUZl0f0606C_BG_20WgYa", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 110.94695212633592, + "y": -4206.953486095181, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 137, + "height": 20, + "seed": 1035169914, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "even larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "even larger value" + }, + { + "type": "text", + "version": 2133, + "versionNonce": 517476555, + "isDeleted": false, + "id": "aHnVfkGnkWjtPsMVsmOAr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 492.92585411281516, + "y": -4238.310847166858, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 110, + "height": 20, + "seed": 1800397306, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "another value" + }, + { + "type": "text", + "version": 2233, + "versionNonce": 1728476517, + "isDeleted": false, + "id": "FaGIyLxwcwM-r2j9pMHp2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 478.6214149762976, + "y": -4208.14541931701, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 145, + "height": 20, + "seed": 2107456314, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "and another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "and another value" + }, + { + "type": "text", + "version": 3792, + "versionNonce": 1255260011, + "isDeleted": false, + "id": "3VIQjVNOQ5DFdQPt_HlPx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 546.4837160786736, + "y": -4196.306783802103, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1471763834, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3896, + "versionNonce": 1404862661, + "isDeleted": false, + "id": "R1FNA6QYXJAE2Wg6BBkmf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 546.7706478968538, + "y": -4182.526954256649, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 457987878, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3899, + "versionNonce": 886872587, + "isDeleted": false, + "id": "p7mZuEE_jy1w1NZuZEL71", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 546.7955878007014, + "y": -4169.357483102804, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1336186426, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 2404, + "versionNonce": 1718288459, + "isDeleted": false, + "id": "anUfuQZGoFRmo_9HIl_zk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 717.3925645716687, + "y": -4279.243374226462, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 79.49015283162282, + "height": 78.0457406876982, + "seed": 94378982, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293778168, + "link": null, + "locked": false, + "startBinding": { + "elementId": "o6Ok6BRVTyY0YZICjpu1r", + "focus": 0.8997046848840218, + "gap": 7.717266961434234 + }, + "endBinding": { + "elementId": "r9AtQIG-zS2yFMMLF7FLH", + "focus": 0.5076896270609952, + "gap": 3.136161461857398 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -8.259218862988307 + ], + [ + 15.779906463149969, + 0.8433709402347214 + ], + [ + 16.66393948236995, + 25.82459982511837 + ], + [ + 17.30249991839189, + 50.97062533050765 + ], + [ + 19.11368951874503, + 69.7865218247099 + ], + [ + 32.76395546279845, + 69.2533562877799 + ], + [ + 79.49015283162282, + 64.28916667596013 + ] + ] + }, + { + "type": "arrow", + "version": 1830, + "versionNonce": 1241267685, + "isDeleted": false, + "id": "1sq5PdmMU7wreMSi402mr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 721.1531457114645, + "y": -4124.7073773528955, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 75.28175621842279, + "height": 98.60285158357827, + "seed": 955022714, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293778168, + "link": null, + "locked": false, + "startBinding": { + "elementId": "FCCUs0_i4qLdB0Ej94E4Y", + "focus": -0.04370403929404864, + "gap": 14.266227560214958 + }, + "endBinding": { + "elementId": "r9AtQIG-zS2yFMMLF7FLH", + "focus": 0.5952944648084507, + "gap": 3.58397693526166 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.327458611046485, + 6.27657903854597 + ], + [ + 18.59813121582617, + -20.04021531495019 + ], + [ + 19.223914873307095, + -62.172505460118806 + ], + [ + 20.97039282122862, + -79.42577359648875 + ], + [ + 30.03673441651118, + -86.48753942210244 + ], + [ + 75.28175621842279, + -92.32627254503231 + ] + ] + }, + { + "type": "text", + "version": 514, + "versionNonce": 1254937477, + "isDeleted": false, + "id": "r9AtQIG-zS2yFMMLF7FLH", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 800.0188788651488, + "y": -4240.252487562602, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 484, + "height": 50, + "seed": 2017439526, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + }, + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + }, + { + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Can't locally order rows with the same ch value \nby cl value, because of high cardinality of ch ", + "baseline": 43, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Can't locally order rows with the same ch value \nby cl value, because of high cardinality of ch " + }, + { + "type": "text", + "version": 1003, + "versionNonce": 868209483, + "isDeleted": false, + "id": "S9aThX9aR8pW8qWeVFqKt", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 798.7303720319195, + "y": -4132.157828770881, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 501, + "height": 75, + "seed": 1882373690, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + }, + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + }, + { + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Bad data locality:\ncl data is in random order, \nand therefore that data will be compressed worse", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Bad data locality:\ncl data is in random order, \nand therefore that data will be compressed worse" + }, + { + "type": "arrow", + "version": 1477, + "versionNonce": 291159787, + "isDeleted": false, + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1016.7432970066836, + "y": -4187.071827030952, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 0.9356510596478529, + "height": 39.412854949889606, + "seed": 1879759462, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655293778168, + "link": null, + "locked": false, + "startBinding": { + "elementId": "r9AtQIG-zS2yFMMLF7FLH", + "focus": 0.10694674091478941, + "gap": 3.180660531650574 + }, + "endBinding": { + "elementId": "S9aThX9aR8pW8qWeVFqKt", + "focus": -0.12050265110988774, + "gap": 15.50114331018176 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.9356510596478529, + 39.412854949889606 + ] + ] + }, + { + "type": "text", + "version": 3205, + "versionNonce": 1182234181, + "isDeleted": false, + "id": "Kc78Sf6teXO2KTKiRinns", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -175.50485157304524, + "y": -4727.141252753443, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 832145254, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1127, + "versionNonce": 588932517, + "isDeleted": false, + "id": "00AAAOP2mz9j-ETnOx4Ap", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": -23.997585556718356, + "y": -4829.970267373838, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 1254353658, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 3376, + "versionNonce": 6842629, + "isDeleted": false, + "id": "SNY-PfJ7f0iQJTZZjEcNx", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -172.48684407606407, + "y": -4199.1940317516355, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 779573562, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1297, + "versionNonce": 1735546315, + "isDeleted": false, + "id": "02UXtFhzFeL1YkGEvp_26", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": -20.979578059737296, + "y": -4302.02304637203, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 439447398, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 805, + "versionNonce": 1910203499, + "isDeleted": false, + "id": "nIC2GVfSBcWRYJ8P0ua7n", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -67.2283376687189, + "y": -4924.215103331335, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 222, + "height": 25, + "seed": 1587856523, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (cl, ch) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (cl, ch) " + }, + { + "type": "text", + "version": 840, + "versionNonce": 927706053, + "isDeleted": false, + "id": "bLvEuzx5XMyTsh0bQ0P2-", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -51.80236372990356, + "y": -4366.349603590697, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 222, + "height": 25, + "seed": 1104014027, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (ch, cl) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (ch, cl) " + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/05-Identifying_single_rows_efficiently.excalidraw b/docs/ja/guides/best-practices/images/05-Identifying_single_rows_efficiently.excalidraw new file mode 100644 index 00000000000..f2656285cc6 --- /dev/null +++ b/docs/ja/guides/best-practices/images/05-Identifying_single_rows_efficiently.excalidraw @@ -0,0 +1,9556 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 3183, + "versionNonce": 359071435, + "isDeleted": false, + "id": "p1WxM-Qoc3hiBO5eo-2jf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3166.7053500934853, + "y": -4253.225960235581, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 241.50809398580586, + "seed": 784694661, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216762462, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3061, + "versionNonce": 1987930693, + "isDeleted": false, + "id": "paClRYMk-CVd1O4Ii1CMo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3546.8696000569953, + "y": -3810.749117838364, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 296.11179326251374, + "seed": 1786671685, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756416, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2964, + "versionNonce": 1243154571, + "isDeleted": false, + "id": "tWiuLgmsLkU6DIrA3FRP0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3167.133003467527, + "y": -3807.996383637967, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 296.11179326251374, + "seed": 759477547, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756416, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3039, + "versionNonce": 410871755, + "isDeleted": false, + "id": "MQsW9s8xL8qvXI6gwA3_M", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -154.50900556125794, + "y": -3118.005636936821, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 1484196441, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1995, + "versionNonce": 1178996325, + "isDeleted": false, + "id": "m8AOUclFzCqKasrwXU2vt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.91401548189265, + "y": -3116.7830426907876, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1444422583, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "rectangle", + "version": 3045, + "versionNonce": 867448427, + "isDeleted": false, + "id": "8CysppYmg170rFx8o8zB4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -154.70430195537233, + "y": -3084.804405876214, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 1370904377, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3844, + "versionNonce": 1750610187, + "isDeleted": false, + "id": "btWfoMtAtMD25RyXu595z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -156.92057580676624, + "y": -3053.8176940270746, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 54069273, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756419, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2107, + "versionNonce": 830288869, + "isDeleted": false, + "id": "Ioel2cvvh0rZRzBFg9NAJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -18.22496457700231, + "y": -3151.5404211630103, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 593039415, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 2240, + "versionNonce": 386672875, + "isDeleted": false, + "id": "R2ojjX132toy3HDwE3xSl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 341.2359729229977, + "y": -3153.3333899130103, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 648573625, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 2011, + "versionNonce": 1305964357, + "isDeleted": false, + "id": "asWw-4_Ug2fhxH2_d9ZWJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 236.5094104229977, + "y": -3117.0443274130103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 1280831831, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "rectangle", + "version": 3915, + "versionNonce": 822989707, + "isDeleted": false, + "id": "92HFEivuWOU0GiX05Fm8V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -155.38307469604956, + "y": -3021.1098301644874, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 979088281, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 4041, + "versionNonce": 2126588459, + "isDeleted": false, + "id": "NzWOZMBc9drJAPtdtLohV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -154.80104344604956, + "y": -2990.0294730216306, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.3368675595235, + "height": 21.891121031746003, + "seed": 2075383929, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2162, + "versionNonce": 1964027083, + "isDeleted": false, + "id": "mY_9QXPQ9QndDCNHPvLCe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.31329429425955, + "y": -3083.9708472525467, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 745824601, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 2099, + "versionNonce": 590715237, + "isDeleted": false, + "id": "R8gG4MutRqLZO1di-iUsD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.56062027526036, + "y": -3053.819488194116, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1283439799, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 2135, + "versionNonce": 127327083, + "isDeleted": false, + "id": "te8Gg4XypgtupMvEYrFIo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.67946207947375, + "y": -3020.3579924975697, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 166776377, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2093, + "versionNonce": 107422917, + "isDeleted": false, + "id": "nhl58uPXqosWvIUlY5YMe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.95475069446115, + "y": -2987.9037024130103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1693781463, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "text", + "version": 2088, + "versionNonce": 1386100235, + "isDeleted": false, + "id": "is9q-tkXUtwVs8symlqe7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 236.6969104229977, + "y": -3085.4857336630103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 257, + "height": 20, + "seed": 1527553817, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab" + }, + { + "type": "text", + "version": 2176, + "versionNonce": 1443906597, + "isDeleted": false, + "id": "n6wbRr3VpcSBsxdNQ18jh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 237.6265979229977, + "y": -3052.0951086630103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 551762679, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "text", + "version": 2262, + "versionNonce": 86064299, + "isDeleted": false, + "id": "2uj8BxFz9WKkik2M7JHv9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 237.3805041729977, + "y": -3019.0990149130103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 1044075513, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "text", + "version": 2327, + "versionNonce": 1176401797, + "isDeleted": false, + "id": "W5lD4wo_aYF8FD9jzk73z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 237.6656604229977, + "y": -2987.1497961630103, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 1422836759, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "rectangle", + "version": 3103, + "versionNonce": 818888421, + "isDeleted": false, + "id": "oyuMeMC0-SbmyDATSoeAz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -151.82252782105002, + "y": -2953.61538396063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 702.7844122023815, + "height": 24.466455853174235, + "seed": 1353460023, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2142, + "versionNonce": 1978945003, + "isDeleted": false, + "id": "Trh2swDxyux7JKMxSJbiG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.9328879125385, + "y": -2949.4965843574537, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2121230777, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2139, + "versionNonce": 1286609477, + "isDeleted": false, + "id": "ix8YUQUncLk7LzGleGz89", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 240.42524084177717, + "y": -2949.7578690796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 230, + "height": 20, + "seed": 1910499927, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on " + }, + { + "type": "rectangle", + "version": 3197, + "versionNonce": 580815269, + "isDeleted": false, + "id": "XFd01VPlmqh22umst9R6L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -153.53402335676424, + "y": -2917.214714317773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6482514880958, + "height": 22.71422371031703, + "seed": 1967032183, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2238, + "versionNonce": 1134825259, + "isDeleted": false, + "id": "aiklupzf6rT4vtAyTULJ2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.14618540467586, + "y": -2914.185824000065, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1768492921, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 2220, + "versionNonce": 1137184005, + "isDeleted": false, + "id": "0FPc8nd3wOlKGKC7U-8KZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 240.58149084177717, + "y": -2915.1094315796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 151814295, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "rectangle", + "version": 3336, + "versionNonce": 1068115045, + "isDeleted": false, + "id": "XcY81vPHo7RVfA8-5Ow0E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -151.87777335676424, + "y": -2884.2197366392015, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.2185639880958, + "height": 22.691902281745577, + "seed": 519984567, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2361, + "versionNonce": 46432363, + "isDeleted": false, + "id": "WaFkuRAsw-2s5YRmm8Hg1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.59575919400163, + "y": -2881.7631144368543, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 386155833, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "text", + "version": 2339, + "versionNonce": 1511149509, + "isDeleted": false, + "id": "-uehDvVOHOQc7dzrKX9D8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 241.80805334177717, + "y": -2882.0039628296763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 2117633751, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "rectangle", + "version": 3278, + "versionNonce": 18747173, + "isDeleted": false, + "id": "gtQWuXsry8ykoQmiIG3fO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -156.4313447853358, + "y": -2851.48257146063, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.2799479166672, + "height": 23.09926835317424, + "seed": 357536759, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2323, + "versionNonce": 854172075, + "isDeleted": false, + "id": "wVsdzAYGZSQbP-Sqk11-N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.6933751924455, + "y": -2848.4610711891128, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1478298361, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2313, + "versionNonce": 54190725, + "isDeleted": false, + "id": "GWmICSsRM6kPtWsAAJD4P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 242.17914709177717, + "y": -2848.9922440796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 258, + "height": 20, + "seed": 206044439, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear" + }, + { + "type": "rectangle", + "version": 3360, + "versionNonce": 86395365, + "isDeleted": false, + "id": "C1XpWR8XvAHh39Pd5jNql", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -156.85042960676424, + "y": -2816.5517678892015, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.4920014880959, + "height": 21.129402281745573, + "seed": 378946103, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2426, + "versionNonce": 2124903147, + "isDeleted": false, + "id": "2U6j89Q16gt9GNxsIPpFQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -135.0701783205966, + "y": -2816.3996180055224, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1989107897, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 2397, + "versionNonce": 938329413, + "isDeleted": false, + "id": "oetWI8rNlG3IK069wp6ym", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 242.10883459177717, + "y": -2816.0313065796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 85910359, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "rectangle", + "version": 3431, + "versionNonce": 1324274853, + "isDeleted": false, + "id": "tX6O1DV2RYCpJQ_l_Li_N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -153.19864389247846, + "y": -2783.894401817773, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.8301711309529, + "height": 23.143911210317018, + "seed": 406216823, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2473, + "versionNonce": 2073162795, + "isDeleted": false, + "id": "mp-99dhXTz2daYf4NIXpO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -133.13490381311317, + "y": -2781.0981468574537, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1966556793, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2498, + "versionNonce": 903280645, + "isDeleted": false, + "id": "3agSWLK-3AhTag5Z0UFwW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 243.28852209177717, + "y": -2781.2266190796763, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 295778711, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 3773, + "versionNonce": 111390565, + "isDeleted": false, + "id": "34A88GFXY9CCcG0HvZ4br", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.2764656334127267, + "y": -2748.9709866912317, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 110358199, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3877, + "versionNonce": 1782392171, + "isDeleted": false, + "id": "LckWBoWXvnktFo_NPBTLF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.5633974515928912, + "y": -2735.1911571457777, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1341176889, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3840, + "versionNonce": 1067612869, + "isDeleted": false, + "id": "2I5ASjeqj09-q-kv4mqOH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1.5883373554404443, + "y": -2722.021685991932, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1907556311, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3846, + "versionNonce": 1575698443, + "isDeleted": false, + "id": "aeB7to-DurtYDCmuZ8zP4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 384.9036977762696, + "y": -2749.936388476946, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1994312985, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3950, + "versionNonce": 963697189, + "isDeleted": false, + "id": "aCcNhGCLNWN8wUQkhPpj2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 385.1906295944498, + "y": -2736.156558931492, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 85126391, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3913, + "versionNonce": 1983710891, + "isDeleted": false, + "id": "WYGJ20KtITKclfAUqUDPW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 385.2155694982973, + "y": -2722.987087777646, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 999801337, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2112, + "versionNonce": 1663187557, + "isDeleted": false, + "id": "lcdSSOpTllpVoxBgKbdsU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 689.2592409459633, + "y": -2394.0151226080548, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 183, + "height": 50, + "seed": 962965465, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "61YnaJnTFnqbuwlctLUN-", + "type": "arrow" + } + ], + "updated": 1655216756420, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content is stored \nin random order", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "content is stored \nin random order" + }, + { + "type": "arrow", + "version": 1226, + "versionNonce": 966654859, + "isDeleted": false, + "id": "2h_lJWmyLHbhscIs1Dbae", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": -203.07057824917115, + "y": -3138.4867331694013, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 1911728439, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756421, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 2984, + "versionNonce": 1723392517, + "isDeleted": false, + "id": "zBJ5VXkEChEe5uqTioovL", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -336.8684118034191, + "y": -2988.841254411818, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 207, + "height": 25, + "seed": 737539479, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655220777443, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert order of rows" + }, + { + "type": "text", + "version": 917, + "versionNonce": 1969856267, + "isDeleted": false, + "id": "22IBNBUs5wrbD6iTKNaq0", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -211.49094710820214, + "y": -2629.8118066134275, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 216, + "height": 25, + "seed": 1521703915, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (hash) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (hash) " + }, + { + "type": "rectangle", + "version": 2832, + "versionNonce": 650898213, + "isDeleted": false, + "id": "w42EK7f0BeOrMB-8LYcH4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 217.32240737455027, + "y": -2553.662165313527, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 480.7338169642854, + "seed": 1589199179, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2591, + "versionNonce": 1821869483, + "isDeleted": false, + "id": "KdShR-ekfP_RKuNWHL6cu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -153.56085819537225, + "y": -2556.3803882797993, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 482.7204241071425, + "seed": 1970179301, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2763, + "versionNonce": 1858944645, + "isDeleted": false, + "id": "JLlj8GrRbNXoqYzDSwPPk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -161.8823177687857, + "y": -2512.5523252837675, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.55115327381, + "height": 21.57025049603125, + "seed": 1211686891, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1804, + "versionNonce": 512727115, + "isDeleted": false, + "id": "QpCrZyxXhgHrTt-OKQsKJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -143.7327535167076, + "y": -2512.0620212682898, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 473278533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "rectangle", + "version": 2769, + "versionNonce": 101524965, + "isDeleted": false, + "id": "ZSgSwaSZH2wcoqQkP37MX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -162.0776141629001, + "y": -2479.3510942231596, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 697019019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3568, + "versionNonce": 153900779, + "isDeleted": false, + "id": "6pvwYbiy9U4AokPXfrn9A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -164.293888014294, + "y": -2448.3643823740213, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 1178752933, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1831, + "versionNonce": 798564677, + "isDeleted": false, + "id": "iiaBqurYVCMqCB7tIyx4Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -25.598276784529617, + "y": -2546.0871095099565, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 2003575083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 1964, + "versionNonce": 184041867, + "isDeleted": false, + "id": "38r6PanY1AHwj6Z166EEh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 333.8626607154704, + "y": -2547.8800782599565, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 499260165, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 1736, + "versionNonce": 1892593829, + "isDeleted": false, + "id": "9BirB5svUi8JJ5rycoDzi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 229.13609821547038, + "y": -2511.5910157599565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 725926859, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "rectangle", + "version": 3639, + "versionNonce": 1294850091, + "isDeleted": false, + "id": "r71wIOY50jXdDxnsQORjH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -162.75638690357732, + "y": -2415.656518511433, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 724726373, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3765, + "versionNonce": 1197167621, + "isDeleted": false, + "id": "ZUInZa9S8V0WFZNQPjFn2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -162.17435565357732, + "y": -2384.5761613685763, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.3368675595235, + "height": 21.891121031746003, + "seed": 758125163, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1925, + "versionNonce": 1840749259, + "isDeleted": false, + "id": "xhMVaw6ZOBfVDiom5rccM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -143.348727144162, + "y": -2480.08952227984, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 190897605, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "text", + "version": 1925, + "versionNonce": 524061541, + "isDeleted": false, + "id": "HSCzbBIs7164AoqYH2Dz-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -144.80877707766308, + "y": -2448.5113654941238, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2113441035, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 1962, + "versionNonce": 1764755819, + "isDeleted": false, + "id": "78h747g3TB4TleOJFomO8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -144.39684581956158, + "y": -2416.020958625834, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1701502245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 1916, + "versionNonce": 146790085, + "isDeleted": false, + "id": "f_pWRGs7e50aY2uAs-I7m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -145.14761881539948, + "y": -2383.3072633693705, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 555266987, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756423, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "text", + "version": 1813, + "versionNonce": 1155638283, + "isDeleted": false, + "id": "8anq89LRUwYoPz0uKhUut", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 229.32359821547038, + "y": -2480.0324220099565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 549318789, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "text", + "version": 1901, + "versionNonce": 780318245, + "isDeleted": false, + "id": "TouOAxRYQ9kokyaCXPt7l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 230.25328571547038, + "y": -2446.6417970099565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 257, + "height": 20, + "seed": 1186661963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab" + }, + { + "type": "text", + "version": 1987, + "versionNonce": 2026302123, + "isDeleted": false, + "id": "0E15VDn4DihFizfdk-V9L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 230.00719196547038, + "y": -2413.6457032599565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 1528272869, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "text", + "version": 2052, + "versionNonce": 192063877, + "isDeleted": false, + "id": "YLFNOShw3WTpc0nClQmWV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 230.29234821547038, + "y": -2381.6964845099565, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 901383403, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "rectangle", + "version": 2827, + "versionNonce": 428498251, + "isDeleted": false, + "id": "TiuOOY-2cJlom3zpPjiUR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -159.19584002857778, + "y": -2348.1620723075766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 702.7844122023815, + "height": 24.466455853174235, + "seed": 512054085, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1913, + "versionNonce": 1624060133, + "isDeleted": false, + "id": "vZfpS0_o7sYPoXWCGNikx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -144.40247366566723, + "y": -2344.3081407419286, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1973432203, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 1864, + "versionNonce": 1116109803, + "isDeleted": false, + "id": "Zd2vL-NuwafiOojeEKDo9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 233.0519286342494, + "y": -2344.3045574266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 1466213029, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "rectangle", + "version": 2921, + "versionNonce": 1814023237, + "isDeleted": false, + "id": "wF-tQxSnYyfZxlKLK68mo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -160.907335564292, + "y": -2311.7614026647198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6482514880958, + "height": 22.71422371031703, + "seed": 950535723, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1972, + "versionNonce": 1069926027, + "isDeleted": false, + "id": "JzHFWdUOsyBawviDaMywm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -145.97871713481277, + "y": -2310.454216584111, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 174261765, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 1945, + "versionNonce": 1564998565, + "isDeleted": false, + "id": "VvlOUahL3uHlGfxLiBkK6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 233.20817863424986, + "y": -2309.6561199266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 96209099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "rectangle", + "version": 3060, + "versionNonce": 2013445419, + "isDeleted": false, + "id": "68GMsyRvCBV5Z3QjLnBFd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -159.251085564292, + "y": -2278.7664249861473, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.2185639880958, + "height": 22.691902281745577, + "seed": 1249770853, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2171, + "versionNonce": 208879365, + "isDeleted": false, + "id": "in5XmgU2egtNJGkJwtuiD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -145.06702064164188, + "y": -2277.068448827981, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 578205547, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2065, + "versionNonce": 380100555, + "isDeleted": false, + "id": "DnM9L-_1Yzqr9ZgVyZ3tR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 234.43474113424986, + "y": -2276.5506511766225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 230, + "height": 20, + "seed": 1862469829, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": " fastest OLAP database on", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": " fastest OLAP database on" + }, + { + "type": "rectangle", + "version": 3043, + "versionNonce": 1881085541, + "isDeleted": false, + "id": "3ggjxkgo6tOdCbJZbL1hs", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -163.80465699286356, + "y": -2246.0292598075766, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.2799479166672, + "height": 23.09926835317424, + "seed": 1025675787, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2065, + "versionNonce": 1976544875, + "isDeleted": false, + "id": "3n8kjeJRvi1yQXGvo--SL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -146.2018862598486, + "y": -2243.9840229847455, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 160409637, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2037, + "versionNonce": 1394147781, + "isDeleted": false, + "id": "cdTNNF8xl_lsLzo4nKuIv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 234.8058348842494, + "y": -2243.5389324266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 258, + "height": 20, + "seed": 1455036587, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear" + }, + { + "type": "rectangle", + "version": 3084, + "versionNonce": 1212459275, + "isDeleted": false, + "id": "VwI7AvGDfn80xchs0bPY6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -164.223741814292, + "y": -2211.0984562361473, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 709.4920014880959, + "height": 21.129402281745573, + "seed": 470899589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2143, + "versionNonce": 1249804581, + "isDeleted": false, + "id": "Rah-cHPbSp1Jaz1OnZBKf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -147.32005542095817, + "y": -2211.459328044157, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1827130187, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2122, + "versionNonce": 58806187, + "isDeleted": false, + "id": "LvJ9C8wx2igOGDZ0UP9SH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 234.7355223842494, + "y": -2210.5779949266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 247833317, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "rectangle", + "version": 3155, + "versionNonce": 1807553669, + "isDeleted": false, + "id": "sd1yueVIRTgDd2dvDHr9D", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": -160.57195610000622, + "y": -2178.4410901647198, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 706.8301711309529, + "height": 23.143911210317018, + "seed": 1678125547, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2238, + "versionNonce": 162538059, + "isDeleted": false, + "id": "S8l-U7J9vHo9hbrENOhK8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -146.4391665536143, + "y": -2175.6448352044, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1715076677, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2222, + "versionNonce": 1116879845, + "isDeleted": false, + "id": "6QJzqJa_GR5uuzQzxIxRt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 235.91520988424986, + "y": -2175.7733074266225, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 824161419, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 3497, + "versionNonce": 330014955, + "isDeleted": false, + "id": "0im-lLcMmx5LAgSJehgT8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -6.096846574115034, + "y": -2143.517675038178, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 961277349, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3601, + "versionNonce": 118191941, + "isDeleted": false, + "id": "mLBxENMtRCpw-TytnR2Hy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -5.809914755934869, + "y": -2129.737845492724, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1139731243, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3604, + "versionNonce": 1526614923, + "isDeleted": false, + "id": "tCBhDXJrqPA7zeO1GPMWK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -5.784974852087316, + "y": -2116.568374338878, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1730736389, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3570, + "versionNonce": 327567013, + "isDeleted": false, + "id": "zMPuZKFglQxl2KHVnWK4k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.53038556874185, + "y": -2144.4830768238926, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 819875275, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3674, + "versionNonce": 65184299, + "isDeleted": false, + "id": "ez4OYglVPqqXDzwuRoD-c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.817317386922, + "y": -2130.7032472784385, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 223250533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3677, + "versionNonce": 447752709, + "isDeleted": false, + "id": "89ZKbCIYnxnJVokM5EQa1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 377.84225729076957, + "y": -2117.533776124593, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 453532779, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 964, + "versionNonce": 1195582667, + "isDeleted": false, + "id": "ajtEYVqmW42eOK1TXI_ln", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": -196.4438904566989, + "y": -2533.0334215163475, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 1032467397, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 3513, + "versionNonce": 613592587, + "isDeleted": false, + "id": "o4-zFy4E_jqeHJurXghwB", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": -343.0858863818887, + "y": -2383.0821152253084, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 1451070981, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 2683, + "versionNonce": 298235051, + "isDeleted": false, + "id": "CzddlABOhDB8TViZGAlMw", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 579.299911798428, + "y": -2506.307896419628, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 79.49015283162282, + "height": 173.95942343925103, + "seed": 934518027, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -18.40931918646651 + ], + [ + 15.779906463149969, + 1.8798248465053824 + ], + [ + 16.66393948236995, + 57.56153323092345 + ], + [ + 17.30249991839189, + 113.6105637117851 + ], + [ + 19.11368951874503, + 155.55010425278454 + ], + [ + 32.76395546279845, + 154.36170923487882 + ], + [ + 79.49015283162282, + 143.29681888844888 + ] + ] + }, + { + "type": "arrow", + "version": 2138, + "versionNonce": 1521254277, + "isDeleted": false, + "id": "_YN16cB6fgb-cF-eD3Lar", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 583.2725607153009, + "y": -2167.3375430023743, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 75.28175621842279, + "height": 209.8449522449944, + "seed": 78171429, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.327458611046485, + 13.357711338492038 + ], + [ + 18.59813121582617, + -42.64925362914658 + ], + [ + 19.223914873307095, + -132.31449425346148 + ], + [ + 20.97039282122862, + -169.03261315165378 + ], + [ + 30.03673441651118, + -184.06134597876843 + ], + [ + 75.28175621842279, + -196.48724090650234 + ] + ] + }, + { + "type": "text", + "version": 2173, + "versionNonce": 375146213, + "isDeleted": false, + "id": "qbSD73tBoatVqg-d8s6QJ", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 680.7185861111018, + "y": -2296.3092691734532, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 204, + "height": 50, + "seed": 703995147, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "61YnaJnTFnqbuwlctLUN-", + "type": "arrow" + } + ], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "bad for compression \nof content column", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "bad for compression \nof content column" + }, + { + "type": "arrow", + "version": 129, + "versionNonce": 190587461, + "isDeleted": false, + "id": "61YnaJnTFnqbuwlctLUN-", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 776.9484906060243, + "y": -2342.9330075232388, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 1.1809934673997304, + "height": 45.030042439117096, + "seed": 529179109, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "startBinding": { + "elementId": "lcdSSOpTllpVoxBgKbdsU", + "focus": 0.048806163122091475, + "gap": 1.0718368715292854 + }, + "endBinding": { + "elementId": "qbSD73tBoatVqg-d8s6QJ", + "focus": -0.03793177709135398, + "gap": 1.6058662945174547 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 1.1809934673997304, + 45.030042439117096 + ] + ] + }, + { + "type": "text", + "version": 2214, + "versionNonce": 1024595205, + "isDeleted": false, + "id": "zE9hHQl7luEGPddf-BMZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1080.4105365929627, + "y": -3154.2848675407477, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 97, + "height": 25, + "seed": 1500041259, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "fingerprint", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fingerprint" + }, + { + "type": "rectangle", + "version": 3190, + "versionNonce": 309537893, + "isDeleted": false, + "id": "CFvNSB8Tii-R3R8jj0sQu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1059.1326753877074, + "y": -3119.206715790251, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 668177099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2270, + "versionNonce": 1659893867, + "isDeleted": false, + "id": "TQz86ODTHbzzK9irhJ80f", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3117.3117205837234, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 519836517, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "rectangle", + "version": 3240, + "versionNonce": 2121947077, + "isDeleted": false, + "id": "rOmlZtGeNq9_e91gxLbjD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1059.4563522078788, + "y": -3085.374904372502, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.1354166666671, + "height": 18.283420138888914, + "seed": 1829568875, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2179, + "versionNonce": 2127278859, + "isDeleted": false, + "id": "658KXSO-GZ82wqvWZiHLd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3085.0189716659743, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 2001624773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2bb6f701", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2bb6f701" + }, + { + "type": "rectangle", + "version": 4028, + "versionNonce": 1799690021, + "isDeleted": false, + "id": "5GygS-naBD3Kkw026f4W5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1059.3773551421991, + "y": -3054.5388621662196, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 851.5651041666665, + "height": 19.252170138888914, + "seed": 845126667, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3006, + "versionNonce": 680991147, + "isDeleted": false, + "id": "XEiLYrFiyJHQvcJpmPC44", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3052.3235910486846, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1509965349, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "text", + "version": 3961, + "versionNonce": 591456901, + "isDeleted": false, + "id": "GMmTa1WkiHTvF2tT8fdRx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1130.0109364425653, + "y": -2743.690899866534, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1942348459, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4065, + "versionNonce": 1568451659, + "isDeleted": false, + "id": "IgxCLZ71St0f63RD0sfwC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1130.2978682607454, + "y": -2729.91107032108, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2113876357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4068, + "versionNonce": 1194021349, + "isDeleted": false, + "id": "mWPorCoPHenCwnd7k_HtN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1130.322808164593, + "y": -2716.741599167234, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1240094027, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2380, + "versionNonce": 290908907, + "isDeleted": false, + "id": "e0TJ4uY5yTqmVJW_s52_A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1343.8876985148208, + "y": -3151.926767873584, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 1619572965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 2513, + "versionNonce": 68275525, + "isDeleted": false, + "id": "CayKn3uSd3hTG7GbZWdtM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1703.348636014819, + "y": -3153.719736623584, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 1411871723, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 2284, + "versionNonce": 1487951243, + "isDeleted": false, + "id": "Vn88uwgCgfODTdX-a3iNu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1598.6220735148208, + "y": -3117.430674123584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 2066371653, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "rectangle", + "version": 4151, + "versionNonce": 156359845, + "isDeleted": false, + "id": "piIVTIbzK0-yiVZMvCe5X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1058.3590526814878, + "y": -3021.038587589347, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 853.2057291666666, + "height": 19.28342013888891, + "seed": 1653063307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3113, + "versionNonce": 1388538923, + "isDeleted": false, + "id": "ZPmnXm8bnZvKDHBw-BIY9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3018.6809487004566, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 968983461, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "rectangle", + "version": 4249, + "versionNonce": 1050214405, + "isDeleted": false, + "id": "u3p4aNoYk_I3dfTyOtO_g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1058.3942089314878, + "y": -2988.663587589347, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 855.4440104166664, + "height": 20.138888888888903, + "seed": 1606792491, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3264, + "versionNonce": 1400549067, + "isDeleted": false, + "id": "_yKtUHTFLGEaMjJ-ynMmq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2986.1677886632838, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 813418245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "118785d9", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "118785d9" + }, + { + "type": "text", + "version": 2391, + "versionNonce": 971290469, + "isDeleted": false, + "id": "Z4-_m3bfavABdB1A1pJ_L", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3084.516611623584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2068568011, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 2336, + "versionNonce": 1299225963, + "isDeleted": false, + "id": "ICNQU7nKoJYX5y6bTGjKw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3051.536142873584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 299277925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 2365, + "versionNonce": 1971487429, + "isDeleted": false, + "id": "2iZcjardkjL5vVwc7FE26", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -3019.3699168949397, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 322217579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2344, + "versionNonce": 2079307787, + "isDeleted": false, + "id": "a_8AyM_XsI_Tty3ELgVDV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2988.290049123584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1688177093, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "text", + "version": 2361, + "versionNonce": 1175446053, + "isDeleted": false, + "id": "5DVVoEwHwkEdaoG1ffVxQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1598.8095735148208, + "y": -3085.872080373584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 257, + "height": 20, + "seed": 1581949195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab" + }, + { + "type": "text", + "version": 2449, + "versionNonce": 1290960555, + "isDeleted": false, + "id": "Ak6Ggynr85K6-hvM1w7Xi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1599.7392610148208, + "y": -3052.481455373584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 2046036261, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "text", + "version": 2535, + "versionNonce": 276452741, + "isDeleted": false, + "id": "hLUIbvfih0EMeb7Oekwb7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1599.4931672648208, + "y": -3019.485361623584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 1443383211, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "text", + "version": 2600, + "versionNonce": 186872139, + "isDeleted": false, + "id": "wLPBYz_8gigbPnAaF5vDU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1599.7783235148208, + "y": -2987.536142873584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 591502469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "text", + "version": 2238, + "versionNonce": 1073700069, + "isDeleted": false, + "id": "Ob9EgrpXMX2gErpCayDQm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -3115.512705373584, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1620580939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3328afab", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3328afab" + }, + { + "type": "rectangle", + "version": 3310, + "versionNonce": 1205669867, + "isDeleted": false, + "id": "rvdnIF3hq3J9C5zBW0ukD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1063.052412056487, + "y": -2951.920257456918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 675660773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2390, + "versionNonce": 2083289157, + "isDeleted": false, + "id": "Dqwji45nAMFLWhhOXblw2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2949.8829310680276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 987011307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2412, + "versionNonce": 86629003, + "isDeleted": false, + "id": "Qd8EGd1UM59L_lqaJj8Cy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1602.5379039335994, + "y": -2950.14421579025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 230, + "height": 20, + "seed": 2098069317, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on " + }, + { + "type": "text", + "version": 2359, + "versionNonce": 517941157, + "isDeleted": false, + "id": "_PU8Ew-5xYuMG7kqKLtag", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2948.35515329025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 575161227, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3390, + "versionNonce": 532959531, + "isDeleted": false, + "id": "vDC-QJAOJElC2mAflUJf7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1063.204755806487, + "y": -2917.271819956918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 938987173, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2471, + "versionNonce": 1782901509, + "isDeleted": false, + "id": "mLy-tmwHAgYi6owwC1OHp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2915.0963335308547, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1059953195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 2493, + "versionNonce": 2031547339, + "isDeleted": false, + "id": "VFRJLeLe8zcBrkA1VXcmQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1602.6941539335994, + "y": -2915.49577829025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 1202762245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "text", + "version": 2441, + "versionNonce": 2128298597, + "isDeleted": false, + "id": "vhXbl1FtNgG06YbGwsvMR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2913.70671579025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1315904715, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3511, + "versionNonce": 1631339115, + "isDeleted": false, + "id": "KYpD4NpQcFprhg3QF09TO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1064.431318306487, + "y": -2884.299163706918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1765157221, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2590, + "versionNonce": 292531653, + "isDeleted": false, + "id": "MHvzV7Cp8XAuRHc5eaPYc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2882.1290248180276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 195513195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "text", + "version": 2612, + "versionNonce": 1090436363, + "isDeleted": false, + "id": "9pglgCozY6d4DaVc9RpNz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1603.9207164335994, + "y": -2882.39030954025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 1574286533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "text", + "version": 2559, + "versionNonce": 1629465893, + "isDeleted": false, + "id": "zlW_Fl_Bb-NnXHV4pCWF1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2880.60124704025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1528866315, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3480, + "versionNonce": 64545707, + "isDeleted": false, + "id": "yMZnOQpPHokpJpg86BqYd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1064.939130806487, + "y": -2851.154632456918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1630327845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2561, + "versionNonce": 1834532997, + "isDeleted": false, + "id": "AcpToHr0wiN-SUz7ioGhX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2849.1173060680276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 869641387, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2586, + "versionNonce": 1106589259, + "isDeleted": false, + "id": "GhhxmWQDd825JG1fttqTL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1604.2918101835994, + "y": -2849.37859079025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 258, + "height": 20, + "seed": 1596524421, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear" + }, + { + "type": "text", + "version": 2530, + "versionNonce": 1809344485, + "isDeleted": false, + "id": "FaObkie0n6My9wYsBY-_i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2847.58952829025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1232133963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3566, + "versionNonce": 707671275, + "isDeleted": false, + "id": "aGHbDOOfxADePM3X9f9_X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1064.732099556487, + "y": -2818.193694956918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1778896613, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2646, + "versionNonce": 2125210437, + "isDeleted": false, + "id": "BYP1T8CHQCLxfRPp-2XhV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2816.1563685680276, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1984740843, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 2670, + "versionNonce": 739139467, + "isDeleted": false, + "id": "ktPKuhPR8o2SrsGoHAQod", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1604.2214976835994, + "y": -2816.41765329025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 1884727877, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "text", + "version": 2617, + "versionNonce": 707883685, + "isDeleted": false, + "id": "m14jWpBDhHMI41l861_06", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2814.62859079025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1702086795, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756424, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "18dd7c7d", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "18dd7c7d" + }, + { + "type": "rectangle", + "version": 3678, + "versionNonce": 1641035307, + "isDeleted": false, + "id": "Jaz9akBQ5drADFj_h5k3U", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1065.911787056487, + "y": -2783.521819956918, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 854792613, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2748, + "versionNonce": 185980421, + "isDeleted": false, + "id": "d25jgMfaMO9yM2ysSd-3l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1228.2043151184653, + "y": -2781.3463335308547, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2090893099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2771, + "versionNonce": 979253451, + "isDeleted": false, + "id": "5GMFJXb8da4Ea4qUByEcR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1605.4011851835994, + "y": -2781.61296579025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 2064293125, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 2717, + "versionNonce": 1280757093, + "isDeleted": false, + "id": "LI93PM8ubJnA1v8jp9LSS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1103.206304832458, + "y": -2779.82390329025, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 104686027, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "863461a7", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "863461a7" + }, + { + "type": "text", + "version": 4046, + "versionNonce": 1666377579, + "isDeleted": false, + "id": "UJEWdghA0qA2_86ZnIMPQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1363.3891287252354, + "y": -2749.3573334018056, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 270185573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4150, + "versionNonce": 1564596421, + "isDeleted": false, + "id": "dRbJGcMj4YIPXgdj_uRo0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1363.6760605434156, + "y": -2735.5775038563515, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 459599979, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4153, + "versionNonce": 1928905227, + "isDeleted": false, + "id": "Jj9zqbedemJypWYiDMevx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1363.7010004472631, + "y": -2722.408032702506, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1844502469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4119, + "versionNonce": 1735686181, + "isDeleted": false, + "id": "naWsTnXqPGvf7IIiVnVR4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1747.0163608680896, + "y": -2750.3227351875194, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1306635019, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4223, + "versionNonce": 1380599979, + "isDeleted": false, + "id": "VOnuKyleBI4xXqwYvq-qk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1747.3032926862697, + "y": -2736.5429056420653, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 984260389, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4226, + "versionNonce": 81537925, + "isDeleted": false, + "id": "cxpIRZSCs2xEWHQWjtfGj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1747.3282325901173, + "y": -2723.3734344882196, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 305009067, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 1394, + "versionNonce": 1727134539, + "isDeleted": false, + "id": "FggqNXx6tTOZHDsxNo4p9", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": 1017.1145488201892, + "y": -3121.117948431154, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 2092266117, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 3148, + "versionNonce": 920609797, + "isDeleted": false, + "id": "2SXnjF-uLZt9FtMrYnMdh", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 877.2096688972838, + "y": -2982.014312787203, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 207, + "height": 25, + "seed": 56518469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655220782246, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Insert order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Insert order of rows" + }, + { + "type": "rectangle", + "version": 3171, + "versionNonce": 2102024683, + "isDeleted": false, + "id": "cs-7A9DnBR90lUlF_z21A", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1600.3603849388564, + "y": -2556.777389227287, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 480.7338169642854, + "seed": 211623333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2319, + "versionNonce": 378588741, + "isDeleted": false, + "id": "ZMNIRHHI2PhPIJpCIrWnc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1080.1079847058572, + "y": -2557.53886771191, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 123.92578124999996, + "height": 480.4825148809527, + "seed": 1837677355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2004, + "versionNonce": 1918755979, + "isDeleted": false, + "id": "XIiuUmm-61NzditdX3YI1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1093.9625388579207, + "y": -2551.56043309088, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 97, + "height": 25, + "seed": 416555269, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "fingerprint", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fingerprint" + }, + { + "type": "rectangle", + "version": 2912, + "versionNonce": 1447607717, + "isDeleted": false, + "id": "XcOAsEwJjgTAGEzhnEQxX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1229.4771193689367, + "y": -2559.6926252875837, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 482.7204241071425, + "seed": 649993675, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2980, + "versionNonce": 501685035, + "isDeleted": false, + "id": "SBR25gx8jWVi0yq3Xh6O5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1072.6846776526654, + "y": -2516.4822813403835, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1108588645, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2061, + "versionNonce": 1812709637, + "isDeleted": false, + "id": "I7040dqTZ0Vndh5VnamBS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2514.444954951493, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1684941931, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3C59CCDC5962FCA4BAE40163DCFC3DAF", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3C59CCDC5962FCA4BAE40163DCFC3DAF" + }, + { + "type": "rectangle", + "version": 3030, + "versionNonce": 2085649867, + "isDeleted": false, + "id": "r6WlOIc2znxgBiy86jVyA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1073.0083544728368, + "y": -2482.6504699226343, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.1354166666671, + "height": 18.283420138888914, + "seed": 36266949, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1992, + "versionNonce": 223828069, + "isDeleted": false, + "id": "N_SEJs8MeFCsyR0gPl1z1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2482.152206033744, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 442722059, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "18dd7c7d", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "18dd7c7d" + }, + { + "type": "rectangle", + "version": 3818, + "versionNonce": 414485611, + "isDeleted": false, + "id": "yx4cpT8hVGr2KdPtb10o2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1072.929357407157, + "y": -2451.814427716352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 851.5651041666665, + "height": 19.252170138888914, + "seed": 1026728741, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2819, + "versionNonce": 1677263813, + "isDeleted": false, + "id": "QfD2vFCeYTKY3vH70DABZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2449.4567888274614, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1595428267, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "2bb6f701", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "2bb6f701" + }, + { + "type": "text", + "version": 3751, + "versionNonce": 920504075, + "isDeleted": false, + "id": "uHUECWkNLl5cB8LZPB2dy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.5629387075232, + "y": -2140.966465416666, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 2006775429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3855, + "versionNonce": 68043557, + "isDeleted": false, + "id": "tg__PH_vVPuJ5HB-2_B1X", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.8498705257034, + "y": -2127.186635871212, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 364339275, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3858, + "versionNonce": 1028042155, + "isDeleted": false, + "id": "foHDXehdypmmzTKYti--r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1143.874810429551, + "y": -2114.017164717366, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1277550053, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2170, + "versionNonce": 570726021, + "isDeleted": false, + "id": "SSvLfCiy8xV4IENLMPHeB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1357.4397007797788, + "y": -2549.2023334237165, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 45, + "height": 25, + "seed": 1478172395, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "hash", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "hash" + }, + { + "type": "text", + "version": 2303, + "versionNonce": 1595523147, + "isDeleted": false, + "id": "GURelP14oOUMYX3lOXa3_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1716.900638279776, + "y": -2550.9953021737165, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 74, + "height": 25, + "seed": 567990597, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "content", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "content" + }, + { + "type": "text", + "version": 2075, + "versionNonce": 144276965, + "isDeleted": false, + "id": "4e7TW-vPLWZFiXFj8eotN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.174075779776, + "y": -2514.7062396737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 285, + "height": 20, + "seed": 550373771, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast database", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast database" + }, + { + "type": "rectangle", + "version": 3941, + "versionNonce": 103907051, + "isDeleted": false, + "id": "UIGEcB_CIuX4WhiVXVDbc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1071.9110549464458, + "y": -2418.3141531394795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 853.2057291666666, + "height": 19.28342013888891, + "seed": 572090533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2926, + "versionNonce": 1322940741, + "isDeleted": false, + "id": "TYeoeoxYERLcL2TgxgzVb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2415.956514250589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 889888811, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "3328afab", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "3328afab" + }, + { + "type": "rectangle", + "version": 4039, + "versionNonce": 2098751883, + "isDeleted": false, + "id": "AaYO3_wRGBCBy05XW_WcT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1071.9462111964458, + "y": -2385.9391531394795, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 855.4440104166664, + "height": 20.138888888888903, + "seed": 1854868485, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3077, + "versionNonce": 1311049893, + "isDeleted": false, + "id": "-gPTxkSoRh-xP1h-kZTq3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2383.581514250589, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1320903371, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "text", + "version": 2181, + "versionNonce": 1493762091, + "isDeleted": false, + "id": "vaSMbBP2UqbNGMkvGUP9i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2481.7921771737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 389628773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6A0CB5788F85BD22EF38D6981030E3E2", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6A0CB5788F85BD22EF38D6981030E3E2" + }, + { + "type": "text", + "version": 2125, + "versionNonce": 1478929413, + "isDeleted": false, + "id": "mzLMk3hrw02k_22zqPwzh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2448.8117084237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 108712299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "5C61797014DF8C368A0DDE864B47ED29", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "5C61797014DF8C368A0DDE864B47ED29" + }, + { + "type": "text", + "version": 2153, + "versionNonce": 602784459, + "isDeleted": false, + "id": "ThnFZelW7BdLRSn7A8SNF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2416.5031146737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1348832965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "6ABA4490395106E2CA07B41C80F7B8AC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "6ABA4490395106E2CA07B41C80F7B8AC" + }, + { + "type": "text", + "version": 2133, + "versionNonce": 752673637, + "isDeleted": false, + "id": "SX64nWN7D66InkhVzej8m", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.8986851547788, + "y": -2385.5656146737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2106813451, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "8505ABB11F7C82F9C9F19F84E54F15FC", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "8505ABB11F7C82F9C9F19F84E54F15FC" + }, + { + "type": "text", + "version": 2152, + "versionNonce": 1180774763, + "isDeleted": false, + "id": "qv3HxGA6VQtsykg4_HuLP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.361575779776, + "y": -2483.1476459237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 267, + "height": 20, + "seed": 1756458533, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Eart", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Eart" + }, + { + "type": "text", + "version": 2240, + "versionNonce": 815083205, + "isDeleted": false, + "id": "ZTRSyV96X4d_zq4l6em6c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.291263279776, + "y": -2449.7570209237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 265, + "height": 20, + "seed": 1207939755, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast datab ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast datab " + }, + { + "type": "text", + "version": 2326, + "versionNonce": 833473547, + "isDeleted": false, + "id": "n26vDr6kFrObRcl3y62Qf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.045169529776, + "y": -2416.7609271737165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 249, + "height": 20, + "seed": 2131386757, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast data", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast data" + }, + { + "type": "text", + "version": 2391, + "versionNonce": 1642925605, + "isDeleted": false, + "id": "W5n5NwSo3qMHtNjCFcCPG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.330325779776, + "y": -2384.8117084237165, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 268, + "height": 20, + "seed": 376055115, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databa", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databa" + }, + { + "type": "text", + "version": 2053, + "versionNonce": 1238241963, + "isDeleted": false, + "id": "l4GMlq1nUD6JdgRADh8bQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2512.9852840177414, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 2024663269, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "118785d9", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "118785d9" + }, + { + "type": "rectangle", + "version": 3100, + "versionNonce": 265421189, + "isDeleted": false, + "id": "7ESgbFufVAwPyTdg3ck3b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1076.604414321445, + "y": -2349.19582300705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 539837419, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2180, + "versionNonce": 258770251, + "isDeleted": false, + "id": "Azc3Mjcjeo6ak6O1nCLmH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2347.1584966181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 925467717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "AB99DD11D859EA9FB2ECFC55B91E8274", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "AB99DD11D859EA9FB2ECFC55B91E8274" + }, + { + "type": "text", + "version": 2204, + "versionNonce": 1333889253, + "isDeleted": false, + "id": "CeribvcC7eozU7TRuIIgD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1615.8911695720117, + "y": -2347.419781340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 277, + "height": 20, + "seed": 1297321611, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "ClickHouse is a very fast databas", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse is a very fast databas" + }, + { + "type": "text", + "version": 2173, + "versionNonce": 165913579, + "isDeleted": false, + "id": "yIW3bhE3CZjiX1KhTbvAW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2345.630718840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 240825253, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "57f2ca5b", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "57f2ca5b" + }, + { + "type": "rectangle", + "version": 3180, + "versionNonce": 847848517, + "isDeleted": false, + "id": "Rz2QFLoi_SQ5TYU5Vcj_v", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1076.756758071445, + "y": -2314.54738550705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 546800939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2260, + "versionNonce": 1899884171, + "isDeleted": false, + "id": "TPxPr0hYyp0t1yVUisQTW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2312.5100591181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 2054092549, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756425, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "B15A703B4C1C6664787AD94EEE4506BA", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "B15A703B4C1C6664787AD94EEE4506BA" + }, + { + "type": "text", + "version": 2284, + "versionNonce": 1019630501, + "isDeleted": false, + "id": "L-BNuWh_TloUbzraY-NC3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1616.2461561985547, + "y": -2312.771343840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 275, + "height": 20, + "seed": 1633920971, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Earth", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Earth" + }, + { + "type": "text", + "version": 2255, + "versionNonce": 406185259, + "isDeleted": false, + "id": "1HnQEmDnaHkljgWE0JSuv", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2310.982281340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 367251045, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "863461a7", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "863461a7" + }, + { + "type": "rectangle", + "version": 3301, + "versionNonce": 442930949, + "isDeleted": false, + "id": "buFcLgpz7ewIeLbBb1Lr3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1077.983320571445, + "y": -2281.57472925705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 97678955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2380, + "versionNonce": 372639691, + "isDeleted": false, + "id": "0RE1Jbpg_vMl6EibPBkAX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2279.4045903681595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1334229445, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "192AB9EA5BB13665876599744F2AA82B", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "192AB9EA5BB13665876599744F2AA82B" + }, + { + "type": "text", + "version": 2402, + "versionNonce": 367488613, + "isDeleted": false, + "id": "tsllb0cWUKQQGbQPMqwF0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.4727186985547, + "y": -2279.665875090382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 251, + "height": 20, + "seed": 1554936075, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ea", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ea" + }, + { + "type": "text", + "version": 2372, + "versionNonce": 827905643, + "isDeleted": false, + "id": "4jfvtxNQGA09cy6dFaXUe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2277.876812590382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1618295077, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3270, + "versionNonce": 1310087621, + "isDeleted": false, + "id": "3v0Rr2tn8Sn7dFDPdLp0B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1078.491133071445, + "y": -2248.43019800705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 2003965867, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2351, + "versionNonce": 141086987, + "isDeleted": false, + "id": "xlCFLqVWt6eKKnphi6qDw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2246.3928716181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 35441797, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "80F16EDFC256F2FE7AD3E80C1576F312", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "80F16EDFC256F2FE7AD3E80C1576F312" + }, + { + "type": "text", + "version": 2377, + "versionNonce": 739301669, + "isDeleted": false, + "id": "PpP6W-DDGzjwlHI4z_XV-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.8438124485547, + "y": -2246.654156340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 241, + "height": 20, + "seed": 1413999179, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on E", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on E" + }, + { + "type": "text", + "version": 2343, + "versionNonce": 2095085483, + "isDeleted": false, + "id": "mBWyoxQkH5NKPtXvREJxK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2244.865093840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 1681585125, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3356, + "versionNonce": 423914629, + "isDeleted": false, + "id": "DyC6DbR7jBZipIzPpkjm4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1078.284101821445, + "y": -2215.46926050705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 1208641771, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2436, + "versionNonce": 1558858315, + "isDeleted": false, + "id": "HhwfOxhsnyrbUoMifhQLj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2213.4319341181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 1658662725, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "890D028AC1FE90659804F7D02909EB20", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "890D028AC1FE90659804F7D02909EB20" + }, + { + "type": "text", + "version": 2461, + "versionNonce": 1970181093, + "isDeleted": false, + "id": "GZ1PxH32TYCHCyWHRaE8l", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1617.7734999485547, + "y": -2213.693218840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 222, + "height": 20, + "seed": 675550091, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on" + }, + { + "type": "text", + "version": 2430, + "versionNonce": 1298188523, + "isDeleted": false, + "id": "z4lyJRB_LYgIr3YOBTYD3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2211.904156340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 2086731429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "rectangle", + "version": 3457, + "versionNonce": 1285345093, + "isDeleted": false, + "id": "EJE8q-EeutM9aRtA4aBRV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1079.463789321445, + "y": -2180.79738550705, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 850.0221354166672, + "height": 22.384982638888463, + "seed": 892299819, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2537, + "versionNonce": 1942909835, + "isDeleted": false, + "id": "I5rfO39QfMpVSmJAozcRO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1241.898685154778, + "y": -2178.7600591181595, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 301, + "height": 20, + "seed": 125035013, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "9D4106CE2FC6462EA4E1E57D351B6823", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "9D4106CE2FC6462EA4E1E57D351B6823" + }, + { + "type": "text", + "version": 2562, + "versionNonce": 1294769829, + "isDeleted": false, + "id": "8HzZOdUgoT2PLGxvdByTC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1618.9531874485547, + "y": -2178.888531340382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 266, + "height": 20, + "seed": 1136061643, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "fastest OLAP database on Ear ", + "baseline": 14, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "fastest OLAP database on Ear " + }, + { + "type": "text", + "version": 2531, + "versionNonce": 1617807915, + "isDeleted": false, + "id": "3Fygermvv_cPRNw6bHjBT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1106.5056730020015, + "y": -2177.099468840382, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 76, + "height": 20, + "seed": 689133925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 3, + "text": "cd47a305", + "baseline": 16, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "cd47a305" + }, + { + "type": "text", + "version": 3836, + "versionNonce": 2110489093, + "isDeleted": false, + "id": "MYHf44qUxLlQPvrtLnqsA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1376.9411309901934, + "y": -2146.6328989519375, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 661986155, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3940, + "versionNonce": 942230731, + "isDeleted": false, + "id": "9A6--91M-MxZbzevtkcsj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1377.2280628083736, + "y": -2132.8530694064834, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 177005765, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3943, + "versionNonce": 863435109, + "isDeleted": false, + "id": "fq-GUbC5lAvrZD5sRPzsk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1377.2530027122211, + "y": -2119.6835982526377, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1555330571, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3909, + "versionNonce": 513506155, + "isDeleted": false, + "id": "CG8JNZxXXpIPDFhE_fFNz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1760.5683631330467, + "y": -2147.5983007376517, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1333658661, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4013, + "versionNonce": 1199342789, + "isDeleted": false, + "id": "OfHlKzy5ypA4iKK5oAORu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1760.8552949512268, + "y": -2133.8184711921976, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1919909035, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4016, + "versionNonce": 1611585035, + "isDeleted": false, + "id": "1GwOVXkrbl34dhHvTwe3I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1760.8802348550744, + "y": -2120.649000038352, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1272199045, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "arrow", + "version": 1184, + "versionNonce": 747835211, + "isDeleted": false, + "id": "hLbMOnJ8wA8gbnwN6SyHZ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 0.011736636076980389, + "x": 1030.6665510851471, + "y": -2518.3935139812866, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 1.1709792313908167, + "height": 403.0957201897115, + "seed": 804641349, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.1709792313908167, + 403.0957201897115 + ] + ] + }, + { + "type": "text", + "version": 3626, + "versionNonce": 363392491, + "isDeleted": false, + "id": "UXXtOG9DpEI8-U9p6lBNf", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 886.6210693069197, + "y": -2348.737919145162, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 1145330187, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "text", + "version": 2245, + "versionNonce": 994405835, + "isDeleted": false, + "id": "nn-lgBCpaIsETWvX7_ubF", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 2038.7288147339104, + "y": -2394.4160930605126, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 252, + "height": 50, + "seed": 2129653963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "aPsf6_lhligZN5UjoNMUq", + "type": "arrow" + } + ], + "updated": 1655228267172, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "similar content is stored \nclose to each other", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "similar content is stored \nclose to each other" + }, + { + "type": "arrow", + "version": 2794, + "versionNonce": 917548843, + "isDeleted": false, + "id": "nwotZcDtqdhjFmyZiRrSd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1963.7788323688446, + "y": -2506.2309720467974, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 79.49015283162282, + "height": 173.95942343925103, + "seed": 484218213, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 11.585310767826627, + -18.40931918646651 + ], + [ + 15.779906463149969, + 1.8798248465053824 + ], + [ + 16.66393948236995, + 57.56153323092345 + ], + [ + 17.30249991839189, + 113.6105637117851 + ], + [ + 19.11368951874503, + 155.55010425278454 + ], + [ + 32.76395546279845, + 154.36170923487882 + ], + [ + 79.49015283162282, + 143.29681888844888 + ] + ] + }, + { + "type": "arrow", + "version": 2249, + "versionNonce": 1297444101, + "isDeleted": false, + "id": "CYEG1rZpw33wJZ2cC3B6R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 1967.751481285718, + "y": -2167.2606186295434, + "strokeColor": "#15223c", + "backgroundColor": "transparent", + "width": 75.28175621842279, + "height": 209.8449522449944, + "seed": 485334891, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 14.327458611046485, + 13.357711338492038 + ], + [ + 18.59813121582617, + -42.64925362914658 + ], + [ + 19.223914873307095, + -132.31449425346148 + ], + [ + 20.97039282122862, + -169.03261315165378 + ], + [ + 30.03673441651118, + -184.06134597876843 + ], + [ + 75.28175621842279, + -196.48724090650234 + ] + ] + }, + { + "type": "text", + "version": 2286, + "versionNonce": 1858572747, + "isDeleted": false, + "id": "rwFR0EjSH9E76bSP0Kfaq", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280512587460733, + "x": 2036.1975066815185, + "y": -2296.232344800622, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 262, + "height": 50, + "seed": 701407429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "aPsf6_lhligZN5UjoNMUq", + "type": "arrow" + } + ], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "very good for compression \nof content column!", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "very good for compression \nof content column!" + }, + { + "type": "arrow", + "version": 511, + "versionNonce": 193690731, + "isDeleted": false, + "id": "aPsf6_lhligZN5UjoNMUq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2158.485991356077, + "y": -2343.3274777106535, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 2.3327224224058227, + "height": 45.50622035281913, + "seed": 410810891, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655228267173, + "link": null, + "locked": false, + "startBinding": { + "elementId": "nn-lgBCpaIsETWvX7_ubF", + "focus": 0.059865761350412605, + "gap": 1.071836871528376 + }, + "endBinding": { + "elementId": "rwFR0EjSH9E76bSP0Kfaq", + "focus": -0.03793177709135198, + "gap": 1.605866294518819 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "triangle", + "points": [ + [ + 0, + 0 + ], + [ + 2.3327224224058227, + 45.50622035281913 + ] + ] + }, + { + "type": "text", + "version": 1003, + "versionNonce": 1395204203, + "isDeleted": false, + "id": "MZk4m-pedbhAdY_Co7VYz", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 1016.0866577275192, + "y": -2618.8800827169925, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 328, + "height": 25, + "seed": 1760519915, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756426, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (fingerprint, hash) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (fingerprint, hash) " + }, + { + "type": "rectangle", + "version": 3047, + "versionNonce": 1473171493, + "isDeleted": false, + "id": "DIWj18WjJ-lmBFysLqRrO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2803.980531649605, + "y": -4252.547768976054, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 241.50809398580586, + "seed": 915874117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2765, + "versionNonce": 1835102379, + "isDeleted": false, + "id": "Fom-vC3182nzSwkFFkKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2433.1580579336414, + "y": -4255.265991942324, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 239.25119804797578, + "seed": 2061123979, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3422, + "versionNonce": 673940357, + "isDeleted": false, + "id": "EQTUoYwNwHxClmXWg4Fjk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2424.754557287595, + "y": -4208.919428995535, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1068.2330070953583, + "height": 19.051750545273826, + "seed": 1745662117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2990, + "versionNonce": 1692672843, + "isDeleted": false, + "id": "ZG16-HFXnQejdegFgeVTJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2424.733183229365, + "y": -4179.906530684606, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1070.7482094771276, + "height": 19.953252937808696, + "seed": 1892669483, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3767, + "versionNonce": 1700448997, + "isDeleted": false, + "id": "voXBNvXF_q7ST3xgEK9Al", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2422.516909377971, + "y": -4148.686376461232, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1073.5800802604406, + "height": 20.124944492145907, + "seed": 651777029, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756426, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3694, + "versionNonce": 2146051653, + "isDeleted": false, + "id": "II3NrBBIAn0wXhM3pj1Os", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2593.6059569801632, + "y": -4132.188274932398, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1593477989, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3798, + "versionNonce": 1743129739, + "isDeleted": false, + "id": "CvXhSR11WT_xyM0CyOugX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2593.8928887983434, + "y": -4118.408445386944, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 206702955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3801, + "versionNonce": 2058818981, + "isDeleted": false, + "id": "7AWIWUHWa5OKZdvLTZ5jp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2593.917828702191, + "y": -4105.238974233098, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 549312197, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2178, + "versionNonce": 2769707, + "isDeleted": false, + "id": "iMs1mGIDuEALlrFKV1neV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2539.913357494175, + "y": -4179.280465143762, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 96, + "height": 20, + "seed": 868459531, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "larger value" + }, + { + "type": "text", + "version": 2373, + "versionNonce": 552540421, + "isDeleted": false, + "id": "20OE-TjWFLvbKWeXG9utN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2573.9514048565397, + "y": -4247.556757632726, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 25, + "seed": 381728293, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid" + }, + { + "type": "text", + "version": 2072, + "versionNonce": 2079237579, + "isDeleted": false, + "id": "IRtQZLg9YdVRQCN_qiMPG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2918.5913231655086, + "y": -4209.379651756777, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 87, + "height": 20, + "seed": 996731563, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "some value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "some value" + }, + { + "type": "text", + "version": 2183, + "versionNonce": 2081402981, + "isDeleted": false, + "id": "TF51Wp7Mi52qSpDrSwEI8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2569.813159056327, + "y": -4210.1691984324925, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 42, + "height": 20, + "seed": 1005627781, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "value" + }, + { + "type": "text", + "version": 2278, + "versionNonce": 1380824171, + "isDeleted": false, + "id": "SlC3bHAxWSaZUC3yJ9nY0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2524.2436114951693, + "y": -4146.865307776445, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 137, + "height": 20, + "seed": 938237259, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "even larger value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "even larger value" + }, + { + "type": "text", + "version": 2162, + "versionNonce": 166091717, + "isDeleted": false, + "id": "uK1AAnKdL7t4njBwjtyd0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2906.2225134816485, + "y": -4178.222668848122, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 110, + "height": 20, + "seed": 1368076517, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "another value" + }, + { + "type": "text", + "version": 2262, + "versionNonce": 856813323, + "isDeleted": false, + "id": "Zc3Ndh3N0TX3gHRx67nCk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2891.918074345131, + "y": -4148.057240998274, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 145, + "height": 20, + "seed": 1151892459, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "and another value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "and another value" + }, + { + "type": "text", + "version": 3821, + "versionNonce": 848337701, + "isDeleted": false, + "id": "Qnwq34wBA_Yn5GHGoCXNF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.780375447507, + "y": -4136.218605483367, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 354274373, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3925, + "versionNonce": 1890964907, + "isDeleted": false, + "id": "q8v2Oiu-YxvFgz8X4eoB5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2960.0673072656873, + "y": -4122.438775937913, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 765970059, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3928, + "versionNonce": 2122051205, + "isDeleted": false, + "id": "DT6wW4iW2ljcbSTKX1Nj_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2960.092247169535, + "y": -4109.269304784068, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 914750373, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3406, + "versionNonce": 1555783845, + "isDeleted": false, + "id": "ZFl1VMpSUuoQqj1fKGVJa", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 2240.8098152927696, + "y": -4139.1058534328995, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 219611589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1326, + "versionNonce": 1738811435, + "isDeleted": false, + "id": "b29q_TTX5bQlG1lF04j0n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": 2392.317081309096, + "y": -4241.934868053294, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 891726091, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 883, + "versionNonce": 1915880453, + "isDeleted": false, + "id": "kbEK8cwAkj88852ooyWMU", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2361.49429563893, + "y": -4306.261425271961, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 242, + "height": 25, + "seed": 347898149, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Mo-vgOTPvg0K-O6wFpWvS", + "type": "arrow" + }, + { + "id": "rh-38xKn85IlMvAGLOUuV", + "type": "arrow" + }, + { + "id": "kx0Y5XeLPP8gELJRVQBS8", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (uuid, ...) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (uuid, ...) " + }, + { + "type": "text", + "version": 2548, + "versionNonce": 2104580485, + "isDeleted": false, + "id": "unjQPjdlqcvQ-7t6JJehi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2909.5340805161545, + "y": -4249.466907755409, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 116, + "height": 25, + "seed": 157509989, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "some column", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "some column" + }, + { + "type": "rectangle", + "version": 3122, + "versionNonce": 1343139147, + "isDeleted": false, + "id": "7DGwFwHn--T_YN-lORdBr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2799.0735512437077, + "y": -3809.928161069573, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 316.050372753268, + "height": 299.2631095638441, + "seed": 2010639077, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "z0ua18VXNGMa8I6OgumX6", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 2858, + "versionNonce": 2138431717, + "isDeleted": false, + "id": "RE5dIgHaPRIU8XX9FeokO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2428.341884947379, + "y": -3812.646384035845, + "strokeColor": "#15223c", + "backgroundColor": "#ced4da", + "width": 324.710529003268, + "height": 301.1095767910746, + "seed": 35414507, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3240, + "versionNonce": 1140902891, + "isDeleted": false, + "id": "lOB5i5mUyRYPhxT8uKZET", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2419.868826100372, + "y": -3765.2352775872528, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 1455.890015988075, + "height": 17.817000343718874, + "seed": 96683589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2111, + "versionNonce": 305298501, + "isDeleted": false, + "id": "uK8PMuoQMKthsSwMSnZCT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2542.24296719588, + "y": -3766.372903102158, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 531557515, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 2975, + "versionNonce": 1031149195, + "isDeleted": false, + "id": "3buiGxc5YZf7fV09TFBM5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2419.673529706258, + "y": -3735.6170899792055, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 701.9936755952385, + "height": 18.283420138888914, + "seed": 678180261, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 3774, + "versionNonce": 226798501, + "isDeleted": false, + "id": "h9rVcRYLvf_rLepdLs6L7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2417.457255854864, + "y": -3704.630378130067, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 705.7503720238094, + "height": 18.68855406746024, + "seed": 198648619, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2242, + "versionNonce": 2066287915, + "isDeleted": false, + "id": "ypBDlZ3OepnNUFAk_bOeX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2466.4251605860727, + "y": -3801.882422728499, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 235, + "height": 25, + "seed": 452999429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "low cardinality column cl", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "low cardinality column cl" + }, + { + "type": "rectangle", + "version": 4184, + "versionNonce": 1905913605, + "isDeleted": false, + "id": "dkGxzdleJ9vItK83hAM7d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2419.261204173714, + "y": -3640.6838760724754, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 1056933323, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 3810, + "versionNonce": 8662987, + "isDeleted": false, + "id": "TRPj2IkRwz4EUs79oLwoO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2588.546303457056, + "y": -3693.568667025917, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1459408997, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3914, + "versionNonce": 1559217765, + "isDeleted": false, + "id": "QmGXJfO4WIm3YYDSYvIRH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2588.8332352752363, + "y": -3679.7888374804647, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1078105195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3917, + "versionNonce": 2141322859, + "isDeleted": false, + "id": "0UW4F-8GOLDRMcxLamP3r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2588.858175179084, + "y": -3666.619366326617, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1244625861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2360, + "versionNonce": 1112781253, + "isDeleted": false, + "id": "OwjPgrxMGgD02xhpWTPbu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2837.345380219596, + "y": -3800.942352090195, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 265, + "height": 25, + "seed": 1332399883, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "higher cardinality column ch", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "higher cardinality column ch" + }, + { + "type": "text", + "version": 2110, + "versionNonce": 55376139, + "isDeleted": false, + "id": "dscmqZUjoNGyg68BzjNMw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2948.752371782377, + "y": -3765.2191415863313, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 1286978341, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v1", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v1" + }, + { + "type": "text", + "version": 2184, + "versionNonce": 1258817547, + "isDeleted": false, + "id": "imRkuJ7JkPpzNm_-pcfe4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2947.2583169345316, + "y": -3733.769183191773, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 20, + "height": 40, + "seed": 1324529067, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216765915, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v2\n", + "baseline": 34, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v2\n" + }, + { + "type": "text", + "version": 2282, + "versionNonce": 1493147563, + "isDeleted": false, + "id": "r_M8Kjq5x_hKhQrI3MVi1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2948.234954252633, + "y": -3703.940877632926, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 20, + "height": 20, + "seed": 1459424901, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "v3", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "v3" + }, + { + "type": "text", + "version": 2388, + "versionNonce": 1879819397, + "isDeleted": false, + "id": "Sx_Zar6hDHyeNFMcDc-XN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2952.0488146237763, + "y": -3640.342685401804, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 17, + "height": 20, + "seed": 1845807179, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "vn", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "vn" + }, + { + "type": "text", + "version": 2206, + "versionNonce": 988049995, + "isDeleted": false, + "id": "5rbdwJGeoF5OKYM8Fqz69", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2543.9762639098085, + "y": -3736.304400080386, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 2009265637, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 2261, + "versionNonce": 696970213, + "isDeleted": false, + "id": "8Miy_qDZKNIHNsmwVOASx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2542.635109784303, + "y": -3706.024948141898, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 310085355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "text", + "version": 2390, + "versionNonce": 970322155, + "isDeleted": false, + "id": "oYQEsWzZQjDaoTI47e-8o", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2543.7444594930544, + "y": -3640.32495345048, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 88, + "height": 20, + "seed": 169144645, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "same value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "same value" + }, + { + "type": "rectangle", + "version": 4280, + "versionNonce": 1802381125, + "isDeleted": false, + "id": "TYeKcJqHSy_LK5_4B8yAd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 60, + "angle": 0, + "x": 2420.525834345527, + "y": -3598.7961772040985, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 704.6454613095239, + "height": 19.74100942460325, + "seed": 48329099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 2485, + "versionNonce": 1734253451, + "isDeleted": false, + "id": "yiIidIA18sodqB3ycKIvz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2956.313444795589, + "y": -3598.595724929312, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 14, + "height": 20, + "seed": 726696101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "...", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 2531, + "versionNonce": 940766885, + "isDeleted": false, + "id": "SxBO8JsgEVrk5FQOSZvCM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2526.874234794714, + "y": -3598.7187313738764, + "strokeColor": "#ffffff", + "backgroundColor": "#000000", + "width": 119, + "height": 20, + "seed": 1349584939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "different value", + "baseline": 14, + "textAlign": "right", + "verticalAlign": "top", + "containerId": null, + "originalText": "different value" + }, + { + "type": "text", + "version": 3934, + "versionNonce": 652336325, + "isDeleted": false, + "id": "c4Eqamnfr5_7DgFW6yExw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2957.1870924325503, + "y": -3692.723477022752, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 649253899, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4038, + "versionNonce": 374013451, + "isDeleted": false, + "id": "j6rxPUdJ063qDw5Oj1C8R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2957.4740242507305, + "y": -3678.943647477296, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1906083365, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4041, + "versionNonce": 108264485, + "isDeleted": false, + "id": "LJmiu3ipTGlutYvYONPj5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2957.498964154578, + "y": -3665.774176323452, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1760697003, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3902, + "versionNonce": 1207239851, + "isDeleted": false, + "id": "5U7vbrPfRlK4XVK04hKqy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.4881685019072, + "y": -3585.2033335627934, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1792178565, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4006, + "versionNonce": 558575493, + "isDeleted": false, + "id": "UCSiraGu-W8DsLJhxS9sn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.7751003200874, + "y": -3571.4235040173376, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1020235083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4009, + "versionNonce": 1340421963, + "isDeleted": false, + "id": "hi6xXhRlqbNmoBdau-cyt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2959.800040223935, + "y": -3558.2540328634936, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1672675557, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3959, + "versionNonce": 1973745381, + "isDeleted": false, + "id": "jGfRmsHgmqVkvGF6a6i37", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2589.7256883047808, + "y": -3585.858982634609, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 631614443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4063, + "versionNonce": 1551242731, + "isDeleted": false, + "id": "QXMxd3prM0IVx2_3TK2Jl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2590.012620122961, + "y": -3572.079153089155, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 835427397, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4066, + "versionNonce": 1578029637, + "isDeleted": false, + "id": "faWn-R1-cQn_GApNkuCIR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2590.0375600268085, + "y": -3558.9096819353094, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1467938443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 3489, + "versionNonce": 1823613067, + "isDeleted": false, + "id": "sK7VfQOROotGFdgDz4LV8", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 4.718370583150467, + "x": 2238.3048821077105, + "y": -3663.4858835954915, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 214, + "height": 25, + "seed": 486132645, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mDtk36bAZb0ES18oRT-RM", + "type": "arrow" + } + ], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "On-disk order of rows", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On-disk order of rows" + }, + { + "type": "arrow", + "version": 1410, + "versionNonce": 124141989, + "isDeleted": false, + "id": "W39ppyFfTgpN2nCjbvv_x", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 50, + "angle": 6.280591703300703, + "x": 2389.812148124038, + "y": -3766.3148982158878, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 2.6743717068054025, + "height": 233.1456198332944, + "seed": 555085099, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.6743717068054025, + 233.1456198332944 + ] + ] + }, + { + "type": "text", + "version": 1095, + "versionNonce": 2110689899, + "isDeleted": false, + "id": "GgNyTTqiK25-yc19gLLYR", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2346.581396012037, + "y": -3860.559734173385, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 276, + "height": 25, + "seed": 359337733, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "z0ua18VXNGMa8I6OgumX6", + "type": "arrow" + }, + { + "id": "rLvO1LgAa2qAv-FcJ26i-", + "type": "arrow" + }, + { + "id": "tHFRKN9bKZMgeFD1D9-g8", + "type": "arrow" + } + ], + "updated": 1655216859167, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "PRIMARY KEY (cl, ch, uuid) ", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "PRIMARY KEY (cl, ch, uuid) " + }, + { + "type": "text", + "version": 2494, + "versionNonce": 1247086533, + "isDeleted": false, + "id": "UpwfCJ_awvy0PjVOIUKi8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3307.9263503904244, + "y": -3800.287149328368, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 39, + "height": 25, + "seed": 1783663045, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid" + }, + { + "type": "text", + "version": 2593, + "versionNonce": 259353003, + "isDeleted": false, + "id": "1sjN3ggO5riGkc0WWRABY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3687.6629469798927, + "y": -3803.0398835287647, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 17, + "height": 25, + "seed": 1485602955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "...", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 3954, + "versionNonce": 1919985035, + "isDeleted": false, + "id": "bpIW6QzwIVkTuGWwJSfVI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3322.837371680836, + "y": -4137.058374484362, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 265134149, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4058, + "versionNonce": 645827749, + "isDeleted": false, + "id": "dngJEt6HpbIjp_4TYxXoM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3323.124303499016, + "y": -4123.278544938906, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1435447947, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 4061, + "versionNonce": 1878637611, + "isDeleted": false, + "id": "688DEMzqBIvbHCbQNumKD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3323.1492434028637, + "y": -4110.109073785062, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 7, + "height": 25, + "seed": 1947946917, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": ".", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "." + }, + { + "type": "text", + "version": 2790, + "versionNonce": 1924116485, + "isDeleted": false, + "id": "AvhaUY7ellA7nGo1jpYqR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3311.9127990988645, + "y": -4248.143049199147, + "strokeColor": "#15223c", + "backgroundColor": "#000000", + "width": 17, + "height": 25, + "seed": 1774102827, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655216756427, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "...", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "..." + }, + { + "type": "text", + "version": 639, + "versionNonce": 231553547, + "isDeleted": false, + "id": "pEcCstdY6Meu0oOIM_LZO", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2840.1912257413414, + "y": -4432.777279282515, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 545, + "height": 100, + "seed": 1008153515, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "anUfuQZGoFRmo_9HIl_zk", + "type": "arrow" + }, + { + "id": "1sq5PdmMU7wreMSi402mr", + "type": "arrow" + }, + { + "id": "MIYL2D5DHwTmp1HX6Oaiw", + "type": "arrow" + } + ], + "updated": 1655217195078, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid values are unique by definition\n\nClickHouse can't locally order rows that\nhave the same uuid value by values of other columns, ", + "baseline": 93, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid values are unique by definition\n\nClickHouse can't locally order rows that\nhave the same uuid value by values of other columns, " + }, + { + "type": "text", + "version": 3, + "versionNonce": 140737253, + "isDeleted": false, + "id": "AGAbEuIffQj2v1jEk-6yq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2867.8310707294304, + "y": -4681.581883296003, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 349, + "height": 25, + "seed": 713700229, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655217201182, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "uuid values are unique by definition", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "uuid values are unique by definition" + }, + { + "type": "text", + "version": 97, + "versionNonce": 1607587909, + "isDeleted": false, + "id": "_YZRdsVLRxyatgKZZKs2N", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": 2821.6809781577963, + "y": -4615.207979865381, + "strokeColor": "#15223c", + "backgroundColor": "#868e96", + "width": 436, + "height": 25, + "seed": 1037160939, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1655217248731, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "there are no rows with the same uuid value", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "there are no rows with the same uuid value" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/bad_skip_1.svg b/docs/ja/guides/best-practices/images/bad_skip_1.svg new file mode 100755 index 00000000000..73373679e38 --- /dev/null +++ b/docs/ja/guides/best-practices/images/bad_skip_1.svg @@ -0,0 +1,16 @@ + + + + + + + timestamp columnvisitor_idcolumnurlcolumnGranule 4072 8192 rows Granule 4073 8192 rows Granule 4074 8192 rows Granule 4075 8192 rows 2022-02-07 15:00:002022-02-07 16:00:002022-02-07 17:00:002022-02-07 18:00:0010011001100110011001 \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/simple_skip.svg b/docs/ja/guides/best-practices/images/simple_skip.svg new file mode 100755 index 00000000000..05e5019ad69 --- /dev/null +++ b/docs/ja/guides/best-practices/images/simple_skip.svg @@ -0,0 +1,16 @@ + + + + + + + my_key columnmy_valuecolumnGranule 61 8192 rows Granule 62 8192 rows Granule 63 8192 rows Granule 64 8192 rows 507904 ...516095524288 ...532479516096...524287516096...524288125124126128130127129131Skip IndexBlock of Two GranulesSkip IndexBlock of Two Granulesindex calc is set of (124, 125,126, 127) so blocknot skippedset of (128, 129,130, 131) so blockskipped \ No newline at end of file diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-01.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-01.png new file mode 100644 index 00000000000..ce0eb5e61c1 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-01.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-02.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-02.png new file mode 100644 index 00000000000..c8d52bfd64c Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-02.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-03.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03.png new file mode 100644 index 00000000000..30418ace1af Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-03a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03a.png new file mode 100644 index 00000000000..a65094ba3c4 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-03b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03b.png new file mode 100644 index 00000000000..30418ace1af Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-03b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-04.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-04.png new file mode 100644 index 00000000000..6cfa7562b8f Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-04.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-05.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-05.png new file mode 100644 index 00000000000..b642c107cb9 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-05.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-06.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-06.png new file mode 100644 index 00000000000..54db2c7ce2c Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-06.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-07.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-07.png new file mode 100644 index 00000000000..9f98588b105 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-07.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-08.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-08.png new file mode 100644 index 00000000000..cfad1bb9429 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-08.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-09a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09a.png new file mode 100644 index 00000000000..1e292904d91 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-09b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09b.png new file mode 100644 index 00000000000..1c07ec5acca Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-09c.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09c.png new file mode 100644 index 00000000000..4bf5c5ea034 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-09c.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-10.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-10.png new file mode 100644 index 00000000000..aa40aae9560 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-10.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-11.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-11.png new file mode 100644 index 00000000000..2d5e3e91e61 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-11.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12a.png new file mode 100644 index 00000000000..93cf2e3cb92 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-1.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-1.png new file mode 100644 index 00000000000..de082849c11 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-1.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-2.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-2.png new file mode 100644 index 00000000000..1f34b9f6612 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12b-2.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-1.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-1.png new file mode 100644 index 00000000000..71798945110 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-1.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-2.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-2.png new file mode 100644 index 00000000000..4b439ed992b Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-12c-2.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-13a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13a.png new file mode 100644 index 00000000000..062c0c5c598 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-13b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13b.png new file mode 100644 index 00000000000..0c49751debf Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-13b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-14a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14a.png new file mode 100644 index 00000000000..6b36d6ab603 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-14b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14b.png new file mode 100644 index 00000000000..97c9084ec7d Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-14b.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-15a.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15a.png new file mode 100644 index 00000000000..3161c59835a Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15a.png differ diff --git a/docs/ja/guides/best-practices/images/sparse-primary-indexes-15b.png b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15b.png new file mode 100644 index 00000000000..d9b8acc07c1 Binary files /dev/null and b/docs/ja/guides/best-practices/images/sparse-primary-indexes-15b.png differ diff --git a/docs/ja/guides/best-practices/partitioningkey.md b/docs/ja/guides/best-practices/partitioningkey.md new file mode 100644 index 00000000000..5a16c1f8d26 --- /dev/null +++ b/docs/ja/guides/best-practices/partitioningkey.md @@ -0,0 +1,11 @@ +--- +slug: /ja/optimize/partitioning-key +sidebar_label: パーティショニングキー +title: 低カーディナリティのパーティショニングキーを選ぶ +description: 低カーディナリティのパーティショニングキーを使用するか、パーティショニングキーを使用しないテーブルにする。 + +--- + +import Content from '@site/docs/ja/cloud/bestpractices/partitioningkey.md'; + + diff --git a/docs/ja/guides/best-practices/skipping-indexes.md b/docs/ja/guides/best-practices/skipping-indexes.md new file mode 100644 index 00000000000..3c1eaea6f45 --- /dev/null +++ b/docs/ja/guides/best-practices/skipping-indexes.md @@ -0,0 +1,185 @@ +--- +slug: /ja/optimize/skipping-indexes +sidebar_label: データスキッピング インデックス +sidebar_position: 2 +description: スキップインデックスにより、ClickHouseは一致しないことが保証されているデータの大きなチャンクを読み飛ばすことができます。 +--- + +# ClickHouseデータスキッピングインデックスの理解 + +## はじめに + +ClickHouseのクエリパフォーマンスに影響を与える要因は多くあります。ほとんどのシナリオで重要なのは、ClickHouseがクエリWHERE句の条件を評価する際に主キーを使用できるかどうかです。したがって、最も一般的なクエリパターンに適用される主キーを選択することが、効果的なテーブル設計のために不可欠です。 + +しかし、どんなに慎重に主キーを調整しても、必然的にそれを効率的に使用できないクエリのユースケースが存在します。ユーザーは通常、ClickHouseを使用して時系列データを扱いますが、同じデータを顧客ID、ウェブサイトのURL、製品番号などの他の業務次元に基づいて分析したいと考えることがよくあります。その場合、WHERE句の条件を適用するために各カラム値の全スキャンが必要になるため、クエリのパフォーマンスがかなり悪化する可能性があります。このような場合でも、ClickHouseは相対的に速いですが、数百万または数十億の個々の値を評価することは、主キーに基づくクエリよりもはるかに遅くなります。 + +伝統的なリレーショナルデータベースでは、この問題に対処する1つの方法として、テーブルに1つ以上の「二次」インデックスを付けることがあります。これは、データベースがディスク上で一致する行をO(log(n))時間で見つけることを可能にするb-tree構造です(nは行数)。しかし、ディスク上に追加する個別の行がないため、このタイプの二次インデックスはClickHouse(または他の列指向データベース)には適用できません。 + +代わりに、ClickHouseは異なる種類のインデックスを提供しており、特定の状況でクエリの速度を大幅に向上させることができます。これらの構造は「スキップ」インデックスとラベル付けされており、一致しないことが保証されているデータの大きなチャンクの読み込みをClickHouseがスキップできるようにします。 + +## 基本操作 + +ユーザーはMergeTreeファミリーのテーブルでのみデータスキッピングインデックスを使用できます。各データスキッピングには4つの主要な引数があります: + +- インデックス名。インデックス名は各パーティション内のインデックスファイルの作成に使用されます。また、インデックスをドロップまたはマテリアライズする際のパラメータとして必要です。 +- インデックス式。インデックス式はインデックスに格納される値の集合を計算するために使用されます。カラム、単純演算子、および/またはインデックスタイプによって決定された関数のサブセットの組み合わせが可能です。 +- TYPE。インデックスタイプは、各インデックスブロックの読み取りと評価をスキップできるかどうかを決定する計算を制御します。 +- GRANULARITY。 各インデックス付きブロックは GRANULARITY グラニュールから成ります。たとえば、主テーブルインデックスの粒度が8192行で、インデックスの粒度が4である場合、各インデックス付き「ブロック」は32768行になります。 + +ユーザーがデータスキッピングインデックスを作成すると、テーブルの各データパートディレクトリに2つの追加ファイルが作成されます。 + +- `skp_idx_{index_name}.idx`, には順序付けられた式の値が含まれています +- `skp_idx_{index_name}.mrk2`, には関連付けられたデータカラムファイルへの対応するオフセットが含まれています。 + +クエリを実行して関連するカラムファイルを読み取るときに、WHERE句のフィルター条件の一部がスキップインデックスの式と一致する場合、ClickHouseはインデックスファイルのデータを使用して、関連する各データブロックを処理する必要があるか、(主キーを適用することでブロックがすでに除外されていない限り)バイパスできるかを判断します。非常に簡単な例を挙げると、以下のようなテーブルに予測可能なデータがロードされているとします。 + +``` +CREATE TABLE skip_table +( + my_key UInt64, + my_value UInt64 +) +ENGINE MergeTree primary key my_key +SETTINGS index_granularity=8192; + +INSERT INTO skip_table SELECT number, intDiv(number,4096) FROM numbers(100000000); +``` + +主キーを使用しない単純なクエリを実行すると、`my_value`カラムの1億エントリすべてがスキャンされます: + +``` +SELECT * FROM skip_table WHERE my_value IN (125, 700) + +┌─my_key─┬─my_value─┐ +│ 512000 │ 125 │ +│ 512001 │ 125 │ +│ ... | ... | +└────────┴──────────┘ + +8192 rows in set. Elapsed: 0.079 sec. Processed 100.00 million rows, 800.10 MB (1.26 billion rows/s., 10.10 GB/s. +``` + +ここで非常に基本的なスキップインデックスを追加します: + +``` +ALTER TABLE skip_table ADD INDEX vix my_value TYPE set(100) GRANULARITY 2; +``` + +通常、スキップインデックスは新たに挿入されたデータにのみ適用されるため、インデックスを追加するだけでは上記のクエリには影響しません。 + +既存のデータをインデックス化するには、次のステートメントを使用します: + +``` +ALTER TABLE skip_table MATERIALIZE INDEX vix; +``` + +新しく作成したインデックスでクエリを再実行します: + +``` +SELECT * FROM skip_table WHERE my_value IN (125, 700) + +┌─my_key─┬─my_value─┐ +│ 512000 │ 125 │ +│ 512001 │ 125 │ +│ ... | ... | +└────────┴──────────┘ + +8192 rows in set. Elapsed: 0.051 sec. Processed 32.77 thousand rows, 360.45 KB (643.75 thousand rows/s., 7.08 MB/s.) +``` + +1億行の800メガバイトを処理する代わりに、ClickHouseは32,768行の360キロバイトのみを読み取り、分析しました +-- 各8192行の4つのグラニュールです。 + +より視覚的な形式では、`my_value`が125である4096行がどのように読み取られ選択されたか、そして次の行がディスクからの読み取りなしにスキップされたかを示しています: + +![Simple Skip](images/simple_skip.svg) + +クエリを実行する際にtraceを有効にすることでスキップインデックスの使用に関する詳細情報にアクセスできます。 +clickhouse-clientから、`send_logs_level`を設定します: + +``` +SET send_logs_level='trace'; +``` +これにより、クエリSQLやテーブルインデックスの調整を試みる際に有用なデバッグ情報が提供されます。上記の例では、スキップインデックスが6104のうち6102のグラニュールを削除したことを示しています: + +``` + default.skip_table (933d4b2c-8cea-4bf9-8c93-c56e900eefd1) (SelectExecutor): Index `vix` has dropped 6102/6104 granules. +``` + +## スキップインデックスタイプ + +### minmax + +この軽量なインデックスタイプはパラメータを必要としません。各ブロックのインデックス式の最小値と最大値を記録します(式がタプルである場合、タプルの要素の各メンバーの値を個別に記録します)。このタイプは、値で緩やかにソートされる傾向があるカラムに理想的です。このインデックスタイプは通常、クエリ処理中に適用するのに最も費用がかかりません。 + +このタイプのインデックスは、スカラーまたはタプルの式でのみ正常に機能します。ただし、インデックスが配列またはマップデータ型を返す式には適用されません。 + +### set + +この軽量なインデックスタイプは、ブロックごとに格納される値集合の最大サイズ(0は無制限の個別値を許可)という単一のパラメータを受け取ります。この集合にはブロック内のすべての値が含まれます(値の数がmax_sizeを超える場合は空です)。このインデックスタイプは、各グラニュールセット内で低いカーディナリティ(基本的に「ひとつにまとまっている」)だが、全体では高いカーディナリティのカラムによく適しています。 + +このインデックスのコスト、パフォーマンス、および効果は、ブロック内のカーディナリティに依存します。各ブロックが大量のユニークな値を含む場合、クエリ条件を大きなインデックスセットに評価するのが非常に高価になるか、max_sizeを超えたためインデックスが空になり適用されないことがあります。 + +### Bloomフィルタタイプ + +*Bloomフィルタ*は、集合のメンバーシップのテストを効率的に行うためのデータ構造で、 false positive(誤って一致と判定する)可能性があります。スキップインデックスの場合、false positiveはわずかに余分なブロックを読み込むだけのデメリットしかないため、大きな問題にはなりません。ただし、false positivesの可能性があるため、インデックスした式がtrueであると予想されるべきです。さもないと、有効なデータがスキップされる可能性があります。 + +Bloomフィルタは、多数の個別値のテストをより効率的に処理できるため、多くの値をテストする条件式に適しています。特に、Bloomフィルタインデックスは配列に適用でき、配列の各値がテストされ、mapKeysまたはmapValues関数を使用してキーまたは値を配列に変換することでマップに適用されます。 + +Bloomフィルタに基づくデータスキッピングインデックスには、以下の3種類があります: + +* 基本的な**bloom_filter**は、false positive率を0から1の範囲で許可する単一のオプションパラメータを受け取ります(指定しない場合、.025が使用されます)。 + +* 専用の**tokenbf_v1**。これはBloomフィルタに関連する3つのパラメータを取ります:(1)フィルタのサイズ(バイト単位)(大きなフィルタはfalse positiveが少ないですが、ストレージのコストがかかります)、(2)適用されるハッシュ関数の数(より多くのハッシュ関数はfalse positiveを減少させます)、(3)Bloomフィルタのハッシュ関数のシードです。これらのパラメータがBloomフィルタの機能にどのように影響するかについては、計算機を参照してください。[ここ](https://hur.st/bloomfilter/)をご覧ください。 +このインデックスは、String、FixedString、Mapデータ型でのみ機能します。入力式は、非英数字で区切られた文字列に分割されます。たとえば、`This is a candidate for a "full text" search` という列の値は、`This` `is` `a` `candidate` `for` `full` `text` `search` というトークンが含まれます。LIKE、EQUALS、IN、hasToken()などの単語や他の値を長い文字列内で検索するために使用されます。たとえば、アプリケーションログの行の中で少数のクラス名や行番号を検索するのに役立つかもしれません。 + +* 専用の**ngrambf_v1**。このインデックスはトークンインデックスと同様に機能します。Bloomフィルタ設定の前にn-gramのサイズを表す追加パラメータを取得します。n-gramは任意の文字の長さ`n`の文字列です。`A short string`という文字列でn-gramサイズが4の場合、以下のようにインデックスされます: + ``` + 'A sh', ' sho', 'shor', 'hort', 'ort ', 'rt s', 't st', ' str', 'stri', 'trin', 'ring' + ``` +このインデックスは、特に単語の切れ目がない言語(中国語など)のテキスト検索に有用かもしれません。 + +## スキップインデックス関数 + +データスキッピングインデックスの主な目的は、人気のあるクエリによって分析されるデータの量を制限することです。ClickHouseデータの分析特性により、これらのクエリのパターンには多くの場合、機能的な表現が含まれています。そのため、スキップインデックスは一般的な関数と正しく連携する必要があります。これは、次のいずれかの場合に発生する可能性があります: +* データが挿入され、インデックスが機能的な式として定義されている場合(式の結果がインデックスファイルに格納される)、 +* クエリが処理され、式が格納されたインデックス値に適用され、ブロックを除外するかどうかを判断する場合。 + +各タイプのスキップインデックスは、可能な関数サポートのサブセットで機能します。[こちら](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree/#functions-support)に記載されています。一般的に、セットインデックスやBloomフィルタベースのインデックス(もう一つのセットインデックスタイプ)は無秩序で範囲では機能しません。対照的に、minmaxインデックスは範囲で特によく機能します。部分一致関数LIKE、startsWith、endsWith、およびhasTokenの有効性は、使用されるインデックスタイプ、インデックス式、およびデータの特定の形状に依存します。 + +## スキップインデックス設定 + +スキップインデックスに適用される設定は2つ存在します。 + +* **use_skip_indexes**(0または1、デフォルトは1)。すべてのクエリがスキップインデックスを効率的に利用できるわけではありません。特定のフィルタリング条件が +ほとんどの場合全グラニュールを含む可能性がある場合、データスキッピングインデックスを適用することは不要であり、時にはかなりのコストがかかります。スキップインデックスを利用する可能性が低いクエリの場合は、値を +0に設定してください。 +* **force_data_skipping_indices**(インデックス名のカンマ区切りリスト)。この設定は、一部の非効率的な +クエリを防ぐために使用できます。テーブルを問い合わせるのがスキップインデックスを使用しない限り高価すぎる場合、この設定を1つ以上のインデックス +名で使用すると、指定されたインデックスを使用しないクエリに対しては例外を返します。これにより、他のリソースを浪費するクエリを +防ぐことができます。 + +## スキップインデックスのベストプラクティス + +スキップインデックスは直感的ではなく、RDMSの領域の行ベースの二次インデックスや文書ストアのインバーテッドインデックスに慣れているユーザーには特にそうです。ClickHouseデータスキッピングインデックスを適用して利益を得るためには、計算コストを相殺するだけのグラニュールの読み取りを避ける必要があります。重要なことは、インデックス付きブロック内に1回でも値が現れる場合、それはブロック全体がメモリに読み込まれ評価されなければならず、インデックスコストが不必要にかかることを意味します。 + +以下のデータ分布を考えてみましょう: + +![Bad Skip!](images/bad_skip_1.svg) + +主/ORDER BY キーが `timestamp` で、`visitor_id` にインデックスがあると仮定します。次のクエリを考えます: + + `SELECT timestamp, url FROM table WHERE visitor_id = 1001` + +この種のデータ分布では、伝統的な二次インデックスが非常に有利です。 +要求されたvisitor_idを持つ5つの行を見つけるために32768行全体を読む代わりに、二次インデックスにはちょうど5つの行位置が含まれ、ディスクからそれらの5つの行だけが読み込まれます。 +ClickHouseのデータスキッピングインデックスでは逆が当てはまります。8192行のスキップ・ブロックの中で要求されたvisitor_idが1つでも見つかるため、visitor_idにインデックスが付いている8192行のすべての値がテストされます。 + +したがって、ClickHouseのクエリを単にキーとなるカラムにインデックスを追加することで高速化しようとする自然な衝動は、しばしば間違っています。この高度な機能は、他の代替手段、例えば主キーの変更([主キーの選び方](../best-practices/sparse-primary-indexes.md)を参照)、プロジェクションの利用、またはマテリアライズされたビューを使用するまでは利用するべきではありません。データスキッピングインデックスが適切である場合でも、多くの場合、インデックスとテーブルの両方の慎重な調整が必要になります。 + +ほとんどの場合、有用なスキップインデックスは、主キーとターゲットの非主カラム/式の強い相関関係を必要とします。 +(上記の図のように)相関がなければ、フィルタリング条件が数千の値ブロックの少なくとも1行に一致する可能性が高く、多くのブロックはスキップされません。対照的に、主キー(時間帯のような)の値の範囲が、潜在的なインデックスカラム(テレビ視聴者の年齢)の値と強く関連している場合、minmaxタイプのインデックスが有益である可能性があります。データを挿入する際にこの相関関係を高めることが可能かもしれません。これには、並べ替え/ORDER BYキーに追加のカラムを含める、または主キーと関連する値が挿入時にグループ化されるようにバッチ挿入することが含まれるかもしれません。例えば、サイトIDごとのすべてのイベントをまとめてグループ化して挿入プロセスによって一緒に挿入することができます。これにより、多くのグラニュールが少数のサイトIDのみを含むようになり、特定のサイトID値を検索する際に多くのブロックをスキップできるようになります。 + +スキップインデックスの良い候補の1つは、高カーディナリティの式で、1つの値がデータ内で比較的スパースである場合です。 1つの例として、APIリクエストにおけるエラーコードを追跡する観測プラットフォームが考えられます。データ内で稀であるエラーコードが特に重要である場合があります。エラーコードカラムに対するセットスキップインデックスを設定することで、エラーを含まないブロックの大部分をバイパスし、エラー中心のクエリを大幅に改善できます。 + +最後に、主要なベストプラクティスはテスト、テスト、テストです。 b-treeの二次インデックスや文書の検索用インバーテッドインデックスとは異なり、データスキッピングインデックスの動作は容易に予測できません。テーブルに追加することは、データ挿入時および、いくつかの理由で利益を得ないクエリの上での有意義なコストを伴います。常に実世界のデータでテストし、テストには型、粒度サイズ、および他のパラメータのバリエーションを含める必要があります。テストは思考実験だけでは明らかにならないパターンや落とし穴を明らかにすることがよくあります。 diff --git a/docs/ja/guides/best-practices/sparse-primary-indexes.md b/docs/ja/guides/best-practices/sparse-primary-indexes.md new file mode 100644 index 00000000000..5a961934363 --- /dev/null +++ b/docs/ja/guides/best-practices/sparse-primary-indexes.md @@ -0,0 +1,1459 @@ +--- +slug: /ja/optimize/sparse-primary-indexes +sidebar_label: スパース主キーインデックス +sidebar_position: 1 +description: このガイドでは、ClickHouseのインデックスについて深く掘り下げて解説します。 +--- + +# ClickHouseにおける主キーインデックスの実践的な紹介 + +## はじめに + +このガイドでは、ClickHouseのインデックスについて詳しく解説します。以下の点について具体的に説明します: +- [ClickHouseのインデックスが従来のリレーショナルデータベース管理システムとどのように異なるか](#an-index-design-for-massive-data-scales) +- [ClickHouseがどのようにテーブルのスパース主キーインデックスを構築し利用しているか](#a-table-with-a-primary-key) +- [ClickHouseでのインデックス作成のベストプラクティスは何か](#using-multiple-primary-indexes) + +このガイドで提案されているClickHouseのすべてのSQL文やクエリを、自分のマシンで実行することも可能です。ClickHouseのインストールと開始手順については、[クイックスタート](/docs/ja/quick-start.mdx)を参照してください。 + +:::note +このガイドはClickHouseのスパース主キーインデックスに焦点を当てています。 + +ClickHouseの[二次データスキッピングインデックス](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-data_skipping-indexes)については、[チュートリアル](/docs/ja/guides/best-practices/skipping-indexes.md)を参照してください。 +::: + + +### データセット + +このガイドを通じて、匿名化されたウェブトラフィックデータセットのサンプルを使用します。 + +- 8.87百万行(イベント)のサブセットを使用します。 +- 圧縮されていないデータサイズは8.87百万イベントで約700 MBです。ClickHouseに格納すると200 MBに圧縮されます。 +- サブセットでは、各行は特定の時間にURLをクリックしたインターネットユーザー(`UserID`カラム)が含まれています。 + +これらの3つのカラムを用いて、次のような一般的なウェブ分析クエリを既に立てることができます: + +- 「特定のユーザーが最もクリックしたURLのトップ10は何ですか?」 +- 「特定のURLを最も頻繁にクリックしたユーザーのトップ10は誰ですか?」 +- 「あるユーザーが特定のURLをクリックする最も人気のある時間(例:週の日)はいつですか?」 + +### テストマシン + +このドキュメントに示されている全ての実行時間は、Apple M1 Proチップと16GBのRAMを搭載したMacBook ProでClickHouseバージョン22.2.1をローカルで実行したものに基づいています。 + + +### フルテーブルスキャン + +主キーなしでデータセットに対してクエリがどのように実行されるかを確認するために、以下のSQL DDL文を実行してテーブルを作成します(テーブルエンジンはMergeTree): + +```sql +CREATE TABLE hits_NoPrimaryKey +( + `UserID` UInt32, + `URL` String, + `EventTime` DateTime +) +ENGINE = MergeTree +PRIMARY KEY tuple(); +``` + +次に、以下のSQL挿入文を使用して、データセットのサブセットをテーブルに挿入します。これは、遠隔地にホストされている完全なデータセットのサブセットをロードするのに[URLテーブル関数](/docs/ja/sql-reference/table-functions/url.md)を使用します: + +```sql +INSERT INTO hits_NoPrimaryKey SELECT + intHash32(UserID) AS UserID, + URL, + EventTime +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz', 'TSV_FORMAT') +WHERE URL != ''; +``` +応答は: +```response +Ok. + +0 rows in set. Elapsed: 145.993 sec. Processed 8.87 million rows, 18.40 GB (60.78 thousand rows/s., 126.06 MB/s.) +``` + +ClickHouseクライアントの結果出力は、上記の文が8.87百万行をテーブルに挿入したことを示しています。 + +最後に、このガイドでのディスカッションを簡潔にし、図や結果を再現可能にするために、FINALキーワードを使用してテーブルを[最適化](/docs/ja/sql-reference/statements/optimize.md)します: + +```sql +OPTIMIZE TABLE hits_NoPrimaryKey FINAL; +``` + +:::note +一般的にはデータをロードした直後にテーブルを最適化することは必須でも推奨されることでもありません。この例でなぜこれが必要かは明らかになるでしょう。 +::: + +今、私たちは最初のウェブ分析クエリを実行します。次はインターネットユーザーID 749927693のトップ10最もクリックされたURLを計算しています: + +```sql +SELECT URL, count(URL) as Count +FROM hits_NoPrimaryKey +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` +応答は: +```response +┌─URL────────────────────────────┬─Count─┐ +│ http://auto.ru/chatay-barana.. │ 170 │ +│ http://auto.ru/chatay-id=371...│ 52 │ +│ http://public_search │ 45 │ +│ http://kovrik-medvedevushku-...│ 36 │ +│ http://forumal │ 33 │ +│ http://korablitz.ru/L_1OFFER...│ 14 │ +│ http://auto.ru/chatay-id=371...│ 14 │ +│ http://auto.ru/chatay-john-D...│ 13 │ +│ http://auto.ru/chatay-john-D...│ 10 │ +│ http://wot/html?page/23600_m...│ 9 │ +└────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.022 sec. +// highlight-next-line +Processed 8.87 million rows, +70.45 MB (398.53 million rows/s., 3.17 GB/s.) +``` + +ClickHouseクライアントの結果出力は、ClickHouseがフルテーブルスキャンを実行したことを示しています!テーブルの8.87百万行のそれぞれがClickHouseにストリーミングされました。これはスケールしません。 + +これをより効率的で高速にするためには、適切な主キーを持つテーブルを使用する必要があります。これにより、ClickHouseは主キーのカラムに基づいて自動的にスパース主キーインデックスを作成でき、その後、クエリの実行を大幅に高速化することができます。 + +### 関連コンテンツ +- ブログ: [ClickHouseクエリの高速化](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes) + +## ClickHouseインデックスデザイン + +### 大規模データスケール向けのインデックス設計 + +従来のリレーショナルデータベース管理システムでは、主キーインデックスはテーブル行ごとに1つのエントリーを含みます。これにより、我々のデータセットでは主キーインデックスが8.87百万のエントリーを含むことになり、特定の行をすばやく見つけることができ、高効率なルックアップクエリとポイントアップデートが可能になります。`B(+)-Tree`データ構造でのエントリー検索は平均的に`O(log n)`の時間複雑度を持ちます。さらに正確には、`b`が通常数百から数千の範囲であるため、`B(+)-Tree`は非常に浅い構造であり、少数のディスクアクセスでレコードを見つけることができます。8.87百万の行と1000のブランチングファクターであれば、平均して2.3回のディスクアクセスが必要です。この機能はコストとともに来ます:追加のディスクとメモリのオーバーヘッド、新しい行をテーブルとインデックスに追加する際の高い挿入コスト、時にはB-Treeの再バランシングも必要です。 + +B-Treeインデックスに関連する課題を考慮して、ClickHouseのテーブルエンジンは異なるアプローチを利用します。ClickHouseの[MergeTreeエンジンファミリー](/docs/ja/engines/table-engines/mergetree-family/index.md)は、巨大なデータ量を処理するために設計され最適化されています。これらのテーブルは、毎秒数百万行の挿入を受け取り、非常に大きな(数百ペタバイト)のデータを保存するために設計されています。データはテーブルに対して[パートごと](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-data-storage)に迅速に書き込まれ、バックグラウンドでパートのマージルールが適用されます。ClickHouseでは、各パートには独自の主キーインデックスがあります。パートがマージされると、マージされたパートの主キーインデックスもマージされます。ClickHouseが設計されている非常に大規模なスケールでは、ディスクとメモリの効率が非常に重要です。そのため、全ての行をインデックス化するのではなく、パートの主キーインデックスには行のグループ(「グラニュール」と呼ばれる)ごとに1つのインデックスエントリ(「マーク」として知られる)があります - このテクニックは**スパースインデックス**と呼ばれます。 + +スパースインデックスは、ClickHouseがディスク上で行を主キーのカラムで順序付けて保存するために可能です。`B-Tree`ベースのインデックスのように単一の行を直接見つけ出すのではなく、スパース主キーインデックスを使うことでクエリに一致する可能性のある行のグループを素早く(インデックスエントリに対するバイナリサーチを介して)特定することができます。クエリに一致する可能性がある行のグループ(グラニュール)は、その後、並行してClickHouseエンジンにストリーミングされ、マッチを見つけ出すことができます。このインデックスデザインにより、主キーインデックスは小さく(完全にメインメモリに収まる必要があります)、クエリ実行時間を大幅に短縮します:特にデータ分析ユースケースで一般的な範囲クエリの場合です。 + +以下では、ClickHouseがどのようにスパース主キーインデックスを構築し使用しているかを詳しく説明します。その後、テーブルのインデックス(主キーのカラム)を構築する際の選択、削除および順序付けのベストプラクティスをいくつか議論します。 + +### 主キーを持つテーブル + +UserIDとURLをキーとした複合主キーを持つテーブルを作成します: + +```sql +CREATE TABLE hits_UserID_URL +( + `UserID` UInt32, + `URL` String, + `EventTime` DateTime +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (UserID, URL) +ORDER BY (UserID, URL, EventTime) +SETTINGS index_granularity = 8192, index_granularity_bytes = 0, compress_primary_key = 0; +``` + +[//]: # (
) +
+ + DDL文の詳細 + +

+ +このガイドでのディスカッションを簡潔にし、結果を再現可能にするため、DDL文は以下に示すように +

    +
  • `ORDER BY`句を使用してテーブルの複合ソートキーを指定します
  • +
    +
  • 以下の設定を通じて、主キーインデックスのエントリー数を明示的に制御します:
  • +
    +
      +
    • `index_granularity`: デフォルト値の8192に明示的に設定されています。これは、8192行ごとに主キーインデックスに1つのエントリーが作成されることを意味します。つまり、テーブルに16384行が含まれている場合、インデックスには2つのエントリーが存在します。 +
    • +
      +
    • `index_granularity_bytes`: 適応インデックス粒度を無効にするために0に設定されます。適応インデックス粒度というのは、ClickHouseがn行のグループに対してインデックスエントリーを自動的に作成することを意味します。これらの条件が成り立つ場合: +
        +
      • nが8192より小さく、そのn行の合計データサイズが10 MB以上(index_granularity_bytesのデフォルト値)である場合、あるいは
      • +
      • n行の合計データサイズが10 MB未満であるが、nが8192である場合。
      • +
      +
    • +
      +
    • `compress_primary_key`: 主キーの圧縮を無効化するために0に設定されています。これにより、後でその内容を任意で確認できます。 +
    • +
    +
+

+
+ +上記のDDL文の主キーは、指定された2つのキーカラムに基づいて主キーインデックスを作成させます。 + +
+次にデータを挿入します: + +```sql +INSERT INTO hits_UserID_URL SELECT + intHash32(UserID) AS UserID, + URL, + EventTime +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz', 'TSV_FORMAT') +WHERE URL != ''; +``` +応答は以下のようになります: +```response +0 rows in set. Elapsed: 149.432 sec. Processed 8.87 million rows, 18.40 GB (59.38 thousand rows/s., 123.16 MB/s.) +``` + +
+そしてテーブルを最適化します: + +```sql +OPTIMIZE TABLE hits_UserID_URL FINAL; +``` + +
+以下のクエリを使用してテーブルのメタデータを取得できます: + +```sql +SELECT + part_type, + path, + formatReadableQuantity(rows) AS rows, + formatReadableSize(data_uncompressed_bytes) AS data_uncompressed_bytes, + formatReadableSize(data_compressed_bytes) AS data_compressed_bytes, + formatReadableSize(primary_key_bytes_in_memory) AS primary_key_bytes_in_memory, + marks, + formatReadableSize(bytes_on_disk) AS bytes_on_disk +FROM system.parts +WHERE (table = 'hits_UserID_URL') AND (active = 1) +FORMAT Vertical; +``` + +応答は: + +```response +part_type: Wide +path: ./store/d9f/d9f36a1a-d2e6-46d4-8fb5-ffe9ad0d5aed/all_1_9_2/ +rows: 8.87 million +data_uncompressed_bytes: 733.28 MiB +data_compressed_bytes: 206.94 MiB +primary_key_bytes_in_memory: 96.93 KiB +marks: 1083 +bytes_on_disk: 207.07 MiB + +1 rows in set. Elapsed: 0.003 sec. +``` + +ClickHouseクライアントの出力が示しているのは: + +- テーブルのデータが[ワイドフォーマット](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-data-storage)で特定のディレクトリに保存されており、そのディレクトリ内でテーブルカラムごとにデータファイル(およびマークファイル)が1つあることを意味します。 +- テーブルには8.87百万行が含まれています。 +- 全ての行の非圧縮データサイズが733.28 MBです。 +- 全ての行のディスク上での圧縮サイズは206.94 MBです。 +- テーブルは、1083個のエントリー(「マーク」と呼ばれる)を持つ主キーインデックスを持ち、そのインデックスのサイズは96.93 KBです。 +- 合計で、テーブルのデータおよびマークファイルと主キーインデックスファイルを合わせてディスク上で207.07 MBを消費しています。 + +### 主キーのカラムで順序付けされたディスク上のデータストア + +上で作成したテーブルには +- 複合[主キー](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#primary-keys-and-indexes-in-queries) `(UserID, URL)` と +- 複合[ソートキー](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#choosing-a-primary-key-that-differs-from-the-sorting-key) `(UserID, URL, EventTime)` を持ちます。 + +:::note +- ソートキーのみを指定した場合、主キーは暗黙的にソートキーと同じものとして定義されます。 + +- メモリ効率を追求するために、クエリがフィルタリングするカラムだけを含む主キーを明示的に指定しました。主キーに基づく主キーインデックスは完全にメインメモリにロードされます。 + +- ガイド内の図に一貫性を持たせ、圧縮率を最大化するため、テーブルのすべてのカラムを含むソートキーを別途定義しました(カラム内の類似データを近くに配置すると、より良い圧縮が可能です)。 + +- 両方が指定された場合、主キーはソートキーの接頭辞である必要があります。 +::: + + +挿入された行は、主キーのカラム(およびソートキーの追加カラム)で辞書的順序(昇順)でディスク上に格納されます。 + +:::note +ClickHouseは、主キーのカラム値が同一の複数の行を挿入することを許可しています。この場合(下図の行1と行2を参照)、最終的な順序は指定されたソートキーによって決まり、したがって`EventTime`カラムの値によって最終的な順序が決定されます。 +::: + + + +ClickHouseは真の列指向データベース管理システムです。図に示すように +- ディスク上の表現では、テーブルの各カラムに対して単一のデータファイル(*.bin)が存在し、そのカラムの全ての値が圧縮された形式で保存され、そして +- 行は、主キーのカラム(およびソートキーの追加カラム)で辞書的に昇順でディスク上に保存されています。つまりこの場合は + - 最初に `UserID` で、 + - 次に `URL` で、 + - 最後に `EventTime` で: + + +UserID.bin, URL.bin, および EventTime.binは、`UserID`、`URL`、および `EventTime`カラムの値が保存されているディスク上のデータファイルです。 + +
+
+ + +:::note +- 主キーがディスク上の行の辞書的順序を定義するため、テーブルには1つの主キーしか持てません。 + +- 行を番号付けするとき、ClickHouseの内部行番号付けスキームと一致するように0から始めています。またログメッセージにも使用されます。 +::: + + + +### データはグラニュールに組織化され、並行的に処理される + +データ処理の目的上、テーブルのカラムの値は論理的にグラニュールに分割されます。 +グラニュールはClickHouseにストリーミングされる最小の分割可能なデータセットです。 +これは、ClickHouseが個々の行を読むのではなく、常に1つのグラニュール(つまり、行のグループ)を読み取ることを意味します。 +:::note +カラムの値はグラニュール内に物理的に保存されているわけではありません。グラニュールはクエリ処理のためのカラム値の論理的な組織です。 +::: + +以下の図は、我々のテーブルの8.87百万行(そのカラムの値)が、テーブルのDDL文に`index_granularity`(デフォルト値である8192に設定)の設定を含む結果として、1083個のグラニュールにどのように組織化されているかを示しています。 + + + +最初の(ディスク上の物理的な順序に基づいた)8192行(そのカラムの値)は論理的にグラニュール0に属し、次の8192行(そのカラムの値)はグラニュール1に属する、という具合です。 + +:::note +- 最後のグラニュール(グラニュール1082)は8192行未満を「含んでいます」。 + +- このガイドの冒頭で述べたように、「DDL文の詳細」で適応インデックス粒度を無効化しました(このガイドのディスカッションを簡潔にし、図と結果を再現可能にするため)。 + + したがって、我々の例のテーブルのすべてのグラニュール(最後の1つを除く)は同じサイズを持っています。 + +- 適応インデックス粒度(index_granularity_bytesが[デフォルトで](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#index_granularity_bytes)適応的である)を持つテーブルでは、一部のグラニュールのサイズが、行データサイズによっては8192行未満になることがあります。 + + + +- 主キーのカラム(`UserID`、`URL`)の一部のカラム値をオレンジ色でマークしました。 + これらのオレンジ色でマークされたカラム値は、各グラニュールの最初の行の主キーのカラム値です。 + これらのオレンジ色でマークされたカラム値が、テーブルの主キーインデックスのエントリーになります。 + +- グラニュールを番号付けするとき、ClickHouseの内部の番号付けスキームと一致し、またログメッセージにも使用されるように0から始めています。 +::: + + + +### 主キーインデックスはグラニュールごとに1エントリーを持つ + +主キーインデックスは上図のグラニュールに基づいて作成されます。このインデックスは未圧縮のフラットアレイファイル(primary.idx)であり、0から始まる数値インデックスマークを含みます。 + +下記の図は、インデックスが各グラニュールの最初の行の主キーのカラム値(上図でオレンジ色でマークされている値)をどのように保存しているかを示しています。 +あるいは、言い換えると:主キーインデックスは主キーのカラム値をテーブルの毎の8192行目から保存しています(物理的な順序に基づく)。 +例えば +- 最初のインデックスエントリー(下図で「マーク0」)は、上図のグラニュール0の最初の行のキーカラム値を保存しています。 +- 2番目のインデックスエントリー(下図で「マーク1」)は、上図のグラニュール1の最初の行のキーカラム値を保存しています。 + + + +合計でインデックスは、我々のテーブルの8.87百万行と1083グラニュール用に1083個のエントリーを持っています: + + + +:::note +- 適応インデックス粒度(index_granularity_bytesが [デフォルトで](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#index_granularity_bytes)適応的である)を持つテーブルの場合、インデックスには、テーブル行の最後までの末尾の主キーのカラム値を記録する「最終」追加マークもストアされますが、我々の例のテーブルではこの適応インデックス粒度を無効化したため(このガイドのディスカッションを簡潔にし、図と結果を再現可能にするため)、実例のインデックスにはこの最終的なマークは含まれません。 + +- 主キーインデックスファイルは完全にメインメモリにロードされます。もしファイルが利用可能な空きメモリ容量より大きい場合、ClickHouseはエラーをスローします。 +::: + +
+ + 主キーインデックスの内容を調べる + +

+ +セルフマネージドのClickHouseクラスタでは、ファイルテーブル関数を使用して、主キーインデックスの内容を調べることができます。 + +そのためにはまず、稼働中のクラスタのノードからのuser_files_pathに主キーインデックスファイルをコピーする必要があります: +

    +
  • ステップ1: 主キーインデックスファイルを含むパートパスを取得 +
  • +` +SELECT path FROM system.parts WHERE table = 'hits_UserID_URL' AND active = 1 +` + + +テストマシンでは、`/Users/tomschreiber/Clickhouse/store/85f/85f4ee68-6e28-4f08-98b1-7d8affa1d88c/all_1_9_4` を返します。 + +
  • ステップ2: user_files_pathを取得 +
  • +Linuxの場合のデフォルトのuser_files_pathは +`/var/lib/clickhouse/user_files/` + +Linuxでパスが変更されていたかどうかを確認できます。: `$ grep user_files_path /etc/clickhouse-server/config.xml` + +テストマシンのパスは `/Users/tomschreiber/Clickhouse/user_files/` です。 + +
  • ステップ3: 主キーインデックスファイルをuser_files_pathにコピー +
  • +` +cp /Users/tomschreiber/Clickhouse/store/85f/85f4ee68-6e28-4f08-98b1-7d8affa1d88c/all_1_9_4/primary.idx /Users/tomschreiber/Clickhouse/user_files/primary-hits_UserID_URL.idx +` + +
    + +
+ +上のSQLを使用して、主キーインデックスの内容を調べることができます: +
    +
  • エントリー数を取得 +
  • +` +SELECT count( )
    FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID UInt32, URL String'); +` + +
    +
    +`1083`を返します。 +
    +
    +
  • 最初の2つのインデックスマークを取得 +
  • +` +SELECT UserID, URL
    FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID UInt32, URL String')
    LIMIT 0, 2; +` +
    +
    +次を返します +
    +` +240923, http://showtopics.html%3...
    +4073710, http://mk.ru&pos=3_0 +` +
    +
    +
  • 最後のインデックスマークを取得 +
  • +` +SELECT UserID, URL
    FROM file('primary-hits_UserID_URL.idx', 'RowBinary', 'UserID UInt32, URL String')
    LIMIT 1082, 1; +` +
    +
    +次を返します +
    +` +4292714039 │ http://sosyal-mansetleri... +` + + +
+ +これは、我々の例のテーブルの主キーインデックスの内容の図と完全に一致します: + +

+
+ +主キーエントリーはインデックスマークと呼ばれます、なぜなら各インデックスエントリーは特定のデータ範囲の開始を指し示しているためです。具体的にいうと例のテーブルでは: +- UserIDインデックスマーク:
+ 主キーインデックスに保存されている`UserID`値は昇順にソートされています。
+ 上記のマーク176は、すべての行がgranule 176にあり、その後のすべてのグラニュールにも`UserID`の値は749.927.693以上になることが保証されているということを示しています。 + + [後述するように](#the-primary-index-is-used-for-selecting-granules)、この全体的な順序付けによりClickHouseはクエリが主キーの最初のカラムにフィルタリングしている場合インデックスマークに対してバイナリ検索アルゴリズムを使用できるようになります。 + +- URLインデックスマーク:
+ 主キーのカラム`UserID`と`URL`のカードイナリティがほとんど同じであるため、最初のカラム以降のキーのインデックスマークは、一般に、先行キーの値に依存してグラニュール全体の値範囲のみを示します。
+ たとえば、上記のグラフでマーク0とマーク1のUserIDが異なる場合、ClickHouseはすべてのグラフがグラニュール0のURLが`'http://showtopics.html%3...'`以上であると仮定できません。しかし、上記のグラフでマーク0とマーク1が同じであれば(つまり、グラニュール0内のすべての行が同じUserIDを持つ場合)、ClickHouseはすべてのグラニュール0までのグラニュール内の行のURLが`'http://showtopics.html%3...'`以上であると仮定することができます。 + + このことのクエリの実行パフォーマンスに対する影響は後で詳しく議論します。 + +### 主キーインデックスはグラニュールの選択に使用される + +次に、主キーインデックスによるサポートを受けたクエリを実行できます。 + +以下はUserID 749927693のトップ10のクリックされたURLを計算します。 + +```sql +SELECT URL, count(URL) AS Count +FROM hits_UserID_URL +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` + +応答は以下の通りです: + +```response +┌─URL────────────────────────────┬─Count─┐ +│ http://auto.ru/chatay-barana.. │ 170 │ +│ http://auto.ru/chatay-id=371...│ 52 │ +│ http://public_search │ 45 │ +│ http://kovrik-medvedevushku-...│ 36 │ +│ http://forumal │ 33 │ +│ http://korablitz.ru/L_1OFFER...│ 14 │ +│ http://auto.ru/chatay-id=371...│ 14 │ +│ http://auto.ru/chatay-john-D...│ 13 │ +│ http://auto.ru/chatay-john-D...│ 10 │ +│ http://wot/html?page/23600_m...│ 9 │ +└────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.005 sec. +// highlight-next-line +Processed 8.19 thousand rows, +740.18 KB (1.53 million rows/s., 138.59 MB/s.) +``` + +ClickHouseクライアントの出力は、今度はフルスキャンを実行せずに、わずか8.19千行がClickHouseにストリーミングされたことを示しています。 + +トレースログが有効化されている場合、ClickHouseサーバーログファイルは、主キーインデックスの1083 UserIDマークをバイナリサーチを用いて、クエリに一致する可能性のある行を含むグラニュールを特定する過程を示しています。この処理には19ステップが必要で、平均的な時間複雑度は`O(log2 n)`です: + +```response +...Executor): Key condition: (column 0 in [749927693, 749927693]) +// highlight-next-line +...Executor): Running binary search on index range for part all_1_9_2 (1083 marks) +...Executor): Found (LEFT) boundary mark: 176 +...Executor): Found (RIGHT) boundary mark: 177 +...Executor): Found continuous range in 19 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 1/1083 marks by primary key, 1 marks to read from 1 ranges +...Reading ...approx. 8192 rows starting from 1441792 +``` + +サンプルトレースログでは、1のマークがクエリに一致する可能性のあるものとして選択されたことが示されています。 + +
+ + トレースログの詳細 + +

+ +マーク176が識別されました(‘found left boundary mark’は包含的で、‘found right boundary mark’は除外的です)。したがって、グラニュール176から始まる8192行全てがClickHouseにストリーミングされて、実際に`UserID`カラム値が`749927693`の行を見つけます。 +

+
+ +このことはEXPLAIN句を使用して簡単に再現できます: + +```sql +EXPLAIN indexes = 1 +SELECT URL, count(URL) AS Count +FROM hits_UserID_URL +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` + +応答は以下のようになります: + +```response +┌─explain───────────────────────────────────────────────────────────────────────────────┐ +│ Expression (Projection) │ +│ Limit (preliminary LIMIT (without OFFSET)) │ +│ Sorting (Sorting for ORDER BY) │ +│ Expression (Before ORDER BY) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ Filter (WHERE) │ +│ SettingQuotaAndLimits (Set limits and quota after reading from storage) │ +│ ReadFromMergeTree │ +│ Indexes: │ +│ PrimaryKey │ +│ Keys: │ +│ UserID │ +│ Condition: (UserID in [749927693, 749927693]) │ +│ Parts: 1/1 │ +// highlight-next-line +│ Granules: 1/1083 │ +└───────────────────────────────────────────────────────────────────────────────────────┘ + +16 rows in set. Elapsed: 0.003 sec. +``` +クライアントの出力は、1083個のgranuleのうち1つが、UserIDカラム値749927693の行を含む可能性があると選択されたことを示しています。 + +:::note 結論 +クエリが複合キーの一部であり最初のキーカラムでフィルタリングしている場合、ClickHouseはプロミナリキーインデックスマークに対してバイナリサーチアルゴリズムを実行しています。 +::: + +ClickHouseはそのスパース主キーインデックスを使用して簡単に(バイナリサーチを通じて)クエリにマッチする可能性がある行を含むgranuleを選択しています。 + +これはClickHouseクエリ実行の**最初のステージ(granule選択)**です。 + +クエリ実行の**第二ステージ(データ読み取り)**では、ClickHouseは選択されたgranuleを特定し、その全ての行をClickHouseエンジンにストリーミングして、実際にクエリに一致する行を見つけるプロセスを並行して実行します。 + +以下のセクションでは、この第二段階について更に詳しく説明します。 + +### マークファイルはgranuleの位置を特定するために使用される + +以下の図は我々のテーブルの主キーインデックスファイルの一部を示しています。 + + + +上述したように、インデックス内の1083 UserIDマークに対してバイナリサーチを行い、マーク176が特定されます。したがって、クエリに一致する可能性がある行を含む可能性があるのは、その対応するgranule176のみです。 + +
+ + Granule選択の詳細 + +

+ +上記の図は、mark 176がその関連するgranule 176の最低UserID値が749.927.693よりも小さい最初のインデックスエントリーであることを示しています。そして、その次のマーク(マーク177)のgranule 177が、この値よりも大きい最小UserID値であることを示しています。したがって、クエリに一致する可能性がある行を含む可能性があるのは、その対応するgranule 176のみです。 +

+
+ +granule 176にUserIDカラム値`749.927.693`を含む行があることを確認するために(またはしないために)、そのgranule内の全ての8192行をClickHouseにストリーミングする必要があります。 + +これを達成するため、ClickHouseはgranule 176の物理的位置を知っておく必要があります。 + +ClickHouseでは、テーブルの全てのgranuleの物理位置がマークファイルに保存されます。データファイルと同様に、各テーブルカラムにつき1つのマークファイルがあります。 + +以下の図は、テーブルのUserID、URL、およびEventTimeカラムのgranuleの物理位置を保存する3つのマークファイルUserID.mrk, URL.mrk, およびEventTime.mrkを示しています。 + + + +我々は以前に、主キーインデックスは0から始まる数値インデックスマークを含む未圧縮のフラットアレイファイル(primary.idx)であると述べました。 + +同様に、マークファイルもまた、0から始まる数値インデックスマークを含む未圧縮のフラットアレイファイル(*.mrk)です。 + +インデックスで選択されたgranuleに一致する行が含まれる可能性がある場合、ClickHouseはそのmark番号に基づいてarray lookupを行い、granuleの物理位置を取得することができます。 + +ある特定のカラムに対する各マークファイルエントリーは、次の形でオフセットの位置を提供しています: + +- 最初のオフセット(上記の図で「ブロックオフセット」)は、選択されたgranuleを含む圧縮column data fileのブロックを位置付けるためのものです。この圧縮されたファイルブロックは、おそらくいくつかの圧縮granuleを含んでいます。見つかった圧縮されたブロックは、メモリに読み込まれるときに解凍されます。 + +- 第二のオフセット(上記の図の「granuleオフセット」)は、解凍されたブロックデータ内のgranuleの位置を提供します。 + +その後、指定の解凍されたgranuleのすべての8192行が、さらに処理のためにClickHouseにストリーミングされます。 + +:::note + +- wide formatを使い、適応インデックス粒度が無効なテーブルでは(これが関連する場合は上記の図に示されているように.mrkファイルを使用)、各マークファイルエントリーでは2つの8バイトのアドレスを含むエントリーがあり、それらはgranuleの物理位置で全て同じサイズを持っています。 + +インデックスの粒度は[デフォルトで](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#index_granularity_bytes)適応的ですが、我々の例のテーブルでは適応インデックス粒度を無効化しました(このガイドのディスカッションを簡潔にし、図と結果を再現可能にするため)。このテーブルは、データサイズが[min_bytes_for_wide_part](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#min_bytes_for_wide_part)よりも大きいため、ワイドフォーマットを使用しています(self-managed clustersのデフォルトでは10 MBです)。 + +- wide formatおよび適応インデックス粒度を持つテーブルでは、.mrk2マークファイルを使用します。これは.mrkファイルと同様のエントリーを持ちますが、エントリーごとになんらかの追加の第3値:granuleに対応する行数が記録されているファイルです。 + +- compact formatを持つテーブルには、.mrk3マークファイルが使用されます。 + +::: + + +:::note マークファイルの理由 + +なぜ主キーインデックスがインデックスの物理的位置を直接保存していないか? + +なぜなら、ClickHouseが設計された非常に大規模なスケールでは、ディスクとメモリ効率が非常に重要だからです。 + +主キーインデックスファイルはメインメモリに完全に収まる必要があります。 + +我々のサンプルクエリのために、ClickHouseは主キーインデックスを使用してあくまでクエリに一致する可能性があるgranuleを選択しました。クエリの更なる処理のために、その1つのgranuleのみに対して物理的位置が必要です。 + +さらに、このオフセット情報はUserIDおよびURLカラムにのみ必要です。 + +クエリで使用していないカラム(例:EventTimeカラム)に対してオフセット情報が不要です。 + +我々のサンプルクエリでは、UserIDデータファイル(UserID.bin)とURLデータファイル(URL.bin)それぞれのgranule 176のために2つの物理的位置オフセットが必要です。 + +マークファイルによる間接化のおかげで、全 + +1083個のgranuleの物理位置を主キーインデックス内に直接保存することを回避できます:したがって、メモリ内に不要な(使用されない可能性のある)データを持たずに済みます。 + +::: + +下記の図と以下のテキストは、我々のサンプルクエリに対してClickHouseがどのようにUserID.binデータファイル内のgranule 176を特定するかを示しています。 + + + +このガイドの冒頭で述べたことから、ClickHouseは他にはないgranuleを選択し、クエリに一致する行を含む可能性があるgranule 176を選択しました。 + +ClickHouseは、UserID.mrkマークファイル内でgranule 176の2つのオフセットを取得するためにインデックスから選択されたマーク番号(176)を使用して位置取得を行います。 + +示されているように、最初のオフセットは、UserID.binデータファイル内のgranule 176の圧縮バージョンを含む圧縮ファイルブロックを位置付けるためのものです。 + +見つかったファイルブロックがメモリに解凍されると、マークファイルから2つ目のオフセットを使用して、解凍されたデータ内のgranule 176を特定できます。 + +ClickHouseは我々のサンプルクエリ(UserIDが749.927.693であるインターネットユーザーのためのトップ10の最もクリックされたURL)を実行するために、観念的にUserID.binデータファイル内と平行してURL.binデータファイル内のgranule176を特定する必要があります。2つのgranuleは整列し、ClickHouseエンジンのさらなる処理のためにストリーミングされます。これは、全行の中から、まず最初にUserIDでフィルタリングされ、次にURL値ごとにグループ化され、最後に最も大きな10のURLグループを逆順に出力します。 + + +## 複数の主キーインデックスを使用する + + + +### セカンダリキーカラムは効率的でない可能性があります + +クエリがcompound keyの一部であり、最初のキーカラムでフィルタリングしている場合、[ClickHouseはそのキーカラムのインデックスマークに対してバイナリサーチアルゴリズムを走らせます](#the-primary-index-is-used-for-selecting-granules)。 + +ですが、クエリがcompound keyの一部であっても最初のキーカラムではないカラムでフィルタリングしている場合はどうなるでしょう? + +:::note +クエリが明示的に最初のキーカラムでフィルタリングしていないが、セカンダリキーカラムでフィルタリングしているシナリオについて説明します。 + +クエリが最初のキーカラムと任意のキーカラム(または複数カラム)の両方でフィルタリングしている場合、ClickHouseは最初のキーカラムのインデックスマークに対してバイナリサーチを行います。 +::: + +
+
+ + +クエリを使って、"http://public_search"をクリックしたユーザーのトップ10を計算します。 + +```sql +SELECT UserID, count(UserID) AS Count +FROM hits_UserID_URL +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +応答はこうなります: +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.086 sec. +// highlight-next-line +Processed 8.81 million rows, +799.69 MB (102.11 million rows/s., 9.27 GB/s.) +``` + +クライアントの出力は、[URLカラムが複合主キーの一部であるにもかかわらず](#a-table-with-a-primary-key)、ClickHouseがほぼフルテーブルスキャンを行ったことを示しています! ClickHouseがテーブルの8.87百万行中8.81百万行を読み取っています。 + +[トレースログ](/docs/ja/operations/server-configuration-parameters/settings.md/#server_configuration_parameters-logger)が有効化されている場合、ClickHouseサーバーログファイルは、ClickHouseが汎用排除検索を使用して、 +基準された1083 URLインデックスマークに、URLカラム値が"http://public_search"を含む行が存在する可能性のあるgranuleを特定していることを示しています: + +```response +...Executor): Key condition: (column 1 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Used generic exclusion search over index for part all_1_9_2 + with 1537 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 1076/1083 marks by primary key, 1076 marks to read from 5 ranges +...Executor): Reading approx. 8814592 rows with 10 streams +``` + +サンプルトレースログでは、10761083 granularが選択されて、URL値に一致する行を持っている可能性があることが示されています。この結果、8.81百万行がClickHouseエンジンにストリーミング(並行して10ストリームを使用)され、実際に"URL:"が"http://public_search"である行を特定します。しかし、[後に示すように](#query-on-url-fast)、選択された1076-granuleの中から実際に該当する行を持っているのは39だけです。 + +複合主キー(UserID, URL)に基づいた主キーインデックスは、特定のUserID値を持つ行をフィルタリングするクエリを加速するのには非常に役立ちましたが、指定のURL値を持つ行をフィルタリングするクエリを加速するにはあまり役立ちません。 + +そのため、URLカラムが最初のキーカラムではなく、したがってClickHouseは汎用排除検索アルゴリズム(バイナリサーチではありません)をURLカラムのインデックスマークに対して使用し、その**アルゴリズムの効果はUserIDカラムとのカードイナリティの差に依存している**からです。 + +このことを示すために、汎用排除検索がどのように機能するのかいくつかの詳細を示します。 + + + +### 汎用排除検索アルゴリズム + +以下は、クエリがセカンダリカラムでgranuleを選択するとき、先行するキーカラムに低いカードイナリティまたはより高いカードイナリティを持つ場合にClickHouse汎用排除検索アルゴリズムがどのように機能するかを示しています。 + +両方のケースの例として、考えてみます。 +- URLの値が"W3"である行を検索するクエリ。 +- 簡略化された値を持つ我々の打ち込みテーブルの抽象的なバージョン。 +- 同じ合成キー(UserID, URL)を持つ表インデックス。つまり、行は最初にUserID値でソートされています。同じUserID値を持つ行はURLでソートされます。 +- 2のgranuleサイズ、つまり各granuleに2行を含みます。 + +我々は、以下の図に示すように、各granuleの最初の + +テーブル行のキーカラム値をオレンジ色でマークしました。 + +**先行キーカラムが低いカードイナリティを持つ場合** + +UserIDに低いカードイナリティがあると仮定します。この場合、大きな可能性があるUserID値が複数のテーブル行やgranule、すなわちインデックスマークに広がることになります。同じUserIDを持つインデックスマークについては、インデックスマーク内のURL値は昇順でソートされます(テーブル行が最初にUserIDでその後URLでソートされるため)。これにより以下で説明されるような効率的なフィルタリングが可能です: + + + +上記の図では我々の抽象的なサンプルデータに対してgranule選択プロセスに関する3つの異なるシナリオが存在します: + +1.**URL値がW3より小さく、次のインデックスマークのもURL値がW3より小さい場合のインデックスマーク0**:は、マーク0と1に同じUserID値があるため除外されます。この排除条件は、granule0が完全にU1 UserID値で構成されていることを確認して、ClickHouseがgranule0の最大URL値がW3より小さいと仮定してgranuleを除外できることを保証します。 + +2. **URL値がW3以下で、次のインデックスマークのURL値がW3以上の場合のインデックスマーク1**:は選択されます。これはgranule1がURL W3を持つ行を持つ可能性があることを意味します。 + +3. **URL値がW3より大きいインデックスマーク2および3**:は、主キーインデックスのインデックスマークは、それぞれのgranuleに対するテーブル行の最初のキーカラム値を含んでおり、テーブル行がキーカラム値でディスク上でソートされているため、granule2および3がURL値W3を含むことができないため除外されます。 + +**先行キーカラムが高いカードイナリティを持つ場合** +ユーザーIDのカーディナリティが高い場合、同じユーザーIDの値が複数のテーブル行やグラニュールに分散している可能性は低いです。これは、インデックスマークのURL値が単調増加していないことを意味します: + + + +上の図で示されているように、URL値がW3より小さいすべてのマークが選択され、その関連するグラニュールの行がClickHouseエンジンにストリーミングされます。 + +これは、図中のすべてのインデックスマークが上述のシナリオ1に該当するにもかかわらず、「次のインデックスマークが現在のマークと同じユーザーID値を持つ」という除外前提条件を満たしていないため、除外できないからです。 + +例えば、インデックスマーク0を考えてみます。このマークの**URL値はW3より小さく、次のインデックスマークのURL値もW3より小さい**です。しかし、次のインデックスマーク1が現在のマーク0と同じユーザーID値を持っていないため、これを除外することは*できません*。 + +これは最終的に、ClickHouseがグラニュール0のURL値の最大値について仮定をすることを妨げます。代わりに、グラニュール0がURL値W3を持つ行を含む可能性があると考え、マーク0を選択せざるを得ません。 + +同じ状況はマーク1, 2, 3についても真です。 + +:::note 結論 +ClickHouseが使用している一般的な除外検索アルゴリズムは、コンパウンドキーの一部であるカラムをフィルタリングしているときに、二分探索アルゴリズムを使用する代わりに最も効果的です。ただし、前のキーのカラムのカーディナリティが低い(または低い場合)です。 +::: + +サンプルデータセットでは、両方のキーのカラム(UserID, URL)が同様に高いカーディナリティを持ち、説明されているように、URLカラムの前のキーのカラムが高い(または同様の)カーディナリティを持つとき、一般的な除外検索アルゴリズムはあまり効果的ではありません。 + +### データスキップインデックスについての注意 + +ユーザーIDとURLのカーディナリティが同様に高いため、[URLでクエリをフィルタリングする](#query-on-url)ことによってURLカラムに[二次データスキップインデックス](./skipping-indexes.md)を作成しても大きな恩恵はありません。 + +例えば、次の2つのステートメントは、テーブルのURLカラムに[minmax](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#primary-keys-and-indexes-in-queries)データスキップインデックスを作成し、データを挿入します: +```sql +ALTER TABLE hits_UserID_URL ADD INDEX url_skipping_index URL TYPE minmax GRANULARITY 4; +ALTER TABLE hits_UserID_URL MATERIALIZE INDEX url_skipping_index; +``` +ClickHouseは4つの連続する[グラニュール](#data-is-organized-into-granules-for-parallel-data-processing)のグループごとに最小URL値と最大URL値を保存する追加のインデックスを作成しました(`ALTER TABLE`ステートメントの上の`GRANULARITY 4`句に注意してください)。 + + + +最初のインデックスエントリ(図中の「マーク0」)は[テーブルの最初の4つのグラニュールに属する行](#data-is-organized-into-granules-for-parallel-data-processing)の最小URL値と最大URL値を保存します。 + +2番目のインデックスエントリ(‘マーク1’)はテーブルの次の4つのグラニュールに属する行の最小URL値と最大URL値を保存します。以降同様です。 + +(ClickHouseはインデックスマークに関連するグラニュールのグループを特定するための[マークファイル](#mark-files-are-used-for-locating-granules)を作成しました。) + +ユーザーIDとURLのカーディナリティが同様に高いため、我々の[URLでクエリをフィルタリングする](#query-on-url)際に、この二次データスキップインデックスはグラニュールを除外するのに役立ちません。 + +クエリが探している特定のURL値(すなわち 'http://public_search')は、各グラニュールのグループでインデックスにより保存されている最小値と最大値の間にある可能性が高く、ClickHouseはグラニュールのグループを選択せざるを得ません(クエリと一致する行が含まれている可能性があるため)。 + +### 複数の主キーインデックスを使用する必要性 + +その結果、特定のURLを持つ行をフィルタリングするサンプルクエリの実行速度を大幅に上げるためには、そのクエリに最適化された主キーインデックスを使用する必要があります。 + +さらに特定のユーザーIDを持つ行をフィルタリングするサンプルクエリの良好なパフォーマンスを維持したい場合、複数の主キーインデックスを使用する必要があります。 + +以下にその方法を示します。 + + + +### 追加の主キーインデックスを作成するためのオプション + +以下の三つの選択肢のいずれかを使用して、特定のユーザーIDでフィルタリングするクエリと特定のURLでフィルタリングするクエリの両方を劇的に高速化したい場合、複数の主キーインデックスを使用する必要があります。 + +- 異なる主キーを持つ**第2のテーブル**を作成します。 +- 既存のテーブルに**マテリアライズドビュー**を作成します。 +- 既存のテーブルに**プロジェクション**を追加します。 + +すべての選択肢において、サンプルデータが新しいテーブルに複製され、テーブル主キーインデックスと行ソート順が再編成されます。 + +しかし、クエリと挿入ステートメントのルーティングに関して、ユーザーにとっての追加テーブルの透明性は各選択肢で異なります。 + +異なる主キーを持つ**第2のテーブル**を作成するとき、クエリはクエリに最適なテーブルバージョンに明示的に送信され、新しいデータは両方のテーブルに明示的に挿入されてテーブルを同期した状態に保つ必要があります: + + +**マテリアライズドビュー**を使用すると、追加テーブルは暗黙的に作成され、データは両方のテーブル間で自動的に同期されます: + + +そして、**プロジェクション**は最も透明性の高いオプションです。これは、データの変更に伴って暗黙的に(隠されて)新しいテーブルを自動的に同期させるだけでなく、ClickHouseがクエリに最も効果的なテーブルバージョンを自動的に選択するからです: + + +以下では、複数の主キーインデックスを作成し使用するための3つのオプションについて、詳細かつ実際の例を交えて説明します。 + + + +### オプション1: 第2のテーブル + + +元のテーブルと比較して主キーのキー列の順序を変更して新しい追加テーブルを作成します: + +```sql +CREATE TABLE hits_URL_UserID +( + `UserID` UInt32, + `URL` String, + `EventTime` DateTime +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (URL, UserID) +ORDER BY (URL, UserID, EventTime) +SETTINGS index_granularity = 8192, index_granularity_bytes = 0, compress_primary_key = 0; +``` + +すべての元のテーブル[#やテーブル(#a-table-with-a-primary-key)]から8.87百万行を追加する: + +```sql +INSERT INTO hits_URL_UserID +SELECT * from hits_UserID_URL; +``` + +レスポンスは以下のようになります: + +```response +Ok. + +0 rows in set. Elapsed: 2.898 sec. Processed 8.87 million rows, 838.84 MB (3.06 million rows/s., 289.46 MB/s.) +``` + +最後にテーブルを最適化します: +```sql +OPTIMIZE TABLE hits_URL_UserID FINAL; +``` + +主キーの列の順序を変更したことにより、挿入された行はこれまでの[#やテーブル(#a-table-with-a-primary-key)]と比較してディスク上に異なる辞書順に格納され、そのためテーブルの1083グラニュールも異なる値を持つようになります: + + +これは生成された主キーです: + + +これは、URLカラムでフィルタリングを行うサンプルクエリの実行を大幅に高速化するために使用されます。例えば、URL "http://public_search"を最も頻繁にクリックしたトップ10のユーザーを計算します: +```sql +SELECT UserID, count(UserID) AS Count +// highlight-next-line +FROM hits_URL_UserID +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは以下のとおりです: + + +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.017 sec. +// highlight-next-line +Processed 319.49 thousand rows, +11.38 MB (18.41 million rows/s., 655.75 MB/s.) +``` + +前述の[#や主キー列使用時フィルタリング[#filtering-on-key-columns-after-the-first](#filtering-on-key-columns-after-the-first)をほぼ行ったときと異なり、ClickHouseはそのクエリをより効果的に実行しました。 + +元のテーブルでの主キーによるインデックスを持つ状況では,ユーザーIDは最初でURLは2番目のキー列であったため,ClickHouseはインデックスマークに対して一般的な除外検索を実行していたが,ユーザーIDとURLのカーディナリティが同じかったため,それはあまり効果的でなかった. + +URLが主キーの最初の列として考慮されると,ClickHouseはインデックスマークに対するバイナリサーチを実行しています。 + +ClickHouseサーバーログの対応するトレースログはそれを確認します: +```response +...Executor): Key condition: (column 0 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Running binary search on index range for part all_1_9_2 (1083 marks) +...Executor): Found (LEFT) boundary mark: 644 +...Executor): Found (RIGHT) boundary mark: 683 +...Executor): Found continuous range in 19 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 39/1083 marks by primary key, 39 marks to read from 1 ranges +...Executor): Reading approx. 319488 rows with 2 streams +``` + ClickHouseは1076の汎用的除外検索を使用していたとき以下の39のインデックスマークだけを選択しました。 + +追加のテーブルは、URLでフィルタリングするサンプルクエリの実行速度を向上させるために最適化されています。 + +元のテーブルでの[#クエリのバッドパフォーマンス](#query-on-url-slow)と同様に、新しい追加のテーブルヒット_URL_ユーザーIDにおけるユーザーIDでフィルタリングするクエリの例はあまり効果的ではありません。ユーザーIDがテーブルの主キーの2番目のキー列であるため、ClickHouseはグラニュール選択のための一般的除外検索を使用しています。これがユーザーIDとURLというように同様に高いカーディナリティを持つ場合、あまり効果的でありません。この詳細については詳細を開いてください。 +
+ + ユーザーIDでフィルタリングするクエリはパフォーマンスが悪くなった + +

+ +```sql +SELECT URL, count(URL) AS Count +FROM hits_URL_UserID +WHERE UserID = 749927693 +GROUP BY URL +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは: + +```response +┌─URL────────────────────────────┬─Count─┐ +│ http://auto.ru/chatay-barana.. │ 170 │ +│ http://auto.ru/chatay-id=371...│ 52 │ +│ http://public_search │ 45 │ +│ http://kovrik-medvedevushku-...│ 36 │ +│ http://forumal │ 33 │ +│ http://korablitz.ru/L_1OFFER...│ 14 │ +│ http://auto.ru/chatay-id=371...│ 14 │ +│ http://auto.ru/chatay-john-D...│ 13 │ +│ http://auto.ru/chatay-john-D...│ 10 │ +│ http://wot/html?page/23600_m...│ 9 │ +└────────────────────────────────┴───────┘ + +10 rows in set. Elapsed: 0.024 sec. +// highlight-next-line +Processed 8.02 million rows, +73.04 MB (340.26 million rows/s., 3.10 GB/s.) +``` + +サーバーログ: +```response +...Executor): Key condition: (column 1 in [749927693, 749927693]) +// highlight-next-line +...Executor): Used generic exclusion search over index for part all_1_9_2 + with 1453 steps +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 980/1083 marks by primary key, 980 marks to read from 23 ranges +...Executor): Reading approx. 8028160 rows with 10 streams +``` +

+
+ +我々は今、二つのテーブルを持っています。ユーザーIDでフィルタリングするクエリを加速するために最適化されたテーブルと、URLでフィルタリングするクエリを加速するために最適化されたテーブルです: + + +### オプション2: マテリアライズドビュー + +既存のテーブルに[マテリアライズドビュー](/docs/ja/sql-reference/statements/create/view.md)を作成します。 +```sql +CREATE MATERIALIZED VIEW mv_hits_URL_UserID +ENGINE = MergeTree() +PRIMARY KEY (URL, UserID) +ORDER BY (URL, UserID, EventTime) +POPULATE +AS SELECT * FROM hits_UserID_URL; +``` + +レスポンスは以下のようになります: + +```response +Ok. + +0 rows in set. Elapsed: 2.935 sec. Processed 8.87 million rows, 838.84 MB (3.02 million rows/s., 285.84 MB/s.) +``` + +:::note +- ビューの主キーにおいて、元のテーブルと比較してキーのカラムの順序を入れ替えています。 +- マテリアライズドビューは**暗黙的に作成されたテーブル**によってバックアップされ、その行の順序と主キーは与えられたプライマリキー定義に基づいています。 +- 暗黙的に作成されたテーブルは`SHOW TABLES`クエリによって表示され、その名前は`.inner`で始まります。 +- マテリアライズドビューのバックアップテーブルをまず明示的に作成してから、そのビューを`TO [db].[table]`[句](/docs/ja/sql-reference/statements/create/view.md)を使ってそれにターゲットさせることも可能です。 +- `POPULATE`キーワードを使用して、ソーステーブル[ヒット_ユーザーID_URL](#a-table-with-a-primary-key)から暗黙的に作成されたテーブルに即座にすべての8.87百万行を挿入します。 +- ソーステーブルヒット_ユーザーID_URLに新しい行が挿入されると、その行は暗黙的に作成されたテーブルにも自動的に挿入されます。 +- 暗黙的に作成されたテーブルは、以前に明示的に作成した二次テーブルと同じ行順と主キーを持つことになります: + + + +ClickHouseは[カラムデータファイル](#data-is-stored-on-disk-ordered-by-primary-key-columns) (*.bin)、[マークファイル](#mark-files-are-used-for-locating-granules) (*.mrk2)、およびインデックス(`primary.idx`)を、ClickHouseサーバーのデータディレクトリ内の特別なフォルダに格納しています: + + + +::: + + +マテリアライズドビューのバックアップとして暗黙的に作成されたテーブル(およびその主キー)は、URLカラムでフィルタリングを行うサンプルクエリの実行を大幅に高速化するために現時点で使用されます: +```sql +SELECT UserID, count(UserID) AS Count +// highlight-next-line +FROM mv_hits_URL_UserID +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは以下の通りです: + +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.026 sec. +// highlight-next-line +Processed 335.87 thousand rows, +13.54 MB (12.91 million rows/s., 520.38 MB/s.) +``` + +効果的に言えば、暗黙的に作成されたテーブル(およびそのプライマリインデックス)は、以前に明示的に作成した二次テーブルと同一なので、クエリは明示的に作成したテーブルと同じ効果的な方法で実行されます。 + +ClickHouseサーバーログの対応するトレースログは、ClickHouseがインデックスマークにバイナリサーチ実行していることを確認します: + +```response +...Executor): Key condition: (column 0 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Running binary search on index range ... +... +...Executor): Selected 4/4 parts by partition key, 4 parts by primary key, +// highlight-next-line + 41/1083 marks by primary key, 41 marks to read from 4 ranges +...Executor): Reading approx. 335872 rows with 4 streams +``` + + + +### オプション3: プロジェクション + +既存のテーブルにプロジェクションを追加: +```sql +ALTER TABLE hits_UserID_URL + ADD PROJECTION prj_url_userid + ( + SELECT * + ORDER BY (URL, UserID) + ); +``` + +そしてプロジェクションをマテリアライズします: +```sql +ALTER TABLE hits_UserID_URL + MATERIALIZE PROJECTION prj_url_userid; +``` + +:::note +- プロジェクションは行順と主キー定義に基づいている**隠れたテーブル**を作成する。 +- 隠れたテーブルは`SHOW TABLES`クエリには表示されません。 +- `MATERIALIZE`キーワードを使用して、ソーステーブル[#hitsUserID_URL](#a-table-with-a-primary-key)からすべての8.87百万行を即座に格納する。 +- ソーステーブルの[#hits_USERID_URL](#a-table-with-a-primary-key)に新しい行が挿入されると、その行は隠れたテーブルにも自動的に挿入されます。 +- 常にクエリは構文上でソーステーブル[#hits_USERID_URL](#a-table-with-a-primary-key)をターゲットにしており、行の順序と主キーのある隠れたテーブルがより効果的なクエリ実行を可能にする場合、そのクエリに対応するものです。 +- しかし、ORDER BYがプロジェクションのORDER BYと一致する場合でも、プロジェクションはクエリのORDER BYをより効率的にすることはないことに注意してください (詳細は、https://github.com/ClickHouse/ClickHouse/issues/47333 を参照)。 +- 事実上、暗黙に作成された隠れたテーブルは以前に明示的に作成した二次テーブルと同様の行順と主キーを持ちます: + + + +ClickHouseは、ソーステーブルのデータファイル、マークファイル、および主キーと一緒に、特別なフォルダ(オレンジ色で表示されています)に隠れたテーブルの[カラムデータファイル](#data-is-stored-on-disk-ordered-by-primary-key-columns) (*.bin)、マークファイル (*.mrk2)、および主キー (primary.idx) ファイルを格納しています: + + +::: + + +仮想的な隠れたテーブルとその主キーはURLカラムでフィルタリングを行うサンプルクエリの実行スピードを劇的に上げるために暗黙的に使用されます。注意として、クエリは構文的にプロジェクションのソーステーブルをターゲットにしています。 +```sql +SELECT UserID, count(UserID) AS Count +// highlight-next-line +FROM hits_UserID_URL +WHERE URL = 'http://public_search' +GROUP BY UserID +ORDER BY Count DESC +LIMIT 10; +``` + +レスポンスは以下の通りです: + +```response +┌─────UserID─┬─Count─┐ +│ 2459550954 │ 3741 │ +│ 1084649151 │ 2484 │ +│ 723361875 │ 729 │ +│ 3087145896 │ 695 │ +│ 2754931092 │ 672 │ +│ 1509037307 │ 582 │ +│ 3085460200 │ 573 │ +│ 2454360090 │ 556 │ +│ 3884990840 │ 539 │ +│ 765730816 │ 536 │ +└────────────┴───────┘ + +10 rows in set. Elapsed: 0.029 sec. +// highlight-next-line +Processed 319.49 thousand rows, 1 +1.38 MB (11.05 million rows/s., 393.58 MB/s.) +``` + +暗黙的に作成された隠れたテーブルとその主キーは、以前に明示的にテーブルを作成したものと同一であるため、クエリは明示的にテーブルを作成したときと同様に効果的に実行されます。 + +ClickHouseサーバーログの対応するトレースログが、ClickHouseがインデックスマークに対してバイナリサーチを行っていることを確認しました: + + +```response +...Executor): Key condition: (column 0 in ['http://public_search', + 'http://public_search']) +// highlight-next-line +...Executor): Running binary search on index range for part prj_url_userid (1083 marks) +...Executor): ... +// highlight-next-line +...Executor): Choose complete Normal projection prj_url_userid +...Executor): projection required columns: URL, UserID +...Executor): Selected 1/1 parts by partition key, 1 parts by primary key, +// highlight-next-line + 39/1083 marks by primary key, 39 marks to read from 1 ranges +...Executor): Reading approx. 319488 rows with 2 streams +``` + +### まとめ + +コンパウンドプライマリキーを持つ我々の[#テーブル](#a-table-with-a-primary-key)のプライマリインデックスが[ユーザーIDでフィルタリングするクエリ](#the-primary-index-is-used-for-selecting-granules)を加速するのに有用であった。 しかし、そのインデックスは、URLカラムがコンパウンドプライマリキーに加わっているにもかかわらず[URLでフィルタリングするクエリ](#guidelines-for-choosing-either-mergetree-or-replicatedmergetree)-の高速化には貢献しませんでした。 + +逆に:[URL, UserID](#secondary-table)のコンパウンドプライマリキーを持つ我々の[#テーブル](#a-table-with-a-primary-key)のプライマリインデックスは[URLでフィルタリングするクエリ](#query-on-url)を加速しましたが、[ユーザーIDでフィルタリングするクエリ](#the-primary-index-is-used-for-selecting-granules)-実行にあまり貢献しませんでした。 + +プライマリキーのカラムユーザーIDとURLのカーディナリティが似ているため、2つ目のキーのカラムがインデックスに含まれていても、[2番目のキーのカラムでフィルタリングを行うクエリ](#generic-exclusion-search-slow)はその恩恵を受けません。 + +したがって、プライマリインデックスから2番目のキーのカラムを削除すること(インデックスのメモリ使用量が少なくなる結果)や、 [複数のプライマリインデックス](#multiple-primary-indexes)を使用することは理にかなっています。 + +しかしながら、コンパウンドプライマリキーのキーのカラム群がカーディナリティの大きな違いがある場合、 [クエリにとって](#generic-exclusion-search-fast)カーディナリティにしたがってプライマリキーのカラムを昇順に並べることは利益になります。 + +キーのカラム間のカーディナリティ差が高ければ高いほど、それらのカラムがキー内で並べられる順序の影響が大きくなります。次のセクションでそれをデモンストレーションします。 + +## キーのカラムを効率的に並べ替える + + + +コンパウンドプライマリキーではキーのカラムの順序は、以下の両方において大きく影響を与えます: +- クエリ内の二次キーのカラムに対するフィルタリングの効率 +- テーブルのデータファイルの圧縮率 + +それを証明するため、我々はwebトラフィックのサンプルデータセットのバージョンを使用します。 +各行がインターネットユーザー(`UserID`カラム)がURL(`URL`カラム)へのアクセスがbotトラフィックとしてマークされたかどうかを示す3つのカラムを持っています。 + +1つのコンパウンドプライマリキーを使用し、web分析クエリを高速化するためのすべての3つのカラムをキーのカラムとして使用します。以下が考えられるクエリ: +- 特定のURLへのトラフィックの何%がbotによるものか +- 指定のユーザーがbotかどうか(そのユーザーからのトラフィックの何%がbotと仮定されているか) +など + +コンパウンドプライマリキーに使用しようとしている3つのカラムのカーディナリティを計算するためにこのクエリを使用します(TSVデータをアドホックにクエリするために[URLテーブル関数](/docs/ja/sql-reference/table-functions/url.md)を使用しています)。このクエリを`clickhouse client`で実行します: +```sql +SELECT + formatReadableQuantity(uniq(URL)) AS cardinality_URL, + formatReadableQuantity(uniq(UserID)) AS cardinality_UserID, + formatReadableQuantity(uniq(IsRobot)) AS cardinality_IsRobot +FROM +( + SELECT + c11::UInt64 AS UserID, + c15::String AS URL, + c20::UInt8 AS IsRobot + FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz') + WHERE URL != '' +) +``` +レスポンスは以下の通りです: +```response +┌─cardinality_URL─┬─cardinality_UserID─┬─cardinality_IsRobot─┐ +│ 2.39 million │ 119.08 thousand │ 4.00 │ +└─────────────────┴────────────────────┴─────────────────────┘ + +1 row in set. Elapsed: 118.334 sec. Processed 8.87 million rows, 15.88 GB (74.99 thousand rows/s., 134.21 MB/s.) +``` + +特に`URL`および`IsRobot`カラム間に非常に大きなカードナリティの違いがあります。したがって、このコンパウンドプライマリキーのカラムの順番は、そのカラムでフィルタリングするクエリの効率的な加速と、テーブルのカラムデータファイルの最適な圧縮比を達成するために重要です。 + +それを証明するため、我々はボットトラフィック分析データのために2つのテーブルバージョンを作ります: +- コンパウンドプライマリキーが`(URL, UserID, IsRobot)`で、キーのカラムをカードナリティの降順に並べた`hits_URL_UserID_IsRobot`テーブル +- コンパウンドプライマリキーが`(IsRobot, UserID, URL)`で、キーのカラムをカードナリティの昇順に並べた`hits-IsRobot_UserID_URL`テーブル + +コンバウンドプライマリキー`(URL, UserID, IsRobot)`を持つ`hits_URL_UserID_IsRobot`テーブルを作成する: +```sql +CREATE TABLE hits_URL_UserID_IsRobot +( + `UserID` UInt32, + `URL` String, + `IsRobot` UInt8 +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (URL, UserID, IsRobot); +``` + +そして、887百万行を挿入します: +```sql +INSERT INTO hits_URL_UserID_IsRobot SELECT + intHash32(c11::UInt64) AS UserID, + c15 AS URL, + c20 AS IsRobot +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz') +WHERE URL != ''; +``` +レスポンスは以下のようになります: +```response +0 rows in set. Elapsed: 104.729 sec. Processed 8.87 million rows, 15.88 GB (84.73 thousand rows/s., 151.64 MB/s.) +``` + + +次にコンパウンドプライマリキー`(IsRobot, UserID, URL)`を持つ`hits_IsRobot_UserID_URL`テーブルを作成します: +```sql +CREATE TABLE hits_IsRobot_UserID_URL +( + `UserID` UInt32, + `URL` String, + `IsRobot` UInt8 +) +ENGINE = MergeTree +// highlight-next-line +PRIMARY KEY (IsRobot, UserID, URL); +``` +そして、以前のテーブルに挿入した行と同じ8.87百万行を挿入します: + +```sql +INSERT INTO hits_IsRobot_UserID_URL SELECT + intHash32(c11::UInt64) AS UserID, + c15 AS URL, + c20 AS IsRobot +FROM url('https://datasets.clickhouse.com/hits/tsv/hits_v1.tsv.xz') +WHERE URL != ''; +``` +レスポンスは以下の通り: +```response +0 rows in set. Elapsed: 95.959 sec. Processed 8.87 million rows, 15.88 GB (92.48 thousand rows/s., 165.50 MB/s.) +``` + + + +### 二次キーのカラムでの効率的なフィルタリング + +クエリがコンパウンドキーの一部のカラム、すなわち最初のキーのカラムでフィルタリングされている場合、ClickHouseは[#バイナリ検索アルゴリズム](#the-primary-index-is-used-for-selecting-granules)をそのキーのカラムのインデックスマークで実行します。 + +クエリがコンパウンドキーの一部のカラム(最初のキーのカラムでない)にのみフィルタリングされている場合、ClickHouseは[#一般的除外検索アルゴリズム](#secondary-key-columns-can-not-be-inefficient)をそのキーのカラムのインデックスマークで使用します。 + +2番目のケースでは、コンパウンドプライマリキーのキーのカラムの順序が一般的除外検索アルゴリズムの[#効率にとって重要です](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444)。 + +以下はカードナリティが降順となる`(URL, UserID, IsRobot)`のキーのカラムを並べ替えたテーブルでUserIDカラムをフィルタリングしているクエリです: +```sql +SELECT count(*) +FROM hits_URL_UserID_IsRobot +WHERE UserID = 112304 +``` +レスポンスは以下のとおりです: +```response +┌─count()─┐ +│ 73 │ +└─────────┘ + +1 row in set. Elapsed: 0.026 sec. +// highlight-next-line +Processed 7.92 million rows, +31.67 MB (306.90 million rows/s., 1.23 GB/s.) +``` + +これも、先に作成した、カードナリティが昇順になるようにキーのカラムを並べた`(IsRobot, UserID, URL)`のテーブルで同じクエリ: +```sql +SELECT count(*) +FROM hits_IsRobot_UserID_URL +WHERE UserID = 112304 +``` +レスポンスは以下のとおりです: +```response +┌─count()─┐ +│ 73 │ +└─────────┘ + +1 row in set. Elapsed: 0.003 sec. +// highlight-next-line +Processed 20.32 thousand rows, +81.28 KB (6.61 million rows/s., 26.44 MB/s.) +``` + +カードナリティを昇順に並べたテーブルの方が、クエリの実行が大幅に効果的で速いことが分かります。 + +その理由は、最も効果的に[一般的除外検索アルゴリズム](https://github.com/ClickHouse/ClickHouse/blob/22.3/src/Storages/MergeTree/MergeTreeDataSelectExecutor.cpp#L1444)が[グラニュール](#the-primary-index-is-used-for-selecting-granules)が選択される時の二次キーのカラムにおける、先行するキーのカラムのカードナリティが低い場合です。それを前述のセクションで詳しく説明しました。 + +### データファイルの最適な圧縮比 + +次のクエリは、上で作成した2つのテーブル間のユーザーIDカラムの圧縮比を比較します: + +```sql +SELECT + table AS Table, + name AS Column, + formatReadableSize(data_uncompressed_bytes) AS Uncompressed, + formatReadableSize(data_compressed_bytes) AS Compressed, + round(data_uncompressed_bytes / data_compressed_bytes, 0) AS Ratio +FROM system.columns +WHERE (table = 'hits_URL_UserID_IsRobot' OR table = 'hits_IsRobot_UserID_URL') AND (name = 'UserID') +ORDER BY Ratio ASC +``` +これがレスポンスです: +```response +┌─Table───────────────────┬─Column─┬─Uncompressed─┬─Compressed─┬─Ratio─┐ +│ hits_URL_UserID_IsRobot │ UserID │ 33.83 MiB │ 11.24 MiB │ 3 │ +│ hits_IsRobot_UserID_URL │ UserID │ 33.83 MiB │ 877.47 KiB │ 39 │ +└─────────────────────────┴────────┴──────────────┴────────────┴───────┘ + +2 rows in set. Elapsed: 0.006 sec. +``` +カードナリティを昇順に並べたテーブル`(IsRobot, UserID, URL)`では、`UserID`カラムの圧縮比が大幅に高いことが確認されます。 + +どちらのテーブルにも同じデータが保存されている(同じ8.87百万行を両方のテーブルに挿入しました)にもかかわらず、コンポーネントプライマリキーのキーのカラムの順序がテーブルの[カラムデータファイル](#data-is-stored-on-disk-ordered-by-primary-key-columns)に格納される圧縮データがどれだけのディスクスペースを要するかに大きな影響を与えます: +- カードナリティを降順に並べたコンパウンドプライマリキー`(URL, UserID, IsRobot)`を持つ`hits_URL_UserID_IsRobot`テーブルでは、データファイル`UserID.bin`のディスクスペースは**11.24 MiB**です。 +- カードナリティを昇順に並べたコンパウンドプライマリキー`(IsRobot, UserID, URL)`を持つ`hits_IsRobot_UserID_URL`テーブルの場合、データファイル`UserID.bin`のディスクスペースはわずか**877.47 KiB**です。 + +ディスク上でのテーブルのカラムの良好な圧縮比を持つことは、ディスクスペースを節約するだけでなく、それによってそのカラムからデータを読み込まなければならないクエリ(特に分析クエリ)が高速化され、メインメモリのファイルキャッシュにディスクからデータを移動するためのi/oが少なくて済む。 + +次に例を示すことで、プライマリキーのカラムをカードナリティにしたがって昇順に並べることがテーブルのカラムの圧縮比にとって有利な理由を説明します。 + +以下の図は、プライマリキーのカラムをカードナリティにしたがって昇順に並べた場合の行をディスクに並べる順序を概略します: + + +テーブルの行データはプライマリキーのカラムでディスクに格納されることを[議論しました](#data-is-stored-on-disk-ordered-by-primary-key-columns)。 + +上記の方法では、そのテーブルの行はまず`cl`値でソートされ、同じ`cl`値を持つ行は`ch`値でソートされます。そしてカードナリティが低い最初のキーのカラム`cl`があるため、同じ`cl`値の行が存在する可能性が高い。したがって、`ch`値は(同じ`cl`値の行で)局所的にソートされています。 + +カラム内で、類似したデータが近隣に配置されると、データの圧縮が容易になります +一般的に、圧縮アルゴリズムはデータの長さに対する(より多くのデータが使用されるほど、圧縮のためにより良くなる)および局所性(より類似したデータであれば、より良い圧縮比率が得られる)を考慮します。 + +これに対して、以下の図は、プライマリキーのカラムをカードナリティにしたがって降順に並べた場合の行をディスクに並べる順序を概略します: + + +今度はテーブルの行がまず`ch`値を基に並べられ、同じ`ch`値を持つ行は`cl`値で最終的な順序が決定される。 +ただし、最初のキーのカラム`ch`が非常に高いカードナリティを持っているため、同じ`ch`値を持つ行がほとんどない可能性がある。したがって、`cl`値が(同じ`ch`値を持つ行で)局所的にソートされる可能性は少ない。 + +したがって、`cl`値はおそらくランダムな順序であり、局所性が悪く圧縮比も悪い。 + +### サマリー + +二次キーのカラムでの効率的なフィルタリングとテーブルのカラムデータファイルの圧縮比の両方において、プライマリキー内のカラムをそのカーディナリティに従って昇順に並べることが有益です。 + +### 関連コンテンツ +- Blog: [クリックハウスのクエリをスーパーチャージするには](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes) + +## シングル行を効率的に特定する + +場合によってはClickHouse上に構築したアプリケーションがClickHouseテーブルの特定の行を特定する必要があることがありますが、通常はClickHouseの[^best-uses-for-clickhouse]最適な使用方法ではありません。 + +そのための直感的な解決策は、各行に一意の値を持つ[UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)カラムを使い、行の高速な検索の目的でそのカラムをプライマリキーのカラムとして使用することです。 + +最も高速な検索のためには、UUIDカラムはプライマリキーのカラムの最初に[する必要があります](#the-primary-index-is-used-for-selecting-granules) 。 + +プライマリキーまたはカードナリティが非常に高いカラムを含むコンパウンドプライマリキーのカラムを、そのプライマリキー列の後の低いカードナリティのカラムより前に持つことがあると、[テーブル内の他のカラムの圧縮比の劣化](#optimal-compression-ratio-of-data-files)につながります。 + +最速の検索と最適なデータ圧縮の妥協としては、UUIDを最後のキー列として持つコンパウンドプライマリキーを使用し、いくつかのテーブルのカラムで良好な圧縮比を確保しています。 + +### 具体的な例 + +具体的な例として、Alexey Milovidovが開発し[ブログに書いた例](https://clickhouse.com/blog/building-a-paste-service-with-clickhouse/) のhttps://pastila.nlが柔軟なペーストサービスがあります。 + +テキストエリアへの変更があると(例えば、テキストエリアでのタイピングによるキー入力のたびに)、データが自動でClickHouseテーブル行(変更1つにつき1行)に保存されます。 + +特定の行のバージョンを特定し取得する方法の1つとして、行に含まれる内容のハッシュをそのテーブル行のUUIDとして使用することが考えられます。 + +以下の図は、何を示すか: +- 内容変更時の行の挿入順序(例えば、テキストエリアにテキストを入力するキー入力による変更) +- `PRIMARY KEY (hash)`が使用されたときに挿入された行からのデータのディスク上での順序: + + + +`hash`カラムがプライマリキーのカラムとして使用されているため、 +- 特定の行を非常にすばやく[検索できます](#the-primary-index-is-used-for-selecting-granules)。 しかし +- テーブルの行(カラムデータ)は、(一意でランダムな)ハッシュ値によってディスク上の順序づけがされるため、contentカラムの値もランダム順で保存され、データの局所性がないためcontentカラムのデータファイルの圧縮比が最適化されていません。 + +データの圧縮比を大幅に改善し、特定の行の高速検索を実現するために、`pastila.nl`は特定の行を特定するために、2つのハッシュ(およびコンパウンドプライマリキー)を使用しています: +- ハッシュデータとは異なり、各データに対して固有のハッシュが設定されます。 +- 小さなデータ変更で変化しない[局所性に敏感なハッシュ(フィンガープリント)](https://en.wikipedia.org/wiki/Locality-sensitive_hashing) + +以下の図は、何を示すか: +- 内容変更時の行の挿入順序(例えば、テキストエリアにテキストを入力するキー入力による変更) +- コンパウンド`PRIMARY KEY (fingerprint, hash)`が使用されたときに挿入された行からのデータのディスク上での順序: + + + +行は`fingerprint`によってまず順序づけられ、同じfingerprintを持つ行では`hash`によって最終的な順序が決まります。 + +僅かなデータ変更のみで同じfingerprintが生成されるため、似たデータがcontentカラムのディスク上で隣り合って保存されます。圧縮アルゴリズムは一般にデータの局所性の恩恵を受け(データが似ていれば似ているほど圧縮比が良くなる)、contentカラムの圧縮比に非常に有効です。 + +妥協としては、2つのフィールド(`fingerprint` および `hash`)を使用して特定の行を検索し、コンパウンド`PRIMARY KEY (fingerprint, hash)`によってプライマリインデックスを最適に利用することです。 diff --git a/docs/ja/guides/creating-tables.md b/docs/ja/guides/creating-tables.md new file mode 100644 index 00000000000..e6a8f646c76 --- /dev/null +++ b/docs/ja/guides/creating-tables.md @@ -0,0 +1,58 @@ +--- +sidebar_position: 1 +sidebar_label: テーブルの作成 +--- + +# ClickHouseにおけるテーブルの作成 + +ほとんどのデータベースと同様に、ClickHouseはテーブルを**データベース**に論理的にグループ化します。ClickHouseで新しいデータベースを作成するには、`CREATE DATABASE`コマンドを使用します。 + +```sql +CREATE DATABASE IF NOT EXISTS helloworld +``` + +同様に、`CREATE TABLE`を使用して新しいテーブルを定義します。(データベース名を指定しない場合、テーブルは`default`データベースに作成されます。)次のテーブルは`helloworld`データベース内に`my_first_table`という名前で作成されます。 + +```sql +CREATE TABLE helloworld.my_first_table +( + user_id UInt32, + message String, + timestamp DateTime, + metric Float32 +) +ENGINE = MergeTree() +PRIMARY KEY (user_id, timestamp) +``` + +上記の例では、`my_first_table`は四つのカラムを持つ`MergeTree`テーブルです。 + +- `user_id`: 32ビットの符号なし整数 +- `message`: `String`データ型で、他のデータベースシステムの`VARCHAR`、`BLOB`、`CLOB`などの型の代替 +- `timestamp`: 時間の瞬間を表す`DateTime`値 +- `metric`: 32ビットの浮動小数点数 + +:::note +テーブルエンジンは以下を決定します。 +- データの保存方法と保存場所 +- サポートされているクエリ +- データがレプリケートされるかどうか + +選択できるエンジンは多くありますが、単一ノードのClickHouseサーバーでの単純なテーブルには、[MergeTree](/ja/engines/table-engines/mergetree-family/mergetree.md)が適しています。 +::: + +## 主キーの簡単な紹介 + +先に進む前に、ClickHouseにおける主キーの働きを理解することが重要です(主キーの実装は意外に感じるかもしれません!)。 + +- ClickHouseでは、主キーは各行に対して**一意ではありません** + +ClickHouseテーブルの主キーは、データがディスクに書き込まれるときのソート方法を決定します。8,192行または10MBのデータごと(**インデックスの粒度**と呼ばれる)に主キーインデックスファイルにエントリが作成されます。この粒度の概念により、メモリに簡単に収まる**スパースインデックス**が作成され、グラニュールは`SELECT`クエリの処理中に最小のカラムデータ量のストライプを表します。 + +主キーは`PRIMARY KEY`パラメータを使用して定義できます。`PRIMARY KEY`を指定せずにテーブルを定義すると、キーは`ORDER BY`句で指定されたタプルになります。`PRIMARY KEY`と`ORDER BY`の両方を指定した場合、主キーはソート順序の接頭辞でなければなりません。 + +主キーはまたソートキーでもあり、`(user_id, timestamp)`のタプルです。 したがって、各カラムファイルに保存されるデータは、`user_id`、次に`timestamp`の順にソートされます。 + +:::tip +詳細については、ClickHouse Academyの[データモデリングトレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328860/?utm_source=clickhouse&utm_medium=docs)をチェックしてください。 +::: diff --git a/docs/ja/guides/developer/_category_.yml b/docs/ja/guides/developer/_category_.yml new file mode 100644 index 00000000000..8bfa1dade38 --- /dev/null +++ b/docs/ja/guides/developer/_category_.yml @@ -0,0 +1,8 @@ +position: 2 +label: 'Developer Guides' +collapsible: true +collapsed: true +link: + type: generated-index + title: Developer Guides + slug: /ja/guides/developer diff --git a/docs/ja/guides/developer/alternative-query-languages.md b/docs/ja/guides/developer/alternative-query-languages.md new file mode 100644 index 00000000000..88c249c0e69 --- /dev/null +++ b/docs/ja/guides/developer/alternative-query-languages.md @@ -0,0 +1,78 @@ +--- +slug: /ja/guides/developer/alternative-query-languages +sidebar_label: 代替クエリ言語 +title: 代替クエリ言語 +description: ClickHouseで代替クエリ言語を使用する +--- + +`dialect` 設定を使用して、ClickHouseで他のクエリ言語を使用してデータをクエリすることができます。 +`dialect` を変更した後、新しく設定された方言でクエリを実行できます。 + +現在サポートされている方言は次の通りです: +- `clickhouse`: デフォルトの [ClickHouse SQL 方言](../../sql-reference/syntax.md) + +エクスペリメンタルな方言: +- `prql`: [Pipelined Relational Query Language](https://prql-lang.org/) +- `kusto`: [Kusto Query Language (KQL)](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query) + +### ClickHouse SQL + +ClickHouseのデフォルトのSQL方言です。 + +```sql +SET dialect = 'clickhouse' +``` + +## エクスペリメンタルな方言 + +これらの方言は完全にはサポートされていないか、またはその元の仕様のすべての機能を持っていない可能性があります。 + +### Pipelined Relational Query Language (PRQL) + +方言を `prql` に設定した後、PRQL言語を使用してクエリを実行することができます: +```sql +SET dialect = 'prql' +``` + +その後、組み込まれているコンパイラがサポートするすべてのPRQL機能を使用できます: + +```prql +from trips +aggregate { + ct = count this + total_days = sum days +} +``` + +内部的にはClickHouseがPRQLクエリをSQLクエリに変換して実行します。 + +### Kusto Query Language (KQL) + +KustoがClickHouseで定義されているすべての関数にアクセスできるわけではないかもしれません。 + +Kustoを有効にする: +```sql +SET dialect = 'kusto' +``` + +`system.numbers(10)` から選択するクエリの例: +```sql +numbers(10) | project number +``` + +```sql +┌─number─┐ +│ 0 │ +│ 1 │ +│ 2 │ +│ 3 │ +│ 4 │ +│ 5 │ +│ 6 │ +│ 7 │ +│ 8 │ +│ 9 │ +└────────┘ +``` + + diff --git a/docs/ja/guides/developer/cascading-materialized-views.md b/docs/ja/guides/developer/cascading-materialized-views.md new file mode 100644 index 00000000000..a88debdba98 --- /dev/null +++ b/docs/ja/guides/developer/cascading-materialized-views.md @@ -0,0 +1,374 @@ +--- +slug: /ja/guides/developer/cascading-materialized-views +title: カスケードされたMaterialized View +description: ソーステーブルから複数のMaterialized Viewを使用する方法。 +keywords: [materialized view, 集計] +--- + +# カスケードされたMaterialized View + +この例では、まずMaterialized Viewを作成し、次にそのMaterialized ViewにさらにカスケードさせたMaterialized Viewを作成する方法を示します。このページでは、その方法、多くの可能性、および制限を確認できます。異なるユースケースは、2番目のMaterialized Viewをソースとして使用してMaterialized Viewを作成することで解決できます。 + +
+ +
+ +
+ +例: + +ドメイン名ごとの毎時のビュー数という架空のデータセットを使用します。 + +### 目的 + +1. 各ドメイン名ごとに月ごとに集計されたデータを必要とする。 +2. 各ドメイン名ごとに年ごとに集計されたデータも必要とする。 + +以下のオプションから選択できます: + +- SELECTリクエスト中にデータを読み取り、集計するクエリを書く +- データを新しい形式で取り込み時に準備する +- データを特定の集計形式で取り込み時に準備する + +Materialized Viewを使用してデータを準備すると、ClickHouseが必要とするデータ量と計算を制限できるため、SELECTリクエストがより高速になります。 + +## Materialized Viewのソーステーブル + +ソーステーブルを作成します。目標が個々の行ではなく集計データのレポートであるため、データを解析し、その情報をMaterialized Viewに渡し、実際の受信データを破棄できます。これにより目的が達成され、ストレージが節約できるため、`Null`テーブルエンジンを使用します。 + +```sql +CREATE DATABASE IF NOT EXISTS analytics; +``` + +```sql +CREATE TABLE analytics.hourly_data +( + `domain_name` String, + `event_time` DateTime, + `count_views` UInt64 +) +ENGINE = Null +``` + +:::note +Nullテーブルに対してMaterialized Viewを作成できます。したがって、テーブルに書き込まれるデータはビューに影響を与えますが、元の生データは破棄されます。 +::: + +## 月次集計テーブルとMaterialized View + +最初のMaterialized Viewについては、`Target`テーブルを作成する必要があります。この例では、`analytics.monthly_aggregated_data`というテーブルを作成し、月別およびドメイン名別にビューの合計を保存します。 + +```sql +CREATE TABLE analytics.monthly_aggregated_data +( + `domain_name` String, + `month` Date, + `sumCountViews` AggregateFunction(sum, UInt64) +) +ENGINE = AggregatingMergeTree +ORDER BY (domain_name, month) +``` + +ターゲットテーブルにデータを転送するMaterialized Viewは次のようになります: + +```sql +CREATE MATERIALIZED VIEW analytics.monthly_aggregated_data_mv +TO analytics.monthly_aggregated_data +AS +SELECT + toDate(toStartOfMonth(event_time)) AS month, + domain_name, + sumState(count_views) AS sumCountViews +FROM analytics.hourly_data +GROUP BY + domain_name, + month +``` + +## 年次集計テーブルとMaterialized View + +次に、前のターゲットテーブル`monthly_aggregated_data`にリンクされる2番目のMaterialized Viewを作成します。 + +まず、ドメイン名ごとに年別に集計されたビューの合計を格納する新しいターゲットテーブルを作成します。 + +```sql +CREATE TABLE analytics.year_aggregated_data +( + `domain_name` String, + `year` UInt16, + `sumCountViews` UInt64 +) +ENGINE = SummingMergeTree() +ORDER BY (domain_name, year) +``` + +このステップでカスケードを定義します。`FROM`文は`monthly_aggregated_data`テーブルを使用します。これは、データフローが次のようになることを意味します: + +1. データは`hourly_data`テーブルに到着します。 +2. ClickHouseは、受信したデータを最初のMaterialized Viewである`monthly_aggregated_data`テーブルに転送します。 +3. 最後に、ステップ2で受信したデータが`year_aggregated_data`に転送されます。 + +```sql +CREATE MATERIALIZED VIEW analytics.year_aggregated_data_mv +TO analytics.year_aggregated_data +AS +SELECT + toYear(toStartOfYear(month)) AS year, + domain_name, + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data +GROUP BY + domain_name, + year +``` + +:::note +Materialized Viewを使用する際の一般的な誤解は、データがテーブルから読み取られるということです。これは`Materialized View`の動作ではありません。転送されるデータはテーブルの最終結果ではなく、挿入されたブロックです。 + +この例で`monthly_aggregated_data`で使用されるエンジンがCollapsingMergeTreeであると仮定した場合、私たちの2番目のMaterialized View`year_aggregated_data_mv`に転送されるデータは、圧縮されたテーブルの最終結果ではなく、`SELECT ... GROUP BY`で定義されたフィールドを持つデータブロックが転送されます。 + +CollapsingMergeTree、ReplacingMergeTree、またはSummingMergeTreeを使用してカスケードMaterialized Viewを作成する予定がある場合は、ここで説明されている制限を理解する必要があります。 +::: + +## サンプルデータ + +カスケードMaterialized Viewをテストするために、データを挿入します: + +```sql +INSERT INTO analytics.hourly_data (domain_name, event_time, count_views) +VALUES ('clickhouse.com', '2019-01-01 10:00:00', 1), + ('clickhouse.com', '2019-02-02 00:00:00', 2), + ('clickhouse.com', '2019-02-01 00:00:00', 3), + ('clickhouse.com', '2020-01-01 00:00:00', 6); +``` + +`analytics.hourly_data`の内容をSELECTすると、テーブルエンジンが`Null`であるため、次のようになりますが、データは処理されます。 + +```sql +SELECT * FROM analytics.hourly_data +``` + +```response +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +少量のデータセットを使用することで、予想される結果を確認し、比較することができます。少量のデータセットでフローが正しいことを確認したら、大量のデータに移行することができます。 + +## 結果 + +ターゲットテーブルをクエリして`sumCountViews`フィールドを選択しようとすると、バイナリ表現(いくつかのターミナルで)を目にすることがあります。これは、値が数値としてではなく、`AggregateFunction`型として格納されているためです。集計の最終結果を得るには、`-Merge`サフィックスを使用する必要があります。 + +AggregateFunctionに格納された特殊文字を見るためのクエリ: + +```sql +SELECT sumCountViews FROM analytics.monthly_aggregated_data +``` + +```response +┌─sumCountViews─┐ +│ │ +│ │ +│ │ +└───────────────┘ + +3 rows in set. Elapsed: 0.003 sec. +``` + +代わりに、`Merge`サフィックスを使用して`sumCountViews`の値を取得してみましょう: + +```sql +SELECT + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data; +``` + +```response +┌─sumCountViews─┐ +│ 12 │ +└───────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +`AggregatingMergeTree`で`AggregateFunction`が`sum`として定義されているため、`sumMerge`を使用できます。`AggregateFunction`で`avg`を使用すると、`avgMerge`を使用します。 + +```sql +SELECT + month, + domain_name, + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data +GROUP BY + domain_name, + month +``` + +これで、Materialized Viewが定義した目標に答えていることを確認できます。 + +ターゲットテーブル`monthly_aggregated_data`にデータが保存されているため、各ドメイン名ごとに月ごとに集計されたデータを取得できます: + +```sql +SELECT + month, + domain_name, + sumMerge(sumCountViews) as sumCountViews +FROM analytics.monthly_aggregated_data +GROUP BY + domain_name, + month +``` + +```response +┌──────month─┬─domain_name────┬─sumCountViews─┐ +│ 2020-01-01 │ clickhouse.com │ 6 │ +│ 2019-01-01 │ clickhouse.com │ 1 │ +│ 2019-02-01 │ clickhouse.com │ 5 │ +└────────────┴────────────────┴───────────────┘ + +3 rows in set. Elapsed: 0.004 sec. +``` + +各ドメイン名ごとの年ごとに集計されたデータ: + +```sql +SELECT + year, + domain_name, + sum(sumCountViews) +FROM analytics.year_aggregated_data +GROUP BY + domain_name, + year +``` + +```response +┌─year─┬─domain_name────┬─sum(sumCountViews)─┐ +│ 2019 │ clickhouse.com │ 6 │ +│ 2020 │ clickhouse.com │ 6 │ +└──────┴────────────────┴────────────────────┘ + +2 rows in set. Elapsed: 0.004 sec. +``` + +## 複数のソーステーブルを単一のターゲットテーブルに結合する + +Materialized Viewは、複数のソーステーブルを同じ宛先テーブルに結合するためにも使用できます。これは、`UNION ALL`と同様のロジックを持つMaterialized Viewを作成するのに役立ちます。 + +まず、異なるメトリックセットを表す2つのソーステーブルを作成します: + +```sql +CREATE TABLE analytics.impressions +( + `event_time` DateTime, + `domain_name` String +) ENGINE = MergeTree ORDER BY (domain_name, event_time) +; + +CREATE TABLE analytics.clicks +( + `event_time` DateTime, + `domain_name` String +) ENGINE = MergeTree ORDER BY (domain_name, event_time) +; +``` + +次に、結合されたメトリックセットを持つ`Target`テーブルを作成します: + +```sql +CREATE TABLE analytics.daily_overview +( + `on_date` Date, + `domain_name` String, + `impressions` SimpleAggregateFunction(sum, UInt64), + `clicks` SimpleAggregateFunction(sum, UInt64) +) ENGINE = AggregatingMergeTree ORDER BY (on_date, domain_name) +``` + +同じ`Target`テーブルを指す2つのMaterialized Viewを作成します。不足しているカラムを明示的に含める必要はありません: + +```sql +CREATE MATERIALIZED VIEW analytics.daily_impressions_mv +TO analytics.daily_overview +AS +SELECT + toDate(event_time) AS on_date, + domain_name, + count() AS impressions, + 0 clicks ---<<<--- これを省略すると、デフォルトで0になります +FROM + analytics.impressions +GROUP BY + toDate(event_time) AS on_date, + domain_name +; + +CREATE MATERIALIZED VIEW analytics.daily_clicks_mv +TO analytics.daily_overview +AS +SELECT + toDate(event_time) AS on_date, + domain_name, + count() AS clicks, + 0 impressions ---<<<--- これを省略すると、デフォルトで0になります +FROM + analytics.clicks +GROUP BY + toDate(event_time) AS on_date, + domain_name +; +``` + +これで、挿入された値は`Target`テーブルのそれぞれのカラムに集計されます: + +```sql +INSERT INTO analytics.impressions (domain_name, event_time) +VALUES ('clickhouse.com', '2019-01-01 00:00:00'), + ('clickhouse.com', '2019-01-01 12:00:00'), + ('clickhouse.com', '2019-02-01 00:00:00'), + ('clickhouse.com', '2019-03-01 00:00:00') +; + +INSERT INTO analytics.clicks (domain_name, event_time) +VALUES ('clickhouse.com', '2019-01-01 00:00:00'), + ('clickhouse.com', '2019-01-01 12:00:00'), + ('clickhouse.com', '2019-03-01 00:00:00') +; +``` + +`Target`テーブルで統合されたインプレッションとクリック: + +```sql +SELECT + on_date, + domain_name, + sum(impressions) AS impressions, + sum(clicks) AS clicks +FROM + analytics.daily_overview +GROUP BY + on_date, + domain_name +; +``` + +このクエリは次のような出力になります: + +``` +┌────on_date─┬─domain_name────┬─impressions─┬─clicks─┐ +│ 2019-01-01 │ clickhouse.com │ 2 │ 2 │ +│ 2019-03-01 │ clickhouse.com │ 1 │ 1 │ +│ 2019-02-01 │ clickhouse.com │ 1 │ 0 │ +└────────────┴────────────────┴─────────────┴────────┘ + +3 rows in set. Elapsed: 0.018 sec. +``` diff --git a/docs/ja/guides/developer/debugging-memory-issues.md b/docs/ja/guides/developer/debugging-memory-issues.md new file mode 100644 index 00000000000..50a68921f26 --- /dev/null +++ b/docs/ja/guides/developer/debugging-memory-issues.md @@ -0,0 +1,77 @@ +--- +slug: /ja/guides/developer/debugging-memory-issues +sidebar_label: メモリ問題のデバッグ +sidebar_position: 1 +description: メモリ問題のデバッグに役立つクエリ。 +--- + +# メモリ問題のデバッグ + +メモリの問題やメモリリークが発生した場合、どのクエリやリソースが大量のメモリを消費しているのかを知ることが役立ちます。以下のクエリは、デバッグに役立ち、最適化できるクエリ、データベース、テーブルを見つけるのに役立ちます。 + +**ピークメモリ使用量で現在実行中のプロセスを一覧表示** + +```sql +SELECT + initial_query_id, + query, + elapsed, + formatReadableSize(memory_usage), + formatReadableSize(peak_memory_usage), +FROM system.processes +ORDER BY peak_memory_usage DESC +LIMIT 100; +``` + +**メモリ使用量のメトリクスを一覧表示** + +```sql +SELECT + metric, description, formatReadableSize(value) size +FROM + system.asynchronous_metrics +WHERE + metric like '%Cach%' + or metric like '%Mem%' +order by + value desc; +``` + +**現在のメモリ使用量別にテーブルを一覧表示** + +```sql +SELECT + database, + name, + formatReadableSize(total_bytes) +FROM system.tables +WHERE engine IN ('Memory','Set','Join'); +``` + +**マージによる総メモリ使用量を出力** + +```sql +SELECT formatReadableSize(sum(memory_usage)) FROM system.merges; +``` + +**現在実行中のプロセスによる総メモリ使用量を出力** + +```sql +SELECT formatReadableSize(sum(memory_usage)) FROM system.processes; +``` + +**Dictionary による総メモリ使用量を出力** + +```sql +SELECT formatReadableSize(sum(bytes_allocated)) FROM system.dictionaries; +``` + +**主キーによる総メモリ使用量を出力** + +```sql +SELECT + sumIf(data_uncompressed_bytes, part_type = 'InMemory') as memory_parts, + formatReadableSize(sum(primary_key_bytes_in_memory)) AS primary_key_bytes_in_memory, + formatReadableSize(sum(primary_key_bytes_in_memory_allocated)) AS primary_key_bytes_in_memory_allocated +FROM system.parts; +``` diff --git a/docs/ja/guides/developer/deduplicating-inserts-on-retries.md b/docs/ja/guides/developer/deduplicating-inserts-on-retries.md new file mode 100644 index 00000000000..6de685ffe7f --- /dev/null +++ b/docs/ja/guides/developer/deduplicating-inserts-on-retries.md @@ -0,0 +1,397 @@ +--- +slug: /ja/guides/developer/deduplicating-inserts-on-retries +title: 挿入操作の再試行時のデータ重複防止 +description: 挿入操作を再試行する際の重複データ防止策 +keywords: [重複排除, デデュプリケート, 挿入再試行, 挿入] +--- + +挿入操作は、タイムアウトなどのエラーにより失敗することがあります。挿入が失敗した場合、データが成功裏に挿入されたかどうかは不明です。本ガイドでは、挿入再試行時に同じデータが複数回挿入されないように、データ重複防止機能を有効にする方法を説明します。 + +挿入が再試行されると、ClickHouseはデータが既に成功裏に挿入されたかどうかを判断しようとします。挿入されたデータが重複としてマークされる場合、ClickHouseはそれを対象のテーブルに挿入しません。しかし、ユーザーはあたかもデータが正常に挿入されたかのように成功操作ステータスを受け取ります。 + +## 再試行時の挿入重複防止の有効化 + +### テーブルに対する挿入重複防止 + +**`*MergeTree`エンジンのみが挿入時の重複防止をサポートしています。** + +`*ReplicatedMergeTree`エンジンに対しては、挿入重複防止はデフォルトで有効になっており、`replicated_deduplication_window`および`replicated_deduplication_window_seconds`設定によって制御されます。非レプリケートされた`*MergeTree`エンジンに対しては、重複防止は`non_replicated_deduplication_window`設定によって制御されます。 + +上記の設定は、テーブルの重複防止ログのパラメータを決定します。この重複防止ログは有限の数の`block_id`を保持し、これにより重複防止の仕組みが決まります(以下参照)。 + +### クエリレベルでの挿入重複防止 + +設定`insert_deduplicate=1`を用いると、クエリレベルでの重複防止が有効になります。`insert_deduplicate=0`でデータを挿入した場合、そのデータは`insert_deduplicate=1`で挿入を再試行しても重複防止されません。これは、`block_id`が`insert_deduplicate=0`での挿入時に記録されないためです。 + +## 挿入重複防止の仕組み + +データがClickHouseに挿入されるとき、行数とバイト数に基づいてデータがブロックに分割されます。 + +`*MergeTree`エンジンを使用したテーブルでは、各ブロックにはそのブロック内のデータのハッシュである一意の`block_id`が割り当てられます。この`block_id`は挿入操作の一意キーとして使用されます。同じ`block_id`が重複防止ログで見つかった場合、そのブロックは重複と見なされ、テーブルには挿入されません。 + +このアプローチは異なるデータを含む挿入の場合にうまく機能します。しかし、同じデータを複数回意図的に挿入する場合は、`insert_deduplication_token`設定を使用して重複防止プロセスを制御する必要があります。この設定を用いると、各挿入に対して一意のトークンを指定でき、ClickHouseはこのトークンを利用してデータが重複かどうかを判断します。 + +`INSERT ... VALUES` クエリの場合、挿入データのブロック分割は決定的であり、設定によって決定されます。したがって、初回操作と同じ設定値で挿入を再試行することをお勧めします。 + +`INSERT ... SELECT` クエリの場合、クエリの`SELECT`部分が各操作で同じ順序で同じデータを返すことが重要です。実際の使用においてこれは難しいことに留意してください。再試行で安定したデータ順序を確保するために、クエリの`SELECT`部分で正確な`ORDER BY`セクションを定義してください。再試行間に選択されたテーブルが更新される可能性がある事にも注意が必要です。結果データが変更され、重複防止が行われない可能性があります。また、大量のデータを挿入する場合、挿入後のブロック数が重複防止ログウィンドウをオーバーフローすることがあり、ClickHouseがブロックを重複防止しない可能性があります。 + +## マテリアライズドビューを使用した挿入重複防止 + +テーブルにマテリアライズドビューがある場合、そのビューの変換定義にしたがって挿入されたデータもビューの対象に挿入されます。変換されたデータも再試行時に重複を排除されます。ClickHouseはマテリアライズドビューに対しても、ターゲットテーブルに挿入されたデータと同様に重複を排除します。 + +このプロセスは以下のソーステーブル用の設定を使用して制御できます: +- `replicated_deduplication_window` +- `replicated_deduplication_window_seconds` +- `non_replicated_deduplication_window` + +また、ユーザープロファイル設定`deduplicate_blocks_in_dependent_materialized_views`を使用することもできます。 + +マテリアライズドビュー下のテーブルへブロックを挿入する際、ClickHouseはソーステーブルの`block_id`と追加の識別子を組み合わせた文字列をハッシュして`block_id`を計算します。これにより、マテリアライズドビュー内での正確な重複防止が保証され、元の挿入によってデータが区別され、マテリアライズドビューの対象テーブルに到達する前に加えられる変換にかかわらずデータが識別されます。 + +## 例 + +### マテリアライズドビューの変換後の同一ブロック + +マテリアライズドビュー内での変換中に生成された同一ブロックは異なる挿入データに基づいているため、重複排除されません。 + +こちらは例です: + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE MATERIALIZED VIEW mv_dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000 +AS SELECT + 0 AS key, + value AS value +FROM dst; +``` + +```sql +SET max_block_size=1; +SET min_insert_block_size_rows=0; +SET min_insert_block_size_bytes=0; +``` + +上記の設定により、テーブルから一行のみを持つ一連のブロックを選択できます。これらの小さいブロックは圧縮されず、テーブルに挿入されるまでは同一のままです。 + +```sql +SET deduplicate_blocks_in_dependent_materialized_views=1; +``` + +マテリアライズドビューでの重複排除を有効にする必要があります: + +```sql +INSERT INTO dst SELECT + number + 1 AS key, + IF(key = 0, 'A', 'B') AS value +FROM numbers(2); + +SELECT + *, + _part +FROM dst +ORDER by all; +``` + +ここでは、`dst`テーブルに2つのパートが挿入されたことが分かります。選択からの2ブロック — 挿入時の2パート。パートは異なるデータを含んでいます。 + +```sql +SELECT + *, + _part +FROM mv_dst +ORDER by all; +``` + +ここでは、`mv_dst`テーブルに2つのパートが挿入されたことが分かります。それらのパートは同じデータを含んでいますが、重複排除されていません。 + +```sql +INSERT INTO dst SELECT + number + 1 AS key, + IF(key = 0, 'A', 'B') AS value +FROM numbers(2); + +SELECT + *, + _part +FROM dst +ORDER by all; + +SELECT + *, + _part +FROM mv_dst +ORDER by all; +``` + +ここでは、挿入を再試行したとき、すべてのデータが重複排除されることが確認できます。重複排除は`dst`テーブルと`mv_dst`テーブルの両方で機能します。 + +## 挿入時の同一ブロック + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + + +SET max_block_size=1; +SET min_insert_block_size_rows=0; +SET min_insert_block_size_bytes=0; +``` + +挿入: + +```sql +INSERT INTO dst SELECT + 0 AS key, + 'A' AS value +FROM numbers(2); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +上記の設定で、選択結果から2つのブロックが生成され、その結果、テーブル`dst`への挿入には2つのブロックがあるはずです。しかし、`dst`テーブルには一つのブロックのみが挿入されたことが確認できます。これは、2番目のブロックが重複排除されたためです。挿入されたデータと、重複排除のキーである`block_id`は挿入されたデータのハッシュとして計算されています。この動作は期待されたものではありません。このようなケースは稀ですが、理論的には可能です。このようなケースを正しく処理するために、ユーザーは`insert_deduplication_token`を提供する必要があります。以下の例でそれを修正しましょう: + +## `insert_deduplication_token`を使用した挿入時の同一ブロック + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +SET max_block_size=1; +SET min_insert_block_size_rows=0; +SET min_insert_block_size_bytes=0; +``` + +挿入: + +```sql +INSERT INTO dst SELECT + 0 AS key, + 'A' AS value +FROM numbers(2) +SETTINGS insert_deduplication_token='some_user_token'; + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +2つの同一ブロックが期待通りに挿入されました。 + +```sql +select 'second attempt'; + +INSERT INTO dst SELECT + 0 AS key, + 'A' AS value +FROM numbers(2) +SETTINGS insert_deduplication_token='some_user_token'; + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +再試行挿入は期待通りに重複排除されます。 + +```sql +select 'third attempt'; + +INSERT INTO dst SELECT + 1 AS key, + 'b' AS value +FROM numbers(2) +SETTINGS insert_deduplication_token='some_user_token'; + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; +``` + +この挿入も異なるデータを含んでいるにもかかわらず重複排除されています。`insert_deduplication_token`の優先度が高いことに注意してください:`insert_deduplication_token`が提供されると、ClickHouseはデータのハッシュサムを使用しません。 + +## 異なる挿入操作がマテリアライズドビューの基になるテーブルで同じデータを生成する場合 + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE MATERIALIZED VIEW mv_dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000 +AS SELECT + 0 AS key, + value AS value +FROM dst; + +SET deduplicate_blocks_in_dependent_materialized_views=1; + +select 'first attempt'; + +INSERT INTO dst VALUES (1, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; + +select 'second attempt'; + +INSERT INTO dst VALUES (2, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; +``` + +毎回異なるデータを挿入しています。しかし、`mv_dst`テーブルには同じデータが挿入されています。データは元のデータが異なっていたため、重複排除されません。 + +## 異なるマテリアライズドビューが同一のデータを基になるテーブルに挿入する場合 + +```sql +CREATE TABLE dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE TABLE mv_dst +( + `key` Int64, + `value` String +) +ENGINE = MergeTree +ORDER BY tuple() +SETTINGS non_replicated_deduplication_window=1000; + +CREATE MATERIALIZED VIEW mv_first +TO mv_dst +AS SELECT + 0 AS key, + value AS value +FROM dst; + +CREATE MATERIALIZED VIEW mv_second +TO mv_dst +AS SELECT + 0 AS key, + value AS value +FROM dst; + +SET deduplicate_blocks_in_dependent_materialized_views=1; + +select 'first attempt'; + +INSERT INTO dst VALUES (1, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; +``` + +テーブル`mv_dst`に2つの等しいブロックが挿入されました(期待通り)。 + +```sql +select 'second attempt'; + +INSERT INTO dst VALUES (1, 'A'); + +SELECT + 'from dst', + *, + _part +FROM dst +ORDER by all; + +SELECT + 'from mv_dst', + *, + _part +FROM mv_dst +ORDER by all; +``` + +この再試行操作は、`dst`テーブルと`mv_dst`テーブルの両方で重複排除されます。 diff --git a/docs/ja/guides/developer/deduplication.md b/docs/ja/guides/developer/deduplication.md new file mode 100644 index 00000000000..babeedcaf46 --- /dev/null +++ b/docs/ja/guides/developer/deduplication.md @@ -0,0 +1,339 @@ +--- +slug: /ja/guides/developer/deduplication +sidebar_label: 重複排除戦略 +sidebar_position: 3 +description: 頻繁にupsert、更新、および削除を実行する必要がある場合は、重複排除を使用します。 +--- + +# 重複排除戦略 + +**重複排除**とは、***データセットの重複行を削除するプロセス***を指します。OLTPデータベースでは、各行に一意の主キーがあるため、これを簡単に行うことができますが、その代わりに挿入が遅くなります。挿入された各行は最初に検索され、存在する場合は置き換える必要があります。 + +ClickHouseはデータ挿入のスピードを追求して設計されています。ストレージファイルは不変であり、ClickHouseは行を挿入する前に既存の主キーを確認しないため、重複排除はもう少し手間がかかります。また、重複排除は即時には行われず、**最終的**であるため、以下のような副作用があります: + +- 任意の時点で、テーブルにはまだ重複(同じソートキーを持つ行)が存在する可能性があります +- 重複行の実際の削除は、パーツのマージ時に行われます +- クエリでは、重複の可能性を考慮する必要があります + +
+ +||| +|------|----| +|Cassandra logo|ClickHouseは重複排除やその他多くのトピックに関する無料トレーニングを提供しています。[データの削除と更新トレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328954/?utm_source=clickhouse&utm_medium=docs)は素晴らしい出発点です。| + +
+ +## 重複排除のオプション + +ClickHouseにおける重複排除は、以下のテーブルエンジンを使用して実装されます: + +1. `ReplacingMergeTree`テーブルエンジン:このテーブルエンジンを使用すると、同じソートキーを持つ重複行がマージ時に削除されます。`ReplacingMergeTree`は、クエリが最後に挿入された行を返すようなupsert動作をエミュレートするのに適しています。 + +2. 行の折りたたみ:`CollapsingMergeTree`および`VersionedCollapsingMergeTree`テーブルエンジンは、既存の行が"キャンセル"されて新しい行が挿入されるロジックを利用します。これらは`ReplacingMergeTree`よりも複雑ですが、クエリや集計を書く際にデータがまだマージされているかどうかを気にせずに済むため、クエリがシンプルになることがあります。データを頻繁に更新する必要がある場合、これらのテーブルエンジンが役立ちます。 + +以下でこれらの技術を詳しく説明します。詳細については、[データの削除と更新トレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328954/?utm_source=clickhouse&utm_medium=docs)をご覧ください。 + +## ReplacingMergeTreeを使用したUpserts + +ハッカーニュースのコメントを含むテーブルを例に見てみましょう。このテーブルは、コメントの表示回数を表す`views`カラムを持っています。新しい記事が公開されると新しい行を挿入し、表示回数が増えた場合は1日ごとに新しい行をupsertするとします: + +```sql +CREATE TABLE hackernews_rmt ( + id UInt32, + author String, + comment String, + views UInt64 +) +ENGINE = ReplacingMergeTree +PRIMARY KEY (author, id) +``` + +2行を挿入してみましょう: + +```sql +INSERT INTO hackernews_rmt VALUES + (1, 'ricardo', 'This is post #1', 0), + (2, 'ch_fan', 'This is post #2', 0) +``` + +`views`カラムを更新するために、同じ主キーで新しい行を挿入します(`views`カラムの新しい値に注目してください): + +```sql +INSERT INTO hackernews_rmt VALUES + (1, 'ricardo', 'This is post #1', 100), + (2, 'ch_fan', 'This is post #2', 200) +``` + +現在、テーブルには4行あります: + +```sql +SELECT * +FROM hackernews_rmt +``` + +```response +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 0 │ +│ 1 │ ricardo │ This is post #1 │ 0 │ +└────┴─────────┴─────────────────┴───────┘ +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 200 │ +│ 1 │ ricardo │ This is post #1 │ 100 │ +└────┴─────────┴─────────────────┴───────┘ +``` + +上の出力の別々のボックスは、実際のマージがまだ行われておらず、重複行がまだ削除されていないことを示しています。`SELECT`クエリで`FINAL`キーワードを使用して、クエリ結果の論理的なマージを行います: + +```sql +SELECT * +FROM hackernews_rmt +FINAL +``` + +```response +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 200 │ +│ 1 │ ricardo │ This is post #1 │ 100 │ +└────┴─────────┴─────────────────┴───────┘ +``` + +結果には2行だけが含まれ、最後に挿入された行が返されます。 + +:::note +`FINAL`を使用することは、データ量が少ない場合には問題ありません。大量のデータを扱う場合、`FINAL`の使用は最良の選択肢ではないかもしれません。カラムの最新値を見つけるためのより良い選択肢について議論しましょう… +::: + +### FINALを避ける + +2つのユニークな行の`views`カラムを再度更新しましょう: + +```sql +INSERT INTO hackernews_rmt VALUES + (1, 'ricardo', 'This is post #1', 150), + (2, 'ch_fan', 'This is post #2', 250) +``` + +テーブルには現在6行ありますが、実際のマージはまだ行われていません( `FINAL`を使用したクエリ時間のマージのみ)。 + +```sql +SELECT * +FROM hackernews_rmt +``` + +```response +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 200 │ +│ 1 │ ricardo │ This is post #1 │ 100 │ +└────┴─────────┴─────────────────┴───────┘ +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 0 │ +│ 1 │ ricardo │ This is post #1 │ 0 │ +└────┴─────────┴─────────────────┴───────┘ +┌─id─┬─author──┬─comment─────────┬─views─┐ +│ 2 │ ch_fan │ This is post #2 │ 250 │ +│ 1 │ ricardo │ This is post #1 │ 150 │ +└────┴─────────┴─────────────────┴───────┘ +``` + +`FINAL`を使用する代わりに、ビジネスロジックを使用しましょう - `views`カラムは常に増加すると分かっているので、最大値を持つ行を選択するために`max`関数を使用して、望むカラムでグループ化します: + +```sql +SELECT + id, + author, + comment, + max(views) +FROM hackernews_rmt +GROUP BY (id, author, comment) +``` + +```response +┌─id─┬─author──┬─comment─────────┬─max(views)─┐ +│ 2 │ ch_fan │ This is post #2 │ 250 │ +│ 1 │ ricardo │ This is post #1 │ 150 │ +└────┴─────────┴─────────────────┴────────────┘ +``` + +上記のクエリに示されているようにグループ化することで、`FINAL`キーワードを使用するよりもクエリパフォーマンスの観点で効率的になることがあります。 + +私たちの[データの削除と更新トレーニングモジュール](https://learn.clickhouse.com/visitor_catalog_class/show/1328954/?utm_source=clickhouse&utm_medium=docs)では、この例をさらに展開し、`ReplacingMergeTree`を使用した`version`カラムの使用方法も紹介しています。 + +## カラムの頻繁な更新にCollapsingMergeTreeを使用する + +カラムの更新は、既存の行を削除し、新しい値で置き換えることを伴います。これまでに見た通り、ClickHouseにおけるこの種の変更は_最終的に_発生します - マージ中に。多くの行を更新する場合、`ALTER TABLE..UPDATE`を回避し、既存データと共に新しいデータを挿入する方が実際には効率的である可能性があります。データが古いものか新しいものかを示すカラムを追加することができます…そして実際、古いデータを自動的に削除するという振る舞いを非常にうまく実装するテーブルエンジンがあります。それがどのように機能するかを見てみましょう。 + +外部システムを使用して、ハッカーニュースのコメントの表示回数を追跡し、数時間ごとにデータをClickHouseにプッシュするとします。古い行を削除し、新しい行が各ハッカーニュースコメントの新しい状態を表すようにしたいです。この振る舞いを実現するために、`CollapsingMergeTree`を使用することができます。 + +表示回数を格納するためのテーブルを定義しましょう: + +```sql +CREATE TABLE hackernews_views ( + id UInt32, + author String, + views UInt64, + sign Int8 +) +ENGINE = CollapsingMergeTree(sign) +PRIMARY KEY (id, author) +``` + +`hackernews_views`テーブルには、signと呼ばれる`Int8`カラムがあり、**sign**カラムとして参照されます。signカラムの名前は任意ですが、`Int8`データ型である必要があります。また、`CollapsingMergeTree`テーブルのコンストラクタにカラム名が渡されています。 + +`CollapsingMergeTree`テーブルのsignカラムとは何でしょうか?これは行の_状態_を表し、signカラムは1または-1のみであることができます。その働き方を見てみましょう: + +- 二つの行が同じ主キー(またはソート順が主キーとは異なる場合、そのソート順)を持つが、signカラムの値が異なる場合、最後に挿入された行の+1が状態行となり、他の行はお互いをキャンセルします +- お互いをキャンセルする行はマージ中に削除されます +- マッチするペアを持たない行は残ります + +`hackernews_views`テーブルに行を追加しましょう。この主キーに対応する唯一の行であるため、その状態を1に設定します: + +```sql +INSERT INTO hackernews_views VALUES + (123, 'ricardo', 0, 1) +``` + +次に、viewsカラムを変更したいとします。既存の行をキャンセルする1行と、その行の新しい状態を含む1行の計2行を挿入します: + +```sql +INSERT INTO hackernews_views VALUES + (123, 'ricardo', 0, -1), + (123, 'ricardo', 150, 1) +``` + +テーブルには現在、主キー(123, 'ricardo')を持つ3行があります: + +```sql +SELECT * +FROM hackernews_views +``` + +```response +┌──id─┬─author──┬─views─┬─sign─┐ +│ 123 │ ricardo │ 0 │ -1 │ +│ 123 │ ricardo │ 150 │ 1 │ +└─────┴─────────┴───────┴──────┘ +┌──id─┬─author──┬─views─┬─sign─┐ +│ 123 │ ricardo │ 0 │ 1 │ +└─────┴─────────┴───────┴──────┘ +``` + +`FINAL`を追加すると、現在の状態行が返されることに注目してください: + +```sql +SELECT * +FROM hackernews_views +FINAL +``` + +```response +┌──id─┬─author──┬─views─┬─sign─┐ +│ 123 │ ricardo │ 150 │ 1 │ +└─────┴─────────┴───────┴──────┘ +``` + +しかし、当然のことながら、大きなテーブルに対して`FINAL`を使用することは推奨されていません。 + +:::note +この例で`views`カラムに渡された値は本当に必要なく、古い行の現在の`views`の値と一致している必要もありません。実際、主キーと-1だけで行をキャンセルすることができます: + +```sql +INSERT INTO hackernews_views(id, author, sign) VALUES + (123, 'ricardo', -1) +``` +::: + +## 複数スレッドからのリアルタイム更新 + +`CollapsingMergeTree`テーブルを使用すると、行はsignカラムを使って互いにキャンセルされ、行の状態は最後に挿入された行によって決定されます。しかし、行が異なるスレッドから順不同で挿入される場合、これは問題になる可能性があります。この場合、最後の行を使用することは機能しません。 + +ここで`VersionedCollapsingMergeTree`が役立ちます。`VersionedCollapsingMergeTree`は、`CollapsingMergeTree`と同様に行を折りたたみますが、最後に挿入された行ではなく、指定したバージョンカラムの最大値を持つ行を保持します。 + +例を見てみましょう。ハッカーニュースのコメントの表示回数を追跡し、データは頻繁に更新されます。レポートでは、マージを強制したり待つことなく最新の値を使用したいです。`CollapsedMergeTree`に似たテーブルから始めますが、行の状態のバージョンを格納するカラムを追加します: + +```sql +CREATE TABLE hackernews_views_vcmt ( + id UInt32, + author String, + views UInt64, + sign Int8, + version UInt32 +) +ENGINE = VersionedCollapsingMergeTree(sign, version) +PRIMARY KEY (id, author) +``` + +このテーブルは`VersionsedCollapsingMergeTree`をエンジンとして使用し、**signカラム**と**versionカラム**を渡しています。このテーブルの働き方は次の通りです: + +- 同じ主キーとバージョンを持ち、異なるsignを持つ各ペアの行を削除します +- 行が挿入された順序は関係ありません +- バージョンカラムが主キーパートでない場合、ClickHouseはそれを最後のフィールドとして主キーに暗黙的に追加します + +クエリを記述するときに同様のロジックを使用します - 主キーでグループ化し、キャンセルされたがまだ削除されていない行を避ける巧妙なロジックを使用します。`hackernews_views_vcmt`テーブルにいくつかの行を追加しましょう: + +```sql +INSERT INTO hackernews_views_vcmt VALUES + (1, 'ricardo', 0, 1, 1), + (2, 'ch_fan', 0, 1, 1), + (3, 'kenny', 0, 1, 1) +``` + +次に、2つの行を更新し、1つを削除します。行をキャンセルするには、前のバージョン番号を含めてください(これは主キーの一部であるため): + +```sql +INSERT INTO hackernews_views_vcmt VALUES + (1, 'ricardo', 0, -1, 1), + (1, 'ricardo', 50, 1, 2), + (2, 'ch_fan', 0, -1, 1), + (3, 'kenny', 0, -1, 1), + (3, 'kenny', 1000, 1, 2) +``` + +signカラムに基づいて値を加減算する同じクエリを実行します: + +```sql +SELECT + id, + author, + sum(views * sign) +FROM hackernews_views_vcmt +GROUP BY (id, author) +HAVING sum(sign) > 0 +ORDER BY id ASC +``` + +結果は2行です: + +```response +┌─id─┬─author──┬─sum(multiply(views, sign))─┐ +│ 1 │ ricardo │ 50 │ +│ 3 │ kenny │ 1000 │ +└────┴─────────┴────────────────────────────┘ +``` + +テーブルのマージを強制します: + +```sql +OPTIMIZE TABLE hackernews_views_vcmt +``` + +結果には2行だけが含まれます: + +```sql +SELECT * +FROM hackernews_views_vcmt +``` + +```response +┌─id─┬─author──┬─views─┬─sign─┬─version─┐ +│ 1 │ ricardo │ 50 │ 1 │ 2 │ +│ 3 │ kenny │ 1000 │ 1 │ 2 │ +└────┴─────────┴───────┴──────┴─────────┘ +``` + +`VersionedCollapsingMergeTree`テーブルは、複数のクライアントやスレッドからの行の挿入を行いつつ、重複排除を実装したい場合に非常に役立ちます。 + +## なぜ行が重複排除されていないのか? + +挿入された行が重複排除されない理由の一つは、`INSERT`ステートメントで非冪等関数や式を使用している場合です。例えば、`createdAt DateTime64(3) DEFAULT now()`というカラムを使用して行を挿入すると、各行は一意のデフォルト値を持つため、必ずユニークになります。MergeTree / ReplicatedMergeTreeテーブルエンジンは、各挿入行が一意のチェックサムを生成するため、重複排除を認識しません。 + +この場合、バッチの行ごとに独自の`insert_deduplication_token`を指定して、同じバッチの複数の挿入が同じ行を再挿入することにならないようにすることができます。[`insert_deduplication_token`に関するドキュメント](/docs/ja/operations/settings/settings#insert_deduplication_token)をご覧ください。この設定の使用方法についてもっと詳しく知ることができます。 diff --git a/docs/ja/guides/developer/images/Deduplication.png b/docs/ja/guides/developer/images/Deduplication.png new file mode 100644 index 00000000000..3e89a646b8e Binary files /dev/null and b/docs/ja/guides/developer/images/Deduplication.png differ diff --git a/docs/ja/guides/developer/images/analyzer1.png b/docs/ja/guides/developer/images/analyzer1.png new file mode 100644 index 00000000000..4938af2149b Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer1.png differ diff --git a/docs/ja/guides/developer/images/analyzer2.png b/docs/ja/guides/developer/images/analyzer2.png new file mode 100644 index 00000000000..2943b8b8efd Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer2.png differ diff --git a/docs/ja/guides/developer/images/analyzer3.png b/docs/ja/guides/developer/images/analyzer3.png new file mode 100644 index 00000000000..0530706badb Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer3.png differ diff --git a/docs/ja/guides/developer/images/analyzer4.png b/docs/ja/guides/developer/images/analyzer4.png new file mode 100644 index 00000000000..e4b038f4391 Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer4.png differ diff --git a/docs/ja/guides/developer/images/analyzer5.png b/docs/ja/guides/developer/images/analyzer5.png new file mode 100644 index 00000000000..54f8420696e Binary files /dev/null and b/docs/ja/guides/developer/images/analyzer5.png differ diff --git a/docs/ja/guides/developer/lightweight-delete.md b/docs/ja/guides/developer/lightweight-delete.md new file mode 100644 index 00000000000..5a98f5a7a7d --- /dev/null +++ b/docs/ja/guides/developer/lightweight-delete.md @@ -0,0 +1,8 @@ +--- +slug: /ja/guides/developer/lightweight-delete +title: 論理削除 +keywords: [論理削除] +--- +import Content from '@site/docs/ja/sql-reference/statements/delete.md'; + + diff --git a/docs/ja/guides/developer/lightweight-update.md b/docs/ja/guides/developer/lightweight-update.md new file mode 100644 index 00000000000..dbf36ca02bd --- /dev/null +++ b/docs/ja/guides/developer/lightweight-update.md @@ -0,0 +1,95 @@ +--- +slug: /ja/guides/developer/lightweight-update +sidebar_label: 論理更新 +title: 論理更新 +keywords: [lightweight update] +--- + +## 論理更新 + +:::note +論理更新はClickHouse Cloudでのみ利用可能です。 +::: + +論理更新が有効な場合、更新された行は即座に更新済みとしてマークされ、後続の`SELECT`クエリは自動的に変更された値を返します。論理更新が有効でない場合は、バックグラウンド処理でミューテーションが適用されるのを待つ必要があるかもしれません。 + +論理更新は、`MergeTree`ファミリーのテーブルに対してクエリレベルの設定`apply_mutations_on_fly`を有効にすることで使用できます。 + +```sql +SET apply_mutations_on_fly = 1; +``` + +## 例 + +テーブルを作成し、いくつかのミューテーションを実行してみましょう: +```sql +CREATE TABLE test_on_fly_mutations (id UInt64, v String) +ENGINE = MergeTree ORDER BY id; + +-- 論理更新が有効でない場合のデフォルトの動作を示すために +-- ミューテーションのバックグラウンドの具体化を無効化 +SYSTEM STOP MERGES test_on_fly_mutations; +SET mutations_sync = 0; + +-- 新しいテーブルにいくつかの行を挿入 +INSERT INTO test_on_fly_mutations VALUES (1, 'a'), (2, 'b'), (3, 'c'); + +-- 行の値を更新 +ALTER TABLE test_on_fly_mutations UPDATE v = 'd' WHERE id = 1; +ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'd'; +ALTER TABLE test_on_fly_mutations UPDATE v = 'e' WHERE id = 2; +ALTER TABLE test_on_fly_mutations DELETE WHERE v = 'e'; +``` + +`SELECT`クエリで更新の結果を確認してみましょう: +```sql +-- 論理更新を明示的に無効化 +SET apply_mutations_on_fly = 0; + +SELECT id, v FROM test_on_fly_mutations ORDER BY id; +``` + +新しいテーブルをクエリした際に、行の値がまだ更新されていないことに注意してください: + +``` +┌─id─┬─v─┐ +│ 1 │ a │ +│ 2 │ b │ +│ 3 │ c │ +└────┴───┘ +``` + +論理更新を有効にするとどうなるかを見てみましょう: + +```sql +-- 論理更新を有効化 +SET apply_mutations_on_fly = 1; + +SELECT id, v FROM test_on_fly_mutations ORDER BY id; +``` + +この`SELECT`クエリは、ミューテーションが適用されるのを待たなくても、正しい結果を即座に返すようになります: + +``` +┌─id─┬─v─┐ +│ 3 │ c │ +└────┴───┘ +``` + +## パフォーマンスへの影響 + +論理更新を有効にすると、ミューテーションは即座に具体化されず、`SELECT`クエリの際にのみ適用されます。ただし、ミューテーションはバックグラウンドで非同期に具体化されていることに注意してください。これは重いプロセスです。 + +特定の時間間隔内で処理されるミューテーションの数を送信されたミューテーションの数が常に超える場合、適用されるべき具体化されていないミューテーションのキューが増え続けます。これにより、最終的に`SELECT`クエリのパフォーマンスの劣化を招く可能性があります。 + +具体化されていないミューテーションの無限成長を制限するために、`apply_mutations_on_fly`の設定を`number_of_mutations_to_throw`や`number_of_mutations_to_delay`といった他の`MergeTree`レベルの設定と併せて有効にすることをお勧めします。 + +## サブクエリと非決定的な関数のサポート + +論理更新は、サブクエリと非決定的な関数に対して限定的なサポートを提供します。妥当なサイズ(設定`mutations_max_literal_size_to_replace`で制御される)の結果を持つスカラーサブクエリのみがサポートされています。また、定数の非決定的な関数(例:`now()`関数)のみがサポートされています。 + +これらの動作は次の設定によって制御されます: + +- `mutations_execute_nondeterministic_on_initiator` - trueの場合、非決定的な関数はイニシエーターレプリカで実行され、`UPDATE`や`DELETE`クエリでリテラルとして置き換えられます。デフォルト値:`false`。 +- `mutations_execute_subqueries_on_initiator` - trueの場合、スカラーサブクエリはイニシエーターレプリカで実行され、`UPDATE`や`DELETE`クエリでリテラルとして置き換えられます。デフォルト値:`false`。 +- `mutations_max_literal_size_to_replace` - `UPDATE`や`DELETE`クエリで置き換えるリテラルのシリアライズされた最大サイズ(バイト単位)。デフォルト値:`16384`(16 KiB)。 diff --git a/docs/ja/guides/developer/mutations.md b/docs/ja/guides/developer/mutations.md new file mode 100644 index 00000000000..e3487ea7263 --- /dev/null +++ b/docs/ja/guides/developer/mutations.md @@ -0,0 +1,100 @@ +--- +slug: /ja/guides/developer/mutations +sidebar_label: データの更新と削除 +sidebar_position: 1 +keywords: [更新, 削除, ミューテーション] +--- + +# ClickHouse データの更新と削除 + +ClickHouse は高ボリュームの分析ワークロードに適しているものの、特定の状況では既存のデータを変更または削除できます。これらの操作は「ミューテーション」と呼ばれ、`ALTER TABLE` コマンドを使用して実行されます。また、ClickHouse の論理削除の機能を使用して、行を `DELETE` することもできます。 + +:::tip +頻繁な更新が必要な場合は、ClickHouse の [重複排除](../developer/deduplication.md) を使用することを検討してください。これにより、ミューテーションイベントを生成せずに行を更新および/または削除できます。 +::: + +## データの更新 + +テーブルの行を更新するには `ALTER TABLE...UPDATE` コマンドを使用します: + +```sql +ALTER TABLE [.]
UPDATE = WHERE +``` + +`` は `` を満たすカラムの新しい値です。`` はカラムと同じデータ型であるか、`CAST` 演算子を使用して同じデータ型に変換可能である必要があります。`` はデータの各行に対して `UInt8`(0 または 0 以外)の値を返す必要があります。複数の `UPDATE ` ステートメントをカンマで区切って単一の `ALTER TABLE` コマンドに組み合わせることができます。 + +**例**: + + 1. このようなミューテーションは、Dictionaryルックアップを使用して `visitor_id` を新しいものに更新できます。 + + ```sql + ALTER TABLE website.clicks + UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id) + WHERE visit_date < '2022-01-01' + ``` + +2. 一つのコマンドで複数の値を変更することで、複数のコマンドよりも効率的になります。 + + ```sql + ALTER TABLE website.clicks + UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id + WHERE visit_date < '2022-01-01' + ``` + +3. シャード化されたテーブルに対して `ON CLUSTER` でミューテーションを実行できます。 + + ```sql + ALTER TABLE clicks ON CLUSTER main_cluster + UPDATE click_count = click_count / 2 + WHERE visitor_id ILIKE '%robot%' + ``` + +:::note +主キーまたはソートキーの一部であるカラムを更新することはできません。 +::: + +## データの削除 + +行を削除するには、`ALTER TABLE` コマンドを使用します: + +```sql +ALTER TABLE [.]
DELETE WHERE +``` + +`` はデータの各行に対して `UInt8` の値を返す必要があります。 + +**例** + +1. カラムが値の配列に含まれるレコードを削除する: + ```sql + ALTER TABLE website.clicks DELETE WHERE visitor_id in (253, 1002, 4277) + ``` + +2. このクエリは何を変更するのか? + ```sql + ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date < '2022-01-02 15:00:00' AND page_id = '573' + ``` + +:::note +テーブル内のすべてのデータを削除するには、`TRUNCATE TABLE [` コマンドを使用する方が効率的です。このコマンドは `ON CLUSTER` でも実行できます。 +::: + +詳細については、[`DELETE` ステートメント](/docs/ja/sql-reference/statements/delete.md) ドキュメントページを参照してください。 + +## 論理削除 + +行を削除する別のオプションとして、`DELETE FROM` コマンドがあります。これは **論理削除** と呼ばれます。削除された行は即座に削除としてマークされ、後続のすべてのクエリから自動的にフィルタリングされるため、パーツのマージを待ったり `FINAL` キーワードを使用したりする必要はありません。データのクリーンアップはバックグラウンドで非同期に行われます。 + +``` sql +DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr] +``` + +たとえば、次のクエリは、`Title` カラムに `hello` というテキストが含まれる `hits` テーブルのすべての行を削除します。 + +```sql +DELETE FROM hits WHERE Title LIKE '%hello%'; +``` + +論理削除に関する注意事項: +- この機能は `MergeTree` テーブルエンジンファミリーでのみ利用可能です。 +- 論理削除はデフォルトで非同期です。`mutations_sync` を 1 に設定すると 1 つのレプリカがステートメントを処理するのを待ち、2 に設定するとすべてのレプリカを待ちます。 diff --git a/docs/ja/guides/developer/time-series-filling-gaps.md b/docs/ja/guides/developer/time-series-filling-gaps.md new file mode 100644 index 00000000000..5d985f6ca44 --- /dev/null +++ b/docs/ja/guides/developer/time-series-filling-gaps.md @@ -0,0 +1,337 @@ +--- +slug: /ja/guides/developer/time-series-filling-gaps +sidebar_label: タイムシリーズ - ギャップの埋め方 +sidebar_position: 10 +description: タイムシリーズデータのギャップを埋める。 +keywords: [time series, gap fill] +--- + +# タイムシリーズデータのギャップを埋める + +タイムシリーズデータを扱う際、データが欠落しているか、非アクティブのためにギャップが発生することがあります。通常、データをクエリする際に、そのようなギャップを残したくありません。この場合、`WITH FILL`句が便利です。このガイドでは、`WITH FILL`を使用してタイムシリーズデータのギャップを埋める方法を説明します。 + +## セットアップ + +GenAIイメージサービスによって生成された画像のメタデータを格納する以下のようなテーブルがあるとします: + +```sql +CREATE TABLE images +( + `id` String, + `timestamp` DateTime64(3), + `height` Int64, + `width` Int64, + `size` Int64 +) +ENGINE = MergeTree +ORDER BY (size, height, width); +``` + +いくつかのレコードをインポートします: + +```sql +INSERT INTO images VALUES (1088619203512250448, '2023-03-24 00:24:03.684', 1536, 1536, 2207289); +INSERT INTO images VALUES (1088619204040736859, '2023-03-24 00:24:03.810', 1024, 1024, 1928974); +INSERT INTO images VALUES (1088619204749561989, '2023-03-24 00:24:03.979', 1024, 1024, 1275619); +INSERT INTO images VALUES (1088619206431477862, '2023-03-24 00:24:04.380', 2048, 2048, 5985703); +INSERT INTO images VALUES (1088619206905434213, '2023-03-24 00:24:04.493', 1024, 1024, 1558455); +INSERT INTO images VALUES (1088619208524431510, '2023-03-24 00:24:04.879', 1024, 1024, 1494869); +INSERT INTO images VALUES (1088619208425437515, '2023-03-24 00:24:05.160', 1024, 1024, 1538451); +``` + +## バケット単位のクエリ + +2023年3月24日の`00:24:03`から`00:24:04`の間に作成された画像を調べるために、これらの時点のパラメータを作成します: + +```sql +SET param_start = '2023-03-24 00:24:03', + param_end = '2023-03-24 00:24:04'; +``` + +次に、データを100ミリ秒のバケットにグループ化し、そのバケットで作成された画像の数を返すクエリを書きます: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +└─────────────────────────┴───────┘ +``` + +結果セットは画像が作成されたバケットのみを含んでいますが、タイムシリーズ分析では、エントリがなくても各100msのバケットを返したい場合があります。 + +## WITH FILL + +これらのギャップを埋めるために`WITH FILL`句を使用できます。また、ギャップを埋めるサイズである`STEP`も指定します。`DateTime`タイプの場合のデフォルトは1秒ですが、100msのギャップを埋めたいので、ステップ値として100msの間隔を指定します: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.000 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.500 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +└─────────────────────────┴───────┘ +``` + +`count`カラムには0の値でギャップが埋められています。 + +## WITH FILL...FROM + +しかし、時間範囲の最初にまだギャップがあります。これを修正するには`FROM`を指定します: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.000 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.500 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +└─────────────────────────┴───────┘ +``` + +結果から`00:24:03.000`から`00:24:03.500`までのバケットがすべて出現しています。 + +## WITH FILL...TO + +しかしまだ、時間範囲の終わりからいくつかのバケットが欠けています。これを埋めるために`TO`値を指定します。`TO`は含まれないので、終わりの時間に少しだけ追加します: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 1 millisecond +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ +│ 2023-03-24 00:24:03.900 │ 1 │ +│ 2023-03-24 00:24:04.000 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ +│ 2023-03-24 00:24:04.400 │ 1 │ +│ 2023-03-24 00:24:04.500 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ +│ 2023-03-24 00:24:04.900 │ 0 │ +│ 2023-03-24 00:24:05.000 │ 0 │ +└─────────────────────────┴───────┘ +``` + +ギャップがすべて埋められ、`00:24:03.000`から`00:24:05.000`までのすべての100msのエントリがあります。 + +## 累積カウント + +次に、バケット全体で作成された画像の累積カウントを保持したいとします。以下のように`cumulative`カラムを追加できます: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count, + sum(count) OVER (ORDER BY bucket) AS cumulative +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 1 millisecond +STEP toIntervalMillisecond(100); +``` + +```response +┌──────────────────bucket─┬─count─┬─cumulative─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.800 │ 1 │ 2 │ +│ 2023-03-24 00:24:03.900 │ 1 │ 3 │ +│ 2023-03-24 00:24:04.000 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.100 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.200 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.300 │ 1 │ 4 │ +│ 2023-03-24 00:24:04.400 │ 1 │ 5 │ +│ 2023-03-24 00:24:04.500 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.600 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.700 │ 0 │ 0 │ +│ 2023-03-24 00:24:04.800 │ 1 │ 6 │ +│ 2023-03-24 00:24:04.900 │ 0 │ 0 │ +│ 2023-03-24 00:24:05.000 │ 0 │ 0 │ +└─────────────────────────┴───────┴────────────┘ +``` + +`cumulative`カラムの値は意図した通りには機能していません。 + +## WITH FILL...INTERPOLATE + +`count`カラムが0の行は`cumulative`カラムも0のままですが、`cumulative`カラムの前の値を使用させたいです。以下のように`INTERPOLATE`句を使用してこれを実現できます: + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count, + sum(count) OVER (ORDER BY bucket) AS cumulative +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 100 millisecond +STEP toIntervalMillisecond(100) +INTERPOLATE (cumulative); +``` + +```response +┌──────────────────bucket─┬─count─┬─cumulative─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.100 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.200 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.300 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.400 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.500 │ 0 │ 0 │ +│ 2023-03-24 00:24:03.600 │ 1 │ 1 │ +│ 2023-03-24 00:24:03.700 │ 0 │ 1 │ +│ 2023-03-24 00:24:03.800 │ 1 │ 2 │ +│ 2023-03-24 00:24:03.900 │ 1 │ 3 │ +│ 2023-03-24 00:24:04.000 │ 0 │ 3 │ +│ 2023-03-24 00:24:04.100 │ 0 │ 3 │ +│ 2023-03-24 00:24:04.200 │ 0 │ 3 │ +│ 2023-03-24 00:24:04.300 │ 1 │ 4 │ +│ 2023-03-24 00:24:04.400 │ 1 │ 5 │ +│ 2023-03-24 00:24:04.500 │ 0 │ 5 │ +│ 2023-03-24 00:24:04.600 │ 0 │ 5 │ +│ 2023-03-24 00:24:04.700 │ 0 │ 5 │ +│ 2023-03-24 00:24:04.800 │ 1 │ 6 │ +│ 2023-03-24 00:24:04.900 │ 0 │ 6 │ +│ 2023-03-24 00:24:05.000 │ 0 │ 6 │ +└─────────────────────────┴───────┴────────────┘ +``` + +これでかなり良くなりました。そして最後に、`bar`関数を使用して棒グラフを追加します。新しいカラムを`INTERPPOLATE`句に追加するのも忘れないようにします。 + +```sql +SELECT + toStartOfInterval(timestamp, toIntervalMillisecond(100)) AS bucket, + count() AS count, + sum(count) OVER (ORDER BY bucket) AS cumulative, + bar(cumulative, 0, 10, 10) AS barChart +FROM MidJourney.images +WHERE (timestamp >= {start:String}) AND (timestamp <= {end:String}) +GROUP BY ALL +ORDER BY bucket ASC +WITH FILL +FROM toDateTime64({start:String}, 3) +TO toDateTime64({end:String}, 3) + INTERVAL 100 millisecond +STEP toIntervalMillisecond(100) +INTERPOLATE (cumulative, barChart); +``` + +```response +┌──────────────────bucket─┬─count─┬─cumulative─┬─barChart─┐ +│ 2023-03-24 00:24:03.000 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.100 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.200 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.300 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.400 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.500 │ 0 │ 0 │ │ +│ 2023-03-24 00:24:03.600 │ 1 │ 1 │ █ │ +│ 2023-03-24 00:24:03.700 │ 0 │ 1 │ █ │ +│ 2023-03-24 00:24:03.800 │ 1 │ 2 │ ██ │ +│ 2023-03-24 00:24:03.900 │ 1 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.000 │ 0 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.100 │ 0 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.200 │ 0 │ 3 │ ███ │ +│ 2023-03-24 00:24:04.300 │ 1 │ 4 │ ████ │ +│ 2023-03-24 00:24:04.400 │ 1 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.500 │ 0 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.600 │ 0 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.700 │ 0 │ 5 │ █████ │ +│ 2023-03-24 00:24:04.800 │ 1 │ 6 │ ██████ │ +│ 2023-03-24 00:24:04.900 │ 0 │ 6 │ ██████ │ +│ 2023-03-24 00:24:05.000 │ 0 │ 6 │ ██████ │ +└─────────────────────────┴───────┴────────────┴──────────┘ +``` diff --git a/docs/ja/guides/developer/ttl.md b/docs/ja/guides/developer/ttl.md new file mode 100644 index 00000000000..01e5a2914db --- /dev/null +++ b/docs/ja/guides/developer/ttl.md @@ -0,0 +1,259 @@ +--- +slug: /ja/guides/developer/ttl +sidebar_label: 有効期限 (TTL) +sidebar_position: 2 +keywords: [ttl, time to live, clickhouse, 古い, データ] +description: TTL (time-to-live) は、一定期間経過後に行やカラムを移動、削除、または集約する機能を指します。 +--- + +# 有効期限 (TTL) を用いたデータ管理 + +## TTLの概要 + +TTL (time-to-live) は、一定期間経過後に行やカラムを移動、削除、または集約する機能を指します。「time-to-live」という表現は古いデータを削除することだけを意味しているように聞こえますが、TTLにはいくつかの用途があります: + +- 古いデータの削除: 予想どおり、指定された時間経過後に行やカラムを削除できます +- ディスク間のデータ移動: 一定時間経過後にストレージボリューム間でデータを移動できます - ホット/ウォーム/コールドアーキテクチャの展開に役立ちます +- データのロールアップ: 古いデータを削除する前に、有用な集計や計算にまとめます + +:::note +TTLは、テーブル全体または特定のカラムに適用できます。 +::: + +## TTLの構文 + +`TTL`句は、カラム定義の後および/またはテーブル定義の最後に記述できます。`INTERVAL`句を使用して、時間の長さを定義します(これには`Date`または`DateTime`データ型が必要です)。たとえば、次のテーブルには`TTL`句を持つ二つのカラムがあります: + +```sql +CREATE TABLE example1 ( + timestamp DateTime, + x UInt32 TTL timestamp + INTERVAL 1 MONTH, + y String TTL timestamp + INTERVAL 1 DAY, + z String +) +ENGINE = MergeTree +ORDER BY tuple() +``` + +- xカラムは、timestampカラムから1か月の有効期限があります +- yカラムは、timestampカラムから1日の有効期限があります +- インターバルが経過すると、カラムは期限切れになります。ClickHouseはデフォルト値に置き換え、データ部分の全カラム値が期限切れになると、そのカラムをファイルシステムから削除します。 + +:::note +TTLルールは変更または削除できます。詳細は[テーブルTTLの操作](/docs/ja/sql-reference/statements/alter/ttl.md)ページを参照してください。 +::: + +## TTLイベントのトリガー + +期限切れの行を削除または集約する操作は即時には行われず、テーブルマージ時にのみ実行されます。アクティブにマージされていないテーブルがある場合、TTLイベントをトリガーする2つの設定があります: + +- `merge_with_ttl_timeout`: 削除TTLで再度マージするまでの最小遅延時間(秒)。デフォルトは14400秒(4時間)です。 +- `merge_with_recompression_ttl_timeout`: 再圧縮TTL(削除前にデータをロールアップするルール)で再度マージするまでの最小遅延時間(秒)。デフォルト値は14400秒(4時間)です。 + +したがって、デフォルトでは、TTLルールは少なくとも4時間ごとにテーブルに適用されます。より頻繁にTTLルールを適用する必要がある場合は、上記の設定を変更してください。 + +:::note +推奨する頻繁な使用法ではありませんが、`OPTIMIZE`を使用してマージを強制することもできます: + +```sql +OPTIMIZE TABLE example1 FINAL +``` + +`OPTIMIZE`はテーブルの部分の予定外のマージを初期化し、`FINAL`はテーブルがすでに単一部分になっている場合に再最適化を強制します。 +::: + +## 行の削除 + +一定時間経過後にテーブル全体の行を削除するには、テーブルレベルでTTLルールを定義します: + +```sql +CREATE TABLE customers ( +timestamp DateTime, +name String, +balance Int32, +address String +) +ENGINE = MergeTree +ORDER BY timestamp +TTL timestamp + INTERVAL 12 HOUR +``` + +さらに、レコードの値に基づくTTLルールを定義することも可能です。 +これは、条件を指定することで簡単に実装できます。 +複数の条件を許可しています: + +```sql +CREATE TABLE events +( + `event` String, + `time` DateTime, + `value` UInt64 +) +ENGINE = MergeTree +ORDER BY (event, time) +TTL time + INTERVAL 1 MONTH DELETE WHERE event != 'error', + time + INTERVAL 6 MONTH DELETE WHERE event = 'error' +``` + +## カラムの削除 + +行全体を削除する代わりに、balanceとaddressカラムだけを期限切れにしたいとします。`customers`テーブルを変更し、両方のカラムに2時間のTTLを追加します: + +```sql +ALTER TABLE customers +MODIFY COLUMN balance Int32 TTL timestamp + INTERVAL 2 HOUR, +MODIFY COLUMN address String TTL timestamp + INTERVAL 2 HOUR +``` + +## ロールアップの実装 + +特定の期間経過後に行を削除したいが、報告目的のために一部のデータを保持したい場合を考えてみましょう。すべての詳細が欲しいわけではなく、履歴データの集約された結果を少し欲しいだけです。これは、`TTL`式に`GROUP BY`句を追加し、テーブルのカラムを使用して集約結果を保存することで実装できます。 + +以下の`hits`テーブルでは、古い行を削除しますが、削除する前に`hits`カラムの合計と最大を保持したいとします。それらの値を保存するフィールドが必要であり、それに加えて合計と最大をロールアップする`TTL`句に`GROUP BY`句を追加する必要があります: + +```sql +CREATE TABLE hits ( + timestamp DateTime, + id String, + hits Int32, + max_hits Int32 DEFAULT hits, + sum_hits Int64 DEFAULT hits +) +ENGINE = MergeTree +PRIMARY KEY (id, toStartOfDay(timestamp), timestamp) +TTL timestamp + INTERVAL 1 DAY + GROUP BY id, toStartOfDay(timestamp) + SET + max_hits = max(max_hits), + sum_hits = sum(sum_hits); +``` + +`hits`テーブルに関するいくつかの注意点: + +- `TTL`句の`GROUP BY`カラムは`PRIMARY KEY`のプレフィックスである必要があり、結果を日付の開始時点でグループ化したいです。そのため、`toStartOfDay(timestamp)`が主キーに追加されました +- 集約結果を保存するためのフィールド`max_hits`と`sum_hits`を追加しました +- `max_hits`と`sum_hits`のデフォルト値を`hits`に設定することは、`SET`句に基づいて、ロジックが機能するために必要です + +## ホット/ウォーム/コールドアーキテクチャの実装 + +:::note +ClickHouse Cloudを使用している場合、このレッスンの手順は適用されません。ClickHouse Cloudでは、古いデータを移動するといったことを気にする必要はありません。 +::: + +大量のデータを扱う際に一般的な手法として、データが古くなるにつれてデータを移動する方法があります。以下は`TTL`コマンドの`TO DISK`と`TO VOLUME`句を使用して、ClickHouseでホット/ウォーム/コールドアーキテクチャを実装する手順です。(ちなみに、これをホットとコールドのものとする必要はなく、どのようなユースケースでもデータを移動するためにTTLを使用できます。) + +1. `TO DISK`と`TO VOLUME`オプションは、ClickHouseの構成ファイルに定義されているディスクまたはボリュームの名前を指します。ディスクを定義する新しいファイル`my_system.xml`(または任意のファイル名)を作成し、そのディスクを使用するボリュームを定義します。このXMLファイルを`/etc/clickhouse-server/config.d/`に配置して、システムに構成を適用します: + +```xml + + + + + + + ./hot/ + + + ./warm/ + + + ./cold/ + + + + + + + default + + + hot_disk + + + warm_disk + + + cold_disk + + + + + + +``` + +2. 上記の設定は、ClickHouseが読み書きできるフォルダを指す三つのディスクを指しています。ボリュームは一つ以上のディスクを含むことができ、私たちは三つのディスクのためにそれぞれのボリュームを定義しました。ディスクを確認してみましょう: + +```sql +SELECT name, path, free_space, total_space +FROM system.disks +``` + +```response +┌─name────────┬─path───────────┬───free_space─┬──total_space─┐ +│ cold_disk │ ./data/cold/ │ 179143311360 │ 494384795648 │ +│ default │ ./ │ 179143311360 │ 494384795648 │ +│ hot_disk │ ./data/hot/ │ 179143311360 │ 494384795648 │ +│ warm_disk │ ./data/warm/ │ 179143311360 │ 494384795648 │ +└─────────────┴────────────────┴──────────────┴──────────────┘ +``` + +3. そして…ボリュームを確認しましょう: + +```sql +SELECT + volume_name, + disks +FROM system.storage_policies +``` + +```response +┌─volume_name─┬─disks─────────┐ +│ default │ ['default'] │ +│ hot_volume │ ['hot_disk'] │ +│ warm_volume │ ['warm_disk'] │ +│ cold_volume │ ['cold_disk'] │ +└─────────────┴───────────────┘ +``` + +4. では、データをホット、ウォーム、そしてコールドボリューム間で移動する`TTL`ルールを追加します: + +```sql +ALTER TABLE my_table + MODIFY TTL + trade_date TO VOLUME 'hot_volume', + trade_date + INTERVAL 2 YEAR TO VOLUME 'warm_volume', + trade_date + INTERVAL 4 YEAR TO VOLUME 'cold_volume'; +``` + +5. 新しい`TTL`ルールは材料化されるはずですが、確認のために強制することもできます: + +```sql +ALTER TABLE my_table + MATERIALIZE TTL +``` + +6. `system.parts`テーブルを使って、データが期待通りのディスクに移動したかを確認してください: + +```sql +Using the system.parts table, view which disks the parts are on for the crypto_prices table: + +SELECT + name, + disk_name +FROM system.parts +WHERE (table = 'my_table') AND (active = 1) +``` + +レスポンスは以下のようになります: + +```response +┌─name────────┬─disk_name─┐ +│ all_1_3_1_5 │ warm_disk │ +│ all_2_2_0 │ hot_disk │ +└─────────────┴───────────┘ +``` + +## 関連コンテンツ + +- ブログ&ウェビナー: [Using TTL to Manage Data Lifecycles in ClickHouse](https://clickhouse.com/blog/using-ttl-to-manage-data-lifecycles-in-clickhouse) diff --git a/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer.md b/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer.md new file mode 100644 index 00000000000..17f09ccff83 --- /dev/null +++ b/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer.md @@ -0,0 +1,436 @@ +--- +slug: /ja/guides/developer/understanding-query-execution-with-the-analyzer +sidebar_label: アナライザーでクエリ実行を理解する +title: アナライザーでクエリ実行を理解する +--- + +# アナライザーでクエリ実行を理解する + +ClickHouseはクエリを非常に迅速に処理しますが、クエリの実行は単純ではありません。`SELECT`クエリがどのように実行されるかを理解してみましょう。これを説明するために、ClickHouseにテーブルにデータを追加します。 + +```sql +CREATE TABLE session_events( + clientId UUID, + sessionId UUID, + pageId UUID, + timestamp DateTime, + type String +) ORDER BY (timestamp); + +INSERT INTO session_events SELECT * FROM generateRandom('clientId UUID, + sessionId UUID, + pageId UUID, + timestamp DateTime, + type Enum(\'type1\', \'type2\')', 1, 10, 2) LIMIT 1000; +``` + +ClickHouseにデータを追加したので、クエリを実行してその実行を理解したいと思います。クエリの実行は多くのステップに分解されます。クエリ実行の各ステップは、対応する`EXPLAIN`クエリを使用して分析およびトラブルシューティングを行うことができます。これらのステップは以下のチャートにまとめられています。 + +![Explain query steps](./images/analyzer1.png) + +クエリ実行中の各エンティティの動作を見てみましょう。いくつかのクエリを取り上げ、`EXPLAIN`ステートメントを使用してそれらを調べます。 + +## パーサー + +パーサーの目的はクエリテキストをAST(抽象構文木)に変換することです。このステップは`EXPLAIN AST`を使用して視覚化できます。 + +```sql +EXPLAIN AST SELECT min(timestamp), max(timestamp) FROM session_events; + +┌─explain────────────────────────────────────────────┐ +│ SelectWithUnionQuery (children 1) │ +│ ExpressionList (children 1) │ +│ SelectQuery (children 2) │ +│ ExpressionList (children 2) │ +│ Function min (alias minimum_date) (children 1) │ +│ ExpressionList (children 1) │ +│ Identifier timestamp │ +│ Function max (alias maximum_date) (children 1) │ +│ ExpressionList (children 1) │ +│ Identifier timestamp │ +│ TablesInSelectQuery (children 1) │ +│ TablesInSelectQueryElement (children 1) │ +│ TableExpression (children 1) │ +│ TableIdentifier session_events │ +└────────────────────────────────────────────────────┘ +``` + +出力は以下のように視覚化される抽象構文木です。 + +![AST output](./images/analyzer2.png) + +各ノードには対応する子ノードがあり、全体の木構造はクエリの全体構造を表しています。これは、クエリ処理を助ける論理構造です。エンドユーザーの観点では(クエリ実行に興味がない限り)それほど役に立ちませんが、このツールは主に開発者によって使用されます。 + +## アナライザー + + + +ClickHouseには現在、アナライザーのための2つのアーキテクチャがあります。古いアーキテクチャを使用するには、`allow_experimental_analyzer=0`を設定することができます。新しいアーキテクチャを使用したい場合は、`allow_experimental_analyzer=1`を設定してください。新しいアナライザーが一般的に利用可能になったら古いものは廃止されるため、ここでは新しいアーキテクチャのみを説明します。 + +:::note +新しいアナライザーはベータ版です。新しいアーキテクチャはClickHouseの性能向上に役立つはずですが、クエリ処理ステップの基本要素であるため、いくつかのクエリに悪影響を及ぼす可能性もあります。新しいアナライザーに移行した後、性能の低下、クエリの失敗、または予期しない結果をもたらすクエリが発生する可能性があります。クエリまたはユーザーレベルで`allow_experimental_analyzer`設定を変更することで、古いアナライザーに戻すことができます。あらゆる問題をGitHubにて報告してください。 +::: + +アナライザーはクエリ実行の重要なステップです。ASTを取得してクエリツリーに変換します。クエリツリーの主な利点は、多くのコンポーネントが解決されることです。例えば、ストレージや、どのテーブルから読むのかがわかります。別名も解決され、異なるデータ型が使用されていることがわかります。これらすべての利点から、アナライザーは最適化を適用できます。これらの最適化は「パス」を通じて機能します。各パスは異なる最適化を探します。パスの一覧は[こちら](https://github.com/ClickHouse/ClickHouse/blob/76578ebf92af3be917cd2e0e17fea2965716d958/src/Analyzer/QueryTreePassManager.cpp#L249)にあります。以前のクエリで実際に確認してみましょう。 + +```sql +EXPLAIN QUERY TREE passes=0 SELECT min(timestamp) AS minimum_date, max(timestamp) AS maximum_date FROM session_events SETTINGS allow_experimental_analyzer=1; + +┌─explain────────────────────────────────────────────────────────────────────────────────┐ +│ QUERY id: 0 │ +│ PROJECTION │ +│ LIST id: 1, nodes: 2 │ +│ FUNCTION id: 2, alias: minimum_date, function_name: min, function_type: ordinary │ +│ ARGUMENTS │ +│ LIST id: 3, nodes: 1 │ +│ IDENTIFIER id: 4, identifier: timestamp │ +│ FUNCTION id: 5, alias: maximum_date, function_name: max, function_type: ordinary │ +│ ARGUMENTS │ +│ LIST id: 6, nodes: 1 │ +│ IDENTIFIER id: 7, identifier: timestamp │ +│ JOIN TREE │ +│ IDENTIFIER id: 8, identifier: session_events │ +│ SETTINGS allow_experimental_analyzer=1 │ +└────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +```sql +EXPLAIN QUERY TREE passes=20 SELECT min(timestamp) AS minimum_date, max(timestamp) AS maximum_date FROM session_events SETTINGS allow_experimental_analyzer=1; + +┌─explain───────────────────────────────────────────────────────────────────────────────────┐ +│ QUERY id: 0 │ +│ PROJECTION COLUMNS │ +│ minimum_date DateTime │ +│ maximum_date DateTime │ +│ PROJECTION │ +│ LIST id: 1, nodes: 2 │ +│ FUNCTION id: 2, function_name: min, function_type: aggregate, result_type: DateTime │ +│ ARGUMENTS │ +│ LIST id: 3, nodes: 1 │ +│ COLUMN id: 4, column_name: timestamp, result_type: DateTime, source_id: 5 │ +│ FUNCTION id: 6, function_name: max, function_type: aggregate, result_type: DateTime │ +│ ARGUMENTS │ +│ LIST id: 7, nodes: 1 │ +│ COLUMN id: 4, column_name: timestamp, result_type: DateTime, source_id: 5 │ +│ JOIN TREE │ +│ TABLE id: 5, alias: __table1, table_name: default.session_events │ +│ SETTINGS allow_experimental_analyzer=1 │ +└───────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +2つの実行の間に、別名やプロジェクションの解決を見ることができます。 + +## プランナー + +プランナーはクエリツリーを取り、それに基づいてクエリプランを構築します。クエリツリーは特定のクエリで何をしたいかを示し、クエリプランはそれをどのように行うかを示します。追加の最適化がクエリプランの一部として行われます。`EXPLAIN PLAN`または`EXPLAIN`を使用してクエリプランを見ることができます(`EXPLAIN`は`EXPLAIN PLAN`を実行します)。 + +```sql +EXPLAIN PLAN WITH + ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT type, min(timestamp) AS minimum_date, max(timestamp) AS maximum_date, count(*) /total_rows * 100 AS percentage FROM session_events GROUP BY type + +┌─explain──────────────────────────────────────────┐ +│ Expression ((Projection + Before ORDER BY)) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ ReadFromMergeTree (default.session_events) │ +└──────────────────────────────────────────────────┘ +``` + +これが私たちにいくつかの情報を提供していますが、さらに多くの情報を得ることができます。たとえば、プロジェクションを行う必要があるカラムの名前を知りたいかもしれません。その場合、ヘッダーをクエリに追加することができます。 + +``` +EXPLAIN header = 1 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type + +┌─explain──────────────────────────────────────────┐ +│ Expression ((Projection + Before ORDER BY)) │ +│ Header: type String │ +│ minimum_date DateTime │ +│ maximum_date DateTime │ +│ percentage Nullable(Float64) │ +│ Aggregating │ +│ Header: type String │ +│ min(timestamp) DateTime │ +│ max(timestamp) DateTime │ +│ count() UInt64 │ +│ Expression (Before GROUP BY) │ +│ Header: timestamp DateTime │ +│ type String │ +│ ReadFromMergeTree (default.session_events) │ +│ Header: timestamp DateTime │ +│ type String │ +└──────────────────────────────────────────────────┘ +``` + +これで最後のプロジェクションのために作成する必要があるカラム名(`minimum_date`、`maximum_date`、および`percentage`)を知ることができますが、実行する必要があるすべてのアクションの詳細も知りたいかもしれません。これは`actions=1`を設定することで行うことができます。 + +```sql +EXPLAIN actions = 1 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type + + +┌─explain────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ Expression ((Projection + Before ORDER BY)) │ +│ Actions: INPUT :: 0 -> type String : 0 │ +│ INPUT : 1 -> min(timestamp) DateTime : 1 │ +│ INPUT : 2 -> max(timestamp) DateTime : 2 │ +│ INPUT : 3 -> count() UInt64 : 3 │ +│ COLUMN Const(Nullable(UInt64)) -> total_rows Nullable(UInt64) : 4 │ +│ COLUMN Const(UInt8) -> 100 UInt8 : 5 │ +│ ALIAS min(timestamp) :: 1 -> minimum_date DateTime : 6 │ +│ ALIAS max(timestamp) :: 2 -> maximum_date DateTime : 1 │ +│ FUNCTION divide(count() :: 3, total_rows :: 4) -> divide(count(), total_rows) Nullable(Float64) : 2 │ +│ FUNCTION multiply(divide(count(), total_rows) :: 2, 100 :: 5) -> multiply(divide(count(), total_rows), 100) Nullable(Float64) : 4 │ +│ ALIAS multiply(divide(count(), total_rows), 100) :: 4 -> percentage Nullable(Float64) : 5 │ +│ Positions: 0 6 1 5 │ +│ Aggregating │ +│ Keys: type │ +│ Aggregates: │ +│ min(timestamp) │ +│ Function: min(DateTime) → DateTime │ +│ Arguments: timestamp │ +│ max(timestamp) │ +│ Function: max(DateTime) → DateTime │ +│ Arguments: timestamp │ +│ count() │ +│ Function: count() → UInt64 │ +│ Arguments: none │ +│ Skip merging: 0 │ +│ Expression (Before GROUP BY) │ +│ Actions: INPUT :: 0 -> timestamp DateTime : 0 │ +│ INPUT :: 1 -> type String : 1 │ +│ Positions: 0 1 │ +│ ReadFromMergeTree (default.session_events) │ +│ ReadType: Default │ +│ Parts: 1 │ +│ Granules: 1 │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +これで使用されているすべての入力、関数、エイリアス、データ型を見ることができます。プランナーが適用するいくつかの最適化は[こちら](https://github.com/ClickHouse/ClickHouse/blob/master/src/Processors/QueryPlan/Optimizations/Optimizations.h)に見ることができます。 + +## クエリパイプライン + +クエリパイプラインはクエリプランから生成されます。クエリパイプラインはクエリプランに非常に似ていますが、それが木ではなくグラフであるという点が異なります。ClickHouseがどのようにクエリを実行し、どのリソースが使用されるかを強調表示します。クエリパイプラインを分析することは、入力/出力に関するボトルネックを確認するのに非常に役立ちます。以前のクエリを取り上げ、クエリパイプラインの実行を見てみましょう。 + +```sql +EXPLAIN PIPELINE +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type; + +┌─explain────────────────────────────────────────────────────────────────────┐ +│ (Expression) │ +│ ExpressionTransform × 2 │ +│ (Aggregating) │ +│ Resize 1 → 2 │ +│ AggregatingTransform │ +│ (Expression) │ +│ ExpressionTransform │ +│ (ReadFromMergeTree) │ +│ MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread) 0 → 1 │ +└────────────────────────────────────────────────────────────────────────────┘ +``` + +括弧内はクエリプランステップであり、それに続くのはプロセッサーです。これは素晴らしい情報ですが、これはグラフであるため、そのように視覚化できると良いでしょう。設定`graph`を1に設定し、出力フォーマットをTSVに指定することができます。 + +```sql +EXPLAIN PIPELINE graph=1 WITH + ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT type, min(timestamp) AS minimum_date, max(timestamp) AS maximum_date, count(*) /total_rows * 100 AS percentage FROM session_events GROUP BY type FORMAT TSV; +``` + +``` +digraph +{ + rankdir="LR"; + { node [shape = rect] + subgraph cluster_0 { + label ="Expression"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n5 [label="ExpressionTransform × 2"]; + } + } + subgraph cluster_1 { + label ="Aggregating"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n3 [label="AggregatingTransform"]; + n4 [label="Resize"]; + } + } + subgraph cluster_2 { + label ="Expression"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n2 [label="ExpressionTransform"]; + } + } + subgraph cluster_3 { + label ="ReadFromMergeTree"; + style=filled; + color=lightgrey; + node [style=filled,color=white]; + { rank = same; + n1 [label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + } + } + } + n3 -> n4 [label=""]; + n4 -> n5 [label="× 2"]; + n2 -> n3 [label=""]; + n1 -> n2 [label=""]; +} +``` + +この出力をコピーし、[ここ](https://dreampuf.github.io/GraphvizOnline)に貼り付けると、次のグラフが生成されます。 + +![Graph output](./images/analyzer3.png) + +白い矩形はパイプラインノードに対応し、灰色の矩形はクエリプランステップに対応します。数字の後に`x`が付くのは、使用されている入力/出力の数を示しています。コンパクト形式で見たくない場合は、`compact=0`を追加することができます。 + +```sql +EXPLAIN PIPELINE graph = 1, compact = 0 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type +FORMAT TSV +``` + +``` +digraph +{ + rankdir="LR"; + { node [shape = rect] + n0[label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + n1[label="ExpressionTransform"]; + n2[label="AggregatingTransform"]; + n3[label="Resize"]; + n4[label="ExpressionTransform"]; + n5[label="ExpressionTransform"]; + } + n0 -> n1; + n1 -> n2; + n2 -> n3; + n3 -> n4; + n3 -> n5; +} +``` + +![Compact graph output](./images/analyzer4.png) + +なぜClickHouseは複数のスレッドを使用してテーブルから読み取りを行わないのでしょうか?テーブルにデータを追加してみましょう。 + +```sql +INSERT INTO session_events SELECT * FROM generateRandom('clientId UUID, + sessionId UUID, + pageId UUID, + timestamp DateTime, + type Enum(\'type1\', \'type2\')', 1, 10, 2) LIMIT 1000000; +``` + +次に、再度`EXPLAIN`クエリを実行してみましょう。 + +```sql +EXPLAIN PIPELINE graph = 1, compact = 0 +WITH ( + SELECT count(*) + FROM session_events + ) AS total_rows +SELECT + type, + min(timestamp) AS minimum_date, + max(timestamp) AS maximum_date, + (count(*) / total_rows) * 100 AS percentage +FROM session_events +GROUP BY type +FORMAT TSV +``` + +``` +digraph +{ + rankdir="LR"; + { node [shape = rect] + n0[label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + n1[label="MergeTreeSelect(pool: PrefetchedReadPool, algorithm: Thread)"]; + n2[label="ExpressionTransform"]; + n3[label="ExpressionTransform"]; + n4[label="StrictResize"]; + n5[label="AggregatingTransform"]; + n6[label="AggregatingTransform"]; + n7[label="Resize"]; + n8[label="ExpressionTransform"]; + n9[label="ExpressionTransform"]; + } + n0 -> n2; + n1 -> n3; + n2 -> n4; + n3 -> n4; + n4 -> n5; + n4 -> n6; + n5 -> n7; + n6 -> n7; + n7 -> n8; + n7 -> n9; +} +``` + +![Parallel graph](./images/analyzer5.png) + +したがって、エグゼキューターはデータ量が十分でないため、操作を並列化しないことを決定しました。より多くの行を追加すると、エグゼキューターはグラフに示されるように複数のスレッドを使用することを決定しました。 + +## エグゼキューター + +クエリ実行の最後のステップはエグゼキューターによって行われます。クエリパイプラインを取り、それを実行します。`SELECT`、`INSERT`、または`INSERT SELECT`を行うかに応じて、異なるエグゼキューターがあります。 +``` diff --git a/docs/ja/guides/images/joins-1.png b/docs/ja/guides/images/joins-1.png new file mode 100644 index 00000000000..2888262493f Binary files /dev/null and b/docs/ja/guides/images/joins-1.png differ diff --git a/docs/ja/guides/images/joins-2.png b/docs/ja/guides/images/joins-2.png new file mode 100644 index 00000000000..26bd293170c Binary files /dev/null and b/docs/ja/guides/images/joins-2.png differ diff --git a/docs/ja/guides/images/joins-3.png b/docs/ja/guides/images/joins-3.png new file mode 100644 index 00000000000..8b62fa42897 Binary files /dev/null and b/docs/ja/guides/images/joins-3.png differ diff --git a/docs/ja/guides/images/joins-4.png b/docs/ja/guides/images/joins-4.png new file mode 100644 index 00000000000..121f412384f Binary files /dev/null and b/docs/ja/guides/images/joins-4.png differ diff --git a/docs/ja/guides/images/joins-5.png b/docs/ja/guides/images/joins-5.png new file mode 100644 index 00000000000..8e2fe2df3ab Binary files /dev/null and b/docs/ja/guides/images/joins-5.png differ diff --git a/docs/ja/guides/images/postgres-inserts.png b/docs/ja/guides/images/postgres-inserts.png new file mode 100644 index 00000000000..0b4032adfb9 Binary files /dev/null and b/docs/ja/guides/images/postgres-inserts.png differ diff --git a/docs/ja/guides/images/s3_bucket_example.png b/docs/ja/guides/images/s3_bucket_example.png new file mode 100644 index 00000000000..9c6d5c4355c Binary files /dev/null and b/docs/ja/guides/images/s3_bucket_example.png differ diff --git a/docs/ja/guides/inserting-data.md b/docs/ja/guides/inserting-data.md new file mode 100644 index 00000000000..03bbcc997be --- /dev/null +++ b/docs/ja/guides/inserting-data.md @@ -0,0 +1,77 @@ +--- +title: データの挿入 +description: ClickHouseへのデータの挿入方法 +keywords: [挿入, データ挿入, テーブルへの挿入] +--- + +## 基本的な例 + +ClickHouseでおなじみの `INSERT INTO TABLE` コマンドを使用できます: + +```sql +INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES + (101, 'Hello, ClickHouse!', now(), -1.0 ), + (102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ), + (102, 'Sort your data based on your commonly-used queries', today(), 2.718 ), + (101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 ) +``` + +動作を確認してみましょう。挿入された4行のデータが表示されるはずです: + +```sql +SELECT * FROM helloworld.my_first_table +``` + +## ClickHouseへの挿入とOLTPデータベースとの比較 + +OLAPデータベースとして、ClickHouseは高性能とスケーラビリティに最適化されており、毎秒何百万行もの挿入を可能にします。これは、高度に並列化されたアーキテクチャ、列指向による高圧縮を組み合わせることで実現されますが、一貫性には妥協があります。具体的には、ClickHouseは追記専用操作に最適化されており、最終的な整合性の保証のみを提供します。 + +これに対し、PostgresのようなOLTPデータベースは、トランザクション挿入に最適化され、完全なACID準拠を持ち、強い一貫性と信頼性の保証を提供します。PostgreSQLはMVCC(Multi-Version Concurrency Control)を使用して同時トランザクションを処理し、複数のデータバージョンを維持します。これらのトランザクションは、時間内に少数の行になる可能性があり、挿入パフォーマンスを制限する信頼性保証によるオーバーヘッドが発生します。 + +ClickHouseへの高い挿入パフォーマンスを達成するために、強い一貫性の保証を得る場合、以下に説明するシンプルなルールに従う必要があります。これにより、ClickHouseを初めて使用するユーザーがOLTP挿入戦略を再現する際に一般的に遭遇する問題を回避できます。 + +## 挿入時のベストプラクティス + +- **大きなバッチサイズ** - デフォルトでは、ClickHouseに送信される各挿入は、挿入からのデータと共に保存する必要のある他のメタデータを含むストレージのパートを即座に作成するため、より多くのデータを含む小さな数の挿入を送信することは、より少ないデータを含む多量の挿入を送信することに比べて必要な書き込みの数を減らします。基本的には、1,000行以上、理想的には10,000〜100,000行のかなり大きなバッチでデータを挿入することをお勧めします。詳細は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse#data-needs-to-be-batched-for-optimal-performance)。大きなバッチが不可能な場合は、以下で説明する非同期挿入を使用してください。 + +- **再試行のための一貫したバッチを確保して冪等性を担保する再試行** - デフォルトでは、ClickHouseへの挿入は同期的であり、同一の場合のみ冪等性があります。MergeTreeエンジンファミリーのテーブルの場合、ClickHouseはデフォルトで自動的に[挿入時に重複を除去](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse#5-deduplication-at-insert-time)します。例えば以下のようなケースにおいても挿入は許容されます: + + 1. データを受信したノードに問題がある場合、挿入クエリはタイムアウト(またはより具体的なエラー)し、確認応答が得られません。 + 2. データがノードによって書き込まれたが、ネットワークの中断により、クエリの送信者に確認応答を返すことができない場合、送信者はタイムアウトまたはネットワークエラーを受け取ります。 + + クライアントの観点からは、(i) と (ii) を区別するのは難しい場合があります。しかし、どちらの場合でも、確認のない挿入は直ちに再試行できます。再試行された挿入クエリが同じ順序で同じデータを含む限り、ClickHouseは(確認されていない)元の挿入が成功した場合、再試行された挿入を自動的に無視します。 + +- **MergeTreeテーブルまたは分散テーブルへの挿入** - データがシャードされている場合、リクエストを一連のノードに分散させてMergeTree(またはReplicatedテーブル)に直接挿入し、`internal_replication=true` を使用することを推奨します。これにより、ClickHouseはデータを任意のレプリカシャードにレプリケートし、データが最終的に整合性を持つようにします。このクライアントサイドの負荷分散が不便な場合、ユーザーは[分散テーブル](/ja/engines/table-engines/special/distributed)を介して挿入できます。これにより、ノード間で書き込みが分散されます(やはり、`internal_replication=true` を設定します)。このアプローチは、ノードに分散テーブルがある場合、データをローカルで書き込んでからシャードに送信するため、やや性能が劣ります。 + +- **小さなバッチの非同期挿入を使用する** - クライアントサイドのバッチ処理が現実的でないシナリオ、例えば数百または数千の単機能エージェントがログ、メトリクス、トレースなどを送信する観測ユースケースでは、問題や異常を迅速に検出するためにリアルタイムのデータ転送が重要な場合があります。さらに、観測システムのイベントスパイクにより、観測データをクライアントサイドでバッファリングしようとするときに大規模なメモリスパイクや関連する問題が発生するリスクがあります。大きなバッチを挿入できない場合、ユーザーはClickHouseに[非同期挿入](/ja/cloud/bestpractices/asynchronous-inserts)を使用してバッチ処理を委任できます。非同期挿入では、データはまずバッファに挿入され、その後データベースストレージに書き込まれるか、非同期で書き込まれます。 + +
+ + NEEDS ALT + +
+ + 非同期挿入が有効化されているとき、ClickHouseが (1) 挿入クエリを受け取ると、クエリのデータは (2) まずメモリ内バッファに直ちに書き込まれます。 (1) に非同期で、 (3) 次のバッファフラッシュが行われたときのみ、バッファのデータはソートされてデータベースストレージの一部として書き込まれます。注意点として、バッファがデータベースストレージにフラッシュされる前は、クエリでデータを検索することはできません。バッファフラッシュは設定可能です。 + + バッファがフラッシュされる前に、同じまたは他のクライアントからの他の非同期挿入クエリのデータがバッファに収集される可能性があります。バッファフラッシュから作成されたパートには、複数の非同期挿入クエリからのデータが含まれる可能性があります。通常、これらのメカニズムはクライアントサイドからサーバーサイド(ClickHouseインスタンス)へのデータバッチシフトとなります。 + + 非同期挿入の設定に関する完全な詳細は[こちら](/ja/optimize/asynchronous-inserts#enabling-asynchronous-inserts)で確認でき、より深い情報は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)で確認できます。 + +- **公式クライアントを使用する** - ClickHouseは最も人気のあるプログラミング言語でのクライアントを持っています。これらは、挿入が正しく実行されることを保証するように最適化されており、直接またはクエリ、ユーザー、接続レベル設定での有効化により非同期挿入をネイティブにサポートします(例: [Goクライアント](/ja/integrations/go#async-insert))。 +- **ネイティブフォーマットの推奨** - ClickHouseは挿入(およびクエリ)時に多くの[入力フォーマット](/ja/interfaces/formats)をサポートしています。これはOLTPデータベースとの大きな違いであり、テーブル関数と連携した外部ソースからのデータ読み込みがより簡単になり、ディスク上のファイルからのデータロードの能力も含まれています。これらのフォーマットはアドホックなデータロードとデータエンジニアリング作業に理想的です。最適な挿入パフォーマンスを達成したいアプリケーションの場合、ユーザーはネイティブフォーマットで挿入するべきです。これはほとんどのクライアント(GoとPython)でサポートされており、サーバーが最小限の作業を必要とするため、最適な選択です。このフォーマットはすでに列指向なので、列指向データをクライアントが生成する必要はなく、インサートをスケールさせる取り組みにおいて考慮されるべきです。代替として、ユーザーは[RowBinaryフォーマット](/ja/interfaces/formats#rowbinary)(Javaクライアントで使用)の利用を検討できます。ネイティブフォーマットに比べて、書くのが通常より容易な行フォーマットです。JSONのような他の行フォーマットに比べて、圧縮、ネットワークオーバーヘッド、サーバーでの処理においてより効率的です。低い書き込みスループットのユーザーで迅速に統合したい場合は、JSONEachRowフォーマットを利用することもできます。このフォーマットには、ClickHouse内での解析にCPUオーバーヘッドがかかることをユーザーは認識しておく必要があります。 + +- **HTTPまたはネイティブプロトコル** - 多くの伝統的なデータベースとは異なり、ClickHouseはHTTPインターフェースをサポートしています。ユーザーはこれを使用して、上記のフォーマットのいずれかでデータを挿入およびクエリできます。これは、トラフィックをロードバランサで簡単に切り替えることができるため、ClickHouseのネイティブプロトコルよりも好まれることがあります。ネイティブプロトコルでの挿入パフォーマンスには若干の違いが予想され、多少のオーバーヘッドが軽減されます。既存のクライアントはこれらのプロトコルのいずれか(または両方、例: Goクライアント)を使用します。ネイティブプロトコルはクエリの進行を簡単に追跡することを可能にします。 + +## 大量データのロード + +Postgresから大量データをロードするためにユーザーは以下を使用できます: +- `PeerDB by ClickHouse`を使用する。これはPostgreSQLデータベースのレプリケーションを自社ホスト型ClickHouseおよびClickHouse Cloudに対して実行するために特別に設計されたETLツールです。開始するには[PeerDB Cloud](https://www.peerdb.io/)でアカウントを作成し、セットアップ手順については[ドキュメント](https://docs.peerdb.io/connect/clickhouse/clickhouse-cloud)を参照してください。 +- 過去の例で示したように、データを直接読み取るPostgresテーブル関数を使用する。通常は既知のウォーターマーク、例: タイムスタンプに基づくバッチレプリケーションに適しているか、ワンオフ移行の場合です。このアプローチは数千万行にスケールできます。より大きなデータセットを移行したいユーザーは、データのチャンクを扱う複数のリクエストを検討すべきです。各チャンクにはそのパーティションが最終テーブルに移動する前にステージングテーブルを使用できます。失敗したリクエストを再試行することが可能になります。この大量ロード戦略の詳細については、こちらを参照してください。 +- データをCSVフォーマットでPostgresからエクスポートできます。その後、ローカルファイルまたはオブジェクトストレージを介してテーブル関数を使用してClickHouseに挿入することができます。 + +:::note 大量データセットの挿入に関するお手伝いが必要ですか? +大きなデータセットの挿入時に助けが必要な場合や、ClickHouse Cloudにデータをインポートする際にエラーが発生した場合は、support@clickhouse.com までご連絡ください。サポートいたします。 +::: diff --git a/docs/ja/guides/joining-tables.md b/docs/ja/guides/joining-tables.md new file mode 100644 index 00000000000..6a26b4800db --- /dev/null +++ b/docs/ja/guides/joining-tables.md @@ -0,0 +1,204 @@ +--- +title: ClickHouseでのJOINの使用 +description: ClickHouseでテーブルを結合する方法 +keywords: [joins, join tables] +--- + +ClickHouseは、多様な結合アルゴリズムを備えた[フルの`JOIN`サポート](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)を提供しています。パフォーマンスを最大限に引き出すために、このガイドに記載されているJOINの最適化の提案に従うことを推奨します。 + +- 最適なパフォーマンスを得るには、特にリアルタイムの分析ワークロードにおいて、クエリでの`JOIN`の数を削減することを目指すべきです。クエリ内のJOINは最大3から4までに制限してください。[データモデリングセクション](/ja/data-modeling/schema-design)では、正規化解除、Dictionary、マテリアライズドビューなど、JOINを最小化するためのいくつかの変更について詳しく説明しています。 +- 現在、ClickHouseはJOINの順序を変更しません。常に最小のテーブルをJOINの右側に配置することを確認してください。ほとんどの結合アルゴリズムではこれがメモリに保持され、クエリのメモリオーバーヘッドを最低限に抑えます。 +- クエリが直接のJOINを必要とする場合、つまり`LEFT ANY JOIN`のような場合は、可能であれば[Dictionary](/ja/dictionary)を使用することをお勧めします。 + +
+ +NEEDS ALT + +
+ +- INNER JOINを実行する場合、これらを`IN`句を使用したサブクエリとして書くことがしばしばより最適です。以下のクエリを考えてみましょう。これらは機能的には同等で、両方とも質問にClickHouseが言及されていないが、`comments`には言及されている`posts`の数を見つけます。 + +```sql +SELECT count() +FROM stackoverflow.posts AS p +ANY INNER `JOIN` stackoverflow.comments AS c ON p.Id = c.PostId +WHERE (p.Title != '') AND (p.Title NOT ILIKE '%clickhouse%') AND (p.Body NOT ILIKE '%clickhouse%') AND (c.Text ILIKE '%clickhouse%') + +┌─count()─┐ +│ 86 │ +└─────────┘ + +1 row in set. Elapsed: 8.209 sec. Processed 150.20 million rows, 56.05 GB (18.30 million rows/s., 6.83 GB/s.) +Peak memory usage: 1.23 GiB. +``` + +注意すべきは、直積を避けるため`ANY INNER JOIN`を使用していることであり、つまり各ポストに対して1つの一致のみを望んでいます。 + +このJOINはサブクエリを使用して書き直すことで、パフォーマンスが大幅に向上します。 + +```sql +SELECT count() +FROM stackoverflow.posts +WHERE (Title != '') AND (Title NOT ILIKE '%clickhouse%') AND (Body NOT ILIKE '%clickhouse%') AND (Id IN ( + SELECT PostId + FROM stackoverflow.comments + WHERE Text ILIKE '%clickhouse%' +)) +┌─count()─┐ +│ 86 │ +└─────────┘ + +1 row in set. Elapsed: 2.284 sec. Processed 150.20 million rows, 16.61 GB (65.76 million rows/s., 7.27 GB/s.) +Peak memory usage: 323.52 MiB. +``` + +ClickHouseはすべてのJOIN句やサブクエリに条件を適用しようとしますが、可能であれば常に条件を手動ですべてのサブ句に適用し、`JOIN`するデータのサイズを最小化することをお勧めします。以下の例を考えてみましょう。ここでは、2020年以降のJava関連の投稿についてのアップボート数を計算したいと考えています。 + +大きなテーブルを左側に配置した素朴なクエリは56秒で完了します。 + +```sql +SELECT countIf(VoteTypeId = 2) AS upvotes +FROM stackoverflow.posts AS p +INNER JOIN stackoverflow.votes AS v ON p.Id = v.PostId +WHERE has(arrayFilter(t -> (t != ''), splitByChar('|', p.Tags)), 'java') AND (p.CreationDate >= '2020-01-01') + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 56.642 sec. Processed 252.30 million rows, 1.62 GB (4.45 million rows/s., 28.60 MB/s.) +``` + +JOINを再配置することでパフォーマンスが劇的に改善され、1.5秒になりました。 + +```sql +SELECT countIf(VoteTypeId = 2) AS upvotes +FROM stackoverflow.votes AS v +INNER JOIN stackoverflow.posts AS p ON v.PostId = p.Id +WHERE has(arrayFilter(t -> (t != ''), splitByChar('|', p.Tags)), 'java') AND (p.CreationDate >= '2020-01-01') + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 1.519 sec. Processed 252.30 million rows, 1.62 GB (166.06 million rows/s., 1.07 GB/s.) +``` + +右側のテーブルにフィルタを追加することで、パフォーマンスがさらに向上し、0.5秒になりました。 + +```sql +SELECT countIf(VoteTypeId = 2) AS upvotes +FROM stackoverflow.votes AS v +INNER JOIN stackoverflow.posts AS p ON v.PostId = p.Id +WHERE has(arrayFilter(t -> (t != ''), splitByChar('|', p.Tags)), 'java') AND (p.CreationDate >= '2020-01-01') AND (v.CreationDate >= '2020-01-01') + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 0.597 sec. Processed 81.14 million rows, 1.31 GB (135.82 million rows/s., 2.19 GB/s.) +Peak memory usage: 249.42 MiB. +``` + +このクエリは前述のように`INNER JOIN`をサブクエリに移動し、外側および内側のクエリにフィルタを維持することでさらに改善できます。 + +```sql +SELECT count() AS upvotes +FROM stackoverflow.votes +WHERE (VoteTypeId = 2) AND (PostId IN ( + SELECT Id + FROM stackoverflow.posts + WHERE (CreationDate >= '2020-01-01') AND has(arrayFilter(t -> (t != ''), splitByChar('|', Tags)), 'java') +)) + +┌─upvotes─┐ +│ 261915 │ +└─────────┘ + +1 row in set. Elapsed: 0.383 sec. Processed 99.64 million rows, 804.55 MB (259.85 million rows/s., 2.10 GB/s.) +Peak memory usage: 250.66 MiB. +``` + +## JOINアルゴリズムの選択 + +ClickHouseは、いくつかの[joinアルゴリズム](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)をサポートしています。これらのアルゴリズムは通常、メモリ使用量とパフォーマンスをトレードオフします。以下は、メモリ消費と実行時間に基づくClickHouse joinアルゴリズムの概要です: + +
+ +NEEDS ALT + +
+ +これらのアルゴリズムは、JOINクエリの計画と実行方法を決定します。デフォルトでは、ClickHouseは使用されたJOINタイプおよび結合テーブルのエンジンに基づいて直接またはハッシュJOINアルゴリズムを使用します。代わりに、ClickHouseを設定して、リソースの可用性と使用量に応じてランタイムで使用するJOINアルゴリズムを柔軟に選択し、動的に変更することもできます:`join_algorithm=auto`の場合、ClickHouseは最初にハッシュJOINアルゴリズムを試し、そのアルゴリズムのメモリ制限が超えた場合、そのアルゴリズムを部分マージJOINに即座に切り替えます。選択されたアルゴリズムをトレースログで観察することができます。ClickHouseはまた、`join_algorithm`設定を介してユーザーが希望のJOINアルゴリズムを自分で指定することも許可しています。 + +各JOINアルゴリズムのサポートされている`JOIN`タイプは以下に示されており、最適化を考慮する前に考慮するべきです: + +
+ +NEEDS ALT + +
+ +各`JOIN`アルゴリズムの詳細な説明、利点、欠点、スケーリング特性については[こちら](https://clickhouse.com/blog/clickhouse-fully-supports-joins-hash-joins-part2)で見つけることができます。 + +適切なJOINアルゴリズムの選択は、メモリの最適化を行うかパフォーマンスを最適化するかによります。 + +## JOINパフォーマンスの最適化 + +主要な最適化指標がパフォーマンスであり、JOINを可能な限り早く実行したい場合は、以下の意思決定ツリーを使用して適切なJOINアルゴリズムを選択できます: + +
+ +NEEDS ALT + +
+ +- **(1)** 右側のテーブルからのデータがメモリ内の低レイテンシのキー・バリューデータ構造、例えばDictionaryに事前ロードでき、JOINキーが基礎となるキー・バリューのストレージのキー属性に一致し、`LEFT ANY JOIN`のセマンティクスで十分である場合、**直接JOIN**が適用可能であり、最速のアプローチを提供します。 + +- **(2)** テーブルの[物理的な行順序](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)がJOINキーのソート順に一致する場合、この場合、**フルソートマージJOIN**はソートフェーズを[スキップ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3#utilizing-physical-row-order)し、メモリ消費を大幅に削減し、データサイズやJOINキー値の分布に応じて、一部のハッシュJOINアルゴリズムよりも速い実行時間を持ちます。 + +- **(3)** 右テーブルがメモリに収まる場合、追加のメモリ使用量のオーバーヘッドがあっても、**並列ハッシュJOIN**はこのアルゴリズムまたはハッシュJOINがより速い可能性があります。これはデータサイズ、データ型、およびJOINキーの値の分布に依存します。 + +- **(4)** 右テーブルがメモリに収まらない場合、それは再び依存します。ClickHouseは3つのメモリ非依存のJOINアルゴリズムを提供しています。すべてが一時的にデータをディスクにスピルします。**フルソートマージJOIN**および**部分マージJOIN**は、データの事前ソートを必要とします。**グレースハッシュJOIN**は、代わりにデータからハッシュテーブルを構築します。データ量、データ型、JOINキーの値の分布に基づいて、データをソートするよりも、データからハッシュテーブルを構築する方が速いシナリオ、またその逆のシナリオがあります。 + +部分マージJOINは、大きなテーブルを結合する際にメモリ使用量を最小化するよう最適化されており、JOIN速度が非常に遅い代償としてあります。これは特に、左テーブルの物理的な行順序がJOINキーのソート順と一致しない場合に顕著です。 + +グレースハッシュJOINは、3つのメモリ非依存のJOINアルゴリズムの中で最も柔軟であり、[grace_hash_join_initial_buckets](https://github.com/ClickHouse/ClickHouse/blob/23.5/src/Core/Settings.h#L759)設定を使用してメモリ使用量とJOIN速度を良好に制御できます。データ量に応じて、グレースハッシュが部分マージアルゴリズムよりも速いまたは遅い場合があります。両方のアルゴリズムのメモリ使用量がほぼ一致するように選択されたバケツ数の場合です。メモリ使用量が完全ソートマージとほぼ一致するようにグレースハッシュJOINのメモリ使用量を構成すると、完全ソートマージがテストランでは常に速かったです。 + +メモリ非依存の3つのアルゴリズムのうち、どれが最速かは、データの量、データ型、JOINキーの値の分布に依存します。現実的なデータ量で現実的なデータを使用してベンチマークを行い、どのアルゴリズムが最速かを判断するのが最良です。 + +## メモリの最適化 + +JOINを最速ではなく最も低いメモリ使用量で最適化したい場合は、代わりに以下の意思決定ツリーを使用できます: + +
+ +NEEDS ALT + +
+ +- **(1)** テーブルの物理的な行順序がJOINキーのソート順に一致する場合、**フルソートマージJOIN**のメモリ使用量は、これ以上低くはなりません。加えて、ソートフェーズが[無効](https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3#utilizing-physical-row-order)になっているため、良好なJOIN速度の利点があります。 +- **(2)** **グレースハッシュJOIN**は[JOIN速度](https://github.com/ClickHouse/ClickHouse/blob/23.5/src/Core/Settings.h#L759)の犠牲にして、高い[バケット数](https://clickhouse.com/blog/clickhouse-fully-supports-joins-hash-joins-part2#description-2)を構成することで、非常に低いメモリ使用に調整できます。**部分マージJOIN**は、意図的にメインメモリの使用を低くします。**フルソートマージJOIN**は、外部ソートが有効になっている場合は通常、部分マージJOINよりも多くのメモリを使用しますが、それにより大幅に良好なJOIN実行時間の利点があります。 + +上記の詳細についてさらなる情報が必要なユーザには、この[ブログシリーズ](https://clickhouse.com/blog/clickhouse-fully-supports-joins-part1)をお勧めします。 + diff --git a/docs/ja/guides/separation-storage-compute.md b/docs/ja/guides/separation-storage-compute.md new file mode 100644 index 00000000000..085807ce952 --- /dev/null +++ b/docs/ja/guides/separation-storage-compute.md @@ -0,0 +1,171 @@ +--- +sidebar_position: 1 +sidebar_label: ストレージとコンピュートの分離 +slug: /ja/guides/separation-storage-compute +--- +import BucketDetails from '@site/docs/ja/_snippets/_S3_authentication_and_bucket.md'; + +# ストレージとコンピュートの分離 + +## 概要 + +このガイドは、ClickHouseとS3を使用して、ストレージとコンピュートを分離したアーキテクチャを実装する方法を探ります。 + +ストレージとコンピュートの分離とは、コンピューティングリソースとストレージリソースを独立して管理することを意味します。ClickHouseでは、スケーラビリティ、コスト効率、柔軟性を向上させることができます。必要に応じてストレージとコンピュートリソースを別々にスケールし、パフォーマンスとコストを最適化できます。 + +ClickHouseにS3をバックエンドとして使用することは、特に「コールド」データのクエリパフォーマンスがあまり重要でないユースケースにおいて有用です。ClickHouseは`S3BackedMergeTree`を使用して、`MergeTree`エンジンのストレージとしてS3をサポートします。このテーブルエンジンは、S3のスケーラビリティとコストの利点を活用しながら、`MergeTree`エンジンのインサートとクエリのパフォーマンスを維持することができます。 + +ストレージとコンピュートの分離アーキテクチャの実装と管理は、標準のClickHouseデプロイと比較してより複雑であることに注意してください。このガイドで説明するように、セルフマネージド型のClickHouseはストレージとコンピュートの分離を可能にしますが、設定なしでこのアーキテクチャを使用できる[ClickHouse Cloud](https://clickhouse.com/cloud)の利用をお勧めします。これには[`SharedMergeTree`テーブルエンジン](/ja/cloud/reference/shared-merge-tree)を使用してください。 + +*このガイドは、ClickHouseバージョン22.8以上を使用していることを前提としています。* + +:::warning +AWS/GCSライフサイクルポリシーを設定しないでください。これはサポートされておらず、テーブルが破損する可能性があります。 +::: + +## 1. ClickHouseディスクとしてS3を使用する + +### ディスクの作成 + +ストレージ構成を保存するためにClickHouseの`config.d`ディレクトリに新しいファイルを作成します: + +```bash +vim /etc/clickhouse-server/config.d/storage_config.xml +``` + +次のXMLを新しく作成したファイルにコピーし、データを保存したいAWSのバケット詳細に応じて`BUCKET`、`ACCESS_KEY_ID`、`SECRET_ACCESS_KEY`を置き換えます: + +```xml + + + + + s3 + $BUCKET + $ACCESS_KEY_ID + $SECRET_ACCESS_KEY + /var/lib/clickhouse/disks/s3_disk/ + + + cache + s3_disk + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+``` + +S3ディスクの設定をさらに詳細に指定する必要がある場合、例えば`region`を指定したりカスタムHTTP`header`を送信したりする必要がある場合は、関連する設定の一覧を[こちら](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)で確認できます。 + +また、`access_key_id`と`secret_access_key`を以下に置き換えることで、環境変数やAmazon EC2メタデータから資格情報を取得しようとすることもできます: + +```bash +true +``` + +設定ファイルを作成した後、ファイルの所有者をclickhouseユーザーとグループに更新する必要があります: + +```bash +chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml +``` + +クリックハウスサーバーを再起動して変更を適用することができます: + +```bash +service clickhouse-server restart +``` + +## 2. S3をバックエンドにしたテーブルを作成 + +S3ディスクが正しく設定されていることをテストするために、テーブルを作成してクエリを試みます。 + +新しいS3ストレージポリシーを指定してテーブルを作成します: + +```sql +CREATE TABLE my_s3_table + ( + `id` UInt64, + `column1` String + ) +ENGINE = MergeTree +ORDER BY id +SETTINGS storage_policy = 's3_main'; +``` + +エンジンを`S3BackedMergeTree`として指定する必要がないことを注意してください。ClickHouseは、テーブルがストレージにS3を使用していると検出すると、エンジンタイプを内部的に自動で変換します。 + +テーブルが正しいポリシーで作成されたことを確認します: + +```sql +SHOW CREATE TABLE my_s3_table; +``` + +次の結果が表示されるはずです: + +```response +┌─statement──────────────────────────────────────────────────── +│ CREATE TABLE default.my_s3_table +( + `id` UInt64, + `column1` String +) +ENGINE = MergeTree +ORDER BY id +SETTINGS storage_policy = 's3_main', index_granularity = 8192 +└────────────────────────────────────────────────────────────── +``` + +新しいテーブルに行を挿入しましょう: + +```sql +INSERT INTO my_s3_table (id, column1) + VALUES (1, 'abc'), (2, 'xyz'); +``` + +行が挿入されたことを確認しましょう: + +```sql +SELECT * FROM my_s3_table; +``` + +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +│ 2 │ xyz │ +└────┴─────────┘ + +2 rows in set. Elapsed: 0.284 sec. +``` + +AWSコンソールにて、データがS3に正常に挿入された場合、指定されたバケットにClickHouseが新しいファイルを作成したことが確認できるはずです。 + +すべてが正常に動作した場合、ストレージとコンピュートが分離された状態でClickHouseを使用していることになります! + +![コンピュートとストレージの分離を使ったS3バケットの例](./images/s3_bucket_example.png) + +## 3. フォールトトレランスのためのレプリケーションの実装 (オプション) + +:::warning +AWS/GCSライフサイクルポリシーを設定しないでください。これはサポートされておらず、テーブルが破損する可能性があります。 +::: + +フォールトトレランスを確保するために、複数のAWSリージョンに分散された複数のClickHouseサーバーノードと、それぞれのノードに対するS3バケットを使用することができます。 + +S3ディスクを用いたレプリケーションは、`ReplicatedMergeTree`テーブルエンジンを使用することで実現できます。詳細は次のガイドを参照してください: +- [S3オブジェクトストレージを使用した2つのAWSリージョン間での単一シャードのレプリケーション](/ja/integrations/s3#s3-multi-region). + +## 参考文献 + +- [SharedMergeTreeテーブルエンジン](/ja/cloud/reference/shared-merge-tree) +- [SharedMergeTree発表ブログ](https://clickhouse.com/blog/clickhouse-cloud-boosts-performance-with-sharedmergetree-and-lightweight-updates) diff --git a/docs/ja/guides/sizing-and-hardware-recommendations.md b/docs/ja/guides/sizing-and-hardware-recommendations.md new file mode 100644 index 00000000000..c34fb069173 --- /dev/null +++ b/docs/ja/guides/sizing-and-hardware-recommendations.md @@ -0,0 +1,223 @@ +--- +slug: /ja/guides/sizing-and-hardware-recommendations +sidebar_label: サイズおよびハードウェアの推奨事項 +sidebar_position: 4 +--- + +# サイズおよびハードウェアの推奨事項 + +このガイドでは、オープンソースユーザー向けのハードウェア、コンピュート、メモリ、およびディスク構成に関する一般的な推奨事項について説明します。セットアップを簡略化したい場合は、[ClickHouse Cloud](https://clickhouse.com/cloud) の使用をお勧めします。これは、インフラ管理に関連するコストを最小限に抑えつつ、ワークロードに自動的に対応し、スケールします。 + +ClickHouse クラスターの構成は、お客様のアプリケーションのユースケースやワークロードパターンによって大きく異なります。アーキテクチャを計画する際には、以下の要因を考慮する必要があります。 + +- 同時実行性(リクエスト数/秒) +- スループット(処理される行数/秒) +- データ量 +- データ保持ポリシー +- ハードウェアコスト +- メンテナンスコスト + +## ディスク + +ClickHouse で使用するディスクの種類は、データ量、レイテンシー、スループットの要件によって異なります。 + +### パフォーマンスを最適化する + +パフォーマンスを最大化するために、[AWS のプロビジョンドIOPS SSDボリューム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/provisioned-iops.html) またはクラウドプロバイダーの同等の提供を直接接続することをお勧めします。これはIOを最適化します。 + +### ストレージコストを最適化する + +コストを抑えるために、[汎用SSD EBSボリューム](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/general-purpose.html)を使用できます。また、[ホット/ウォーム/コールドアーキテクチャ](/ja/guides/developer/ttl#implementing-a-hotwarmcold-architecture)を使用してSSDとHDDを組み合わせた階層型ストレージを実装することもできます。また、ストレージを分離するために[AWS S3](https://aws.amazon.com/s3/)を使用することも可能です。コンピュートとストレージの分離でオープンソースのClickHouseを使用するためのガイドは[こちら](/ja/guides/separation-storage-compute)をご覧ください。ClickHouse Cloud ではデフォルトでコンピュートとストレージの分離が利用可能です。 + +## CPU + +### どの CPU を使用すべきか? + +使用する CPU の種類は、使用パターンに依存します。ただし、一般的に、多くの頻繁な同時実行クエリを処理し、より多くのデータを処理する、または計算集約的な UDF を使用するアプリケーションは、より多くの CPU コアを必要とします。 + +**低レイテンシまたは顧客向けアプリケーション** + +顧客向けワークロードのように10ミリ秒単位の低レイテンシ要件に対しては、AWS の [i3 ライン](https://aws.amazon.com/ec2/instance-types/i3/) または [i4i ライン](https://aws.amazon.com/ec2/instance-types/i4i/) またはクラウドプロバイダーの同等のIO最適化された提供をお勧めします。 + +**高同時実行性アプリケーション** + +同時実行性を最適化する必要があるワークロード(1秒あたり100以上のクエリ)に対しては、AWS の[計算最適化されたCシリーズ](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized) またはクラウドプロバイダーの同等の提供をお勧めします。 + +**データウェアハウジングユースケース** + +データウェアハウジングワークロードやアドホック分析クエリに対しては、AWS の [Rタイプシリーズ](https://aws.amazon.com/ec2/instance-types/#Memory_Optimized) 又はクラウドプロバイダーのメモリ最適化された提供をお勧めします。 + +--- + +### CPU 利用率はどの程度にすべきか? + +ClickHouse に標準的な CPU 利用率の目標はありません。[iostat](https://linux.die.net/man/1/iostat) などのツールを利用して平均の CPU 使用率を測定し、予期しないトラフィックの急増を管理できるようにサーバーのサイズを調整します。ただし、アドホッククエリを伴う分析またはデータウェアハウジングユースケースの場合、10-20% の CPU 利用率を目標とすべきです。 + +### 何 CPU コア使うべきか? + +使用する CPU 数はワークロードに依存します。しかし、一般的に、CPU の種類に基づいて以下のメモリ対 CPU コア比を推奨します。 + +- **[Mタイプ](https://aws.amazon.com/ec2/instance-types/)(一般的な利用ケース):** メモリ対 CPU コア比 4:1 +- **[Rタイプ](https://aws.amazon.com/ec2/instance-types/#Memory_Optimized)(データウェアハウジングユースケース):** メモリ対 CPU コア比 8:1 +- **[Cタイプ](https://aws.amazon.com/ec2/instance-types/#Compute_Optimized)(計算最適化ユースケース):** メモリ対 CPU コア比 2:1 + +具体例として、Mタイプの CPU を使用する場合は、25 CPU コアあたり 100GB のメモリをプロビジョニングすることをお勧めします。適切なメモリ量を決定するには、メモリ使用量をプロファイリングする必要があります。[メモリ問題のデバッグに関するガイド](https://clickhouse.com/docs/ja/guides/developer/debugging-memory-issues)を読むか、[組み込みのオブザーバビリティダッシュボード](https://clickhouse.com/docs/ja/operations/monitoring)を使用して ClickHouse を監視できます。 + +## メモリ + +CPU の選択と同様に、ストレージ対メモリの比率やメモリ対 CPU の比率の選択はユースケースに依存します。ただし、一般的にはメモリが多いほどクエリは高速になります。価格に敏感なユースケースの場合、低メモリ量でも動作しますが、設定を有効にすることができます([max_bytes_before_external_group_by](/ja/operations/settings/query-complexity#settings-max_bytes_before_external_group_by) や [max_bytes_before_external_sort](/ja/operations/settings/query-complexity#settings-max_bytes_before_external_sort))。これによりデータをディスクにスピルすることが許可されますが、クエリパフォーマンスに大きな影響を与える可能性があります。 + +### メモリ対ストレージ比はどの程度にすべきか? + +低データ量の場合、1:1 のメモリ対ストレージ比が許容されますが、合計メモリは8GB未満にしてはいけません。 + +長期間のデータ保持や高データ量のユースケースの場合、1:100 から 1:130 のメモリ対ストレージ比を推奨します。例えば、10TB のデータを保存している場合、レプリカあたり 100GB の RAM が良い例です。 + +顧客向けワークロードのように頻繁にアクセスされるユースケースには、より多くのメモリを使用し、1:30 から 1:50 のメモリ対ストレージ比を推奨します。 + +## レプリカ + +各シャードに少なくとも3つのレプリカを持つことを推奨します(または [Amazon EBS](https://aws.amazon.com/ebs/) を使用した 2 つのレプリカ)。さらに、追加のレプリカを追加する前にすべてのレプリカを垂直スケーリングすることを提案します(水平スケーリング)。 + +ClickHouse は自動的にシャーディングを行わないため、データセットの再シャーディングには多大なコンピューティングリソースが必要になります。したがって、将来的にデータを再シャーディングする必要を避けるため、可能な限り大きなサーバーを使用することを一般的に推奨します。 + +[ClickHouse Cloud](https://clickhouse.com/cloud) を使用することを検討してください。これは自動的にスケールし、ユースケースに合わせてレプリカの数を簡単に制御できます。 + +## 大規模ワークロードの例示的な構成 + +ClickHouse の構成は、特定のアプリケーションの要件に大きく依存します。コストとパフォーマンスを最適化するための支援を希望される場合は、[営業までお問い合わせください](https://clickhouse.com/company/contact?loc=docs-sizing-and-hardware-recommendations)。 + +ガイダンス(推奨ではありません)を提供するために、以下は本番環境での ClickHouse ユーザーの例示的な構成です。 + +### Fortune 500 B2B SaaS + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ストレージ
月間新規データ量30TB
総ストレージ(圧縮)540TB
データ保持18ヶ月
ノードあたりのディスク25TB
CPU
同時実行性200以上の同時クエリ
レプリカ数(HAペアを含む)44
ノードあたりの vCPU62
総 vCPU2700
メモリ
総 RAM11TB
レプリカあたりの RAM256GB
RAM 対 vCPU 比率4:1
RAM 対ディスク比率1:50
+ +### Fortune 500 テレコムオペレーターのログユースケース + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ストレージ
月間ログデータ量4860TB
総ストレージ(圧縮)608TB
データ保持30日
ノードあたりのディスク13TB
CPU
レプリカ数(HAペアを含む)38
ノードあたりの vCPU42
総 vCPU1600
メモリ
総 RAM10TB
レプリカあたりの RAM256GB
RAM 対 vCPU 比率6:1
RAM 対ディスク比率1:60
+ +## さらなる読み物 + +以下は、オープンソースの ClickHouse を使用する企業のアーキテクチャに関するブログ記事です。 + +- [Cloudflare](https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/?utm_source=linkedin&utm_medium=social&utm_campaign=blog) +- [eBay](https://innovation.ebayinc.com/tech/engineering/ou-online-analytical-processing/) +- [GitLab](https://handbook.gitlab.com/handbook/engineering/development/ops/monitor/observability/#clickhouse-datastore) +- [Lyft](https://eng.lyft.com/druid-deprecation-and-clickhouse-adoption-at-lyft-120af37651fd) +- [MessageBird](https://clickhouse.com/blog/how-messagebird-uses-clickhouse-to-monitor-the-delivery-of-billions-of-messages) +- [Microsoft](https://clickhouse.com/blog/self-service-data-analytics-for-microsofts-biggest-web-properties) +- [Uber](https://www.uber.com/en-ES/blog/logging/) +- [Zomato](https://blog.zomato.com/building-a-cost-effective-logging-platform-using-clickhouse-for-petabyte-scale) diff --git a/docs/ja/guides/sre/_category_.yml b/docs/ja/guides/sre/_category_.yml new file mode 100644 index 00000000000..6804e31fe37 --- /dev/null +++ b/docs/ja/guides/sre/_category_.yml @@ -0,0 +1,8 @@ +position: 5 +label: 'SRE Guides' +collapsible: true +collapsed: true +link: + type: generated-index + title: SRE Guides + slug: /ja/guides/sre diff --git a/docs/ja/guides/sre/configuring-ssl.md b/docs/ja/guides/sre/configuring-ssl.md new file mode 100644 index 00000000000..d0304f4d08e --- /dev/null +++ b/docs/ja/guides/sre/configuring-ssl.md @@ -0,0 +1,502 @@ +--- +slug: /ja/guides/sre/configuring-ssl +sidebar_label: SSL-TLSの設定 +sidebar_position: 20 +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + +# SSL-TLSの設定 + + + +このガイドでは、ClickHouseをOpenSSL証明書を使用して接続を検証するための簡単で最小限の設定を提供します。このデモンストレーションでは、自己署名の証明局 (CA) 証明書とキーを作成し、適切な設定でノード証明書を使用して接続を行います。 + +:::note +TLSの実装は複雑であり、完全に安全で堅牢なデプロイメントを確保するためには多くのオプションを考慮する必要があります。これは基本的なSSL/TLSの設定例を含むチュートリアルです。組織内で正しい証明書を生成するためにPKI/セキュリティチームに相談してください。 + +証明書の使用については、この[基本的なチュートリアル](https://ubuntu.com/server/docs/security-certificates)を参照してください。 +::: + +## 1. ClickHouse デプロイメントを作成する + +このガイドは、Ubuntu 20.04およびDEBパッケージ(aptを使用)を使用してインストールされたClickHouseを以下のホスト上で使用する形で書かれています。ドメインは `marsnet.local` です: + +|ホスト |IPアドレス| +|--------|-------------| +|chnode1 |192.168.1.221| +|chnode2 |192.168.1.222| +|chnode3 |192.168.1.223| + + +:::note +ClickHouseのインストール方法の詳細については、[クイックスタート](/docs/ja/getting-started/install.md)を参照してください。 +::: + + +## 2. SSL 証明書を作成する +:::note +自己署名証明書はデモンストレーション目的のみで使用され、実運用環境では使用しないでください。証明書要求は、組織によって署名され、設定で構成されるCAチェーンを使用して検証されるべきです。ただし、これらの手順は設定を構成およびテストするためのものであり、その後実際に使用される証明書に置き換えることができます。 +::: + +1. 新しいCAに使用するキーを生成します: + ```bash + openssl genrsa -out marsnet_ca.key 2048 + ``` + +2. 新しい自己署名CA証明書を生成します。以下のコマンドは、CAキーを使用して他の証明書を署名するために使用する新しい証明書を生成します: + ```bash + openssl req -x509 -subj "/CN=marsnet.local CA" -nodes -key marsnet_ca.key -days 1095 -out marsnet_ca.crt + ``` + + :::note + キーとCA証明書はクラスタ外の安全な場所にバックアップしてください。ノード証明書の生成後、キーはクラスタノードから削除してください。 + ::: + +3. 新しいCA証明書の内容を確認します: + ```bash + openssl x509 -in marsnet_ca.crt -text + ``` + +4. 各ノードに証明書要求 (CSR) とキーを生成します: + ```bash + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1" -addext "subjectAltName = DNS:chnode1.marsnet.local,IP:192.168.1.221" -keyout chnode1.key -out chnode1.csr + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode2" -addext "subjectAltName = DNS:chnode2.marsnet.local,IP:192.168.1.222" -keyout chnode2.key -out chnode2.csr + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode3" -addext "subjectAltName = DNS:chnode3.marsnet.local,IP:192.168.1.223" -keyout chnode3.key -out chnode3.csr + ``` + +5. CSRとCAを使用して新しい証明書とキーのペアを作成します: + ```bash + openssl x509 -req -in chnode1.csr -out chnode1.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy + openssl x509 -req -in chnode2.csr -out chnode2.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy + openssl x509 -req -in chnode3.csr -out chnode3.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 -copy_extensions copy + ``` + +6. サブジェクトと発行者が正しいことを確認します: + ```bash + openssl x509 -in chnode1.crt -text -noout + ``` + +7. 新しい証明書がCA証明書と検証されることを確認します: + ```bash + openssl verify -CAfile marsnet_ca.crt chnode1.crt + chnode1.crt: OK + ``` + +## 3. 証明書およびキーを保存するディレクトリを作成および構成する + +:::note +これは各ノードで行う必要があります。適切な証明書およびキーを各ホストで使用してください。 +::: + +1. 各ノードでClickHouseがアクセス可能なディレクトリにフォルダを作成します。デフォルトの構成ディレクトリ(例: `/etc/clickhouse-server`)を推奨します: + ```bash + mkdir /etc/clickhouse-server/certs + ``` + +2. 各ノードに対応するCA証明書、ノード証明書、およびキーを新しい証明書ディレクトリにコピーします。 + +3. ClickHouseが証明書を読み取れるように所有者とパーミッションを更新します: + ```bash + chown clickhouse:clickhouse -R /etc/clickhouse-server/certs + chmod 600 /etc/clickhouse-server/certs/* + chmod 755 /etc/clickhouse-server/certs + ll /etc/clickhouse-server/certs + ``` + + ```response + total 20 + drw-r--r-- 2 clickhouse clickhouse 4096 Apr 12 20:23 ./ + drwx------ 5 clickhouse clickhouse 4096 Apr 12 20:23 ../ + -rw------- 1 clickhouse clickhouse 997 Apr 12 20:22 chnode1.crt + -rw------- 1 clickhouse clickhouse 1708 Apr 12 20:22 chnode1.key + -rw------- 1 clickhouse clickhouse 1131 Apr 12 20:23 marsnet_ca.crt + ``` + +## 4. ClickHouse Keeperを使用して基本的なクラスタを持つ環境を構成する + +このデプロイメント環境では、以下のClickHouse Keeper 設定を各ノードで使用します。各サーバーには独自の `` が設定されます。(例: ノード `chnode1` には `1` など) + +:::note +ClickHouse Keeper推奨ポートは `9281` です。ただし、このポートがすでに環境内の他のアプリケーションによって使用されている場合は、ポートを変更できます。 + +すべてのオプションの詳細については、次を参照してください: https://clickhouse.com/docs/ja/operations/clickhouse-keeper/ +::: + + +1. 次の設定をClickHouseサーバーの `config.xml` の `` タグ内に追加します + + :::note + 本番環境には、`config.d` ディレクトリに別の `.xml` 設定ファイルを使用することを推奨します。 + 詳細については、https://clickhouse.com/docs/ja/operations/configuration-files/ を参照してください。 + ::: + + ```xml + + 9281 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + true + + 1 + chnode1.marsnet.local + 9444 + + + 2 + chnode2.marsnet.local + 9444 + + + 3 + chnode3.marsnet.local + 9444 + + + + ``` + +2. すべてのノードでkeeper設定をコメント解除し、`` フラグを1に設定します: + ```xml + + + chnode1.marsnet.local + 9281 + 1 + + + chnode2.marsnet.local + 9281 + 1 + + + chnode3.marsnet.local + 9281 + 1 + + + ``` + +3. 以下のクラスタ設定を `chnode1` と `chnode2` に更新して追加します。 `chnode3` はClickHouse Keeperのクォーラムに使用されます。 + + :::note + この構成では、1つのサンプルクラスタのみが設定されています。テストサンプルのクラスタは削除するかコメントアウトする必要があります、またはテストされている既存のクラスタが存在する場合、それに対応するポートを更新し、`` オプションを追加する必要があります。また、`users.xml` ファイルやインストール時に `default` ユーザーにパスワードが設定されていた場合は、`` を設定する必要があります。 + ::: + + 以下の内容は、2つのサーバーに1つのシャードレプリカを持つクラスタを作成します。 + ```xml + + + + + chnode1.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + chnode2.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + + + ``` + +4. ReplicatedMergeTreeテーブルをテストするためにマクロ値を定義します。 `chnode1` では: + ```xml + + 1 + replica_1 + + ``` + + `chnode2` では: + ```xml + + 1 + replica_2 + + ``` + +## 5. ClickHouse ノード上でSSL-TLSインターフェースを設定する +以下の設定は、ClickHouseサーバーの `config.xml` に構成されています + +1. (オプション) デプロイメントの表示名を設定します: + ```xml + clickhouse + ``` + +2. ClickHouseが外部ポートでリッスンするように設定します: + ```xml + 0.0.0.0 + ``` + +3. 各ノードで `https` ポートを構成し、`http` ポートを無効にします: + ```xml + 8443 + + ``` + +4. 各ノードでClickHouse NativeのセキュアTCPポートを構成し、デフォルトの非セキュアポートを無効にします: + ```xml + 9440 + + ``` + +5. 各ノードで `interserver https` ポートを構成し、デフォルトの非セキュアポートを無効にします: + ```xml + 9010 + + ``` + +6. OpenSSLを証明書とパスで構成する + + :::note + 各ファイル名とパスは、設定されるノードに合わせて更新する必要があります。 + たとえば、`chnode2` ホストを構成する際には、`` エントリを `chnode2.crt` に更新します。 + ::: + + ```xml + + + /etc/clickhouse-server/certs/chnode1.crt + /etc/clickhouse-server/certs/chnode1.key + relaxed + /etc/clickhouse-server/certs/marsnet_ca.crt + true + sslv2,sslv3 + true + + + false + /etc/clickhouse-server/certs/marsnet_ca.crt + true + sslv2,sslv3 + true + relaxed + + RejectCertificateHandler + + + + ``` + + 詳細については、https://clickhouse.com/docs/ja/operations/server-configuration-parameters/settings/#server_configuration_parameters-openssl を参照してください。 + + + +7. 各ノードでSSL用にgRPCを設定する: + ```xml + + 1 + /etc/clickhouse-server/certs/chnode1.crt + /etc/clickhouse-server/certs/chnode1.key + true + /etc/clickhouse-server/certs/marsnet_ca.crt + none + 0 + -1 + -1 + false + + ``` + + 詳細については、https://clickhouse.com/docs/ja/interfaces/grpc/ を参照してください。 + +8. 少なくとも1つのノードで、接続をSSLで行うためにClickHouseクライアントを設定し、その自身の `config.xml`ファイルを使用して(デフォルトでは`/etc/clickhouse-client/`): + ```xml + + + false + /etc/clickhouse-server/certs/marsnet_ca.crt + true + sslv2,sslv3 + true + + RejectCertificateHandler + + + + ``` + +6. MySQLおよびPostgreSQLのデフォルトエミュレーションポートを無効にする: + ```xml + + + ``` + +## 6. テスト +1. 各ノード別に一度に起動します: + ```bash + service clickhouse-server start + ``` + +2. セキュアポートが起動し、リスニングしていることを確認します。各ノードでこの例のようになります: + ```bash + root@chnode1:/etc/clickhouse-server# netstat -ano | grep tcp + ``` + + ```response + tcp 0 0 0.0.0.0:9010 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:9440 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 0.0.0.0:9281 0.0.0.0:* LISTEN off (0.00/0/0) + tcp 0 0 192.168.1.221:33046 192.168.1.222:9444 ESTABLISHED off (0.00/0/0) + tcp 0 0 192.168.1.221:42730 192.168.1.223:9444 ESTABLISHED off (0.00/0/0) + tcp 0 0 192.168.1.221:51952 192.168.1.222:9281 ESTABLISHED off (0.00/0/0) + tcp 0 0 192.168.1.221:22 192.168.1.210:49801 ESTABLISHED keepalive (6618.05/0/0) + tcp 0 64 192.168.1.221:22 192.168.1.210:59195 ESTABLISHED on (0.24/0/0) + tcp6 0 0 :::22 :::* LISTEN off (0.00/0/0) + tcp6 0 0 :::9444 :::* LISTEN off (0.00/0/0) + tcp6 0 0 192.168.1.221:9444 192.168.1.222:59046 ESTABLISHED off (0.00/0/0) + tcp6 0 0 192.168.1.221:9444 192.168.1.223:41976 ESTABLISHED off (0.00/0/0) + ``` + + |ClickHouse ポート |説明| + |--------|-------------| + |8443 | https インターフェース| + |9010 | interserver https ポート| + |9281 | ClickHouse Keeper セキュアポート| + |9440 | セキュアNative TCPプロトコル| + |9444 | ClickHouse Keeper Raftポート | + +3. ClickHouse Keeperのヘルスを確認する +典型的な[4文字単語 (4lW)](/docs/ja/guides/sre/keeper/index.md#four-letter-word-commands) コマンドはTLSなしでは `echo` を使用して動作しません。ここでは、`openssl` を使用してコマンドを実行する方法を示します。 + - `openssl` でインタラクティブセッションを開始 + + ```bash + openssl s_client -connect chnode1.marsnet.local:9281 + ``` + ```response + CONNECTED(00000003) + depth=0 CN = chnode1 + verify error:num=20:unable to get local issuer certificate + verify return:1 + depth=0 CN = chnode1 + verify error:num=21:unable to verify the first certificate + verify return:1 + --- + Certificate chain + 0 s:CN = chnode1 + i:CN = marsnet.local CA + --- + Server certificate + -----BEGIN CERTIFICATE----- + MIICtDCCAZwCFD321grxU3G5pf6hjitf2u7vkusYMA0GCSqGSIb3DQEBCwUAMBsx + ... + ``` + + - opensslセッションで4LWコマンドを送信 + + ```bash + mntr + ``` + ```response + --- + Post-Handshake New Session Ticket arrived: + SSL-Session: + Protocol : TLSv1.3 + ... + read R BLOCK + zk_version v22.7.3.5-stable-e140b8b5f3a5b660b6b576747063fd040f583cf3 + zk_avg_latency 0 + # highlight-next-line + zk_max_latency 4087 + zk_min_latency 0 + zk_packets_received 4565774 + zk_packets_sent 4565773 + zk_num_alive_connections 2 + zk_outstanding_requests 0 + # highlight-next-line + zk_server_state leader + zk_znode_count 1087 + zk_watch_count 26 + zk_ephemerals_count 12 + zk_approximate_data_size 426062 + zk_key_arena_size 258048 + zk_latest_snapshot_size 0 + zk_open_file_descriptor_count 187 + zk_max_file_descriptor_count 18446744073709551615 + # highlight-next-line + zk_followers 2 + zk_synced_followers 1 + closed + ``` + +4. `--secure` フラグとSSLポートを使用してClickHouseクライアントを開始します: + ```bash + root@chnode1:/etc/clickhouse-server# clickhouse-client --user default --password ClickHouse123! --port 9440 --secure --host chnode1.marsnet.local + ClickHouse client version 22.3.3.44 (official build). + Connecting to chnode1.marsnet.local:9440 as user default. + Connected to ClickHouse server version 22.3.3 revision 54455. + + clickhouse :) + ``` + +5. `https` インターフェースを使用して `https://chnode1.marsnet.local:8443/play` でPlay UIにログインします。 + + ![Play UI](images/configuring-ssl_01.png) + + :::note + ワークステーションからアクセスしており、クライアントマシンのルートCAストアに証明書がない場合、ブラウザは不信召の証明書を表示します。 + 公共機関や企業CAから発行された証明書を使用している場合、信頼された状態で表示されるべきです。 + ::: + +6. レプリケートテーブルを作成します: + ```sql + clickhouse :) CREATE TABLE repl_table ON CLUSTER cluster_1S_2R + ( + id UInt64, + column1 Date, + column2 String + ) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/default/repl_table', '{replica}' ) + ORDER BY (id); + ``` + + ```response + ┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ + │ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ + │ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ + └───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ + ``` + +7. `chnode1` に2行追加します: + ```sql + INSERT INTO repl_table + (id, column1, column2) + VALUES + (1,'2022-04-01','abc'), + (2,'2022-04-02','def'); + ``` + +8. `chnode2` で行を閲覧することによってレプリケーションを確認します: + ```sql + SELECT * FROM repl_table + ``` + + ```response + ┌─id─┬────column1─┬─column2─┐ + │ 1 │ 2022-04-01 │ abc │ + │ 2 │ 2022-04-02 │ def │ + └────┴────────────┴─────────┘ + ``` + +## まとめ + +この記事は、ClickHouse環境がSSL/TLSで構成されるようにすることに焦点を当てています。生産環境の異なる要件に応じて設定は異なる場合があります(たとえば、証明書の検証レベル、プロトコル、暗号など)。しかし、セキュアな接続を構成し実施するために必要な手順を理解することができたはずです。 diff --git a/docs/ja/guides/sre/images/configuring-ssl_01.png b/docs/ja/guides/sre/images/configuring-ssl_01.png new file mode 100644 index 00000000000..89872675f12 Binary files /dev/null and b/docs/ja/guides/sre/images/configuring-ssl_01.png differ diff --git a/docs/ja/guides/sre/keeper/_category_.yml b/docs/ja/guides/sre/keeper/_category_.yml new file mode 100644 index 00000000000..9349d42f22e --- /dev/null +++ b/docs/ja/guides/sre/keeper/_category_.yml @@ -0,0 +1,8 @@ +position: 5 +label: 'ClickHouse Keeper' +collapsible: true +collapsed: true +link: + type: generated-index + title: ClickHouse Keeper + slug: /ja/guides/sre/clickhouse-keeper diff --git a/docs/ja/guides/sre/keeper/index.md b/docs/ja/guides/sre/keeper/index.md new file mode 100644 index 00000000000..c64ba889be3 --- /dev/null +++ b/docs/ja/guides/sre/keeper/index.md @@ -0,0 +1,1295 @@ +--- +slug: /ja/guides/sre/keeper/clickhouse-keeper + +sidebar_label: ClickHouse Keeperの設定 +sidebar_position: 10 +keywords: + - Keeper + - ZooKeeper + - clickhouse-keeper + - レプリケーション +description: ClickHouse Keeperまたはclickhouse-keeperは、ZooKeeperを置き換えるもので、レプリケーションと調整を提供します。 +--- + +# ClickHouse Keeper (clickhouse-keeper) + +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_automated.md'; + + + +ClickHouse Keeperは、データの[レプリケーション](/docs/ja/engines/table-engines/mergetree-family/replication.md)と[分散DDL](/docs/ja/sql-reference/distributed-ddl.md)クエリの実行を調整するシステムを提供します。ClickHouse KeeperはZooKeeperと互換性があります。 + +### 実装の詳細 {#implementation-details} + +ZooKeeperは、最初に知られるオープンソースの調整システムの1つです。Javaで実装されており、非常にシンプルで強力なデータモデルを持っています。ZooKeeperの調整アルゴリズム、ZooKeeper Atomic Broadcast (ZAB)は、各ZooKeeperノードがローカルに読み取りを行うため、読み取りに対する線形化可能性保証を提供しません。ZooKeeperとは異なり、ClickHouse KeeperはC++で書かれており、[RAFTアルゴリズム](https://raft.github.io/)の[実装](https://github.com/eBay/NuRaft)を使用しています。このアルゴリズムは読み書きに対する線形化可能性を許可し、さまざまな言語でオープンソースの実装があります。 + +デフォルトでは、ClickHouse KeeperはZooKeeperと同じ保証を提供します:線形化可能な書き込みと非線形化可能な読み取りです。クライアントサーバープロトコルは互換性があるため、任意の標準的なZooKeeperクライアントを使用してClickHouse Keeperと対話できます。スナップショットとログはZooKeeperとは互換性のない形式ですが、`clickhouse-keeper-converter`ツールを使用してZooKeeperデータをClickHouse Keeperスナップショットに変換できます。ClickHouse KeeperのインターサーバープロトコルもZooKeeperと互換性がないため、ZooKeeper / ClickHouse Keeperの混合クラスターは不可能です。 + +ClickHouse Keeperは、[ZooKeeper](https://zookeeper.apache.org/doc/r3.1.2/zookeeperProgrammers.html#sc_ZooKeeperAccessControl)と同じ方法でアクセス制御リスト(ACL)をサポートします。ClickHouse Keeperは、同じ権限セットをサポートし、`world`、`auth`、および`digest`の同一の組み込みスキームを持っています。ダイジェスト認証スキームは`username:password`ペアを使用し、パスワードはBase64でエンコードされます。 + +:::note +外部統合はサポートされていません。 +::: + +### 設定 {#configuration} + +ClickHouse Keeperは、ZooKeeperのスタンドアロンの代替品として、またはClickHouseサーバーの内部の一部として使用できます。いずれの場合も、設定はほぼ同じ`.xml`ファイルです。 + +#### Keeperの設定項目 + +ClickHouse Keeperの主な設定タグは``で、以下のパラメータがあります: + +| パラメータ | 説明 | デフォルト | +|--------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------| +| `tcp_port` | クライアントが接続するためのポート。 | `2181` | +| `tcp_port_secure` | クライアントとkeeperサーバー間のSSL接続のためのセキュアポート。 | - | +| `server_id` | ユニークなサーバーID。ClickHouse Keeperクラスターの各参加者は、1, 2, 3といったユニークな番号を持たなければなりません。 | - | +| `log_storage_path` | 調整ログの保存パス。ZooKeeperと同様に、ログはビジーでないノードに保存するのが最適です。 | - | +| `snapshot_storage_path` | 調整スナップショットの保存パス。 | - | +| `enable_reconfiguration` | [`reconfig`](#reconfiguration)を介した動的クラスター再設定を有効にします。 | `False` | +| `max_memory_usage_soft_limit` | Keeperの最大メモリ使用量のソフト制限(バイト単位)。 | `max_memory_usage_soft_limit_ratio` * `physical_memory_amount` | +| `max_memory_usage_soft_limit_ratio` | `max_memory_usage_soft_limit`が設定されていないか0に設定されている場合、この値を使用してデフォルトソフト制限を定義します。 | `0.9` | +| `cgroups_memory_observer_wait_time` | `max_memory_usage_soft_limit`が設定されていないか0に設定されている場合、物理メモリ量を監視するための間隔。このメモリ量が変化すると、`max_memory_usage_soft_limit_ratio`によってKeeperのメモリソフト制限を再計算します。 | `15` | +| `http_control` | [HTTP control](#http-control)インターフェイスの設定。 | - | +| `digest_enabled` | リアルタイムデータ整合性チェックを有効にします。 | `True` | +| `create_snapshot_on_exit` | シャットダウン時にスナップショットを作成します。 | - | +| `hostname_checks_enabled` | クラスター設定のためのホスト名チェックを有効にします(例:リモートエンドポイントと一緒にlocalhostが使用されている場合)。 | `True` | + +他の一般的なパラメータは、ClickHouseサーバーの設定(`listen_host`、`logger`など)から継承されます。 + +#### 内部調整設定 + +内部の調整設定は、`.`セクションにあり、以下のパラメータがあります: + +| パラメータ | 説明 | デフォルト | +|--------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------| +| `operation_timeout_ms` | 単一クライアント操作のタイムアウト(ms)。 | `10000` | +| `min_session_timeout_ms` | クライアントセッションの最小タイムアウト(ms)。 | `10000` | +| `session_timeout_ms` | クライアントセッションの最大タイムアウト(ms)。 | `100000` | +| `dead_session_check_period_ms` | ClickHouse Keeperがデッドセッションをチェックし削除する頻度(ms)。 | `500` | +| `heart_beat_interval_ms` | ClickHouse Keeperリーダーがフォロワーにハートビートを送信する頻度(ms)。 | `500` | +| `election_timeout_lower_bound_ms` | フォロワーがこの間隔内にリーダーからハートビートを受信しない場合、フォロワーはリーダー選挙を開始できます。`election_timeout_upper_bound_ms`より小さくまたは等しくなければなりません。理想的には等しくない方が良いです。 | `1000` | +| `election_timeout_upper_bound_ms` | フォロワーがこの間隔内にリーダーからハートビートを受信しない場合、リーダー選挙を開始しなければなりません。 | `2000` | +| `rotate_log_storage_interval` | 単一ファイルに保存するログレコードの数。 | `100000` | +| `reserved_log_items` | コンパクション前に保存する調整ログレコードの数。 | `100000` | +| `snapshot_distance` | ClickHouse Keeperが新しいスナップショットを作成する頻度(ログ内のレコード数で)。 | `100000` | +| `snapshots_to_keep` | 保持するスナップショットの数。 | `3` | +| `stale_log_gap` | リーダーがフォロワーを古くなったと見なしてスナップショットを送信する代わりにログを送信するしきい値。 | `10000` | +| `fresh_log_gap` | ノードが新しくなったとき。 | `200` | +| `max_requests_batch_size` | RAFTに送信する前にリクエストのバッチでの最大サイズ(リクエスト数)。 | `100` | +| `force_sync` | 調整ログへの各書き込みで`fsync`を呼び出します。 | `true` | +| `quorum_reads` | 全体的なRAFTコンセンサスと同じスピードで読み取り要求を実行します。 | `false` | +| `raft_logs_level` | 調整に関するテキストログレベル(trace、debugなど)。 | `system default` | +| `auto_forwarding` | フォロワーからリーダーに書き込み要求を転送することを許可します。 | `true` | +| `shutdown_timeout` | 内部接続を終了してシャットダウンするまでの待機時間(ms)。 | `5000` | +| `startup_timeout` | サーバーが指定されたタイムアウト内に他のクォーラム参加者に接続しない場合、終了します(ms)。 | `30000` | +| `four_letter_word_white_list` | 4lwコマンドのホワイトリスト。 | `conf, cons, crst, envi, ruok, srst, srvr, stat, wchs, dirs, mntr, isro, rcvr, apiv, csnp, lgif, rqld, ydld` | +| `async_replication` | 非同期レプリケーションを有効にします。全ての書き込みと読み取りの保証が維持され、より良いパフォーマンスが達成されます。この設定は、後方互換性を破壊しないようにするためにデフォルトでは無効になっています。 | `false` | +| `latest_logs_cache_size_threshold` | 最新のログエントリのインメモリキャッシュの最大合計サイズ | `1GiB` | +| `commit_logs_cache_size_threshold` | 次にコミットのために必要なログエントリのインメモリキャッシュの最大合計サイズ | `500MiB` | +| `disk_move_retries_wait_ms` | ディスク間でファイルを移動している間に発生した失敗後、再試行までどれくらい待機するか | `1000` | +| `disk_move_retries_during_init` | 初期化中にディスク間でファイルを移動している間に発生した失敗後の再試行回数 | `100` | +| `experimental_use_rocksdb` | rocksdbをバックエンドストレージとして使用 | `0` | + +クォーラム設定は、`.`セクションにあり、サーバーの説明を含んでいます。 + +すべてのクォーラムに対する唯一のパラメータは`secure`で、クォーラム参加者間の通信の暗号化接続を有効にします。このパラメータは、ノード間の内部通信にSSL接続が必要な場合は `true` に設定できますが、それ以外の場合は指定しなくても構いません。 + +各``のメインパラメータは以下です: + +- `id` — クォーラム内のサーバー識別子。 +- `hostname` — このサーバーが配置されているホスト名。 +- `port` — サーバーが接続を受け付けるポート。 +- `can_become_leader` — サーバーを`learner`として設定するには`false`を設定します。省略すると値は`true`です。 + +:::note +ClickHouse Keeperクラスターのトポロジーが変更される場合(例:サーバーを置き換える場合)、`server_id`から`hostname`へのマッピングを一貫して保持し、既存の`server_id`を他のサーバーに再利用したりしないようにしてください(例:ClickHouse Keeperのデプロイに自動化スクリプトを使用する場合)。 + +Keeperインスタンスのホストが変わる可能性がある場合は、生IPアドレスの代わりにホスト名を定義して使用することをお勧めします。ホスト名を変更することは、サーバーを削除して再追加するのと同等で、場合によっては不可能な場合があります(例:クォーラム用のKeeperインスタンスが十分でない場合)。 +::: + +:::note +`async_replication`は後方互換性を破壊しないようにするため、デフォルトでは無効になっています。クラスター内の全てのKeeperインスタンスが`async_replication`をサポートするバージョン(v23.9+)を実行している場合、この設定を有効にすることをお勧めします。パフォーマンスを向上させることができ、デメリットはありません。 +::: + +3ノードのクォーラムの設定例は、[インテグレーションテスト](https://github.com/ClickHouse/ClickHouse/tree/master/tests/integration)で`test_keeper_`接頭辞付きで見つけることができます。サーバー#1の設定例: + +```xml + + 2181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + trace + + + + + 1 + zoo1 + 9234 + + + 2 + zoo2 + 9234 + + + 3 + zoo3 + 9234 + + + +``` + +### 実行方法 {#how-to-run} + +ClickHouse KeeperはClickHouseサーバーパッケージにバンドルされており、``の設定をあなたの`/etc/your_path_to_config/clickhouse-server/config.xml`に追加し、通常通りClickHouseサーバーを開始します。スタンドアロンのClickHouse Keeperを実行したい場合は、次のようにして開始できます: + +```bash +clickhouse-keeper --config /etc/your_path_to_config/config.xml +``` + +シンボリックリンク(`clickhouse-keeper`)を持たない場合は、それを作成するか`clickhouse`への引数として`keeper`を指定できます: + +```bash +clickhouse keeper --config /etc/your_path_to_config/config.xml +``` + +### 4文字コマンド {#four-letter-word-commands} + +ClickHouse Keeperは、ZooKeeperとほぼ同じ4文字コマンド(4lw)を提供します。各コマンドは`mntr`、`stat`などの4文字で構成されています。興味深いコマンドのいくつかを紹介すると、`stat`はサーバーと接続されたクライアントに関する一般情報を提供し、`srvr`と`cons`はそれぞれサーバーと接続に関する詳細を提供します。 + +4lwコマンドのホワイトリスト設定`four_letter_word_white_list`は、デフォルトで`conf,cons,crst,envi,ruok,srst,srvr,stat,wchs,dirs,mntr,isro,rcvr,apiv,csnp,lgif,rqld,ydld`です。 + +これらのコマンドをClickHouse Keeperに対してtelnetやncで発行できます。 + +``` +echo mntr | nc localhost 9181 +``` + +以下に4lwコマンドの詳細を示します: + +- `ruok`: サーバーがエラーステートなしで実行中であることをテストします。サーバーが実行中の場合`imok`で応答します。そうでない場合、まったく応答しません。サーバーが実行中であることを示す `imok` の応答は、サーバーがクォーラムに参加していることを必ずしも示しているわけではなく、単にサーバープロセスがアクティブで指定されたクライアントポートにバインドされていることを示しています。 + +``` +imok +``` + +- `mntr`: クラスターの健全性を監視するために使用できる変数のリストを出力します。 + +``` +zk_version v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +zk_avg_latency 0 +zk_max_latency 0 +zk_min_latency 0 +zk_packets_received 68 +zk_packets_sent 68 +zk_num_alive_connections 1 +zk_outstanding_requests 0 +zk_server_state leader +zk_znode_count 4 +zk_watch_count 1 +zk_ephemerals_count 0 +zk_approximate_data_size 723 +zk_open_file_descriptor_count 310 +zk_max_file_descriptor_count 10240 +zk_followers 0 +zk_synced_followers 0 +``` + +- `srvr`: サーバーの完全な詳細をリストします。 + +``` +ClickHouse Keeper version: v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +Latency min/avg/max: 0/0/0 +Received: 2 +Sent : 2 +Connections: 1 +Outstanding: 0 +Zxid: 34 +Mode: leader +Node count: 4 +``` + +- `stat`: サーバーと接続されたクライアントの簡単な詳細をリストします。 + +``` +ClickHouse Keeper version: v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +Clients: + 192.168.1.1:52852(recved=0,sent=0) + 192.168.1.1:52042(recved=24,sent=48) +Latency min/avg/max: 0/0/0 +Received: 4 +Sent : 4 +Connections: 1 +Outstanding: 0 +Zxid: 36 +Mode: leader +Node count: 4 +``` + +- `srst`: サーバーの統計をリセットします。このコマンドは`srvr`、`mntr`、および`stat`の結果に影響を与えます。 + +``` +Server stats reset. +``` + +- `conf`: 提供中の設定の詳細を表示します。 + +``` +server_id=1 +tcp_port=2181 +four_letter_word_white_list=* +log_storage_path=./coordination/logs +snapshot_storage_path=./coordination/snapshots +max_requests_batch_size=100 +session_timeout_ms=30000 +operation_timeout_ms=10000 +dead_session_check_period_ms=500 +heart_beat_interval_ms=500 +election_timeout_lower_bound_ms=1000 +election_timeout_upper_bound_ms=2000 +reserved_log_items=1000000000000000 +snapshot_distance=10000 +auto_forwarding=true +shutdown_timeout=5000 +startup_timeout=240000 +raft_logs_level=information +snapshots_to_keep=3 +rotate_log_storage_interval=100000 +stale_log_gap=10000 +fresh_log_gap=200 +max_requests_batch_size=100 +quorum_reads=false +force_sync=false +compress_logs=true +compress_snapshots_with_zstd_format=true +configuration_change_tries_count=20 +``` + +- `cons`: このサーバーに接続されているすべてのクライアントの完全な接続/セッションの詳細をリストします。受信/送信したパケット数、セッションID、操作レイテンシー、最後に実行された操作などの情報を含みます。 + +``` + 192.168.1.1:52163(recved=0,sent=0,sid=0xffffffffffffffff,lop=NA,est=1636454787393,to=30000,lzxid=0xffffffffffffffff,lresp=0,llat=0,minlat=0,avglat=0,maxlat=0) + 192.168.1.1:52042(recved=9,sent=18,sid=0x0000000000000001,lop=List,est=1636454739887,to=30000,lcxid=0x0000000000000005,lzxid=0x0000000000000005,lresp=1636454739892,llat=0,minlat=0,avglat=0,maxlat=0) +``` + +- `crst`: すべての接続に対する接続/セッション統計をリセットします。 + +``` +Connection stats reset. +``` + +- `envi`: サーバー環境の詳細を表示します。 + +``` +Environment: +clickhouse.keeper.version=v21.11.1.1-prestable-7a4a0b0edef0ad6e0aa662cd3b90c3f4acf796e7 +host.name=ZBMAC-C02D4054M.local +os.name=Darwin +os.arch=x86_64 +os.version=19.6.0 +cpu.count=12 +user.name=root +user.home=/Users/JackyWoo/ +user.dir=/Users/JackyWoo/project/jd/clickhouse/cmake-build-debug/programs/ +user.tmp=/var/folders/b4/smbq5mfj7578f2jzwn602tt40000gn/T/ +``` + +- `dirs`: スナップショットとログファイルの合計サイズをバイト単位で表示します。 + +``` +snapshot_dir_size: 0 +log_dir_size: 3875 +``` + +- `isro`: サーバーが読み取り専用モードで実行されているかをテストします。読み取り専用モードで`ro`、そうでない場合は`rw`で応答します。 + +``` +rw +``` + +- `wchs`: サーバーの監視に関する簡単な情報をリストします。 + +``` +1 connections watching 1 paths +Total watches:1 +``` + +- `wchc`: セッションごとに、サーバーの監視に関する詳細な情報をリストします。セッション(接続)のリストと関連する監視(パス)を出力します。注意として、監視数によっては、この操作は高負荷になる可能性があります(サーバーのパフォーマンスに影響を与える)、注意して使用してください。 + +``` +0x0000000000000001 + /clickhouse/task_queue/ddl +``` + +- `wchp`: サーバーのパスごとに、監視に関する詳細情報をリストします。パス(znodes)のリストと関連するセッションを出力します。注意として、監視数によっては、この操作は高負荷になる可能性があります(つまり、サーバーのパフォーマンスに影響を与える)、注意して使用してください。 + +``` +/clickhouse/task_queue/ddl + 0x0000000000000001 +``` + +- `dump`: 実行中のセッションと一時ノードをリストします。これはリーダーでのみ機能します。 + +``` +Sessions dump (2): +0x0000000000000001 +0x0000000000000002 +Sessions with Ephemerals (1): +0x0000000000000001 + /clickhouse/task_queue/ddl +``` + +- `csnp`: スナップショット作成タスクのスケジュールを設定します。成功した場合はスケジュールされたスナップショットの最後のコミットログインデックスを返し、失敗した場合は`Failed to schedule snapshot creation task.`を返します。`lgif`コマンドはスナップショットが完了したかどうかを判断するのに役立ちます。 + +``` +100 +``` + +- `lgif`: Keeperログの情報。`first_log_idx` : ログストア内の最初のログインデックス; `first_log_term` : 最初のログターム; `last_log_idx` : ログストア内の最後のログインデックス; `last_log_term` : 最後のログターム; `last_committed_log_idx` : 状態マシンで最後にコミットされたログインデックス; `leader_committed_log_idx` : 私の視点からのリーダーのコミットログインデックス; `target_committed_log_idx` : コミットされるべきターゲットログインデックス; `last_snapshot_idx` : 最後のスナップショットの最大コミットログインデックス。 + +``` +first_log_idx 1 +first_log_term 1 +last_log_idx 101 +last_log_term 1 +last_committed_log_idx 100 +leader_committed_log_idx 101 +target_committed_log_idx 101 +last_snapshot_idx 50 +``` + +- `rqld`: 新しいリーダーになるようにリクエストします。リーダーシップリクエストが送信された場合は`Sent leadership request to leader.`、送信されなかった場合は`Failed to send leadership request to leader.`を返します。ノードが既にリーダーであれば、結果はリクエストが送信されたのと同じです。 + +``` +Sent leadership request to leader. +``` + +- `ftfl`: Keeperインスタンスで有効になっているすべてのフィーチャーフラグをリストします。 + +``` +filtered_list 1 +multi_read 1 +check_not_exists 0 +``` +- `ydld`: リーダーシップを放棄し、フォロワーになるリクエストを送信します。リクエストを受け取ったサーバーがリーダーの場合、まず書き込み操作を一時停止し、後継者(現在のリーダーは後継者にはなれません)が最新のログのキャッチアップを終了するのを待ってから辞任します。後継者は自動的に選ばれます。リクエストが送信された場合は`リーダーへのリーダーシップ放棄リクエストを送信しました。`を返し、送信されなかった場合は`リーダーへのリーダーシップ放棄リクエストの送信に失敗しました。`を返します。ノードがすでにフォロワーである場合、結果はリクエストが送信された場合と同じです。 + +``` +リーダーへのリーダーシップ放棄リクエストを送信しました。 +``` + +- `pfev`: 収集されたすべてのイベントの値を返します。各イベントについてイベント名、イベント値、およびイベントの説明を返します。 + +``` +FileOpen 62 ファイルが開かれた回数。 +Seek 4 'lseek'関数が呼ばれた回数。 +ReadBufferFromFileDescriptorRead 126 ファイルディスクリプタからの読み取り(read/pread)の回数。ソケットは含まれません。 +ReadBufferFromFileDescriptorReadFailed 0 ファイルディスクリプタからの読み取り(read/pread)が失敗した回数。 +ReadBufferFromFileDescriptorReadBytes 178846 ファイルディスクリプタから読み取られたバイト数。ファイルが圧縮されている場合、これは圧縮データのサイズを示します。 +WriteBufferFromFileDescriptorWrite 7 ファイルディスクリプタへの書き込み(write/pwrite)の回数。ソケットは含まれません。 +WriteBufferFromFileDescriptorWriteFailed 0 ファイルディスクリプタへの書き込み(write/pwrite)が失敗した回数。 +WriteBufferFromFileDescriptorWriteBytes 153 ファイルディスクリプタに書き込まれたバイト数。ファイルが圧縮されている場合、これは圧縮データサイズを示します。 +FileSync 2 ファイルに対してF_FULLFSYNC/fsync/fdatasync関数が呼ばれた回数。 +DirectorySync 0 ディレクトリに対してF_FULLFSYNC/fsync/fdatasync関数が呼ばれた回数。 +FileSyncElapsedMicroseconds 12756 ファイルに対するF_FULLFSYNC/fsync/fdatasyncシステムコールを待って費やした合計時間。 +DirectorySyncElapsedMicroseconds 0 ディレクトリに対するF_FULLFSYNC/fsync/fdatasyncシステムコールを待って費やした合計時間。 +ReadCompressedBytes 0 圧縮ソース(ファイル、ネットワーク)から読み取ったバイト数(解凍前のバイト数)。 +CompressedReadBufferBlocks 0 圧縮ソース(ファイル、ネットワーク)から読み取った圧縮ブロック(各自で圧縮されるデータブロック)。 +CompressedReadBufferBytes 0 圧縮ソース(ファイル、ネットワーク)から読み取った非圧縮バイト数(解凍後のバイト数)。 +AIOWrite 0 LinuxまたはFreeBSDのAIOインターフェースによる書き込みの回数。 +AIOWriteBytes 0 LinuxまたはFreeBSDのAIOインターフェースで書き込まれたバイト数。 +... +``` + +### HTTP制御 {#http-control} + +ClickHouse Keeperは、レプリカがトラフィックを受信する準備ができているかどうかをチェックするためのHTTPインターフェイスを提供します。これは、[Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes)のようなクラウド環境で使用できます。 + +`/ready`エンドポイントを有効にする構成の例: + +```xml + + + + 9182 + + /ready + + + + +``` + +### フィーチャーフラグ + +KeeperはZooKeeperおよびそのクライアントと完全に互換性がありますが、ClickHouseクライアントで使用できるいくつかのユニークな機能やリクエストタイプも導入しています。これらの機能は後方互換性のない変更を引き起こす可能性があるため、そのほとんどはデフォルトで無効になっており、`keeper_server.feature_flags`設定を使用して有効にすることができます。すべての機能は明示的に無効にすることができます。Keeperクラスタに新しい機能を有効にしたい場合、まずクラスタ内のすべてのKeeperインスタンスを機能をサポートするバージョンに更新し、それから機能自体を有効にすることをお勧めします。 + +`multi_read`を無効にし、`check_not_exists`を有効にするフィーチャーフラグ設定の例: + +```xml + + + + 0 + 1 + + + +``` + +利用可能な機能は次の通りです: + +`multi_read` - マルチリードリクエストのサポート。デフォルト: `1` +`filtered_list` - ノードのタイプ(永続的またはエフェメラル)で結果をフィルターするリストリクエストのサポート。デフォルト: `1` +`check_not_exists` - ノードが存在しないことを確認する`CheckNotExists`リクエストのサポート。デフォルト: `0` +`create_if_not_exists` - ノードが存在しない場合に作成しようとする`CreateIfNotExists`リクエストのサポート。存在する場合、変更は適用されず`ZOK`が返されます。デフォルト: `0` + +### ZooKeeperからの移行 {#migration-from-zookeeper} + +ZooKeeperからClickHouse Keeperへのシームレスな移行は不可能です。ZooKeeperクラスタを停止し、データを変換してClickHouse Keeperを開始する必要があります。`clickhouse-keeper-converter`ツールはZooKeeperログとスナップショットをClickHouse Keeperのスナップショットに変換することを可能にします。これはZooKeeper > 3.4でのみ動作します。移行の手順: + +1. すべてのZooKeeperノードを停止します。 + +2. オプションですが推奨: ZooKeeperのリーダーノードを見つけ、それを開始して再度停止します。これにより、ZooKeeperが一貫したスナップショットを作成することを強制します。 + +3. リーダーで`clickhouse-keeper-converter`を実行します。例: + +```bash +clickhouse-keeper-converter --zookeeper-logs-dir /var/lib/zookeeper/version-2 --zookeeper-snapshots-dir /var/lib/zookeeper/version-2 --output-dir /path/to/clickhouse/keeper/snapshots +``` + +4. Keeperが構成されたClickHouseサーバーノードにスナップショットをコピーするか、ZooKeeperの代わりにClickHouse Keeperを開始します。スナップショットはすべてのノードで持続する必要があります。そうしないと、空のノードがより速くなり、リーダーになることがあります。 + +:::note +`keeper-converter`ツールはKeeper単独のバイナリからは利用できません。 +ClickHouseがインストールされている場合、バイナリを直接使用できます: + +```bash +clickhouse keeper-converter ... +``` + +それ以外の場合は、[バイナリをダウンロード](/docs/ja/getting-started/quick-start#1-download-the-binary)して上記のようにツールを実行することができます。ClickHouseをインストールせずに。 +::: + + +### クォーラム喪失後の復旧 + +ClickHouse KeeperはRaftを使用しているため、クラスタのサイズに応じて一定のノードのクラッシュを許容できます。 +たとえば、3ノードのクラスタの場合、1ノードがクラッシュした場合でも正しく動作し続けます。 + +クラスタの構成は動的に設定できますが、制限があります。再構成はRaftに依存しているため、クラスタからノードを追加または削除するにはクォーラムが必要です。クラスタ内の多くのノードを同時に失い、それらを再起動できなくなると、Raftは機能を停止し、従来の方法でクラスタを再構成できなくなります。 + +それにもかかわらず、ClickHouse Keeperにはリカバリーモードがあり、1つのノードだけで強制的にクラスタを再構成することができます。これは、ノードを再起動できない場合、または同じエンドポイントで新しいインスタンスを開始する場合だけを最後の手段として行うべきです。 + +続行する前に注意すべき重要なこと: +- 失敗したノードが再びクラスタに接続できないことを確認してください。 +- ステップで指定されていない限り、新しいノードを起動しないでください。 + +上記のことを確認した後、以下の手順を実行します: +1. Keeperノードの1つを新しいリーダーとして選択します。そのノードのデータがクラスタ全体に利用されることになるので、最新の状態を持つノードを使用することをお勧めします。 +2. 他の何かを行う前に、選択したノードの`log_storage_path`と`snapshot_storage_path`フォルダをバックアップします。 +3. 使用したいすべてのノードでクラスタを再構成します。 +4. 選択したノードに四文字コマンド`rcvr`を送り、ノードをリカバリモードに移行するか、選択したノードでKeeperインスタンスを停止し、`--force-recovery`引数で再起動します。 +5. 新しいノードでKeeperインスタンスを1つずつ開始し、次のノードを開始する前に`mntr`が`zk_server_state`で`follower`を返すことを確認します。 +6. リカバリモード中、リーダーノードはクォーラムを新しいノードと達成するまで`mntr`コマンドに対してエラーメッセージを返し、クライアントとフォロワーからのすべての要求を拒否します。 +7. クォーラムが達成されると、リーダーノードは通常モードに戻り、すべての要求を受け入れてRaftと共に確認されます。`mntr`で確認すると`zk_server_state`として`leader`が返されます。 + +## Keeperでディスクを使用する + +Keeperはスナップショット、ログファイル、および状態ファイルの保存に[外部ディスク](/docs/ja/operations/storing-data.md)のサブセットをサポートしています。 + +サポートされているディスクの種類は: +- s3_plain +- s3 +- local + +以下は、ディスク定義が含まれる設定の例です。 + +```xml + + + + + local + /var/lib/clickhouse/coordination/logs/ + + + s3_plain + https://some_s3_endpoint/logs/ + ACCESS_KEY + SECRET_KEY + + + local + /var/lib/clickhouse/coordination/snapshots/ + + + s3_plain + https://some_s3_endpoint/snapshots/ + ACCESS_KEY + SECRET_KEY + + + s3_plain + https://some_s3_endpoint/state/ + ACCESS_KEY + SECRET_KEY + + + + +``` + +ログ用のディスクを使用するには、`keeper_server.log_storage_disk`設定をディスク名に設定する必要があります。 +スナップショット用のディスクを使用するには、`keeper_server.snapshot_storage_disk`設定をディスク名に設定する必要があります。 +また、最新のログまたはスナップショット用に異なるディスクを使用することができます。これには、`keeper_server.latest_log_storage_disk`と`keeper_server.latest_snapshot_storage_disk`をそれぞれ使用します。 +この場合、新しいログやスナップショットが作成されるたびにKeeperは自動的にファイルを適切なディスクに移動します。 +状態ファイル用のディスクを使用するには、`keeper_server.state_storage_disk`設定をディスク名に設定する必要があります。 + +ディスク間のファイルの移動は安全で、転送の途中でKeeperが停止した場合でもデータを失うリスクはありません。 +ファイルが完全に新しいディスクに移動されるまで、元のディスクから削除されません。 + +Keeperで`keeper_server.coordination_settings.force_sync`が`true`に設定されている場合(一部のディスクタイプでは保証を満たすことができません。デフォルトではtrueです)。 +現在、`local`タイプのディスクのみが持続的な同期をサポートしています。 +`force_sync`が使用されている場合、`log_storage_disk`は`local`ディスクでなければなりません。`latest_log_storage_disk`が使用されていない場合。 +`latest_log_storage_disk`が使用されている場合、それは常に`local`ディスクでなければなりません。 +`force_sync`が無効の場合、すべてのタイプのディスクを任意のセットアップで使用できます。 + +Keeperインスタンスのストレージ設定例は次のようにすることができます: + +```xml + + + log_s3_plain + log_local + + snapshot_s3_plain + snapshot_local + + +``` + +このインスタンスは、最新でないログをすべて`log_s3_plain`ディスクに保存し、最新のログは`log_local`ディスクに保存します。 +スナップショットについても同様で、最新でないスナップショットは`snapshot_s3_plain`に保存され、最新のスナップショットは`snapshot_local`に保存されます。 + +### ディスク設定の変更 + +:::important +新しいディスク設定を適用する前に、すべてのKeeperログとスナップショットを手動でバックアップしてください。 +::: + +階層化ディスク設定が定義されている場合(最新のファイルに別々のディスクを使用する)、Keeperは起動時にファイルを正しいディスクに自動的に移動しようとします。 +以前と同じ保証が適用されます。ファイルが完全に新しいディスクに移動されるまで、元のディスクから削除されません。そのため、複数の再起動は安全に行うことができます。 + +ファイルを完全に新しいディスクに移動する必要がある場合(または2ディスク設定から1ディスク設定に移行する場合)、`keeper_server.old_snapshot_storage_disk`と`keeper_server.old_log_storage_disk`の複数の定義を使用できます。 + +次の設定は、以前の2ディスク設定から完全に新しい1ディスク設定に移行する方法を示しています: + +```xml + + + log_local + log_s3_plain + log_local2 + + snapshot_s3_plain + snapshot_local + snapshot_local2 + + +``` + +起動時に、すべてのログファイルは`log_local`と`log_s3_plain`から`log_local2`に移動されます。 +また、すべてのスナップショットファイルは`snapshot_local`と`snapshot_s3_plain`から`snapshot_local2`に移動されます。 + +## ログキャッシュの設定 + +ディスクから読み取るデータ量を最小限に抑えるために、Keeperはログエントリをメモリにキャッシュします。 +リクエストが大きい場合、ログエントリは多くのメモリを使用するため、キャッシュされるログの量に上限があります。 +上限は次の2つの設定で制御されます: +- `latest_logs_cache_size_threshold` - キャッシュに格納された最新のログの総サイズ +- `commit_logs_cache_size_threshold` - 次にコミットする必要がある一連のログの総サイズ + +デフォルト値が大きすぎる場合、これら2つの設定を減らしてメモリ使用量を減らすことができます。 + +:::note +各キャッシュおよびファイルから読み取られたログの量を確認するために`pfev`コマンドを使用できます。 +また、Prometheusエンドポイントからメトリクスを使用して、両方のキャッシュの現在のサイズを追跡することもできます。 +::: + + +## Prometheus + +KeeperはPrometheusからのスクレイピング用にメトリクス・データを公開することができます。 +設定は[ClickHouseと同じ方法で行われます。](/docs/ja/operations/server-configuration-parameters/settings#prometheus) + +## ClickHouse Keeperユーザーガイド + +このガイドは、ClickHouse Keeperを設定するためのシンプルで最小限の設定を提供し、分散操作をテストする方法の例を示します。この例は、Linux上で3つのノードを使用して実行されます。 + +### 1. ノードをKeeper設定で構成する + +1. 3つのClickHouseインスタンスを3つのホスト(chnode1、chnode2、chnode3)にインストールします。(ClickHouseのインストールに関する詳細は[クイックスタート](/docs/ja/getting-started/install.md)を参照してください。) + +2. 各ノードで、ネットワークインターフェイスを介した外部通信を許可するために、次のエントリを追加します。 + ```xml + 0.0.0.0 + ``` + +3. 次のClickHouse Keeper設定を3つのサーバーに追加し、各サーバーの``設定を更新します。例えば、`chnode1`は`1`、`chnode2`は`2`のように設定します。 + ```xml + + 9181 + 1 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + warning + + + + + 1 + chnode1.domain.com + 9234 + + + 2 + chnode2.domain.com + 9234 + + + 3 + chnode3.domain.com + 9234 + + + + ``` + + 以下は上記の基本設定です: + + |パラメータ |説明 |例 | + |----------|------------------------------|---------------------| + |tcp_port |keeperのクライアントが使用するポート|9181 デフォルトではzookeeperの2181相当| + |server_id| 各ClickHouse Keeperサーバーの識別子でraftの設定で使用されます| 1| + |coordination_settings| パラメータ(タイムアウト等)を設定するセクション| タイムアウト: 10000, ログレベル: trace| + |server |参加するサーバーの定義|各サーバーの定義リスト| + |raft_configuration| keeperクラスタ内の各サーバーの設定| 各サーバーと設定のリスト| + |id |keeperサービス用のサーバーの数値ID|1| + |hostname |keeperクラスタ内の各サーバーのホスト名、IP、またはFQDN|chnode1.domain.com| + |port|インターサーバーのkeeper接続をリッスンするポート|9234| + + +4. 組み込みのZooKeeperを有効にします。ClickHouse Keeperエンジンを使用します: + ```xml + + + chnode1.domain.com + 9181 + + + chnode2.domain.com + 9181 + + + chnode3.domain.com + 9181 + + + ``` + + 以下は上記の基本設定です: + + |パラメータ |説明 |例 | + |----------|------------------------------|---------------------| + |node |ClickHouse Keeper接続用のノードのリスト|各サーバーの設定エントリ| + |host|各ClickHouse Keeperノードのホスト名、IP、またはFQDN|chnode1.domain.com| + |port|ClickHouse Keeperのクライアントポート|9181| + +5. ClickHouseを再起動し、各Keeperインスタンスが実行されていることを確認します。各サーバーで次のコマンドを実行します。`ruok`コマンドはKeeperが実行中で正常である場合に`imok`を返します。 + ```bash + # echo ruok | nc localhost 9181; echo + imok + ``` + +6. `system`データベースには、ClickHouse Keeperインスタンスの詳細を含む`zookeeper`テーブルがあります。このテーブルを表示してみましょう: + ```sql + SELECT * + FROM system.zookeeper + WHERE path IN ('/', '/clickhouse') + ``` + + テーブルは次のようになります: + ```response + ┌─name───────┬─value─┬─czxid─┬─mzxid─┬───────────────ctime─┬───────────────mtime─┬─version─┬─cversion─┬─aversion─┬─ephemeralOwner─┬─dataLength─┬─numChildren─┬─pzxid─┬─path────────┐ + │ clickhouse │ │ 124 │ 124 │ 2022-03-07 00:49:34 │ 2022-03-07 00:49:34 │ 0 │ 2 │ 0 │ 0 │ 0 │ 2 │ 5693 │ / │ + │ task_queue │ │ 125 │ 125 │ 2022-03-07 00:49:34 │ 2022-03-07 00:49:34 │ 0 │ 1 │ 0 │ 0 │ 0 │ 1 │ 126 │ /clickhouse │ + │ tables │ │ 5693 │ 5693 │ 2022-03-07 00:49:34 │ 2022-03-07 00:49:34 │ 0 │ 3 │ 0 │ 0 │ 0 │ 3 │ 6461 │ /clickhouse │ + └────────────┴───────┴───────┴───────┴─────────────────────┴─────────────────────┴─────────┴──────────┴──────────┴────────────────┴────────────┴─────────────┴───────┴─────────────┘ + ``` + +### 2. ClickHouseにクラスタを設定する + +1. 2つのシャードと1つのレプリカで構成されるシンプルなクラスタを構成します。3番目のノードは、ClickHouse Keeperのクォーラム条件のために使用されます。`chnode1`と`chnode2`で設定を更新します。このクラスタは、各ノードに1つのシャードを配置し、合計2つのシャードを持ち、レプリケーションは行われません。この例では、データの一部が片方のノードにあり、残りがもう一方のノードにあります: + ```xml + + + + + chnode1.domain.com + 9000 + default + ClickHouse123! + + + + + chnode2.domain.com + 9000 + default + ClickHouse123! + + + + + ``` + + |パラメータ |説明 |例 | + |----------|------------------------------|---------------------| + |shard |クラスタ定義内のレプリカのリスト|各シャードのレプリカリスト| + |replica|各レプリカの設定のリスト|各レプリカの設定エントリ| + |host|レプリカシャードをホストするサーバーのホスト名、IPまたはFQDN|chnode1.domain.com| + |port|ネイティブTCPプロトコルを使った通信に使用するポート|9000| + |user|クラスタインスタンスに接続するために使用するユーザー名|default| + |password|クラスタインスタンスへの接続を許可するためのユーザインのパスワード|ClickHouse123!| + + +2. ClickHouseを再起動し、クラスタが作成されたことを確認します。 + ```bash + SHOW clusters; + ``` + + クラスタが表示されます: + ```response + ┌─cluster───────┐ + │ cluster_2S_1R │ + └───────────────┘ + ``` + +### 3. 分散テーブルの作成とテスト + +1. 新しいクラスタで新しいデータベースを作成します。`ON CLUSTER`句は、両方のノードでデータベースを自動的に作成します。 + ```sql + CREATE DATABASE db1 ON CLUSTER 'cluster_2S_1R'; + ``` + +2. `db1`データベースに新しいテーブルを作成します。再び、`ON CLUSTER`は両方のノードにテーブルを作成します。 + ```sql + CREATE TABLE db1.table1 on cluster 'cluster_2S_1R' + ( + `id` UInt64, + `column1` String + ) + ENGINE = MergeTree + ORDER BY column1 + ``` + +3. `chnode1`ノードにいくつかの行を追加します: + ```sql + INSERT INTO db1.table1 + (id, column1) + VALUES + (1, 'abc'), + (2, 'def') + ``` + +4. `chnode2`ノードにいくつかの行を追加します: + ```sql + INSERT INTO db1.table1 + (id, column1) + VALUES + (3, 'ghi'), + (4, 'jkl') + ``` + +5. 各ノードでの`SELECT`ステートメントの実行は、そのノードにあるデータのみを表示します。例えば、`chnode1`で: + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: 7ef1edbc-df25-462b-a9d4-3fe6f9cb0b6d + + ┌─id─┬─column1─┐ + │ 1 │ abc │ + │ 2 │ def │ + └────┴─────────┘ + + 2 rows in set. Elapsed: 0.006 sec. + ``` + + `chnode2`で: + ```sql + SELECT * + FROM db1.table1 + ``` + + ```response + Query id: c43763cc-c69c-4bcc-afbe-50e764adfcbf + + ┌─id─┬─column1─┐ + │ 3 │ ghi │ + │ 4 │ jkl │ + └────┴─────────┘ + ``` + +6. 2つのシャード上のデータを表すために`分散テーブル`を作成できます。`分散テーブル`エンジンを持つテーブルは、自身のデータを保存せず、複数のサーバーで分散クエリ処理を可能にします。読み取りはすべてのシャードに当たり、書き込みはシャード間で分散できます。`chnode1`で以下のクエリを実行します: + ```sql + CREATE TABLE db1.dist_table ( + id UInt64, + column1 String + ) + ENGINE = Distributed(cluster_2S_1R,db1,table1) + ``` + +7. `dist_table`をクエリすると、2つのシャードのデータがすべて4行返されることを確認します: + ```sql + SELECT * + FROM db1.dist_table + ``` + + ```response + Query id: 495bffa0-f849-4a0c-aeea-d7115a54747a + + ┌─id─┬─column1─┐ + │ 1 │ abc │ + │ 2 │ def │ + └────┴─────────┘ + ┌─id─┬─column1─┐ + │ 3 │ ghi │ + │ 4 │ jkl │ + └────┴─────────┘ + + 4 rows in set. Elapsed: 0.018 sec. + ``` + +### まとめ + +このガイドでは、ClickHouse Keeperを使用してクラスタを設定する方法を示しました。ClickHouse Keeperを使用すると、クラスターを構成し、シャード間でレプリケート可能な分散テーブルを定義できます。 + + +## ユニークなパスでClickHouse Keeperを設定する + + + +### 説明 + +この記事では、組み込みの`{uuid}`マクロ設定を使用して、ClickHouse KeeperまたはZooKeeperにユニークなエントリを作成する方法を説明します。ユニークなパスはテーブルを頻繁に作成および削除する場合に役立ちます。これは、パスが作成されるたびに新しい`uuid`がパスで使用され、パスが再利用されないため、Keeperガベージコレクションがパスエントリを削除するまで数分待つ必要がないからです。 + +### 環境例 +すべてのノードにClickHouse Keeperを持ち、ClickHouseを2ノードに持つように構成される3ノードクラスタ例。この設定により、ClickHouse Keeperには3ノード(タイブレーカーノードを含む)があり、1つのClickHouseシャードが2つのレプリカで構成されます。 + +|ノード|説明| +|-----|-----| +|chnode1.marsnet.local|データノード - cluster cluster_1S_2R| +|chnode2.marsnet.local|データノード - cluster cluster_1S_2R| +|chnode3.marsnet.local|ClickHouse Keeperタイブレーカーノード| + +クラスタの例設定: +```xml + + + + + chnode1.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + chnode2.marsnet.local + 9440 + default + ClickHouse123! + 1 + + + + +``` + +### {uuid}を使用するためのテーブル設定手順 +1. 各サーバーでマクロを設定します。サーバー1の例: +```xml + + 1 + replica_1 + +``` +:::note +`shard`と`replica`のマクロを定義することに注意してくださいが、`{uuid}`はここで定義されることはなく、それ自体で組み込まれているため、定義する必要はありません。 +::: + +2. データベースを作成する + +```sql +CREATE DATABASE db_uuid + ON CLUSTER 'cluster_1S_2R' + ENGINE Atomic; +``` + +```response +CREATE DATABASE db_uuid ON CLUSTER cluster_1S_2R +ENGINE = Atomic + +Query id: 07fb7e65-beb4-4c30-b3ef-bd303e5c42b5 + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +3. クラスタ上でマクロと`{uuid}`を使用してテーブルを作成する +```sql +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER 'cluster_1S_2R' + ( + id UInt64, + column1 String + ) + ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db_uuid/{uuid}', '{replica}' ) + ORDER BY (id); +``` + +```response +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db_uuid/{uuid}', '{replica}') +ORDER BY id + +Query id: 8f542664-4548-4a02-bd2a-6f2c973d0dc4 + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +4. 分散テーブルを作成する +```sql +create table db_uuid.dist_uuid_table1 on cluster 'cluster_1S_2R' + ( + id UInt64, + column1 String + ) + ENGINE = Distributed('cluster_1S_2R', 'db_uuid', 'uuid_table1' ); +``` + +```response +CREATE TABLE db_uuid.dist_uuid_table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = Distributed('cluster_1S_2R', 'db_uuid', 'uuid_table1') + +Query id: 3bc7f339-ab74-4c7d-a752-1ffe54219c0e + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ +``` + +### テスト +1. 最初のノードにデータを挿入する(例:`chnode1`) +```sql +INSERT INTO db_uuid.uuid_table1 + ( id, column1) + VALUES + ( 1, 'abc'); +``` + +```response +INSERT INTO db_uuid.uuid_table1 (id, column1) FORMAT Values + +Query id: 0f178db7-50a6-48e2-9a1b-52ed14e6e0f9 + +Ok. + +1 row in set. Elapsed: 0.033 sec. +``` + +2. 2番目のノードにデータを挿入する(例:`chnode2`) +```sql +INSERT INTO db_uuid.uuid_table1 + ( id, column1) + VALUES + ( 2, 'def'); +``` + +```response +INSERT INTO db_uuid.uuid_table1 (id, column1) FORMAT Values + +Query id: edc6f999-3e7d-40a0-8a29-3137e97e3607 + +Ok. + +1 row in set. Elapsed: 0.529 sec. +``` + +3. 分散テーブルを使用してレコードを表示する +```sql +SELECT * FROM db_uuid.dist_uuid_table1; +``` + +```response +SELECT * +FROM db_uuid.dist_uuid_table1 + +Query id: 6cbab449-9e7f-40fe-b8c2-62d46ba9f5c8 + +┌─id─┬─column1─┐ +│ 1 │ abc │ +└────┴─────────┘ +┌─id─┬─column1─┐ +│ 2 │ def │ +└────┴─────────┘ + +2 rows in set. Elapsed: 0.007 sec. +``` + +### 代替案 +デフォルトのレプリケーションパスはマクロによって事前に定義され、`{uuid}`も使用されます。 + +1. 各ノードでテーブルのデフォルトを設定する +```xml +/clickhouse/tables/{shard}/db_uuid/{uuid} +``` +```default_replica_name +{replica} +``` +:::tip +ノードが特定のデータベースに使用される場合、各ノードでマクロ `{database}` を定義することもできます。 +::: + +2. パラメータを明示的に指定せずにテーブルを作成する: +```sql +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER 'cluster_1S_2R' + ( + id UInt64, + column1 String + ) + ENGINE = ReplicatedMergeTree + ORDER BY (id); +``` + +```response +CREATE TABLE db_uuid.uuid_table1 ON CLUSTER cluster_1S_2R +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree +ORDER BY id + +Query id: ab68cda9-ae41-4d6d-8d3b-20d8255774ee + +┌─host──────────────────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ +│ chnode2.marsnet.local │ 9440 │ 0 │ │ 1 │ 0 │ +│ chnode1.marsnet.local │ 9440 │ 0 │ │ 0 │ 0 │ +└───────────────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ + +2 rows in set. Elapsed: 1.175 sec. +``` + +3. デフォルトの設定が使用されていることを確認する: +```sql +SHOW CREATE TABLE db_uuid.uuid_table1; +``` + +```response +SHOW CREATE TABLE db_uuid.uuid_table1 + +Query id: 5925ecce-a54f-47d8-9c3a-ad3257840c9e + +┌─statement────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ CREATE TABLE db_uuid.uuid_table1 +( + `id` UInt64, + `column1` String +) +ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/db_uuid/{uuid}', '{replica}') +ORDER BY id +SETTINGS index_granularity = 8192 │ +└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +### トラブルシューティング + +テーブル情報とUUIDを取得するためのコマンドの例: +```sql +SELECT * FROM system.tables +WHERE database = 'db_uuid' AND name = 'uuid_table1'; +``` + +上記のテーブルのUUIDに関する情報をZooKeeperから取得するためのコマンドの例: +```sql +SELECT * FROM system.zookeeper +WHERE path = '/clickhouse/tables/1/db_uuid/9e8a3cc2-0dec-4438-81a7-c3e63ce2a1cf/replicas'; +``` + +:::note +データベースは `Atomic` でなければなりません。以前のバージョンからアップグレードする場合、 +`default` データベースはおそらく `Ordinary` タイプです。 +::: + +チェック方法の例: +``` +SELECT name, engine FROM system.databases WHERE name = 'db_uuid'; +``` + +```response +SELECT + name, + engine +FROM system.databases +WHERE name = 'db_uuid' + +Query id: b047d459-a1d2-4016-bcf9-3e97e30e49c2 + +┌─name────┬─engine─┐ +│ db_uuid │ Atomic │ +└─────────┴────────┘ + +1 row in set. Elapsed: 0.004 sec. +``` + +## ClickHouse Keeperの動的再構成 {#reconfiguration} + + + +### 説明 + +ClickHouse Keeperは、動的クラスタ再構成のためにZooKeeperの[`reconfig`](https://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperReconfig.html#sc_reconfig_modifying) +コマンドを部分的にサポートしています。`keeper_server.enable_reconfiguration` がオンになっている場合にのみ動作します。 + +:::note +この設定がオフの場合、レプリカの `raft_configuration` セクションを手動で変更してクラスタを再構成できます。 +リーダーのみが変更を適用するため、すべてのレプリカのファイルを編集することを確認してください。 +あるいは、ZooKeeper互換のクライアントを使用して `reconfig` クエリを送信することもできます。 +::: + +仮想ノード `/keeper/config` には、次の形式で最後にコミットされたクラスタの設定が含まれています: + +``` +server.id = server_host:server_port[;server_type][;server_priority] +server.id2 = ... +... +``` + +- 各サーバーエントリは改行で区切られています。 +- `server_type` は `participant` または `learner` ([learner](https://github.com/eBay/NuRaft/blob/master/docs/readonly_member.md) はリーダー選出に参加しません) のいずれかです。 +- `server_priority` は、[リーダー選出時に優先されるノードを評価する](https://github.com/eBay/NuRaft/blob/master/docs/leader_election_priority.md)非負の整数です。 + 0 の優先度は、サーバーがリーダーにならないことを意味します。 + +例: + +``` +:) get /keeper/config +server.1=zoo1:9234;participant;1 +server.2=zoo2:9234;participant;1 +server.3=zoo3:9234;participant;1 +``` + +`reconfig` コマンドを用いて、新しいサーバーを追加し、既存のサーバーを削除したり、 +既存のサーバーの優先度を変更したりできます。以下に例を示します(`clickhouse-keeper-client`を使用): + +```bash +# 新しい2つのサーバーを追加 +reconfig add "server.5=localhost:123,server.6=localhost:234;learner" +# 他の2つのサーバーを削除 +reconfig remove "3,4" +# 既存のサーバーの優先度を8に変更 +reconfig add "server.5=localhost:5123;participant;8" +``` + +こちらは`kazoo`の例です: + +```python +# 新しい2つのサーバーを追加し、他の2つのサーバーを削除 +reconfig(joining="server.5=localhost:123,server.6=localhost:234;learner", leaving="3,4") + +# 既存のサーバーの優先度を8に変更 +reconfig(joining="server.5=localhost:5123;participant;8", leaving=None) +``` + +参加するサーバーは上記のサーバーフォーマットで指定する必要があります。サーバーエントリはカンマで区切る必要があります。 +新しいサーバーを追加する際、`server_priority`(デフォルト値は1)や`server_type`(デフォルト値は`participant`)は省略できます。 + +既存のサーバー優先度を変更したい場合、`joining`に対象の優先度で追加してください。 +サーバーのホスト、ポート、タイプは既存のサーバー設定と等しくなければなりません。 + +サーバーは`joining`および`leaving`に記載された順に追加および削除されます。 +`joining`からのすべてのアップデートは`leaving`からのアップデートよりも先に処理されます。 + +Keeper再構成の実装にはいくつかの注意点があります: + +- 増分再構成のみがサポートされています。`new_members`が空でないリクエストは拒否されます。 + + ClickHouse Keeperの実装は、会員を動的に変更するためにNuRaft APIに依存しています。NuRaftは、一度に1台のサーバーを追加または削除する方法を提供しています。つまり、構成への変更(`joining`の各部分、`leaving`の各部分)は個別に決定されなければなりません。従って、ユーザーにとって誤解を招くおそれがあるため、大量の再構成は利用できません。 + + サーバータイプの変更(participant/learner)はNuRaftでサポートされていないためできません。また、サーバーを削除し追加する方法しかないため、これも誤解を招くおそれがあります。 + +- 返された `znodestat` 値は使用できません。 +- `from_version` フィールドは使用されません。`from_version` を設定したリクエストはすべて拒否されます。 + これは `/keeper/config` が仮想ノードであり、永続ストレージに保存されるのではなく、 + 指定されたノード設定に基づいてリクエストごとにリアルタイムで生成されるためです。この決定は、NuRaftがすでにこの構成を保存しているため、データの重複を防ぐために行われました。 +- ZooKeeperとは異なり、`sync` コマンドを提出することでクラスタの再構成を待つことはできません。 + 新しいコンフィグは_最終的に_適用されますが、時間保証はありません。 +- `reconfig` コマンドはさまざまな理由で失敗することがあります。更新が適用されたかどうか、クラスタの状態を確認できます。 + +## シングルノードのKeeperをクラスターに変換する + +時折、エクスペリメンタルなKeeperノードをクラスタに拡張する必要があります。3ノードクラスタへステップバイステップで変換する方法の概要は次のとおりです: + +- **重要**: 新しいノードは、現在のクォーラムより少ないバッチで追加されなければなりません、さもないと内部でリーダーを選出します。ここでは一つずつ。 +- 既存のKeeperノードは`keeper_server.enable_reconfiguration`設定パラメータをオンにする必要があります。 +- 完全な新しいKeeperクラスタ設定で2番目のノードを起動する。 +- 起動後、[reconfig](#reconfiguration)を使用してノード1に追加する。 +- 次に、3番目のノードを起動し、[reconfig](#reconfiguration)を使用して追加する。 +- 新しいKeeperノードを追加して`clickhouse-server`設定を更新し、設定を適用するために再起動する。 +- ノード1のRaft設定を更新し、必要に応じて再起動する。 + +このプロセスに自信を持つために、[サンドボックスリポジトリ](https://github.com/ClickHouse/keeper-extend-cluster)を参照してください。 + +## 未サポートの機能 + +ClickHouse KeeperはZooKeeperと完全に互換性を持つことを目指していますが、現在実装されていない機能があります(開発中です): + +- [`create`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#create(java.lang.String,byte%5B%5D,java.util.List,org.apache.zookeeper.CreateMode,org.apache.zookeeper.data.Stat)) は `Stat` オブジェクトの返却をサポートしていません +- [`create`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#create(java.lang.String,byte%5B%5D,java.util.List,org.apache.zookeeper.CreateMode,org.apache.zookeeper.data.Stat)) は [TTL](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/CreateMode.html#PERSISTENT_WITH_TTL) をサポートしていません +- [`addWatch`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#addWatch(java.lang.String,org.apache.zookeeper.Watcher,org.apache.zookeeper.AddWatchMode)) は [`PERSISTENT`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/AddWatchMode.html#PERSISTENT) ウォッチでは機能しません +- [`removeWatch`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#removeWatches(java.lang.String,org.apache.zookeeper.Watcher,org.apache.zookeeper.Watcher.WatcherType,boolean)) および [`removeAllWatches`](https://zookeeper.apache.org/doc/r3.9.1/apidocs/zookeeper-server/org/apache/zookeeper/ZooKeeper.html#removeAllWatches(java.lang.String,org.apache.zookeeper.Watcher.WatcherType,boolean)) はサポートされていません +- `setWatches` はサポートされていません +- [`CONTAINER`](https://zookeeper.apache.org/doc/r3.5.1-alpha/api/org/apache/zookeeper/CreateMode.html) タイプのznode作成はサポートされていません +- [`SASL認証`](https://cwiki.apache.org/confluence/display/ZOOKEEPER/Zookeeper+and+SASL) はサポートされていません +``` diff --git a/docs/ja/guides/sre/network-ports.md b/docs/ja/guides/sre/network-ports.md new file mode 100644 index 00000000000..03c5c6b19e4 --- /dev/null +++ b/docs/ja/guides/sre/network-ports.md @@ -0,0 +1,30 @@ +--- +slug: /ja/guides/sre/network-ports +sidebar_label: ネットワークポート +--- + +# ネットワークポート + +:::note +**デフォルト**として記載されているポートは、ポート番号が`/etc/clickhouse-server/config.xml`に設定されています。設定をカスタマイズするには、`/etc/clickhouse-server/config.d/`にファイルを追加してください。詳細は[設定ファイル](../../operations/configuration-files.md#override)のドキュメントを参照してください。 +::: + +|ポート|説明| +|----|-----------| +|2181|ZooKeeper デフォルトサービスポート。 **注: ClickHouse Keeper の場合は `9181` を参照**| +|8123|HTTP デフォルトポート| +|8443|HTTP SSL/TLS デフォルトポート| +|9000|ネイティブプロトコルポート(ClickHouse TCP プロトコルとも呼ばれます)。`clickhouse-server`, `clickhouse-client` およびネイティブ ClickHouse ツールのような ClickHouse アプリケーションとプロセスで使用されます。分散クエリのためのサーバ間通信に使用されます。| +|9004|MySQL エミュレーションポート| +|9005|PostgreSQL エミュレーションポート(ClickHouse で SSL が有効になっている場合、セキュア通信にも使用されます)。| +|9009|低レベルデータアクセスのためのサーバ間通信ポート。データ交換、レプリケーション、サーバ間通信に使用されます。| +|9010|サーバ間通信のための SSL/TLS| +|9011|ネイティブプロトコル PROXYv1 プロトコルポート| +|9019|JDBC ブリッジ| +|9100|gRPC ポート| +|9181|推奨される ClickHouse Keeper ポート| +|9234|推奨される ClickHouse Keeper Raft ポート(`1`が有効な場合、セキュア通信にも使用)| +|9363|Prometheus デフォルトメトリックポート| +|9281|推奨されるセキュア SSL ClickHouse Keeper ポート| +|9440|ネイティブプロトコル SSL/TLS ポート| +|42000|Graphite デフォルトポート| diff --git a/docs/ja/guides/sre/scaling-clusters.md b/docs/ja/guides/sre/scaling-clusters.md new file mode 100644 index 00000000000..c308b7ac3a8 --- /dev/null +++ b/docs/ja/guides/sre/scaling-clusters.md @@ -0,0 +1,18 @@ +--- +slug: /ja/guides/sre/scaling-clusters +sidebar_label: シャード再調整 +sidebar_position: 20 +description: ClickHouseは自動シャード再調整をサポートしていないため、シャードを再調整するためのベストプラクティスを提供します。 +--- + +# データの再調整 + +ClickHouseは自動シャード再調整をサポートしていませんが、以下の優先順位でシャードを再調整する方法があります: + +1. [分散テーブル](/docs/ja/engines/table-engines/special/distributed.md)のシャードを調整し、新しいシャードに書き込みを偏らせることができます。これにより、クラスタ内で負荷の不均衡やホットスポットが発生する可能性がありますが、書き込みスループットが非常に高くないほとんどのシナリオでは実行可能です。ユーザーは書き込みのターゲットを変える必要がなく、分散テーブルのままで済みます。ただし、既存のデータの再調整には役立ちません。 + +2. (1) の代替として、既存のクラスタを修正し、新しいシャードにのみ書き込むことでクラスタがバランスされるようにします。これも書き込みの重み付けを手動で行うことになります。(1)と同じ制限があります。 + +3. 既存のデータの再調整が必要で、データをパーティション化している場合は、パーティションを切り離して別のノードに手動で移動し、新しいシャードに再アタッチすることを検討してください。これは後の技術より手動が多くなりますが、より迅速でリソースを消費しない場合があります。これは手動操作であり、データの再調整を考慮する必要があります。 + +4. ソースクラスタから新しいクラスタにデータをエクスポートするために、[INSERT FROM SELECT](/docs/ja/sql-reference/statements/insert-into.md/#inserting-the-results-of-select)を使用します。これにより、非常に大きなデータセットではパフォーマンスが低下し、ソースクラスタに大幅なIOを発生させ、ネットワークリソースをかなり消費します。これは最終手段です。 diff --git a/docs/ja/guides/sre/user-management/_category_.yml b/docs/ja/guides/sre/user-management/_category_.yml new file mode 100644 index 00000000000..6123b1742ed --- /dev/null +++ b/docs/ja/guides/sre/user-management/_category_.yml @@ -0,0 +1,7 @@ +position: 5 +label: 'User and role management' +collapsible: true +collapsed: true +link: + type: generated-index + slug: /ja/guides/sre/user-role diff --git a/docs/ja/guides/sre/user-management/configuring-ldap.md b/docs/ja/guides/sre/user-management/configuring-ldap.md new file mode 100644 index 00000000000..4e9477b2c37 --- /dev/null +++ b/docs/ja/guides/sre/user-management/configuring-ldap.md @@ -0,0 +1,167 @@ +--- +sidebar_label: LDAPの設定 +sidebar_position: 2 +slug: /ja/guides/sre/configuring-ldap +--- +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + +# ClickHouseをLDAPで認証とロールマッピングに使用する設定 + + + +ClickHouseはLDAPを使用してClickHouseデータベースユーザーを認証するように設定できます。このガイドは、公開ディレクトリに認証するLDAPシステムとClickHouseを統合する簡単な例を示します。 + +## 1. ClickHouseでのLDAP接続設定の構成 + +1. この公開LDAPサーバーへの接続をテストします: + ```bash + $ ldapsearch -x -b dc=example,dc=com -H ldap://ldap.forumsys.com + ``` + + 応答は次のようになります: + ```response + # extended LDIF + # + # LDAPv3 + # base with scope subtree + # filter: (objectclass=*) + # requesting: ALL + # + + # example.com + dn: dc=example,dc=com + objectClass: top + objectClass: dcObject + objectClass: organization + o: example.com + dc: example + ... + ``` + +2. `config.xml`ファイルを編集し、LDAPを構成するために以下を追加します: + ```xml + + + ldap.forumsys.com + 389 + uid={user_name},dc=example,dc=com + no + never + + + ``` + + :::note + ``タグは特定のLDAPサーバーを識別するための任意のラベルです。 + ::: + + 上記で使用される基本設定は次の通りです: + + |パラメータ |説明 |例 | + |----------|-----------------------|----------------| + |host |LDAPサーバーのホスト名またはIP|ldap.forumsys.com| + |port |LDAPサーバーのディレクトリポート|389| + |bind_dn |ユーザーへのテンプレートパス|uid={user_name},dc=example,dc=com| + |enable_tls|安全なLDAPを使用するかどうか|no| + |tls_require_cert |接続に証明書を必要とするかどうか|never| + + :::note + この例では、公開サーバーが389を使用し、安全なポートを使用しないため、デモ用にTLSを無効にしています。 + ::: + + :::note + LDAP設定の詳細については、[LDAPドキュメントページ](../../../operations/external-authenticators/ldap.md)を参照してください。 + ::: + +3. `` セクションに `` セクションを追加して、ユーザーロールマッピングを構成します。このセクションでは、ユーザーが認証されたときにどのロールを受け取るかが定義されます。この基本的な例では、LDAPへの認証に成功したユーザーは、ClickHouseで後ほど定義される `scientists_role` を受け取ります。このセクションは次のようになります: + ```xml + + + users.xml + + + /var/lib/clickhouse/access/ + + + test_ldap_server + + + + + dc=example,dc=com + (&(objectClass=groupOfUniqueNames)(uniqueMember={bind_dn})) + cn + + + + ``` + + 上記で使用されている基本設定は次の通りです: + + |パラメータ |説明 |例 | + |----------|-----------------------|----------------| + |server |前のldap_serversセクションで定義されたラベル|test_ldap_server| + |roles |ユーザーがマッピングされるClickHouseで定義されたロール名|scientists_role| + |base_dn |グループを検索するベースパス|dc=example,dc=com| + |search_filter|ユーザーをマッピングするために選択すべきグループを識別するldap検索フィルター|(&(objectClass=groupOfUniqueNames)(uniqueMember={bind_dn}))| + |attribute |戻されるべき値がある属性名|cn| + +4. 設定を適用するためにClickHouseサーバーを再起動します。 + +## 2. ClickHouseデータベースのロールと権限を構成 + +:::note +このセクションの手順は、ClickHouseでSQLアクセス制御とアカウント管理が有効になっていることを前提としています。有効化するには、[SQLユーザーとロールガイド](index.md)を参照してください。 +::: + +1. `config.xml`ファイルのロールマッピングセクションで使用されているのと同じ名前でClickHouseにロールを作成します + ```sql + CREATE ROLE scientists_role; + ``` + +2. 必要な特権をロールに付与します。次のステートメントは、LDAPを通して認証された任意のユーザーに管理者特権を付与します: + ```sql + GRANT ALL ON *.* TO scientists_role; + ``` + +## 3. LDAP設定のテスト + +1. ClickHouseクライアントを使用してログインします + ```bash + $ clickhouse-client --user einstein --password password + ClickHouse client version 22.2.2.1. + Connecting to localhost:9000 as user einstein. + Connected to ClickHouse server version 22.2.2 revision 54455. + + chnode1 :) + ``` + + :::note + ステップ1の`ldapsearch`コマンドを使用して、ディレクトリ内のすべてのユーザーを表示し、すべてのユーザーのパスワードは`password`です。 + ::: + +2. ユーザーが`scientists_role`ロールに正しくマッピングされ、管理者権限を持っていることをテストします + ```sql + SHOW DATABASES + ``` + + ```response + Query id: 93b785ff-1482-4eda-95b0-b2d68b2c5e0f + + ┌─name───────────────┐ + │ INFORMATION_SCHEMA │ + │ db1_mysql │ + │ db2 │ + │ db3 │ + │ db4_mysql │ + │ db5_merge │ + │ default │ + │ information_schema │ + │ system │ + └────────────────────┘ + + 9 rows in set. Elapsed: 0.004 sec. + ``` + +## サマリー +この記事では、ClickHouseをLDAPサーバーに認証させ、ロールにマッピングする基本を示しました。ClickHouse内で個々のユーザーを構成し、自動ロールマッピングを構成せずにLDAPで認証するオプションもあります。LDAPモジュールはActive Directoryへの接続にも使用できます。 diff --git a/docs/ja/guides/sre/user-management/index.md b/docs/ja/guides/sre/user-management/index.md new file mode 100644 index 00000000000..60e84bd1f1e --- /dev/null +++ b/docs/ja/guides/sre/user-management/index.md @@ -0,0 +1,535 @@ +--- +slug: /ja/operations/access-rights +sidebar_position: 1 +sidebar_label: ユーザーとロール +title: アクセス制御とアカウント管理 +--- + +# ClickHouseでのユーザーとロールの作成 + +ClickHouseは[RBAC](https://en.wikipedia.org/wiki/Role-based_access_control)アプローチに基づくアクセス制御管理をサポートしています。 + +ClickHouseのアクセスエンティティ: +- [ユーザーアカウント](#user-account-management) +- [ロール](#role-management) +- [行ポリシー](#row-policy-management) +- [設定プロファイル](#settings-profiles-management) +- [クォータ](#quotas-management) + +アクセスエンティティは以下の方法で設定できます: + +- SQL駆動のワークフロー。 + + この機能を[有効化](#enabling-access-control)する必要があります。 + +- サーバーの[設定ファイル](/docs/ja/operations/configuration-files.md) `users.xml` と `config.xml`。 + +SQL駆動のワークフローを使用することをお勧めします。両方の設定方法は同時に動作するため、アカウントやアクセス権をサーバー設定ファイルで管理している場合も、スムーズにSQL駆動のワークフローに移行できます。 + +:::note +同じアクセスエンティティを両方の設定方法で同時に管理することはできません。 +::: + +:::note +ClickHouse Cloud Consoleユーザーの管理については、この[ページ](https://clickhouse.com/docs/ja/security/cloud-access-management.md)を参照してください。 +::: + +すべてのユーザー、ロール、プロファイルなどとそのすべての付与を確認するには、[SHOW ACCESS](/docs/ja/sql-reference/statements/show.md#show-access-statement)ステートメントを使用します。 + +## 概要 {#access-control-usage} + +デフォルトでは、ClickHouseサーバーにはSQL駆動のアクセス制御とアカウント管理を使用できないがすべての権限を持つ`default`ユーザーアカウントが用意されています。`default`ユーザーアカウントは、例えばクライアントからログインするときや分散クエリでユーザー名が定義されていない場合に使用されます。分散クエリ処理では、サーバーやクラスターの設定で[user and password](/docs/ja/engines/table-engines/special/distributed.md)プロパティが指定されていない場合、デフォルトのユーザーアカウントが使用されます。 + +ClickHouseを使い始めたばかりの場合、以下のシナリオを検討してください: + +1. `default`ユーザーに対してSQL駆動のアクセス制御とアカウント管理を[有効化](#enabling-access-control)します。 +2. `default`ユーザーアカウントにログインし、必要なすべてのユーザーを作成します。管理者アカウントを作成することを忘れずに行ってください(`GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION`)。 +3. `default`ユーザーの[権限を制限](/docs/ja/operations/settings/permissions-for-queries.md#permissions_for_queries)し、そのSQL駆動のアクセス制御とアカウント管理を無効化します。 + +### 現在のソリューションの特性 {#access-control-properties} + +- データベースやテーブルが存在しなくても権限を付与することが可能です。 +- テーブルが削除されても、そのテーブルに対応するすべての特権は取り消されません。つまり、後で同じ名前の新しいテーブルを作成しても、特権は有効なままです。削除されたテーブルに対応する特権を取り消すには、例えば`REVOKE ALL PRIVILEGES ON db.table FROM ALL`クエリを実行する必要があります。 +- 特権に関する有効期限の設定は存在しません。 + +### ユーザーアカウント {#user-account-management} + +ユーザーアカウントは、ClickHouseでの認証を可能にするアクセスエンティティです。ユーザーアカウントには以下が含まれます: + +- 識別情報。 +- ユーザーが実行できるクエリの範囲を定義する[特権](/docs/ja/sql-reference/statements/grant.md#privileges)。 +- ClickHouseサーバーへの接続が許可されたホスト。 +- 割り当てられた、またはデフォルトのロール。 +- ユーザーのログイン時にデフォルトで適用される制約を持つ設定。 +- 割り当てられた設定プロファイル。 + +特権は[GRANT](/docs/ja/sql-reference/statements/grant.md)クエリを用いてユーザーアカウントに付与されるか、[ロール](#role-management)を割り当てることによって付与されます。ユーザーから特権を取り消すには、ClickHouseは[REVOKE](/docs/ja/sql-reference/statements/revoke.md)クエリを提供します。ユーザーの特権を一覧表示するには、[SHOW GRANTS](/docs/ja/sql-reference/statements/show.md#show-grants-statement)ステートメントを使用します。 + +管理クエリ: + +- [CREATE USER](/docs/ja/sql-reference/statements/create/user.md) +- [ALTER USER](/docs/ja/sql-reference/statements/alter/user.md#alter-user-statement) +- [DROP USER](/docs/ja/sql-reference/statements/drop.md) +- [SHOW CREATE USER](/docs/ja/sql-reference/statements/show.md#show-create-user-statement) +- [SHOW USERS](/docs/ja/sql-reference/statements/show.md#show-users-statement) + +### 設定の適用 {#access-control-settings-applying} + +設定は異なる方法で構成することができます:ユーザーアカウント、デフォルトで割り当てられたロールおよび設定プロファイルにおいて、ログイン時に適用される設定の値と制約は以下の通り(優先順位が高い順)です: + +1. ユーザーアカウントの設定。 +2. ユーザーアカウントのデフォルトロールの設定。ある設定が複数のロールで構成されている場合、その設定の適用順序は未定義です。 +3. ユーザーまたはそのデフォルトロールに割り当てられた設定プロファイルの設定。ある設定が複数のプロファイルで構成されている場合、その設定の適用順序は未定義です。 +4. サーバー全体にデフォルトで適用される設定または[デフォルトプロファイル](/docs/ja/operations/server-configuration-parameters/settings.md#default-profile)からの設定。 + +### ロール {#role-management} + +ロールは、ユーザーアカウントに付与されるアクセスエンティティのコンテナです。 + +ロールには以下が含まれます: + +- [特権](/docs/ja/sql-reference/statements/grant.md#grant-privileges) +- 設定と制約 +- 割り当てられたロールのリスト + +管理クエリ: + +- [CREATE ROLE](/docs/ja/sql-reference/statements/create/role.md) +- [ALTER ROLE](/docs/ja/sql-reference/statements/alter/role.md#alter-role-statement) +- [DROP ROLE](/docs/ja/sql-reference/statements/drop.md) +- [SET ROLE](/docs/ja/sql-reference/statements/set-role.md) +- [SET DEFAULT ROLE](/docs/ja/sql-reference/statements/set-role.md#set-default-role-statement) +- [SHOW CREATE ROLE](/docs/ja/sql-reference/statements/show.md#show-create-role-statement) +- [SHOW ROLES](/docs/ja/sql-reference/statements/show.md#show-roles-statement) + +特権は[GRANT](/docs/ja/sql-reference/statements/grant.md)クエリを使用してロールに付与できます。ロールから特権を取り消すには、ClickHouseは[REVOKE](/docs/ja/sql-reference/statements/revoke.md)クエリを提供します。 + +#### 行ポリシー {#row-policy-management} + +行ポリシーは、ユーザーまたはロールに利用可能な行を定義するフィルターです。行ポリシーには特定のテーブル用のフィルターと、その行ポリシーを使用するロールやユーザーのリストが含まれます。 + +:::note +行ポリシーは読み取り専用アクセスのユーザーに対してのみ意味を持ちます。ユーザーがテーブルを変更したり、テーブル間でパーティションをコピーできる場合、行ポリシーの制限は効果が薄れます。 +::: + +管理クエリ: + +- [CREATE ROW POLICY](/docs/ja/sql-reference/statements/create/row-policy.md) +- [ALTER ROW POLICY](/docs/ja/sql-reference/statements/alter/row-policy.md#alter-row-policy-statement) +- [DROP ROW POLICY](/docs/ja/sql-reference/statements/drop.md#drop-row-policy-statement) +- [SHOW CREATE ROW POLICY](/docs/ja/sql-reference/statements/show.md#show-create-row-policy-statement) +- [SHOW POLICIES](/docs/ja/sql-reference/statements/show.md#show-policies-statement) + +### 設定プロファイル {#settings-profiles-management} + +設定プロファイルは、[設定](/docs/ja/operations/settings/index.md)のコレクションです。設定プロファイルには、設定と制約、そしてこのプロファイルが適用されるロールやユーザーのリストが含まれます。 + +管理クエリ: + +- [CREATE SETTINGS PROFILE](/docs/ja/sql-reference/statements/create/settings-profile.md#create-settings-profile-statement) +- [ALTER SETTINGS PROFILE](/docs/ja/sql-reference/statements/alter/settings-profile.md#alter-settings-profile-statement) +- [DROP SETTINGS PROFILE](/docs/ja/sql-reference/statements/drop.md#drop-settings-profile-statement) +- [SHOW CREATE SETTINGS PROFILE](/docs/ja/sql-reference/statements/show.md#show-create-settings-profile-statement) +- [SHOW PROFILES](/docs/ja/sql-reference/statements/show.md#show-profiles-statement) + +### クォータ {#quotas-management} + +クォータはリソースの使用を制限します。詳しくは[クォータ](/docs/ja/operations/quotas.md)を参照してください。 + +クォータは、一定期間に関する制限のセットと、このクォータを使用する必要があるロールやユーザーのリストを含みます。 + +管理クエリ: + +- [CREATE QUOTA](/docs/ja/sql-reference/statements/create/quota.md) +- [ALTER QUOTA](/docs/ja/sql-reference/statements/alter/quota.md#alter-quota-statement) +- [DROP QUOTA](/docs/ja/sql-reference/statements/drop.md#drop-quota-statement) +- [SHOW CREATE QUOTA](/docs/ja/sql-reference/statements/show.md#show-create-quota-statement) +- [SHOW QUOTA](/docs/ja/sql-reference/statements/show.md#show-quota-statement) +- [SHOW QUOTAS](/docs/ja/sql-reference/statements/show.md#show-quotas-statement) + +### SQL駆動のアクセス制御とアカウント管理の有効化 {#enabling-access-control} + +- 設定の保存用ディレクトリを設定します。 + + ClickHouseは、アクセスエンティティの設定を[access_control_path](/docs/ja/operations/server-configuration-parameters/settings.md#access_control_path)サーバー設定パラメータで設定されたフォルダに保存します。 + +- 少なくとも1つのユーザーアカウントに対してSQL駆動のアクセス制御とアカウント管理を有効化します。 + + デフォルトでは、SQL駆動のアクセス制御とアカウント管理はすべてのユーザーに対して無効になっています。少なくとも1人のユーザーを`users.xml`設定ファイルに設定し、[`access_management`](/docs/ja/operations/settings/settings-users.md#access_management-user-setting)、`named_collection_control`、`show_named_collections`、`show_named_collections_secrets`設定の値を1に設定する必要があります。 + +## SQLユーザーとロールの定義 + +:::tip +ClickHouse Cloudで作業する場合は、[クラウドアクセス管理](/docs/ja/cloud/security/cloud-access-management)を参照してください。 +::: + +この記事では、SQLユーザーとロールの基本的な定義方法と、それらの特権と権限をデータベース、テーブル、行、カラムに適用する方法を示します。 + +### SQLユーザーモードの有効化 + +1. `users.xml`ファイルの``ユーザーの下にSQLユーザーモードを有効にします: + ```xml + 1 + 1 + 1 + 1 + ``` + + :::note + `default`ユーザーは、新しくインストールした際に作成される唯一のユーザーであり、デフォルトではノード間の通信に使用されるアカウントでもあります。 + + 本番環境では、ノード間通信がSQL管理者ユーザーで設定されている場合や、``、クラスターの認証情報、および/またはノード間HTTPおよびトランスポートプロトコルの認証情報で設定されている場合には、このユーザーを無効にすることを推奨します。 + ::: + +2. ノードを再起動して、変更を適用します。 + +3. ClickHouseクライアントを起動します: + ```sql + clickhouse-client --user default --password + ``` +### ユーザーの定義 + +1. SQL管理者アカウントを作成します: + ```sql + CREATE USER clickhouse_admin IDENTIFIED BY 'password'; + ``` +2. 新しいユーザーに完全な管理権限を付与します: + ```sql + GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION; + ``` + + + +## ALTER権限 + +この記事は、特権をどのように定義し、特権ユーザーに対して`ALTER`ステートメントを使用する場合の権限がどのように機能するかをよりよく理解するためのものです。 + +`ALTER`ステートメントは、いくつかのカテゴリーに分かれています。その中には階層的なものと、明示的に定義されるべきものが存在します。 + +**DB、テーブル、ユーザーの構成例** + +1. 管理者ユーザーでサンプルユーザーを作成します: +```sql +CREATE USER my_user IDENTIFIED BY 'password'; +``` + +2. サンプルデータベースを作成します: +```sql +CREATE DATABASE my_db; +``` + +3. サンプルテーブルを作成します: +```sql +CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id; +``` + +4. 権限の付与/取消しを行うサンプル管理者ユーザーを作成します: +```sql +CREATE USER my_alter_admin IDENTIFIED BY 'password'; +``` + +:::note +権限を付与または取消するには、管理者ユーザーが`WITH GRANT OPTION`特権を持っている必要があります。 +例えば: + ```sql + GRANT ALTER ON my_db.* WITH GRANT OPTION + ``` +ユーザーに権限を付与または取り消すためには、まずそのユーザー自身がこれらの権限を持っている必要があります。 +::: + +**権限の付与または取消し** + +`ALTER`の階層: + +``` +. +├── ALTER (テーブルとビューのみ)/ +│ ├── ALTER TABLE/ +│ │ ├── ALTER UPDATE +│ │ ├── ALTER DELETE +│ │ ├── ALTER COLUMN/ +│ │ │ ├── ALTER ADD COLUMN +│ │ │ ├── ALTER DROP COLUMN +│ │ │ ├── ALTER MODIFY COLUMN +│ │ │ ├── ALTER COMMENT COLUMN +│ │ │ ├── ALTER CLEAR COLUMN +│ │ │ └── ALTER RENAME COLUMN +│ │ ├── ALTER INDEX/ +│ │ │ ├── ALTER ORDER BY +│ │ │ ├── ALTER SAMPLE BY +│ │ │ ├── ALTER ADD INDEX +│ │ │ ├── ALTER DROP INDEX +│ │ │ ├── ALTER MATERIALIZE INDEX +│ │ │ └── ALTER CLEAR INDEX +│ │ ├── ALTER CONSTRAINT/ +│ │ │ ├── ALTER ADD CONSTRAINT +│ │ │ └── ALTER DROP CONSTRAINT +│ │ ├── ALTER TTL/ +│ │ │ └── ALTER MATERIALIZE TTL +│ │ ├── ALTER SETTINGS +│ │ ├── ALTER MOVE PARTITION +│ │ ├── ALTER FETCH PARTITION +│ │ └── ALTER FREEZE PARTITION +│ └── ALTER LIVE VIEW/ +│ ├── ALTER LIVE VIEW REFRESH +│ └── ALTER LIVE VIEW MODIFY QUERY +├── ALTER DATABASE +├── ALTER USER +├── ALTER ROLE +├── ALTER QUOTA +├── ALTER [ROW] POLICY +└── ALTER [SETTINGS] PROFILE +``` + +1. ユーザーまたはロールに`ALTER`権限を付与する + +`GRANT ALTER on *.* TO my_user`を使用すると、トップレベルの`ALTER TABLE`と`ALTER VIEW`にのみ影響し、その他の`ALTER`ステートメントは個別に付与または取り消す必要があります。 + +例えば、基本的な`ALTER`特権を付与する: +```sql +GRANT ALTER ON my_db.my_table TO my_user; +``` + +結果として付与される特権のセット: +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: 706befbc-525e-4ec1-a1a2-ba2508cc09e3 + +┌─GRANTS FOR my_user───────────────────────────────────────────┐ +│ GRANT ALTER TABLE, ALTER VIEW ON my_db.my_table TO my_user │ +└──────────────────────────────────────────────────────────────┘ +``` + +これにより、上記の例から`ALTER TABLE`と`ALTER VIEW`の下にあるすべての権限が付与されますが、`ALTER ROW POLICY`などの他の`ALTER`権限は付与されません(階層図に戻ると、`ALTER ROW POLICY`が`ALTER TABLE`または`ALTER VIEW`の子でないことがわかります)。これらは明示的に付与または取り消す必要があります。 + +例えば、次のように一部の`ALTER`特権が必要な場合、それぞれを別々に付与できます。副権限がある場合、それらも自動的に付与されます。 + +例: +```sql +GRANT ALTER COLUMN ON my_db.my_table TO my_user; +``` + +付与されたものは次のようになります: +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: 47b3d03f-46ac-4385-91ec-41119010e4e2 + +┌─GRANTS FOR my_user────────────────────────────────┐ +│ GRANT ALTER COLUMN ON default.my_table TO my_user │ +└───────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.004 sec. +``` + +これにより、次のような副権限も与えられます: +```sql +ALTER ADD COLUMN +ALTER DROP COLUMN +ALTER MODIFY COLUMN +ALTER COMMENT COLUMN +ALTER CLEAR COLUMN +ALTER RENAME COLUMN +``` + +2. ユーザーおよびロールから`ALTER`権限を取り消す + +`REVOKE`ステートメントは、`GRANT`ステートメントと同様に機能します。 + +ユーザーまたはロールに副権限が付与された場合、その副権限を直接取り消すか、次の上位レベルの権限を取り消すことができます。 + +例:ユーザーに`ALTER ADD COLUMN`が付与された場合 +```sql +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user; +``` + +```response +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user + +Query id: 61fe0fdc-1442-4cd6-b2f3-e8f2a853c739 + +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: 27791226-a18f-46c8-b2b4-a9e64baeb683 + +┌─GRANTS FOR my_user──────────────────────────────────┐ +│ GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user │ +└─────────────────────────────────────────────────────┘ +``` + +権限を個別に取り消すこともできます: +```sql +REVOKE ALTER ADD COLUMN ON my_db.my_table FROM my_user; +``` + +あるいは、どの上位レベルからでも取り消すことができます(すべてのCOLUMN副権限を取り消します): +``` +REVOKE ALTER COLUMN ON my_db.my_table FROM my_user; +``` + +```response +REVOKE ALTER COLUMN ON my_db.my_table FROM my_user + +Query id: b882ba1b-90fb-45b9-b10f-3cda251e2ccc + +Ok. + +0 rows in set. Elapsed: 0.002 sec. +``` + +```sql +SHOW GRANTS FOR my_user; +``` + +```response +SHOW GRANTS FOR my_user + +Query id: e7d341de-de65-490b-852c-fa8bb8991174 + +Ok. + +0 rows in set. Elapsed: 0.003 sec. +``` + +**補足** + +権限は、`WITH GRANT OPTION`を持つユーザーによって付与される必要があり、さらにそのユーザー自身がその権限を持っている必要があります。 + +1. 管理者ユーザーに権限を付与し、特権のセットを管理することを許可する場合 +例: +```sql +GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION; +``` + +このユーザーは、`ALTER COLUMN`およびすべてのサブ特権を付与または取り消すことができます。 + +**テスト** + +1. `SELECT`権限を追加します: +```sql + GRANT SELECT ON my_db.my_table TO my_user; +``` + +2. ユーザーにカラム追加権限を与える: +```sql +GRANT ADD COLUMN ON my_db.my_table TO my_user; +``` + +3. 制限付きユーザーでログインする: +```bash +clickhouse-client --user my_user --password password --port 9000 --host +``` + +4. カラムを追加してみる: +```sql +ALTER TABLE my_db.my_table ADD COLUMN column2 String; +``` + +```response +ALTER TABLE my_db.my_table + ADD COLUMN `column2` String + +Query id: d5d6bfa1-b80c-4d9f-8dcd-d13e7bd401a5 + +Ok. + +0 rows in set. Elapsed: 0.010 sec. +``` + +```sql +DESCRIBE my_db.my_table; +``` + +```response +DESCRIBE TABLE my_db.my_table + +Query id: ab9cb2d0-5b1a-42e1-bc9c-c7ff351cb272 + +┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ UInt64 │ │ │ │ │ │ +│ column1 │ String │ │ │ │ │ │ +│ column2 │ String │ │ │ │ │ │ +└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +4. カラムを削除してみる: +```sql +ALTER TABLE my_db.my_table DROP COLUMN column2; +``` + +```response +ALTER TABLE my_db.my_table + DROP COLUMN column2 + +Query id: 50ad5f6b-f64b-4c96-8f5f-ace87cea6c47 + + +0 rows in set. Elapsed: 0.004 sec. + +Received exception from server (version 22.5.1): +Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_user: Not enough privileges. To execute this query it's necessary to have grant ALTER DROP COLUMN(column2) ON my_db.my_table. (ACCESS_DENIED) +``` + +5. alter管理者を利用して権限を付与するテスト +```sql +GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION; +``` + +6. alter管理者ユーザーでログイン: +```bash +clickhouse-client --user my_alter_admin --password password --port 9000 --host +``` + +7. サブ特権を付与する: +```sql +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user; +``` + +```response +GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user + +Query id: 1c7622fa-9df1-4c54-9fc3-f984c716aeba + +Ok. +``` + +8. 権限を持たないalter管理者ユーザーが持っていないサブ特権を持たない特権を付与しようとするテスト。 +```sql +GRANT ALTER UPDATE ON my_db.my_table TO my_user; +``` + +```response +GRANT ALTER UPDATE ON my_db.my_table TO my_user + +Query id: 191690dc-55a6-4625-8fee-abc3d14a5545 + + +0 rows in set. Elapsed: 0.004 sec. + +Received exception from server (version 22.5.1): +Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_alter_admin: Not enough privileges. To execute this query it's necessary to have grant ALTER UPDATE ON my_db.my_table WITH GRANT OPTION. (ACCESS_DENIED) +``` + +**まとめ** + +`ALTER`特権はテーブルおよびビューに対する`ALTER`に対して階層的ですが、他の`ALTER`ステートメントには適用されません。特権は細かいレベルや特権のグループに設定でき、同様に取り消すこともできます。権限を設定するユーザーは、`WITH GRANT OPTION`を持っている必要があり、設定するユーザー自身を含む、その権限を既に持っている必要があります。操作を行うユーザーは、もし付与オプション権限を自分でも持っていない場合、自分自身の特権を取り消すことはできません。 + diff --git a/docs/ja/guides/sre/user-management/ssl-user-auth.md b/docs/ja/guides/sre/user-management/ssl-user-auth.md new file mode 100644 index 00000000000..c96c6906d06 --- /dev/null +++ b/docs/ja/guides/sre/user-management/ssl-user-auth.md @@ -0,0 +1,134 @@ +--- +sidebar_label: SSLユーザー証明書認証 +sidebar_position: 3 +slug: /ja/guides/sre/ssl-user-auth +--- + +# SSLユーザー証明書の認証設定 +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +このガイドでは、SSLユーザー証明書を使用して認証を設定するためのシンプルで最小限の設定を提供します。このチュートリアルは、[SSL-TLSの設定ガイド](../configuring-ssl.md)に基づいています。 + +:::note +SSLユーザー認証は、`https`またはネイティブインターフェースを使用する場合のみサポートされています。現在、gRPCやPostgreSQL/MySQLエミュレーションポートでは使用されていません。 + +ClickHouseノードは、安全な認証のために`strict`を設定する必要があります(`relaxed`はテスト目的で機能します)。 +::: + +## 1. SSLユーザー証明書を作成 + +:::note +この例では、自己署名されたCAを使用した自己署名証明書を使用しています。プロダクション環境では、CSRを作成し、PKIチームまたは証明書プロバイダーに提出して適切な証明書を取得してください。 +::: + +1. 証明書署名要求(CSR)とキーを生成します。基本的な形式は次のとおりです: + ```bash + openssl req -newkey rsa:2048 -nodes -subj "/CN=:" -keyout .key -out .csr + ``` + この例では、サンプル環境で使用されるドメインとユーザーに対してこれを使用します: + ```bash + openssl req -newkey rsa:2048 -nodes -subj "/CN=chnode1.marsnet.local:cert_user" -keyout chnode1_cert_user.key -out chnode1_cert_user.csr + ``` + :::note + CNは任意であり、証明書の識別子として任意の文字列を使用できます。次のステップでユーザーを作成する際に使用されます。 + ::: + +2. 認証に使用する新しいユーザー証明書を生成し、署名します。基本的な形式は次のとおりです: + ```bash + openssl x509 -req -in .csr -out .crt -CA .crt -CAkey .key -days 365 + ``` + この例では、サンプル環境で使用されるドメインとユーザーに対してこれを使用します: + ```bash + openssl x509 -req -in chnode1_cert_user.csr -out chnode1_cert_user.crt -CA marsnet_ca.crt -CAkey marsnet_ca.key -days 365 + ``` + +## 2. SQLユーザーを作成し、権限を付与 + +:::note +SQLユーザーを有効にしてロールを設定する方法の詳細については、[SQLユーザーとロールの定義](index.md)ユーザーガイドを参照してください。 +::: + +1. 証明書認証を使用するように定義されたSQLユーザーを作成します: + ```sql + CREATE USER cert_user IDENTIFIED WITH ssl_certificate CN 'chnode1.marsnet.local:cert_user'; + ``` + +2. 新しい証明書ユーザーに権限を付与します: + ```sql + GRANT ALL ON *.* TO cert_user WITH GRANT OPTION; + ``` + :::note + この演習ではデモンストレーション目的でユーザーにフル管理者権限を付与しています。権限設定についてはClickHouseの[RBACドキュメント](/docs/ja/guides/sre/user-management/index.md)を参照してください。 + ::: + + :::note + ユーザーとロールを定義するためにSQLを使用することをお勧めしますが、現在設定ファイルでユーザーとロールを定義している場合、ユーザーは次のようになります: + ```xml + + + + chnode1.marsnet.local:cert_user + + + ::/0 + + default + 1 + + + + ``` + ::: + +## 3. テスト + +1. ユーザー証明書、ユーザーキー、CA証明書をリモートノードにコピーします。 + +2. 証明書とパスを指定して、ClickHouseの[クライアント設定](/docs/ja/interfaces/cli.md#configuration_files)でOpenSSLを構成します。 + + ```xml + + + my_cert_name.crt + my_cert_name.key + my_ca_cert.crt + + + ``` + +3. `clickhouse-client`を実行します。 + ``` + clickhouse-client --user --query 'SHOW TABLES' + ``` + :::note + 設定で証明書が指定されている場合、clickhouse-clientに渡されるパスワードは無視されることに注意してください。 + ::: + +## 4. HTTPのテスト + +1. ユーザー証明書、ユーザーキー、CA証明書をリモートノードにコピーします。 + +2. `curl`を使用してサンプルSQLコマンドをテストします。基本的な形式は次のとおりです: + ```bash + echo 'SHOW TABLES' | curl 'https://:8443' --cert .crt --key .key --cacert .crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: " --data-binary @- + ``` + 例えば: + ```bash + echo 'SHOW TABLES' | curl 'https://chnode1:8443' --cert chnode1_cert_user.crt --key chnode1_cert_user.key --cacert marsnet_ca.crt -H "X-ClickHouse-SSL-Certificate-Auth: on" -H "X-ClickHouse-User: cert_user" --data-binary @- + ``` + 出力は次のようになります: + ```response + INFORMATION_SCHEMA + default + information_schema + system + ``` + :::note + パスワードが指定されていないことに注意してください。ClickHouseはパスワードの代わりに証明書を使用してユーザーを認証します。 + ::: + +## まとめ + +この記事では、SSL証明書認証のためのユーザーを作成し設定する基本を紹介しました。この方法は、`clickhouse-client`または`https`インターフェースをサポートし、HTTPヘッダーを設定できるクライアントで使用できます。生成された証明書とキーはプライベートに保ち、限られたアクセスのみを許可してください。証明書とキーはパスワードと同様に扱ってください。 diff --git a/docs/ja/guides/troubleshooting.md b/docs/ja/guides/troubleshooting.md new file mode 100644 index 00000000000..0c202c5ac11 --- /dev/null +++ b/docs/ja/guides/troubleshooting.md @@ -0,0 +1,193 @@ +--- +title: "トラブルシューティング" +--- + +## インストール + +### apt-keyでkeyserver.ubuntu.comからGPGキーをインポートできない + +[Advanced package tool (APT)の`apt-key`機能は廃止されています](https://manpages.debian.org/bookworm/apt/apt-key.8.en.html)。代わりに`gpg`コマンドを使用する必要があります。[インストールガイド](../getting-started/install.md)の記事を参照してください。 + +### gpgでkeyserver.ubuntu.comからGPGキーをインポートできない + +1. `gpg`がインストールされているか確認します: + +```shell +sudo apt-get install gnupg +``` + +### apt-getでClickHouseリポジトリからdebパッケージを取得できない + +1. ファイアウォールの設定を確認します。 +2. 何らかの理由でリポジトリにアクセスできない場合は、[インストールガイド](../getting-started/install.md)の記事で説明されているようにパッケージをダウンロードし、`sudo dpkg -i `コマンドを使って手動でインストールします。また、`tzdata`パッケージも必要です。 + +### apt-getでClickHouseリポジトリからdebパッケージを更新できない + +この問題はGPGキーが変更されたときに発生する可能性があります。 + +リポジトリ設定を更新するには、[設定](../getting-started/install.md#setup-the-debian-repository)ページのマニュアルを使用してください。 + +### `apt-get update`で異なる警告が出る + +警告メッセージの例は次のいずれかです: + +```shell +N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://packages.clickhouse.com/deb stable InRelease' doesn't support architecture 'i386' +``` + +```shell +E: Failed to fetch https://packages.clickhouse.com/deb/dists/stable/main/binary-amd64/Packages.gz File has unexpected size (30451 != 28154). Mirror sync in progress? +``` + +```shell +E: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Origin' value from 'Artifactory' to 'ClickHouse' +E: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Label' value from 'Artifactory' to 'ClickHouse' +N: Repository 'https://packages.clickhouse.com/deb stable InRelease' changed its 'Suite' value from 'stable' to '' +N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details. +``` + +```shell +Err:11 https://packages.clickhouse.com/deb stable InRelease +400 Bad Request [IP: 172.66.40.249 443] +``` + +上記の問題を解決するには、以下のスクリプトを使用してください: + +```shell +sudo rm /var/lib/apt/lists/packages.clickhouse.com_* /var/lib/dpkg/arch /var/lib/apt/lists/partial/packages.clickhouse.com_* +sudo apt-get clean +sudo apt-get autoclean +``` + +### 不正な署名のためにYumでパッケージを取得できない + +可能性のある問題: キャッシュが間違っている、または2022-09に更新されたGPGキー後に破損した可能性があります。 + +解決方法は、Yumのキャッシュとlibディレクトリをクリアすることです: + +```shell +sudo find /var/lib/yum/repos/ /var/cache/yum/ -name 'clickhouse-*' -type d -exec rm -rf {} + +sudo rm -f /etc/yum.repos.d/clickhouse.repo +``` + +その後、[インストールガイド](../getting-started/install.md#from-rpm-packages)に従ってください。 + +## サーバーへの接続 + +可能性のある問題: + +- サーバーが稼働していない。 +- 予期せぬ、または間違った構成パラメータ。 + +### サーバーが稼働していない + +#### サーバーが稼働しているか確認 + +```shell +sudo service clickhouse-server status +``` + +サーバーが稼働していない場合は、次のコマンドで開始してください: + +```shell +sudo service clickhouse-server start +``` + +#### ログを確認 + +`clickhouse-server`のメインログはデフォルトで`/var/log/clickhouse-server/clickhouse-server.log`にあります。 + +サーバーが正常に開始した場合、次の文字列が表示されます: + +- ` Application: starting up.` — サーバーが開始されました。 +- ` Application: Ready for connections.` — サーバーが稼働中で接続可能です。 + +構成エラーで`clickhouse-server`の開始が失敗した場合、``文字列とエラーの説明が表示されます。例: + +```plaintext +2019.01.11 15:23:25.549505 [ 45 ] {} ExternalDictionaries: Failed reloading 'event2id' external dictionary: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused +``` + +ファイルの末尾にエラーが表示されない場合は、次の文字列からファイル全体を確認してください: + +```plaintext + Application: starting up. +``` + +サーバーに`clickhouse-server`の2番目のインスタンスを開始しようとすると、次のログが表示されます: + +```plaintext +2019.01.11 15:25:11.151730 [ 1 ] {} : Starting ClickHouse 19.1.0 with revision 54413 +2019.01.11 15:25:11.154578 [ 1 ] {} Application: starting up +2019.01.11 15:25:11.156361 [ 1 ] {} StatusFile: Status file ./status already exists - unclean restart. Contents: +PID: 8510 +Started at: 2019-01-11 15:24:23 +Revision: 54413 + +2019.01.11 15:25:11.156673 [ 1 ] {} Application: DB::Exception: Cannot lock file ./status. Another server instance in same directory is already running. +2019.01.11 15:25:11.156682 [ 1 ] {} Application: shutting down +2019.01.11 15:25:11.156686 [ 1 ] {} Application: Uninitializing subsystem: Logging Subsystem +2019.01.11 15:25:11.156716 [ 2 ] {} BaseDaemon: Stop SignalListener thread +``` + +#### system.dログを確認 + +`clickhouse-server`ログに有用な情報が見つからない場合、またはログがない場合は、次のコマンドを使用して`system.d`ログを確認できます: + +```shell +sudo journalctl -u clickhouse-server +``` + +#### インタラクティブモードでclickhouse-serverを起動 + +```shell +sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml +``` + +このコマンドは、autostartスクリプトの標準パラメータを使用してサーバーをインタラクティブアプリとして起動します。このモードでは、`clickhouse-server`はすべてのイベントメッセージをコンソールに表示します。 + +### 構成パラメータ + +確認事項: + +1. Dockerの設定: + + - DockerでClickHouseを実行する際にIPv6ネットワークを使用する場合、`network=host`が設定されていることを確認してください。 + +1. エンドポイントの設定。 + - [listen_host](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-listen_host)と[tcp_port](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port)の設定を確認してください。 + - ClickHouseサーバーはデフォルトでlocalhost接続のみ受け入れます。 + +1. HTTPプロトコルの設定: + + - HTTP APIのプロトコル設定を確認します。 + +1. セキュア接続の設定。 + + - 次を確認してください: + - [tcp_port_secure](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-tcp_port_secure)の設定。 + - [SSL証明書](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-openssl)の設定。 + - 接続する際には適切なパラメータを使用してください。例えば、`clickhouse_client`には`port_secure`パラメータを使用します。 + +1. ユーザー設定: + + - 間違ったユーザー名またはパスワードを使用している可能性があります。 + +## クエリ処理 + +ClickHouseがクエリを処理できない場合、クライアントにエラーの説明を送信します。`clickhouse-client`では、コンソールにエラーの説明が表示されます。HTTPインターフェースを使用している場合、ClickHouseは応答ボディにエラーの説明を送信します。例えば: + +```shell +$ curl 'http://localhost:8123/' --data-binary "SELECT a" +Code: 47, e.displayText() = DB::Exception: Unknown identifier: a. Note that there are no tables (FROM clause) in your query, context: required_names: 'a' source_tables: table_aliases: private_aliases: column_aliases: public_columns: 'a' masked_columns: array_join_columns: source_columns: , e.what() = DB::Exception +``` + +`stack-trace`パラメータで`clickhouse-client`を起動すると、エラーの説明と共にサーバーのスタックトレースが返されます。 + +接続が切断されたというメッセージを見ることがあります。この場合、クエリを再実行することができます。クエリを実行するたびに接続が切断される場合は、サーバーログでエラーを確認してください。 + +## クエリ処理の効率 + +ClickHouseが非常に遅く動作している場合、クエリに対するサーバーのリソースとネットワーク負荷をプロファイルする必要があります。 + +clickhouse-benchmarkユーティリティを使用してクエリをプロファイルできます。これは、1秒あたりに処理されるクエリの数、1秒あたりに処理される行の数、およびクエリ処理時間のパーセンタイルを表示します。 diff --git a/docs/ja/guides/writing-queries.md b/docs/ja/guides/writing-queries.md new file mode 100644 index 00000000000..0830338a071 --- /dev/null +++ b/docs/ja/guides/writing-queries.md @@ -0,0 +1,57 @@ +--- +sidebar_position: 3 +sidebar_label: SELECT クエリ +--- + +# ClickHouse の SELECT クエリ + +ClickHouse は SQL データベースであり、データのクエリは既にお馴染みの `SELECT` クエリを書くことで行えます。例えば以下のように使用します: + +```sql +SELECT * +FROM helloworld.my_first_table +ORDER BY timestamp +``` + +:::note +構文や利用可能な句、オプションの詳細については、[SQL リファレンス](../sql-reference/statements/select/index.md) を参照してください。 +::: + +応答はきれいなテーブル形式で返ってくることに注目してください: + +```response +┌─user_id─┬─message────────────────────────────────────────────┬───────────timestamp─┬──metric─┐ +│ 102 │ Insert a lot of rows per batch │ 2022-03-21 00:00:00 │ 1.41421 │ +│ 102 │ Sort your data based on your commonly-used queries │ 2022-03-22 00:00:00 │ 2.718 │ +│ 101 │ Hello, ClickHouse! │ 2022-03-22 14:04:09 │ -1 │ +│ 101 │ Granules are the smallest chunks of data read │ 2022-03-22 14:04:14 │ 3.14159 │ +└─────────┴────────────────────────────────────────────────────┴─────────────────────┴─────────┘ + +4 rows in set. Elapsed: 0.008 sec. +``` + +`FORMAT` 句を追加して、ClickHouseでサポートされている多くの出力フォーマットの一つを指定することができます: + +```sql +SELECT * +FROM helloworld.my_first_table +ORDER BY timestamp +FORMAT TabSeparated +``` + +上記のクエリでは、出力はタブ区切りで返されます: + +```response +Query id: 3604df1c-acfd-4117-9c56-f86c69721121 + +102 Insert a lot of rows per batch 2022-03-21 00:00:00 1.41421 +102 Sort your data based on your commonly-used queries 2022-03-22 00:00:00 2.718 +101 Hello, ClickHouse! 2022-03-22 14:04:09 -1 +101 Granules are the smallest chunks of data read 2022-03-22 14:04:14 3.14159 + +4 rows in set. Elapsed: 0.005 sec. +``` + +:::note +ClickHouse は 70 以上の入力および出力フォーマットをサポートしており、数千の関数とすべてのデータフォーマットとの組み合わせで、ClickHouse を使用して印象的で高速な ETL のようなデータ変換を実行できます。実際、データを変換するために ClickHouse サーバーを起動する必要すらありません。`clickhouse-local` ツールを使用できます。詳細は、[`clickhouse-local` のドキュメントページ](../operations/utilities/clickhouse-local.md)を参照してください。 +::: diff --git a/docs/ja/home_links/deployment_links.json b/docs/ja/home_links/deployment_links.json new file mode 100644 index 00000000000..7ba64e7041c --- /dev/null +++ b/docs/ja/home_links/deployment_links.json @@ -0,0 +1,14 @@ +[ + { + "title": "Quick Start", + "description": "Get up and running on ClickHouse in minutes, explore some sample data, and build your solution", + "url": "/docs/ja/quick-start/", + "background": "cloud" + }, + { + "title": "Tutorials and Sample Datasets", + "description": "From taxi rides to property prices, learn how to get data into ClickHouse and model it for query performance", + "url": "/docs/ja/getting-started/example-datasets/", + "background": "cloud" + } +] diff --git a/docs/ja/home_links/links_101.json b/docs/ja/home_links/links_101.json new file mode 100644 index 00000000000..4cb92c40b2c --- /dev/null +++ b/docs/ja/home_links/links_101.json @@ -0,0 +1,27 @@ +[ + { + "title": "SQL reference", + "description": "Learn the statements, functions, and data types that are available", + "url": "/docs/ja/sql-reference" + }, + { + "title": "Ingest data", + "description": "Explore the many ways to get data into ClickHouse", + "url": "/docs/ja/integrations/data-ingestion/" + }, + { + "title": "Visualize data", + "description": "Now that your data is in ClickHouse, it's time to analyze it", + "url": "/docs/ja/integrations/data-visualization/" + }, + { + "title": "Optimize data", + "description": "Ways to improve the performance of your ClickHouse service", + "url": "/docs/ja/optimize/" + }, + { + "title": "Migrate data", + "description": "Importing your data from an external source into ClickHouse", + "url": "/docs/ja/integrations/migration/" + } +] diff --git a/docs/ja/images/column-oriented.gif b/docs/ja/images/column-oriented.gif new file mode 100644 index 00000000000..22ce122042c Binary files /dev/null and b/docs/ja/images/column-oriented.gif differ diff --git a/docs/ja/images/logo.png b/docs/ja/images/logo.png new file mode 100644 index 00000000000..552637796d6 Binary files /dev/null and b/docs/ja/images/logo.png differ diff --git a/docs/ja/images/logo.svg b/docs/ja/images/logo.svg new file mode 100644 index 00000000000..b5ab923ff65 --- /dev/null +++ b/docs/ja/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/images/play.png b/docs/ja/images/play.png new file mode 100644 index 00000000000..ddd78c55e32 Binary files /dev/null and b/docs/ja/images/play.png differ diff --git a/docs/ja/images/quickstart/CloudClickhouseClientDetails.png b/docs/ja/images/quickstart/CloudClickhouseClientDetails.png new file mode 100644 index 00000000000..3fe04d9f843 Binary files /dev/null and b/docs/ja/images/quickstart/CloudClickhouseClientDetails.png differ diff --git a/docs/ja/images/quickstart/SQLConsole.png b/docs/ja/images/quickstart/SQLConsole.png new file mode 100644 index 00000000000..243b7683715 Binary files /dev/null and b/docs/ja/images/quickstart/SQLConsole.png differ diff --git a/docs/ja/images/quickstart/ServiceDetails.png b/docs/ja/images/quickstart/ServiceDetails.png new file mode 100644 index 00000000000..3555d1f8013 Binary files /dev/null and b/docs/ja/images/quickstart/ServiceDetails.png differ diff --git a/docs/ja/images/quickstart/Services.png b/docs/ja/images/quickstart/Services.png new file mode 100644 index 00000000000..35239b26862 Binary files /dev/null and b/docs/ja/images/quickstart/Services.png differ diff --git a/docs/ja/images/quickstart/ShowDatabases.png b/docs/ja/images/quickstart/ShowDatabases.png new file mode 100644 index 00000000000..e22ceaa15e6 Binary files /dev/null and b/docs/ja/images/quickstart/ShowDatabases.png differ diff --git a/docs/ja/images/quickstart_01.png b/docs/ja/images/quickstart_01.png new file mode 100644 index 00000000000..2ace0859bd1 Binary files /dev/null and b/docs/ja/images/quickstart_01.png differ diff --git a/docs/ja/images/quickstart_02.png b/docs/ja/images/quickstart_02.png new file mode 100644 index 00000000000..5fc561441e5 Binary files /dev/null and b/docs/ja/images/quickstart_02.png differ diff --git a/docs/ja/images/quickstart_03.png b/docs/ja/images/quickstart_03.png new file mode 100644 index 00000000000..51ef33fa610 Binary files /dev/null and b/docs/ja/images/quickstart_03.png differ diff --git a/docs/ja/images/quickstart_04.png b/docs/ja/images/quickstart_04.png new file mode 100644 index 00000000000..0a29219d3a8 Binary files /dev/null and b/docs/ja/images/quickstart_04.png differ diff --git a/docs/ja/images/row-oriented.gif b/docs/ja/images/row-oriented.gif new file mode 100644 index 00000000000..78ff99523a9 Binary files /dev/null and b/docs/ja/images/row-oriented.gif differ diff --git a/docs/ja/images/sql-console-access-queries.png b/docs/ja/images/sql-console-access-queries.png new file mode 100644 index 00000000000..55286fa01de Binary files /dev/null and b/docs/ja/images/sql-console-access-queries.png differ diff --git a/docs/ja/images/sql-console-add-team.png b/docs/ja/images/sql-console-add-team.png new file mode 100644 index 00000000000..c186cad24d2 Binary files /dev/null and b/docs/ja/images/sql-console-add-team.png differ diff --git a/docs/ja/images/sql-console-edit-access.png b/docs/ja/images/sql-console-edit-access.png new file mode 100644 index 00000000000..3093ba2f52a Binary files /dev/null and b/docs/ja/images/sql-console-edit-access.png differ diff --git a/docs/ja/images/sql-console-edit-member.png b/docs/ja/images/sql-console-edit-member.png new file mode 100644 index 00000000000..22af2ec301a Binary files /dev/null and b/docs/ja/images/sql-console-edit-member.png differ diff --git a/docs/ja/images/sql-console-rename.png b/docs/ja/images/sql-console-rename.png new file mode 100644 index 00000000000..0da0f86bff4 Binary files /dev/null and b/docs/ja/images/sql-console-rename.png differ diff --git a/docs/ja/images/sql-console-save-query.png b/docs/ja/images/sql-console-save-query.png new file mode 100644 index 00000000000..82689a9f1a4 Binary files /dev/null and b/docs/ja/images/sql-console-save-query.png differ diff --git a/docs/ja/images/sql-console-share.png b/docs/ja/images/sql-console-share.png new file mode 100644 index 00000000000..9502b824c5e Binary files /dev/null and b/docs/ja/images/sql-console-share.png differ diff --git a/docs/ja/integrations/cli.mdx b/docs/ja/integrations/cli.mdx new file mode 100644 index 00000000000..fd89f1852c8 --- /dev/null +++ b/docs/ja/integrations/cli.mdx @@ -0,0 +1,12 @@ +--- +sidebar_position: 30 +sidebar_label: clickhouse-client +title: clickhouse-client +slug: /ja/integrations/sql-clients/cli +--- + +import Content from '@site/docs/ja/interfaces/cli.md'; + + + + diff --git a/docs/ja/integrations/clickhouse-client-local.md b/docs/ja/integrations/clickhouse-client-local.md new file mode 100644 index 00000000000..3e7f99760d1 --- /dev/null +++ b/docs/ja/integrations/clickhouse-client-local.md @@ -0,0 +1,62 @@ +--- +sidebar_position: 20 +slug: /ja/integrations/sql-clients/clickhouse-client-local +sidebar_label: コマンドラインインターフェース (CLI) +--- + +# コマンドラインインターフェース (CLI) + +`clickhouse client` はコマンドラインからClickHouseに接続するために使用されるクライアントアプリケーションです。`clickhouse local` はディスク上およびネットワーク越しにファイルをクエリするために使用されるクライアントアプリケーションです。ClickHouseのドキュメントの多くのガイドでは、`clickhouse local`を使用してファイル(CSV、TSV、Parquetなど)のスキーマを調べ、そのファイルをクエリし、データを操作してClickHouseへの挿入の準備をする方法を説明しています。`clickhouse local`でファイルをクエリし、その出力を`clickhouse client`にパイプで渡してClickHouseにデータをストリームすることもよくあります。このドキュメントの最後の「次のステップ」セクションでは、`clickhouse client` と `clickhouse local` の両方を使用した例のデータセットを紹介しています。 + +:::tip +もし既にローカルにClickHouseサーバーをインストールしている場合は、**clickhouse client** と **clickhouse local** がインストールされているかもしれません。コマンドラインで **clickhouse client** と **clickhouse local** を実行して確認してください。そうでない場合は、あなたのオペレーティングシステムに対するインストール手順を確認してください。 +::: + + +## Microsoft Windowsの前提条件 + +Windows 10または11でWindows Subsystem for Linux (WSL) Version 2 (WSL 2) を使用すると、Ubuntu Linuxを実行でき、その上で`clickhouse client` および `clickhouse local`を実行することができます。 + +Microsoftの[WSLドキュメント](https://docs.microsoft.com/en-us/windows/wsl/install)に従ってWSLをインストールしてください。 + +#### WSL 2でシェルを開く: + +ターミナルから `bash` コマンドを実行すると、WSLに入ります: + +```bash +bash +``` + +## ClickHouseのダウンロード + +``` +curl https://clickhouse.com/ | sh +``` + +## `clickhouse client` の確認 + +```bash +./clickhouse client +``` +:::note +`clickhouse client` はローカルのClickHouseサーバーインスタンスに接続しようとしますが、実行中でない場合はタイムアウトします。[`clickhouse-client`](/docs/ja/integrations/cli.mdx) ドキュメントを参照して例を見てください。 +::: + +## `clickhouse local` の確認 + +```bash +./clickhouse local +``` + +## 次のステップ +[`NYPD Complaint` データセット](/docs/ja/getting-started/example-datasets/nypd_complaint_data.md)で `clickhouse-client` と `clickhouse-local` の使用例を確認してください。 + +[`clickhouse-client`](/docs/ja/integrations/cli.mdx) ドキュメントを参照してください。 + +[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md) ドキュメントを参照してください。 + +[ClickHouseのインストール](/docs/ja/getting-started/install.md) ドキュメントを参照してください。 + +## 関連コンテンツ + +- ブログ: [`clickhouse-local`を使ったローカルファイルからのデータの抽出、変換、およびクエリ](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) diff --git a/docs/ja/integrations/data-ingestion/_category_.yml b/docs/ja/integrations/data-ingestion/_category_.yml new file mode 100644 index 00000000000..430c6129eee --- /dev/null +++ b/docs/ja/integrations/data-ingestion/_category_.yml @@ -0,0 +1,8 @@ +position: 200 +label: 'Data ingestion' +collapsible: true +collapsed: true +link: + type: generated-index + title: Data ingestion + slug: /ja/integrations/data-ingestion diff --git a/docs/ja/integrations/data-ingestion/apache-spark/index.md b/docs/ja/integrations/data-ingestion/apache-spark/index.md new file mode 100644 index 00000000000..7d6d90790d4 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/apache-spark/index.md @@ -0,0 +1,484 @@ +--- +sidebar_label: Apache Spark +sidebar_position: 1 +slug: /ja/integrations/apache-spark/ +description: ClickHouseとApache Sparkの統合の紹介 +keywords: [ clickhouse, apache, spark, migrating, data ] +--- + +# ClickHouseとApache Sparkの統合 + +[Apache Spark](https://spark.apache.org/) Apache Spark™は、シングルノードマシンまたはクラスターでデータエンジニアリング、データサイエンス、および機械学習を実行するための多言語エンジンです。 + +Apache SparkとClickHouseを接続する主な方法は2つあります: + +1. [Spark Connector](#spark-connector) - Sparkコネクタは`DataSourceV2`を実装し、独自のカタログ管理を備えています。現在、ClickHouseとSparkを統合する推奨方法です。 +2. [Spark JDBC](#spark-jdbc) - [JDBCデータソース](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html)を使用してSparkとClickHouseを統合します。 + +## Spark Connector + +このコネクタは、高度なパーティショニングや述語プッシュダウンなど、ClickHouseに特化した最適化を活用してクエリ性能やデータ処理を向上させます。コネクタは[ClickHouseの公式JDBCコネクタ](https://github.com/ClickHouse/clickhouse-java)に基づいており、独自のカタログを管理します。 + +### 要件 + +- Java 8または17 +- Scala 2.12または2.13 +- Apache Spark 3.3または3.4または3.5 + +### 互換性マトリックス + +| バージョン | 互換性のあるSparkバージョン | ClickHouse JDBCバージョン | +|------------|-----------------------------|---------------------------| +| main | Spark 3.3, 3.4, 3.5 | 0.6.3 | +| 0.8.0 | Spark 3.3, 3.4, 3.5 | 0.6.3 | +| 0.7.3 | Spark 3.3, 3.4 | 0.4.6 | +| 0.6.0 | Spark 3.3 | 0.3.2-patch11 | +| 0.5.0 | Spark 3.2, 3.3 | 0.3.2-patch11 | +| 0.4.0 | Spark 3.2, 3.3 | 依存なし | +| 0.3.0 | Spark 3.2, 3.3 | 依存なし | +| 0.2.1 | Spark 3.2 | 依存なし | +| 0.1.2 | Spark 3.2 | 依存なし | + +### ライブラリのダウンロード + +バイナリJARの名前パターンは: + +``` +clickhouse-spark-runtime-${spark_binary_version}_${scala_binary_version}-${version}.jar +``` + +すべてのリリースされたJARは[Maven Central Repository](https://repo1.maven.org/maven2/com/clickhouse/spark/)で見つけることができ、すべてのデイリービルドのSNAPSHOT JARは[Sonatype OSS Snapshots Repository](https://s01.oss.sonatype.org/content/repositories/snapshots/com/clickhouse/)で確認できます。 + +### 依存関係としてのインポート + +#### Gradle + +``` +dependencies { + implementation("com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}") + implementation("com.clickhouse:clickhouse-jdbc:{{ clickhouse_jdbc_version }}:all") { transitive = false } +} +``` + +SNAPSHOTバージョンを使用したい場合は、次のリポジトリを追加します: + +``` +repositories { + maven { url = "https://s01.oss.sonatype.org/content/repositories/snapshots" } +} +``` + +#### Maven + +``` + + com.clickhouse.spark + clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }} + {{ stable_version }} + + + com.clickhouse + clickhouse-jdbc + all + {{ clickhouse_jdbc_version }} + + + * + * + + + +``` + +SNAPSHOTバージョンを使用したい場合は、次のリポジトリを追加します。 + +``` + + + sonatype-oss-snapshots + Sonatype OSS Snapshots Repository + https://s01.oss.sonatype.org/content/repositories/snapshots + + +``` + +## Spark SQLで遊ぶ + +注意:SQLのみの使用例に対しては、[Apache Kyuubi](https://github.com/apache/kyuubi)を本番環境で使用することが推奨されます。 + +### Spark SQL CLIの起動 + +```shell +$SPARK_HOME/bin/spark-sql \ + --conf spark.sql.catalog.clickhouse=com.clickhouse.spark.ClickHouseCatalog \ + --conf spark.sql.catalog.clickhouse.host=${CLICKHOUSE_HOST:-127.0.0.1} \ + --conf spark.sql.catalog.clickhouse.protocol=http \ + --conf spark.sql.catalog.clickhouse.http_port=${CLICKHOUSE_HTTP_PORT:-8123} \ + --conf spark.sql.catalog.clickhouse.user=${CLICKHOUSE_USER:-default} \ + --conf spark.sql.catalog.clickhouse.password=${CLICKHOUSE_PASSWORD:-} \ + --conf spark.sql.catalog.clickhouse.database=default \ + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +次の引数 + +``` + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +は次のように置き換えることができます + +``` + --repositories https://{maven-cental-mirror or private-nexus-repo} \ + --packages com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }},com.clickhouse:clickhouse-jdbc:{{ clickhouse_jdbc_version }}:all +``` + +これにより、JARをSparkクライアントノードにコピーする必要がなくなります。 + +## 操作 + +基本的な操作、例えばデータベースの作成、テーブルの作成、テーブルへの書き込み、テーブルの読み込みなど。 + +``` +spark-sql> use clickhouse; +Time taken: 0.016 seconds + +spark-sql> create database if not exists test_db; +Time taken: 0.022 seconds + +spark-sql> show databases; +default +system +test_db +Time taken: 0.289 seconds, Fetched 3 row(s) + +spark-sql> CREATE TABLE test_db.tbl_sql ( + > create_time TIMESTAMP NOT NULL, + > m INT NOT NULL COMMENT 'part key', + > id BIGINT NOT NULL COMMENT 'sort key', + > value STRING + > ) USING ClickHouse + > PARTITIONED BY (m) + > TBLPROPERTIES ( + > engine = 'MergeTree()', + > order_by = 'id', + > settings.index_granularity = 8192 + > ); +Time taken: 0.242 seconds + +spark-sql> insert into test_db.tbl_sql values + > (timestamp'2021-01-01 10:10:10', 1, 1L, '1'), + > (timestamp'2022-02-02 10:10:10', 2, 2L, '2') + > as tabl(create_time, m, id, value); +Time taken: 0.276 seconds + +spark-sql> select * from test_db.tbl_sql; +2021-01-01 10:10:10 1 1 1 +2022-02-02 10:10:10 2 2 2 +Time taken: 0.116 seconds, Fetched 2 row(s) + +spark-sql> insert into test_db.tbl_sql select * from test_db.tbl_sql; +Time taken: 1.028 seconds + +spark-sql> insert into test_db.tbl_sql select * from test_db.tbl_sql; +Time taken: 0.462 seconds + +spark-sql> select count(*) from test_db.tbl_sql; +6 +Time taken: 1.421 seconds, Fetched 1 row(s) + +spark-sql> select * from test_db.tbl_sql; +2021-01-01 10:10:10 1 1 1 +2021-01-01 10:10:10 1 1 1 +2021-01-01 10:10:10 1 1 1 +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +Time taken: 0.123 seconds, Fetched 6 row(s) + +spark-sql> delete from test_db.tbl_sql where id = 1; +Time taken: 0.129 seconds + +spark-sql> select * from test_db.tbl_sql; +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +2022-02-02 10:10:10 2 2 2 +Time taken: 0.101 seconds, Fetched 3 row(s) +``` + +## Spark Shellで遊ぶ + +### Spark Shellの起動 + +```shell +$SPARK_HOME/bin/spark-shell \ + --conf spark.sql.catalog.clickhouse=com.clickhouse.spark.ClickHouseCatalog \ + --conf spark.sql.catalog.clickhouse.host=${CLICKHOUSE_HOST:-127.0.0.1} \ + --conf spark.sql.catalog.clickhouse.protocol=http \ + --conf spark.sql.catalog.clickhouse.http_port=${CLICKHOUSE_HTTP_PORT:-8123} \ + --conf spark.sql.catalog.clickhouse.user=${CLICKHOUSE_USER:-default} \ + --conf spark.sql.catalog.clickhouse.password=${CLICKHOUSE_PASSWORD:-} \ + --conf spark.sql.catalog.clickhouse.database=default \ + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +次の引数 + +``` + --jars /path/clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }}.jar,/path/clickhouse-jdbc-{{ clickhouse_jdbc_version }}-all.jar +``` + +は次のように置き換えることができます + +``` + --repositories https://{maven-cental-mirror or private-nexus-repo} \ + --packages com.clickhouse.spark:clickhouse-spark-runtime-{{ spark_binary_version }}_{{ scala_binary_version }}:{{ stable_version }},com.clickhouse:clickhouse-jdbc:{{ clickhouse_jdbc_version }}:all +``` + +これにより、JARをSparkクライアントノードにコピーする必要がなくなります。 + +### 操作 + +基本的な操作、例えばデータベースの作成、テーブルの作成、テーブルへの書き込み、テーブルの読み込みなど。 + +``` +scala> spark.sql("use clickhouse") +res0: org.apache.spark.sql.DataFrame = [] + +scala> spark.sql("create database test_db") +res1: org.apache.spark.sql.DataFrame = [] + +scala> spark.sql("show databases").show ++---------+ +|namespace| ++---------+ +| default| +| system| +| test_db| ++---------+ + +scala> spark.sql(""" + | CREATE TABLE test_db.tbl ( + | create_time TIMESTAMP NOT NULL, + | m INT NOT NULL COMMENT 'part key', + | id BIGINT NOT NULL COMMENT 'sort key', + | value STRING + | ) USING ClickHouse + | PARTITIONED BY (m) + | TBLPROPERTIES ( + | engine = 'MergeTree()', + | order_by = 'id', + | settings.index_granularity = 8192 + | ) + | """) +res2: org.apache.spark.sql.DataFrame = [] + +scala> :paste +// Pasteモードに入ります(ctrl-Dで終了) + +spark.createDataFrame(Seq( + ("2021-01-01 10:10:10", 1L, "1"), + ("2022-02-02 10:10:10", 2L, "2") +)).toDF("create_time", "id", "value") + .withColumn("create_time", to_timestamp($"create_time")) + .withColumn("m", month($"create_time")) + .select($"create_time", $"m", $"id", $"value") + .writeTo("test_db.tbl") + .append + +// Pasteモードを終了し、現在解釈中です。 + +scala> spark.table("test_db.tbl").show ++-------------------+---+---+-----+ +| create_time| m| id|value| ++-------------------+---+---+-----+ +|2021-01-01 10:10:10| 1| 1| 1| +|2022-02-02 10:10:10| 2| 2| 2| ++-------------------+---+---+-----+ + +scala> spark.sql("DELETE FROM test_db.tbl WHERE id=1") +res3: org.apache.spark.sql.DataFrame = [] + +scala> spark.table("test_db.tbl").show ++-------------------+---+---+-----+ +| create_time| m| id|value| ++-------------------+---+---+-----+ +|2022-02-02 10:10:10| 2| 2| 2| ++-------------------+---+---+-----+ +``` + +ClickHouseのネイティブSQLを実行します。 + +``` +scala> val options = Map( + | "host" -> "clickhouse", + | "protocol" -> "http", + | "http_port" -> "8123", + | "user" -> "default", + | "password" -> "" + | ) + +scala> val sql = """ + | |CREATE TABLE test_db.person ( + | | id Int64, + | | name String, + | | age Nullable(Int32) + | |) + | |ENGINE = MergeTree() + | |ORDER BY id + | """.stripMargin + +scala> spark.executeCommand("com.clickhouse.spark.ClickHouseCommandRunner", sql, options) + +scala> spark.sql("show tables in clickhouse_s1r1.test_db").show ++---------+---------+-----------+ +|namespace|tableName|isTemporary| ++---------+---------+-----------+ +| test_db| person| false| ++---------+---------+-----------+ + +scala> spark.table("clickhouse_s1r1.test_db.person").printSchema +root + |-- id: long (nullable = false) + |-- name: string (nullable = false) + |-- age: integer (nullable = true) +``` + +## サポートされているデータ型 + +このセクションでは、SparkとClickHouse間のデータ型のマッピングについて説明します。以下の表は、ClickHouseからSparkにデータを読み取る際のデータ型の変換や、SparkからClickHouseにデータを挿入する際の変換のクイックリファレンスを提供します。 + +### ClickHouseからSparkへのデータ読み込み + +| ClickHouse データ型 | Spark データ型 | サポートされている | プリミティブか | メモ | +|-----------------------------------------------------------------|-------------------------------|-------------------|--------------|-------------------------------------------| +| `Nothing` | `NullType` | ✅ | Yes | | +| `Bool` | `BooleanType` | ✅ | Yes | | +| `UInt8`, `Int16` | `ShortType` | ✅ | Yes | | +| `Int8` | `ByteType` | ✅ | Yes | | +| `UInt16`,`Int32` | `IntegerType` | ✅ | Yes | | +| `UInt32`,`Int64`, `UInt64` | `LongType` | ✅ | Yes | | +| `Int128`,`UInt128`, `Int256`, `UInt256` | `DecimalType(38, 0)` | ✅ | Yes | | +| `Float32` | `FloatType` | ✅ | Yes | | +| `Float64` | `DoubleType` | ✅ | Yes | | +| `String`, `JSON`, `UUID`, `Enum8`, `Enum16`, `IPv4`, `IPv6` | `StringType` | ✅ | Yes | | +| `FixedString` | `BinaryType`, `StringType` | ✅ | Yes | 設定 `READ_FIXED_STRING_AS` で制御されます | +| `Decimal` | `DecimalType` | ✅ | Yes | 精度とスケールは `Decimal128` まで可能 | +| `Decimal32` | `DecimalType(9, scale)` | ✅ | Yes | | +| `Decimal64` | `DecimalType(18, scale)` | ✅ | Yes | | +| `Decimal128` | `DecimalType(38, scale)` | ✅ | Yes | | +| `Date`, `Date32` | `DateType` | ✅ | Yes | | +| `DateTime`, `DateTime32`, `DateTime64` | `TimestampType` | ✅ | Yes | | +| `Array` | `ArrayType` | ✅ | No | 配列要素の型も変換されます | +| `Map` | `MapType` | ✅ | No | キーは `StringType` に制限されます | +| `IntervalYear` | `YearMonthIntervalType(Year)` | ✅ | Yes | | +| `IntervalMonth` | `YearMonthIntervalType(Month)`| ✅ | Yes | | +| `IntervalDay`, `IntervalHour`, `IntervalMinute`, `IntervalSecond`| `DayTimeIntervalType` | ✅ | No | 特定の間隔型が使用されます | +| `Object` | | ❌ | | | +| `Nested` | | ❌ | | | +| `Tuple` | | ❌ | | | +| `Point` | | ❌ | | | +| `Polygon` | | ❌ | | | +| `MultiPolygon` | | ❌ | | | +| `Ring` | | ❌ | | | +| `IntervalQuarter` | | ❌ | | | +| `IntervalWeek` | | ❌ | | | +| `Decimal256` | | ❌ | | | +| `AggregateFunction` | | ❌ | | | +| `SimpleAggregateFunction` | | ❌ | | | + +### SparkからClickHouseへのデータ挿入 + +| Spark データ型 | ClickHouse データ型 | サポートされている | プリミティブか | メモ | +|--------------------------------------|--------------------|-------------------|--------------|--------------------------------------| +| `BooleanType` | `UInt8` | ✅ | Yes | | +| `ByteType` | `Int8` | ✅ | Yes | | +| `ShortType` | `Int16` | ✅ | Yes | | +| `IntegerType` | `Int32` | ✅ | Yes | | +| `LongType` | `Int64` | ✅ | Yes | | +| `FloatType` | `Float32` | ✅ | Yes | | +| `DoubleType` | `Float64` | ✅ | Yes | | +| `StringType` | `String` | ✅ | Yes | | +| `VarcharType` | `String` | ✅ | Yes | | +| `CharType` | `String` | ✅ | Yes | | +| `DecimalType` | `Decimal(p, s)` | ✅ | Yes | 精度とスケールは `Decimal128` まで可能| +| `DateType` | `Date` | ✅ | Yes | | +| `TimestampType` | `DateTime` | ✅ | Yes | | +| `ArrayType` (リスト、タプル、配列) | `Array` | ✅ | No | 配列要素の型も変換されます | +| `MapType` | `Map` | ✅ | No | キーは `StringType` に制限されます | +| `Object` | | ❌ | | | +| `Nested` | | ❌ | | | + +## Spark JDBC + +Sparkでサポートされているデータソースの中で最もよく使われるのがJDBCです。このセクションでは、Sparkで[ClickHouse公式JDBCコネクタ](https://github.com/ClickHouse/clickhouse-java)を使用する方法について詳しく説明します。 + +### データの読み込み + +```java +public static void main(String[] args) { + // Sparkセッションの初期化 + SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate(); + + // JDBC接続の詳細 + String jdbcUrl = "jdbc:ch://localhost:8123/default"; + Properties jdbcProperties = new Properties(); + jdbcProperties.put("user", "default"); + jdbcProperties.put("password", "123456"); + + // ClickHouseからテーブルを読み込む + Dataset df = spark.read().jdbc(jdbcUrl, "example_table", jdbcProperties); + + // DataFrameを表示する + df.show(); + + // Sparkセッションを停止する + spark.stop(); + } +``` + +### データの書き込み + +:::important +現時点では、JDBCを使用して既存のテーブルにのみデータを挿入できます。 +::: + +```java + public static void main(String[] args) { + // Sparkセッションの初期化 + SparkSession spark = SparkSession.builder().appName("example").master("local").getOrCreate(); + + // JDBC接続の詳細 + String jdbcUrl = "jdbc:ch://localhost:8123/default"; + Properties jdbcProperties = new Properties(); + jdbcProperties.put("user", "default"); + jdbcProperties.put("password", "******"); + // サンプルDataFrameの作成 + StructType schema = new StructType(new StructField[]{ + DataTypes.createStructField("id", DataTypes.IntegerType, false), + DataTypes.createStructField("name", DataTypes.StringType, false) + }); + + List rows = new ArrayList(); + rows.add(RowFactory.create(1, "John")); + rows.add(RowFactory.create(2, "Doe")); + + Dataset df = spark.createDataFrame(rows, schema); + + df.write() + .mode(SaveMode.Append) + .jdbc(jdbcUrl, "my_table", jdbcProperties); + // DataFrameを表示する + df.show(); + + // Sparkセッションを停止する + spark.stop(); + } +``` + + + +:::important +Spark JDBCを使用する場合、Sparkは単一パーティションでデータを読み取ります。より高い並行性を達成するには、`partitionColumn`、`lowerBound`、`upperBound`、`numPartitions`を指定する必要があります。これらは、複数のワーカーから並行して読み取る際のテーブル分割を説明します。より詳細な情報については、Apache Sparkの公式ドキュメントで[JDBC構成](https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html#data-source-option)をご確認ください。 +::: + diff --git a/docs/ja/integrations/data-ingestion/aws-glue/index.md b/docs/ja/integrations/data-ingestion/aws-glue/index.md new file mode 100644 index 00000000000..6d5b742f9a9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/aws-glue/index.md @@ -0,0 +1,57 @@ +--- +sidebar_label: Amazon Glue +sidebar_position: 1 +slug: /ja/integrations/glue +description: ClickHouseとAmazon Glueの統合 +keywords: [ clickhouse, amazon, aws, glue, データ移行, data ] +--- + +# ClickHouseとAmazon Glueの統合 + +[Amazon Glue](https://aws.amazon.com/glue/)は、Amazon Web Services (AWS)が提供する完全に管理されたサーバーレスのデータ統合サービスです。これは、分析、機械学習、アプリケーション開発のためのデータの発見、準備、および変換のプロセスを簡素化します。 + +現在のところ、Glue用のClickHouseコネクタは利用できませんが、公式のJDBCコネクタを利用してClickHouseと接続および統合を行うことができます: + +```java +import com.amazonaws.services.glue.util.Job +import com.amazonaws.services.glue.util.GlueArgParser +import com.amazonaws.services.glue.GlueContext +import org.apache.spark.SparkContext +import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.DataFrame +import scala.collection.JavaConverters._ +import com.amazonaws.services.glue.log.GlueLogger + + +// Glueジョブの初期化 +object GlueJob { + def main(sysArgs: Array[String]) { + val sc: SparkContext = new SparkContext() + val glueContext: GlueContext = new GlueContext(sc) + val spark: SparkSession = glueContext.getSparkSession + val logger = new GlueLogger + import spark.implicits._ + // @params: [JOB_NAME] + val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) + Job.init(args("JOB_NAME"), glueContext, args.asJava) + + // JDBC接続の詳細 + val jdbcUrl = "jdbc:ch://{host}:{port}/{schema}" + val jdbcProperties = new java.util.Properties() + jdbcProperties.put("user", "default") + jdbcProperties.put("password", "*******") + jdbcProperties.put("driver", "com.clickhouse.jdbc.ClickHouseDriver") + + // ClickHouseからテーブルをロード + val df: DataFrame = spark.read.jdbc(jdbcUrl, "my_table", jdbcProperties) + + // Spark dfを表示、もしくは他の用途に使用 + df.show() + + // ジョブをコミット + Job.commit() + } +} +``` + +詳細については、[Spark & JDBC ドキュメント](/ja/integrations/apache-spark#read-data)をご覧ください。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/assets/static-ips.json b/docs/ja/integrations/data-ingestion/clickpipes/assets/static-ips.json new file mode 100644 index 00000000000..5d196b7a8fe --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/assets/static-ips.json @@ -0,0 +1 @@ +{"aws":[{"region":"eu-central-1","ips":["18.195.233.217","3.127.86.90","35.157.23.2","18.197.167.47","3.122.25.29","52.28.148.40"]},{"region":"us-east-1","ips":["54.82.38.199","3.90.133.29","52.5.177.8","3.227.227.145","3.216.6.184","54.84.202.92","3.131.130.196","3.23.172.68","3.20.208.150"]},{"region":"us-east-2","ips":["3.131.130.196","3.23.172.68","3.20.208.150","3.132.20.192","18.119.76.110","3.134.185.180"]}]} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/clickpipes_stack.png b/docs/ja/integrations/data-ingestion/clickpipes/images/clickpipes_stack.png new file mode 100644 index 00000000000..7f08f2c1d00 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/clickpipes_stack.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_custom_role.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_custom_role.png new file mode 100644 index 00000000000..507fdd441a3 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_custom_role.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_destination.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_destination.png new file mode 100644 index 00000000000..64b4a314e63 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_destination.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_final_table.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_final_table.png new file mode 100644 index 00000000000..7ca20e781fb Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_final_table.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_overview.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_overview.png new file mode 100644 index 00000000000..91cd2eb5e11 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_overview.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_remove.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_remove.png new file mode 100644 index 00000000000..52423d812c5 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_remove.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_service.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_service.png new file mode 100644 index 00000000000..fa1fc69e813 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_service.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step0.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step0.png new file mode 100644 index 00000000000..af048c35486 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step0.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step1.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step1.png new file mode 100644 index 00000000000..ca08187adf8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step1.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2.png new file mode 100644 index 00000000000..492a057d54f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_kinesis.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_kinesis.png new file mode 100644 index 00000000000..59ab4ac7165 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_kinesis.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_object_storage.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_object_storage.png new file mode 100644 index 00000000000..4a9d370c3de Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step2_object_storage.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3.png new file mode 100644 index 00000000000..85c2a7b78d8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_kinesis.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_kinesis.png new file mode 100644 index 00000000000..53eb2b11b49 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_kinesis.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_object_storage.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_object_storage.png new file mode 100644 index 00000000000..ef1ad26498f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step3_object_storage.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a.png new file mode 100644 index 00000000000..c260d7980a1 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a2.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a2.png new file mode 100644 index 00000000000..e68b467da2a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a2.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a3.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a3.png new file mode 100644 index 00000000000..72c78dbc64c Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4a3.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4b.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4b.png new file mode 100644 index 00000000000..b6189385511 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step4b.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step5.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step5.png new file mode 100644 index 00000000000..893daa81325 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_step5.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_success.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_success.png new file mode 100644 index 00000000000..1736d54c4e4 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_success.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/cp_table.png b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_table.png new file mode 100644 index 00000000000..7dbd0f9f488 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/cp_table.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/schema_registry_setup.png b/docs/ja/integrations/data-ingestion/clickpipes/images/schema_registry_setup.png new file mode 100644 index 00000000000..8be306e2230 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/schema_registry_setup.png differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg b/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg new file mode 100644 index 00000000000..ec3d716508d Binary files /dev/null and b/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg differ diff --git a/docs/ja/integrations/data-ingestion/clickpipes/index.md b/docs/ja/integrations/data-ingestion/clickpipes/index.md new file mode 100644 index 00000000000..2bab15746f9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/index.md @@ -0,0 +1,82 @@ +--- +sidebar_label: はじめに +description: 外部データソースをClickHouse Cloudにシームレスに接続します。 +slug: /ja/integrations/clickpipes +--- + +import KafkaSVG from "../../images/logos/kafka.svg"; +import ConfluentSVG from "../../images/logos/confluent.svg"; +import MskSVG from "../../images/logos/msk.svg"; +import AzureEventHubsSVG from "../../images/logos/azure_event_hubs.svg"; +import WarpStreamSVG from "../../images/logos/warpstream.svg"; +import S3SVG from "../../images/logos/amazon_s3_logo.svg"; +import AmazonKinesis from "../../images/logos/amazon_kinesis_logo.svg"; +import GCSSVG from "../../images/logos/gcs.svg"; + +# ClickHouse Cloudとの統合 + +## はじめに + +[ClickPipes](https://clickhouse.com/cloud/clickpipes)は、さまざまなソースからのデータをわずか数クリックで取り込むことを可能にする管理された統合プラットフォームです。最も要求の厳しいワークロード向けに設計されたClickPipesの堅牢でスケーラブルなアーキテクチャは、一貫したパフォーマンスと信頼性を保証します。ClickPipesは、長期的なストリーミングニーズにも、一度きりのデータローディングジョブにも使用できます。 + +![ClickPipesスタック](./images/clickpipes_stack.png) + +## 対応データソース + +|名前|ロゴ|タイプ|ステータス|説明| +|----|----|----|------|-----------| +|Apache Kafka||ストリーミング|安定|ClickPipesを設定し、Apache KafkaからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|Confluent Cloud||ストリーミング|安定|ConfluentとClickHouse Cloudの直接統合により、両者の組み合わせの力を引き出します。| +|Redpanda|Redpanda logo|ストリーミング|安定|ClickPipesを設定し、RedPandaからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|AWS MSK||ストリーミング|安定|ClickPipesを設定し、AWS MSKからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|Azure Event Hubs||ストリーミング|安定|ClickPipesを設定し、Azure Event HubsからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|WarpStream||ストリーミング|安定|ClickPipesを設定し、WarpStreamからClickHouse Cloudへストリーミングデータの取り込みを開始します。| +|Amazon S3||オブジェクトストレージ|安定|ClickPipesを設定し、大量のデータをオブジェクトストレージから取り込みます。| +|Google Cloud Storage||オブジェクトストレージ|安定|ClickPipesを設定し、大量のデータをオブジェクトストレージから取り込みます。| +|Amazon Kinesis||ストリーミング|安定|ClickPipesを設定し、Amazon KinesisからClickHouse Cloudへストリーミングデータの取り込みを開始します。| + +ClickPipesにはさらに多くのコネクタが追加されますので、詳細は[お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +## 固定IPリスト + +以下は、ClickPipesが各地域のKafkaブローカーに接続するために使用する固定NAT IPです。 +関連するインスタンスの地域IPをIP許可リストに追加して、トラフィックを許可してください。 +インスタンス地域がここにリストされていない場合は、デフォルトの地域にフォールバックします。 + +- EU地域用の **eu-central-1** +- `us-east-1` インスタンス用の **us-east-1** +- 他のすべての地域用の **us-east-2** + +| ClickHouse Cloud 地域 | IPアドレス | +|-----------------------|------------| +| **eu-central-1** | `18.195.233.217`, `3.127.86.90`, `35.157.23.2`, `18.197.167.47`, `3.122.25.29`, `52.28.148.40` | +| **us-east-2** | `3.131.130.196`, `3.23.172.68`, `3.20.208.150`, `3.132.20.192`, `18.119.76.110`, `3.134.185.180` | +| **us-east-1** | `54.82.38.199`, `3.90.133.29`, `52.5.177.8`, `3.227.227.145`, `3.216.6.184`, `54.84.202.92`, `3.131.130.196`, `3.23.172.68`, `3.20.208.150` | + +## ClickHouse設定の調整 +ClickHouse Cloudは、ほとんどのユースケースに対応するための適切なデフォルトを提供します。ただし、ClickPipesのために特定のClickHouse設定を調整する必要がある場合は、ClickPipes専用のロールを作成することが最も柔軟な解決策です。 +ステップ: +1. カスタムロールを作成します `CREATE ROLE my_clickpipes_role SETTINGS ...`。詳細については[CREATE ROLE](/docs/ja/sql-reference/statements/create/role.md)文法を参照してください。 +2. ClickPipes作成時の`Details and Settings`ステップで、ClickPipesユーザーにカスタムロールを追加します。 +![カスタムロールを割り当てる](./images/cp_custom_role.png) + +## エラーレポート +ClickPipesは、宛先テーブルの隣に`_clickpipes_error`という接尾辞を持つテーブルを作成します。このテーブルには、ClickPipeの操作(ネットワーク、接続性など)からのエラーや、スキーマに適合しないデータが含まれます。エラーテーブルには7日間の[有効期限 (TTL)](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)があります。 +ClickPipesが15分間ソースまたは宛先に接続できない場合、ClickPipesインスタンスは停止し、エラーテーブルに適切なメッセージを保存します(ClickHouseインスタンスが利用可能な場合)。 + +## よくある質問 +- **ClickPipesとは何ですか?** + + ClickPipesは、ユーザーがClickHouseサービスを外部データソース、特にKafkaに簡単に接続できるようにするClickHouse Cloudの機能です。Kafka向けのClickPipesを使用することで、ユーザーはClickHouseにデータを継続的にロードし、リアルタイム分析用に利用可能にします。 + +- **ClickPipesはデータ変換をサポートしていますか?** + + はい、ClickPipesはDDL作成を公開することで基本的なデータ変換をサポートしています。その後、ClickHouse Cloudサービスの宛先テーブルにデータがロードされる際に、ClickHouseの[マテリアライズドビューの機能](https://clickhouse.com/docs/ja/guides/developer/cascading-materialized-views)を活用して、より高度な変換を適用することができます。 + +- **ClickPipesの使用には追加のコストがかかりますか?** + + 現在、ClickPipesは別途請求されていません。ClickPipesを実行すると、他の取り込みワークロードと同様に、宛先ClickHouse Cloudサービスで間接的な計算およびストレージコストが発生する可能性があります。 + +- **Kafka用のClickPipesを使用する際にエラーや障害を処理する方法はありますか?** + + はい、Kafka用のClickPipesは、Kafkaからデータを消費する際に障害が発生した場合に自動的にリトライします。ClickPipesは、エラーや不正なデータを7日間保持する専用のエラーテーブルの有効化もサポートしています。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/kafka.md b/docs/ja/integrations/data-ingestion/clickpipes/kafka.md new file mode 100644 index 00000000000..ccc4980b4e7 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/kafka.md @@ -0,0 +1,274 @@ +--- +sidebar_label: Kafka用のClickPipes +description: Kafka データソースを ClickHouse Cloud とシームレスに接続します。 +slug: /ja/integrations/clickpipes/kafka +sidebar_position: 1 +--- + +import KafkaSVG from "../../images/logos/kafka.svg"; +import ConfluentSVG from "../../images/logos/confluent.svg"; +import MskSVG from "../../images/logos/msk.svg"; +import AzureEventHubsSVG from "../../images/logos/azure_event_hubs.svg"; +import WarpStreamSVG from "../../images/logos/warpstream.svg"; + +# Kafka と ClickHouse Cloud の統合 +## 前提条件 +[ClickPipes のイントロダクション](./index.md)を確認してください。 + +## 初めての Kafka ClickPipe の作成 + +1. ClickHouse Cloud サービスの SQL コンソールにアクセスします。 + + ![ClickPipes サービス](./images/cp_service.png) + +2. 左側のメニューで `Data Sources` ボタンを選択し、「Set up a ClickPipe」をクリックします。 + + ![インポートを選択](./images/cp_step0.png) + +3. データソースを選択します。 + + ![データソースタイプの選択](./images/cp_step1.png) + +4. フォームに、ClickPipe の名前、説明(オプション)、クレデンシャル、およびその他の接続詳細を入力します。 + + ![接続詳細の入力](./images/cp_step2.png) + +5. スキーマレジストリを設定します。Avro ストリームには有効なスキーマが必要で、JSON にはオプションです。このスキーマは、選択されたトピック上で [AvroConfluent](../../../interfaces/formats.md/#data-format-avro-confluent) を解析したり、JSON メッセージを検証するのに使用されます。 +- パースできない Avro メッセージや検証に失敗した JSON メッセージはエラーを生成します。 +- スキーマレジストリの「ルート」パス。例えば、Confluent Cloud のスキーマレジストリの URL は HTTPS の URL であり、パスがない形式です。例:`https://test-kk999.us-east-2.aws.confluent.cloud`。ルートパスのみが指定されている場合、スキーマはサンプルされた Kafka メッセージに埋め込まれた ID によってカラム名とタイプを決定します。 +- 数値スキーマ ID によるスキーマドキュメントのパス `/schemas/ids/[ID]`。スキーマ ID を使用した完全な URL は、`https://registry.example.com/schemas/ids/1000` のようになります。 +- サブジェクト名によるスキーマドキュメントのパス `/subjects/[subject_name]`。オプションで、特定のバージョンは URL に `/versions/[version]` を追加することで参照できます(そうでなければ、ClickPipes は最新バージョンを取得します)。スキーマサブジェクトを使用した完全な URL は、`https://registry.example.com/subjects/events` や `https://registry/example.com/subjects/events/versions/4` のようになります。 + +すべてのケースで、ClickPipes はメッセージに埋め込まれたスキーマ ID によって示された場合、レジストリから自動的に更新または異なるスキーマを取得します。メッセージが埋め込まれたスキーマ ID なしで書き込まれている場合、特定のスキーマ ID またはサブジェクトを指定して、すべてのメッセージを解析する必要があります。 + +6. トピックを選択し、UI がそのトピックのサンプルドキュメントを表示します。 + + ![データフォーマットとトピックの設定](./images/cp_step3.png) + +7. 次のステップで、新しい ClickHouse テーブルにデータを取り込むか、既存のものを再利用するかを選択できます。画面の指示に従い、テーブル名、スキーマ、設定を変更します。上部のサンプルテーブルで変更をリアルタイムでプレビューできます。 + + ![テーブル、スキーマ、および設定の設定](./images/cp_step4a.png) + + 指定されたコントロールを使用して、高度な設定をカスタマイズすることもできます。 + + ![高度なコントロールの設定](./images/cp_step4a3.png) + +8. あるいは、既存の ClickHouse テーブルにデータを取り込みたい場合、UI はソースから選択した宛先テーブルの ClickHouse フィールドにフィールドをマップすることを許可します。 + + ![既存のテーブルを使用](./images/cp_step4b.png) + +9. 最後に、内部クリックパイプスユーザーの権限を設定できます。 + + **権限:** ClickPipes は、宛先テーブルへのデータ書き込みのために専用のユーザーを作成します。この内部ユーザーには、カスタムロールまたは事前定義されたロールのいずれかを選択できます: + - `Full access`: クラスターへの完全なアクセスを許可します。Materialized View または Dictionary を宛先テーブルで使用する場合に有用です。 + - `Only destination table`: 宛先テーブルのみに `INSERT` 権限があります。 + + ![権限](./images/cp_step5.png) + +10. 「Complete Setup」をクリックすると、システムは ClickPipe を登録し、それがサマリーテーブルに表示されるようになります。 + + ![成功通知](./images/cp_success.png) + + ![削除通知](./images/cp_remove.png) + + サマリーテーブルは、ソースまたは ClickHouse の宛先テーブルからサンプルデータを表示するためのコントロールを提供します。 + + ![宛先を表示](./images/cp_destination.png) + + そして、ClickPipe を削除し、取り込みジョブの概要を表示するためのコントロールも提供します。 + + ![概要を表示](./images/cp_overview.png) + +11. **おめでとうございます!** 初めての ClickPipe を設定することができました。これがストリーミング ClickPipe であれば、リモートデータソースからのデータをリアルタイムで継続的に取り込みます。 + +## 対応データソース + +|名前|ロゴ|タイプ|ステータス|説明| +|----|----|----|------|-----------| +|Apache Kafka||ストリーミング|安定|ClickPipes を設定して、Apache Kafka から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|Confluent Cloud||ストリーミング|安定|Confluent と ClickHouse Cloud のパワーを直接統合により解放します。| +|Redpanda|Redpanda logo|ストリーミング|安定|ClickPipes を設定して、RedPanda から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|AWS MSK||ストリーミング|安定|ClickPipes を設定して、AWS MSK から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|Azure Event Hubs||ストリーミング|安定|ClickPipes を設定して、Azure Event Hubs から ClickHouse Cloud へストリーミングデータを取り込み始めます。| +|WarpStream||ストリーミング|安定|ClickPipes を設定して、WarpStream から ClickHouse Cloud へストリーミングデータを取り込み始めます。| + +ClickPipes に追加のコネクタが追加される予定です。詳細は[こちら](https://clickhouse.com/company/contact?loc=clickpipes)を参照してください。 + +## 対応するデータフォーマット + +対応フォーマットは次の通りです: +- [JSON](../../../interfaces/formats.md/#json) +- [AvroConfluent](../../../interfaces/formats.md/#data-format-avro-confluent) + +### 対応データタイプ + +現在 ClickPipes で対応している ClickHouse データタイプは次の通りです: + +- 基本数値型 - \[U\]Int8/16/32/64 および Float32/64 +- 大きな整数型 - \[U\]Int128/256 +- Decimal 型 +- Boolean +- String +- FixedString +- Date, Date32 +- DateTime, DateTime64 (UTC タイムゾーンのみ) +- Enum8/Enum16 +- UUID +- IPv4 +- IPv6 +- すべての ClickHouse LowCardinality 型 +- 上記の任意の型(Nullable を含む)をキーと値に使用した Map +- 上記の任意の型(Nullable を含む、1 階層のみ)を要素に使用した Tuple および Array + +### Avro +#### 対応する Avro データタイプ + +ClickPipes はすべての Avro プリミティブおよび複合型、`time-millis`、`time-micros`、`local-timestamp-millis`、`local_timestamp-micros`、および `duration` を除くすべての Avro 論理型をサポートしています。Avro `record` 型は Tuple に、`array` 型は Array に、`map` は Map(文字列キーのみ)に変換されます。一般的な変換は[こちら](../../../../en/interfaces/formats.md#data-types-matching)で示されています。Avro 数値型については、型変換におけるオーバーフローや精度損失をチェックしないため、正確な型一致をお勧めします。 + +#### Nullable 型と Avro ユニオン + +Avro における Nullable 型は `(T, null)` または `(null, T)` のユニオンスキーマを使用して定義されます。スキーマ推論中、このようなユニオンは ClickHouse の「Nullable」カラムにマップされます。ただし、ClickHouse は `Nullable(Array)`、`Nullable(Map)`、または `Nullable(Tuple)` 型をサポートしていません。これらの型に対する Avro の null ユニオンは、非 Nullable バージョンにマップされます(Avro Record 型は ClickHouse ネームド Tuple にマップされます)。これらの型に対する Avro の "null" は以下のように挿入されます: +- Null Avro 配列には空の Array +- Null Avro Map には空の Map +- Null Avro Record にはすべてがデフォルト/ゼロ値のネームド Tuple + +ClickPipes は現在、他の Avro ユニオンを含むスキーマをサポートしていません(これは新しい ClickHouse Variant や JSON データタイプの成熟度によって変わる可能性があります)。Avro スキーマが「非 null」ユニオンを含んでいる場合、ClickPipes は Avro スキーマと Clickhouse カラムタイプ間のマッピングを計算しようとする際にエラーを生成します。 + +#### Avro スキーマ管理 + +ClickPipes は、各メッセージ/イベントに埋め込まれたスキーマ ID を使用して、設定済みのスキーマレジストリから動的に Avro スキーマを取得し適用します。スキーマの更新は自動的に検出および処理されます。 + +現時点で ClickPipes は、[Confluent Schema Registry API](https://docs.confluent.io/platform/current/schema-registry/develop/api.html) を使用するスキーマレジストリとだけ互換性があります。これには Confluent Kafka と Cloud、RedPanda、AWS MSK、および Upstash スキーマレジストリが含まれます。ClickPipes は、AWS Glue スキーマレジストリや Azure スキーマレジストリとは現在互換性がありません(間もなく対応予定)。 + +取得された Avro スキーマと ClickHouse 宛先テーブル間のマッピングには次のルールが適用されます: +- Avro スキーマに ClickHouse 宛先マッピングに含まれていないフィールドがある場合、そのフィールドは無視されます。 +- Avro スキーマに ClickHouse 宛先マッピングに定義されたフィールドが欠けている場合、ClickHouse カラムは 0 や空文字列のような "ゼロ" 値で埋められます。クリックハウスのサーバーデフォルト処理の更新を待っている一時的な制限のため、ClickPipes 挿入のための [デフォルト](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#default) 式は現在評価されていません。 +- Avro スキーマフィールドと ClickHouse カラムが互換性がない場合、その行/メッセージの挿入に失敗し、失敗は ClickPipes のエラーテーブルに記録されます。いくつかの暗黙的な変換(数値型間の変換など)はサポートされていますが、すべてではありません(例えば、Avro `record` フィールドは `Int32` ClickHouse カラムに挿入できません)。 + +## Kafka 仮想カラム + +Kafka 互換のストリーミングデータソースに対してサポートされている仮想カラムは次の通りです。新しい宛先テーブルを作成する際には、`Add Column` ボタンを使用して仮想カラムを追加できます。 + +| 名前 | 説明 | 推奨データタイプ | +|----------------|------------------------------------------|------------------| +| _key | Kafka メッセージキー | String | +| _timestamp | Kafka タイムスタンプ (ミリ秒精度) | DateTime64(3) | +| _partition | Kafka パーティション | Int32 | +| _offset | Kafka オフセット | Int64 | +| _topic | Kafka トピック | String | +| _header_keys | レコードヘッダー内のキーの並列配列 | Array(String) | +| _header_values | レコードヘッダー内の値の並列配列 | Array(String) | +| _raw_message | 完全な Kafka メッセージ | String | + +_note: `_raw_message` カラムは JSON データにのみ推奨されます。JSON 文字列だけが必要なユースケース(例えば ClickHouse [`JsonExtract*`](https://clickhouse.com/docs/ja/sql-reference/functions/json-functions#jsonextract-functions) 関数を使用してダウンストリームのマテリアライズドビューをポピュレートするなど)では、"非仮想" カラムを全削除することで ClickPipes のパフォーマンスが向上する可能性があります。_ + +## 制限 + +- [デフォルト](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#default) はサポートされていません。 + +## 配信セマンティクス +ClickPipes for Kafka は `少なくとも一度` の配信セマンティクスを提供します(最も一般的に使用されるアプローチの一つとして)。配信セマンティクスについてのフィードバックをお待ちしております [お問い合わせフォーム](https://clickhouse.com/company/contact?loc=clickpipes)。`ちょうど一度` のセマンティクスが必要な場合、公式の [`clickhouse-kafka-connect`](https://clickhouse.com/blog/real-time-event-streaming-with-kafka-connect-confluent-cloud-clickhouse) シンクの使用をお勧めします。 + +## 認証 +Apache Kafka プロトコルのデータソースに対して、ClickPipes は TLS 暗号化を使用した [SASL/PLAIN](https://docs.confluent.io/platform/current/kafka/authentication_sasl/authentication_sasl_plain.html) 認証、および `SASL/SCRAM-SHA-256` と `SASL/SCRAM-SHA-512` をサポートしています。ストリーミングソース(Redpanda、MSK など)により、互換性に基づいてこれらの認証メカニズムのすべてまたは一部が有効になります。他の認証ニーズがある場合は、[フィードバックをお寄せください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +### IAM +AWS MSK の認証は現在、[SASL/SCRAM-SHA-512](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html) 認証のみをサポートしています。 + +### カスタム証明書 +ClickPipes for Kafka は、Kafka ブローカーのカスタム証明書を SASL & パブリック SSL/TLS 証明書でアップロードすることをサポートしています。ClickPipe 設定の SSL 証明書セクションで証明書をアップロードできます。 +:::note +SASL と共に SSL 証明書の単一アップロードをサポートしていますが、現時点では SSL with マルチTLS (mTLS) はサポートされていません。 +::: + +## パフォーマンス + +### バッチ処理 +ClickPipes は ClickHouse へのデータ挿入をバッチで行います。これは、データベース内にあまり多くのパーツを作成しないようにして、クラスター内でのパフォーマンス問題を防ぐためです。 + +バッチは以下の基準のいずれかが満たされたときに挿入されます: +- バッチサイズが最大サイズ(100,000 行または 20MB)に達したとき +- バッチが最大時間(5 秒)開かれていたとき + +### レイテンシー + +レイテンシー(Kafka メッセージが生成されてから ClickHouse で使用可能になるまでの時間)は、さまざまな要因(例:ブローカのレイテンシー、ネットワークレイテンシー、メッセージサイズ/フォーマット)に依存します。上記で説明した[バッチ処理](#Batching)もレイテンシーに影響します。特定の負荷でのレイテンシーを決定するために、特定のユースケースでのテストを常にお勧めします。 + +ClickPipes はレイテンシーに関する保証を提供していません。特定の低レイテンシー要件がある場合は、[お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +### スケーリング +ClickPipes for Kafka は水平スケーリングを意図しています。デフォルトでは、2 つのコンシューマーを持つコンシューマーグループを作成します。これを増やすには、[お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +## よくある質問 + +### 一般 + +- **ClickPipes for Kafka はどのように機能しますか?** + + ClickPipes は専用のアーキテクチャを使用して Kafka Consumer API を実行し、指定されたトピックからデータを読み取り、そのデータを特定の ClickHouse Cloud サービス上の ClickHouse テーブルに挿入します。 + +- **ClickPipes と ClickHouse Kafka テーブルエンジンの違いは何ですか?** + + Kafka テーブルエンジンは、ClickHouse サーバー自身が Kafka に接続し、イベントを取得してローカルに書き込む「プルモデル」を実装する ClickHouse のコア機能です。 + + ClickPipes は ClickHouse サービスとは独立して動作する別のクラウドサービスであり、Kafka(または他のデータソース)に接続し、関連 ClickHouse Cloud サービスにイベントをプッシュします。この分離されたアーキテクチャにより、優れた運用の柔軟性、明確な関心の分離、スケーラブルな取り込み、スムーズな障害管理、拡張性などが可能となります。 + +- **ClickPipes for Kafka を使用する際の要件は何ですか?** + + ClickPipes for Kafka を使用するには、稼働中の Kafka ブローカーと ClickPipes が有効な ClickHouse Cloud サービスが必要です。また、ClickHouse Cloud があなたの Kafka ブローカーにアクセスできることを確認する必要があります。これは、Kafka サイドでのリモート接続を許可し、Kafka 設定で [ClickHouse Cloud Egress IP アドレス](https://clickhouse.com/docs/ja/manage/security/cloud-endpoints-api) をホワイトリストに登録することで実現できます。 + +- **ClickPipes for Kafka は AWS PrivateLink をサポートしていますか?** + + AWS PrivateLink はサポートされています。詳細は [お問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +- **ClickPipes for Kafka を使用して Kafka トピックにデータを書き込むことはできますか?** + + いいえ、ClickPipes for Kafka は Kafka トピックからデータを読み取るために設計されており、データを書き込むためではありません。Kafka トピックにデータを書き込むには、専用の Kafka プロデューサーを使用する必要があります。 + +- **ClickPipes は複数のブローカーをサポートしていますか?** + + はい、同じクォーラムの一部であれば、`,`で区切って一緒に設定できます。 + +### Upstash + +- **ClickPipes は Upstash をサポートしていますか?** + + はい。Upstash の Kafka 製品は 2024 年 9 月 11日から6 ヶ月間の廃止期間に入りました。既存の顧客は、ClickPipes ユーザーインターフェースの一般的な Kafka タイルを使用して、既存の Upstash Kafka ブローカーで ClickPipes を引き続き使用することができます。既存の Upstash Kafka ClickPipes は、廃止通知の前には影響されません。廃止期間が終わると、ClickPipe は機能しなくなります。 + +- **ClickPipes は Upstash スキーマレジストリをサポートしていますか?** + + いいえ。ClickPipes は Upstash Kafka スキーマレジストリと互換性がありません。 + +- **ClickPipes は Upstash の QStash ワークフローをサポートしていますか?** + + いいえ。QStash ワークフローに Kafka 互換の表面が導入されない限り、Kafka ClickPipes では動作しません。 + +### Azure EventHubs + +- **Azure Event Hubs ClickPipe は Kafka サーフェスなしで動作しますか?** + + いいえ。ClickPipes は Azure Event Hubs で Kafka サーフェスを有効にする必要があります。Kafka プロトコルは、Standard、Premium、Dedicated SKU のみのプライシングティアに対応しています。 + +- **Azure スキーマレジストリは ClickPipes で動作しますか?** + + いいえ。ClickPipes は現在、Event Hubs スキーマレジストリとは互換性がありません。 + +- **Azure Event Hubs からデータを取得するためにポリシーにどの権限が必要ですか?** + + トピックをリストし、イベントを取得するには、共有アクセスポリシーに少なくとも「Listen」クレームが必要です。 + +- **Event Hubs がデータを返さない理由は何ですか?** + + あなたの ClickHouse インスタンスがあなたの Event Hubs 配置と異なる地域または大陸にある場合、ClickPipes のオンボーディング時にタイムアウトが発生し、Event Hub からデータを取得する際にレイテンシーが高くなる可能性があります。ClickHouse Cloud 配置と Azure Event Hubs 配置をクラウド地域が互いに近い場所に配置することは、パフォーマンスに悪影響を及ぼさない最良のプラクティスと考えられています。 + +- **Azure Event Hubs のためにポート番号を含めるべきですか?** + + はい。ClickPipes は Kafka サーフェス用のポート番号を含めることを期待しており、それは `:9093` であるべきです。 + +- **Event Hubs のための ClickPipes IP はまだ relevant ですか?** + + はい。Event Hubs インスタンスへのトラフィックを制限する場合、[ドキュメント化された静的 NAT IPs](./index.md) を追加してください。 + +- **イベントハブの接続文字列か、イベントハブネームスペースの接続文字列ですか?** + + 両方とも使用できますが、複数のイベントハブからサンプルを取得するためにネームスペースレベルでの共有アクセスポリシーを使用することをお勧めします。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/kinesis.md b/docs/ja/integrations/data-ingestion/clickpipes/kinesis.md new file mode 100644 index 00000000000..609a4995292 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/kinesis.md @@ -0,0 +1,135 @@ +--- +sidebar_label: Amazon KinesisとClickPipesの統合 +description: Amazon KinesisデータソースをClickHouse Cloudにシームレスに接続します。 +slug: /ja/integrations/clickpipes/kinesis +--- + +# Amazon KinesisとClickHouse Cloudの統合 + +## 前提条件 + +[ClickPipesの紹介](./index.md)に慣れており、[IAM認証情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)または[IAMロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)を設定しています。[Kinesis Role-Based Accessガイド](./secure-kinesis.md)に従って、ClickHouse Cloudと連携するロールの設定方法を確認してください。 + +## 最初のClickPipeを作成する + +1. ClickHouse CloudサービスのSQLコンソールにアクセスします。 + + ![ClickPipes service](./images/cp_service.png) + +2. 左側のメニューから`Data Sources`ボタンを選択し、「Set up a ClickPipe」をクリックします。 + + ![Select imports](./images/cp_step0.png) + +3. データソースを選択します。 + + ![Select data source type](./images/cp_step1.png) + +4. 名前、説明(オプション)、IAMロールまたは認証情報、その他の接続詳細を入力してClickPipeのフォームを記入します。 + + ![Fill out connection details](./images/cp_step2_kinesis.png) + +5. Kinesis Streamと開始オフセットを選択します。UIは選択したソース(Kafkaトピックなど)のサンプルドキュメントを表示します。また、Kinesisストリームのパフォーマンスと安定性を向上させるためにEnhanced Fan-outを有効にすることができます(Enhanced Fan-outの詳細はこちら[こちら](https://aws.amazon.com/blogs/aws/kds-enhanced-fanout)で確認できます)。 + + ![Set data format and topic](./images/cp_step3_kinesis.png) + +6. 次のステップでは、新しいClickHouseテーブルにデータを取り込むか、既存のテーブルを再利用するかを選択できます。画面の指示に従ってテーブル名、スキーマ、および設定を変更します。サンプルテーブルの上部で変更のリアルタイムプレビューを確認できます。 + + ![Set table, schema, and settings](./images/cp_step4a.png) + + 提供されているコントロールを使用して高度な設定をカスタマイズすることもできます。 + + ![Set advanced controls](./images/cp_step4a3.png) + +7. あるいは、既存のClickHouseテーブルにデータを取り込むことを選択することもできます。その場合、UIはソースから選択した宛先テーブルのClickHouseフィールドへのフィールドマッピングを許可します。 + + ![Use and existing table](./images/cp_step4b.png) + +8. 最後に、内部ClickPipesユーザーの権限を設定できます。 + + **Permissions:** ClickPipesは宛先テーブルにデータを書き込む専用ユーザーを作成します。この内部ユーザーのためにカスタムロールまたは事前定義されたロールを選択できます: + - `Full access`: クラスターへの完全アクセスを持つ。これは、Materialized ViewまたはDictionaryを宛先テーブルで使用する場合に有用です。 + - `Only destination table`: 宛先テーブルへの`INSERT`権限のみを持つ。 + + ![permissions](./images/cp_step5.png) + +9. 「Complete Setup」をクリックすると、システムはあなたのClickPipeを登録し、要約テーブルに表示されるようになります。 + + ![Success notice](./images/cp_success.png) + + ![Remove notice](./images/cp_remove.png) + + 要約テーブルには、ClickHouseのソースまたは宛先テーブルからサンプルデータを表示するためのコントロールが含まれています。 + + ![View destination](./images/cp_destination.png) + + さらにClickPipeを削除し、取り込みジョブの要約を表示するためのコントロールもあります。 + + ![View overview](./images/cp_overview.png) + +10. **おめでとうございます!** 初めてのClickPipeを正常に設定しました。これがストリーミングClickPipeの場合、リモートデータソースからリアルタイムでデータを連続して取り込むことになります。そうでなければ、バッチを取り込み完了します。 + +## サポートされているデータフォーマット + +サポートされているフォーマットは次の通りです: +- [JSON](../../../interfaces/formats.md/#json) + +## サポートされているデータ型 + +ClickPipesでは、以下のClickHouseデータ型が現在サポートされています: + +- 基本数値型 - \[U\]Int8/16/32/64およびFloat32/64 +- 大きな整数型 - \[U\]Int128/256 +- Decimal型 +- ブール型 +- String +- FixedString +- Date, Date32 +- DateTime, DateTime64(UTCタイムゾーンのみ) +- Enum8/Enum16 +- UUID +- IPv4 +- IPv6 +- すべてのClickHouse LowCardinality型 +- Map(上記の型およびNullableを使用したキーおよび値) +- TupleおよびArray(上記の型およびNullableを使用した要素、一段階の深さのみ) + +## Kinesis仮想カラム + +Kinesisストリームに対してサポートされている仮想カラムは以下の通りです。新しい宛先テーブルを作成する際、`Add Column`ボタンを使用して仮想カラムを追加できます。 + +| 名前 | 説明 | 推奨データ型 | +|--------------|---------------------------------------------------------------|-----------------------| +| _key | Kinesis パーティションキー | String | +| _timestamp | Kinesis おおよその到着タイムスタンプ(ミリ秒精度) | DateTime64(3) | +| _stream | Kafka ストリーム名 | String | +| _raw_message | 完全な Kinesis メッセージ | String | + +_raw_messageフィールドは、完全なKinesis JSONレコードが必要な場合(例えば、ClickHouseの[`JsonExtract*`](https://clickhouse.com/docs/ja/sql-reference/functions/json-functions#jsonextract-functions)関数を使用して下流のmaterialized viewを埋める場合)に使用できます。このようなパイプでは、すべての「非仮想」カラムを削除することでClickPipesのパフォーマンスを向上させることができます。 + +## 制限事項 + +- [DEFAULT](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#default)はサポートされていません。 + +## パフォーマンス + +### バッチング + +ClickPipesはデータをバッチでClickHouseに挿入します。これは、データベース内のパーツが多くなりすぎることによってクラスタのパフォーマンスに影響を与えることを避けるためです。 + +バッチは、以下のいずれかの条件を満たすと挿入されます: +- バッチサイズが最大サイズに達したとき(100,000行または20MB) +- バッチが最大時間(5秒)開かれていたとき + +### レイテンシー + +レイテンシー(Kinesisメッセージがストリームに送信され、ClickHouseで利用可能になるまでの時間)は、いくつかの要因(例:kinesisのレイテンシー、ネットワークレイテンシー、メッセージサイズ/フォーマット)に依存します。上記のセクションに記載されている[バッチング](#Batching)もレイテンシーに影響します。お客様の特定のユースケースをテストして、期待されるレイテンシーを理解することをお勧めします。 + +特定の低レイテンシー要件がある場合は、[ここからお問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +### スケーリング + +Kinesis向けClickPipesは水平スケーリングを前提に設計されています。デフォルトでは、2つのコンシューマーを作成します。これを増やすには、[こちらからお問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)。 + +## 認証 + +Amazon Kinesisストリームにアクセスするには、[IAM認証情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)または[IAMロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)を使用できます。IAMロールの設定方法に関する詳細は、[このガイド](./secure-kinesis.md)を参照して、ClickHouse Cloudと連携するロールの設定方法について確認できます。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/object-storage.md b/docs/ja/integrations/data-ingestion/clickpipes/object-storage.md new file mode 100644 index 00000000000..73497dd3df4 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/object-storage.md @@ -0,0 +1,146 @@ +--- +sidebar_label: オブジェクトストレージ用のClickPipes +description: あなたのオブジェクトストレージをClickHouse Cloudにシームレスに接続します。 +slug: /ja/integrations/clickpipes/object-storage +--- +import S3SVG from "../../images/logos/amazon_s3_logo.svg"; +import GCSSVG from "../../images/logos/gcs.svg"; + +# オブジェクトストレージとClickHouse Cloudの統合 +## 前提条件 +[ClickPipesの紹介](./index.md)を確認していること。 + +## 初めてのClickPipeの作成 + +1. ClickHouse Cloud ServiceのSQLコンソールにアクセスします。 + + ![ClickPipesサービス](./images/cp_service.png) + +2. 左側のメニューから`Data Sources`ボタンを選択し、「Set up a ClickPipe」をクリックします。 + + ![インポートを選択](./images/cp_step0.png) + +3. データソースを選択します。 + + ![データソースタイプを選択](./images/cp_step1.png) + +4. フォームにClickPipeの名前、説明(オプション)、IAMロールまたは資格情報、バケットURLを入力してフォームを記入します。bash風のワイルドカードを使用して複数のファイルを指定できます。詳細については、[パスでのワイルドカードの使用に関する文書](#limitations)を参照してください。 + + ![接続詳細を記入](./images/cp_step2_object_storage.png) + +5. 指定されたバケット内のファイルのリストがUIに表示されます。データフォーマットを選択し(現在、ClickHouseフォーマットのサブセットをサポートしています)、継続的な取り込みを有効にしたい場合は[以下の詳細](#continuous-ingest)をご覧ください。 + + ![データフォーマットとトピックを設定](./images/cp_step3_object_storage.png) + +6. 次のステップでは、新しいClickHouseテーブルにデータを取り込むか、既存のテーブルを再利用するかを選択できます。画面の指示に従って、テーブル名、スキーマ、設定を変更します。サンプルテーブルの上部でリアルタイムの変更プレビューを見ることができます。 + + ![テーブル、スキーマ、および設定を設定](./images/cp_step4a.png) + + 提供されたコントロールを使用して、高度な設定をカスタマイズすることもできます。 + + ![高度なコントロールを設定](./images/cp_step4a3.png) + +7. あるいは、既存のClickHouseテーブルにデータを取り込むことも選択できます。その場合、UIはソースから選択された宛先テーブルのClickHouseフィールドへフィールドをマッピングする機能を提供します。 + + ![既存のテーブルを使用](./images/cp_step4b.png) + +:::info +[_path]や[_size]のような[仮想カラム](../../sql-reference/table-functions/s3#virtual-columns)をフィールドにマッピングすることもできます。 +::: + +8. 最後に、内部clickpipesユーザーの権限を設定できます。 + + **権限:** ClickPipesは、宛先テーブルにデータを書き込むための専用ユーザーを作成します。この内部ユーザーのロールをカスタムロールまたは以下の事前定義されたロールで選択できます: + - `Full access`: クラスターへの完全なアクセス権があります。Materialized ViewやDictionaryを宛先テーブルで使用する場合に必要です。 + - `Only destination table`: 宛先テーブルへの`INSERT`権限のみ。 + + ![権限](./images/cp_step5.png) + +9. 「Complete Setup」をクリックすると、システムがあなたのClickPipeを登録し、サマリーテーブルにリストされているのを見ることができます。 + + ![成功通知](./images/cp_success.png) + + ![削除通知](./images/cp_remove.png) + + サマリーテーブルは、ClickHouseのソースまたは宛先テーブルからサンプルデータを表示するコントロールを提供します。 + + ![宛先を表示](./images/cp_destination.png) + + また、ClickPipeを削除し、取り込みジョブのサマリーを表示するコントロールもあります。 + + ![概要を表示](./images/cp_overview.png) + +10. **おめでとうございます!** あなたの初めてのClickPipeを成功裏に設定しました。これがストリーミングClickPipeである場合、それはリモートデータソースからリアルタイムでデータを継続的に取り込みます。それ以外の場合は、バッチを取り込んで完了します。 + +## サポートされているデータソース + +|名前|ロゴ|タイプ|ステータス|説明| +|----|----|----|------|-----------| +|Amazon S3||オブジェクトストレージ|Beta|オブジェクトストレージから大量のデータを取り込むためにClickPipesを設定します。| +|Google Cloud Storage||オブジェクトストレージ|Beta|オブジェクトストレージから大量のデータを取り込むためにClickPipesを設定します。| + +ClickPipesには今後より多くのコネクタが追加される予定です。[こちらからお問い合わせください](https://clickhouse.com/company/contact?loc=clickpipes)で詳細を確認できます。 + +## サポートされているデータフォーマット + +サポートされているフォーマットは次のとおりです: +- [JSON](../../../interfaces/formats.md/#json) +- [CSV](../../../interfaces/formats.md/#csv) +- [Parquet](../../../interfaces/formats.md/#parquet) + +## スケーリング + +オブジェクトストレージClickPipesは、[設定された縦方向の自動スケーリング設定](/docs/ja/manage/scaling#configuring-vertical-auto-scaling)により決定された最小のClickHouseサービスサイズに基づいてスケーリングされます。ClickPipeのサイズはパイプ作成時に決定され、後続のClickHouseサービス設定の変更はClickPipeのサイズに影響しません。 + +大規模な取り込みジョブのスループットを増加させるため、ClickPipeを作成する前にClickHouseサービスをスケーリングすることをお勧めします。 + +## Materialized Views + +オブジェクトストレージClickPipesでMaterialized Viewsを使用する場合、作成時に`Full access`権限を選択する必要があります。これが不可能な場合は、パイプが宛先データベースにテーブルおよびMaterialized Viewsを作成できることを確認してください。 + +オブジェクトストレージClickPipeの実行中に作成されるMaterialized Viewsは、データを取得しません。パイプを停止し再起動することで、パイプがMaterialized Viewsを取得し始めます。以下の[制限](#limitations)を参照してください。 + +## 制限事項 +- 宛先テーブル、そのMaterialized Views(カスケードMaterialized Viewsを含む)、またはMaterialized Viewsのターゲットテーブルの変更は、パイプによって自動的に取得されず、エラーを引き起こす可能性があります。パイプを停止し、必要な変更を加えてからパイプを再起動し、変更を取得し、エラーや再試行による重複データを回避してください。 +- GCPまたはAzureにデプロイされたClickHouse Cloudインスタンス用に、S3 ClickPipesのロール認証は利用できません。AWS ClickHouse Cloudインスタンスのみサポートされています。 +- ClickPipesは10GB以下のオブジェクトの取り込みのみを試みます。10GBを超えるファイルは、ClickPipes専用のエラーテーブルにエラーを追加します。 +- S3 / GCS ClickPipesは、[S3 Table Function](https://clickhouse.com/docs/ja/sql-reference/table-functions/file#globs_in_path)とリスト構文を共有して**いません**。 + - `?` — 任意の1文字に置き換えます。 + - `*` — 空の文字列を含む任意の数の任意の文字に置き換えます。 + - `**` — 空の文字列を含む任意の数の任意の文字に置き換えます。 + +:::note +これは有効なパスです: + +https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/**.ndjson.gz + + +これは有効なパスではありません。ClickPipesでは`{N..M}`はサポートされていません。 + +https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/{documents-01,documents-02}.ndjson.gz +::: + +## 継続的な取り込み +ClickPipesはS3およびGCSからの継続的な取り込みをサポートしています。有効にすると、ClickPipesは指定されたパスからデータを継続的に取り込み、新しいファイルを30秒ごとにポーリングします。ただし、新しいファイルは最後に取り込まれたファイルよりも辞書順で大きくなければならず、取り込みの順序を定義するように名前が付けられている必要があります。例えば、`file1`、`file2`、`file3`などのファイルは順番に取り込まれます。`file0`のような名前の新しいファイルが追加されても、辞書順で最後に取り込まれたファイルより大きくないため、ClickPipesはそれを取り込みません。 + +## アーカイブテーブル +ClickPipesは、宛先テーブルの隣に`_archive`の接尾辞を持つテーブルを作成します。このテーブルには、ClickPipeによって取り込まれたすべてのファイルのリストが含まれます。このテーブルは取り込み中のファイルを追跡するために使用され、ファイルが取り込まれたことを確認するために使用できます。アーカイブテーブルには7日の[有効期限](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)があります。 + +:::note +これらのテーブルはClickHouse Cloud SQLコンソールを使用しても表示されません。HTTPSまたはネイティブ接続を介して外部クライアントを使用して接続し、読み取る必要があります。 +::: + +## 認証 + +### S3 +公開バケットには設定なしでアクセスでき、保護されたバケットには[IAM資格情報](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)または[IAMロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)を使用できます。データへのアクセスに必要な権限を理解するには、[このガイドを参照してください](/docs/ja/cloud/security/secure-s3)。 + +### GCS +S3と同様に、公開バケットには設定なしでアクセスでき、保護されたバケットにはAWS IAM資格情報の代わりに[HMACキー](https://cloud.google.com/storage/docs/authentication/managing-hmackeys)を使用できます。このキーの設定方法については、Google Cloudのガイドを参照してください。[このキーの設定方法](https://cloud.google.com/storage/docs/authentication/hmackeys)。 + +GCSのサービスアカウントは直接サポートされていません。公開されていないバケットに対して認証する際にはHMAC(IAM)資格情報を使用する必要があります。HMAC資格情報に付随するサービスアカウントの権限は`storage.objects.list`および`storage.objects.get`である必要があります。 + +## よくある質問 +- **ClickPipesは`gs://`で始まるGCSバケットをサポートしていますか?** + +いいえ。相互運用性のために、`gs://`バケットプレフィックスを`https://storage.googleapis.com/`に置き換えることをお勧めします。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/postgres.md b/docs/ja/integrations/data-ingestion/clickpipes/postgres.md new file mode 100644 index 00000000000..a2aae58f65d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/postgres.md @@ -0,0 +1,11 @@ +--- +sidebar_label: PostgreSQL 用 ClickPipes +description: PostgreSQL をシームレスに ClickHouse Cloud に接続します。 +slug: /ja/integrations/clickpipes/postgres +--- + +# ClickHouse Cloud との PostgreSQL 統合 + +PeerDB は ClickHouse と提携し、最速の Postgres CDC を提供します!スタートするには、[PeerDB Cloud](https://www.peerdb.io/) でアカウントを作成し、ClickHouse Cloud の設定手順については[ドキュメント](https://docs.peerdb.io/connect/clickhouse/clickhouse-cloud)を参照してください。 + +今後数ヶ月で、PostgreSQL CDC を ClickPipes に完全に統合されたソリューションとして提供する予定です。 diff --git a/docs/ja/integrations/data-ingestion/clickpipes/secure-kinesis.md b/docs/ja/integrations/data-ingestion/clickpipes/secure-kinesis.md new file mode 100644 index 00000000000..fdecd10918d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/clickpipes/secure-kinesis.md @@ -0,0 +1,95 @@ +--- +slug: /ja/integrations/clickpipes/secure-kinesis +sidebar_label: Kinesis ロールベース アクセス +title: Kinesis ロールベース アクセス +--- + +この記事では、ClickPipes 顧客がロールベース・アクセスを活用して Amazon Kinesis に認証し、安全にデータストリームへアクセスする方法を説明します。 + +## はじめに + +Kinesis への安全なアクセスを設定する前に、そのメカニズムを理解することが重要です。以下は、ClickPipes が顧客の AWS アカウント内でロールを引き受けることで Amazon Kinesis ストリームにアクセスする方法の概要です。 + +![securekinesis](@site/docs/ja/integrations/data-ingestion/clickpipes/images/securekinesis.jpg) + +この方法を使用することで、顧客は IAM ポリシー(引き受けられるロールの IAM ポリシー)内で Kinesis データストリームへのすべてのアクセスを一元管理でき、それぞれのストリームのアクセスポリシーを個別に変更する必要がありません。 + +## 設定 + +### ClickHouse サービス IAM ロール Arn の取得 + +1 - ClickHouse クラウドアカウントにログインします。 + +2 - 統合したい ClickHouse サービスを選択します。 + +3 - **設定** タブを選択します。 + +4 - ページ下部の **このサービスについて** セクションまでスクロールします。 + +5 - 以下に示すように、サービスに属する **IAM ロール** の値をコピーします。 + +![s3info](@site/docs/ja/cloud/security/images/secures3_arn.jpg) + +### IAM ロールの設定 + +#### IAM ロールを手動で作成 + +1 - IAM ユーザーとしての許可がある AWS アカウントにウェブブラウザでログインして、IAM ロールを作成および管理します。 + +2 - IAM サービスコンソールに移動します。 + +3 - 以下の IAM および信頼ポリシーを持つ新しい IAM ロールを作成します。IAM ロールの名前は `ClickHouseAccessRole-` で始める必要があることに注意してください。 + +信頼ポリシー({ClickHouse_IAM_ARN} を ClickHouse インスタンスに属する IAM ロールの arn で置き換えてください): + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "{ClickHouse_IAM_ARN}" + }, + "Action": "sts:AssumeRole" + } + ] +} +``` + +IAM ポリシー({STREAM_NAME} を Kinesis ストリーム名で置き換えてください): + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": [ + "kinesis:DescribeStream", + "kinesis:GetShardIterator", + "kinesis:GetRecords", + "kinesis:ListShards", + "kinesis:SubscribeToShard", + "kinesis:DescribeStreamConsumer", + "kinesis:RegisterStreamConsumer", + "kinesis:DeregisterStreamConsumer", + "kinesis:ListStreamConsumers" + ], + "Resource": [ + "arn:aws:kinesis:region:account-id:stream/{STREAM_NAME}" + ], + "Effect": "Allow" + }, + { + "Action": [ + "kinesis:ListStreams" + ], + "Resource": "*", + "Effect": "Allow" + } + ] + +} +``` + +4 - 作成後、新しい **IAM ロール Arn** をコピーします。これが Kinesis ストリームにアクセスするために必要です。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/_category_.yml b/docs/ja/integrations/data-ingestion/data-formats/_category_.yml new file mode 100644 index 00000000000..f8179149dd5 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/_category_.yml @@ -0,0 +1,7 @@ +position: 5 +label: 'Data Formats' +collapsible: true +collapsed: true +link: + type: doc + id: intro diff --git a/docs/ja/integrations/data-ingestion/data-formats/arrow-avro-orc.md b/docs/ja/integrations/data-ingestion/data-formats/arrow-avro-orc.md new file mode 100644 index 00000000000..606ee064533 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/arrow-avro-orc.md @@ -0,0 +1,165 @@ +--- +sidebar_label: Avro、Arrow、および ORC +sidebar_position: 5 +slug: /ja/integrations/data-formats/arrow-avro-orc +--- + +# ClickHouseでのAvro、Arrow、およびORCデータの操作 + +Apacheは、分析環境で広く使用される複数のデータフォーマットをリリースしており、その中には人気のある[Avro](https://avro.apache.org/)、[Arrow](https://arrow.apache.org/)、そして[Orc](https://orc.apache.org/)があります。ClickHouseはリストから選択されたデータをインポートおよびエクスポートすることをサポートしています。 + +## Avroフォーマットでのインポートとエクスポート + +ClickHouseは、Hadoopシステムで広く使われている[Apache Avro](https://avro.apache.org/)データファイルの読み取りと書き込みをサポートしています。 + +[Avroファイル](assets/data.avro)からインポートするには、`INSERT`文で[Avro](/docs/ja/interfaces/formats.md/#data-format-avro)フォーマットを使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data.avro' +FORMAT Avro +``` + +[file()](/docs/ja/sql-reference/functions/files.md/#file)関数を使用して、実際にデータをインポートする前にAvroファイルを調査することも可能です: + +```sql +SELECT path, hits +FROM file('data.avro', Avro) +ORDER BY hits DESC +LIMIT 5; +``` +```response +┌─path────────────┬──hits─┐ +│ Amy_Poehler │ 62732 │ +│ Adam_Goldberg │ 42338 │ +│ Aaron_Spelling │ 25128 │ +│ Absence_seizure │ 18152 │ +│ Ammon_Bundy │ 11890 │ +└─────────────────┴───────┘ +``` + +Avroファイルへのエクスポート: + +```sql +SELECT * FROM sometable +INTO OUTFILE 'export.avro' +FORMAT Avro; +``` + +### AvroとClickHouseデータタイプ + +Avroファイルをインポートまたはエクスポートする際は、[データタイプのマッチング](/docs/ja/interfaces/formats.md/#data_types-matching)を考慮に入れてください。Avroファイルからデータをロードする際には、明示的な型キャストを使用して変換してください: + +```sql +SELECT + date, + toDate(date) +FROM file('data.avro', Avro) +LIMIT 3; +``` +```response +┌──date─┬─toDate(date)─┐ +│ 16556 │ 2015-05-01 │ +│ 16556 │ 2015-05-01 │ +│ 16556 │ 2015-05-01 │ +└───────┴──────────────┘ +``` + +### KafkaにおけるAvroメッセージ + +KafkaメッセージがAvroフォーマットを使用している場合、ClickHouseは[AvroConfluent](/docs/ja/interfaces/formats.md/#data-format-avro-confluent)フォーマットと[Kafka](/docs/ja/engines/table-engines/integrations/kafka.md)エンジンを使用してこのようなストリームを読み取ることができます: + +```sql +CREATE TABLE some_topic_stream +( + field1 UInt32, + field2 String +) +ENGINE = Kafka() SETTINGS +kafka_broker_list = 'localhost', +kafka_topic_list = 'some_topic', +kafka_group_name = 'some_group', +kafka_format = 'AvroConfluent'; +``` + +## Arrowフォーマットの操作 + +もう一つのカラム形式のフォーマットは[Apache Arrow](https://arrow.apache.org/)で、ClickHouseでもインポートとエクスポートをサポートしています。[Arrowファイル](assets/data.arrow)からデータをインポートするには、[Arrow](/docs/ja/interfaces/formats.md/#data-format-arrow)フォーマットを使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data.arrow' +FORMAT Arrow +``` + +Arrowファイルへのエクスポートも同様の方法で行います: + +```sql +SELECT * FROM sometable +INTO OUTFILE 'export.arrow' +FORMAT Arrow +``` + +また、[データタイプのマッチング](/docs/ja/interfaces/formats.md/#data-types-matching-arrow)を確認し、手動で変換が必要な場合があります。 + +### Arrowデータストリーミング + +[ArrowStream](/docs/ja/interfaces/formats.md/#data-format-arrow-stream)フォーマットはArrowストリーミング(メモリ内処理用)で使用できます。ClickHouseはArrowストリームの読み書きが可能です。 + +ClickHouseがArrowデータをストリームする方法を示すために、次のPythonスクリプトにパイプでデータを渡します(これはArrowストリーミングフォーマットで入力ストリームを読み取り、結果をPandasテーブルとして出力します): + +```python +import sys, pyarrow as pa + +with pa.ipc.open_stream(sys.stdin.buffer) as reader: + print(reader.read_pandas()) +``` + +次に、そのスクリプトに出力をパイプさせることでClickHouseからデータをストリームします: + +```bash +clickhouse-client -q "SELECT path, hits FROM some_data LIMIT 3 FORMAT ArrowStream" | python3 arrow.py +``` +```response + path hits +0 b'Akiba_Hebrew_Academy' 241 +1 b'Aegithina_tiphia' 34 +2 b'1971-72_Utah_Stars_season' 1 +``` + +ClickHouseは同じArrowStreamフォーマットを使用してArrowストリームを読み取ることもできます: + +```sql +arrow-stream | clickhouse-client -q "INSERT INTO sometable FORMAT ArrowStream" +``` + +`arrow-stream`をArrowストリーミングデータの可能なソースとして使用しました。 + +## ORCデータのインポートとエクスポート + +[Apache ORC](https://orc.apache.org/)フォーマットは通常Hadoopで使用されるカラム形式のストレージフォーマットです。ClickHouseは[ORCフォーマット](/docs/ja/interfaces/formats.md/#data-format-orc)を使用した[Orcデータ](assets/data.orc)のインポートとエクスポートをサポートしています: + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'data.orc' +FORMAT ORC; + +INSERT INTO sometable +FROM INFILE 'data.orc' +FORMAT ORC; +``` + +エクスポートとインポートを調整するために、[データタイプのマッチング](/docs/ja/interfaces/formats.md/#data-types-matching-orc)および[追加設定](/docs/ja/interfaces/formats.md/#parquet-format-settings)も確認してください。 + +## さらなる学習 + +ClickHouseは、さまざまなシナリオとプラットフォームに対応するために多くのフォーマット(テキストおよびバイナリ)をサポートしています。以下の記事で他のフォーマットとその活用方法をさらに探索してください: + +- [CSVとTSVフォーマット](csv-tsv.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- [ネイティブとバイナリフォーマット](binary.md) +- [SQLフォーマット](sql.md) + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)も確認してください - Clickhouseサーバーを必要とせずにローカル/リモートファイルで作業するためのポータブルでフル機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/arrays.json b/docs/ja/integrations/data-ingestion/data-formats/assets/arrays.json new file mode 100644 index 00000000000..8f17589ef18 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/arrays.json @@ -0,0 +1,3 @@ +["Akiba_Hebrew_Academy", "2017-08-01", 241], +["Aegithina_tiphia", "2018-02-01", 34], +["1971-72_Utah_Stars_season", "2016-10-01", 1] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/columns-array.json b/docs/ja/integrations/data-ingestion/data-formats/assets/columns-array.json new file mode 100644 index 00000000000..e6d73ac80f5 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/columns-array.json @@ -0,0 +1,5 @@ +[ + ["Heidenrod", "Arthur_Henrique", "Alan_Ebnother"], + ["2017-01-01", "2016-11-01", "2015-11-01"], + [10, 12, 66] +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/columns.json b/docs/ja/integrations/data-ingestion/data-formats/assets/columns.json new file mode 100644 index 00000000000..6304484f563 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/columns.json @@ -0,0 +1,5 @@ +{ + "path": ["2007_Copa_America", "Car_dealerships_in_the_USA", "Dihydromyricetin_reductase"], + "month": ["2016-07-01", "2015-07-01", "2015-07-01"], + "hits": [178, 11, 1] +} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/custom.json b/docs/ja/integrations/data-ingestion/data-formats/assets/custom.json new file mode 100644 index 00000000000..a02ac155e46 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/custom.json @@ -0,0 +1,5 @@ +[ + {"name": "Joe", "age": 99, "type": "person"}, + {"url": "/my.post.MD", "hits": 1263, "type": "post"}, + {"message": "Warning on disk usage", "type": "log"} +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.arrow b/docs/ja/integrations/data-ingestion/data-formats/assets/data.arrow new file mode 100644 index 00000000000..615593bb3ea Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.arrow differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.avro b/docs/ja/integrations/data-ingestion/data-formats/assets/data.avro new file mode 100644 index 00000000000..817200d6672 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.avro differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.binary b/docs/ja/integrations/data-ingestion/data-formats/assets/data.binary new file mode 100644 index 00000000000..5a7cfee6736 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.binary differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.bson b/docs/ja/integrations/data-ingestion/data-formats/assets/data.bson new file mode 100644 index 00000000000..3b37c10c0a1 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.bson differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.clickhouse b/docs/ja/integrations/data-ingestion/data-formats/assets/data.clickhouse new file mode 100644 index 00000000000..56dffd70ae0 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data.clickhouse @@ -0,0 +1,59 @@ +pathStringBangor_City_Forest Alireza_AfzalAkhaura-Laksam-Chittagong_Line1973_National_500 +AttachmentKellett_Strait Ajarani_RiverAkbarabad,_KhomeynAdriaan_Theodoor_PeperzakAlucita_dryogramma +Brit_Med_J4th_Metro_Manila_Film_FestivalAlialujah_Choir1953-54_SM-sarja_seasonAir_Force_Song 4-6_duoprismAshley_Spurlin Asfaq_Kayani1607_in_architecture4-way_speakers Blue_Heeler5_Euro'2009_Spa-Francorchamps_GP2_Series_round"2015_Guru_Granth_Sahib_desecrationAgriculture_Marketing_Service2006_Football_League_Cup_Final2008_Uber_Cup_group_stage1923_PGA_Championship +Fannie_Bay +AlchemyAPICinema_of_ItalyArodes Damien_MarleyAl_Jumayl_Baladiyat(2015_Alabama_State_Hornets_football_team Aglossa_tanya73rd_Pennsylvania_Infantry72015_European_Junior_and_U23_Canoe_Slalom_ChampionshipsAfrican_LeopardFaverolles,_OrneAaron_FukuharaAnnular_ligaments_of_trachea2014_US_Open_SeriesA_Better_MousetrapDibakluAt_Samat_District Aaron_Peasley Apistomology Buyat_Bay#1942_Estonian_Football_ChampionshipAction_for_Autism100_Hz+2003_Arizona_State_Sun_Devils_football_teamAntona_obscuraAkiko_SugiyamaElysburg2017_New_South_Wales_Cup#2011-12_Gold_Coast_United_FC_seasonPAgency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean Albert_DunnHahamakin_ang_Lahat2013_Spuyten_Duyvil_derailmentAylingAnti-Establishment"1951_Spanish_motorcycle_Grand_Prix2009-10_Brunei_Premier_League23_Ursae_Majoris&1927-28_Austrian_football_championshipAndrew_McKeever Clinocottus2006_State_of_Origin#2013-14_Los_Angeles_Clippers_seasonCor_JesuBesseringen_B-Werk +Amy_Hempel Franc-ComtoisAllium_giganteumAbishaiAbraham_Clark_High_SchoolBaku_chronology22nd_MEU2015_Open_Engie_de_TouraineChurchill_BowlAGMARKAmerican_standard_wire_gauge Araby,_LA217_BC#2008_Trinidad_and_Tobago_League_Cup +Alazan_BayAluminum_fencingAchilles_tendinitis"AFP_Peacekeeping_Operations_Center2013_Xinjiang_clashesArborea_Giudicato_of_Arborea1941_Cleveland_Rams_seasonJu_Posht,_Rasht Ascalenia AplectoidesEuropean_Cup_1969-70Armen_Mkertchian 2015_Aspria_Tennis_Cup_-_Singles14_August_1947Adobe_Creative_Suite_1IC_chips Austo_AE300 +Date_palms BCS_bowl_game AR_BorderAranda_de_Duero,1919_Wake_Forest_Demon_Deacons_football_team*All_The_Wrong_Clues_For_The_Right_SolutionAllan_Campbell_McLeanBradford_Council_election,_2011Astronomy_and_astrophysicsDutch_Antillean_people +Army_Radio BBVA_Bancomer +Lake_Aloha Andy_Bean1941_Pittsburgh_Steelers_seasonAniopi_MelidoniAglossosia_fusca Art_books1929_Washington_Senators_seasonAntaeotricha_congelataDouglas_C-54G-5-DO_Skymaster Chris_Jamison Ace_BlackwellAbdul_Qadir_FitratArnoldo_Vizcaino*2012_Open_EuroEnergie_de_Quimper_-_Doubles Dale_Rominski ADHD_coaching +Claire_Yiu ApplicantApache_OpenOfficeAbel_Kiprop_MutaiAirdrome_TaubeAndrey_ViktorovichAmerican_Idol_controversyAnthrenocerus_confertusAppraisal_SubcommitteeBabusa 500_homeruns"Argentina_national_volleyball_teamChief_prosecutor_of_RussiaAbsolution_DVD1,3-Beta-glucan_synthase Dave_SinardetAdeline_Whitney Allon_shvut-2012_Penn_State_Nittany_Lions_football_seasonColeman-Franklin-Cannon_MillAction_directorAD_547Acta_germanicaAbu_Dhabi_Global_Market_Square Kozo_ShioyaChina_Investment_CorpDmitri_Zakharovich_Protopopov Anatra_Anadis Archaikum2000_Webby_Awards2003_BCR_Open_Romania_-_SinglesAbacetus_bisignatusAmerican_school_of_kinshasaAnna,_7th_Duchess_of_BedfordBlack_majority_district Dagma_Lahlum Credit_SaisonAriyankuppam_firkaAnnette_FuentesAngerstein,_JohnAnnenkov_IslandAnne_Frank_museumAnnales_sancti_AmandiL-FABP +Alvord,_TX*2006_World_Team_Table_Tennis_Championships AngriffenAnthony_OppenheimerAbsamat_Masaliyevich_MasaliyevAirborne_Museum_at_AldershotAktiubinsk_Oblast100_East_Wisconsin#7th_Bangladesh_National_Film_AwardsAlejandro_ReyesApplied_philosophyAdhemar_PimentaBreak_the_fourth_wallAnnoushka_DucasATC_code_J01CA01Evelyn_County,_New_South_WalesElastic_scattering 1032_PafuriAndrew_Bromwich Ishita_Arun Aspergics 1857_in_ChileBreffni 845_in_poetry20321_LightdonovanArthur_Chandler CsISOLatin21900_Grand_National Aeritalia_AMXB_Sharps 544_area_code30th_Guldbagge_Awards AgrippinaArdmoreAmplypterus_panopusAlexander_BukharovAlaska_Raceway_Park)Albanian_National_Road_Race_Championships41968_Democratic_National_Convention_protest_activity2012_Birthday_Honours2000_NHL_expansion_draftA_Town_Where_You_Live Ahmed_ShahzadElisabeth_Svendsen)2002_FINA_Synchronised_Swimming_World_CupAkatekAnimation_with_DAZ_Studio Fergus_Craig Ancel_Nalau5171_Augustesen Anne_McGuireAustralian_Photoplay_Company1913_in_CanadaArhopala_allataIl_Paradiso_delle_Signore Geri_PalastAlan_Abela_Wadge"22nd_Tactical_Air_Support_Squadron Avant_StellarBlack_phantom_tetraBilly_McCaffreyAnnie_Furuhjelm 1992_PGA_Tour2008_Chilean_pork_crisis2012_Currie_Cup_First_DivisionAleksei_FomkinAlexander_Krausnick-GrohAdam_Richard_WilesATCvet_code_QA01AD01Abu_Bakr_Ibn_BajjaArchitecture-Studio950s_BC AbschwungesAdonis_Geroskipou2008-09_SV_Werder_Bremen_season Closed_loopsAFC_Youth_Championship_1982 Aquila_Shoes9842_FunakoshiEducational_quotientAntoni_Julian_NowowiejskiAdi_Oka_IdhileDEXIA-BIL_Luxembourg_OpenAndrew_James_SimpsonAlexander_Boksenberg1827_in_DenmarkAfternoon_tea_with_suggs Alpha,_MN +Ari_Onasis&1961-62_Football_League_First_Division Andi_LilaA_Gathering_Of_Old_MenAbul_Fazl_al-AbbasAsgill,_CharlesAlexander_Arkhangelsky1947-48_Portuguese_Liga3rd_MMC_-_VarnaAlberts,_WayneAlois_SchickelgruberHefner_Stadium410912_LisakarolineAcademy_at_Mountain_State 617_Squadron$Al_Silm_Haji_Hajjaj_Awwad_Al_HajjajiArturo_Merino_Benitez_AirportAEK_Athens_FutsalAggaeus6Association_for_Retarded_Citizens_of_the_United_States Kielce_pogrom1351_in_poetry#1923_Princeton_Tigers_football_teamAuzata_semipavonaria 892_in_poetry Anton_KrotiakArthur_Shelley2003_Kyoto_Purple_Sanga_season!Frederic_Bowker_Terrington_Carter 2-orthoplexAcacia_australiana2012_Newcastle_Knights_seasonAnn_Wrights_Corner,_Virginia 12557_Caracol#2001_African_Footballer_of_the_Year Bass_PyramidA_noodle +Aed_Bennan 1886_Yale_Bulldogs_football_team2002_Players_ChampionshipAfrican_Skimmer3rd_Guldbagge_Awards Arrows_A19B&Archduchess_Elisabetta_of_Austria-EsteAmerica_Islands1932_Olympic_Games#2011_Chinese_pro-democracy_protests Bank_walkaway594_in_Ireland%Association_of_Municipal_CorporationsAndreas_BrantelidAmarthal_urf_Unchagaon3-methoxymorphinan2382_BC1763_in_scienceArvert Ale_yeastA_Man_Without_a_SoulAir_Force_Base_Louis_TrichardtAthirson_Mazzoli_de_OliveiraAnthony_Chan_YauBasic_Enlisted_Submarine_School%Aboriginal_Lands_of_Hawaiian_AncestryFondren_Southwest,_Houston3_World_Financial_Center#1971_IIHF_European_U19_Championship1937-38_AllsvenskanChristopher_Ashton_Kutcher,Australian_rules_football_in_south_australia Amicable_pair +Alan_Tomes%Alexei_Petrovich,_Tsarevich_of_Russia Alexis_DamourBankruptcy_Act_of_1938 AmphiphyllumConway_High_School_West5447_Lallement Gabriel_Iddan1879-80_Scottish_Cup2011_Eneco_Tour1471_in_EnglandAshland_Town_Hall Archduke_John2000_Cameroonian_Premier_League +1997_floodAgile_managementAm_841Apprentice_MasonHales-Jewett_theoremAlien_Abductions Arjun_Menon AnthokyanAutomobili_Lamborghini Alain_Prost Fartein_ValenAntonio_Galli_da_BibienaAl_Jawf,_LibyaAD_695 +Amir_chandAlcis_obliquisignaChandra_Talpade_MohantyAlgerian_safe_house,_Jalalabad Jake_MilnerAlternate_Communications_CenterIn_the_BleachersAlex_PuodziukasAltarpiece_of_Pilgrim_IICybernetical_PhysicsChristopher_Unthank1982_Independence_BowlAscoli_Calcio_1898Briggs-Rauscher_reactionsAdjadja/Afghanistan_from_Ahmad_Shah_until_Dost_MohammedCatholic_social_doctrine2833_BCBethy_WoodwardBateman_polynomials1966_Buenos_Aires_Grand_PrixA_River_Somewhere&2016-17_BVIFA_National_Football_League!1909_Major_League_Baseball_season1988_Oklahoma_Sooners_football2010s_in_Chechen_fashionAccademia_Olimpica Air_cooling +Amir_Saoud Alex_AuburnApamea_impulsa!Australian_federal_election,_2007 +Ain_Sakhri Belosaepiidae(Acts_of_Parliament_in_the_United_Kingdom Equity_Office David_Bintley Aksel_SchiotzAppropriation_Act_2000Edward_Johnson_III&2006_Ohio_State_Buckeyes_football_teamBattle_of_Fort_Beausejour Abel_Foullon Apollo_VIIICarry_on_up_the_jungle Armour_villa +201_PoplarArta_prefecture2015-16_EkstraklasaAlport,_Ontario BongolandAlfred_Charles_PostAam_Aadmi_Party_crisis Andrea_ModaAbdul_Halim_ShararApostolic_Vicariate_of_YunnanCatherine_SteadmanAgastachys_odorata9783_Tensho-kan +AFL_CairnsAbomey"Anne_Crofton,_1st_Baroness_CroftonCash-flow_return_on_investment%Alberto_Arvelo_Torrealba_MunicipalityAbyssinian_Shorthorned_ZebuAlbanian_hip_hopAlphonso_IV_of_Portugal19th_The_Alberta_Mounted_RiflesChinese_shadow_theatre.American_Committee_of_the_Fourth_International2014_Bahrain_GP2_Series_roundAlexandrian_orthodox2010_Hurricane_Season21938_All-Ireland_Senior_Camogie_Championship_Final ATC_code_D01AlbedoChavigny,_Meurthe-et-Moselle Becky_Essex$Archaeological_Museum_Padre_Le_PaigeAbu_Bakar_Sillah Back_chatAnchylobela_dyseimataAnthony_Overton Bear_maulAmbarawa,_Central_Java Amber_lager2nd_LAAD Ashiya,_HyogoAngels_at_RiskAudrey_Marie_Munson&1984_Australian_Football_ChampionshipsAmmonia_fountainAllister_BentleyAlsager_Hay_Hill1753_English_cricket_season 2009-10_New_Jersey_Devils_seasonAn_Untamed_StateBeatrice_CarmichaelAbdul_Ghani_AhmadArteria_suralisBerzasca_River Angel_Attack&1969_San_Francisco_49ers_football_teamAnthony_BeilensonCrystalline_EntityGranice203rd_General_HospitalAcrocercops_rhombiferellumAmpliglossum_blanchetii 11553_Scheria Ashkenozi2010_Calder_Cup_Playoffs Alice_Caymmi Alfredo_Alvar2006_Legends_TourAlbano_Albanese#1943_Frankford_Junction_train_wreckEvans_Court_Apartment_Building$Abu_al-Rayhan_Muhammad_ibn_al-BiruniAbubakar_Muhammad_RimiDostpur%Accessories_Council_Excellence_Awards2006_North_American_heat_wave AmstelodamumA_Very_Peculiar_PracticeAllegorie_der_Liebe Alex_Mackie1812_Homestead_Farm_and_MuseumArgus_distributionAnthony_Thomas_StoverArthur_ShallcrossAntoine_Francois_Fourcroy Abbas_HalimAkiva_Baer_ben_Joseph BalatonfueredAntemnae Cling_Cling B_flat_major +AirExploreAuckland_Super_SprintAlfredo_De_GasperisGeoffrey_I_of_ViandenCopa_de_ZaachilaAlboacenBNH_Hospital_BangkokAgricultural_health_and_safetyChiasms +Al_KaraanaAlberta_Highway_872Among_the_mournersAchema_Power_Plant ATSE_Graz Arthroscopy.2010-2012_European_Nations_Cup_Second_Division1967_Cincinnati_Reds24th_Golden_Disc_Awards Johnny_Floyd Arthur_Rupin-Alpine_skiing_at_the_2011_Canada_Winter_GamesCollege_Press_ServiceAmerican_Psycho CBC_WinnipegBurning_the_process2011_Stanley_Cup_playoffsAndrew_Mumford%1925_in_fine_arts_of_the_Soviet_Union Aragvi_riverAndrew_AdamsonArcides_fulvohirtaAraya_Selassie_YohannesApartment_house Advanced_Art 1028_Lydina82005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti Adolph_WeissAdam_Jerzy_Czartoryski(1980_United_States_presidential_election 1956_OscarsBurundian_Senate_election,_2005Amarolea_floridana August_BierArbelodes_sebelensis Abiah_BrownA_Maceo_Smith_High_School1488_in_architecture2009_AMP_Energy_5001921_Baylor_Bears_football_team Dmitry_Akhba*2004_Big_12_Conference_Baseball_TournamentAbdisalam_OmerAlma,_son_of_Alma An_Phoblacht2009_Turner_Prize +Jack_Zajac1906_Wimbledon_ChampionshipsChuckwalla_ValleyAlien_QuadrologyChalcidoptera_contraria6Alaska_Republican_Gubernatorial_Primary_Election,_2006 333639_YaimaAquila_hastataAl-Fua AnihilationInternational_Toy_Fair38th_Regiment_Indiana_Infantry Andrea_StellaAnselmo_de_Moraes ApplemoreAkpinar,_KirsehirAnt_nestCatherine_of_SienaBarbosAmlaib_mac_IduilbAlice_JanowskiAcacia_leptocarpa Al-Hadi_Yahya)2015_British_Figure_Skating_ChampionshipsAvenues_TelevisionDendropsophus_sartori1952_in_GermanyArmuchee_High_School April_1_RFCCaroline_Bliss66th_Rice_Bowl Alec_Smight Alexei_PaninCodewordDormice2105_BC#5th_National_Congress_of_KuomintangCaminho_das_IndiasAgerbo Abe_Anellis +Aceh_Medal Alltech_ArenaAly_Oury757th_Troop_Carrier_Squadron Alec_PetersAgua_Buena_AirportAlessandro_LiviAndkaerCateran'57th_Venice_International_Film_Festival Brijal_PatelCnemaspis_jerdoniiAluminum_sodium_saltArnaldo_Antonio_Sanabria_AyalaAngels_of_IronBugs_Bunny_Rabbit_RampageAdmiralty_Class_Destroyer Atlas_MediaArcesilaus_i_of_cyrene.2011_Tajikistan_national_football_team_resultsArtur_Shakhnazarov747_Express_Bus101-in-1_Party_MegamixFastpoint_GamesAnalog_Anthology_1 Archival_bond1985_Air_Force_Falcons_footballDAmerican_Airlines_plane_diverted_to_Miami_after_landing_gear_problem&Adaptive_Evolution_in_the_Human_GenomeArthur_Strangways1583_in_poetryAndrew_igoudala Euonychophora Catechizing$1960-61_ice_hockey_Bundesliga_season Buk_Vlaka Arbor_Day +Guan_Sheng!2014_Barcelona_Open_Banc_Sabadell1976-77_Nationalliga_A AFL_records2005_Tour_Down_Under92_BCEBento_Box_AnimationAlabama_TerritoryAbdul-Wasa_Al-SaqqafArchbishops_of_SemarangAmbivinaAghjaghala_UliaBlechnum_novae-zelandiae +DictyosomeArts_Council_of_Great_Britain LBC_Radio Ageo,_Saitama Babla_Mehta2012-13_Russian_Cup Chandragupt407th_Air_Refueling_Squadron AftermarketA_Portrait_of_New_Orleans2000-01_Yemeni_LeagueActinidia_chinensisAmsterdam_Tournament_1999Arthur_IberallAuricula_MeretriculaArchbishop_of_LahoreChippewa_Indians_of_MontanaAbidjan-Niger_Railway29th_Annual_Grammy_AwardsAteles_geoffroyi_frontatusEnrico_Cernuschi +A4183_roadAhrayut Alison_CastleAutomobile_aftermarket$2008_GAINSCO_Auto_Insurance_Indy_3001937_Scottish_Cup_Final2005_Clipsal_500_Adelaide Farid_Farjad13_Tribes_of_Long_IslandAfroneta_bamilekeiFrederick_Stuart_GreeneAndre_Braugher(1906_International_Lawn_Tennis_Challenge2009-10_NFL_PlayoffsCricket_Wellington Craig_BlazerAeolidiella_orientalisAndre_Prokovsky Angela_McKeeAirbase_Golubovci%2011_ISAF_Sailing_World_ChampionshipsBartica_Airport +Agusan_DamBosque_Real_Country_ClubGeorges_Duhamel +Allrounder'2017_Missouri_State_Bears_football_teamAllons_a_LafayetteAgathla1086_in_poetryAbsolute_extremeAgathe_BonitzerChinese_Red_PineAngular_dispersionJean-Sebastian_Giguere Actinium-235Ago,_filo_e_nodoAranea_cruentata2009_Korea_National_League +Americom-82006_Junee_Bushfire)2013_Major_League_Baseball_Home_Run_Derby1928_US_Presidential_ElectionAfter-eighty_generation"1932_Hawthorn_Football_Club_seasonAmelia_Elizabeth_Mary_Rygate Aline_KhalafAkron_Junction,_New_York'Apollo_moon_landing_conspiracy_theories(1978_National_League_Championship_Series$1959-60_German_football_championshipAlmost_a_BrideAndrew_Lysaght,_junior1902_Otani_expedition1892_Currie_Cup1988_USC_Trojans_football_team1944_in_Northern_IrelandAlfred_AchermanArcadia,_Nebraska4_x_400_metre_relay +A4030_roadChi-liAircraft_fairingBuddhism_in_BelizeAlameda_County_Open3Area_of_countries_and_regions_of_the_United_Kingdom'2014_Weber_State_Wildcats_football_team#American_Journal_of_Comparative_LawA_Teaspoon_Every_Four_HoursAstasisAkhrakouaeronon +Annenkrone Ballotine2000_Kipawa_earthquakeArchdiocese_of_cashel_and_emlyChevrolet_SS396 AchyroserisDaniel_Pulteney 2006_Major_League_Baseball_draftAdetunji_Idowu_OlurinArdatov,_Nizhny_Novgorod_OblastAndrew_Hilditch"A_Very_Merry_Daughter_Of_the_Bride 1993_in_radioDeltanAdnan_Custovic +Di_Gennaro237_AD Aaron_Gombar +AcrolophusAlfred_Bergman Charles_BebbDirico 1982_Major_League_Baseball_Draft DDT_wrestling1988-89_Houston_Rockets_season Acacia_loderi%2015_Deauville_American_Film_FestivalAndropadus_importunusAntonio_Bacchetti Ann_Trindade5_x_Monk_5_x_LacyBarlochan,_OntarioAchaian +Flow_riderAntiblemma_discerpta+1997_Illinois_Fighting_Illini_football_teamAhrntalApollo_ConferenceAlgenib_in_Perseus Craig_Norgate Antwerp_ZooCold_ContagiousBolitoChinese_bridges14th_Indiana_Infantry_RegimentBindunuwewa_massacreEastshore_Highway Daemonologie Aero_PacificoBlue_Ribbon_Schools_ProgramAsh_Township,_MIAl-Hatab_Square Alje_Vennema31920_All-Ireland_Senior_Football_Championship_Final Criss_OlivaBethlehem,_Ohio1976_WHA_Amateur_DraftAngela_FimmanoAlexander_Bonini_of_Alexandria Anarchist_faqAleksander_Benedykt_SobieskiCape_Florida_LighthouseFernando_VI_of_SpainCrossing_number 1984_NSL_CupBarbara_Weldon Andreas_OlsenBattle_of_Baima Amory_HansenAkhmimicAl_AwdaAdelheid-Marie_of_Anhalt-Dessau#Americans_for_Technology_LeadershipBelizean_diplomatic_missionsAfrican_communistAndosolAlan_AttractionA_Yank_in_Rome 2004_in_the_United_Arab_Emirates AdditionalityAssassination_of_Trotsky Alice_SoteroAgyneta_platnicki Alexandra_Vasilyevna_Velyaminova 1881_in_ChileArterial_ischemic_stroke Astro_GlacierChester_Earl_MerrowAlejandro_de_la_Madrid 70936_KamenAK_Steel_Holding_Corp1124_Stroobantia Asian_Wedding23837_Matthewnanni3Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden Betsy_HodgesArthur_and_the_Invisibles"Arkansas-Ole_Miss_football_rivalryAsia_CupArginine_racemase$585th_Field_Company,_Royal_Engineers1975_Stagg_Bowl7Dame_Commander_of_The_Most_Honourable_Order_of_the_BathAskajian'2006_Nebraska_Cornhuskers_football_teamCicero_Francis_Lowe_HouseConan_IV,_Duke_of_Brittany*2005_World_Modern_Pentathlon_Championships 1946_Aleutian_Islands_earthquakeANKRD17%1970_Maryland_Terrapins_football_team Ali_Dehkhoda 1244_in_art1520s_in_DenmarkAbdoulaye_GayeAn_Angel_Has_Arrived1453_BC2017_National_Games_of_ChinaA_Night_in_SickbayDateline_Diamonds419_guestbook_spammingFamiliar_bluetAbu_Bakr_Mirza7272_Darbydyar Ages_of_consent_in_Latin_America1982_Japan_Soccer_League_Cup2810_BCDruga_Liga_Republike_Srpske1998_Swedish_Rally1567_in_Norway+126_Army_Engineer_Regiment,_Royal_Engineers#2017_American_League_Wild_Card_Game August_Follen Ala_Gertner"Glenwood,_Harford_County,_MarylandApplied_ecologyAriarathes_V_Eusebes_Philopator2006_AFC_Champions_League 60_minutes_2Embryonic_shield-2001_Meath_Intermediate_Football_ChampionshipApparition_of_Christ_to_MadonnaHoosier_Road_ElementaryArua_UdaArray_comprehensionBaszkiAkron_NeighborhoodsCatholic_Church_in_Costa_RicaCanada-Sweden_relationsBarza_Radio_CommunityDalhousie_Middle_SchoolAlliphis_bakeriBartica_massacre 30th_January1920_revolution +AmyraldismAA_Jefferson_DistrictEunebristis_cinclidiasA_Scott_Connelly Antony_DuroseArval_BrethrenAnthidium_dissectum%Aru,_Democratic_Republic_of_the_Congo"1956-57_West_Indian_cricket_season2014_Moscow_Film_Festival +Anna_GurjiAllen_Memorial_Medical_LibraryAnton_Sistermans Clotheshorses 36_StratagemsAttack_of_the_crab_monsters30_rock_awards+Aeroflot,_Uralsk_Civil_Aviation_DirectorateAmblyseius_parabufortusIndian_coral_tree3285_Ruth_WolfeAnderson_da_Silva_Gibin5001st_Composite_GroupDanzik4810_RuslanovaArkendale,_VirginiaAl_Francis_BicharaCayenaA_Glass_of_DarknessGMC_CCKWAlabama_State_Route_1072011_in_motorsport$Adecco_General_Staffing,_New_ZealandAnbargah1995_Asian_Cup_Winners_Cup01986_Wales_rugby_union_tour_of_the_South_PacificAdya_Goud_Brahmin Akcakiraz24249_BobbiolsonAhmanson_TheatreAbdullah_ibn_Jahsh 1937_in_Chile2000_in_EnglandA_Deepness_In_The_Sky Area_code_678 Avalon_HillAnna,_Duchess_of_PrussiaAlexandr_Syman7400_series_logicGreenleaf_Township,_Minnesota AcetylsalEarth_and_Man_National_Museum Affetside1971_CFL_season +Beth_BaderEnrolled_NurseAl-Azraq4th_South_Carolina_RegimentAmanda_Overmyer Auto_wrapAnonymous_internet_banking CuratoriaA-rollAccra_hearts_of_oak_scApostasy_from_JudaismAcantharctia_tenebrosaAbigail_Keasey_Frankel 2008_Paraguayan_general_election Adams_motorDrummond_Community_High_SchoolAndrews_Nakahara10th_MaccabiahAckerman,_Rick Dumri,_BuxarAsking_Jesus_into_your_heartAdamowicz_brothers Alien_MusibatAhmad_Al_TayerAnalytical_phonics +Do_It_Good2004_Kumbakonam_School_fire#1977_Chattanooga_Mocs_football_team Globe_valvesAbelmoschus_crinitus 1874_Yale_Bulldogs_football_teamClimer Auchroisk2010_Albirex_Niigata_season AdhocracyChios_MassacreAfrican_Red_Slip1976_Portland_Timbers_seasonAlsace-Larraine 3750_IlizarovAleksandr_Shkaev 32_bar_formAequatorium_jamesonii Abade_neivaArakvaz207_Sqn Ducal_hat 2_DegreesAhmeddiyya_IslamAmidi-ye_Kohneh!Contributions_to_Indian_Sociology Clark_LeibleeAbraham_of_StrathearnmonthDate@.C'A DDC|DJCD'A@'ADBDAC D9BEA@iCAdAWBdAAvBAACB@ACACDvBCdACBDB@CA@C9B@CBABDCACC?DCB|DCvBC DCdA@CCCACvBA@EAEACC]D@BAAdABCA'ACCWBDBBD?D@CWB@CCAA D@C'A@DBCDB9BDiCiCBCBdAD D]DC@BEAC'AiC9BA|DD@9BvB@@CADWB]DC@ADCCCA D?DiCvBBAvBB@@A9BAA9BCCCBAJCBAA@C]DD9BA D@BB@ACWBD@CEA]DC9BJC@'A@CAADCJC D DCBDBvBiCDBdAiC?DAiC@CCJC DCBC?D]DAD@BC'AJCAACCAAAA]DA|D?DBA]DJC?DC@dA@DCC@@WBCDCDDB@ D@DCCA?DCA]D]DDAA'A9BCJCCC@D D9BCBEACdAAdAAiCB'ACiCWBWBiC]DDDCCC'ACCDACB|DdAAEAC9BAdACiCBdAC@D?D'A]D|DC DAAAiCABJCDdACC@C DCADCC@DCD9BCBACEAEAiCEA?DBC@B@B@ D@ DBCDCBA@AEA@CAvBDDCBB@CBBEAA D@ACADAABACAD@C|DAC@DCCAJCAABDDDAC9BDB@BBB]D.CC'A?DDACC]DCJC.C|DAiCCEAvBA?D@BA@DvB'A.CDA.CB|DBCB?DCC]DdA]DCADCBCBBA@ D.C|DACCA'ACACACCD.CDBdABA@iC@'ACvBA@ADDB]DAJC@WBDABACACAAADdAC@CCC'AB@BB@CDJCACA@@A?DB9B.CDA@?D9BC?D|D@B9BC]DDvBiCCiCC@BDDC DCJCiC]DD DBC'ADCCdA'A@BADCDCvBAdABACDWBC DCBABC9BB|DCAWBvBJCdAD.CABA|DCCB.CBABWBiCDAACCiC DAB@CC?DBCCB@CJCD?D@'AD]DCACD.CA?DvBDDBACC]DC'AJCCCEADBBBC.CDWBBB@.C DBAJCAdAABdACCABCAiCAiCCB]DC?DDiCCCCBBAdABAiC'ABCJCCD?DAEAAAACBBiC@BC@CDDDBBCACD@BACCC@CABdADWBEACBBBADC@DA@9B|D'ACdACA DBEAJCAA@'ABDCCAA@BWBJCD?DiC@A]DAACBCAC D?DJCA@CDEAA DCdAC]DDDBCdACCBdA@AC@BB?DCdACCBCCWB?DCiCiCCCWB.CCCB'ACCCAvBJCAAABCiCCdA]D]DEA9BBJCA]DABAAC@CAiC?DCiCBEAABAB@.CA@BB DA|D?DA'AC DiCABBB]DAAA]DvBCAACCBC@.CWB'ACCADBvB DBJCA?DBADhitsUInt32"PLXP^ (aX$  @## 6ZHR &W0ZCO8X'u0@( + O  >9 $/ +; 2.$@ +]#hOC w )[#B^#& E %;. +h ' +NwI&M:a37 e^ + +='    +O) g:6' qR +M @ R/BL +^5hrVlbZX2*f[-&aj4LD3 aR  > !b&Q&*8| P[ 3 WJ H3Usbr, y,5 D_]x:7A-G& ?U5b8 +-+%t5K +K25f" 0'& ?T?V! + hbS  wD% +?I9  +`pg ?K73~x IEY*z?di  Q*8E5.E(!/>/>()%CU[/'Z +#~ 41%#KI*os4w-(!/  )FZF!s/9:^0L:2 +&* +$ 5V "Y bl$U5 +<-CQx$ I_w V!9p;+*db-%#'B %%V)   + * \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.msgpk b/docs/ja/integrations/data-ingestion/data-formats/assets/data.msgpk new file mode 100644 index 00000000000..fb05c0c859a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.msgpk differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.orc b/docs/ja/integrations/data-ingestion/data-formats/assets/data.orc new file mode 100644 index 00000000000..1e360f94fe7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.orc differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data.parquet b/docs/ja/integrations/data-ingestion/data-formats/assets/data.parquet new file mode 100644 index 00000000000..52a08e0cfff Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/data.parquet differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_csv_types.csv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_csv_types.csv new file mode 100644 index 00000000000..d2f59a757fa --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_csv_types.csv @@ -0,0 +1,102 @@ +"path","month","hits" +"String","Date","UInt32" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +"AAA_Americas_Trios_Championship","2015-10-01",104 +"1420_in_literature","2016-05-01",20 +"Adair,_Beegie","2017-08-01",2 +"1980_Rugby_League_State_of_Origin_match","2017-07-01",2 +"Column_of_Santa_Felicita,_Florence","2017-06-01",14 +"2007_Copa_America","2016-07-01",178 +"Car_dealerships_in_the_USA","2015-07-01",11 +"Dihydromyricetin_reductase","2015-07-01",1 +"ATCvet_code_QB05BB01","2017-04-01",1 +"City_CarShare","2017-01-01",125 +"Heidenrod","2017-01-01",10 +"Arthur_Henrique","2016-11-01",12 +"Alan_Ebnother","2015-11-01",66 +"2013_UConn_football_season","2017-05-01",2 +"2008_American_League_Division_Series","2016-12-01",376 +"Antilipaemic","2017-09-01",12 +"Aberzombie","2016-12-01",28 +"2008_Asian_Wrestling_Championships","2016-12-01",76 +"Federal_Correctional_Complex,_Pollock","2017-01-01",19 +"Central_body","2015-07-01",32 +"Binbrook,_Ontario","2015-07-01",446 +"Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun","2016-10-01",25 +"Ashford_Lake","2017-10-01",80 +"1942_Joint_Strike","2015-12-01",3 +"AFC_Youth_Championship_2012","2017-10-01",2 +"Akhira","2016-07-01",64 +"Arroniro_Arlieri","2016-10-01",1 +"Alesheim_Burgsalach","2015-05-01",2 +"2700_classic","2017-05-01",4 +"ARX-8_Laevatein","2015-06-01",14 +"1991_Newsweek_Champions_Cup_-_Singles","2017-06-01",3 +"Aphelandra_sinclairiana","2017-07-01",69 +"Asia_Kong","2015-10-01",2 +"2012_Internazionali_Tennis_Val_Gardena_Sudtirol","2016-02-01",1 +"24_Carat_Purple","2017-06-01",476 +"Acroliths","2017-12-01",9 +"Bundesautobahn_3","2016-04-01",264 +"ATC_code_S01AX21","2016-09-01",1 +"Allington,_Lincolnshire","2015-11-01",188 +"Acer_Aspire_One","2017-06-01",5169 +"ATC_code_L04AC","2015-06-01",1 +"1969_New_Year_Honours","2017-07-01",269 +"Antonio_Napolitano","2017-11-01",44 +"Amberfish","2017-10-01",11 +"1976_Cam_2_Motor_Oil_400","2018-03-01",45 +"April_25,_2017","2018-01-01",2 +"Akahori_Station","2016-06-01",11 +"Abducens_palsy","2016-05-01",28 +"Ancona_cathedral","2018-01-01",2 +"Ajou_Motor_College","2017-02-01",83 +"Brad_Skyes","2016-11-01",1 +"Alegro_PCS","2017-07-01",157 +"Franz_Dunshirn","2017-01-01",1 +"Arthur_Godfrey_Road","2016-11-01",3 +"Ab_Golman","2017-05-01",30 +"Art_in_early_modern_Scotland","2016-03-01",98 +"1968_World_Series","2016-02-01",1960 +"1828_in_the_UK","2017-08-01",3 +"Explorer-1_Prime_Unit_2","2016-11-01",11 +"2014_Desafio_Internacional_das_Estrelas","2017-12-01",31 +"Ambulyx_subocellata","2016-08-01",1 +"2008_Hamilton_Tiger-Cats_season","2015-11-01",153 +"Deuterogamist","2015-07-01",5 +"Art_Nouveau_furniture","2017-12-01",839 +"Allison,_Colorado","2015-10-01",85 +"2014_MLS_Re-Entry_Draft","2017-09-01",36 +"Amiot_353","2015-12-01",8 +"ACLU_of_Massachusetts","2015-11-01",106 +"Altable,_Spain","2016-10-01",1 +"Agnidra_scabiosa","2016-12-01",16 +"Dictyotremella_novoguineensis","2015-07-01",1 +"Compiler_Construction","2015-07-01",42 +"Aufheben","2016-11-01",1080 +"Avafauna","2017-06-01",17 +"Atheist_billboard","2017-01-01",19 +"2011_Indonesia_Super_League_All-Star_team","2015-11-01",15 +"BrahMos_II","2015-07-01",31 +"1707_in_art","2016-04-01",17 +"Aeromarine_Model_60","2016-06-01",34 +"Ayatollah-al-ozma","2015-06-01",12 +"Exanimus","2017-01-01",4 +"Anderby","2017-01-01",29 +"Ashgabat_indoor_tennis_arena","2017-07-01",27 +"1971_Rose_Bowl","2015-12-01",961 +"2004_HR56","2016-05-01",5 +"1886_in_South_Africa","2016-03-01",70 +"Bishop_of_Central_Newfoundland","2016-04-01",1 +"Alice_Rivlin","2016-09-01",1137 +"Arriba_en_la_Cordillera","2017-06-01",39 +"Adam_Lively","2016-06-01",77 +"Colasposoma_fairmairei_fairmairei","2017-06-01",5 +"Archie_Barton","2017-02-01",49 +"Aharon_wasserman","2016-01-01",7 +"Alabama_Educational_Television_Commission","2017-05-01",3 +"Advanced_Technology_Bomber","2016-02-01",67 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.csv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.csv new file mode 100644 index 00000000000..14a0e1ac080 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.csv @@ -0,0 +1,1000 @@ +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +"AAA_Americas_Trios_Championship","2015-10-01",104 +"1420_in_literature","2016-05-01",20 +"Adair,_Beegie","2017-08-01",2 +"1980_Rugby_League_State_of_Origin_match","2017-07-01",2 +"Column_of_Santa_Felicita,_Florence","2017-06-01",14 +"2007_Copa_America","2016-07-01",178 +"Car_dealerships_in_the_USA","2015-07-01",11 +"Dihydromyricetin_reductase","2015-07-01",1 +"ATCvet_code_QB05BB01","2017-04-01",1 +"City_CarShare","2017-01-01",125 +"Heidenrod","2017-01-01",10 +"Arthur_Henrique","2016-11-01",12 +"Alan_Ebnother","2015-11-01",66 +"2013_UConn_football_season","2017-05-01",2 +"2008_American_League_Division_Series","2016-12-01",376 +"Antilipaemic","2017-09-01",12 +"Aberzombie","2016-12-01",28 +"2008_Asian_Wrestling_Championships","2016-12-01",76 +"Federal_Correctional_Complex,_Pollock","2017-01-01",19 +"Central_body","2015-07-01",32 +"Binbrook,_Ontario","2015-07-01",446 +"Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun","2016-10-01",25 +"Ashford_Lake","2017-10-01",80 +"1942_Joint_Strike","2015-12-01",3 +"AFC_Youth_Championship_2012","2017-10-01",2 +"Akhira","2016-07-01",64 +"Arroniro_Arlieri","2016-10-01",1 +"Alesheim_Burgsalach","2015-05-01",2 +"2700_classic","2017-05-01",4 +"ARX-8_Laevatein","2015-06-01",14 +"1991_Newsweek_Champions_Cup_-_Singles","2017-06-01",3 +"Aphelandra_sinclairiana","2017-07-01",69 +"Asia_Kong","2015-10-01",2 +"2012_Internazionali_Tennis_Val_Gardena_Sudtirol","2016-02-01",1 +"24_Carat_Purple","2017-06-01",476 +"Acroliths","2017-12-01",9 +"Bundesautobahn_3","2016-04-01",264 +"ATC_code_S01AX21","2016-09-01",1 +"Allington,_Lincolnshire","2015-11-01",188 +"Acer_Aspire_One","2017-06-01",5169 +"ATC_code_L04AC","2015-06-01",1 +"1969_New_Year_Honours","2017-07-01",269 +"Antonio_Napolitano","2017-11-01",44 +"Amberfish","2017-10-01",11 +"1976_Cam_2_Motor_Oil_400","2018-03-01",45 +"April_25,_2017","2018-01-01",2 +"Akahori_Station","2016-06-01",11 +"Abducens_palsy","2016-05-01",28 +"Ancona_cathedral","2018-01-01",2 +"Ajou_Motor_College","2017-02-01",83 +"Brad_Skyes","2016-11-01",1 +"Alegro_PCS","2017-07-01",157 +"Franz_Dunshirn","2017-01-01",1 +"Arthur_Godfrey_Road","2016-11-01",3 +"Ab_Golman","2017-05-01",30 +"Art_in_early_modern_Scotland","2016-03-01",98 +"1968_World_Series","2016-02-01",1960 +"1828_in_the_UK","2017-08-01",3 +"Explorer-1_Prime_Unit_2","2016-11-01",11 +"2014_Desafio_Internacional_das_Estrelas","2017-12-01",31 +"Ambulyx_subocellata","2016-08-01",1 +"2008_Hamilton_Tiger-Cats_season","2015-11-01",153 +"Deuterogamist","2015-07-01",5 +"Art_Nouveau_furniture","2017-12-01",839 +"Allison,_Colorado","2015-10-01",85 +"2014_MLS_Re-Entry_Draft","2017-09-01",36 +"Amiot_353","2015-12-01",8 +"ACLU_of_Massachusetts","2015-11-01",106 +"Altable,_Spain","2016-10-01",1 +"Agnidra_scabiosa","2016-12-01",16 +"Dictyotremella_novoguineensis","2015-07-01",1 +"Compiler_Construction","2015-07-01",42 +"Aufheben","2016-11-01",1080 +"Avafauna","2017-06-01",17 +"Atheist_billboard","2017-01-01",19 +"2011_Indonesia_Super_League_All-Star_team","2015-11-01",15 +"BrahMos_II","2015-07-01",31 +"1707_in_art","2016-04-01",17 +"Aeromarine_Model_60","2016-06-01",34 +"Ayatollah-al-ozma","2015-06-01",12 +"Exanimus","2017-01-01",4 +"Anderby","2017-01-01",29 +"Ashgabat_indoor_tennis_arena","2017-07-01",27 +"1971_Rose_Bowl","2015-12-01",961 +"2004_HR56","2016-05-01",5 +"1886_in_South_Africa","2016-03-01",70 +"Bishop_of_Central_Newfoundland","2016-04-01",1 +"Alice_Rivlin","2016-09-01",1137 +"Arriba_en_la_Cordillera","2017-06-01",39 +"Adam_Lively","2016-06-01",77 +"Colasposoma_fairmairei_fairmairei","2017-06-01",5 +"Archie_Barton","2017-02-01",49 +"Aharon_wasserman","2016-01-01",7 +"Alabama_Educational_Television_Commission","2017-05-01",3 +"Advanced_Technology_Bomber","2016-02-01",67 +"1-krona","2017-01-01",4 +"Ahmadabad-e_Kalij-e_Sofla","2017-01-01",3 +"Bob_Dolman","2016-11-01",245 +"Bellevue,_French_Guiana","2017-01-01",5 +"Bison_Nickel","2017-01-01",2 +"Arthur_Drabble","2016-12-01",35 +"Edgewater_Borough,_New_Jersey","2016-11-01",3 +"Alberto_Cambrosio","2017-11-01",31 +"Amalia_Celia_Figueredo","2017-07-01",32 +"1989_-_1992_Rugby_League_World_Cup","2016-01-01",10 +"Admir_Seferagic","2016-06-01",7 +"Adriaan_Loosjes","2015-05-01",46 +"Alfred_Manuel_Martin","2015-06-01",3 +"Academy_of_the_Arabic_Language","2015-08-01",67 +"Ankita_Shrivastav","2018-01-01",7430 +"Anarchism_in_asia","2017-11-01",1 +"Batiquitos_Lagoon_State_Marine_Conservation_Area","2015-07-01",18 +"Alstonia_calophylla","2017-12-01",2 +"4-Hydroxycyclohexanecarboxylate_dehydrogenase","2016-11-01",4 +"832_symmetry","2017-09-01",6 +"1931_Fuyun_earthquake","2016-07-01",64 +"1998_Masters_of_Formula_3","2016-01-01",60 +"2011_LG_Hockey_Games","2016-04-01",7 +"Generalized_pustular_psoriasis","2017-01-01",159 +"2013_European_Cup_Winter_Throwing","2016-07-01",56 +"2008_in_Argentina","2017-06-01",48 +"Apostrophized","2017-10-01",5 +"Algebraically_compact_module","2017-01-01",5 +"Askett","2015-10-01",79 +"2009_swine_flu_outbreak_timeline","2015-08-01",65 +"72704-01-9","2017-12-01",4 +"Alexandre-Charles-Albert-Joseph_Renard","2017-11-01",4 +"Acyl-CoA_oxidase","2016-09-01",250 +"2011_Budweiser_Shootout","2015-08-01",109 +"Augusta_Davies_Webster","2015-07-01",2 +"Association_theory","2017-07-01",112 +"Abemama_Airfield","2015-05-01",8 +"Archaeological_Museum_of_Heraklion","2015-10-01",14 +"Authorized_marches_of_the_Canadian_Armed_Forces","2016-11-01",241 +"1986_in_Portugal","2017-01-01",7 +"Antiziganism_in_Bulgaria","2017-12-01",13 +"Adriana_Martin","2015-09-01",21 +"2004_Green_Bay_Packers_season","2015-05-01",970 +"Agrippa_the_Sceptic","2017-11-01",95 +"Admiral_Island","2016-04-01",1 +"Auxiliary_sign_language","2015-06-01",31 +"2013_Food_City_500","2015-06-01",90 +"Andy_Roesch","2015-08-01",15 +"Alsoszentivan","2017-05-01",4 +"Architecture_of_Belgium","2015-05-01",199 +"1_South_African_Infantry","2017-06-01",5 +"1930_Auburn_Tigers_football_team","2016-12-01",39 +"1860_in_Canada","2017-05-01",269 +"Aldeaseca_de_la_Frontera","2018-03-01",21 +"Elijah_Fox_Cook","2015-07-01",13 +"2010_BCS_Bowl_Games","2016-03-01",1 +"2017_NPSL_season","2017-06-01",2806 +"Bank_of_New_South_Wales_v_Commonwealth","2016-12-01",173 +"American_Enterprise_Association","2016-02-01",4 +"26th_Kentucky_Derby","2018-03-01",1 +"Chaldean_Diocese_of_Amid","2016-11-01",18 +"Ajaran_language","2016-03-01",1 +"1992_Texas_Rangers_season","2017-06-01",113 +"26_SAS","2017-12-01",3 +"2015_Terengganu_FA_season","2016-01-01",537 +"Aagard,_Oregon","2017-03-01",3 +"Auberry,_CA","2017-05-01",13 +"American_Eskimo_spitz","2015-09-01",3 +"Antidiabetic","2016-11-01",75 +"Asinius","2017-11-01",26 +"Andrey_Vasilievich_Abramov","2016-10-01",1 +"Alan_Carrington","2018-03-01",91 +"Colebrook,_Ontario","2017-06-01",2 +"Abbasabad-e_Kheyrabad","2015-08-01",24 +"Arandjelovac_Municipality","2016-02-01",1 +"Aloysius_Valente","2017-12-01",11 +"Almondo_Curry","2016-03-01",86 +"4th_century_AD","2017-03-01",13 +"Askhat_Dilmukhamedov","2016-02-01",77 +"1147_AD","2017-05-01",1 +"1953_Torneo_di_Viareggio","2017-03-01",20 +"ATP_Schenectady","2015-12-01",30 +"Lakarian_City","2017-01-01",3 +"Adam_Ferency","2017-12-01",176 +"AugustDvorak","2016-07-01",5 +"97th_Light_Infantry_Division","2017-07-01",1 +"16th_Connecticut_Infantry_Regiment","2016-05-01",146 +"2011_Somalian_drought","2017-05-01",2 +"Anbargah","2017-12-01",8 +"1921_in_Paraguayan_football","2016-03-01",2 +"Cosmetic_dermatitis","2017-01-01",5 +"Annunciation_Greek_Orthodox_Cathedral,_Atlanta,_Georgia","2015-09-01",9 +"1300_AM","2016-07-01",106 +"A_Promising_Africa","2016-03-01",41 +"2015-16_Odense_Bulldogs_season","2016-10-01",1 +"Aral_AG","2017-12-01",1446 +"Angel_Vivar_Dorado","2015-12-01",6 +"1951_Australian_Championships","2018-03-01",32 +"DJMax_Portable_Hot_Tunes","2017-01-01",27 +"Allinge","2017-03-01",32 +"1986_Buick_WCT_Finals","2016-11-01",14 +"Arimatsu,_Aichi","2015-06-01",112 +"Arthur_Berzinsh","2017-02-01",249 +"Apolima_Uta","2017-04-01",23 +"Capitol_Hill_Pride_Festival","2015-07-01",19 +"Kara-Murza","2017-01-01",5 +"Aigleville,_Alabama","2015-11-01",19 +"Abdullah_bin_al-Hussein","2017-02-01",1 +"2017-18_Inter_Milan_season","2018-03-01",26 +"African_Collared_Dove","2016-07-01",10 +"Achaea_dmoe","2016-11-01",3 +"Aurora,_Utah","2016-06-01",201 +"Architecture_in_Portland,_OR","2017-07-01",1 +"Charchala","2015-07-01",4 +"Around_the_Roses","2015-07-01",3 +"1965_in_music","2016-12-01",3394 +"Alojzije_Jankovic","2017-04-01",5 +"Arisu_Seno","2015-08-01",6 +"ALCO_T-6","2017-01-01",77 +"1998_Royal_Bank_Cup","2015-12-01",32 +"1956_Claxton_Shield","2016-11-01",9 +"Anita_Dube","2017-07-01",233 +"Anderson_Windows","2015-05-01",13 +"Annaquatucket_River","2018-03-01",38 +"Black_salve","2017-01-01",1496 +"Anna_Pendleton_Schenck","2017-02-01",11 +"Asghar_Nadeem_Syed","2017-07-01",146 +"Disarming","2016-11-01",5 +"Antarctic_ice_cap","2017-08-01",7 +"Antonio_Ottone","2017-05-01",11 +"Coralie_Larnack","2017-01-01",9 +"Budha_Subba_Gold_Cup","2016-11-01",24 +"Amphoe_Chaiya","2017-03-01",9 +"Anarcho-capitalism_in_Somalia","2016-10-01",7 +"Felix_Loch","2017-01-01",131 +"26508_Jimmylin","2017-12-01",3 +"Andrew_McMillen","2015-11-01",134 +"Dundee_Canal_Industrial_Historic_District","2017-01-01",2 +"Aula_Baratto","2015-12-01",140 +"Church_of_St_Mary,_Knowsley","2015-07-01",1 +"Aggelakis","2017-10-01",1 +"Al_Badiyah","2017-11-01",157 +"Assault_Gunboat","2016-03-01",21 +"Lachau","2017-01-01",4 +"2008_Pittsburgh_Steelers_season","2016-12-01",10018 +"Apolychrosis_candidus","2018-01-01",24 +"Andrei_Krylov","2017-02-01",192 +"Aldesh_Vadher","2018-02-01",7 +"Alwand","2017-02-01",7 +"Edward_Baker_Lincoln","2015-07-01",4347 +"Aermotor_Corporation","2017-11-01",4 +"Aischylos","2017-01-01",7 +"6th_Assault_Aviation_Corps","2017-07-01",100 +"Azygos_lobe","2016-10-01",1598 +"Demirciler,_Nazilli","2015-07-01",4 +"Akhlaq-e-Hindi","2016-11-01",13 +"Dragon_Crusaders","2016-04-01",122 +"25V_USB","2016-01-01",1 +"Calliophis_melanurus","2017-01-01",31 +"Antonionian","2016-10-01",15 +"Ashley_Richardson","2017-09-01",1216 +"1st_Observation_Group","2018-01-01",6 +"Andrzej_Bargiel","2015-05-01",97 +"2008_AFL_National_Under_16_Championships","2018-03-01",20 +"Ammon_Bundy","2016-09-01",11890 +"Benno_Wandolleck","2016-11-01",5 +"Aero-Kros_MP-02_Czajka","2016-03-01",136 +"A6005_road","2015-10-01",14 +"Eagle_Eye_Networks","2015-07-01",101 +"Aarberg","2017-12-01",277 +"Encyclopedia_of_anthropology","2015-07-01",1 +"Duncormick_railway_station","2016-11-01",7 +"Aiqing_huajiao_zhuanyi","2017-03-01",1 +"Crude_oil_washing","2016-04-01",466 +"2010_Indiana_Hoosiers_football_team","2017-06-01",90 +"Book_of_Bodley_Head_Verse","2015-07-01",18 +"Absence_seizure","2016-05-01",18152 +"Cayucupil","2016-04-01",3 +"Akanabee","2017-03-01",1 +"Grooved_consonant","2017-01-01",5 +"Dellamora_philippinensis","2015-07-01",7 +"Dejan_Blazevski","2017-01-01",1 +"Arabis_armena","2016-08-01",25 +"1988_Summer_Paralympics_medal_table","2016-12-01",90 +"2012-13_Basketball_Championship_of_Bosnia_and_Herzegovina","2017-04-01",2 +"1966_in_music","2017-10-01",3510 +"Antti_Tyrvainen","2015-12-01",2 +"African_desert","2016-06-01",262 +"Bruneau_mariposa_lily","2016-04-01",1 +"Bernie_Parmalee","2017-06-01",221 +"2015_South_American_Youth_Football_Championship_squads","2015-09-01",594 +"1985_IIHF_World_U20_Championship","2015-08-01",7 +"18th_British_Academy_Film_Awards","2018-02-01",270 +"523_Ada","2016-04-01",35 +"Active_Pharmaceutical_Ingredients","2016-02-01",5 +"Burley,_ID_mSA","2015-07-01",2 +"CFRN-TV-10","2017-06-01",2 +"1982_Super_Bowl_of_Poker","2017-08-01",38 +"Australian_Journal_of_Educational_Technology","2017-01-01",1 +"2013_Super_League_Grand_Final","2016-06-01",212 +"2006_BCR_Open_Romania","2015-06-01",25 +"Charlestown_Townies","2016-04-01",319 +"1943_Polish_underground_raid_on_East_Prussia","2017-08-01",8 +"Anthony_Celestino","2018-02-01",182 +"Andrew_Beerwinkel","2018-02-01",73 +"Greigia_atrobrunnea","2017-01-01",1 +"Adrian_Beecham","2017-11-01",1 +"Implementation_of_mathematics_in_set_theory","2017-01-01",12 +"Annastacia_Palaszczuk","2015-05-01",6247 +"Egon_Zimmermann_II","2016-11-01",3 +"Air_aide-de-camp","2018-03-01",137 +"Albert_Murphy","2016-09-01",1 +"1924_Arkansas_Razorbacks_football_team","2016-02-01",28 +"Avondale_Mill","2016-10-01",68 +"Alexander_Volzhin","2015-12-01",25 +"Arek_Monthly","2017-08-01",31 +"Dinka_Blanche","2015-07-01",1 +"1921_Mercer_Baptists_football_team","2016-11-01",10 +"Afro-Antiguan_and_Barbudan","2016-06-01",252 +"American_southern_literature","2016-10-01",3 +"1947_Swiss_Grand_Prix","2016-11-01",32 +"99p_Stores","2017-12-01",3028 +"Artem_Radkov","2018-03-01",21 +"Arctic_brome","2016-12-01",19 +"Battle_Of_Moskova","2015-06-01",6 +"Airdrieonians","2016-06-01",32 +"Advanced_transportation_controller","2018-03-01",79 +"BC_government","2016-12-01",18 +"Antonio_Maura","2017-03-01",457 +"Anjuman,_Afghanistan","2017-09-01",62 +"Deodato_Guinaccia","2015-07-01",13 +"Blowjob_Betty","2016-11-01",28 +"453d_Flying_Training_Squadron","2017-08-01",3 +"1990_Africa_Cup_of_Nations","2016-04-01",22 +"Agenville","2016-08-01",100 +"1202_in_Scotland","2018-01-01",82 +"Calytrix_desolata","2017-06-01",10 +"1957_in_Chile","2016-04-01",13 +"Anglican_Bishop_of_Torres_Strait_people","2017-08-01",1 +"2015_Mexican_Grand_Prix","2015-06-01",528 +"Catalan_parliament","2017-01-01",14 +"Cult_Shaker","2017-01-01",32 +"Ander_Gayoso","2016-11-01",34 +"Ageneiosus_ucayalensis","2017-12-01",20 +"Club_de_Berne","2015-07-01",194 +"Adecco","2016-03-01",9863 +"Anti-unionism","2018-01-01",11 +"Auchindoun_Castle","2017-01-01",102 +"557_in_poetry","2016-07-01",1 +"Abu_ol_Verdi_Rural_District","2017-01-01",1 +"Centro_73","2016-04-01",23 +"Dagger_compact_category","2016-04-01",97 +"Alan_Nunn_May","2017-11-01",770 +"Basal_clade","2015-07-01",44 +"Aizu_Line","2015-08-01",26 +"Edward_Kernan_Campbell","2016-04-01",5 +"865_area_code","2016-12-01",9 +"Bahamas_at_the_1984_Summer_Olympics","2017-06-01",35 +"Gardan_Kalat","2017-01-01",1 +"American_Samoa_national_under-19_football_team","2017-12-01",4 +"Kayah_National_United_League","2017-01-01",14 +"2007_Nordea_Nordic_Light_Open_-_Singles","2016-10-01",2 +"Avondale_Estate","2016-11-01",2 +"Acalolepta_variolaris","2017-02-01",3 +"Anantapur,_Andhra_Pradesh","2017-05-01",1032 +"Amenable_Banach_algebra","2015-08-01",59 +"300_metres","2017-01-01",61 +"Black_Bottom,_Kentucky","2016-04-01",8 +"100_Players_Who_Shook_The_Kop","2018-01-01",1133 +"Adventure_story","2015-07-01",29 +"Anacampsis_lignaria","2017-05-01",5 +"2007_American_Indoor_Football_Association_season","2015-09-01",89 +"Dmitry_Kardovsky","2016-04-01",33 +"A10_autoroute","2015-11-01",27 +"1995_Sydney_Bulldogs_season","2017-04-01",40 +"Ilex_jelskii","2017-01-01",2 +"Adrian_Jose_Hernandez","2016-10-01",2 +"CallAir_A-5","2016-11-01",4 +"22nd_meridian_west","2015-07-01",45 +"Anglican_Diocese_of_Antananarivo","2015-08-01",2 +"Andrew_Kelsey","2016-11-01",14 +"Brownhill_Creek","2017-06-01",4 +"Abunai_Deka","2015-06-01",269 +"Aisha_Jefferson","2017-04-01",115 +"Alonso_Lopez","2017-03-01",7 +"Aeroparque_Ciudad_de_Mendoza","2016-01-01",1 +"Arthur_Ashley_Sykes","2017-12-01",45 +"Holy_Face_Medal","2017-01-01",20 +"1Chronicles","2018-02-01",1 +"2014_CFU_Club_Championship","2017-12-01",108 +"Aetna_class_ironclad_floating_battery","2015-06-01",37 +"Antoine_Delrio","2015-07-01",2 +"Chislet_Windmill","2015-07-01",38 +"Aerojet_SD-2","2017-07-01",59 +"Age_role_play","2015-09-01",2 +"50687_Paultemple","2018-03-01",8 +"1997-98_Cuban_National_Series","2017-02-01",1 +"Aleksandr_Borisovich_Belyavskiy","2017-10-01",42 +"Carol_MacReady","2017-01-01",111 +"18th_Chess_Olympiad","2015-06-01",134 +"Clara_Schonfeld","2015-07-01",1 +"Apollonius_of_Athens","2017-02-01",35 +"ABC_80","2018-03-01",603 +"Apatelodes_damora","2015-08-01",22 +"Ernest_Walbourn","2016-04-01",30 +"428_BCE","2017-04-01",2 +"72nd_Seaforth_Highlanders","2017-12-01",29 +"Broughton_Hackett","2015-07-01",38 +"A_Fazenda_2","2016-12-01",56 +"ATCvet_code_QJ01MQ","2017-05-01",2 +"Abura,_Iran","2017-03-01",3 +"DeLeon_Independent_School_District","2015-07-01",1 +"Abby_aldrich","2016-09-01",1 +"Cinema_One_Originals","2016-11-01",359 +"2013_European_Short_Course_Swimming_Championships","2017-09-01",124 +"Ars_technica","2015-11-01",442 +"AMS_Production_Company","2016-02-01",1 +"Joao_Soares","2017-01-01",1 +"Cervical_vertebra_6","2017-06-01",45 +"Kevin_Pugh","2017-01-01",2 +"Alpha-1_antitrypsin","2015-11-01",11845 +"Assyrians_in_iran","2017-07-01",53 +"Boophis_ankarafensis","2016-11-01",2 +"A_View_To_a_Kill","2018-01-01",4 +"Charles_Edouard_Brown-Sequard","2015-07-01",7 +"1919_in_Ireland","2017-04-01",239 +"74th_Foot","2015-06-01",3 +"9275_Persson","2016-07-01",22 +"Dalcerides_mesoa","2015-07-01",11 +"A_Summer_Bird-Cage","2016-03-01",248 +"2011_NAB_Cup","2017-10-01",127 +"13th_Parliament_of_Lower_Canada","2015-08-01",41 +"2011_Players_Championship_Finals","2015-07-01",25 +"Flag_of_Tenerife","2017-01-01",128 +"Hypopta_corrientina","2017-01-01",1 +"Jalatarangam","2017-01-01",16 +"Adjoint_endomorphism","2018-01-01",330 +"Anime_conventions","2015-06-01",18 +"2004_Grammy_Award","2015-06-01",13 +"American_war","2015-07-01",80 +"Beynes,_Yvelines","2016-11-01",32 +"Agriculture_Department","2016-06-01",16 +"Andrey_Chisty","2015-10-01",58 +"Ait_Yahia_Moussa","2017-08-01",7 +"Alfred_Blau","2017-03-01",57 +"1869_in_sports","2017-08-01",73 +"Ambolodia_Sud","2016-04-01",6 +"Animal_slaughter","2017-06-01",6423 +"Adamowka_Commune","2018-01-01",2 +"Arsenic_pentachloride","2016-03-01",467 +"220_BCE","2016-01-01",3 +"863d_Engineer_Battalion","2015-11-01",160 +"Amer_Abu-Hudaib","2017-04-01",31 +"Aaina_tv","2017-08-01",3 +"Arnhem,_Netherlands","2015-08-01",67 +"Antoine_de_sartine","2015-08-01",4 +"ATC_code_A16","2016-01-01",155 +"Eastern_Front","2017-01-01",70 +"Ashy-headed_tyrannulet","2016-12-01",44 +"Aoheng_language","2015-08-01",64 +"1996_World_Junior_Canoe_Slalom_Championships","2017-11-01",15 +"Agriophara_nodigera","2017-11-01",12 +"Amsterdam_Island_cattle","2015-12-01",675 +"Aliyah_from_the_Soviet_Union_in_the_1990s","2017-08-01",54 +"Abandoned_and_Little_Known_Airfields","2018-01-01",2 +"Church_numerals","2015-07-01",57 +"Ankeny_Christian_Academy","2015-09-01",74 +"2010_FIFA_World_Cup_qualification_-_AFC_First_Round","2017-06-01",58 +"1ESS_switch","2015-07-01",514 +"Chelys_boulengerii","2016-04-01",1 +"Bivalent_logic","2016-11-01",25 +"Ivan_Skavinsky_Skavar","2017-01-01",1 +"Fergus_Sings_the_Blues","2016-04-01",62 +"2015-16_Libyan_Premier_League","2017-02-01",4 +"Dutch_Chess_Championship","2017-01-01",35 +"Every_Man_in_His_Humor","2016-11-01",1 +"2008_Allstate_BCS_National_Championship_Game","2015-08-01",11 +"Aq_Tappeh,_Hamadan","2015-09-01",25 +"Agrotractor","2016-02-01",1 +"Alexander_of_Pfalz-Zweibrucken","2017-12-01",2 +"2003_Mistral_World_Championships","2016-04-01",6 +"146th_Fighter-Interceptor_Wing","2015-11-01",49 +"Al-Qahir","2016-04-01",328 +"25604_Karlin","2015-05-01",20 +"Allen_taflove","2017-12-01",3 +"Aretha_Thurmond","2017-05-01",109 +"Atlanta_and_lagrange_rail_road","2015-07-01",1 +"ACSI_College_Iloilo","2015-10-01",1 +"Alan_Sacks","2015-07-01",150 +"African_Desert_Warbler","2017-02-01",11 +"A_Man_and_His_Soul","2018-02-01",89 +"ASCII_ART","2015-05-01",9 +"1992-93_VMI_Keydets_basketball_team","2016-10-01",1 +"George_and_the_Dragon","2017-01-01",18 +"2012_NAB_Cup","2016-12-01",99 +"1965_Indy_500","2016-05-01",51 +"Forest_Glen,_Nova_Scotia","2016-04-01",9 +"A_Critical_Dictionary_of_English_Literature","2016-08-01",4 +"Aquion_Energy","2015-08-01",1077 +"Alibeyce,_Emirdag","2017-09-01",1 +"Blauhu00F6hle","2015-07-01",1 +"Ian_Sommerville","2017-01-01",1 +"Air_propulsion","2017-07-01",474 +"2016_12_Hours_of_Sebring","2016-10-01",187 +"Asites","2017-07-01",4 +"Al-Kini","2017-03-01",1 +"Austin_Aztex_2009_season","2016-03-01",10 +"Alto_Vista_Chapel","2015-12-01",833 +"Abecedaria","2017-04-01",22 +"Farm_to_Market_Road_2503","2016-11-01",3 +"Anglican_Bishop_of_The_Leeward_Islands","2015-09-01",2 +"Basketball_at_the_2011_Pan_American_Games","2017-06-01",120 +"Angela_Peel","2016-08-01",7 +"Amber_Frey","2018-02-01",728 +"Afraid_to_Sleep","2017-06-01",51 +"ATC_code_A02BA","2018-02-01",7 +"Apateon_pedestris","2015-11-01",5 +"Alois_Estermann","2015-12-01",1155 +"1752_in_science","2016-01-01",78 +"Baldassin","2017-06-01",3 +"Camilla_Hildegarde_Wedgwood","2017-01-01",1 +"B-A-C-H_motive","2016-10-01",3 +"AI_Velorum_star","2016-09-01",1 +"Ali_Zayn_al-Abidin","2017-04-01",71 +"Ailurarctos_lufengensis","2015-07-01",1 +"Clearview,_Philadelphia","2017-06-01",67 +"Adam_Sender","2016-08-01",759 +"Apriona_paucigranula","2018-02-01",7 +"Dark_at_the_Top_of_the_Stairs","2015-07-01",10 +"Acanthio","2017-12-01",11 +"1980_Labatt_Brier","2018-01-01",111 +"2016-17_New_York_Knicks_season","2017-10-01",21 +"1995_CAF_Cup","2015-10-01",48 +"Boiled_linseed_oil","2016-04-01",79 +"2015_Kumanovo_clashes","2016-07-01",6 +"David_Jamieson","2017-01-01",3 +"1915_Florida_Gators_football_team","2015-08-01",32 +"2010-11_New_Zealand_Football_Championship","2017-03-01",1 +"Ashley_Church","2015-08-01",27 +"Acanthoxylini","2017-06-01",27 +"American_Hindu","2016-10-01",33 +"Amylosporomyces","2015-12-01",20 +"2007_Southeast_Asia_Basketball_Association_Championship","2018-01-01",1 +"Aethelred_I","2017-08-01",1 +"2-methyl-GPP_synthase","2018-02-01",1 +"Dave_Aspin","2016-11-01",6 +"Descent_of_the_Nine","2016-04-01",1 +"2010_Kleen_Energy_Systems_disaster","2017-08-01",3 +"1978_in_Japanese_television","2017-08-01",70 +"Alexandros_Falekas","2018-01-01",1 +"1910_in_Afghanistan","2016-02-01",32 +"Abd-ru-shin","2017-09-01",681 +"610_in_poetry","2017-05-01",3 +"2015_arrests_of_FIFA_officials","2017-12-01",46 +"ATmega328P","2017-09-01",26 +"A_G_Mathews","2017-12-01",3 +"Attack_on_Mers-el-Kebir","2016-12-01",511 +"2016_in_Estonia","2016-05-01",89 +"Adidas-Salomon","2015-09-01",574 +"Education_and_Skills_Act_2008","2016-11-01",141 +"1789_in_the_United_States","2015-07-01",845 +"Apple_Computer_advertising","2015-09-01",7 +"9th_US_Army","2016-12-01",17 +"Ad_Rotas","2016-02-01",16 +"Agios_Ioannis,_Paphos","2018-03-01",97 +"Arabian_toad","2017-12-01",100 +"Anterior_pituitary_acidophil","2016-06-01",47 +"Arguello,_Christine","2017-12-01",3 +"Amilkar_Ariza","2017-03-01",67 +"Charles_Grierson","2016-11-01",14 +"Achi,_Bolivar","2017-11-01",1 +"Exonym_and_endonym","2017-01-01",1712 +"Abdul_Maroof_Gullestani","2017-12-01",20 +"Fairlawne_Handicap_Chase","2016-04-01",11 +"1963_Virginia_Tech_Hokies_football_team","2016-07-01",6 +"AE_Clarke","2017-12-01",3 +"ALFA-PROJ_Model_3563_sport","2017-10-01",2 +"Aleks_Vanderpool-Wallace","2018-02-01",32 +"Antioxident","2017-05-01",16 +"Calliope_Project","2015-07-01",3 +"Anderson_World","2017-10-01",5 +"Amydria_selvae","2017-11-01",6 +"Antoni_Katski","2016-09-01",1 +"Bera_District","2017-06-01",85 +"80_South_Street_New_Design","2016-07-01",86 +"Askizsky","2015-08-01",2 +"Amausi_metro_station","2015-11-01",44 +"9486_Utemorrah","2017-04-01",5 +"Army_CIS","2018-01-01",2 +"1851_Chilean_Revolution","2017-06-01",255 +"Jens_Robert_Dahlqvist","2017-01-01",6 +"1966-67_Tercera_Division","2017-05-01",1 +"Chanel_Iman","2017-06-01",9434 +"Astydamia","2017-06-01",34 +"1944_in_Belgium","2016-09-01",27 +"Acton_Baronets,_of_Aldenham","2017-01-01",1 +"2014_FBS_season","2016-12-01",5 +"2016_Winter_Youth_Olympics","2017-09-01",2090 +"1903_Clemson_Tigers_football_team","2017-06-01",50 +"2014_Taca_da_Liga_Final","2017-04-01",2 +"10th_Alberta_general_election","2016-11-01",4 +"Edertalschule_Frankenberg","2016-04-01",16 +"4th_Punjab_Infantry_Regiment","2017-09-01",136 +"America_Air_Linhas_Aereas","2018-02-01",1 +"Australian_Liberal_Party","2015-06-01",146 +"American_licorice","2017-05-01",15 +"2013_NASCAR_Cup_Series","2015-10-01",49 +"Anja_Lundqvist","2016-03-01",93 +"Amauris_dannfelti","2016-01-01",12 +"Abandoned_shipwrecks_act","2015-06-01",3 +"11086_Nagatayuji","2017-02-01",3 +"Advertising_tissues","2017-06-01",1 +"Anti_corn-law_league","2016-10-01",1 +"Always_Guaranteed","2017-09-01",445 +"Alfredo_Palacio_Moreno","2018-01-01",48 +"Antonio_Puche_Vicente","2015-06-01",1 +"Elazig_Province","2017-01-01",1 +"ATC_code_C02AC01","2017-05-01",1 +"Alexander_Mattock_Thompson","2016-08-01",2 +"Cocos_Islands_Malay","2017-06-01",63 +"Aftonbladet_antisemitism_controversy","2016-10-01",1 +"Azad_Kashmir,_Pakistan","2015-07-01",14 +"1852_English_cricket_season","2016-10-01",24 +"Birmingham_Pride","2015-07-01",129 +"Air-pollution_controls","2015-08-01",4 +"James_Southerton","2017-01-01",20 +"Architecture_of_Chiswick_House","2015-06-01",240 +"Alexander,_Colin","2015-12-01",1 +"Al-Mansooreh","2016-10-01",1 +"Arielle_Gastineau_Ashton","2017-12-01",18 +"Blue_Ben","2017-06-01",240 +"1911_Michigan_State_Normal_Normalites_football_season","2017-11-01",1 +"Arctictis_binturong","2017-04-01",334 +"Fornaldarsaga","2016-04-01",18 +"Bibasis_gomata","2017-06-01",35 +"Anna_Schchian","2017-06-01",19 +"2005_in_Rwanda","2016-08-01",69 +"Archaeology_in_ethiopia","2016-01-01",1 +"23277_Benhughes","2016-12-01",2 +"Bahrain_-_USA_relations","2017-06-01",1 +"Dieter_Korn","2015-07-01",13 +"Antidynamo_theorem","2016-10-01",222 +"An_Jae-Won","2016-12-01",1 +"Bruray","2015-07-01",82 +"Gosport_Council_election,_2004","2017-01-01",2 +"1856_in_South_Africa","2017-03-01",60 +"Dialakoro,_Guinea","2017-01-01",1 +"05-CV-1678","2016-02-01",1 +"Allison,_Henry","2016-12-01",5 +"Animal_house","2016-06-01",1399 +"Alexander_Tabarrok","2017-03-01",5 +"Chung-Ho_Memorial_Hospital","2017-06-01",50 +"2013_Internazionali_Trofeo_Lame_Perrel-Faip_-_Doubles","2016-03-01",4 +"1965_Speedway_World_Team_Cup","2017-11-01",13 +"Alexander_Ollongren","2017-11-01",788 +"Amore_traditore,_BWV_203","2016-06-01",83 +"Arthur_William_Rogers","2015-10-01",31 +"Ashoka_pillar","2017-02-01",265 +"1_62_honeycomb","2018-02-01",10 +"1926_Australasian_Championships","2016-05-01",47 +"Export_award","2016-04-01",3 +"5000_Days_Project","2016-07-01",75 +"2012_UCI_Europe_Tour","2017-03-01",65 +"1985_Toronto_Indoor_-_Singles","2015-08-01",4 +"Cedar_Grove,_North_Carolina","2017-06-01",18 +"Battle_of_The_Afsluitdijk","2016-04-01",15 +"Arishtanemi","2017-03-01",7 +"Alfalfa_bill_murray","2016-12-01",7 +"Elisha_Jay_Edwards","2015-07-01",28 +"Arturas_Paulauskas","2016-01-01",10 +"Abdelrahman_Hamad","2015-09-01",2 +"1948_in_Northern_Ireland","2015-07-01",29 +"1988_in_philosophy","2015-05-01",70 +"5-Hydroxytryptaminen","2016-01-01",4 +"2017_FBS_season","2017-10-01",124 +"Areeiro","2016-04-01",2 +"Alemonides","2016-03-01",6 +"Abrochia_caurensis","2016-10-01",1 +"Anafylaxia","2018-01-01",2 +"1938_Grand_National","2018-02-01",80 +"China-Korea_Champions_League","2015-07-01",4 +"Acetyl_bromide","2017-11-01",448 +"24_hours_of_lemans","2015-05-01",37 +"Albright_hereditary_osteodystrophy","2017-02-01",153 +"Ashland_Bus_System","2015-08-01",115 +"1,8-Cineole_2-endo-monooxygenase","2016-10-01",8 +"2005-2006_NHL_Season","2015-11-01",6 +"Cammie_Dunaway","2015-07-01",344 +"D-Fish","2016-11-01",2 +"4_sister_vineyard","2015-09-01",1 +"Alessia_Cara_discography","2017-03-01",100 +"Alexander_Berg","2017-08-01",63 +"4822_Karge","2018-02-01",32 +"Emile_Francis_Trophy","2017-01-01",8 +"Amin_Ghaseminejad","2017-06-01",45 +"Artichia","2017-09-01",19 +"Cividale","2016-11-01",41 +"2007_Orissa_Violence","2016-05-01",1 +"Australian_Saltbush","2016-12-01",5 +"Asian_Food_Channel","2016-09-01",727 +"Camp_iawah","2015-07-01",1 +"ATC_code_J01MA04","2017-11-01",1 +"Arpad_Balazs","2017-10-01",2 +"Angel_of_Music,_or_The_Private_Life_of_Giselle","2018-02-01",56 +"1983_Torneo_di_Viareggio","2016-03-01",22 +"Arellano_University","2017-09-01",1699 +"ATC_code_B03AA","2017-11-01",1 +"FS5000","2016-11-01",1 +"Abd-Allah_ibn_Zubayr","2017-05-01",2 +"1889_SAFA_season","2016-04-01",28 +"Aloha_bowl_broadcasters","2015-05-01",2 +"1994_All_England_Open_Badminton_Championships","2016-07-01",75 +"Are_We_Not_Horses","2015-07-01",79 +"Angiolo_Torchi","2018-02-01",5 +"Chimanimani_National_Park","2017-06-01",37 +"Art_manifesto","2017-09-01",2619 +"Adrian_Apostol","2016-10-01",62 +"Adventure_book","2015-10-01",14 +"Albemarle_Bertie","2016-06-01",20 +"Adam_Deibert","2017-08-01",611 +"Alberta_association_of_architects","2017-10-01",2 +"Alloschmidia","2017-11-01",15 +"Administrative_department_of_security","2016-05-01",1 +"Archdeaconry_of_Dudley","2017-07-01",19 +"Ammayenna_Sthree","2015-12-01",38 +"Aaron_Spelling","2016-05-01",25128 +"Anatolian_hieroglyph","2016-07-01",308 +"Central_University_of_Rajasthan","2016-11-01",323 +"Annamanum_touzalini","2017-08-01",7 +"Acleris_hispidana","2016-11-01",2 +"Frisco_kid","2016-04-01",15 +"Allerheiligenberg_monastery","2017-12-01",2 +"Arctic_comb_jelly","2017-03-01",3 +"279377_Lechmankiewicz","2016-06-01",1 +"AEGON_Pro-Series_Loughborough","2018-02-01",7 +"Firefly_Space_Systems","2017-01-01",235 +"2000-01_Hong_Kong_League_Cup","2017-12-01",6 +"British_supermarkets","2017-01-01",2 +"A_description_of_New_England","2016-10-01",13 +"Artificial_Flavoring","2016-06-01",2 +"Anglican_bishop_of_the_Torres_people","2018-02-01",1 +"Antonio_Diaz_Cardoso","2018-02-01",1 +"Johan_Patriksson","2017-01-01",3 +"Ashutosh_Morya","2017-07-01",1 +"Iron_ore","2017-01-01",3682 +"AT-16_Scallion","2015-08-01",594 +"Data_analyst","2015-07-01",134 +"Cabbageball","2016-04-01",3 +"Acanthonyx_seriopuncta","2017-04-01",2 +"Aegeria_ruficauda","2017-10-01",1 +"Archibald_Douglas,_1st_Earl_of_Ormond","2016-06-01",100 +"2014_European_Championships_in_Athletics","2017-01-01",3 +"1Co-Co1","2017-08-01",77 +"Arthur_Abba_Goldberg","2015-10-01",2 +"Ameri-Cana_Ultralights","2015-05-01",33 +"1979_British_Formula_One_season","2015-12-01",218 +"American_colonial_history","2016-06-01",6 +"Arcadia_Martin_Wesay_Toe","2015-06-01",73 +"Adam_Ornstein","2017-08-01",2 +"Archive_of_Modern_Conflict","2016-12-01",307 +"Ciro_Urriola","2015-07-01",12 +"Acanthosyris","2015-12-01",53 +"Eriopyga_jamaicensis","2015-07-01",1 +"10th_parallel_north","2016-06-01",1412 +"Derek_Almond","2017-01-01",2 +"Jaimanglapur","2017-01-01",4 +"Aphroditeola_olida","2018-02-01",6 +"18th_dynasty_of_egypt","2017-06-01",2 +"Ali_ben_Ahmed","2016-08-01",62 +"Ashkur_Mahalleh","2018-02-01",8 +"Adolf_Mosengel","2017-02-01",54 +"1838_Safed_pogrom","2016-02-01",1 +"1829_in_architecture","2017-05-01",24 +"Arcones,_Segovia","2016-05-01",3 +"Albert_Smith_Medal","2018-02-01",30 +"Arqanqergen_mass_murder","2015-10-01",60 +"Jaan_Usin","2017-01-01",4 +"2009_Bangladesh_Rifles_revolt","2016-03-01",269 +"-coltore","2015-11-01",9 +"Ernest_Makins","2017-01-01",10 +"Amsterdam_Bijlmer_Arena","2016-07-01",87 +"Apostolic_assemblies_of_christ","2018-01-01",1 +"Abirabad,_Razavi_Khorasan","2015-08-01",26 +"2016_All-Ireland_Senior_Football_Championship","2015-10-01",883 +"Asylum_seeking","2016-06-01",36 +"56th_parallel","2015-07-01",12 +"Junior_roller_derby","2017-01-01",19 +"Ana_Goncalves","2016-03-01",2 +"Alekseevskiy_Raion","2017-11-01",1 +"2009_Vietnam_national_football_team_results","2017-07-01",15 +"Chicago,_Burlington_and_Quincy_Railroad_Depot","2017-01-01",2 +"Fox_Valley_Conference","2016-04-01",84 +"Brachioplasty","2017-06-01",304 +"Arnold_Doren","2017-06-01",11 +"All_Ireland_mandolin_Champion","2015-07-01",2 +"Deborah_Rennard","2016-04-01",814 +"Anthony_Macdonnell","2016-02-01",2 +"Azerbaijan_Pakistan_relations","2017-01-01",1 +"A_Girl_Named_Zippy","2018-03-01",346 +"Academic_OneFile","2018-02-01",109 +"East_Point_Academy","2017-01-01",48 +"2011_Italian_Figure_Skating_Championships","2017-03-01",47 +"Chen_Qiao_En","2016-04-01",52 +"Canobie_lake","2016-04-01",1 +"Andrei_Arlashin","2017-11-01",13 +"Again_Into_Eyes","2017-12-01",54 +"Andropogon_curtipendulus","2018-02-01",1 +"Abbath","2016-05-01",927 +"Alien_Opponent","2016-05-01",160 +"Art_of_Love","2016-02-01",3 +"Ariana_Huffington","2017-05-01",84 +"Amy_Poehler","2016-04-01",62732 +"Cherven,_Rousse_Province","2015-07-01",2 +"1_Month_2_Live","2018-03-01",306 +"Country_Day_School_of_the_Sacred_Heart","2017-06-01",132 +"Cooperative_institute_for_arctic_research","2015-07-01",2 +"Depression_symptoms","2017-01-01",7 +"Brent_Skoda","2016-04-01",31 +"American_Christians","2016-12-01",10 +"Counterbleed","2017-01-01",1 +"Abarka","2016-05-01",325 +"Aleksander_Povetkin","2017-02-01",89 +"Austin_TX","2016-03-01",119 +"Aleksandr_Tretyakov","2017-01-01",40 +"Connecticut_congressional_districts","2016-11-01",3 +"Alessio_de_Marchis","2015-10-01",66 +"Capel_Salem,_Pwllheli","2016-04-01",6 +"5-alpha_reductase_deficiency","2016-10-01",30 +"Annabelle_Croft","2016-01-01",32 +"Aeronca_Aircraft_Corporation","2017-05-01",9 +"1597_in_Scotland","2016-07-01",18 +"Alf_Somerfield","2017-11-01",10 +"Agapanthia_villosoviridescens","2018-02-01",53 +"Adam_Goldberg","2015-12-01",42338 +"1961_Paris_massacre","2017-01-01",52 +"2007_in_radio","2017-04-01",131 +"Arthur_French,_5th_Baron_de_Freyne","2015-12-01",44 +"AMD_Socket_G3","2017-04-01",121 +"Albert_geouffre_de_lapradelle","2016-02-01",1 +"Collaborations_between_ex-Beatles","2015-07-01",1279 +"Betty_Ireland","2016-04-01",40 +"Domingo_Tirado_Benedi","2015-07-01",1 +"Bac_Ly","2016-04-01",1 +"All_gas-phase_iodine_laser","2015-07-01",136 +"Andre_Salifou","2017-01-01",1 +"1,3-b-D-glucan","2017-05-01",2 +"Joseph_Johnston_Muir","2017-01-01",3 +"17th_of_Shahrivar_league","2016-05-01",63 +"2001_in_art","2018-03-01",131 +"Abiji_language","2017-10-01",6 +"Ahliah_school","2018-03-01",133 +"1605_in_India","2017-12-01",83 +"Dr_Jeom_Kee_Paik","2015-07-01",1 +"1954_Texas_Longhorns_football_team","2018-01-01",69 +"1985_Little_League_World_Series","2016-07-01",226 +"Eleanor_de_bohun","2015-07-01",1 +"Adrenaline_strength","2016-03-01",8 +"434_BC","2018-02-01",97 +"8x60mm_S","2015-06-01",61 +"2016-17_South_Pacific_cyclone_season","2017-09-01",101 +"Beth_Aala","2017-06-01",15 +"Al_Shaver","2017-07-01",138 +"Adelphoi_Zangaki","2018-01-01",89 +"Cyclopropyl_group","2016-11-01",167 +"216_Sqn","2017-08-01",11 +"20469_Dudleymoore","2017-05-01",5 +"Attila_Hildmann","2017-06-01",103 +"1970_Arkansas_Razorbacks_football_team","2016-11-01",66 +"Anthony_Fairfax","2017-08-01",24 +"Fort_Point,_Boston","2016-04-01",384 +"Epsilon_numbers","2016-04-01",3 +"2013_Recopa_Sudamericana","2016-05-01",202 +"Italo_Disco","2017-01-01",27 +"Andersen_Press","2015-09-01",228 +"Amasa_Walker","2017-09-01",146 +"2010_in_Israeli_film","2015-09-01",234 +"A-25_Shrike","2017-12-01",90 +"2009_Winnipeg_Blue_Bombers_season","2017-06-01",66 +"Ashland_County,_Ohio","2016-10-01",1298 +"Dusky_Turtle_Dove","2017-01-01",3 +"Antonov_148","2017-02-01",129 +"Abdul_Hamid_Lahori","2017-08-01",458 +"Amadeo_of_Spain","2015-11-01",1701 +"2015_Novak_Djokovic_tennis_season","2017-07-01",2484 +"Dhabawallah","2016-04-01",4 +"Afshar_Beylik","2017-06-01",4 +"1998_ATP_Tour_World_Championships_-_Singles","2017-03-01",20 +"Beach_Haven_Terrace,_New_Jersey","2016-11-01",4 +"Aix-la_Chapelle","2018-03-01",66 +"Ackerman,_Val","2017-05-01",2 +"47th_Ohio_Infantry","2016-12-01",59 +"100_People,_100_Songs","2017-11-01",517 +"2007_Masters_of_Formula_3","2016-01-01",63 +"1832_US_presidential_election","2016-05-01",6 +"Aaron_Baker","2016-05-01",113 +"2015-16_FIBA_Europe_Club_Competition","2017-11-01",2 +"Alebra","2018-02-01",27 +"Asilus_crabroniformis","2016-11-01",4 +"Earth_and_Air_and_Rain","2016-11-01",31 +"2014_Stade_Tata_Raphael_disaster","2018-02-01",1 +"Alexander_Izvolski","2017-01-01",7 +"Fabric_17","2017-01-01",13 +"1925_Campeonato_de_Portugal_Final","2018-01-01",37 +"1948_Ashes_series","2017-01-01",121 +"Abraham_ben_david","2016-09-01",4 +"2006_Acropolis_Rally","2017-01-01",12 +"Alottment","2017-03-01",6 +"Angolanness","2015-07-01",11 +"2002_in_NASCAR_Craftsman_Truck_Series","2016-01-01",12 +"Aces_of_ANSI_Art","2015-08-01",77 +"Alan_Tskhovrebov","2015-08-01",13 +"Aegis_Security","2015-10-01",1 +"Alec_the_Great","2015-05-01",69 +"Corel_SnapFire","2016-11-01",9 +"AbdulMagid_Breish","2016-03-01",276 +"A_Night_in_NYC","2015-10-01",232 +"79th_parallel_south","2016-11-01",17 +"Alphonse_Crespo","2016-06-01",50 +"Acacia_petite_feuille","2016-05-01",1 +"Amstrad_464","2017-12-01",18 +"Charles_County,_Maryland","2017-06-01",2079 +"1972_outbreak_of_smallpox_in_Yugoslavia","2018-03-01",375 +"Alungili","2017-09-01",37 +"Brontispalaelaps_froggatti","2016-04-01",1 +"Alison_Lacey","2016-12-01",94 +"Alessandro_Capra","2017-07-01",21 +"2012_UCF_Knights_baseball_team","2016-08-01",46 +"16_Candles_Down_the_Drain","2017-05-01",2 +"Anandra_strandi","2015-08-01",11 +"Brigitte_Rohde","2017-01-01",9 +"Agenda_VR3","2015-09-01",93 +"1641_in_architecture","2015-11-01",32 +"ALF_Tales","2016-04-01",280 +"A_Woman_Scorned","2015-07-01",164 +"Air-free_techniques","2016-04-01",5 +"1973_in_British_television","2016-04-01",96 +"All_Saints_Cemetery","2017-04-01",345 +"1981_in_Swedish_football","2016-06-01",21 +"Apple_Dictionary","2016-10-01",19 +"2015_PBZ_Zagreb_Indoors","2016-08-01",121 +"16th_IIFA_Awards","2017-02-01",1194 +"Duki,_Pakistan","2016-04-01",14 +"Administration_of_Borderchek_points,_Population_and_Immigration","2015-09-01",2 +"Alonia,_Zante","2017-10-01",1 +"African_United_Club","2017-10-01",50 +"Burjanadze-Democrats","2016-04-01",19 +"Application_software_development","2015-06-01",27 +"Almonacid_de_la_Sierra,_Zaragoza","2015-06-01",1 +"Baissour","2016-12-01",100 +"Coti_Sorokin","2016-04-01",46 +"Alberta_and_Great_Waterways_Railway_scandal","2017-05-01",70 +"1942_Alabama_Crimson_Tide_football_team","2015-09-01",144 +"Adam_Art_Gallery","2016-08-01",80 +"Akshinski_Raion","2016-09-01",1 +"Edwin_of_Deira","2015-07-01",34 +"Altaf_Mahmud","2015-10-01",245 +"Astana_cycling_team","2017-12-01",7 +"1982_CART_World_Series_season","2015-12-01",3 +"3_Rotaxane","2017-03-01",1 +"1924_Eastern_Suburbs_season","2015-08-01",32 +"Downtown_Science","2016-11-01",6 +"1993-94_Slovak_Cup","2017-04-01",1 +"Brandon_Wayne_Hedrick","2016-04-01",32 +"2015_Brasil_Open","2016-01-01",403 +"Aung_Pinle_Hsinbyushin","2016-02-01",69 +"An_Numaniyah","2016-06-01",185 +"24th_Arkansas_Infantry_Regiment","2016-03-01",64 +"Adimchinobe_Echemandu","2017-05-01",90 +"August_Belmont,_Jr","2017-06-01",8 +"Empacher","2016-11-01",102 +"Abdulkadir_Sheikh_Dini","2017-01-01",70 +"Alvaro_Quiros","2017-08-01",12 +"Algernon_May","2017-11-01",35 +"Athol_Shmith","2016-02-01",188 +"2004_Indesit_ATP_Milan_Indoor_-_Doubles","2015-09-01",1 +"Alfred_Dennis","2016-11-01",9 +"2nd_Medical_Battalion","2017-05-01",380 +"Atom_clocks","2016-03-01",12 +"368th_Expeditionary_Air_Support_Operations_Group","2015-06-01",48 +"1911_Washington_Senators_season","2017-06-01",46 +"1963_Night_Series_Cup","2015-07-01",26 +"Aromobates_capurinensis","2017-12-01",21 +"2013-14_Super_Lig","2017-05-01",14 +"Al_taglio","2016-09-01",2 +"2015_RBC_Tennis_Championships_of_Dallas","2016-04-01",18 +"2011_Mirabella_Cup","2017-11-01",15 +"1996_NHL_Western_Conference_Final","2015-06-01",1 +"2009_Formula_Nippon_Championship","2016-11-01",44 +"Information_security_awareness","2017-01-01",56 +"A_Noiseless_Patient_Spider","2018-03-01",757 +"Aggregate_field_theory","2017-06-01",3 +"Armenians_in_Central_Asia","2015-10-01",351 +"Acona,_Mississippi","2017-10-01",33 +"Apozomus","2017-12-01",19 +"Antwun_Echols","2016-11-01",87 +"1949_Albanian_Cup","2016-11-01",11 +"Aesychlus","2016-10-01",4 +"1961_Pulitzer_Prize","2015-09-01",879 +"East_Midlands_Conference_Centre","2016-04-01",13 +"Blumen","2016-11-01",11 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.tsv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.tsv new file mode 100644 index 00000000000..407b9ddafba --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small.tsv @@ -0,0 +1,1000 @@ +Akiba_Hebrew_Academy 2017-08-01 241 +Aegithina_tiphia 2018-02-01 34 +1971-72_Utah_Stars_season 2016-10-01 1 +2015_UEFA_European_Under-21_Championship_qualification_Group_8 2015-12-01 73 +2016_Greater_Western_Sydney_Giants_season 2017-05-01 86 +AAA_Americas_Trios_Championship 2015-10-01 104 +1420_in_literature 2016-05-01 20 +Adair,_Beegie 2017-08-01 2 +1980_Rugby_League_State_of_Origin_match 2017-07-01 2 +Column_of_Santa_Felicita,_Florence 2017-06-01 14 +2007_Copa_America 2016-07-01 178 +Car_dealerships_in_the_USA 2015-07-01 11 +Dihydromyricetin_reductase 2015-07-01 1 +ATCvet_code_QB05BB01 2017-04-01 1 +City_CarShare 2017-01-01 125 +Heidenrod 2017-01-01 10 +Arthur_Henrique 2016-11-01 12 +Alan_Ebnother 2015-11-01 66 +2013_UConn_football_season 2017-05-01 2 +2008_American_League_Division_Series 2016-12-01 376 +Antilipaemic 2017-09-01 12 +Aberzombie 2016-12-01 28 +2008_Asian_Wrestling_Championships 2016-12-01 76 +Federal_Correctional_Complex,_Pollock 2017-01-01 19 +Central_body 2015-07-01 32 +Binbrook,_Ontario 2015-07-01 446 +Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun 2016-10-01 25 +Ashford_Lake 2017-10-01 80 +1942_Joint_Strike 2015-12-01 3 +AFC_Youth_Championship_2012 2017-10-01 2 +Akhira 2016-07-01 64 +Arroniro_Arlieri 2016-10-01 1 +Alesheim_Burgsalach 2015-05-01 2 +2700_classic 2017-05-01 4 +ARX-8_Laevatein 2015-06-01 14 +1991_Newsweek_Champions_Cup_-_Singles 2017-06-01 3 +Aphelandra_sinclairiana 2017-07-01 69 +Asia_Kong 2015-10-01 2 +2012_Internazionali_Tennis_Val_Gardena_Sudtirol 2016-02-01 1 +24_Carat_Purple 2017-06-01 476 +Acroliths 2017-12-01 9 +Bundesautobahn_3 2016-04-01 264 +ATC_code_S01AX21 2016-09-01 1 +Allington,_Lincolnshire 2015-11-01 188 +Acer_Aspire_One 2017-06-01 5169 +ATC_code_L04AC 2015-06-01 1 +1969_New_Year_Honours 2017-07-01 269 +Antonio_Napolitano 2017-11-01 44 +Amberfish 2017-10-01 11 +1976_Cam_2_Motor_Oil_400 2018-03-01 45 +April_25,_2017 2018-01-01 2 +Akahori_Station 2016-06-01 11 +Abducens_palsy 2016-05-01 28 +Ancona_cathedral 2018-01-01 2 +Ajou_Motor_College 2017-02-01 83 +Brad_Skyes 2016-11-01 1 +Alegro_PCS 2017-07-01 157 +Franz_Dunshirn 2017-01-01 1 +Arthur_Godfrey_Road 2016-11-01 3 +Ab_Golman 2017-05-01 30 +Art_in_early_modern_Scotland 2016-03-01 98 +1968_World_Series 2016-02-01 1960 +1828_in_the_UK 2017-08-01 3 +Explorer-1_Prime_Unit_2 2016-11-01 11 +2014_Desafio_Internacional_das_Estrelas 2017-12-01 31 +Ambulyx_subocellata 2016-08-01 1 +2008_Hamilton_Tiger-Cats_season 2015-11-01 153 +Deuterogamist 2015-07-01 5 +Art_Nouveau_furniture 2017-12-01 839 +Allison,_Colorado 2015-10-01 85 +2014_MLS_Re-Entry_Draft 2017-09-01 36 +Amiot_353 2015-12-01 8 +ACLU_of_Massachusetts 2015-11-01 106 +Altable,_Spain 2016-10-01 1 +Agnidra_scabiosa 2016-12-01 16 +Dictyotremella_novoguineensis 2015-07-01 1 +Compiler_Construction 2015-07-01 42 +Aufheben 2016-11-01 1080 +Avafauna 2017-06-01 17 +Atheist_billboard 2017-01-01 19 +2011_Indonesia_Super_League_All-Star_team 2015-11-01 15 +BrahMos_II 2015-07-01 31 +1707_in_art 2016-04-01 17 +Aeromarine_Model_60 2016-06-01 34 +Ayatollah-al-ozma 2015-06-01 12 +Exanimus 2017-01-01 4 +Anderby 2017-01-01 29 +Ashgabat_indoor_tennis_arena 2017-07-01 27 +1971_Rose_Bowl 2015-12-01 961 +2004_HR56 2016-05-01 5 +1886_in_South_Africa 2016-03-01 70 +Bishop_of_Central_Newfoundland 2016-04-01 1 +Alice_Rivlin 2016-09-01 1137 +Arriba_en_la_Cordillera 2017-06-01 39 +Adam_Lively 2016-06-01 77 +Colasposoma_fairmairei_fairmairei 2017-06-01 5 +Archie_Barton 2017-02-01 49 +Aharon_wasserman 2016-01-01 7 +Alabama_Educational_Television_Commission 2017-05-01 3 +Advanced_Technology_Bomber 2016-02-01 67 +1-krona 2017-01-01 4 +Ahmadabad-e_Kalij-e_Sofla 2017-01-01 3 +Bob_Dolman 2016-11-01 245 +Bellevue,_French_Guiana 2017-01-01 5 +Bison_Nickel 2017-01-01 2 +Arthur_Drabble 2016-12-01 35 +Edgewater_Borough,_New_Jersey 2016-11-01 3 +Alberto_Cambrosio 2017-11-01 31 +Amalia_Celia_Figueredo 2017-07-01 32 +1989_-_1992_Rugby_League_World_Cup 2016-01-01 10 +Admir_Seferagic 2016-06-01 7 +Adriaan_Loosjes 2015-05-01 46 +Alfred_Manuel_Martin 2015-06-01 3 +Academy_of_the_Arabic_Language 2015-08-01 67 +Ankita_Shrivastav 2018-01-01 7430 +Anarchism_in_asia 2017-11-01 1 +Batiquitos_Lagoon_State_Marine_Conservation_Area 2015-07-01 18 +Alstonia_calophylla 2017-12-01 2 +4-Hydroxycyclohexanecarboxylate_dehydrogenase 2016-11-01 4 +832_symmetry 2017-09-01 6 +1931_Fuyun_earthquake 2016-07-01 64 +1998_Masters_of_Formula_3 2016-01-01 60 +2011_LG_Hockey_Games 2016-04-01 7 +Generalized_pustular_psoriasis 2017-01-01 159 +2013_European_Cup_Winter_Throwing 2016-07-01 56 +2008_in_Argentina 2017-06-01 48 +Apostrophized 2017-10-01 5 +Algebraically_compact_module 2017-01-01 5 +Askett 2015-10-01 79 +2009_swine_flu_outbreak_timeline 2015-08-01 65 +72704-01-9 2017-12-01 4 +Alexandre-Charles-Albert-Joseph_Renard 2017-11-01 4 +Acyl-CoA_oxidase 2016-09-01 250 +2011_Budweiser_Shootout 2015-08-01 109 +Augusta_Davies_Webster 2015-07-01 2 +Association_theory 2017-07-01 112 +Abemama_Airfield 2015-05-01 8 +Archaeological_Museum_of_Heraklion 2015-10-01 14 +Authorized_marches_of_the_Canadian_Armed_Forces 2016-11-01 241 +1986_in_Portugal 2017-01-01 7 +Antiziganism_in_Bulgaria 2017-12-01 13 +Adriana_Martin 2015-09-01 21 +2004_Green_Bay_Packers_season 2015-05-01 970 +Agrippa_the_Sceptic 2017-11-01 95 +Admiral_Island 2016-04-01 1 +Auxiliary_sign_language 2015-06-01 31 +2013_Food_City_500 2015-06-01 90 +Andy_Roesch 2015-08-01 15 +Alsoszentivan 2017-05-01 4 +Architecture_of_Belgium 2015-05-01 199 +1_South_African_Infantry 2017-06-01 5 +1930_Auburn_Tigers_football_team 2016-12-01 39 +1860_in_Canada 2017-05-01 269 +Aldeaseca_de_la_Frontera 2018-03-01 21 +Elijah_Fox_Cook 2015-07-01 13 +2010_BCS_Bowl_Games 2016-03-01 1 +2017_NPSL_season 2017-06-01 2806 +Bank_of_New_South_Wales_v_Commonwealth 2016-12-01 173 +American_Enterprise_Association 2016-02-01 4 +26th_Kentucky_Derby 2018-03-01 1 +Chaldean_Diocese_of_Amid 2016-11-01 18 +Ajaran_language 2016-03-01 1 +1992_Texas_Rangers_season 2017-06-01 113 +26_SAS 2017-12-01 3 +2015_Terengganu_FA_season 2016-01-01 537 +Aagard,_Oregon 2017-03-01 3 +Auberry,_CA 2017-05-01 13 +American_Eskimo_spitz 2015-09-01 3 +Antidiabetic 2016-11-01 75 +Asinius 2017-11-01 26 +Andrey_Vasilievich_Abramov 2016-10-01 1 +Alan_Carrington 2018-03-01 91 +Colebrook,_Ontario 2017-06-01 2 +Abbasabad-e_Kheyrabad 2015-08-01 24 +Arandjelovac_Municipality 2016-02-01 1 +Aloysius_Valente 2017-12-01 11 +Almondo_Curry 2016-03-01 86 +4th_century_AD 2017-03-01 13 +Askhat_Dilmukhamedov 2016-02-01 77 +1147_AD 2017-05-01 1 +1953_Torneo_di_Viareggio 2017-03-01 20 +ATP_Schenectady 2015-12-01 30 +Lakarian_City 2017-01-01 3 +Adam_Ferency 2017-12-01 176 +AugustDvorak 2016-07-01 5 +97th_Light_Infantry_Division 2017-07-01 1 +16th_Connecticut_Infantry_Regiment 2016-05-01 146 +2011_Somalian_drought 2017-05-01 2 +Anbargah 2017-12-01 8 +1921_in_Paraguayan_football 2016-03-01 2 +Cosmetic_dermatitis 2017-01-01 5 +Annunciation_Greek_Orthodox_Cathedral,_Atlanta,_Georgia 2015-09-01 9 +1300_AM 2016-07-01 106 +A_Promising_Africa 2016-03-01 41 +2015-16_Odense_Bulldogs_season 2016-10-01 1 +Aral_AG 2017-12-01 1446 +Angel_Vivar_Dorado 2015-12-01 6 +1951_Australian_Championships 2018-03-01 32 +DJMax_Portable_Hot_Tunes 2017-01-01 27 +Allinge 2017-03-01 32 +1986_Buick_WCT_Finals 2016-11-01 14 +Arimatsu,_Aichi 2015-06-01 112 +Arthur_Berzinsh 2017-02-01 249 +Apolima_Uta 2017-04-01 23 +Capitol_Hill_Pride_Festival 2015-07-01 19 +Kara-Murza 2017-01-01 5 +Aigleville,_Alabama 2015-11-01 19 +Abdullah_bin_al-Hussein 2017-02-01 1 +2017-18_Inter_Milan_season 2018-03-01 26 +African_Collared_Dove 2016-07-01 10 +Achaea_dmoe 2016-11-01 3 +Aurora,_Utah 2016-06-01 201 +Architecture_in_Portland,_OR 2017-07-01 1 +Charchala 2015-07-01 4 +Around_the_Roses 2015-07-01 3 +1965_in_music 2016-12-01 3394 +Alojzije_Jankovic 2017-04-01 5 +Arisu_Seno 2015-08-01 6 +ALCO_T-6 2017-01-01 77 +1998_Royal_Bank_Cup 2015-12-01 32 +1956_Claxton_Shield 2016-11-01 9 +Anita_Dube 2017-07-01 233 +Anderson_Windows 2015-05-01 13 +Annaquatucket_River 2018-03-01 38 +Black_salve 2017-01-01 1496 +Anna_Pendleton_Schenck 2017-02-01 11 +Asghar_Nadeem_Syed 2017-07-01 146 +Disarming 2016-11-01 5 +Antarctic_ice_cap 2017-08-01 7 +Antonio_Ottone 2017-05-01 11 +Coralie_Larnack 2017-01-01 9 +Budha_Subba_Gold_Cup 2016-11-01 24 +Amphoe_Chaiya 2017-03-01 9 +Anarcho-capitalism_in_Somalia 2016-10-01 7 +Felix_Loch 2017-01-01 131 +26508_Jimmylin 2017-12-01 3 +Andrew_McMillen 2015-11-01 134 +Dundee_Canal_Industrial_Historic_District 2017-01-01 2 +Aula_Baratto 2015-12-01 140 +Church_of_St_Mary,_Knowsley 2015-07-01 1 +Aggelakis 2017-10-01 1 +Al_Badiyah 2017-11-01 157 +Assault_Gunboat 2016-03-01 21 +Lachau 2017-01-01 4 +2008_Pittsburgh_Steelers_season 2016-12-01 10018 +Apolychrosis_candidus 2018-01-01 24 +Andrei_Krylov 2017-02-01 192 +Aldesh_Vadher 2018-02-01 7 +Alwand 2017-02-01 7 +Edward_Baker_Lincoln 2015-07-01 4347 +Aermotor_Corporation 2017-11-01 4 +Aischylos 2017-01-01 7 +6th_Assault_Aviation_Corps 2017-07-01 100 +Azygos_lobe 2016-10-01 1598 +Demirciler,_Nazilli 2015-07-01 4 +Akhlaq-e-Hindi 2016-11-01 13 +Dragon_Crusaders 2016-04-01 122 +25V_USB 2016-01-01 1 +Calliophis_melanurus 2017-01-01 31 +Antonionian 2016-10-01 15 +Ashley_Richardson 2017-09-01 1216 +1st_Observation_Group 2018-01-01 6 +Andrzej_Bargiel 2015-05-01 97 +2008_AFL_National_Under_16_Championships 2018-03-01 20 +Ammon_Bundy 2016-09-01 11890 +Benno_Wandolleck 2016-11-01 5 +Aero-Kros_MP-02_Czajka 2016-03-01 136 +A6005_road 2015-10-01 14 +Eagle_Eye_Networks 2015-07-01 101 +Aarberg 2017-12-01 277 +Encyclopedia_of_anthropology 2015-07-01 1 +Duncormick_railway_station 2016-11-01 7 +Aiqing_huajiao_zhuanyi 2017-03-01 1 +Crude_oil_washing 2016-04-01 466 +2010_Indiana_Hoosiers_football_team 2017-06-01 90 +Book_of_Bodley_Head_Verse 2015-07-01 18 +Absence_seizure 2016-05-01 18152 +Cayucupil 2016-04-01 3 +Akanabee 2017-03-01 1 +Grooved_consonant 2017-01-01 5 +Dellamora_philippinensis 2015-07-01 7 +Dejan_Blazevski 2017-01-01 1 +Arabis_armena 2016-08-01 25 +1988_Summer_Paralympics_medal_table 2016-12-01 90 +2012-13_Basketball_Championship_of_Bosnia_and_Herzegovina 2017-04-01 2 +1966_in_music 2017-10-01 3510 +Antti_Tyrvainen 2015-12-01 2 +African_desert 2016-06-01 262 +Bruneau_mariposa_lily 2016-04-01 1 +Bernie_Parmalee 2017-06-01 221 +2015_South_American_Youth_Football_Championship_squads 2015-09-01 594 +1985_IIHF_World_U20_Championship 2015-08-01 7 +18th_British_Academy_Film_Awards 2018-02-01 270 +523_Ada 2016-04-01 35 +Active_Pharmaceutical_Ingredients 2016-02-01 5 +Burley,_ID_mSA 2015-07-01 2 +CFRN-TV-10 2017-06-01 2 +1982_Super_Bowl_of_Poker 2017-08-01 38 +Australian_Journal_of_Educational_Technology 2017-01-01 1 +2013_Super_League_Grand_Final 2016-06-01 212 +2006_BCR_Open_Romania 2015-06-01 25 +Charlestown_Townies 2016-04-01 319 +1943_Polish_underground_raid_on_East_Prussia 2017-08-01 8 +Anthony_Celestino 2018-02-01 182 +Andrew_Beerwinkel 2018-02-01 73 +Greigia_atrobrunnea 2017-01-01 1 +Adrian_Beecham 2017-11-01 1 +Implementation_of_mathematics_in_set_theory 2017-01-01 12 +Annastacia_Palaszczuk 2015-05-01 6247 +Egon_Zimmermann_II 2016-11-01 3 +Air_aide-de-camp 2018-03-01 137 +Albert_Murphy 2016-09-01 1 +1924_Arkansas_Razorbacks_football_team 2016-02-01 28 +Avondale_Mill 2016-10-01 68 +Alexander_Volzhin 2015-12-01 25 +Arek_Monthly 2017-08-01 31 +Dinka_Blanche 2015-07-01 1 +1921_Mercer_Baptists_football_team 2016-11-01 10 +Afro-Antiguan_and_Barbudan 2016-06-01 252 +American_southern_literature 2016-10-01 3 +1947_Swiss_Grand_Prix 2016-11-01 32 +99p_Stores 2017-12-01 3028 +Artem_Radkov 2018-03-01 21 +Arctic_brome 2016-12-01 19 +Battle_Of_Moskova 2015-06-01 6 +Airdrieonians 2016-06-01 32 +Advanced_transportation_controller 2018-03-01 79 +BC_government 2016-12-01 18 +Antonio_Maura 2017-03-01 457 +Anjuman,_Afghanistan 2017-09-01 62 +Deodato_Guinaccia 2015-07-01 13 +Blowjob_Betty 2016-11-01 28 +453d_Flying_Training_Squadron 2017-08-01 3 +1990_Africa_Cup_of_Nations 2016-04-01 22 +Agenville 2016-08-01 100 +1202_in_Scotland 2018-01-01 82 +Calytrix_desolata 2017-06-01 10 +1957_in_Chile 2016-04-01 13 +Anglican_Bishop_of_Torres_Strait_people 2017-08-01 1 +2015_Mexican_Grand_Prix 2015-06-01 528 +Catalan_parliament 2017-01-01 14 +Cult_Shaker 2017-01-01 32 +Ander_Gayoso 2016-11-01 34 +Ageneiosus_ucayalensis 2017-12-01 20 +Club_de_Berne 2015-07-01 194 +Adecco 2016-03-01 9863 +Anti-unionism 2018-01-01 11 +Auchindoun_Castle 2017-01-01 102 +557_in_poetry 2016-07-01 1 +Abu_ol_Verdi_Rural_District 2017-01-01 1 +Centro_73 2016-04-01 23 +Dagger_compact_category 2016-04-01 97 +Alan_Nunn_May 2017-11-01 770 +Basal_clade 2015-07-01 44 +Aizu_Line 2015-08-01 26 +Edward_Kernan_Campbell 2016-04-01 5 +865_area_code 2016-12-01 9 +Bahamas_at_the_1984_Summer_Olympics 2017-06-01 35 +Gardan_Kalat 2017-01-01 1 +American_Samoa_national_under-19_football_team 2017-12-01 4 +Kayah_National_United_League 2017-01-01 14 +2007_Nordea_Nordic_Light_Open_-_Singles 2016-10-01 2 +Avondale_Estate 2016-11-01 2 +Acalolepta_variolaris 2017-02-01 3 +Anantapur,_Andhra_Pradesh 2017-05-01 1032 +Amenable_Banach_algebra 2015-08-01 59 +300_metres 2017-01-01 61 +Black_Bottom,_Kentucky 2016-04-01 8 +100_Players_Who_Shook_The_Kop 2018-01-01 1133 +Adventure_story 2015-07-01 29 +Anacampsis_lignaria 2017-05-01 5 +2007_American_Indoor_Football_Association_season 2015-09-01 89 +Dmitry_Kardovsky 2016-04-01 33 +A10_autoroute 2015-11-01 27 +1995_Sydney_Bulldogs_season 2017-04-01 40 +Ilex_jelskii 2017-01-01 2 +Adrian_Jose_Hernandez 2016-10-01 2 +CallAir_A-5 2016-11-01 4 +22nd_meridian_west 2015-07-01 45 +Anglican_Diocese_of_Antananarivo 2015-08-01 2 +Andrew_Kelsey 2016-11-01 14 +Brownhill_Creek 2017-06-01 4 +Abunai_Deka 2015-06-01 269 +Aisha_Jefferson 2017-04-01 115 +Alonso_Lopez 2017-03-01 7 +Aeroparque_Ciudad_de_Mendoza 2016-01-01 1 +Arthur_Ashley_Sykes 2017-12-01 45 +Holy_Face_Medal 2017-01-01 20 +1Chronicles 2018-02-01 1 +2014_CFU_Club_Championship 2017-12-01 108 +Aetna_class_ironclad_floating_battery 2015-06-01 37 +Antoine_Delrio 2015-07-01 2 +Chislet_Windmill 2015-07-01 38 +Aerojet_SD-2 2017-07-01 59 +Age_role_play 2015-09-01 2 +50687_Paultemple 2018-03-01 8 +1997-98_Cuban_National_Series 2017-02-01 1 +Aleksandr_Borisovich_Belyavskiy 2017-10-01 42 +Carol_MacReady 2017-01-01 111 +18th_Chess_Olympiad 2015-06-01 134 +Clara_Schonfeld 2015-07-01 1 +Apollonius_of_Athens 2017-02-01 35 +ABC_80 2018-03-01 603 +Apatelodes_damora 2015-08-01 22 +Ernest_Walbourn 2016-04-01 30 +428_BCE 2017-04-01 2 +72nd_Seaforth_Highlanders 2017-12-01 29 +Broughton_Hackett 2015-07-01 38 +A_Fazenda_2 2016-12-01 56 +ATCvet_code_QJ01MQ 2017-05-01 2 +Abura,_Iran 2017-03-01 3 +DeLeon_Independent_School_District 2015-07-01 1 +Abby_aldrich 2016-09-01 1 +Cinema_One_Originals 2016-11-01 359 +2013_European_Short_Course_Swimming_Championships 2017-09-01 124 +Ars_technica 2015-11-01 442 +AMS_Production_Company 2016-02-01 1 +Joao_Soares 2017-01-01 1 +Cervical_vertebra_6 2017-06-01 45 +Kevin_Pugh 2017-01-01 2 +Alpha-1_antitrypsin 2015-11-01 11845 +Assyrians_in_iran 2017-07-01 53 +Boophis_ankarafensis 2016-11-01 2 +A_View_To_a_Kill 2018-01-01 4 +Charles_Edouard_Brown-Sequard 2015-07-01 7 +1919_in_Ireland 2017-04-01 239 +74th_Foot 2015-06-01 3 +9275_Persson 2016-07-01 22 +Dalcerides_mesoa 2015-07-01 11 +A_Summer_Bird-Cage 2016-03-01 248 +2011_NAB_Cup 2017-10-01 127 +13th_Parliament_of_Lower_Canada 2015-08-01 41 +2011_Players_Championship_Finals 2015-07-01 25 +Flag_of_Tenerife 2017-01-01 128 +Hypopta_corrientina 2017-01-01 1 +Jalatarangam 2017-01-01 16 +Adjoint_endomorphism 2018-01-01 330 +Anime_conventions 2015-06-01 18 +2004_Grammy_Award 2015-06-01 13 +American_war 2015-07-01 80 +Beynes,_Yvelines 2016-11-01 32 +Agriculture_Department 2016-06-01 16 +Andrey_Chisty 2015-10-01 58 +Ait_Yahia_Moussa 2017-08-01 7 +Alfred_Blau 2017-03-01 57 +1869_in_sports 2017-08-01 73 +Ambolodia_Sud 2016-04-01 6 +Animal_slaughter 2017-06-01 6423 +Adamowka_Commune 2018-01-01 2 +Arsenic_pentachloride 2016-03-01 467 +220_BCE 2016-01-01 3 +863d_Engineer_Battalion 2015-11-01 160 +Amer_Abu-Hudaib 2017-04-01 31 +Aaina_tv 2017-08-01 3 +Arnhem,_Netherlands 2015-08-01 67 +Antoine_de_sartine 2015-08-01 4 +ATC_code_A16 2016-01-01 155 +Eastern_Front 2017-01-01 70 +Ashy-headed_tyrannulet 2016-12-01 44 +Aoheng_language 2015-08-01 64 +1996_World_Junior_Canoe_Slalom_Championships 2017-11-01 15 +Agriophara_nodigera 2017-11-01 12 +Amsterdam_Island_cattle 2015-12-01 675 +Aliyah_from_the_Soviet_Union_in_the_1990s 2017-08-01 54 +Abandoned_and_Little_Known_Airfields 2018-01-01 2 +Church_numerals 2015-07-01 57 +Ankeny_Christian_Academy 2015-09-01 74 +2010_FIFA_World_Cup_qualification_-_AFC_First_Round 2017-06-01 58 +1ESS_switch 2015-07-01 514 +Chelys_boulengerii 2016-04-01 1 +Bivalent_logic 2016-11-01 25 +Ivan_Skavinsky_Skavar 2017-01-01 1 +Fergus_Sings_the_Blues 2016-04-01 62 +2015-16_Libyan_Premier_League 2017-02-01 4 +Dutch_Chess_Championship 2017-01-01 35 +Every_Man_in_His_Humor 2016-11-01 1 +2008_Allstate_BCS_National_Championship_Game 2015-08-01 11 +Aq_Tappeh,_Hamadan 2015-09-01 25 +Agrotractor 2016-02-01 1 +Alexander_of_Pfalz-Zweibrucken 2017-12-01 2 +2003_Mistral_World_Championships 2016-04-01 6 +146th_Fighter-Interceptor_Wing 2015-11-01 49 +Al-Qahir 2016-04-01 328 +25604_Karlin 2015-05-01 20 +Allen_taflove 2017-12-01 3 +Aretha_Thurmond 2017-05-01 109 +Atlanta_and_lagrange_rail_road 2015-07-01 1 +ACSI_College_Iloilo 2015-10-01 1 +Alan_Sacks 2015-07-01 150 +African_Desert_Warbler 2017-02-01 11 +A_Man_and_His_Soul 2018-02-01 89 +ASCII_ART 2015-05-01 9 +1992-93_VMI_Keydets_basketball_team 2016-10-01 1 +George_and_the_Dragon 2017-01-01 18 +2012_NAB_Cup 2016-12-01 99 +1965_Indy_500 2016-05-01 51 +Forest_Glen,_Nova_Scotia 2016-04-01 9 +A_Critical_Dictionary_of_English_Literature 2016-08-01 4 +Aquion_Energy 2015-08-01 1077 +Alibeyce,_Emirdag 2017-09-01 1 +Blauhu00F6hle 2015-07-01 1 +Ian_Sommerville 2017-01-01 1 +Air_propulsion 2017-07-01 474 +2016_12_Hours_of_Sebring 2016-10-01 187 +Asites 2017-07-01 4 +Al-Kini 2017-03-01 1 +Austin_Aztex_2009_season 2016-03-01 10 +Alto_Vista_Chapel 2015-12-01 833 +Abecedaria 2017-04-01 22 +Farm_to_Market_Road_2503 2016-11-01 3 +Anglican_Bishop_of_The_Leeward_Islands 2015-09-01 2 +Basketball_at_the_2011_Pan_American_Games 2017-06-01 120 +Angela_Peel 2016-08-01 7 +Amber_Frey 2018-02-01 728 +Afraid_to_Sleep 2017-06-01 51 +ATC_code_A02BA 2018-02-01 7 +Apateon_pedestris 2015-11-01 5 +Alois_Estermann 2015-12-01 1155 +1752_in_science 2016-01-01 78 +Baldassin 2017-06-01 3 +Camilla_Hildegarde_Wedgwood 2017-01-01 1 +B-A-C-H_motive 2016-10-01 3 +AI_Velorum_star 2016-09-01 1 +Ali_Zayn_al-Abidin 2017-04-01 71 +Ailurarctos_lufengensis 2015-07-01 1 +Clearview,_Philadelphia 2017-06-01 67 +Adam_Sender 2016-08-01 759 +Apriona_paucigranula 2018-02-01 7 +Dark_at_the_Top_of_the_Stairs 2015-07-01 10 +Acanthio 2017-12-01 11 +1980_Labatt_Brier 2018-01-01 111 +2016-17_New_York_Knicks_season 2017-10-01 21 +1995_CAF_Cup 2015-10-01 48 +Boiled_linseed_oil 2016-04-01 79 +2015_Kumanovo_clashes 2016-07-01 6 +David_Jamieson 2017-01-01 3 +1915_Florida_Gators_football_team 2015-08-01 32 +2010-11_New_Zealand_Football_Championship 2017-03-01 1 +Ashley_Church 2015-08-01 27 +Acanthoxylini 2017-06-01 27 +American_Hindu 2016-10-01 33 +Amylosporomyces 2015-12-01 20 +2007_Southeast_Asia_Basketball_Association_Championship 2018-01-01 1 +Aethelred_I 2017-08-01 1 +2-methyl-GPP_synthase 2018-02-01 1 +Dave_Aspin 2016-11-01 6 +Descent_of_the_Nine 2016-04-01 1 +2010_Kleen_Energy_Systems_disaster 2017-08-01 3 +1978_in_Japanese_television 2017-08-01 70 +Alexandros_Falekas 2018-01-01 1 +1910_in_Afghanistan 2016-02-01 32 +Abd-ru-shin 2017-09-01 681 +610_in_poetry 2017-05-01 3 +2015_arrests_of_FIFA_officials 2017-12-01 46 +ATmega328P 2017-09-01 26 +A_G_Mathews 2017-12-01 3 +Attack_on_Mers-el-Kebir 2016-12-01 511 +2016_in_Estonia 2016-05-01 89 +Adidas-Salomon 2015-09-01 574 +Education_and_Skills_Act_2008 2016-11-01 141 +1789_in_the_United_States 2015-07-01 845 +Apple_Computer_advertising 2015-09-01 7 +9th_US_Army 2016-12-01 17 +Ad_Rotas 2016-02-01 16 +Agios_Ioannis,_Paphos 2018-03-01 97 +Arabian_toad 2017-12-01 100 +Anterior_pituitary_acidophil 2016-06-01 47 +Arguello,_Christine 2017-12-01 3 +Amilkar_Ariza 2017-03-01 67 +Charles_Grierson 2016-11-01 14 +Achi,_Bolivar 2017-11-01 1 +Exonym_and_endonym 2017-01-01 1712 +Abdul_Maroof_Gullestani 2017-12-01 20 +Fairlawne_Handicap_Chase 2016-04-01 11 +1963_Virginia_Tech_Hokies_football_team 2016-07-01 6 +AE_Clarke 2017-12-01 3 +ALFA-PROJ_Model_3563_sport 2017-10-01 2 +Aleks_Vanderpool-Wallace 2018-02-01 32 +Antioxident 2017-05-01 16 +Calliope_Project 2015-07-01 3 +Anderson_World 2017-10-01 5 +Amydria_selvae 2017-11-01 6 +Antoni_Katski 2016-09-01 1 +Bera_District 2017-06-01 85 +80_South_Street_New_Design 2016-07-01 86 +Askizsky 2015-08-01 2 +Amausi_metro_station 2015-11-01 44 +9486_Utemorrah 2017-04-01 5 +Army_CIS 2018-01-01 2 +1851_Chilean_Revolution 2017-06-01 255 +Jens_Robert_Dahlqvist 2017-01-01 6 +1966-67_Tercera_Division 2017-05-01 1 +Chanel_Iman 2017-06-01 9434 +Astydamia 2017-06-01 34 +1944_in_Belgium 2016-09-01 27 +Acton_Baronets,_of_Aldenham 2017-01-01 1 +2014_FBS_season 2016-12-01 5 +2016_Winter_Youth_Olympics 2017-09-01 2090 +1903_Clemson_Tigers_football_team 2017-06-01 50 +2014_Taca_da_Liga_Final 2017-04-01 2 +10th_Alberta_general_election 2016-11-01 4 +Edertalschule_Frankenberg 2016-04-01 16 +4th_Punjab_Infantry_Regiment 2017-09-01 136 +America_Air_Linhas_Aereas 2018-02-01 1 +Australian_Liberal_Party 2015-06-01 146 +American_licorice 2017-05-01 15 +2013_NASCAR_Cup_Series 2015-10-01 49 +Anja_Lundqvist 2016-03-01 93 +Amauris_dannfelti 2016-01-01 12 +Abandoned_shipwrecks_act 2015-06-01 3 +11086_Nagatayuji 2017-02-01 3 +Advertising_tissues 2017-06-01 1 +Anti_corn-law_league 2016-10-01 1 +Always_Guaranteed 2017-09-01 445 +Alfredo_Palacio_Moreno 2018-01-01 48 +Antonio_Puche_Vicente 2015-06-01 1 +Elazig_Province 2017-01-01 1 +ATC_code_C02AC01 2017-05-01 1 +Alexander_Mattock_Thompson 2016-08-01 2 +Cocos_Islands_Malay 2017-06-01 63 +Aftonbladet_antisemitism_controversy 2016-10-01 1 +Azad_Kashmir,_Pakistan 2015-07-01 14 +1852_English_cricket_season 2016-10-01 24 +Birmingham_Pride 2015-07-01 129 +Air-pollution_controls 2015-08-01 4 +James_Southerton 2017-01-01 20 +Architecture_of_Chiswick_House 2015-06-01 240 +Alexander,_Colin 2015-12-01 1 +Al-Mansooreh 2016-10-01 1 +Arielle_Gastineau_Ashton 2017-12-01 18 +Blue_Ben 2017-06-01 240 +1911_Michigan_State_Normal_Normalites_football_season 2017-11-01 1 +Arctictis_binturong 2017-04-01 334 +Fornaldarsaga 2016-04-01 18 +Bibasis_gomata 2017-06-01 35 +Anna_Schchian 2017-06-01 19 +2005_in_Rwanda 2016-08-01 69 +Archaeology_in_ethiopia 2016-01-01 1 +23277_Benhughes 2016-12-01 2 +Bahrain_-_USA_relations 2017-06-01 1 +Dieter_Korn 2015-07-01 13 +Antidynamo_theorem 2016-10-01 222 +An_Jae-Won 2016-12-01 1 +Bruray 2015-07-01 82 +Gosport_Council_election,_2004 2017-01-01 2 +1856_in_South_Africa 2017-03-01 60 +Dialakoro,_Guinea 2017-01-01 1 +05-CV-1678 2016-02-01 1 +Allison,_Henry 2016-12-01 5 +Animal_house 2016-06-01 1399 +Alexander_Tabarrok 2017-03-01 5 +Chung-Ho_Memorial_Hospital 2017-06-01 50 +2013_Internazionali_Trofeo_Lame_Perrel-Faip_-_Doubles 2016-03-01 4 +1965_Speedway_World_Team_Cup 2017-11-01 13 +Alexander_Ollongren 2017-11-01 788 +Amore_traditore,_BWV_203 2016-06-01 83 +Arthur_William_Rogers 2015-10-01 31 +Ashoka_pillar 2017-02-01 265 +1_62_honeycomb 2018-02-01 10 +1926_Australasian_Championships 2016-05-01 47 +Export_award 2016-04-01 3 +5000_Days_Project 2016-07-01 75 +2012_UCI_Europe_Tour 2017-03-01 65 +1985_Toronto_Indoor_-_Singles 2015-08-01 4 +Cedar_Grove,_North_Carolina 2017-06-01 18 +Battle_of_The_Afsluitdijk 2016-04-01 15 +Arishtanemi 2017-03-01 7 +Alfalfa_bill_murray 2016-12-01 7 +Elisha_Jay_Edwards 2015-07-01 28 +Arturas_Paulauskas 2016-01-01 10 +Abdelrahman_Hamad 2015-09-01 2 +1948_in_Northern_Ireland 2015-07-01 29 +1988_in_philosophy 2015-05-01 70 +5-Hydroxytryptaminen 2016-01-01 4 +2017_FBS_season 2017-10-01 124 +Areeiro 2016-04-01 2 +Alemonides 2016-03-01 6 +Abrochia_caurensis 2016-10-01 1 +Anafylaxia 2018-01-01 2 +1938_Grand_National 2018-02-01 80 +China-Korea_Champions_League 2015-07-01 4 +Acetyl_bromide 2017-11-01 448 +24_hours_of_lemans 2015-05-01 37 +Albright_hereditary_osteodystrophy 2017-02-01 153 +Ashland_Bus_System 2015-08-01 115 +1,8-Cineole_2-endo-monooxygenase 2016-10-01 8 +2005-2006_NHL_Season 2015-11-01 6 +Cammie_Dunaway 2015-07-01 344 +D-Fish 2016-11-01 2 +4_sister_vineyard 2015-09-01 1 +Alessia_Cara_discography 2017-03-01 100 +Alexander_Berg 2017-08-01 63 +4822_Karge 2018-02-01 32 +Emile_Francis_Trophy 2017-01-01 8 +Amin_Ghaseminejad 2017-06-01 45 +Artichia 2017-09-01 19 +Cividale 2016-11-01 41 +2007_Orissa_Violence 2016-05-01 1 +Australian_Saltbush 2016-12-01 5 +Asian_Food_Channel 2016-09-01 727 +Camp_iawah 2015-07-01 1 +ATC_code_J01MA04 2017-11-01 1 +Arpad_Balazs 2017-10-01 2 +Angel_of_Music,_or_The_Private_Life_of_Giselle 2018-02-01 56 +1983_Torneo_di_Viareggio 2016-03-01 22 +Arellano_University 2017-09-01 1699 +ATC_code_B03AA 2017-11-01 1 +FS5000 2016-11-01 1 +Abd-Allah_ibn_Zubayr 2017-05-01 2 +1889_SAFA_season 2016-04-01 28 +Aloha_bowl_broadcasters 2015-05-01 2 +1994_All_England_Open_Badminton_Championships 2016-07-01 75 +Are_We_Not_Horses 2015-07-01 79 +Angiolo_Torchi 2018-02-01 5 +Chimanimani_National_Park 2017-06-01 37 +Art_manifesto 2017-09-01 2619 +Adrian_Apostol 2016-10-01 62 +Adventure_book 2015-10-01 14 +Albemarle_Bertie 2016-06-01 20 +Adam_Deibert 2017-08-01 611 +Alberta_association_of_architects 2017-10-01 2 +Alloschmidia 2017-11-01 15 +Administrative_department_of_security 2016-05-01 1 +Archdeaconry_of_Dudley 2017-07-01 19 +Ammayenna_Sthree 2015-12-01 38 +Aaron_Spelling 2016-05-01 25128 +Anatolian_hieroglyph 2016-07-01 308 +Central_University_of_Rajasthan 2016-11-01 323 +Annamanum_touzalini 2017-08-01 7 +Acleris_hispidana 2016-11-01 2 +Frisco_kid 2016-04-01 15 +Allerheiligenberg_monastery 2017-12-01 2 +Arctic_comb_jelly 2017-03-01 3 +279377_Lechmankiewicz 2016-06-01 1 +AEGON_Pro-Series_Loughborough 2018-02-01 7 +Firefly_Space_Systems 2017-01-01 235 +2000-01_Hong_Kong_League_Cup 2017-12-01 6 +British_supermarkets 2017-01-01 2 +A_description_of_New_England 2016-10-01 13 +Artificial_Flavoring 2016-06-01 2 +Anglican_bishop_of_the_Torres_people 2018-02-01 1 +Antonio_Diaz_Cardoso 2018-02-01 1 +Johan_Patriksson 2017-01-01 3 +Ashutosh_Morya 2017-07-01 1 +Iron_ore 2017-01-01 3682 +AT-16_Scallion 2015-08-01 594 +Data_analyst 2015-07-01 134 +Cabbageball 2016-04-01 3 +Acanthonyx_seriopuncta 2017-04-01 2 +Aegeria_ruficauda 2017-10-01 1 +Archibald_Douglas,_1st_Earl_of_Ormond 2016-06-01 100 +2014_European_Championships_in_Athletics 2017-01-01 3 +1Co-Co1 2017-08-01 77 +Arthur_Abba_Goldberg 2015-10-01 2 +Ameri-Cana_Ultralights 2015-05-01 33 +1979_British_Formula_One_season 2015-12-01 218 +American_colonial_history 2016-06-01 6 +Arcadia_Martin_Wesay_Toe 2015-06-01 73 +Adam_Ornstein 2017-08-01 2 +Archive_of_Modern_Conflict 2016-12-01 307 +Ciro_Urriola 2015-07-01 12 +Acanthosyris 2015-12-01 53 +Eriopyga_jamaicensis 2015-07-01 1 +10th_parallel_north 2016-06-01 1412 +Derek_Almond 2017-01-01 2 +Jaimanglapur 2017-01-01 4 +Aphroditeola_olida 2018-02-01 6 +18th_dynasty_of_egypt 2017-06-01 2 +Ali_ben_Ahmed 2016-08-01 62 +Ashkur_Mahalleh 2018-02-01 8 +Adolf_Mosengel 2017-02-01 54 +1838_Safed_pogrom 2016-02-01 1 +1829_in_architecture 2017-05-01 24 +Arcones,_Segovia 2016-05-01 3 +Albert_Smith_Medal 2018-02-01 30 +Arqanqergen_mass_murder 2015-10-01 60 +Jaan_Usin 2017-01-01 4 +2009_Bangladesh_Rifles_revolt 2016-03-01 269 +-coltore 2015-11-01 9 +Ernest_Makins 2017-01-01 10 +Amsterdam_Bijlmer_Arena 2016-07-01 87 +Apostolic_assemblies_of_christ 2018-01-01 1 +Abirabad,_Razavi_Khorasan 2015-08-01 26 +2016_All-Ireland_Senior_Football_Championship 2015-10-01 883 +Asylum_seeking 2016-06-01 36 +56th_parallel 2015-07-01 12 +Junior_roller_derby 2017-01-01 19 +Ana_Goncalves 2016-03-01 2 +Alekseevskiy_Raion 2017-11-01 1 +2009_Vietnam_national_football_team_results 2017-07-01 15 +Chicago,_Burlington_and_Quincy_Railroad_Depot 2017-01-01 2 +Fox_Valley_Conference 2016-04-01 84 +Brachioplasty 2017-06-01 304 +Arnold_Doren 2017-06-01 11 +All_Ireland_mandolin_Champion 2015-07-01 2 +Deborah_Rennard 2016-04-01 814 +Anthony_Macdonnell 2016-02-01 2 +Azerbaijan_Pakistan_relations 2017-01-01 1 +A_Girl_Named_Zippy 2018-03-01 346 +Academic_OneFile 2018-02-01 109 +East_Point_Academy 2017-01-01 48 +2011_Italian_Figure_Skating_Championships 2017-03-01 47 +Chen_Qiao_En 2016-04-01 52 +Canobie_lake 2016-04-01 1 +Andrei_Arlashin 2017-11-01 13 +Again_Into_Eyes 2017-12-01 54 +Andropogon_curtipendulus 2018-02-01 1 +Abbath 2016-05-01 927 +Alien_Opponent 2016-05-01 160 +Art_of_Love 2016-02-01 3 +Ariana_Huffington 2017-05-01 84 +Amy_Poehler 2016-04-01 62732 +Cherven,_Rousse_Province 2015-07-01 2 +1_Month_2_Live 2018-03-01 306 +Country_Day_School_of_the_Sacred_Heart 2017-06-01 132 +Cooperative_institute_for_arctic_research 2015-07-01 2 +Depression_symptoms 2017-01-01 7 +Brent_Skoda 2016-04-01 31 +American_Christians 2016-12-01 10 +Counterbleed 2017-01-01 1 +Abarka 2016-05-01 325 +Aleksander_Povetkin 2017-02-01 89 +Austin_TX 2016-03-01 119 +Aleksandr_Tretyakov 2017-01-01 40 +Connecticut_congressional_districts 2016-11-01 3 +Alessio_de_Marchis 2015-10-01 66 +Capel_Salem,_Pwllheli 2016-04-01 6 +5-alpha_reductase_deficiency 2016-10-01 30 +Annabelle_Croft 2016-01-01 32 +Aeronca_Aircraft_Corporation 2017-05-01 9 +1597_in_Scotland 2016-07-01 18 +Alf_Somerfield 2017-11-01 10 +Agapanthia_villosoviridescens 2018-02-01 53 +Adam_Goldberg 2015-12-01 42338 +1961_Paris_massacre 2017-01-01 52 +2007_in_radio 2017-04-01 131 +Arthur_French,_5th_Baron_de_Freyne 2015-12-01 44 +AMD_Socket_G3 2017-04-01 121 +Albert_geouffre_de_lapradelle 2016-02-01 1 +Collaborations_between_ex-Beatles 2015-07-01 1279 +Betty_Ireland 2016-04-01 40 +Domingo_Tirado_Benedi 2015-07-01 1 +Bac_Ly 2016-04-01 1 +All_gas-phase_iodine_laser 2015-07-01 136 +Andre_Salifou 2017-01-01 1 +1,3-b-D-glucan 2017-05-01 2 +Joseph_Johnston_Muir 2017-01-01 3 +17th_of_Shahrivar_league 2016-05-01 63 +2001_in_art 2018-03-01 131 +Abiji_language 2017-10-01 6 +Ahliah_school 2018-03-01 133 +1605_in_India 2017-12-01 83 +Dr_Jeom_Kee_Paik 2015-07-01 1 +1954_Texas_Longhorns_football_team 2018-01-01 69 +1985_Little_League_World_Series 2016-07-01 226 +Eleanor_de_bohun 2015-07-01 1 +Adrenaline_strength 2016-03-01 8 +434_BC 2018-02-01 97 +8x60mm_S 2015-06-01 61 +2016-17_South_Pacific_cyclone_season 2017-09-01 101 +Beth_Aala 2017-06-01 15 +Al_Shaver 2017-07-01 138 +Adelphoi_Zangaki 2018-01-01 89 +Cyclopropyl_group 2016-11-01 167 +216_Sqn 2017-08-01 11 +20469_Dudleymoore 2017-05-01 5 +Attila_Hildmann 2017-06-01 103 +1970_Arkansas_Razorbacks_football_team 2016-11-01 66 +Anthony_Fairfax 2017-08-01 24 +Fort_Point,_Boston 2016-04-01 384 +Epsilon_numbers 2016-04-01 3 +2013_Recopa_Sudamericana 2016-05-01 202 +Italo_Disco 2017-01-01 27 +Andersen_Press 2015-09-01 228 +Amasa_Walker 2017-09-01 146 +2010_in_Israeli_film 2015-09-01 234 +A-25_Shrike 2017-12-01 90 +2009_Winnipeg_Blue_Bombers_season 2017-06-01 66 +Ashland_County,_Ohio 2016-10-01 1298 +Dusky_Turtle_Dove 2017-01-01 3 +Antonov_148 2017-02-01 129 +Abdul_Hamid_Lahori 2017-08-01 458 +Amadeo_of_Spain 2015-11-01 1701 +2015_Novak_Djokovic_tennis_season 2017-07-01 2484 +Dhabawallah 2016-04-01 4 +Afshar_Beylik 2017-06-01 4 +1998_ATP_Tour_World_Championships_-_Singles 2017-03-01 20 +Beach_Haven_Terrace,_New_Jersey 2016-11-01 4 +Aix-la_Chapelle 2018-03-01 66 +Ackerman,_Val 2017-05-01 2 +47th_Ohio_Infantry 2016-12-01 59 +100_People,_100_Songs 2017-11-01 517 +2007_Masters_of_Formula_3 2016-01-01 63 +1832_US_presidential_election 2016-05-01 6 +Aaron_Baker 2016-05-01 113 +2015-16_FIBA_Europe_Club_Competition 2017-11-01 2 +Alebra 2018-02-01 27 +Asilus_crabroniformis 2016-11-01 4 +Earth_and_Air_and_Rain 2016-11-01 31 +2014_Stade_Tata_Raphael_disaster 2018-02-01 1 +Alexander_Izvolski 2017-01-01 7 +Fabric_17 2017-01-01 13 +1925_Campeonato_de_Portugal_Final 2018-01-01 37 +1948_Ashes_series 2017-01-01 121 +Abraham_ben_david 2016-09-01 4 +2006_Acropolis_Rally 2017-01-01 12 +Alottment 2017-03-01 6 +Angolanness 2015-07-01 11 +2002_in_NASCAR_Craftsman_Truck_Series 2016-01-01 12 +Aces_of_ANSI_Art 2015-08-01 77 +Alan_Tskhovrebov 2015-08-01 13 +Aegis_Security 2015-10-01 1 +Alec_the_Great 2015-05-01 69 +Corel_SnapFire 2016-11-01 9 +AbdulMagid_Breish 2016-03-01 276 +A_Night_in_NYC 2015-10-01 232 +79th_parallel_south 2016-11-01 17 +Alphonse_Crespo 2016-06-01 50 +Acacia_petite_feuille 2016-05-01 1 +Amstrad_464 2017-12-01 18 +Charles_County,_Maryland 2017-06-01 2079 +1972_outbreak_of_smallpox_in_Yugoslavia 2018-03-01 375 +Alungili 2017-09-01 37 +Brontispalaelaps_froggatti 2016-04-01 1 +Alison_Lacey 2016-12-01 94 +Alessandro_Capra 2017-07-01 21 +2012_UCF_Knights_baseball_team 2016-08-01 46 +16_Candles_Down_the_Drain 2017-05-01 2 +Anandra_strandi 2015-08-01 11 +Brigitte_Rohde 2017-01-01 9 +Agenda_VR3 2015-09-01 93 +1641_in_architecture 2015-11-01 32 +ALF_Tales 2016-04-01 280 +A_Woman_Scorned 2015-07-01 164 +Air-free_techniques 2016-04-01 5 +1973_in_British_television 2016-04-01 96 +All_Saints_Cemetery 2017-04-01 345 +1981_in_Swedish_football 2016-06-01 21 +Apple_Dictionary 2016-10-01 19 +2015_PBZ_Zagreb_Indoors 2016-08-01 121 +16th_IIFA_Awards 2017-02-01 1194 +Duki,_Pakistan 2016-04-01 14 +Administration_of_Borderchek_points,_Population_and_Immigration 2015-09-01 2 +Alonia,_Zante 2017-10-01 1 +African_United_Club 2017-10-01 50 +Burjanadze-Democrats 2016-04-01 19 +Application_software_development 2015-06-01 27 +Almonacid_de_la_Sierra,_Zaragoza 2015-06-01 1 +Baissour 2016-12-01 100 +Coti_Sorokin 2016-04-01 46 +Alberta_and_Great_Waterways_Railway_scandal 2017-05-01 70 +1942_Alabama_Crimson_Tide_football_team 2015-09-01 144 +Adam_Art_Gallery 2016-08-01 80 +Akshinski_Raion 2016-09-01 1 +Edwin_of_Deira 2015-07-01 34 +Altaf_Mahmud 2015-10-01 245 +Astana_cycling_team 2017-12-01 7 +1982_CART_World_Series_season 2015-12-01 3 +3_Rotaxane 2017-03-01 1 +1924_Eastern_Suburbs_season 2015-08-01 32 +Downtown_Science 2016-11-01 6 +1993-94_Slovak_Cup 2017-04-01 1 +Brandon_Wayne_Hedrick 2016-04-01 32 +2015_Brasil_Open 2016-01-01 403 +Aung_Pinle_Hsinbyushin 2016-02-01 69 +An_Numaniyah 2016-06-01 185 +24th_Arkansas_Infantry_Regiment 2016-03-01 64 +Adimchinobe_Echemandu 2017-05-01 90 +August_Belmont,_Jr 2017-06-01 8 +Empacher 2016-11-01 102 +Abdulkadir_Sheikh_Dini 2017-01-01 70 +Alvaro_Quiros 2017-08-01 12 +Algernon_May 2017-11-01 35 +Athol_Shmith 2016-02-01 188 +2004_Indesit_ATP_Milan_Indoor_-_Doubles 2015-09-01 1 +Alfred_Dennis 2016-11-01 9 +2nd_Medical_Battalion 2017-05-01 380 +Atom_clocks 2016-03-01 12 +368th_Expeditionary_Air_Support_Operations_Group 2015-06-01 48 +1911_Washington_Senators_season 2017-06-01 46 +1963_Night_Series_Cup 2015-07-01 26 +Aromobates_capurinensis 2017-12-01 21 +2013-14_Super_Lig 2017-05-01 14 +Al_taglio 2016-09-01 2 +2015_RBC_Tennis_Championships_of_Dallas 2016-04-01 18 +2011_Mirabella_Cup 2017-11-01 15 +1996_NHL_Western_Conference_Final 2015-06-01 1 +2009_Formula_Nippon_Championship 2016-11-01 44 +Information_security_awareness 2017-01-01 56 +A_Noiseless_Patient_Spider 2018-03-01 757 +Aggregate_field_theory 2017-06-01 3 +Armenians_in_Central_Asia 2015-10-01 351 +Acona,_Mississippi 2017-10-01 33 +Apozomus 2017-12-01 19 +Antwun_Echols 2016-11-01 87 +1949_Albanian_Cup 2016-11-01 11 +Aesychlus 2016-10-01 4 +1961_Pulitzer_Prize 2015-09-01 879 +East_Midlands_Conference_Centre 2016-04-01 13 +Blumen 2016-11-01 11 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_custom.txt b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_custom.txt new file mode 100644 index 00000000000..2d4626327a6 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_custom.txt @@ -0,0 +1 @@ +row('Akiba_Hebrew_Academy';'2017-08-01';241),row('Aegithina_tiphia';'2018-02-01';34),row('1971-72_Utah_Stars_season';'2016-10-01';1),row('2015_UEFA_European_Under-21_Championship_qualification_Group_8';'2015-12-01';73),row('2016_Greater_Western_Sydney_Giants_season';'2017-05-01';86),row('AAA_Americas_Trios_Championship';'2015-10-01';104),row('1420_in_literature';'2016-05-01';20),row('Adair,_Beegie';'2017-08-01';2),row('1980_Rugby_League_State_of_Origin_match';'2017-07-01';2),row('Column_of_Santa_Felicita,_Florence';'2017-06-01';14) diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_headers.csv b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_headers.csv new file mode 100644 index 00000000000..f01c7b864df --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/data_small_headers.csv @@ -0,0 +1,1001 @@ +"path","month","hits" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +"AAA_Americas_Trios_Championship","2015-10-01",104 +"1420_in_literature","2016-05-01",20 +"Adair,_Beegie","2017-08-01",2 +"1980_Rugby_League_State_of_Origin_match","2017-07-01",2 +"Column_of_Santa_Felicita,_Florence","2017-06-01",14 +"2007_Copa_America","2016-07-01",178 +"Car_dealerships_in_the_USA","2015-07-01",11 +"Dihydromyricetin_reductase","2015-07-01",1 +"ATCvet_code_QB05BB01","2017-04-01",1 +"City_CarShare","2017-01-01",125 +"Heidenrod","2017-01-01",10 +"Arthur_Henrique","2016-11-01",12 +"Alan_Ebnother","2015-11-01",66 +"2013_UConn_football_season","2017-05-01",2 +"2008_American_League_Division_Series","2016-12-01",376 +"Antilipaemic","2017-09-01",12 +"Aberzombie","2016-12-01",28 +"2008_Asian_Wrestling_Championships","2016-12-01",76 +"Federal_Correctional_Complex,_Pollock","2017-01-01",19 +"Central_body","2015-07-01",32 +"Binbrook,_Ontario","2015-07-01",446 +"Azerbaijan_at_the_2016_Judo_Grand_Prix_Samsun","2016-10-01",25 +"Ashford_Lake","2017-10-01",80 +"1942_Joint_Strike","2015-12-01",3 +"AFC_Youth_Championship_2012","2017-10-01",2 +"Akhira","2016-07-01",64 +"Arroniro_Arlieri","2016-10-01",1 +"Alesheim_Burgsalach","2015-05-01",2 +"2700_classic","2017-05-01",4 +"ARX-8_Laevatein","2015-06-01",14 +"1991_Newsweek_Champions_Cup_-_Singles","2017-06-01",3 +"Aphelandra_sinclairiana","2017-07-01",69 +"Asia_Kong","2015-10-01",2 +"2012_Internazionali_Tennis_Val_Gardena_Sudtirol","2016-02-01",1 +"24_Carat_Purple","2017-06-01",476 +"Acroliths","2017-12-01",9 +"Bundesautobahn_3","2016-04-01",264 +"ATC_code_S01AX21","2016-09-01",1 +"Allington,_Lincolnshire","2015-11-01",188 +"Acer_Aspire_One","2017-06-01",5169 +"ATC_code_L04AC","2015-06-01",1 +"1969_New_Year_Honours","2017-07-01",269 +"Antonio_Napolitano","2017-11-01",44 +"Amberfish","2017-10-01",11 +"1976_Cam_2_Motor_Oil_400","2018-03-01",45 +"April_25,_2017","2018-01-01",2 +"Akahori_Station","2016-06-01",11 +"Abducens_palsy","2016-05-01",28 +"Ancona_cathedral","2018-01-01",2 +"Ajou_Motor_College","2017-02-01",83 +"Brad_Skyes","2016-11-01",1 +"Alegro_PCS","2017-07-01",157 +"Franz_Dunshirn","2017-01-01",1 +"Arthur_Godfrey_Road","2016-11-01",3 +"Ab_Golman","2017-05-01",30 +"Art_in_early_modern_Scotland","2016-03-01",98 +"1968_World_Series","2016-02-01",1960 +"1828_in_the_UK","2017-08-01",3 +"Explorer-1_Prime_Unit_2","2016-11-01",11 +"2014_Desafio_Internacional_das_Estrelas","2017-12-01",31 +"Ambulyx_subocellata","2016-08-01",1 +"2008_Hamilton_Tiger-Cats_season","2015-11-01",153 +"Deuterogamist","2015-07-01",5 +"Art_Nouveau_furniture","2017-12-01",839 +"Allison,_Colorado","2015-10-01",85 +"2014_MLS_Re-Entry_Draft","2017-09-01",36 +"Amiot_353","2015-12-01",8 +"ACLU_of_Massachusetts","2015-11-01",106 +"Altable,_Spain","2016-10-01",1 +"Agnidra_scabiosa","2016-12-01",16 +"Dictyotremella_novoguineensis","2015-07-01",1 +"Compiler_Construction","2015-07-01",42 +"Aufheben","2016-11-01",1080 +"Avafauna","2017-06-01",17 +"Atheist_billboard","2017-01-01",19 +"2011_Indonesia_Super_League_All-Star_team","2015-11-01",15 +"BrahMos_II","2015-07-01",31 +"1707_in_art","2016-04-01",17 +"Aeromarine_Model_60","2016-06-01",34 +"Ayatollah-al-ozma","2015-06-01",12 +"Exanimus","2017-01-01",4 +"Anderby","2017-01-01",29 +"Ashgabat_indoor_tennis_arena","2017-07-01",27 +"1971_Rose_Bowl","2015-12-01",961 +"2004_HR56","2016-05-01",5 +"1886_in_South_Africa","2016-03-01",70 +"Bishop_of_Central_Newfoundland","2016-04-01",1 +"Alice_Rivlin","2016-09-01",1137 +"Arriba_en_la_Cordillera","2017-06-01",39 +"Adam_Lively","2016-06-01",77 +"Colasposoma_fairmairei_fairmairei","2017-06-01",5 +"Archie_Barton","2017-02-01",49 +"Aharon_wasserman","2016-01-01",7 +"Alabama_Educational_Television_Commission","2017-05-01",3 +"Advanced_Technology_Bomber","2016-02-01",67 +"1-krona","2017-01-01",4 +"Ahmadabad-e_Kalij-e_Sofla","2017-01-01",3 +"Bob_Dolman","2016-11-01",245 +"Bellevue,_French_Guiana","2017-01-01",5 +"Bison_Nickel","2017-01-01",2 +"Arthur_Drabble","2016-12-01",35 +"Edgewater_Borough,_New_Jersey","2016-11-01",3 +"Alberto_Cambrosio","2017-11-01",31 +"Amalia_Celia_Figueredo","2017-07-01",32 +"1989_-_1992_Rugby_League_World_Cup","2016-01-01",10 +"Admir_Seferagic","2016-06-01",7 +"Adriaan_Loosjes","2015-05-01",46 +"Alfred_Manuel_Martin","2015-06-01",3 +"Academy_of_the_Arabic_Language","2015-08-01",67 +"Ankita_Shrivastav","2018-01-01",7430 +"Anarchism_in_asia","2017-11-01",1 +"Batiquitos_Lagoon_State_Marine_Conservation_Area","2015-07-01",18 +"Alstonia_calophylla","2017-12-01",2 +"4-Hydroxycyclohexanecarboxylate_dehydrogenase","2016-11-01",4 +"832_symmetry","2017-09-01",6 +"1931_Fuyun_earthquake","2016-07-01",64 +"1998_Masters_of_Formula_3","2016-01-01",60 +"2011_LG_Hockey_Games","2016-04-01",7 +"Generalized_pustular_psoriasis","2017-01-01",159 +"2013_European_Cup_Winter_Throwing","2016-07-01",56 +"2008_in_Argentina","2017-06-01",48 +"Apostrophized","2017-10-01",5 +"Algebraically_compact_module","2017-01-01",5 +"Askett","2015-10-01",79 +"2009_swine_flu_outbreak_timeline","2015-08-01",65 +"72704-01-9","2017-12-01",4 +"Alexandre-Charles-Albert-Joseph_Renard","2017-11-01",4 +"Acyl-CoA_oxidase","2016-09-01",250 +"2011_Budweiser_Shootout","2015-08-01",109 +"Augusta_Davies_Webster","2015-07-01",2 +"Association_theory","2017-07-01",112 +"Abemama_Airfield","2015-05-01",8 +"Archaeological_Museum_of_Heraklion","2015-10-01",14 +"Authorized_marches_of_the_Canadian_Armed_Forces","2016-11-01",241 +"1986_in_Portugal","2017-01-01",7 +"Antiziganism_in_Bulgaria","2017-12-01",13 +"Adriana_Martin","2015-09-01",21 +"2004_Green_Bay_Packers_season","2015-05-01",970 +"Agrippa_the_Sceptic","2017-11-01",95 +"Admiral_Island","2016-04-01",1 +"Auxiliary_sign_language","2015-06-01",31 +"2013_Food_City_500","2015-06-01",90 +"Andy_Roesch","2015-08-01",15 +"Alsoszentivan","2017-05-01",4 +"Architecture_of_Belgium","2015-05-01",199 +"1_South_African_Infantry","2017-06-01",5 +"1930_Auburn_Tigers_football_team","2016-12-01",39 +"1860_in_Canada","2017-05-01",269 +"Aldeaseca_de_la_Frontera","2018-03-01",21 +"Elijah_Fox_Cook","2015-07-01",13 +"2010_BCS_Bowl_Games","2016-03-01",1 +"2017_NPSL_season","2017-06-01",2806 +"Bank_of_New_South_Wales_v_Commonwealth","2016-12-01",173 +"American_Enterprise_Association","2016-02-01",4 +"26th_Kentucky_Derby","2018-03-01",1 +"Chaldean_Diocese_of_Amid","2016-11-01",18 +"Ajaran_language","2016-03-01",1 +"1992_Texas_Rangers_season","2017-06-01",113 +"26_SAS","2017-12-01",3 +"2015_Terengganu_FA_season","2016-01-01",537 +"Aagard,_Oregon","2017-03-01",3 +"Auberry,_CA","2017-05-01",13 +"American_Eskimo_spitz","2015-09-01",3 +"Antidiabetic","2016-11-01",75 +"Asinius","2017-11-01",26 +"Andrey_Vasilievich_Abramov","2016-10-01",1 +"Alan_Carrington","2018-03-01",91 +"Colebrook,_Ontario","2017-06-01",2 +"Abbasabad-e_Kheyrabad","2015-08-01",24 +"Arandjelovac_Municipality","2016-02-01",1 +"Aloysius_Valente","2017-12-01",11 +"Almondo_Curry","2016-03-01",86 +"4th_century_AD","2017-03-01",13 +"Askhat_Dilmukhamedov","2016-02-01",77 +"1147_AD","2017-05-01",1 +"1953_Torneo_di_Viareggio","2017-03-01",20 +"ATP_Schenectady","2015-12-01",30 +"Lakarian_City","2017-01-01",3 +"Adam_Ferency","2017-12-01",176 +"AugustDvorak","2016-07-01",5 +"97th_Light_Infantry_Division","2017-07-01",1 +"16th_Connecticut_Infantry_Regiment","2016-05-01",146 +"2011_Somalian_drought","2017-05-01",2 +"Anbargah","2017-12-01",8 +"1921_in_Paraguayan_football","2016-03-01",2 +"Cosmetic_dermatitis","2017-01-01",5 +"Annunciation_Greek_Orthodox_Cathedral,_Atlanta,_Georgia","2015-09-01",9 +"1300_AM","2016-07-01",106 +"A_Promising_Africa","2016-03-01",41 +"2015-16_Odense_Bulldogs_season","2016-10-01",1 +"Aral_AG","2017-12-01",1446 +"Angel_Vivar_Dorado","2015-12-01",6 +"1951_Australian_Championships","2018-03-01",32 +"DJMax_Portable_Hot_Tunes","2017-01-01",27 +"Allinge","2017-03-01",32 +"1986_Buick_WCT_Finals","2016-11-01",14 +"Arimatsu,_Aichi","2015-06-01",112 +"Arthur_Berzinsh","2017-02-01",249 +"Apolima_Uta","2017-04-01",23 +"Capitol_Hill_Pride_Festival","2015-07-01",19 +"Kara-Murza","2017-01-01",5 +"Aigleville,_Alabama","2015-11-01",19 +"Abdullah_bin_al-Hussein","2017-02-01",1 +"2017-18_Inter_Milan_season","2018-03-01",26 +"African_Collared_Dove","2016-07-01",10 +"Achaea_dmoe","2016-11-01",3 +"Aurora,_Utah","2016-06-01",201 +"Architecture_in_Portland,_OR","2017-07-01",1 +"Charchala","2015-07-01",4 +"Around_the_Roses","2015-07-01",3 +"1965_in_music","2016-12-01",3394 +"Alojzije_Jankovic","2017-04-01",5 +"Arisu_Seno","2015-08-01",6 +"ALCO_T-6","2017-01-01",77 +"1998_Royal_Bank_Cup","2015-12-01",32 +"1956_Claxton_Shield","2016-11-01",9 +"Anita_Dube","2017-07-01",233 +"Anderson_Windows","2015-05-01",13 +"Annaquatucket_River","2018-03-01",38 +"Black_salve","2017-01-01",1496 +"Anna_Pendleton_Schenck","2017-02-01",11 +"Asghar_Nadeem_Syed","2017-07-01",146 +"Disarming","2016-11-01",5 +"Antarctic_ice_cap","2017-08-01",7 +"Antonio_Ottone","2017-05-01",11 +"Coralie_Larnack","2017-01-01",9 +"Budha_Subba_Gold_Cup","2016-11-01",24 +"Amphoe_Chaiya","2017-03-01",9 +"Anarcho-capitalism_in_Somalia","2016-10-01",7 +"Felix_Loch","2017-01-01",131 +"26508_Jimmylin","2017-12-01",3 +"Andrew_McMillen","2015-11-01",134 +"Dundee_Canal_Industrial_Historic_District","2017-01-01",2 +"Aula_Baratto","2015-12-01",140 +"Church_of_St_Mary,_Knowsley","2015-07-01",1 +"Aggelakis","2017-10-01",1 +"Al_Badiyah","2017-11-01",157 +"Assault_Gunboat","2016-03-01",21 +"Lachau","2017-01-01",4 +"2008_Pittsburgh_Steelers_season","2016-12-01",10018 +"Apolychrosis_candidus","2018-01-01",24 +"Andrei_Krylov","2017-02-01",192 +"Aldesh_Vadher","2018-02-01",7 +"Alwand","2017-02-01",7 +"Edward_Baker_Lincoln","2015-07-01",4347 +"Aermotor_Corporation","2017-11-01",4 +"Aischylos","2017-01-01",7 +"6th_Assault_Aviation_Corps","2017-07-01",100 +"Azygos_lobe","2016-10-01",1598 +"Demirciler,_Nazilli","2015-07-01",4 +"Akhlaq-e-Hindi","2016-11-01",13 +"Dragon_Crusaders","2016-04-01",122 +"25V_USB","2016-01-01",1 +"Calliophis_melanurus","2017-01-01",31 +"Antonionian","2016-10-01",15 +"Ashley_Richardson","2017-09-01",1216 +"1st_Observation_Group","2018-01-01",6 +"Andrzej_Bargiel","2015-05-01",97 +"2008_AFL_National_Under_16_Championships","2018-03-01",20 +"Ammon_Bundy","2016-09-01",11890 +"Benno_Wandolleck","2016-11-01",5 +"Aero-Kros_MP-02_Czajka","2016-03-01",136 +"A6005_road","2015-10-01",14 +"Eagle_Eye_Networks","2015-07-01",101 +"Aarberg","2017-12-01",277 +"Encyclopedia_of_anthropology","2015-07-01",1 +"Duncormick_railway_station","2016-11-01",7 +"Aiqing_huajiao_zhuanyi","2017-03-01",1 +"Crude_oil_washing","2016-04-01",466 +"2010_Indiana_Hoosiers_football_team","2017-06-01",90 +"Book_of_Bodley_Head_Verse","2015-07-01",18 +"Absence_seizure","2016-05-01",18152 +"Cayucupil","2016-04-01",3 +"Akanabee","2017-03-01",1 +"Grooved_consonant","2017-01-01",5 +"Dellamora_philippinensis","2015-07-01",7 +"Dejan_Blazevski","2017-01-01",1 +"Arabis_armena","2016-08-01",25 +"1988_Summer_Paralympics_medal_table","2016-12-01",90 +"2012-13_Basketball_Championship_of_Bosnia_and_Herzegovina","2017-04-01",2 +"1966_in_music","2017-10-01",3510 +"Antti_Tyrvainen","2015-12-01",2 +"African_desert","2016-06-01",262 +"Bruneau_mariposa_lily","2016-04-01",1 +"Bernie_Parmalee","2017-06-01",221 +"2015_South_American_Youth_Football_Championship_squads","2015-09-01",594 +"1985_IIHF_World_U20_Championship","2015-08-01",7 +"18th_British_Academy_Film_Awards","2018-02-01",270 +"523_Ada","2016-04-01",35 +"Active_Pharmaceutical_Ingredients","2016-02-01",5 +"Burley,_ID_mSA","2015-07-01",2 +"CFRN-TV-10","2017-06-01",2 +"1982_Super_Bowl_of_Poker","2017-08-01",38 +"Australian_Journal_of_Educational_Technology","2017-01-01",1 +"2013_Super_League_Grand_Final","2016-06-01",212 +"2006_BCR_Open_Romania","2015-06-01",25 +"Charlestown_Townies","2016-04-01",319 +"1943_Polish_underground_raid_on_East_Prussia","2017-08-01",8 +"Anthony_Celestino","2018-02-01",182 +"Andrew_Beerwinkel","2018-02-01",73 +"Greigia_atrobrunnea","2017-01-01",1 +"Adrian_Beecham","2017-11-01",1 +"Implementation_of_mathematics_in_set_theory","2017-01-01",12 +"Annastacia_Palaszczuk","2015-05-01",6247 +"Egon_Zimmermann_II","2016-11-01",3 +"Air_aide-de-camp","2018-03-01",137 +"Albert_Murphy","2016-09-01",1 +"1924_Arkansas_Razorbacks_football_team","2016-02-01",28 +"Avondale_Mill","2016-10-01",68 +"Alexander_Volzhin","2015-12-01",25 +"Arek_Monthly","2017-08-01",31 +"Dinka_Blanche","2015-07-01",1 +"1921_Mercer_Baptists_football_team","2016-11-01",10 +"Afro-Antiguan_and_Barbudan","2016-06-01",252 +"American_southern_literature","2016-10-01",3 +"1947_Swiss_Grand_Prix","2016-11-01",32 +"99p_Stores","2017-12-01",3028 +"Artem_Radkov","2018-03-01",21 +"Arctic_brome","2016-12-01",19 +"Battle_Of_Moskova","2015-06-01",6 +"Airdrieonians","2016-06-01",32 +"Advanced_transportation_controller","2018-03-01",79 +"BC_government","2016-12-01",18 +"Antonio_Maura","2017-03-01",457 +"Anjuman,_Afghanistan","2017-09-01",62 +"Deodato_Guinaccia","2015-07-01",13 +"Blowjob_Betty","2016-11-01",28 +"453d_Flying_Training_Squadron","2017-08-01",3 +"1990_Africa_Cup_of_Nations","2016-04-01",22 +"Agenville","2016-08-01",100 +"1202_in_Scotland","2018-01-01",82 +"Calytrix_desolata","2017-06-01",10 +"1957_in_Chile","2016-04-01",13 +"Anglican_Bishop_of_Torres_Strait_people","2017-08-01",1 +"2015_Mexican_Grand_Prix","2015-06-01",528 +"Catalan_parliament","2017-01-01",14 +"Cult_Shaker","2017-01-01",32 +"Ander_Gayoso","2016-11-01",34 +"Ageneiosus_ucayalensis","2017-12-01",20 +"Club_de_Berne","2015-07-01",194 +"Adecco","2016-03-01",9863 +"Anti-unionism","2018-01-01",11 +"Auchindoun_Castle","2017-01-01",102 +"557_in_poetry","2016-07-01",1 +"Abu_ol_Verdi_Rural_District","2017-01-01",1 +"Centro_73","2016-04-01",23 +"Dagger_compact_category","2016-04-01",97 +"Alan_Nunn_May","2017-11-01",770 +"Basal_clade","2015-07-01",44 +"Aizu_Line","2015-08-01",26 +"Edward_Kernan_Campbell","2016-04-01",5 +"865_area_code","2016-12-01",9 +"Bahamas_at_the_1984_Summer_Olympics","2017-06-01",35 +"Gardan_Kalat","2017-01-01",1 +"American_Samoa_national_under-19_football_team","2017-12-01",4 +"Kayah_National_United_League","2017-01-01",14 +"2007_Nordea_Nordic_Light_Open_-_Singles","2016-10-01",2 +"Avondale_Estate","2016-11-01",2 +"Acalolepta_variolaris","2017-02-01",3 +"Anantapur,_Andhra_Pradesh","2017-05-01",1032 +"Amenable_Banach_algebra","2015-08-01",59 +"300_metres","2017-01-01",61 +"Black_Bottom,_Kentucky","2016-04-01",8 +"100_Players_Who_Shook_The_Kop","2018-01-01",1133 +"Adventure_story","2015-07-01",29 +"Anacampsis_lignaria","2017-05-01",5 +"2007_American_Indoor_Football_Association_season","2015-09-01",89 +"Dmitry_Kardovsky","2016-04-01",33 +"A10_autoroute","2015-11-01",27 +"1995_Sydney_Bulldogs_season","2017-04-01",40 +"Ilex_jelskii","2017-01-01",2 +"Adrian_Jose_Hernandez","2016-10-01",2 +"CallAir_A-5","2016-11-01",4 +"22nd_meridian_west","2015-07-01",45 +"Anglican_Diocese_of_Antananarivo","2015-08-01",2 +"Andrew_Kelsey","2016-11-01",14 +"Brownhill_Creek","2017-06-01",4 +"Abunai_Deka","2015-06-01",269 +"Aisha_Jefferson","2017-04-01",115 +"Alonso_Lopez","2017-03-01",7 +"Aeroparque_Ciudad_de_Mendoza","2016-01-01",1 +"Arthur_Ashley_Sykes","2017-12-01",45 +"Holy_Face_Medal","2017-01-01",20 +"1Chronicles","2018-02-01",1 +"2014_CFU_Club_Championship","2017-12-01",108 +"Aetna_class_ironclad_floating_battery","2015-06-01",37 +"Antoine_Delrio","2015-07-01",2 +"Chislet_Windmill","2015-07-01",38 +"Aerojet_SD-2","2017-07-01",59 +"Age_role_play","2015-09-01",2 +"50687_Paultemple","2018-03-01",8 +"1997-98_Cuban_National_Series","2017-02-01",1 +"Aleksandr_Borisovich_Belyavskiy","2017-10-01",42 +"Carol_MacReady","2017-01-01",111 +"18th_Chess_Olympiad","2015-06-01",134 +"Clara_Schonfeld","2015-07-01",1 +"Apollonius_of_Athens","2017-02-01",35 +"ABC_80","2018-03-01",603 +"Apatelodes_damora","2015-08-01",22 +"Ernest_Walbourn","2016-04-01",30 +"428_BCE","2017-04-01",2 +"72nd_Seaforth_Highlanders","2017-12-01",29 +"Broughton_Hackett","2015-07-01",38 +"A_Fazenda_2","2016-12-01",56 +"ATCvet_code_QJ01MQ","2017-05-01",2 +"Abura,_Iran","2017-03-01",3 +"DeLeon_Independent_School_District","2015-07-01",1 +"Abby_aldrich","2016-09-01",1 +"Cinema_One_Originals","2016-11-01",359 +"2013_European_Short_Course_Swimming_Championships","2017-09-01",124 +"Ars_technica","2015-11-01",442 +"AMS_Production_Company","2016-02-01",1 +"Joao_Soares","2017-01-01",1 +"Cervical_vertebra_6","2017-06-01",45 +"Kevin_Pugh","2017-01-01",2 +"Alpha-1_antitrypsin","2015-11-01",11845 +"Assyrians_in_iran","2017-07-01",53 +"Boophis_ankarafensis","2016-11-01",2 +"A_View_To_a_Kill","2018-01-01",4 +"Charles_Edouard_Brown-Sequard","2015-07-01",7 +"1919_in_Ireland","2017-04-01",239 +"74th_Foot","2015-06-01",3 +"9275_Persson","2016-07-01",22 +"Dalcerides_mesoa","2015-07-01",11 +"A_Summer_Bird-Cage","2016-03-01",248 +"2011_NAB_Cup","2017-10-01",127 +"13th_Parliament_of_Lower_Canada","2015-08-01",41 +"2011_Players_Championship_Finals","2015-07-01",25 +"Flag_of_Tenerife","2017-01-01",128 +"Hypopta_corrientina","2017-01-01",1 +"Jalatarangam","2017-01-01",16 +"Adjoint_endomorphism","2018-01-01",330 +"Anime_conventions","2015-06-01",18 +"2004_Grammy_Award","2015-06-01",13 +"American_war","2015-07-01",80 +"Beynes,_Yvelines","2016-11-01",32 +"Agriculture_Department","2016-06-01",16 +"Andrey_Chisty","2015-10-01",58 +"Ait_Yahia_Moussa","2017-08-01",7 +"Alfred_Blau","2017-03-01",57 +"1869_in_sports","2017-08-01",73 +"Ambolodia_Sud","2016-04-01",6 +"Animal_slaughter","2017-06-01",6423 +"Adamowka_Commune","2018-01-01",2 +"Arsenic_pentachloride","2016-03-01",467 +"220_BCE","2016-01-01",3 +"863d_Engineer_Battalion","2015-11-01",160 +"Amer_Abu-Hudaib","2017-04-01",31 +"Aaina_tv","2017-08-01",3 +"Arnhem,_Netherlands","2015-08-01",67 +"Antoine_de_sartine","2015-08-01",4 +"ATC_code_A16","2016-01-01",155 +"Eastern_Front","2017-01-01",70 +"Ashy-headed_tyrannulet","2016-12-01",44 +"Aoheng_language","2015-08-01",64 +"1996_World_Junior_Canoe_Slalom_Championships","2017-11-01",15 +"Agriophara_nodigera","2017-11-01",12 +"Amsterdam_Island_cattle","2015-12-01",675 +"Aliyah_from_the_Soviet_Union_in_the_1990s","2017-08-01",54 +"Abandoned_and_Little_Known_Airfields","2018-01-01",2 +"Church_numerals","2015-07-01",57 +"Ankeny_Christian_Academy","2015-09-01",74 +"2010_FIFA_World_Cup_qualification_-_AFC_First_Round","2017-06-01",58 +"1ESS_switch","2015-07-01",514 +"Chelys_boulengerii","2016-04-01",1 +"Bivalent_logic","2016-11-01",25 +"Ivan_Skavinsky_Skavar","2017-01-01",1 +"Fergus_Sings_the_Blues","2016-04-01",62 +"2015-16_Libyan_Premier_League","2017-02-01",4 +"Dutch_Chess_Championship","2017-01-01",35 +"Every_Man_in_His_Humor","2016-11-01",1 +"2008_Allstate_BCS_National_Championship_Game","2015-08-01",11 +"Aq_Tappeh,_Hamadan","2015-09-01",25 +"Agrotractor","2016-02-01",1 +"Alexander_of_Pfalz-Zweibrucken","2017-12-01",2 +"2003_Mistral_World_Championships","2016-04-01",6 +"146th_Fighter-Interceptor_Wing","2015-11-01",49 +"Al-Qahir","2016-04-01",328 +"25604_Karlin","2015-05-01",20 +"Allen_taflove","2017-12-01",3 +"Aretha_Thurmond","2017-05-01",109 +"Atlanta_and_lagrange_rail_road","2015-07-01",1 +"ACSI_College_Iloilo","2015-10-01",1 +"Alan_Sacks","2015-07-01",150 +"African_Desert_Warbler","2017-02-01",11 +"A_Man_and_His_Soul","2018-02-01",89 +"ASCII_ART","2015-05-01",9 +"1992-93_VMI_Keydets_basketball_team","2016-10-01",1 +"George_and_the_Dragon","2017-01-01",18 +"2012_NAB_Cup","2016-12-01",99 +"1965_Indy_500","2016-05-01",51 +"Forest_Glen,_Nova_Scotia","2016-04-01",9 +"A_Critical_Dictionary_of_English_Literature","2016-08-01",4 +"Aquion_Energy","2015-08-01",1077 +"Alibeyce,_Emirdag","2017-09-01",1 +"Blauhu00F6hle","2015-07-01",1 +"Ian_Sommerville","2017-01-01",1 +"Air_propulsion","2017-07-01",474 +"2016_12_Hours_of_Sebring","2016-10-01",187 +"Asites","2017-07-01",4 +"Al-Kini","2017-03-01",1 +"Austin_Aztex_2009_season","2016-03-01",10 +"Alto_Vista_Chapel","2015-12-01",833 +"Abecedaria","2017-04-01",22 +"Farm_to_Market_Road_2503","2016-11-01",3 +"Anglican_Bishop_of_The_Leeward_Islands","2015-09-01",2 +"Basketball_at_the_2011_Pan_American_Games","2017-06-01",120 +"Angela_Peel","2016-08-01",7 +"Amber_Frey","2018-02-01",728 +"Afraid_to_Sleep","2017-06-01",51 +"ATC_code_A02BA","2018-02-01",7 +"Apateon_pedestris","2015-11-01",5 +"Alois_Estermann","2015-12-01",1155 +"1752_in_science","2016-01-01",78 +"Baldassin","2017-06-01",3 +"Camilla_Hildegarde_Wedgwood","2017-01-01",1 +"B-A-C-H_motive","2016-10-01",3 +"AI_Velorum_star","2016-09-01",1 +"Ali_Zayn_al-Abidin","2017-04-01",71 +"Ailurarctos_lufengensis","2015-07-01",1 +"Clearview,_Philadelphia","2017-06-01",67 +"Adam_Sender","2016-08-01",759 +"Apriona_paucigranula","2018-02-01",7 +"Dark_at_the_Top_of_the_Stairs","2015-07-01",10 +"Acanthio","2017-12-01",11 +"1980_Labatt_Brier","2018-01-01",111 +"2016-17_New_York_Knicks_season","2017-10-01",21 +"1995_CAF_Cup","2015-10-01",48 +"Boiled_linseed_oil","2016-04-01",79 +"2015_Kumanovo_clashes","2016-07-01",6 +"David_Jamieson","2017-01-01",3 +"1915_Florida_Gators_football_team","2015-08-01",32 +"2010-11_New_Zealand_Football_Championship","2017-03-01",1 +"Ashley_Church","2015-08-01",27 +"Acanthoxylini","2017-06-01",27 +"American_Hindu","2016-10-01",33 +"Amylosporomyces","2015-12-01",20 +"2007_Southeast_Asia_Basketball_Association_Championship","2018-01-01",1 +"Aethelred_I","2017-08-01",1 +"2-methyl-GPP_synthase","2018-02-01",1 +"Dave_Aspin","2016-11-01",6 +"Descent_of_the_Nine","2016-04-01",1 +"2010_Kleen_Energy_Systems_disaster","2017-08-01",3 +"1978_in_Japanese_television","2017-08-01",70 +"Alexandros_Falekas","2018-01-01",1 +"1910_in_Afghanistan","2016-02-01",32 +"Abd-ru-shin","2017-09-01",681 +"610_in_poetry","2017-05-01",3 +"2015_arrests_of_FIFA_officials","2017-12-01",46 +"ATmega328P","2017-09-01",26 +"A_G_Mathews","2017-12-01",3 +"Attack_on_Mers-el-Kebir","2016-12-01",511 +"2016_in_Estonia","2016-05-01",89 +"Adidas-Salomon","2015-09-01",574 +"Education_and_Skills_Act_2008","2016-11-01",141 +"1789_in_the_United_States","2015-07-01",845 +"Apple_Computer_advertising","2015-09-01",7 +"9th_US_Army","2016-12-01",17 +"Ad_Rotas","2016-02-01",16 +"Agios_Ioannis,_Paphos","2018-03-01",97 +"Arabian_toad","2017-12-01",100 +"Anterior_pituitary_acidophil","2016-06-01",47 +"Arguello,_Christine","2017-12-01",3 +"Amilkar_Ariza","2017-03-01",67 +"Charles_Grierson","2016-11-01",14 +"Achi,_Bolivar","2017-11-01",1 +"Exonym_and_endonym","2017-01-01",1712 +"Abdul_Maroof_Gullestani","2017-12-01",20 +"Fairlawne_Handicap_Chase","2016-04-01",11 +"1963_Virginia_Tech_Hokies_football_team","2016-07-01",6 +"AE_Clarke","2017-12-01",3 +"ALFA-PROJ_Model_3563_sport","2017-10-01",2 +"Aleks_Vanderpool-Wallace","2018-02-01",32 +"Antioxident","2017-05-01",16 +"Calliope_Project","2015-07-01",3 +"Anderson_World","2017-10-01",5 +"Amydria_selvae","2017-11-01",6 +"Antoni_Katski","2016-09-01",1 +"Bera_District","2017-06-01",85 +"80_South_Street_New_Design","2016-07-01",86 +"Askizsky","2015-08-01",2 +"Amausi_metro_station","2015-11-01",44 +"9486_Utemorrah","2017-04-01",5 +"Army_CIS","2018-01-01",2 +"1851_Chilean_Revolution","2017-06-01",255 +"Jens_Robert_Dahlqvist","2017-01-01",6 +"1966-67_Tercera_Division","2017-05-01",1 +"Chanel_Iman","2017-06-01",9434 +"Astydamia","2017-06-01",34 +"1944_in_Belgium","2016-09-01",27 +"Acton_Baronets,_of_Aldenham","2017-01-01",1 +"2014_FBS_season","2016-12-01",5 +"2016_Winter_Youth_Olympics","2017-09-01",2090 +"1903_Clemson_Tigers_football_team","2017-06-01",50 +"2014_Taca_da_Liga_Final","2017-04-01",2 +"10th_Alberta_general_election","2016-11-01",4 +"Edertalschule_Frankenberg","2016-04-01",16 +"4th_Punjab_Infantry_Regiment","2017-09-01",136 +"America_Air_Linhas_Aereas","2018-02-01",1 +"Australian_Liberal_Party","2015-06-01",146 +"American_licorice","2017-05-01",15 +"2013_NASCAR_Cup_Series","2015-10-01",49 +"Anja_Lundqvist","2016-03-01",93 +"Amauris_dannfelti","2016-01-01",12 +"Abandoned_shipwrecks_act","2015-06-01",3 +"11086_Nagatayuji","2017-02-01",3 +"Advertising_tissues","2017-06-01",1 +"Anti_corn-law_league","2016-10-01",1 +"Always_Guaranteed","2017-09-01",445 +"Alfredo_Palacio_Moreno","2018-01-01",48 +"Antonio_Puche_Vicente","2015-06-01",1 +"Elazig_Province","2017-01-01",1 +"ATC_code_C02AC01","2017-05-01",1 +"Alexander_Mattock_Thompson","2016-08-01",2 +"Cocos_Islands_Malay","2017-06-01",63 +"Aftonbladet_antisemitism_controversy","2016-10-01",1 +"Azad_Kashmir,_Pakistan","2015-07-01",14 +"1852_English_cricket_season","2016-10-01",24 +"Birmingham_Pride","2015-07-01",129 +"Air-pollution_controls","2015-08-01",4 +"James_Southerton","2017-01-01",20 +"Architecture_of_Chiswick_House","2015-06-01",240 +"Alexander,_Colin","2015-12-01",1 +"Al-Mansooreh","2016-10-01",1 +"Arielle_Gastineau_Ashton","2017-12-01",18 +"Blue_Ben","2017-06-01",240 +"1911_Michigan_State_Normal_Normalites_football_season","2017-11-01",1 +"Arctictis_binturong","2017-04-01",334 +"Fornaldarsaga","2016-04-01",18 +"Bibasis_gomata","2017-06-01",35 +"Anna_Schchian","2017-06-01",19 +"2005_in_Rwanda","2016-08-01",69 +"Archaeology_in_ethiopia","2016-01-01",1 +"23277_Benhughes","2016-12-01",2 +"Bahrain_-_USA_relations","2017-06-01",1 +"Dieter_Korn","2015-07-01",13 +"Antidynamo_theorem","2016-10-01",222 +"An_Jae-Won","2016-12-01",1 +"Bruray","2015-07-01",82 +"Gosport_Council_election,_2004","2017-01-01",2 +"1856_in_South_Africa","2017-03-01",60 +"Dialakoro,_Guinea","2017-01-01",1 +"05-CV-1678","2016-02-01",1 +"Allison,_Henry","2016-12-01",5 +"Animal_house","2016-06-01",1399 +"Alexander_Tabarrok","2017-03-01",5 +"Chung-Ho_Memorial_Hospital","2017-06-01",50 +"2013_Internazionali_Trofeo_Lame_Perrel-Faip_-_Doubles","2016-03-01",4 +"1965_Speedway_World_Team_Cup","2017-11-01",13 +"Alexander_Ollongren","2017-11-01",788 +"Amore_traditore,_BWV_203","2016-06-01",83 +"Arthur_William_Rogers","2015-10-01",31 +"Ashoka_pillar","2017-02-01",265 +"1_62_honeycomb","2018-02-01",10 +"1926_Australasian_Championships","2016-05-01",47 +"Export_award","2016-04-01",3 +"5000_Days_Project","2016-07-01",75 +"2012_UCI_Europe_Tour","2017-03-01",65 +"1985_Toronto_Indoor_-_Singles","2015-08-01",4 +"Cedar_Grove,_North_Carolina","2017-06-01",18 +"Battle_of_The_Afsluitdijk","2016-04-01",15 +"Arishtanemi","2017-03-01",7 +"Alfalfa_bill_murray","2016-12-01",7 +"Elisha_Jay_Edwards","2015-07-01",28 +"Arturas_Paulauskas","2016-01-01",10 +"Abdelrahman_Hamad","2015-09-01",2 +"1948_in_Northern_Ireland","2015-07-01",29 +"1988_in_philosophy","2015-05-01",70 +"5-Hydroxytryptaminen","2016-01-01",4 +"2017_FBS_season","2017-10-01",124 +"Areeiro","2016-04-01",2 +"Alemonides","2016-03-01",6 +"Abrochia_caurensis","2016-10-01",1 +"Anafylaxia","2018-01-01",2 +"1938_Grand_National","2018-02-01",80 +"China-Korea_Champions_League","2015-07-01",4 +"Acetyl_bromide","2017-11-01",448 +"24_hours_of_lemans","2015-05-01",37 +"Albright_hereditary_osteodystrophy","2017-02-01",153 +"Ashland_Bus_System","2015-08-01",115 +"1,8-Cineole_2-endo-monooxygenase","2016-10-01",8 +"2005-2006_NHL_Season","2015-11-01",6 +"Cammie_Dunaway","2015-07-01",344 +"D-Fish","2016-11-01",2 +"4_sister_vineyard","2015-09-01",1 +"Alessia_Cara_discography","2017-03-01",100 +"Alexander_Berg","2017-08-01",63 +"4822_Karge","2018-02-01",32 +"Emile_Francis_Trophy","2017-01-01",8 +"Amin_Ghaseminejad","2017-06-01",45 +"Artichia","2017-09-01",19 +"Cividale","2016-11-01",41 +"2007_Orissa_Violence","2016-05-01",1 +"Australian_Saltbush","2016-12-01",5 +"Asian_Food_Channel","2016-09-01",727 +"Camp_iawah","2015-07-01",1 +"ATC_code_J01MA04","2017-11-01",1 +"Arpad_Balazs","2017-10-01",2 +"Angel_of_Music,_or_The_Private_Life_of_Giselle","2018-02-01",56 +"1983_Torneo_di_Viareggio","2016-03-01",22 +"Arellano_University","2017-09-01",1699 +"ATC_code_B03AA","2017-11-01",1 +"FS5000","2016-11-01",1 +"Abd-Allah_ibn_Zubayr","2017-05-01",2 +"1889_SAFA_season","2016-04-01",28 +"Aloha_bowl_broadcasters","2015-05-01",2 +"1994_All_England_Open_Badminton_Championships","2016-07-01",75 +"Are_We_Not_Horses","2015-07-01",79 +"Angiolo_Torchi","2018-02-01",5 +"Chimanimani_National_Park","2017-06-01",37 +"Art_manifesto","2017-09-01",2619 +"Adrian_Apostol","2016-10-01",62 +"Adventure_book","2015-10-01",14 +"Albemarle_Bertie","2016-06-01",20 +"Adam_Deibert","2017-08-01",611 +"Alberta_association_of_architects","2017-10-01",2 +"Alloschmidia","2017-11-01",15 +"Administrative_department_of_security","2016-05-01",1 +"Archdeaconry_of_Dudley","2017-07-01",19 +"Ammayenna_Sthree","2015-12-01",38 +"Aaron_Spelling","2016-05-01",25128 +"Anatolian_hieroglyph","2016-07-01",308 +"Central_University_of_Rajasthan","2016-11-01",323 +"Annamanum_touzalini","2017-08-01",7 +"Acleris_hispidana","2016-11-01",2 +"Frisco_kid","2016-04-01",15 +"Allerheiligenberg_monastery","2017-12-01",2 +"Arctic_comb_jelly","2017-03-01",3 +"279377_Lechmankiewicz","2016-06-01",1 +"AEGON_Pro-Series_Loughborough","2018-02-01",7 +"Firefly_Space_Systems","2017-01-01",235 +"2000-01_Hong_Kong_League_Cup","2017-12-01",6 +"British_supermarkets","2017-01-01",2 +"A_description_of_New_England","2016-10-01",13 +"Artificial_Flavoring","2016-06-01",2 +"Anglican_bishop_of_the_Torres_people","2018-02-01",1 +"Antonio_Diaz_Cardoso","2018-02-01",1 +"Johan_Patriksson","2017-01-01",3 +"Ashutosh_Morya","2017-07-01",1 +"Iron_ore","2017-01-01",3682 +"AT-16_Scallion","2015-08-01",594 +"Data_analyst","2015-07-01",134 +"Cabbageball","2016-04-01",3 +"Acanthonyx_seriopuncta","2017-04-01",2 +"Aegeria_ruficauda","2017-10-01",1 +"Archibald_Douglas,_1st_Earl_of_Ormond","2016-06-01",100 +"2014_European_Championships_in_Athletics","2017-01-01",3 +"1Co-Co1","2017-08-01",77 +"Arthur_Abba_Goldberg","2015-10-01",2 +"Ameri-Cana_Ultralights","2015-05-01",33 +"1979_British_Formula_One_season","2015-12-01",218 +"American_colonial_history","2016-06-01",6 +"Arcadia_Martin_Wesay_Toe","2015-06-01",73 +"Adam_Ornstein","2017-08-01",2 +"Archive_of_Modern_Conflict","2016-12-01",307 +"Ciro_Urriola","2015-07-01",12 +"Acanthosyris","2015-12-01",53 +"Eriopyga_jamaicensis","2015-07-01",1 +"10th_parallel_north","2016-06-01",1412 +"Derek_Almond","2017-01-01",2 +"Jaimanglapur","2017-01-01",4 +"Aphroditeola_olida","2018-02-01",6 +"18th_dynasty_of_egypt","2017-06-01",2 +"Ali_ben_Ahmed","2016-08-01",62 +"Ashkur_Mahalleh","2018-02-01",8 +"Adolf_Mosengel","2017-02-01",54 +"1838_Safed_pogrom","2016-02-01",1 +"1829_in_architecture","2017-05-01",24 +"Arcones,_Segovia","2016-05-01",3 +"Albert_Smith_Medal","2018-02-01",30 +"Arqanqergen_mass_murder","2015-10-01",60 +"Jaan_Usin","2017-01-01",4 +"2009_Bangladesh_Rifles_revolt","2016-03-01",269 +"-coltore","2015-11-01",9 +"Ernest_Makins","2017-01-01",10 +"Amsterdam_Bijlmer_Arena","2016-07-01",87 +"Apostolic_assemblies_of_christ","2018-01-01",1 +"Abirabad,_Razavi_Khorasan","2015-08-01",26 +"2016_All-Ireland_Senior_Football_Championship","2015-10-01",883 +"Asylum_seeking","2016-06-01",36 +"56th_parallel","2015-07-01",12 +"Junior_roller_derby","2017-01-01",19 +"Ana_Goncalves","2016-03-01",2 +"Alekseevskiy_Raion","2017-11-01",1 +"2009_Vietnam_national_football_team_results","2017-07-01",15 +"Chicago,_Burlington_and_Quincy_Railroad_Depot","2017-01-01",2 +"Fox_Valley_Conference","2016-04-01",84 +"Brachioplasty","2017-06-01",304 +"Arnold_Doren","2017-06-01",11 +"All_Ireland_mandolin_Champion","2015-07-01",2 +"Deborah_Rennard","2016-04-01",814 +"Anthony_Macdonnell","2016-02-01",2 +"Azerbaijan_Pakistan_relations","2017-01-01",1 +"A_Girl_Named_Zippy","2018-03-01",346 +"Academic_OneFile","2018-02-01",109 +"East_Point_Academy","2017-01-01",48 +"2011_Italian_Figure_Skating_Championships","2017-03-01",47 +"Chen_Qiao_En","2016-04-01",52 +"Canobie_lake","2016-04-01",1 +"Andrei_Arlashin","2017-11-01",13 +"Again_Into_Eyes","2017-12-01",54 +"Andropogon_curtipendulus","2018-02-01",1 +"Abbath","2016-05-01",927 +"Alien_Opponent","2016-05-01",160 +"Art_of_Love","2016-02-01",3 +"Ariana_Huffington","2017-05-01",84 +"Amy_Poehler","2016-04-01",62732 +"Cherven,_Rousse_Province","2015-07-01",2 +"1_Month_2_Live","2018-03-01",306 +"Country_Day_School_of_the_Sacred_Heart","2017-06-01",132 +"Cooperative_institute_for_arctic_research","2015-07-01",2 +"Depression_symptoms","2017-01-01",7 +"Brent_Skoda","2016-04-01",31 +"American_Christians","2016-12-01",10 +"Counterbleed","2017-01-01",1 +"Abarka","2016-05-01",325 +"Aleksander_Povetkin","2017-02-01",89 +"Austin_TX","2016-03-01",119 +"Aleksandr_Tretyakov","2017-01-01",40 +"Connecticut_congressional_districts","2016-11-01",3 +"Alessio_de_Marchis","2015-10-01",66 +"Capel_Salem,_Pwllheli","2016-04-01",6 +"5-alpha_reductase_deficiency","2016-10-01",30 +"Annabelle_Croft","2016-01-01",32 +"Aeronca_Aircraft_Corporation","2017-05-01",9 +"1597_in_Scotland","2016-07-01",18 +"Alf_Somerfield","2017-11-01",10 +"Agapanthia_villosoviridescens","2018-02-01",53 +"Adam_Goldberg","2015-12-01",42338 +"1961_Paris_massacre","2017-01-01",52 +"2007_in_radio","2017-04-01",131 +"Arthur_French,_5th_Baron_de_Freyne","2015-12-01",44 +"AMD_Socket_G3","2017-04-01",121 +"Albert_geouffre_de_lapradelle","2016-02-01",1 +"Collaborations_between_ex-Beatles","2015-07-01",1279 +"Betty_Ireland","2016-04-01",40 +"Domingo_Tirado_Benedi","2015-07-01",1 +"Bac_Ly","2016-04-01",1 +"All_gas-phase_iodine_laser","2015-07-01",136 +"Andre_Salifou","2017-01-01",1 +"1,3-b-D-glucan","2017-05-01",2 +"Joseph_Johnston_Muir","2017-01-01",3 +"17th_of_Shahrivar_league","2016-05-01",63 +"2001_in_art","2018-03-01",131 +"Abiji_language","2017-10-01",6 +"Ahliah_school","2018-03-01",133 +"1605_in_India","2017-12-01",83 +"Dr_Jeom_Kee_Paik","2015-07-01",1 +"1954_Texas_Longhorns_football_team","2018-01-01",69 +"1985_Little_League_World_Series","2016-07-01",226 +"Eleanor_de_bohun","2015-07-01",1 +"Adrenaline_strength","2016-03-01",8 +"434_BC","2018-02-01",97 +"8x60mm_S","2015-06-01",61 +"2016-17_South_Pacific_cyclone_season","2017-09-01",101 +"Beth_Aala","2017-06-01",15 +"Al_Shaver","2017-07-01",138 +"Adelphoi_Zangaki","2018-01-01",89 +"Cyclopropyl_group","2016-11-01",167 +"216_Sqn","2017-08-01",11 +"20469_Dudleymoore","2017-05-01",5 +"Attila_Hildmann","2017-06-01",103 +"1970_Arkansas_Razorbacks_football_team","2016-11-01",66 +"Anthony_Fairfax","2017-08-01",24 +"Fort_Point,_Boston","2016-04-01",384 +"Epsilon_numbers","2016-04-01",3 +"2013_Recopa_Sudamericana","2016-05-01",202 +"Italo_Disco","2017-01-01",27 +"Andersen_Press","2015-09-01",228 +"Amasa_Walker","2017-09-01",146 +"2010_in_Israeli_film","2015-09-01",234 +"A-25_Shrike","2017-12-01",90 +"2009_Winnipeg_Blue_Bombers_season","2017-06-01",66 +"Ashland_County,_Ohio","2016-10-01",1298 +"Dusky_Turtle_Dove","2017-01-01",3 +"Antonov_148","2017-02-01",129 +"Abdul_Hamid_Lahori","2017-08-01",458 +"Amadeo_of_Spain","2015-11-01",1701 +"2015_Novak_Djokovic_tennis_season","2017-07-01",2484 +"Dhabawallah","2016-04-01",4 +"Afshar_Beylik","2017-06-01",4 +"1998_ATP_Tour_World_Championships_-_Singles","2017-03-01",20 +"Beach_Haven_Terrace,_New_Jersey","2016-11-01",4 +"Aix-la_Chapelle","2018-03-01",66 +"Ackerman,_Val","2017-05-01",2 +"47th_Ohio_Infantry","2016-12-01",59 +"100_People,_100_Songs","2017-11-01",517 +"2007_Masters_of_Formula_3","2016-01-01",63 +"1832_US_presidential_election","2016-05-01",6 +"Aaron_Baker","2016-05-01",113 +"2015-16_FIBA_Europe_Club_Competition","2017-11-01",2 +"Alebra","2018-02-01",27 +"Asilus_crabroniformis","2016-11-01",4 +"Earth_and_Air_and_Rain","2016-11-01",31 +"2014_Stade_Tata_Raphael_disaster","2018-02-01",1 +"Alexander_Izvolski","2017-01-01",7 +"Fabric_17","2017-01-01",13 +"1925_Campeonato_de_Portugal_Final","2018-01-01",37 +"1948_Ashes_series","2017-01-01",121 +"Abraham_ben_david","2016-09-01",4 +"2006_Acropolis_Rally","2017-01-01",12 +"Alottment","2017-03-01",6 +"Angolanness","2015-07-01",11 +"2002_in_NASCAR_Craftsman_Truck_Series","2016-01-01",12 +"Aces_of_ANSI_Art","2015-08-01",77 +"Alan_Tskhovrebov","2015-08-01",13 +"Aegis_Security","2015-10-01",1 +"Alec_the_Great","2015-05-01",69 +"Corel_SnapFire","2016-11-01",9 +"AbdulMagid_Breish","2016-03-01",276 +"A_Night_in_NYC","2015-10-01",232 +"79th_parallel_south","2016-11-01",17 +"Alphonse_Crespo","2016-06-01",50 +"Acacia_petite_feuille","2016-05-01",1 +"Amstrad_464","2017-12-01",18 +"Charles_County,_Maryland","2017-06-01",2079 +"1972_outbreak_of_smallpox_in_Yugoslavia","2018-03-01",375 +"Alungili","2017-09-01",37 +"Brontispalaelaps_froggatti","2016-04-01",1 +"Alison_Lacey","2016-12-01",94 +"Alessandro_Capra","2017-07-01",21 +"2012_UCF_Knights_baseball_team","2016-08-01",46 +"16_Candles_Down_the_Drain","2017-05-01",2 +"Anandra_strandi","2015-08-01",11 +"Brigitte_Rohde","2017-01-01",9 +"Agenda_VR3","2015-09-01",93 +"1641_in_architecture","2015-11-01",32 +"ALF_Tales","2016-04-01",280 +"A_Woman_Scorned","2015-07-01",164 +"Air-free_techniques","2016-04-01",5 +"1973_in_British_television","2016-04-01",96 +"All_Saints_Cemetery","2017-04-01",345 +"1981_in_Swedish_football","2016-06-01",21 +"Apple_Dictionary","2016-10-01",19 +"2015_PBZ_Zagreb_Indoors","2016-08-01",121 +"16th_IIFA_Awards","2017-02-01",1194 +"Duki,_Pakistan","2016-04-01",14 +"Administration_of_Borderchek_points,_Population_and_Immigration","2015-09-01",2 +"Alonia,_Zante","2017-10-01",1 +"African_United_Club","2017-10-01",50 +"Burjanadze-Democrats","2016-04-01",19 +"Application_software_development","2015-06-01",27 +"Almonacid_de_la_Sierra,_Zaragoza","2015-06-01",1 +"Baissour","2016-12-01",100 +"Coti_Sorokin","2016-04-01",46 +"Alberta_and_Great_Waterways_Railway_scandal","2017-05-01",70 +"1942_Alabama_Crimson_Tide_football_team","2015-09-01",144 +"Adam_Art_Gallery","2016-08-01",80 +"Akshinski_Raion","2016-09-01",1 +"Edwin_of_Deira","2015-07-01",34 +"Altaf_Mahmud","2015-10-01",245 +"Astana_cycling_team","2017-12-01",7 +"1982_CART_World_Series_season","2015-12-01",3 +"3_Rotaxane","2017-03-01",1 +"1924_Eastern_Suburbs_season","2015-08-01",32 +"Downtown_Science","2016-11-01",6 +"1993-94_Slovak_Cup","2017-04-01",1 +"Brandon_Wayne_Hedrick","2016-04-01",32 +"2015_Brasil_Open","2016-01-01",403 +"Aung_Pinle_Hsinbyushin","2016-02-01",69 +"An_Numaniyah","2016-06-01",185 +"24th_Arkansas_Infantry_Regiment","2016-03-01",64 +"Adimchinobe_Echemandu","2017-05-01",90 +"August_Belmont,_Jr","2017-06-01",8 +"Empacher","2016-11-01",102 +"Abdulkadir_Sheikh_Dini","2017-01-01",70 +"Alvaro_Quiros","2017-08-01",12 +"Algernon_May","2017-11-01",35 +"Athol_Shmith","2016-02-01",188 +"2004_Indesit_ATP_Milan_Indoor_-_Doubles","2015-09-01",1 +"Alfred_Dennis","2016-11-01",9 +"2nd_Medical_Battalion","2017-05-01",380 +"Atom_clocks","2016-03-01",12 +"368th_Expeditionary_Air_Support_Operations_Group","2015-06-01",48 +"1911_Washington_Senators_season","2017-06-01",46 +"1963_Night_Series_Cup","2015-07-01",26 +"Aromobates_capurinensis","2017-12-01",21 +"2013-14_Super_Lig","2017-05-01",14 +"Al_taglio","2016-09-01",2 +"2015_RBC_Tennis_Championships_of_Dallas","2016-04-01",18 +"2011_Mirabella_Cup","2017-11-01",15 +"1996_NHL_Western_Conference_Final","2015-06-01",1 +"2009_Formula_Nippon_Championship","2016-11-01",44 +"Information_security_awareness","2017-01-01",56 +"A_Noiseless_Patient_Spider","2018-03-01",757 +"Aggregate_field_theory","2017-06-01",3 +"Armenians_in_Central_Asia","2015-10-01",351 +"Acona,_Mississippi","2017-10-01",33 +"Apozomus","2017-12-01",19 +"Antwun_Echols","2016-11-01",87 +"1949_Albanian_Cup","2016-11-01",11 +"Aesychlus","2016-10-01",4 +"1961_Pulitzer_Prize","2015-09-01",879 +"East_Midlands_Conference_Centre","2016-04-01",13 +"Blumen","2016-11-01",11 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/dump.sql b/docs/ja/integrations/data-ingestion/data-formats/assets/dump.sql new file mode 100644 index 00000000000..fcbf558352a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/dump.sql @@ -0,0 +1 @@ +INSERT INTO some_table (`path`, `month`, `hits`) VALUES ('Bangor_City_Forest', '2015-07-01', 34), ('Alireza_Afzal', '2017-02-01', 24), ('Akhaura-Laksam-Chittagong_Line', '2015-09-01', 30), ('1973_National_500', '2017-10-01', 80), ('Attachment', '2017-09-01', 1356), ('Kellett_Strait', '2017-01-01', 5), ('Ajarani_River', '2018-01-01', 30), ('Akbarabad,_Khomeyn', '2017-03-01', 8), ('Adriaan_Theodoor_Peperzak', '2018-02-01', 88), ('Alucita_dryogramma', '2015-09-01', 1), ('Brit_Med_J', '2015-07-01', 1), ('4th_Metro_Manila_Film_Festival', '2015-09-01', 80), ('Alialujah_Choir', '2018-03-01', 221), ('1953-54_SM-sarja_season', '2016-09-01', 1), ('Air_Force_Song', '2018-02-01', 19), ('4-6_duoprism', '2016-03-01', 30), ('Ashley_Spurlin', '2017-06-01', 94), ('Asfaq_Kayani', '2017-10-01', 1), ('1607_in_architecture', '2016-06-01', 7), ('4-way_speakers', '2015-10-01', 2), ('Blue_Heeler', '2015-07-01', 149), ('5_Euro', '2017-04-01', 16), ('2009_Spa-Francorchamps_GP2_Series_round', '2016-04-01', 12), ('2015_Guru_Granth_Sahib_desecration', '2015-11-01', 6821), ('Agriculture_Marketing_Service', '2016-07-01', 2), ('2006_Football_League_Cup_Final', '2015-11-01', 1711), ('2008_Uber_Cup_group_stage', '2016-02-01', 40), ('1923_PGA_Championship', '2016-08-01', 97), ('Fannie_Bay', '2016-04-01', 6), ('AlchemyAPI', '2016-04-01', 344), ('Cinema_of_Italy', '2017-01-01', 1217), ('Arodes', '2016-11-01', 36), ('Damien_Marley', '2015-07-01', 168), ('Al_Jumayl_Baladiyat', '2015-08-01', 5), ('2015_Alabama_State_Hornets_football_team', '2017-06-01', 32), ('Aglossa_tanya', '2016-03-01', 1), ('73rd_Pennsylvania_Infantry', '2017-01-01', 12), ('2015_European_Junior_and_U23_Canoe_Slalom_Championships', '2018-02-01', 31), ('African_Leopard', '2016-08-01', 64), ('Faverolles,_Orne', '2017-01-01', 5), ('Aaron_Fukuhara', '2015-11-01', 17), ('Annular_ligaments_of_trachea', '2017-01-01', 31), ('2014_US_Open_Series', '2016-11-01', 35), ('A_Better_Mousetrap', '2018-02-01', 4), ('Dibaklu', '2016-11-01', 1), ('At_Samat_District', '2015-06-01', 35), ('Aaron_Peasley', '2017-05-01', 32), ('Apistomology', '2015-12-01', 2), ('Buyat_Bay', '2015-07-01', 54), ('1942_Estonian_Football_Championship', '2017-05-01', 22), ('Action_for_Autism', '2016-06-01', 346), ('100_Hz', '2015-06-01', 72), ('2003_Arizona_State_Sun_Devils_football_team', '2017-05-01', 82), ('Antona_obscura', '2016-09-01', 1), ('Akiko_Sugiyama', '2015-12-01', 32), ('Elysburg', '2016-11-01', 8), ('2017_New_South_Wales_Cup', '2017-09-01', 38), ('2011-12_Gold_Coast_United_FC_season', '2017-06-01', 1), ('Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean', '2016-04-01', 15), ('Albert_Dunn', '2017-08-01', 87), ('Hahamakin_ang_Lahat', '2017-01-01', 984), ('2013_Spuyten_Duyvil_derailment', '2017-11-01', 5), ('Ayling', '2017-01-01', 5), ('Anti-Establishment', '2016-10-01', 1), ('1951_Spanish_motorcycle_Grand_Prix', '2018-01-01', 48), ('2009-10_Brunei_Premier_League', '2017-08-01', 4), ('23_Ursae_Majoris', '2016-08-01', 90), ('1927-28_Austrian_football_championship', '2017-08-01', 4), ('Andrew_McKeever', '2017-10-01', 3), ('Clinocottus', '2017-06-01', 23), ('2006_State_of_Origin', '2015-11-01', 7), ('2013-14_Los_Angeles_Clippers_season', '2015-07-01', 8), ('Cor_Jesu', '2017-01-01', 1), ('Besseringen_B-Werk', '2017-06-01', 158), ('Amy_Hempel', '2017-07-01', 1091), ('Franc-Comtois', '2016-04-01', 2), ('Allium_giganteum', '2017-07-01', 1103), ('Abishai', '2016-08-01', 56), ('Abraham_Clark_High_School', '2016-04-01', 88), ('Baku_chronology', '2015-06-01', 1), ('22nd_MEU', '2015-10-01', 39), ('2015_Open_Engie_de_Touraine', '2015-10-01', 195), ('Churchill_Bowl', '2017-06-01', 30), ('AGMARK', '2017-08-01', 117), ('American_standard_wire_gauge', '2017-12-01', 3), ('Araby,_LA', '2015-05-01', 2), ('217_BC', '2016-12-01', 202), ('2008_Trinidad_and_Tobago_League_Cup', '2016-02-01', 6), ('Alazan_Bay', '2015-12-01', 22), ('Aluminum_fencing', '2015-11-01', 48), ('Achilles_tendinitis', '2016-10-01', 5884), ('AFP_Peacekeeping_Operations_Center', '2017-01-01', 64), ('2013_Xinjiang_clashes', '2016-01-01', 1), ('Arborea_Giudicato_of_Arborea', '2015-09-01', 3), ('1941_Cleveland_Rams_season', '2017-06-01', 40), ('Ju_Posht,_Rasht', '2017-01-01', 3), ('Ascalenia', '2016-07-01', 10), ('Aplectoides', '2018-02-01', 4), ('European_Cup_1969-70', '2016-11-01', 14), ('Armen_Mkertchian', '2016-05-01', 9), ('2015_Aspria_Tennis_Cup_-_Singles', '2018-02-01', 1), ('14_August_1947', '2017-11-01', 6), ('Adobe_Creative_Suite_1', '2015-05-01', 1), ('IC_chips', '2017-01-01', 2), ('Austo_AE300', '2016-07-01', 4), ('Date_palms', '2015-07-01', 79), ('BCS_bowl_game', '2017-06-01', 13), ('AR_Border', '2017-06-01', 1), ('Aranda_de_Duero', '2016-04-01', 256), ('1919_Wake_Forest_Demon_Deacons_football_team', '2016-01-01', 16), ('All_The_Wrong_Clues_For_The_Right_Solution', '2017-10-01', 9), ('Allan_Campbell_McLean', '2015-06-01', 131), ('Bradford_Council_election,_2011', '2017-06-01', 5), ('Astronomy_and_astrophysics', '2015-09-01', 62), ('Dutch_Antillean_people', '2015-07-01', 57), ('Army_Radio', '2018-03-01', 711), ('BBVA_Bancomer', '2016-11-01', 709), ('Lake_Aloha', '2017-01-01', 30), ('Andy_Bean', '2018-02-01', 3092), ('1941_Pittsburgh_Steelers_season', '2016-05-01', 147), ('Aniopi_Melidoni', '2016-06-01', 4), ('Aglossosia_fusca', '2017-09-01', 3), ('Art_books', '2017-04-01', 36), ('1929_Washington_Senators_season', '2017-04-01', 47), ('Antaeotricha_congelata', '2016-12-01', 10), ('Douglas_C-54G-5-DO_Skymaster', '2017-01-01', 1), ('Chris_Jamison', '2016-11-01', 827), ('Ace_Blackwell', '2015-11-01', 9), ('Abdul_Qadir_Fitrat', '2018-02-01', 32), ('Arnoldo_Vizcaino', '2017-10-01', 1), ('2012_Open_EuroEnergie_de_Quimper_-_Doubles', '2017-12-01', 3), ('Dale_Rominski', '2017-01-01', 7), ('ADHD_coaching', '2015-06-01', 50), ('Claire_Yiu', '2016-11-01', 209), ('Applicant', '2015-10-01', 253), ('Apache_OpenOffice', '2017-06-01', 6031), ('Abel_Kiprop_Mutai', '2015-09-01', 22), ('Airdrome_Taube', '2017-04-01', 46), ('Andrey_Viktorovich', '2016-06-01', 1), ('American_Idol_controversy', '2016-03-01', 36), ('Anthrenocerus_confertus', '2018-01-01', 17), ('Appraisal_Subcommittee', '2018-03-01', 17), ('Babusa', '2015-07-01', 3), ('500_homeruns', '2016-06-01', 1), ('Argentina_national_volleyball_team', '2016-08-01', 64), ('Chief_prosecutor_of_Russia', '2015-07-01', 1), ('Absolution_DVD', '2015-06-01', 1), ('1,3-Beta-glucan_synthase', '2017-05-01', 440), ('Dave_Sinardet', '2016-04-01', 26), ('Adeline_Whitney', '2018-03-01', 10), ('Allon_shvut', '2016-07-01', 3), ('2012_Penn_State_Nittany_Lions_football_season', '2017-12-01', 3), ('Coleman-Franklin-Cannon_Mill', '2017-01-01', 4), ('Action_director', '2015-05-01', 93), ('AD_547', '2016-01-01', 1), ('Acta_germanica', '2017-09-01', 1), ('Abu_Dhabi_Global_Market_Square', '2017-01-01', 35), ('Kozo_Shioya', '2017-01-01', 7), ('China_Investment_Corp', '2017-01-01', 2), ('Dmitri_Zakharovich_Protopopov', '2016-04-01', 129), ('Anatra_Anadis', '2017-10-01', 208), ('Archaikum', '2017-11-01', 5), ('2000_Webby_Awards', '2017-04-01', 360), ('2003_BCR_Open_Romania_-_Singles', '2016-08-01', 2), ('Abacetus_bisignatus', '2016-09-01', 79), ('American_school_of_kinshasa', '2016-01-01', 1), ('Anna,_7th_Duchess_of_Bedford', '2016-08-01', 8), ('Black_majority_district', '2016-11-01', 3), ('Dagma_Lahlum', '2015-07-01', 1), ('Credit_Saison', '2015-07-01', 517), ('Ariyankuppam_firka', '2016-02-01', 19), ('Annette_Fuentes', '2016-06-01', 17), ('Angerstein,_John', '2015-12-01', 2), ('Annenkov_Island', '2016-03-01', 280), ('Anne_Frank_museum', '2016-06-01', 67), ('Annales_sancti_Amandi', '2017-06-01', 22), ('L-FABP', '2017-01-01', 1), ('Alvord,_TX', '2017-06-01', 12), ('2006_World_Team_Table_Tennis_Championships', '2016-05-01', 119), ('Angriffen', '2015-12-01', 9), ('Anthony_Oppenheimer', '2017-03-01', 452), ('Absamat_Masaliyevich_Masaliyev', '2016-09-01', 1), ('Airborne_Museum_at_Aldershot', '2016-03-01', 41), ('Aktiubinsk_Oblast', '2015-08-01', 7), ('100_East_Wisconsin', '2015-05-01', 782), ('7th_Bangladesh_National_Film_Awards', '2017-08-01', 91), ('Alejandro_Reyes', '2017-12-01', 35), ('Applied_philosophy', '2018-03-01', 539), ('Adhemar_Pimenta', '2016-06-01', 146), ('Break_the_fourth_wall', '2016-04-01', 66), ('Annoushka_Ducas', '2017-10-01', 411), ('ATC_code_J01CA01', '2015-06-01', 1), ('Evelyn_County,_New_South_Wales', '2016-11-01', 7), ('Elastic_scattering', '2016-11-01', 1374), ('1032_Pafuri', '2015-07-01', 35), ('Andrew_Bromwich', '2015-08-01', 26), ('Ishita_Arun', '2017-01-01', 249), ('Aspergics', '2016-07-01', 1), ('1857_in_Chile', '2018-03-01', 22), ('Breffni', '2015-07-01', 38), ('845_in_poetry', '2017-08-01', 2), ('20321_Lightdonovan', '2015-10-01', 12), ('Arthur_Chandler', '2017-12-01', 27), ('CsISOLatin2', '2017-06-01', 1), ('1900_Grand_National', '2016-06-01', 69), ('Aeritalia_AMX', '2017-03-01', 3), ('B_Sharps', '2015-06-01', 11), ('544_area_code', '2015-09-01', 2), ('30th_Guldbagge_Awards', '2015-06-01', 37), ('Agrippina', '2017-08-01', 315), ('Ardmore', '2016-02-01', 433), ('Amplypterus_panopus', '2016-03-01', 23), ('Alexander_Bukharov', '2017-09-01', 5), ('Alaska_Raceway_Park', '2017-01-01', 46), ('Albanian_National_Road_Race_Championships', '2017-03-01', 31), ('1968_Democratic_National_Convention_protest_activity', '2017-10-01', 2802), ('2012_Birthday_Honours', '2017-10-01', 427), ('2000_NHL_expansion_draft', '2017-06-01', 1), ('A_Town_Where_You_Live', '2016-11-01', 2920), ('Ahmed_Shahzad', '2018-03-01', 25), ('Elisabeth_Svendsen', '2016-11-01', 39), ('2002_FINA_Synchronised_Swimming_World_Cup', '2016-08-01', 30), ('Akatek', '2017-04-01', 10), ('Animation_with_DAZ_Studio', '2018-02-01', 78), ('Fergus_Craig', '2016-11-01', 119), ('Ancel_Nalau', '2015-11-01', 5), ('5171_Augustesen', '2017-04-01', 20), ('Anne_McGuire', '2017-11-01', 329), ('Australian_Photoplay_Company', '2015-12-01', 6), ('1913_in_Canada', '2017-04-01', 137), ('Arhopala_allata', '2015-05-01', 26), ('Il_Paradiso_delle_Signore', '2017-01-01', 31), ('Geri_Palast', '2017-01-01', 38), ('Alan_Abela_Wadge', '2017-03-01', 77), ('22nd_Tactical_Air_Support_Squadron', '2017-10-01', 7), ('Avant_Stellar', '2017-06-01', 22), ('Black_phantom_tetra', '2016-11-01', 205), ('Billy_McCaffrey', '2017-01-01', 314), ('Annie_Furuhjelm', '2017-11-01', 97), ('1992_PGA_Tour', '2017-12-01', 307), ('2008_Chilean_pork_crisis', '2016-01-01', 55), ('2012_Currie_Cup_First_Division', '2018-02-01', 32), ('Aleksei_Fomkin', '2015-05-01', 144), ('Alexander_Krausnick-Groh', '2016-05-01', 101), ('Adam_Richard_Wiles', '2017-08-01', 5), ('ATCvet_code_QA01AD01', '2015-09-01', 2), ('Abu_Bakr_Ibn_Bajja', '2017-03-01', 5), ('Architecture-Studio', '2016-04-01', 94), ('950s_BC', '2016-02-01', 257), ('Abschwunges', '2017-07-01', 1), ('Adonis_Geroskipou', '2017-06-01', 15), ('2008-09_SV_Werder_Bremen_season', '2016-03-01', 3), ('Closed_loops', '2016-04-01', 1), ('AFC_Youth_Championship_1982', '2015-12-01', 10), ('Aquila_Shoes', '2015-08-01', 209), ('9842_Funakoshi', '2017-12-01', 11), ('Educational_quotient', '2016-04-01', 21), ('Antoni_Julian_Nowowiejski', '2018-01-01', 211), ('Adi_Oka_Idhile', '2017-11-01', 16), ('DEXIA-BIL_Luxembourg_Open', '2016-11-01', 3), ('Andrew_James_Simpson', '2016-03-01', 43), ('Alexander_Boksenberg', '2017-12-01', 61), ('1827_in_Denmark', '2017-03-01', 39), ('Afternoon_tea_with_suggs', '2017-11-01', 3), ('Alpha,_MN', '2017-06-01', 6), ('Ari_Onasis', '2015-06-01', 4), ('1961-62_Football_League_First_Division', '2015-11-01', 1), ('Andi_Lila', '2015-06-01', 2847), ('A_Gathering_Of_Old_Men', '2018-02-01', 1), ('Abul_Fazl_al-Abbas', '2017-01-01', 1), ('Asgill,_Charles', '2017-08-01', 1), ('Alexander_Arkhangelsky', '2015-07-01', 12), ('1947-48_Portuguese_Liga', '2015-06-01', 1), ('3rd_MMC_-_Varna', '2016-07-01', 3), ('Alberts,_Wayne', '2017-05-01', 3), ('Alois_Schickelgruber', '2018-02-01', 9), ('Hefner_Stadium', '2017-01-01', 2), ('410912_Lisakaroline', '2018-02-01', 26), ('Academy_at_Mountain_State', '2018-03-01', 1), ('617_Squadron', '2016-05-01', 489), ('Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji', '2015-07-01', 5), ('Arturo_Merino_Benitez_Airport', '2017-10-01', 13), ('AEK_Athens_Futsal', '2015-06-01', 10), ('Aggaeus', '2018-02-01', 2), ('Association_for_Retarded_Citizens_of_the_United_States', '2017-08-01', 3), ('Kielce_pogrom', '2017-01-01', 335), ('1351_in_poetry', '2016-01-01', 17), ('1923_Princeton_Tigers_football_team', '2017-11-01', 41), ('Auzata_semipavonaria', '2017-01-01', 2), ('892_in_poetry', '2016-01-01', 6), ('Anton_Krotiak', '2017-12-01', 2), ('Arthur_Shelley', '2017-12-01', 23), ('2003_Kyoto_Purple_Sanga_season', '2018-02-01', 9), ('Frederic_Bowker_Terrington_Carter', '2016-04-01', 6), ('2-orthoplex', '2016-03-01', 1), ('Acacia_australiana', '2015-09-01', 4), ('2012_Newcastle_Knights_season', '2016-06-01', 103), ('Ann_Wrights_Corner,_Virginia', '2017-07-01', 19), ('12557_Caracol', '2017-03-01', 5), ('2001_African_Footballer_of_the_Year', '2017-05-01', 1), ('Bass_Pyramid', '2017-01-01', 22), ('A_noodle', '2015-05-01', 5), ('Aed_Bennan', '2018-02-01', 2), ('1886_Yale_Bulldogs_football_team', '2017-10-01', 58), ('2002_Players_Championship', '2016-06-01', 54), ('African_Skimmer', '2017-07-01', 2), ('3rd_Guldbagge_Awards', '2016-12-01', 39), ('Arrows_A19B', '2015-10-01', 1), ('Archduchess_Elisabetta_of_Austria-Este', '2017-08-01', 1526), ('America_Islands', '2015-11-01', 1), ('1932_Olympic_Games', '2016-01-01', 9), ('2011_Chinese_pro-democracy_protests', '2015-11-01', 2044), ('Bank_walkaway', '2016-04-01', 113), ('594_in_Ireland', '2017-04-01', 1), ('Association_of_Municipal_Corporations', '2016-12-01', 5), ('Andreas_Brantelid', '2015-09-01', 167), ('Amarthal_urf_Unchagaon', '2017-05-01', 82), ('3-methoxymorphinan', '2017-04-01', 146), ('2382_BC', '2016-07-01', 10), ('1763_in_science', '2016-07-01', 28), ('Arvert', '2017-04-01', 77), ('Ale_yeast', '2017-12-01', 19), ('A_Man_Without_a_Soul', '2018-03-01', 17), ('Air_Force_Base_Louis_Trichardt', '2017-09-01', 1), ('Athirson_Mazzoli_de_Oliveira', '2017-06-01', 3), ('Anthony_Chan_Yau', '2017-07-01', 181), ('Basic_Enlisted_Submarine_School', '2017-06-01', 392), ('Aboriginal_Lands_of_Hawaiian_Ancestry', '2015-09-01', 11), ('Fondren_Southwest,_Houston', '2017-01-01', 4), ('3_World_Financial_Center', '2017-07-01', 64), ('1971_IIHF_European_U19_Championship', '2017-09-01', 9), ('1937-38_Allsvenskan', '2015-12-01', 6), ('Christopher_Ashton_Kutcher', '2017-06-01', 2), ('Australian_rules_football_in_south_australia', '2016-12-01', 1), ('Amicable_pair', '2018-01-01', 7), ('Alan_Tomes', '2015-11-01', 82), ('Alexei_Petrovich,_Tsarevich_of_Russia', '2015-12-01', 3887), ('Alexis_Damour', '2015-10-01', 66), ('Bankruptcy_Act_of_1938', '2017-06-01', 76), ('Amphiphyllum', '2016-06-01', 14), ('Conway_High_School_West', '2016-04-01', 1), ('5447_Lallement', '2015-11-01', 10), ('Gabriel_Iddan', '2017-01-01', 1), ('1879-80_Scottish_Cup', '2017-04-01', 3), ('2011_Eneco_Tour', '2016-10-01', 31), ('1471_in_England', '2015-11-01', 94), ('Ashland_Town_Hall', '2017-01-01', 5), ('Archduke_John', '2015-05-01', 20), ('2000_Cameroonian_Premier_League', '2017-09-01', 18), ('1997_flood', '2017-11-01', 5), ('Agile_management', '2015-09-01', 26677), ('Am_841', '2017-12-01', 3), ('Apprentice_Mason', '2018-01-01', 4), ('Hales-Jewett_theorem', '2017-01-01', 2), ('Alien_Abductions', '2017-10-01', 14), ('Arjun_Menon', '2016-02-01', 370), ('Anthokyan', '2016-01-01', 4), ('Automobili_Lamborghini', '2016-02-01', 1110), ('Alain_Prost', '2017-04-01', 25196), ('Fartein_Valen', '2016-04-01', 90), ('Antonio_Galli_da_Bibiena', '2016-05-01', 5), ('Al_Jawf,_Libya', '2017-03-01', 600), ('AD_695', '2018-02-01', 1), ('Amir_chand', '2015-11-01', 1), ('Alcis_obliquisigna', '2017-08-01', 1), ('Chandra_Talpade_Mohanty', '2017-01-01', 306), ('Algerian_safe_house,_Jalalabad', '2015-06-01', 3), ('Jake_Milner', '2017-01-01', 1), ('Alternate_Communications_Center', '2017-10-01', 1), ('In_the_Bleachers', '2017-01-01', 42), ('Alex_Puodziukas', '2016-04-01', 7), ('Altarpiece_of_Pilgrim_II', '2018-02-01', 2), ('Cybernetical_Physics', '2017-01-01', 3), ('Christopher_Unthank', '2017-06-01', 2), ('1982_Independence_Bowl', '2015-06-01', 102), ('Ascoli_Calcio_1898', '2018-03-01', 1115), ('Briggs-Rauscher_reactions', '2017-06-01', 1), ('Adjadja', '2018-02-01', 45), ('Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed', '2016-06-01', 3), ('Catholic_social_doctrine', '2017-01-01', 6), ('2833_BC', '2016-11-01', 1), ('Bethy_Woodward', '2016-04-01', 38), ('Bateman_polynomials', '2017-06-01', 22), ('1966_Buenos_Aires_Grand_Prix', '2015-10-01', 19), ('A_River_Somewhere', '2015-10-01', 353), ('2016-17_BVIFA_National_Football_League', '2017-04-01', 2), ('1909_Major_League_Baseball_season', '2015-10-01', 362), ('1988_Oklahoma_Sooners_football', '2017-11-01', 2), ('2010s_in_Chechen_fashion', '2016-10-01', 1), ('Accademia_Olimpica', '2017-08-01', 17), ('Air_cooling', '2015-07-01', 2010), ('Amir_Saoud', '2016-11-01', 22), ('Alex_Auburn', '2015-05-01', 52), ('Apamea_impulsa', '2016-11-01', 6), ('Australian_federal_election,_2007', '2015-07-01', 1794), ('Ain_Sakhri', '2017-10-01', 76), ('Belosaepiidae', '2015-07-01', 68), ('Acts_of_Parliament_in_the_United_Kingdom', '2017-10-01', 4070), ('Equity_Office', '2016-11-01', 202), ('David_Bintley', '2017-01-01', 51), ('Aksel_Schiotz', '2018-03-01', 3), ('Appropriation_Act_2000', '2017-05-01', 12), ('Edward_Johnson_III', '2016-11-01', 491), ('2006_Ohio_State_Buckeyes_football_team', '2016-03-01', 1452), ('Battle_of_Fort_Beausejour', '2015-07-01', 97), ('Abel_Foullon', '2015-12-01', 82), ('Apollo_VIII', '2015-10-01', 19), ('Carry_on_up_the_jungle', '2015-07-01', 8), ('Armour_villa', '2017-05-01', 4), ('201_Poplar', '2015-08-01', 265), ('Arta_prefecture', '2016-08-01', 1), ('2015-16_Ekstraklasa', '2018-02-01', 13), ('Alport,_Ontario', '2018-02-01', 2), ('Bongoland', '2017-06-01', 62), ('Alfred_Charles_Post', '2016-11-01', 11), ('Aam_Aadmi_Party_crisis', '2016-10-01', 1), ('Andrea_Moda', '2015-07-01', 143), ('Abdul_Halim_Sharar', '2017-08-01', 545), ('Apostolic_Vicariate_of_Yunnan', '2016-12-01', 1), ('Catherine_Steadman', '2016-11-01', 5218), ('Agastachys_odorata', '2015-10-01', 38), ('9783_Tensho-kan', '2016-03-01', 2), ('AFL_Cairns', '2017-10-01', 337), ('Abomey', '2015-06-01', 1062), ('Anne_Crofton,_1st_Baroness_Crofton', '2015-12-01', 42), ('Cash-flow_return_on_investment', '2017-01-01', 137), ('Alberto_Arvelo_Torrealba_Municipality', '2015-08-01', 56), ('Abyssinian_Shorthorned_Zebu', '2017-09-01', 124), ('Albanian_hip_hop', '2016-01-01', 1812), ('Alphonso_IV_of_Portugal', '2016-02-01', 12), ('19th_The_Alberta_Mounted_Rifles', '2016-10-01', 1), ('Chinese_shadow_theatre', '2016-04-01', 1), ('American_Committee_of_the_Fourth_International', '2017-08-01', 4), ('2014_Bahrain_GP2_Series_round', '2016-03-01', 80), ('Alexandrian_orthodox', '2017-09-01', 2), ('2010_Hurricane_Season', '2015-05-01', 18), ('1938_All-Ireland_Senior_Camogie_Championship_Final', '2017-01-01', 1), ('ATC_code_D01', '2018-01-01', 203), ('Albedo', '2015-08-01', 23484), ('Chavigny,_Meurthe-et-Moselle', '2017-01-01', 12), ('Becky_Essex', '2015-07-01', 51), ('Archaeological_Museum_Padre_Le_Paige', '2018-02-01', 2), ('Abu_Bakar_Sillah', '2017-01-01', 5), ('Back_chat', '2017-01-01', 2), ('Anchylobela_dyseimata', '2015-12-01', 11), ('Anthony_Overton', '2017-03-01', 261), ('Bear_maul', '2016-04-01', 3), ('Ambarawa,_Central_Java', '2016-01-01', 1), ('Amber_lager', '2016-11-01', 87), ('2nd_LAAD', '2017-09-01', 8), ('Ashiya,_Hyogo', '2018-03-01', 24), ('Angels_at_Risk', '2018-02-01', 74), ('Audrey_Marie_Munson', '2016-03-01', 17), ('1984_Australian_Football_Championships', '2017-01-01', 27), ('Ammonia_fountain', '2016-06-01', 434), ('Allister_Bentley', '2018-03-01', 11), ('Alsager_Hay_Hill', '2016-10-01', 72), ('1753_English_cricket_season', '2015-05-01', 51), ('2009-10_New_Jersey_Devils_season', '2016-10-01', 1), ('An_Untamed_State', '2016-05-01', 1109), ('Beatrice_Carmichael', '2016-11-01', 5), ('Abdul_Ghani_Ahmad', '2017-12-01', 115), ('Arteria_suralis', '2017-02-01', 3), ('Berzasca_River', '2017-01-01', 1), ('Angel_Attack', '2015-09-01', 98), ('1969_San_Francisco_49ers_football_team', '2017-11-01', 1), ('Anthony_Beilenson', '2017-09-01', 114), ('Crystalline_Entity', '2016-04-01', 180), ('Granice', '2017-01-01', 2), ('203rd_General_Hospital', '2017-07-01', 44), ('Acrocercops_rhombiferellum', '2017-12-01', 20), ('Ampliglossum_blanchetii', '2017-05-01', 1), ('11553_Scheria', '2017-03-01', 2), ('Ashkenozi', '2017-02-01', 1), ('2010_Calder_Cup_Playoffs', '2018-01-01', 9), ('Alice_Caymmi', '2016-01-01', 121), ('Alfredo_Alvar', '2017-04-01', 44), ('2006_Legends_Tour', '2017-07-01', 30), ('Albano_Albanese', '2015-10-01', 53), ('1943_Frankford_Junction_train_wreck', '2016-08-01', 510), ('Evans_Court_Apartment_Building', '2016-04-01', 4), ('Abu_al-Rayhan_Muhammad_ibn_al-Biruni', '2017-11-01', 1), ('Abubakar_Muhammad_Rimi', '2015-05-01', 4), ('Dostpur', '2016-11-01', 26), ('Accessories_Council_Excellence_Awards', '2016-03-01', 14), ('2006_North_American_heat_wave', '2015-06-01', 1161), ('Amstelodamum', '2017-09-01', 12), ('A_Very_Peculiar_Practice', '2016-08-01', 1860), ('Allegorie_der_Liebe', '2015-09-01', 1), ('Alex_Mackie', '2017-02-01', 95), ('1812_Homestead_Farm_and_Museum', '2017-09-01', 29), ('Argus_distribution', '2016-03-01', 8), ('Anthony_Thomas_Stover', '2017-02-01', 1), ('Arthur_Shallcross', '2016-11-01', 20), ('Antoine_Francois_Fourcroy', '2018-01-01', 1), ('Abbas_Halim', '2016-11-01', 21), ('Akiva_Baer_ben_Joseph', '2017-08-01', 1), ('Balatonfuered', '2016-11-01', 3), ('Antemnae', '2017-11-01', 204), ('Cling_Cling', '2017-06-01', 93), ('B_flat_major', '2017-01-01', 28), ('AirExplore', '2017-12-01', 930), ('Auckland_Super_Sprint', '2015-11-01', 120), ('Alfredo_De_Gasperis', '2017-12-01', 793), ('Geoffrey_I_of_Vianden', '2017-01-01', 5), ('Copa_de_Zaachila', '2016-04-01', 6), ('Alboacen', '2017-09-01', 1), ('BNH_Hospital_Bangkok', '2017-06-01', 2), ('Agricultural_health_and_safety', '2016-09-01', 1), ('Chiasms', '2017-06-01', 2), ('Al_Karaana', '2016-05-01', 58), ('Alberta_Highway_872', '2016-11-01', 1), ('Among_the_mourners', '2016-03-01', 1), ('Achema_Power_Plant', '2015-06-01', 55), ('ATSE_Graz', '2017-10-01', 65), ('Arthroscopy', '2017-02-01', 11721), ('2010-2012_European_Nations_Cup_Second_Division', '2018-01-01', 7), ('1967_Cincinnati_Reds', '2015-08-01', 4), ('24th_Golden_Disc_Awards', '2017-05-01', 71), ('Johnny_Floyd', '2017-01-01', 17), ('Arthur_Rupin', '2016-02-01', 5), ('Alpine_skiing_at_the_2011_Canada_Winter_Games', '2015-09-01', 38), ('College_Press_Service', '2017-01-01', 8), ('American_Psycho', '2015-08-01', 55567), ('CBC_Winnipeg', '2017-06-01', 17), ('Burning_the_process', '2016-04-01', 1), ('2011_Stanley_Cup_playoffs', '2017-01-01', 1036), ('Andrew_Mumford', '2017-01-01', 6), ('1925_in_fine_arts_of_the_Soviet_Union', '2018-02-01', 28), ('Aragvi_river', '2017-02-01', 2), ('Andrew_Adamson', '2018-03-01', 16269), ('Arcides_fulvohirta', '2016-10-01', 1), ('Araya_Selassie_Yohannes', '2015-11-01', 423), ('Apartment_house', '2016-09-01', 85), ('Advanced_Art', '2015-12-01', 171), ('1028_Lydina', '2015-06-01', 53), ('2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti', '2017-04-01', 2), ('Adolph_Weiss', '2015-06-01', 98), ('Adam_Jerzy_Czartoryski', '2015-09-01', 1237), ('1980_United_States_presidential_election', '2017-05-01', 56), ('1956_Oscars', '2016-08-01', 10), ('Burundian_Senate_election,_2005', '2016-04-01', 1), ('Amarolea_floridana', '2015-07-01', 3), ('August_Bier', '2015-12-01', 514), ('Arbelodes_sebelensis', '2018-03-01', 6), ('Abiah_Brown', '2018-02-01', 1), ('A_Maceo_Smith_High_School', '2016-10-01', 2), ('1488_in_architecture', '2017-12-01', 6), ('2009_AMP_Energy_500', '2016-04-01', 45), ('1921_Baylor_Bears_football_team', '2017-03-01', 21), ('Dmitry_Akhba', '2015-07-01', 43), ('2004_Big_12_Conference_Baseball_Tournament', '2016-07-01', 37), ('Abdisalam_Omer', '2018-02-01', 116), ('Alma,_son_of_Alma', '2015-08-01', 53), ('An_Phoblacht', '2016-10-01', 962), ('2009_Turner_Prize', '2016-01-01', 75), ('Jack_Zajac', '2017-01-01', 24), ('1906_Wimbledon_Championships', '2016-04-01', 22), ('Chuckwalla_Valley', '2017-06-01', 22), ('Alien_Quadrology', '2016-02-01', 1), ('Chalcidoptera_contraria', '2016-04-01', 1), ('Alaska_Republican_Gubernatorial_Primary_Election,_2006', '2016-02-01', 1), ('333639_Yaima', '2018-02-01', 7), ('Aquila_hastata', '2015-11-01', 28), ('Al-Fua', '2017-07-01', 1), ('Anihilation', '2015-07-01', 28), ('International_Toy_Fair', '2017-01-01', 1), ('38th_Regiment_Indiana_Infantry', '2017-01-01', 10), ('Andrea_Stella', '2017-07-01', 75), ('Anselmo_de_Moraes', '2015-09-01', 562), ('Applemore', '2016-05-01', 3), ('Akpinar,_Kirsehir', '2015-06-01', 3), ('Ant_nest', '2016-05-01', 53), ('Catherine_of_Siena', '2016-11-01', 8806), ('Barbos', '2015-06-01', 12), ('Amlaib_mac_Iduilb', '2017-08-01', 2), ('Alice_Janowski', '2018-03-01', 17), ('Acacia_leptocarpa', '2017-03-01', 48), ('Al-Hadi_Yahya', '2016-01-01', 39), ('2015_British_Figure_Skating_Championships', '2017-07-01', 38), ('Avenues_Television', '2016-03-01', 214), ('Dendropsophus_sartori', '2015-07-01', 11), ('1952_in_Germany', '2015-05-01', 63), ('Armuchee_High_School', '2016-04-01', 27), ('April_1_RFC', '2017-11-01', 2), ('Caroline_Bliss', '2016-11-01', 972), ('66th_Rice_Bowl', '2016-06-01', 17), ('Alec_Smight', '2017-02-01', 173), ('Alexei_Panin', '2017-09-01', 3), ('Codeword', '2016-04-01', 84), ('Dormice', '2015-07-01', 63), ('2105_BC', '2017-11-01', 6), ('5th_National_Congress_of_Kuomintang', '2016-06-01', 5), ('Caminho_das_Indias', '2017-01-01', 5), ('Agerbo', '2017-11-01', 2), ('Abe_Anellis', '2018-01-01', 86), ('Aceh_Medal', '2015-07-01', 33), ('Alltech_Arena', '2016-10-01', 144), ('Aly_Oury', '2016-06-01', 260), ('757th_Troop_Carrier_Squadron', '2017-07-01', 2), ('Alec_Peters', '2017-12-01', 2731), ('Agua_Buena_Airport', '2017-09-01', 12), ('Alessandro_Livi', '2016-08-01', 104), ('Andkaer', '2017-04-01', 3), ('Cateran', '2017-06-01', 135), ('57th_Venice_International_Film_Festival', '2017-04-01', 180), ('Brijal_Patel', '2017-06-01', 98), ('Cnemaspis_jerdonii', '2015-07-01', 6), ('Aluminum_sodium_salt', '2016-10-01', 3), ('Arnaldo_Antonio_Sanabria_Ayala', '2017-09-01', 4), ('Angels_of_Iron', '2018-02-01', 83), ('Bugs_Bunny_Rabbit_Rampage', '2017-06-01', 422), ('Admiralty_Class_Destroyer', '2017-10-01', 2), ('Atlas_Media', '2017-05-01', 2), ('Arcesilaus_i_of_cyrene', '2017-03-01', 1), ('2011_Tajikistan_national_football_team_results', '2017-04-01', 13), ('Artur_Shakhnazarov', '2017-12-01', 22), ('747_Express_Bus', '2018-03-01', 20), ('101-in-1_Party_Megamix', '2017-10-01', 188), ('Fastpoint_Games', '2016-11-01', 32), ('Analog_Anthology_1', '2017-07-01', 1), ('Archival_bond', '2015-09-01', 119), ('1985_Air_Force_Falcons_football', '2017-09-01', 4), ('American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem', '2017-06-01', 3), ('Adaptive_Evolution_in_the_Human_Genome', '2017-08-01', 2), ('Arthur_Strangways', '2015-11-01', 5), ('1583_in_poetry', '2015-09-01', 68), ('Andrew_igoudala', '2015-06-01', 2), ('Euonychophora', '2016-11-01', 37), ('Catechizing', '2016-04-01', 4), ('1960-61_ice_hockey_Bundesliga_season', '2018-03-01', 3), ('Buk_Vlaka', '2017-06-01', 10), ('Arbor_Day', '2018-03-01', 16265), ('Guan_Sheng', '2017-01-01', 73), ('2014_Barcelona_Open_Banc_Sabadell', '2016-08-01', 57), ('1976-77_Nationalliga_A', '2016-04-01', 1), ('AFL_records', '2015-11-01', 16), ('2005_Tour_Down_Under', '2016-10-01', 26), ('92_BCE', '2015-08-01', 4), ('Bento_Box_Animation', '2017-01-01', 1), ('Alabama_Territory', '2018-03-01', 1195), ('Abdul-Wasa_Al-Saqqaf', '2016-07-01', 21), ('Archbishops_of_Semarang', '2017-01-01', 6), ('Ambivina', '2017-10-01', 13), ('Aghjaghala_Ulia', '2017-08-01', 2), ('Blechnum_novae-zelandiae', '2016-11-01', 26), ('Dictyosome', '2016-04-01', 19), ('Arts_Council_of_Great_Britain', '2016-12-01', 785), ('LBC_Radio', '2017-01-01', 3), ('Ageo,_Saitama', '2016-06-01', 396), ('Babla_Mehta', '2016-12-01', 674), ('2012-13_Russian_Cup', '2018-01-01', 10), ('Chandragupt', '2017-06-01', 6), ('407th_Air_Refueling_Squadron', '2016-01-01', 96), ('Aftermarket', '2016-07-01', 1253), ('A_Portrait_of_New_Orleans', '2016-08-01', 18), ('2000-01_Yemeni_League', '2017-03-01', 1), ('Actinidia_chinensis', '2015-11-01', 907), ('Amsterdam_Tournament_1999', '2018-03-01', 1), ('Arthur_Iberall', '2017-02-01', 112), ('Auricula_Meretricula', '2016-02-01', 103), ('Archbishop_of_Lahore', '2016-09-01', 8), ('Chippewa_Indians_of_Montana', '2016-04-01', 9), ('Abidjan-Niger_Railway', '2018-01-01', 22), ('29th_Annual_Grammy_Awards', '2017-05-01', 1087), ('Ateles_geoffroyi_frontatus', '2017-06-01', 3), ('Enrico_Cernuschi', '2016-11-01', 3), ('A4183_road', '2017-02-01', 8), ('Ahrayut', '2016-10-01', 75), ('Alison_Castle', '2016-03-01', 55), ('Automobile_aftermarket', '2016-10-01', 5), ('2008_GAINSCO_Auto_Insurance_Indy_300', '2016-07-01', 51), ('1937_Scottish_Cup_Final', '2017-04-01', 126), ('2005_Clipsal_500_Adelaide', '2018-02-01', 22), ('Farid_Farjad', '2016-04-01', 120), ('13_Tribes_of_Long_Island', '2015-12-01', 11), ('Afroneta_bamilekei', '2017-01-01', 2), ('Frederick_Stuart_Greene', '2017-01-01', 1), ('Andre_Braugher', '2017-04-01', 37655), ('1906_International_Lawn_Tennis_Challenge', '2017-10-01', 73), ('2009-10_NFL_Playoffs', '2016-01-01', 69), ('Cricket_Wellington', '2016-11-01', 2), ('Craig_Blazer', '2015-07-01', 21), ('Aeolidiella_orientalis', '2017-05-01', 3), ('Andre_Prokovsky', '2017-06-01', 4), ('Angela_McKee', '2017-11-01', 14), ('Airbase_Golubovci', '2016-10-01', 1), ('2011_ISAF_Sailing_World_Championships', '2017-05-01', 89), ('Bartica_Airport', '2017-06-01', 27), ('Agusan_Dam', '2016-09-01', 454), ('Bosque_Real_Country_Club', '2015-07-01', 42), ('Georges_Duhamel', '2017-01-01', 122), ('Allrounder', '2017-03-01', 63), ('2017_Missouri_State_Bears_football_team', '2017-09-01', 868), ('Allons_a_Lafayette', '2017-11-01', 17), ('Agathla', '2015-05-01', 105), ('1086_in_poetry', '2015-09-01', 25), ('Absolute_extreme', '2017-09-01', 1), ('Agathe_Bonitzer', '2017-12-01', 229), ('Chinese_Red_Pine', '2017-06-01', 18), ('Angular_dispersion', '2016-02-01', 11), ('Jean-Sebastian_Giguere', '2017-01-01', 2), ('Actinium-235', '2018-03-01', 4), ('Ago,_filo_e_nodo', '2017-02-01', 11), ('Aranea_cruentata', '2016-03-01', 1), ('2009_Korea_National_League', '2017-11-01', 19), ('Americom-8', '2016-08-01', 28), ('2006_Junee_Bushfire', '2018-03-01', 81), ('2013_Major_League_Baseball_Home_Run_Derby', '2017-09-01', 182), ('1928_US_Presidential_Election', '2016-12-01', 42), ('After-eighty_generation', '2016-02-01', 127), ('1932_Hawthorn_Football_Club_season', '2017-07-01', 16), ('Amelia_Elizabeth_Mary_Rygate', '2017-05-01', 2), ('Aline_Khalaf', '2017-12-01', 465), ('Akron_Junction,_New_York', '2017-07-01', 56), ('Apollo_moon_landing_conspiracy_theories', '2015-09-01', 4), ('1978_National_League_Championship_Series', '2017-03-01', 325), ('1959-60_German_football_championship', '2017-08-01', 5), ('Almost_a_Bride', '2017-01-01', 1), ('Andrew_Lysaght,_junior', '2015-10-01', 20), ('1902_Otani_expedition', '2018-02-01', 1), ('1892_Currie_Cup', '2016-09-01', 53), ('1988_USC_Trojans_football_team', '2016-10-01', 494), ('1944_in_Northern_Ireland', '2016-12-01', 46), ('Alfred_Acherman', '2017-07-01', 1), ('Arcadia,_Nebraska', '2017-02-01', 148), ('4_x_400_metre_relay', '2018-03-01', 1), ('A4030_road', '2016-07-01', 1), ('Chi-li', '2016-11-01', 3), ('Aircraft_fairing', '2016-11-01', 1861), ('Buddhism_in_Belize', '2015-07-01', 40), ('Alameda_County_Open', '2017-02-01', 33), ('Area_of_countries_and_regions_of_the_United_Kingdom', '2017-10-01', 6), ('2014_Weber_State_Wildcats_football_team', '2016-10-01', 47), ('American_Journal_of_Comparative_Law', '2016-04-01', 62), ('A_Teaspoon_Every_Four_Hours', '2017-03-01', 47), ('Astasis', '2016-03-01', 1195), ('Akhrakouaeronon', '2015-11-01', 62), ('Annenkrone', '2016-03-01', 40), ('Ballotine', '2016-12-01', 4753), ('2000_Kipawa_earthquake', '2015-11-01', 139), ('Archdiocese_of_cashel_and_emly', '2017-01-01', 1), ('Chevrolet_SS396', '2017-01-01', 1), ('Achyroseris', '2016-03-01', 1), ('Daniel_Pulteney', '2016-11-01', 29), ('2006_Major_League_Baseball_draft', '2017-07-01', 10637), ('Adetunji_Idowu_Olurin', '2016-01-01', 37), ('Ardatov,_Nizhny_Novgorod_Oblast', '2017-04-01', 18), ('Andrew_Hilditch', '2015-08-01', 398), ('A_Very_Merry_Daughter_Of_the_Bride', '2017-04-01', 67), ('1993_in_radio', '2017-08-01', 85), ('Deltan', '2016-11-01', 91), ('Adnan_Custovic', '2017-12-01', 26), ('Di_Gennaro', '2017-01-01', 4), ('237_AD', '2017-11-01', 1), ('Aaron_Gombar', '2018-03-01', 2), ('Acrolophus', '2017-04-01', 47), ('Alfred_Bergman', '2017-06-01', 27), ('Charles_Bebb', '2017-06-01', 39), ('Dirico', '2017-01-01', 24), ('1982_Major_League_Baseball_Draft', '2016-12-01', 90), ('DDT_wrestling', '2016-11-01', 4), ('1988-89_Houston_Rockets_season', '2016-02-01', 10), ('Acacia_loderi', '2015-11-01', 35), ('2015_Deauville_American_Film_Festival', '2016-10-01', 126), ('Andropadus_importunus', '2016-02-01', 9), ('Antonio_Bacchetti', '2017-04-01', 52), ('Ann_Trindade', '2015-09-01', 49), ('5_x_Monk_5_x_Lacy', '2016-05-01', 37), ('Barlochan,_Ontario', '2017-06-01', 2), ('Achaian', '2017-03-01', 35), ('Flow_rider', '2017-01-01', 1), ('Antiblemma_discerpta', '2018-02-01', 1), ('1997_Illinois_Fighting_Illini_football_team', '2017-11-01', 331), ('Ahrntal', '2016-03-01', 540), ('Apollo_Conference', '2015-10-01', 329), ('Algenib_in_Perseus', '2016-01-01', 1), ('Craig_Norgate', '2016-04-01', 42), ('Antwerp_Zoo', '2015-12-01', 879), ('Cold_Contagious', '2017-06-01', 161), ('Bolito', '2016-11-01', 181), ('Chinese_bridges', '2016-11-01', 1), ('14th_Indiana_Infantry_Regiment', '2017-04-01', 115), ('Bindunuwewa_massacre', '2015-07-01', 52), ('Eastshore_Highway', '2016-11-01', 2), ('Daemonologie', '2017-01-01', 1655), ('Aero_Pacifico', '2015-07-01', 1), ('Blue_Ribbon_Schools_Program', '2017-06-01', 557), ('Ash_Township,_MI', '2018-02-01', 3), ('Al-Hatab_Square', '2018-02-01', 450), ('Alje_Vennema', '2018-02-01', 187), ('1920_All-Ireland_Senior_Football_Championship_Final', '2016-05-01', 40), ('Criss_Oliva', '2016-11-01', 801), ('Bethlehem,_Ohio', '2017-01-01', 16), ('1976_WHA_Amateur_Draft', '2015-08-01', 47), ('Angela_Fimmano', '2017-06-01', 17), ('Alexander_Bonini_of_Alexandria', '2017-09-01', 1), ('Anarchist_faq', '2015-05-01', 13), ('Aleksander_Benedykt_Sobieski', '2016-05-01', 240), ('Cape_Florida_Lighthouse', '2016-04-01', 6), ('Fernando_VI_of_Spain', '2017-01-01', 3), ('Crossing_number', '2017-06-01', 29), ('1984_NSL_Cup', '2017-05-01', 26), ('Barbara_Weldon', '2015-06-01', 29), ('Andreas_Olsen', '2017-01-01', 32), ('Battle_of_Baima', '2016-04-01', 2), ('Amory_Hansen', '2016-05-01', 26), ('Akhmimic', '2015-11-01', 41), ('Al_Awda', '2018-02-01', 18), ('Adelheid-Marie_of_Anhalt-Dessau', '2016-07-01', 70), ('Americans_for_Technology_Leadership', '2015-10-01', 90), ('Belizean_diplomatic_missions', '2017-06-01', 3), ('African_communist', '2016-05-01', 3), ('Andosol', '2016-09-01', 246), ('Alan_Attraction', '2016-05-01', 15), ('A_Yank_in_Rome', '2015-12-01', 70), ('2004_in_the_United_Arab_Emirates', '2018-02-01', 33), ('Additionality', '2017-06-01', 371), ('Assassination_of_Trotsky', '2015-06-01', 47), ('Alice_Sotero', '2018-02-01', 27), ('Agyneta_platnicki', '2016-04-01', 4), ('Alexandra_Vasilyevna_Velyaminova', '2015-07-01', 30), ('1881_in_Chile', '2016-06-01', 16), ('Arterial_ischemic_stroke', '2018-01-01', 57), ('Astro_Glacier', '2015-09-01', 27), ('Chester_Earl_Merrow', '2017-06-01', 58), ('Alejandro_de_la_Madrid', '2015-11-01', 1630), ('70936_Kamen', '2017-08-01', 1), ('AK_Steel_Holding_Corp', '2015-08-01', 8), ('1124_Stroobantia', '2017-10-01', 23), ('Asian_Wedding', '2016-10-01', 15), ('23837_Matthewnanni', '2015-10-01', 18), ('Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden', '2017-03-01', 4893), ('Betsy_Hodges', '2016-04-01', 560), ('Arthur_and_the_Invisibles', '2015-08-01', 14924), ('Arkansas-Ole_Miss_football_rivalry', '2015-05-01', 7), ('Asia_Cup', '2015-09-01', 5938), ('Arginine_racemase', '2016-12-01', 15), ('585th_Field_Company,_Royal_Engineers', '2018-03-01', 1), ('1975_Stagg_Bowl', '2017-08-01', 6), ('Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath', '2017-01-01', 1), ('Askajian', '2016-02-01', 26), ('2006_Nebraska_Cornhuskers_football_team', '2015-08-01', 975), ('Cicero_Francis_Lowe_House', '2015-07-01', 10), ('Conan_IV,_Duke_of_Brittany', '2016-11-01', 252), ('2005_World_Modern_Pentathlon_Championships', '2016-07-01', 38), ('1946_Aleutian_Islands_earthquake', '2017-03-01', 2019), ('ANKRD17', '2017-09-01', 19), ('1970_Maryland_Terrapins_football_team', '2017-11-01', 42), ('Ali_Dehkhoda', '2017-04-01', 1), ('1244_in_art', '2015-07-01', 22), ('1520s_in_Denmark', '2016-01-01', 20), ('Abdoulaye_Gaye', '2017-12-01', 10), ('An_Angel_Has_Arrived', '2016-03-01', 36), ('1453_BC', '2015-08-01', 26), ('2017_National_Games_of_China', '2017-05-01', 1293), ('A_Night_in_Sickbay', '2016-05-01', 251), ('Dateline_Diamonds', '2017-01-01', 53), ('419_guestbook_spamming', '2016-02-01', 5), ('Familiar_bluet', '2017-01-01', 4), ('Abu_Bakr_Mirza', '2017-10-01', 86), ('7272_Darbydyar', '2017-11-01', 4), ('Ages_of_consent_in_Latin_America', '2017-03-01', 961), ('1982_Japan_Soccer_League_Cup', '2016-04-01', 14), ('2810_BC', '2015-07-01', 9), ('Druga_Liga_Republike_Srpske', '2017-01-01', 1), ('1998_Swedish_Rally', '2017-09-01', 34), ('1567_in_Norway', '2015-10-01', 89), ('126_Army_Engineer_Regiment,_Royal_Engineers', '2016-03-01', 5), ('2017_American_League_Wild_Card_Game', '2017-10-01', 25120), ('August_Follen', '2017-01-01', 2), ('Ala_Gertner', '2015-11-01', 876), ('Glenwood,_Harford_County,_Maryland', '2017-01-01', 3), ('Applied_ecology', '2017-12-01', 730), ('Ariarathes_V_Eusebes_Philopator', '2018-03-01', 5), ('2006_AFC_Champions_League', '2017-09-01', 947), ('60_minutes_2', '2016-10-01', 2), ('Embryonic_shield', '2017-01-01', 2), ('2001_Meath_Intermediate_Football_Championship', '2015-11-01', 8), ('Apparition_of_Christ_to_Madonna', '2017-06-01', 5), ('Hoosier_Road_Elementary', '2017-01-01', 1), ('Arua_Uda', '2016-12-01', 29), ('Array_comprehension', '2015-11-01', 8), ('Baszki', '2015-06-01', 36), ('Akron_Neighborhoods', '2016-01-01', 4), ('Catholic_Church_in_Costa_Rica', '2017-06-01', 85), ('Canada-Sweden_relations', '2015-07-01', 1), ('Barza_Radio_Community', '2016-11-01', 6), ('Dalhousie_Middle_School', '2016-11-01', 5), ('Alliphis_bakeri', '2017-11-01', 2), ('Bartica_massacre', '2017-06-01', 53), ('30th_January', '2015-11-01', 10), ('1920_revolution', '2017-05-01', 5), ('Amyraldism', '2017-08-01', 828), ('AA_Jefferson_District', '2016-05-01', 45), ('Eunebristis_cinclidias', '2017-01-01', 1), ('A_Scott_Connelly', '2017-06-01', 5), ('Antony_Durose', '2016-07-01', 19), ('Arval_Brethren', '2017-11-01', 579), ('Anthidium_dissectum', '2017-05-01', 2), ('Aru,_Democratic_Republic_of_the_Congo', '2017-04-01', 81), ('1956-57_West_Indian_cricket_season', '2017-04-01', 2), ('2014_Moscow_Film_Festival', '2017-08-01', 2), ('Anna_Gurji', '2017-06-01', 27), ('Allen_Memorial_Medical_Library', '2016-07-01', 120), ('Anton_Sistermans', '2017-02-01', 36), ('Clotheshorses', '2017-06-01', 1), ('36_Stratagems', '2017-08-01', 25), ('Attack_of_the_crab_monsters', '2016-10-01', 16), ('30_rock_awards', '2015-09-01', 2), ('Aeroflot,_Uralsk_Civil_Aviation_Directorate', '2017-08-01', 2), ('Amblyseius_parabufortus', '2017-06-01', 3), ('Indian_coral_tree', '2017-01-01', 3), ('3285_Ruth_Wolfe', '2016-02-01', 9), ('Anderson_da_Silva_Gibin', '2016-08-01', 73), ('5001st_Composite_Group', '2017-03-01', 4), ('Danzik', '2016-04-01', 8), ('4810_Ruslanova', '2016-03-01', 2), ('Arkendale,_Virginia', '2016-04-01', 14), ('Al_Francis_Bichara', '2016-09-01', 239), ('Cayena', '2017-01-01', 1), ('A_Glass_of_Darkness', '2017-04-01', 95), ('GMC_CCKW', '2017-01-01', 887), ('Alabama_State_Route_107', '2015-11-01', 13), ('2011_in_motorsport', '2017-12-01', 26), ('Adecco_General_Staffing,_New_Zealand', '2017-12-01', 86), ('Anbargah', '2015-10-01', 6), ('1995_Asian_Cup_Winners_Cup', '2016-06-01', 7), ('1986_Wales_rugby_union_tour_of_the_South_Pacific', '2016-12-01', 30), ('Adya_Goud_Brahmin', '2017-03-01', 2), ('Akcakiraz', '2015-08-01', 5), ('24249_Bobbiolson', '2017-12-01', 4), ('Ahmanson_Theatre', '2016-02-01', 801), ('Abdullah_ibn_Jahsh', '2016-10-01', 196), ('1937_in_Chile', '2015-08-01', 24), ('2000_in_England', '2016-01-01', 57), ('A_Deepness_In_The_Sky', '2017-08-01', 2), ('Area_code_678', '2015-07-01', 480), ('Avalon_Hill', '2017-01-01', 880), ('Anna,_Duchess_of_Prussia', '2015-12-01', 315), ('Alexandr_Syman', '2017-04-01', 24), ('7400_series_logic', '2017-11-01', 2), ('Greenleaf_Township,_Minnesota', '2017-01-01', 1), ('Acetylsal', '2017-04-01', 6), ('Earth_and_Man_National_Museum', '2016-11-01', 43), ('Affetside', '2015-10-01', 185), ('1971_CFL_season', '2015-08-01', 202), ('Beth_Bader', '2016-11-01', 21), ('Enrolled_Nurse', '2016-04-01', 5), ('Al-Azraq', '2016-12-01', 22), ('4th_South_Carolina_Regiment', '2015-07-01', 42), ('Amanda_Overmyer', '2017-02-01', 356), ('Auto_wrap', '2016-02-01', 8), ('Anonymous_internet_banking', '2015-07-01', 98), ('Curatoria', '2016-11-01', 3), ('A-roll', '2016-05-01', 134), ('Accra_hearts_of_oak_sc', '2017-10-01', 4), ('Apostasy_from_Judaism', '2015-12-01', 45), ('Acantharctia_tenebrosa', '2018-01-01', 3), ('Abigail_Keasey_Frankel', '2017-11-01', 25), ('2008_Paraguayan_general_election', '2016-01-01', 1), ('Adams_motor', '2015-09-01', 37), ('Drummond_Community_High_School', '2017-01-01', 17), ('Andrews_Nakahara', '2017-10-01', 474), ('10th_Maccabiah', '2017-04-01', 30), ('Ackerman,_Rick', '2015-08-01', 4), ('Dumri,_Buxar', '2016-11-01', 35), ('Asking_Jesus_into_your_heart', '2016-09-01', 1), ('Adamowicz_brothers', '2016-12-01', 161), ('Alien_Musibat', '2017-12-01', 2), ('Ahmad_Al_Tayer', '2016-04-01', 39), ('Analytical_phonics', '2016-01-01', 520), ('Do_It_Good', '2016-04-01', 281), ('2004_Kumbakonam_School_fire', '2017-12-01', 2114), ('1977_Chattanooga_Mocs_football_team', '2016-08-01', 3), ('Globe_valves', '2017-01-01', 11), ('Abelmoschus_crinitus', '2016-04-01', 18), ('1874_Yale_Bulldogs_football_team', '2016-02-01', 37), ('Climer', '2017-06-01', 1), ('Auchroisk', '2017-06-01', 37), ('2010_Albirex_Niigata_season', '2016-10-01', 19), ('Adhocracy', '2017-06-01', 2217), ('Chios_Massacre', '2015-07-01', 1110), ('African_Red_Slip', '2017-02-01', 221), ('1976_Portland_Timbers_season', '2016-07-01', 41), ('Alsace-Larraine', '2015-09-01', 2), ('3750_Ilizarov', '2017-07-01', 12), ('Aleksandr_Shkaev', '2017-05-01', 1), ('32_bar_form', '2016-01-01', 12), ('Aequatorium_jamesonii', '2018-03-01', 14), ('Abade_neiva', '2016-09-01', 2), ('Arakvaz', '2016-08-01', 23), ('207_Sqn', '2017-10-01', 2), ('Ducal_hat', '2016-11-01', 10), ('2_Degrees', '2017-03-01', 19), ('Ahmeddiyya_Islam', '2016-03-01', 4), ('Amidi-ye_Kohneh', '2017-11-01', 13), ('Contributions_to_Indian_Sociology', '2016-11-01', 42), ('Clark_Leiblee', '2016-04-01', 5), ('Abraham_of_Strathearn', '2017-09-01', 14); diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/error.log b/docs/ja/integrations/data-ingestion/data-formats/assets/error.log new file mode 100644 index 00000000000..05323c26d96 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/error.log @@ -0,0 +1,1000 @@ +2023/01/15 14:51:17 [error] client: 7.2.8.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:02:09 [error] client: 8.4.2.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:46:13 [error] client: 6.9.3.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:34:55 [error] client: 9.9.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:39:17 [error] client: 4.6.9.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:22:46 [error] client: 9.4.5.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:45:31 [error] client: 1.1.7.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:18:37 [error] client: 2.1.6.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:46:08 [error] client: 8.1.6.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:17:15 [error] client: 7.6.3.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:54:34 [error] client: 3.4.9.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:47:56 [error] client: 1.9.8.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 02:05:37 [error] client: 9.6.9.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:48:03 [error] client: 7.1.8.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:43:20 [error] client: 8.9.5.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 20:04:15 [error] client: 3.9.3.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 20:24:19 [error] client: 6.7.7.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 10:16:05 [error] client: 8.7.2.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:30:34 [error] client: 4.8.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 00:36:21 [error] client: 3.8.6.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 22:53:56 [error] client: 7.3.7.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:40:45 [error] client: 3.8.4.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:37:35 [error] client: 4.6.8.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:46:59 [error] client: 7.9.1.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:28:40 [error] client: 6.1.2.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 09:09:10 [error] client: 7.1.4.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:27:55 [error] client: 3.5.7.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:13:26 [error] client: 8.1.4.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:09:24 [error] client: 5.4.7.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:48:25 [error] client: 2.1.7.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 18:14:39 [error] client: 9.3.2.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:54:18 [error] client: 1.5.4.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:09:53 [error] client: 7.6.8.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 17:53:07 [error] client: 8.4.1.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:06:54 [error] client: 8.1.8.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:52:53 [error] client: 5.5.3.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 03:54:07 [error] client: 3.6.9.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 02:24:43 [error] client: 8.3.3.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:17:31 [error] client: 1.5.9.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:52:34 [error] client: 2.1.9.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:13:39 [error] client: 8.1.1.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 09:02:28 [error] client: 6.1.4.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 14:57:56 [error] client: 8.4.8.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:17:30 [error] client: 5.5.8.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 17:54:44 [error] client: 5.9.7.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:01:40 [error] client: 3.7.2.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:25:06 [error] client: 8.5.1.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:04:01 [error] client: 4.5.6.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:04:16 [error] client: 9.7.7.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:05:31 [error] client: 4.3.3.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 11:46:25 [error] client: 6.1.4.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:00:07 [error] client: 4.4.5.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 02:30:50 [error] client: 3.9.6.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:39:56 [error] client: 2.3.4.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:16:51 [error] client: 1.1.3.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:15:58 [error] client: 7.2.2.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:07:10 [error] client: 3.3.7.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:40:21 [error] client: 5.1.2.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:13:14 [error] client: 9.2.9.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 01:08:24 [error] client: 7.2.7.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:12:19 [error] client: 6.8.1.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:11:04 [error] client: 7.3.2.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:15:35 [error] client: 6.2.5.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 01:39:48 [error] client: 5.4.8.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:59:33 [error] client: 5.2.3.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:34:44 [error] client: 2.6.5.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:24:18 [error] client: 7.5.5.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:37:05 [error] client: 1.1.7.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:38:10 [error] client: 8.3.6.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 23:14:12 [error] client: 8.9.5.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:05:33 [error] client: 7.2.6.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:59:32 [error] client: 6.1.1.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:36:57 [error] client: 3.5.8.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:58:43 [error] client: 6.7.5.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 09:51:24 [error] client: 5.5.6.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:29:28 [error] client: 6.7.5.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:39:15 [error] client: 9.3.7.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:10:32 [error] client: 3.2.6.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:44:06 [error] client: 3.7.8.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 19:25:28 [error] client: 8.7.5.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 22:38:17 [error] client: 2.9.1.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:26:26 [error] client: 5.3.6.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 18:38:54 [error] client: 6.2.8.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 15:16:25 [error] client: 7.9.7.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:32:52 [error] client: 2.9.1.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:07:09 [error] client: 5.9.7.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:57:30 [error] client: 3.9.6.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 19:44:16 [error] client: 3.5.5.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:14:01 [error] client: 6.3.1.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 15:25:12 [error] client: 7.7.9.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:02:52 [error] client: 7.7.5.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:33:32 [error] client: 1.3.7.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:01:35 [error] client: 5.9.8.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:36:28 [error] client: 2.2.2.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:29:50 [error] client: 7.2.7.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:54:07 [error] client: 9.3.7.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:57:59 [error] client: 6.6.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 11:09:03 [error] client: 4.9.3.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 01:19:19 [error] client: 7.2.3.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:19:15 [error] client: 8.3.3.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 10:35:45 [error] client: 8.6.9.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:41:19 [error] client: 7.2.1.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:16:58 [error] client: 7.1.7.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 01:48:25 [error] client: 8.7.2.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:16:24 [error] client: 1.1.1.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:31:27 [error] client: 9.5.8.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:43:32 [error] client: 7.8.9.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 13:26:34 [error] client: 1.9.6.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 14:58:47 [error] client: 8.3.8.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:29:38 [error] client: 5.1.1.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 12:47:46 [error] client: 9.3.5.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:32:32 [error] client: 2.4.8.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:45:56 [error] client: 3.4.6.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:26:02 [error] client: 7.7.2.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:00:30 [error] client: 1.9.5.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:58:18 [error] client: 4.5.5.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:30:18 [error] client: 9.6.8.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:10:12 [error] client: 2.9.6.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 01:59:06 [error] client: 5.6.2.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:29:38 [error] client: 5.2.5.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:38:28 [error] client: 8.1.9.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 10:32:44 [error] client: 7.6.4.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:23:09 [error] client: 7.9.9.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 18:45:07 [error] client: 7.8.2.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:59:30 [error] client: 6.8.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:57:21 [error] client: 1.2.5.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 01:27:11 [error] client: 3.5.1.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 08:27:52 [error] client: 2.5.1.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 11:03:31 [error] client: 4.5.4.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:24:11 [error] client: 8.5.6.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:16:55 [error] client: 8.7.8.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:50:00 [error] client: 7.4.2.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 23:34:47 [error] client: 8.2.8.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:40:05 [error] client: 5.9.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:47:26 [error] client: 4.3.7.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 04:19:15 [error] client: 4.7.5.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 10:17:52 [error] client: 9.8.8.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 22:52:58 [error] client: 3.1.9.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:27:47 [error] client: 6.6.7.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:50:53 [error] client: 8.9.7.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:57:05 [error] client: 3.6.1.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 06:22:18 [error] client: 6.5.3.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:06:33 [error] client: 4.9.9.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:29:03 [error] client: 6.9.1.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 00:58:37 [error] client: 9.5.5.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:50:03 [error] client: 3.3.5.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:58:00 [error] client: 3.6.3.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 18:55:11 [error] client: 5.5.3.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:02:45 [error] client: 7.9.7.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:56:11 [error] client: 8.5.2.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 14:52:50 [error] client: 7.2.4.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:07:33 [error] client: 8.8.3.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 10:16:29 [error] client: 1.4.8.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:37:03 [error] client: 2.2.7.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 10:01:11 [error] client: 3.2.8.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:38:40 [error] client: 4.3.4.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:19:30 [error] client: 6.1.9.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 14:44:01 [error] client: 2.5.1.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:37:23 [error] client: 4.5.8.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:44:33 [error] client: 3.5.4.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:25:36 [error] client: 5.5.9.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 07:37:28 [error] client: 2.8.4.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:47:33 [error] client: 5.5.1.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:38:30 [error] client: 1.5.4.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 07:46:11 [error] client: 1.2.5.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 02:55:42 [error] client: 1.3.5.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:28:40 [error] client: 1.2.3.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:44:04 [error] client: 6.3.9.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:31:38 [error] client: 8.3.8.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 03:17:42 [error] client: 5.9.3.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 20:20:57 [error] client: 7.7.6.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:32:45 [error] client: 2.3.9.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:11:40 [error] client: 2.5.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:18:17 [error] client: 8.3.9.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:22:25 [error] client: 1.1.8.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:31:51 [error] client: 5.4.4.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:01:10 [error] client: 2.5.8.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 03:57:21 [error] client: 6.5.2.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 15:32:40 [error] client: 3.4.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:18:06 [error] client: 9.1.7.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:19:47 [error] client: 7.6.9.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:42:37 [error] client: 5.6.5.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:21:01 [error] client: 5.4.2.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 22:38:40 [error] client: 9.4.8.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:56:19 [error] client: 3.1.6.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:32:45 [error] client: 6.8.9.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 05:58:16 [error] client: 5.3.8.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 00:27:39 [error] client: 8.8.3.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:45:58 [error] client: 8.1.2.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:55:56 [error] client: 2.2.7.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:07:19 [error] client: 4.4.4.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:25:40 [error] client: 9.8.9.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:30:56 [error] client: 6.2.7.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:34:05 [error] client: 6.1.1.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:36:51 [error] client: 7.1.4.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 14:26:56 [error] client: 9.4.1.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:30:06 [error] client: 7.5.8.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 04:26:33 [error] client: 5.7.2.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:18:39 [error] client: 5.6.3.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:39:57 [error] client: 7.8.3.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 23:56:19 [error] client: 1.9.7.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 15:01:29 [error] client: 5.8.8.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 17:47:43 [error] client: 2.2.2.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 19:21:04 [error] client: 2.1.1.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:02:29 [error] client: 9.7.8.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:17:01 [error] client: 1.4.6.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:34:32 [error] client: 6.2.9.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:46:20 [error] client: 6.5.6.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:56:33 [error] client: 6.4.9.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:37:41 [error] client: 5.6.8.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:28:54 [error] client: 1.2.5.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:11:57 [error] client: 2.8.5.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 23:44:57 [error] client: 1.4.7.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 05:48:48 [error] client: 3.3.9.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 12:32:31 [error] client: 1.5.3.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:15:34 [error] client: 2.4.2.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:01:17 [error] client: 2.6.6.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:24:23 [error] client: 9.8.4.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 18:23:32 [error] client: 7.8.2.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:27:32 [error] client: 8.3.2.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 07:02:49 [error] client: 6.5.3.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:47:34 [error] client: 5.3.9.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:19:26 [error] client: 8.6.7.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:37:10 [error] client: 4.5.7.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:00:53 [error] client: 1.9.7.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 11:10:28 [error] client: 7.5.1.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:13:23 [error] client: 2.3.1.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:32:45 [error] client: 1.5.5.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:52:24 [error] client: 9.4.1.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 09:43:02 [error] client: 2.7.4.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:08:31 [error] client: 8.3.8.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:18:12 [error] client: 4.6.4.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:02:23 [error] client: 8.6.2.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:09:50 [error] client: 3.7.1.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 22:20:03 [error] client: 6.5.7.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:06:28 [error] client: 1.1.6.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:44:13 [error] client: 3.6.4.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:22:57 [error] client: 2.3.4.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:53:01 [error] client: 2.2.5.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:12:30 [error] client: 2.6.3.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 12:14:14 [error] client: 8.4.8.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:30:45 [error] client: 6.1.6.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 01:18:22 [error] client: 1.5.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:53:45 [error] client: 1.7.9.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 13:04:48 [error] client: 6.2.1.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:36:09 [error] client: 2.2.5.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:29:16 [error] client: 7.8.3.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:54:45 [error] client: 9.3.3.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 18:58:21 [error] client: 2.1.6.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:14:55 [error] client: 7.9.8.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:32:25 [error] client: 8.8.1.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 11:33:17 [error] client: 4.6.8.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:27:16 [error] client: 2.4.5.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 01:01:30 [error] client: 7.7.1.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 04:45:38 [error] client: 4.6.3.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 20:20:55 [error] client: 1.1.8.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 03:04:06 [error] client: 6.5.6.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:58:45 [error] client: 1.2.6.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:31:14 [error] client: 5.4.2.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 10:13:26 [error] client: 1.6.4.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 02:59:43 [error] client: 5.9.1.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:28:25 [error] client: 5.6.8.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:09:12 [error] client: 4.3.4.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:07:01 [error] client: 1.1.8.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 12:30:47 [error] client: 6.5.7.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:25:09 [error] client: 4.8.6.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:04:11 [error] client: 5.1.8.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 17:48:08 [error] client: 4.2.5.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:17:12 [error] client: 3.8.9.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:06:06 [error] client: 4.1.5.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 05:29:27 [error] client: 8.3.6.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:50:31 [error] client: 1.8.3.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:40:07 [error] client: 5.8.3.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:07:40 [error] client: 9.1.7.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:28:18 [error] client: 5.7.2.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:33:34 [error] client: 7.6.3.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 23:58:06 [error] client: 1.9.6.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:19:27 [error] client: 7.2.5.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 17:43:39 [error] client: 7.2.3.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:19:01 [error] client: 1.6.5.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:25:04 [error] client: 7.2.3.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 19:49:23 [error] client: 1.4.4.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:00:29 [error] client: 1.2.6.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:48:28 [error] client: 5.7.7.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:31:49 [error] client: 6.7.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:01:04 [error] client: 1.8.5.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 05:30:40 [error] client: 9.8.3.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 22:34:44 [error] client: 1.3.7.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 11:12:22 [error] client: 1.6.1.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:42:02 [error] client: 6.2.5.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 07:03:57 [error] client: 4.9.5.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 01:00:45 [error] client: 2.6.3.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 20:28:59 [error] client: 7.4.8.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:46:16 [error] client: 8.8.9.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:04:11 [error] client: 4.1.1.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 18:38:50 [error] client: 3.4.5.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:09:53 [error] client: 3.1.6.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:36:48 [error] client: 1.1.6.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:57:10 [error] client: 6.5.1.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:53:20 [error] client: 8.3.9.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:54:23 [error] client: 5.3.7.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:15:49 [error] client: 2.2.8.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 04:50:08 [error] client: 4.9.7.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:42:19 [error] client: 2.4.8.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:02:38 [error] client: 9.4.2.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:57:08 [error] client: 9.4.3.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:28:37 [error] client: 3.8.3.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 10:05:47 [error] client: 3.7.7.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:48:52 [error] client: 9.9.8.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:46:42 [error] client: 6.6.2.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 08:00:21 [error] client: 7.2.3.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:24:38 [error] client: 8.6.2.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 14:10:45 [error] client: 3.6.7.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:01:39 [error] client: 9.8.2.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:47:11 [error] client: 6.2.7.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 02:07:20 [error] client: 7.4.7.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:15:01 [error] client: 7.5.8.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:57:07 [error] client: 2.3.8.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 17:50:55 [error] client: 1.7.2.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:13:46 [error] client: 1.7.5.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 17:40:08 [error] client: 3.7.5.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:03:47 [error] client: 6.9.1.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:38:50 [error] client: 9.1.5.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 05:56:34 [error] client: 7.4.9.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 15:58:14 [error] client: 4.5.1.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 00:15:04 [error] client: 5.7.4.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 10:26:02 [error] client: 6.7.5.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:42:28 [error] client: 6.2.3.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 10:37:44 [error] client: 6.6.8.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 02:16:46 [error] client: 5.6.2.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:29:52 [error] client: 2.9.8.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:42:35 [error] client: 5.1.5.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 20:43:41 [error] client: 1.1.8.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:24:56 [error] client: 8.7.5.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:44:06 [error] client: 5.6.4.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:20:58 [error] client: 7.6.4.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 07:32:38 [error] client: 8.3.9.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:26:49 [error] client: 5.2.9.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 09:15:19 [error] client: 2.8.5.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:58:49 [error] client: 9.7.4.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 17:09:28 [error] client: 3.9.3.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:35:18 [error] client: 3.8.6.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 20:04:01 [error] client: 9.4.8.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:10:04 [error] client: 4.8.3.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:44:55 [error] client: 6.8.2.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:46:37 [error] client: 8.9.4.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 17:54:09 [error] client: 1.5.5.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 04:10:33 [error] client: 3.4.4.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:32:17 [error] client: 8.7.5.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:40:14 [error] client: 5.1.1.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:46:50 [error] client: 7.2.9.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 07:24:17 [error] client: 1.9.1.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 01:55:21 [error] client: 9.5.1.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:42:33 [error] client: 6.7.3.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:46:46 [error] client: 4.8.7.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:16:20 [error] client: 3.9.6.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 18:53:39 [error] client: 9.4.3.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:22:56 [error] client: 2.7.7.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 03:53:25 [error] client: 7.9.6.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:25:09 [error] client: 2.6.1.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 12:44:45 [error] client: 1.5.6.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 09:01:18 [error] client: 7.4.8.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:30:56 [error] client: 5.5.5.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:17:14 [error] client: 9.4.4.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:17:43 [error] client: 1.6.4.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 03:30:01 [error] client: 3.3.6.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 15:19:14 [error] client: 2.6.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:16:27 [error] client: 8.1.2.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:49:37 [error] client: 2.7.6.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:14:10 [error] client: 8.2.2.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 12:22:46 [error] client: 8.8.3.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:24:43 [error] client: 9.3.6.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:28:40 [error] client: 7.4.3.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:38:41 [error] client: 8.5.7.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 03:19:59 [error] client: 4.1.7.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 10:18:06 [error] client: 6.4.7.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:06:17 [error] client: 2.1.7.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 19:19:50 [error] client: 5.7.4.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 13:49:37 [error] client: 9.5.1.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:08:03 [error] client: 4.6.7.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 06:34:28 [error] client: 9.1.7.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 12:47:13 [error] client: 1.9.5.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:20:49 [error] client: 4.4.5.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:11:27 [error] client: 5.5.6.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:15:22 [error] client: 2.9.4.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:06:15 [error] client: 7.9.9.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:27:41 [error] client: 8.3.4.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:41:12 [error] client: 3.7.8.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:34:44 [error] client: 5.9.2.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 04:31:52 [error] client: 8.6.6.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 06:09:26 [error] client: 9.7.9.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 02:41:44 [error] client: 6.9.3.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:21:30 [error] client: 6.9.6.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 19:20:51 [error] client: 6.2.2.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 23:11:18 [error] client: 9.7.1.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:18:46 [error] client: 4.3.2.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:06:42 [error] client: 9.2.5.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:54:24 [error] client: 8.7.3.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 18:28:01 [error] client: 9.6.9.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 02:05:06 [error] client: 4.1.2.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:53:28 [error] client: 5.6.5.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:21:32 [error] client: 4.6.4.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:22:44 [error] client: 2.4.8.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 14:43:47 [error] client: 4.6.3.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 23:08:00 [error] client: 2.3.8.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:25:30 [error] client: 6.2.2.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 12:44:00 [error] client: 9.8.2.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 07:59:49 [error] client: 5.1.9.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:03:40 [error] client: 1.2.3.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 01:18:27 [error] client: 7.9.2.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:20:23 [error] client: 8.6.2.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:57:24 [error] client: 8.2.5.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:55:12 [error] client: 7.9.6.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 05:11:59 [error] client: 5.8.8.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:00:56 [error] client: 7.1.1.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:12:31 [error] client: 2.1.9.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 23:36:19 [error] client: 3.4.6.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 23:07:53 [error] client: 8.4.9.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 19:12:11 [error] client: 3.8.6.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:17:03 [error] client: 1.7.6.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 13:16:50 [error] client: 8.7.6.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:14:55 [error] client: 4.9.8.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:32:13 [error] client: 4.7.9.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:25:00 [error] client: 2.1.8.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:52:40 [error] client: 4.5.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:50:04 [error] client: 6.6.7.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:49:55 [error] client: 3.1.7.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 13:54:30 [error] client: 9.7.6.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:31:48 [error] client: 3.5.1.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:18:43 [error] client: 2.6.8.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:25:35 [error] client: 3.3.6.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:53:17 [error] client: 2.2.9.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:53:27 [error] client: 1.7.2.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:58:08 [error] client: 4.6.2.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 23:52:39 [error] client: 9.3.6.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:51:37 [error] client: 4.6.2.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:25:43 [error] client: 8.9.1.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 11:43:40 [error] client: 5.7.9.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 09:18:45 [error] client: 4.4.2.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 02:24:08 [error] client: 4.2.1.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:46:10 [error] client: 6.6.8.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 23:05:58 [error] client: 9.6.2.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:43:58 [error] client: 7.6.6.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:07:25 [error] client: 4.1.1.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:29:54 [error] client: 8.3.6.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:19:15 [error] client: 4.1.7.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 05:49:56 [error] client: 7.7.6.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 06:28:52 [error] client: 5.5.7.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 03:26:04 [error] client: 7.1.8.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:19:40 [error] client: 9.1.9.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:14:19 [error] client: 7.4.4.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:05:48 [error] client: 2.8.8.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 17:27:13 [error] client: 5.5.5.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 05:27:13 [error] client: 8.2.5.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:22:24 [error] client: 4.4.5.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:15:08 [error] client: 8.9.8.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:19:54 [error] client: 2.3.4.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:53:36 [error] client: 2.5.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:47:10 [error] client: 4.4.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 04:53:52 [error] client: 4.4.4.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 09:16:25 [error] client: 8.5.8.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:02:29 [error] client: 7.5.8.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:56:22 [error] client: 6.3.7.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:08:35 [error] client: 4.7.7.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:44:53 [error] client: 1.7.9.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:45:19 [error] client: 1.4.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:34:10 [error] client: 5.6.4.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:18:01 [error] client: 9.7.7.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 15:47:10 [error] client: 4.3.2.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:18:15 [error] client: 8.2.7.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 05:53:58 [error] client: 9.2.7.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 14:54:46 [error] client: 4.7.1.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:22:00 [error] client: 6.2.7.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:55:30 [error] client: 5.9.4.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:16:52 [error] client: 3.1.2.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 12:59:52 [error] client: 3.3.9.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:02:53 [error] client: 6.5.5.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:32:02 [error] client: 9.7.4.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:52:03 [error] client: 3.7.6.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 05:04:30 [error] client: 8.3.6.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:11:17 [error] client: 5.2.9.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:13:44 [error] client: 8.7.3.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:25:59 [error] client: 7.7.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:13:14 [error] client: 5.1.8.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:43:06 [error] client: 7.1.3.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:08:41 [error] client: 7.2.2.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:45:24 [error] client: 3.1.2.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 02:05:41 [error] client: 5.4.4.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:38:53 [error] client: 5.5.6.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:03:51 [error] client: 5.7.2.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 18:20:20 [error] client: 3.3.3.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:33:50 [error] client: 3.4.3.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:10:04 [error] client: 8.6.6.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:16:11 [error] client: 4.7.4.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 18:44:01 [error] client: 1.5.2.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:23:50 [error] client: 9.3.1.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 12:25:15 [error] client: 9.6.4.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 13:48:00 [error] client: 8.9.8.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 01:40:26 [error] client: 3.8.8.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:06:40 [error] client: 7.1.6.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:05:52 [error] client: 6.3.5.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:16:49 [error] client: 9.2.9.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:30:31 [error] client: 4.2.1.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 17:54:03 [error] client: 1.3.4.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:03:50 [error] client: 2.5.7.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 00:49:52 [error] client: 2.2.5.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:23:15 [error] client: 5.4.6.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:48:54 [error] client: 6.5.1.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:28:07 [error] client: 1.4.6.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 01:14:10 [error] client: 9.1.1.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 13:27:15 [error] client: 8.5.9.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:06:57 [error] client: 6.5.7.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:39:36 [error] client: 1.6.9.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 19:11:00 [error] client: 5.7.2.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 10:41:25 [error] client: 1.7.1.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 03:10:23 [error] client: 5.9.3.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:28:49 [error] client: 2.6.6.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 07:00:05 [error] client: 2.8.7.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:29:47 [error] client: 8.7.3.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:39:10 [error] client: 2.3.9.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:03:21 [error] client: 6.8.1.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:28:38 [error] client: 5.4.5.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 07:29:19 [error] client: 7.9.6.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:18:52 [error] client: 4.6.3.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:18:29 [error] client: 3.8.9.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:22:58 [error] client: 8.6.6.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 07:13:17 [error] client: 4.9.4.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:59:11 [error] client: 2.7.1.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 11:03:23 [error] client: 1.3.4.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 10:57:50 [error] client: 6.4.3.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 17:56:35 [error] client: 9.7.9.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 01:02:29 [error] client: 5.9.8.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:09:05 [error] client: 3.9.7.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:00:57 [error] client: 4.1.5.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 03:09:13 [error] client: 8.6.2.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:44:55 [error] client: 6.7.7.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 21:44:37 [error] client: 2.9.3.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 18:09:09 [error] client: 3.8.8.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 15:30:13 [error] client: 7.6.2.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:34:21 [error] client: 9.5.3.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:38:24 [error] client: 4.2.4.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:50:48 [error] client: 9.7.9.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 18:37:11 [error] client: 9.1.4.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:11:20 [error] client: 2.3.3.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:03:50 [error] client: 8.7.7.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:58:10 [error] client: 4.1.3.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:28:51 [error] client: 3.7.8.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:17:43 [error] client: 7.3.2.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:18:51 [error] client: 9.8.8.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:09:29 [error] client: 2.4.5.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:22:38 [error] client: 6.4.3.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 10:33:26 [error] client: 5.4.8.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:49:41 [error] client: 4.2.7.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:19:36 [error] client: 9.1.4.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 18:57:12 [error] client: 5.9.6.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:10:14 [error] client: 5.4.9.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:59:24 [error] client: 8.8.2.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:11:50 [error] client: 1.7.1.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:48:45 [error] client: 9.9.1.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 03:27:28 [error] client: 3.8.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:03:01 [error] client: 7.5.1.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:25:24 [error] client: 3.7.7.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 11:52:05 [error] client: 8.4.2.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:59:47 [error] client: 5.7.5.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 02:33:28 [error] client: 8.8.8.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 07:45:18 [error] client: 2.8.1.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 15:37:24 [error] client: 6.2.8.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 17:38:54 [error] client: 9.1.4.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:29:30 [error] client: 1.9.3.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:39:56 [error] client: 9.3.8.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:56:31 [error] client: 5.9.7.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:20:16 [error] client: 1.8.9.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 03:44:09 [error] client: 4.6.6.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:07:22 [error] client: 9.1.9.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:37:42 [error] client: 7.6.9.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:40:54 [error] client: 7.9.3.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:46:02 [error] client: 3.1.8.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 23:25:04 [error] client: 7.2.6.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:12:50 [error] client: 9.1.5.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:37:49 [error] client: 1.7.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 20:07:22 [error] client: 9.3.2.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 03:35:59 [error] client: 4.3.7.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 22:35:45 [error] client: 1.4.6.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:43:38 [error] client: 6.9.3.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:55:26 [error] client: 5.7.1.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 09:49:30 [error] client: 6.9.8.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 10:28:22 [error] client: 5.6.5.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:18:38 [error] client: 8.3.8.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:21:52 [error] client: 9.9.2.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 10:45:39 [error] client: 4.3.5.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 14:59:52 [error] client: 4.4.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:17:58 [error] client: 1.4.7.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:15:22 [error] client: 4.2.2.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 11:26:12 [error] client: 6.2.2.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:41:11 [error] client: 2.4.8.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:34:21 [error] client: 6.1.8.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 03:07:42 [error] client: 9.8.4.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 20:09:31 [error] client: 6.1.2.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:38:35 [error] client: 6.6.5.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:26:29 [error] client: 8.1.2.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:12:03 [error] client: 8.4.2.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:04:31 [error] client: 1.8.3.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:50:01 [error] client: 9.2.1.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 18:17:18 [error] client: 4.2.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:09:47 [error] client: 9.1.6.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 18:24:06 [error] client: 3.6.3.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:58:37 [error] client: 5.6.4.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 08:10:39 [error] client: 9.9.4.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 19:27:15 [error] client: 4.4.1.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 19:04:29 [error] client: 9.9.9.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:23:05 [error] client: 4.1.9.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:54:36 [error] client: 5.1.3.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 10:08:51 [error] client: 6.2.8.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 13:01:41 [error] client: 6.7.7.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:47:39 [error] client: 9.5.7.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:14:12 [error] client: 7.9.9.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 03:13:58 [error] client: 1.7.4.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:34:39 [error] client: 5.9.9.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 11:30:26 [error] client: 2.4.7.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 07:39:37 [error] client: 4.8.2.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:27:04 [error] client: 2.1.1.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 00:14:48 [error] client: 7.8.2.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:11:48 [error] client: 1.3.9.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:31:56 [error] client: 2.5.7.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 19:25:01 [error] client: 7.6.3.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:31:59 [error] client: 6.5.9.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 11:00:40 [error] client: 2.6.9.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 10:43:46 [error] client: 8.4.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:21:06 [error] client: 6.5.7.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:08:22 [error] client: 8.2.9.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 03:26:02 [error] client: 5.4.5.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 22:14:04 [error] client: 2.8.3.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:33:41 [error] client: 3.1.6.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:00:13 [error] client: 4.7.6.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 18:20:35 [error] client: 6.5.8.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:56:44 [error] client: 1.3.2.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:52:35 [error] client: 3.2.4.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:44:58 [error] client: 6.9.9.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 16:38:18 [error] client: 7.3.8.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:14:32 [error] client: 6.6.3.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:48:18 [error] client: 5.2.2.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:39:42 [error] client: 9.5.3.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:21:38 [error] client: 8.8.5.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:16:04 [error] client: 4.5.6.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:40:49 [error] client: 6.6.4.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:31:58 [error] client: 4.8.1.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:31:13 [error] client: 1.9.9.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:14:35 [error] client: 2.1.9.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:08:17 [error] client: 9.3.1.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 02:12:12 [error] client: 1.4.2.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:19:11 [error] client: 3.2.5.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:33:51 [error] client: 6.4.7.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 17:16:45 [error] client: 4.4.6.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:31:28 [error] client: 6.6.4.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:37:52 [error] client: 2.1.1.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 05:15:14 [error] client: 8.5.6.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:37:21 [error] client: 7.1.3.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:37:59 [error] client: 1.6.9.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:15:54 [error] client: 3.2.3.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:57:39 [error] client: 1.4.5.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 13:57:02 [error] client: 9.3.1.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:59:22 [error] client: 4.8.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:56:39 [error] client: 1.8.9.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:49:08 [error] client: 5.6.7.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:32:47 [error] client: 9.6.7.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:37:52 [error] client: 2.2.2.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:59:59 [error] client: 4.8.4.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 23:26:15 [error] client: 7.8.3.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:43:30 [error] client: 5.8.7.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:22:47 [error] client: 8.2.4.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:13:04 [error] client: 1.3.5.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:44:58 [error] client: 9.8.1.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:58:42 [error] client: 9.7.5.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:45:35 [error] client: 7.9.3.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 00:16:19 [error] client: 4.7.9.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:36:40 [error] client: 2.9.3.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:17:52 [error] client: 5.3.8.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:37:17 [error] client: 9.5.4.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:01:03 [error] client: 1.4.7.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 20:53:49 [error] client: 7.3.1.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:16:59 [error] client: 9.3.7.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 23:51:13 [error] client: 1.7.6.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:09:44 [error] client: 4.7.6.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:06:32 [error] client: 9.5.1.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:04:27 [error] client: 3.8.5.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 03:05:08 [error] client: 8.4.3.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:50:11 [error] client: 7.2.7.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:34:47 [error] client: 3.3.8.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:27:10 [error] client: 2.8.1.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 07:12:17 [error] client: 9.8.5.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:56:24 [error] client: 6.9.1.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 07:24:53 [error] client: 1.1.1.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:47:47 [error] client: 2.7.6.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 04:17:50 [error] client: 6.4.8.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 17:41:00 [error] client: 3.7.9.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:28:31 [error] client: 7.4.9.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:57:46 [error] client: 6.5.5.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:29:25 [error] client: 2.6.2.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:45:17 [error] client: 8.6.4.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:15:47 [error] client: 2.2.1.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:58:16 [error] client: 3.9.9.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:59:32 [error] client: 5.8.5.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:32:36 [error] client: 8.3.4.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:46:04 [error] client: 6.7.3.5, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 02:45:42 [error] client: 1.3.6.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:50:57 [error] client: 4.3.3.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 09:54:41 [error] client: 5.2.1.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 02:26:54 [error] client: 6.6.5.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 12:53:42 [error] client: 1.5.3.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 02:21:25 [error] client: 7.5.2.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 09:37:50 [error] client: 1.3.9.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:56:29 [error] client: 3.4.5.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:01:13 [error] client: 3.8.2.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:32:55 [error] client: 2.9.4.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:59:21 [error] client: 5.3.2.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:29:18 [error] client: 6.4.5.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:49:45 [error] client: 8.2.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:15:27 [error] client: 4.5.1.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:23:49 [error] client: 1.2.8.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 06:20:15 [error] client: 9.6.5.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 17:03:57 [error] client: 7.9.2.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 10:48:24 [error] client: 3.5.4.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:56:12 [error] client: 6.5.2.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:42:39 [error] client: 7.9.8.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 09:19:11 [error] client: 9.2.4.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:02:27 [error] client: 9.1.6.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:51:15 [error] client: 7.9.2.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 14:16:08 [error] client: 9.3.6.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 00:56:31 [error] client: 9.5.1.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:20:12 [error] client: 9.5.1.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 05:08:44 [error] client: 1.1.4.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:23:28 [error] client: 5.2.3.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:56:04 [error] client: 5.3.1.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:16:37 [error] client: 2.8.8.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:30:52 [error] client: 7.1.6.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:31:58 [error] client: 6.7.2.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 03:52:38 [error] client: 6.9.7.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:09:21 [error] client: 1.8.3.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:45:43 [error] client: 4.9.1.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 06:18:29 [error] client: 5.2.9.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 01:53:05 [error] client: 5.1.6.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:58:17 [error] client: 6.2.6.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:46:20 [error] client: 2.5.4.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 05:24:13 [error] client: 6.9.7.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 02:20:29 [error] client: 9.8.4.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:26:37 [error] client: 7.2.5.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:49:18 [error] client: 6.7.4.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:58:36 [error] client: 2.3.5.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:41:07 [error] client: 9.3.3.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:26:08 [error] client: 6.4.3.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 12:31:13 [error] client: 3.1.3.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 09:08:50 [error] client: 5.8.9.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:39:36 [error] client: 8.4.8.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 21:29:28 [error] client: 8.7.5.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:23:09 [error] client: 5.9.4.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:53:16 [error] client: 5.7.5.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:41:48 [error] client: 4.7.2.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:41:01 [error] client: 1.1.7.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:32:20 [error] client: 4.2.8.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 13:20:53 [error] client: 1.6.5.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:00:53 [error] client: 3.2.1.9, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 08:53:04 [error] client: 4.9.1.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 14:48:07 [error] client: 7.6.3.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 21:29:47 [error] client: 5.4.8.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 23:49:22 [error] client: 4.1.1.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 03:01:41 [error] client: 5.6.1.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 13:31:03 [error] client: 7.7.3.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:32:13 [error] client: 5.4.1.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:47:05 [error] client: 1.6.8.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:55:33 [error] client: 9.7.3.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 04:44:46 [error] client: 8.2.8.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 22:48:05 [error] client: 7.7.3.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:33:01 [error] client: 3.8.7.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 03:32:11 [error] client: 7.3.8.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:24:31 [error] client: 8.3.4.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 17:03:50 [error] client: 5.8.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:35:59 [error] client: 4.5.7.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 02:20:21 [error] client: 1.6.6.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:19:50 [error] client: 4.7.7.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 01:41:52 [error] client: 9.5.4.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 05:21:17 [error] client: 1.8.8.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:51:06 [error] client: 3.8.9.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:54:20 [error] client: 7.8.6.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:08:31 [error] client: 8.1.5.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:52:44 [error] client: 2.9.3.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 16:00:35 [error] client: 3.3.4.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 06:34:33 [error] client: 9.1.4.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:46:08 [error] client: 2.7.1.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:44:08 [error] client: 5.5.1.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:56:38 [error] client: 5.9.7.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 04:38:14 [error] client: 6.6.3.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:03:52 [error] client: 1.7.5.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:47:41 [error] client: 9.9.6.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:14:34 [error] client: 6.4.8.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:02:20 [error] client: 2.1.1.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 11:49:59 [error] client: 1.1.6.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:59:18 [error] client: 3.6.6.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 02:27:03 [error] client: 6.6.4.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 18:25:18 [error] client: 5.3.5.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 02:14:16 [error] client: 1.1.4.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:57:48 [error] client: 4.3.1.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:59:54 [error] client: 4.2.2.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 11:28:24 [error] client: 8.1.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 05:04:18 [error] client: 6.2.6.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:32:57 [error] client: 1.5.9.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:27:56 [error] client: 9.9.9.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:16:44 [error] client: 3.8.1.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:22:25 [error] client: 9.1.5.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:44:30 [error] client: 7.1.9.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 07:12:30 [error] client: 5.6.7.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:26:44 [error] client: 7.8.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 15:46:21 [error] client: 8.2.1.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:16:58 [error] client: 2.2.9.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:36:00 [error] client: 1.5.1.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:46:10 [error] client: 5.5.7.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 10:10:28 [error] client: 8.4.2.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:25:45 [error] client: 4.4.3.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 12:40:13 [error] client: 1.2.5.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:47:42 [error] client: 2.6.6.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 06:34:36 [error] client: 9.9.6.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 14:36:09 [error] client: 8.5.1.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 14:37:28 [error] client: 3.7.4.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:05:28 [error] client: 4.5.4.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 19:49:34 [error] client: 4.2.8.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:09:45 [error] client: 9.2.1.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 22:08:17 [error] client: 9.1.5.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:38:40 [error] client: 9.9.4.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:26:43 [error] client: 1.5.4.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 18:51:57 [error] client: 1.4.3.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:27:06 [error] client: 6.1.5.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 08:47:03 [error] client: 2.9.2.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 02:23:41 [error] client: 4.4.5.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:20:01 [error] client: 8.1.2.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:24:13 [error] client: 6.4.9.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:48:49 [error] client: 6.1.4.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:11:28 [error] client: 9.7.8.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 07:45:27 [error] client: 3.6.1.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 05:15:25 [error] client: 1.4.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:19:22 [error] client: 7.5.2.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 23:05:53 [error] client: 2.5.7.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 01:02:12 [error] client: 8.9.3.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 15:49:46 [error] client: 4.1.8.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 03:02:23 [error] client: 6.6.1.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 09:31:34 [error] client: 5.8.1.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 00:38:29 [error] client: 5.8.5.4, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:52:40 [error] client: 5.7.8.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 17:46:01 [error] client: 4.2.1.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 13:59:13 [error] client: 1.4.2.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:57:23 [error] client: 7.4.2.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:26:49 [error] client: 6.9.5.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 14:23:30 [error] client: 4.1.5.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 01:41:27 [error] client: 6.4.9.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 17:02:59 [error] client: 6.8.3.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 23:33:45 [error] client: 2.4.7.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 01:12:44 [error] client: 4.8.8.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:58:48 [error] client: 2.8.8.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:52:02 [error] client: 6.5.4.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:40:08 [error] client: 2.9.3.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 18:05:22 [error] client: 4.9.4.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:08:33 [error] client: 4.7.6.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 08:43:50 [error] client: 4.9.8.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:07:10 [error] client: 7.7.6.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:44:58 [error] client: 4.9.3.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 03:17:39 [error] client: 6.7.9.5, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 02:15:40 [error] client: 4.8.8.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 22:13:11 [error] client: 6.8.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:02:02 [error] client: 7.9.3.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 02:34:34 [error] client: 9.7.6.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:42:14 [error] client: 6.4.7.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 23:45:24 [error] client: 8.8.7.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:56:14 [error] client: 1.2.6.2, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 02:56:51 [error] client: 2.4.5.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:32:04 [error] client: 3.8.5.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 21:29:40 [error] client: 5.1.1.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:28:22 [error] client: 2.9.5.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:39:35 [error] client: 9.6.7.8, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 23:08:32 [error] client: 7.9.6.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 11:33:50 [error] client: 7.8.5.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:26:25 [error] client: 7.5.5.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:07:59 [error] client: 8.4.4.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:18:48 [error] client: 8.3.2.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 04:45:40 [error] client: 3.7.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:00:21 [error] client: 8.3.2.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:42:39 [error] client: 5.7.4.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 14:35:00 [error] client: 4.3.5.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 09:15:18 [error] client: 9.4.3.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:07:58 [error] client: 2.5.7.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:39:23 [error] client: 5.9.5.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:17:08 [error] client: 4.3.7.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 07:56:19 [error] client: 2.2.1.7, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 20:12:59 [error] client: 2.3.3.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 15:21:34 [error] client: 8.4.9.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 22:46:46 [error] client: 8.6.7.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 23:39:57 [error] client: 9.5.7.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 21:36:09 [error] client: 6.6.2.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:41:49 [error] client: 1.9.2.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:22:59 [error] client: 2.4.8.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 22:09:16 [error] client: 1.4.9.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:22:13 [error] client: 7.3.3.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:00:27 [error] client: 9.7.2.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 04:43:41 [error] client: 7.8.7.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 09:52:03 [error] client: 7.7.4.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 13:09:31 [error] client: 5.2.8.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 14:14:14 [error] client: 2.8.2.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 22:34:09 [error] client: 9.3.6.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:36:14 [error] client: 8.5.4.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 13:37:59 [error] client: 5.2.2.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:30:17 [error] client: 5.2.1.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 14:23:59 [error] client: 2.3.6.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:06:15 [error] client: 5.5.1.3, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 19:28:30 [error] client: 2.6.3.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 17:10:27 [error] client: 3.4.1.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 10:31:25 [error] client: 9.7.9.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 05:47:15 [error] client: 8.7.3.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 08:45:12 [error] client: 9.8.5.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 08:52:03 [error] client: 6.8.6.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 13:09:32 [error] client: 6.2.2.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 20:04:29 [error] client: 4.7.6.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:28:36 [error] client: 6.9.7.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 16:43:56 [error] client: 3.7.4.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 15:53:32 [error] client: 7.5.4.8, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 09:22:15 [error] client: 5.8.7.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 04:23:31 [error] client: 4.3.9.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 05:18:49 [error] client: 1.9.9.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 13:00:01 [error] client: 3.5.9.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:22:16 [error] client: 9.1.6.3, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 22:15:10 [error] client: 9.4.9.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 08:44:31 [error] client: 2.3.3.6, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 01:30:36 [error] client: 5.5.1.6, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:47:23 [error] client: 3.1.1.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 03:55:43 [error] client: 8.9.8.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:12:46 [error] client: 5.4.6.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 22:25:18 [error] client: 6.9.5.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:29:28 [error] client: 8.6.3.2, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:31:04 [error] client: 3.3.5.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 19:12:33 [error] client: 9.8.1.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 15:17:32 [error] client: 9.3.3.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 00:13:41 [error] client: 9.7.2.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 15:25:03 [error] client: 8.9.2.5, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 18:21:31 [error] client: 6.2.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 05:05:49 [error] client: 7.4.6.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 16:30:02 [error] client: 7.6.7.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 15:31:23 [error] client: 7.5.2.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 21:37:53 [error] client: 7.1.2.8, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 08:29:27 [error] client: 2.3.4.6, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 00:17:07 [error] client: 3.2.7.1, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:30:14 [error] client: 6.5.4.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:20:40 [error] client: 9.6.8.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 09:12:17 [error] client: 6.4.5.5, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:00:43 [error] client: 1.4.9.2, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:07:34 [error] client: 3.7.4.1, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 22:46:22 [error] client: 6.7.5.9, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:15:26 [error] client: 4.6.3.4, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 22:01:32 [error] client: 7.3.7.6, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 10:18:41 [error] client: 7.4.3.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 20:48:17 [error] client: 6.8.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 03:19:10 [error] client: 2.8.7.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 22:32:25 [error] client: 2.1.5.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 12:55:32 [error] client: 9.7.6.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 20:55:43 [error] client: 9.4.6.3, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 09:07:14 [error] client: 1.6.7.8, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 03:30:28 [error] client: 7.7.5.3, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 01:30:49 [error] client: 6.1.2.9, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:40:25 [error] client: 5.8.4.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 19:59:59 [error] client: 6.7.3.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 06:57:56 [error] client: 3.1.6.1, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 01:56:39 [error] client: 7.4.4.9, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:29:29 [error] client: 6.6.5.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 12:32:58 [error] client: 2.4.2.2, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 10:24:39 [error] client: 1.5.8.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 00:05:31 [error] client: 4.7.3.7, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:42:07 [error] client: 2.1.3.7, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 19:57:36 [error] client: 4.5.1.8, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:58:05 [error] client: 1.7.9.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 07:32:47 [error] client: 7.4.4.2, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 12:19:34 [error] client: 8.5.2.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 11:20:30 [error] client: 9.8.2.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 23:59:04 [error] client: 5.1.5.8, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 00:11:38 [error] client: 6.8.3.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 08:59:51 [error] client: 5.1.1.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:25:10 [error] client: 9.2.6.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:28:43 [error] client: 9.1.2.6, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 16:56:48 [error] client: 4.1.2.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/15 19:34:30 [error] client: 1.8.8.5, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/15 14:57:56 [error] client: 7.7.6.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/15 21:13:42 [error] client: 2.5.1.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:53:31 [error] client: 6.5.2.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 03:30:47 [error] client: 3.8.2.3, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 16:23:50 [error] client: 1.7.2.4, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 11:51:37 [error] client: 7.2.3.5, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 04:13:19 [error] client: 4.7.8.1, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/16 02:20:27 [error] client: 8.6.2.2, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 12:14:54 [error] client: 1.4.5.7, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 13:48:09 [error] client: 4.5.4.4, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +2023/01/15 18:08:19 [error] client: 7.3.4.1, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/16 11:32:21 [error] client: 3.3.6.4, server: example.com "GET /img/close.png HTTP/1.1" +2023/01/16 06:29:42 [error] client: 1.9.2.9, server: example.com "GET /apple-touch-icon-precomposed.png HTTP/1.1" +2023/01/15 20:57:36 [error] client: 4.7.1.4, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 09:42:59 [error] client: 6.5.8.3, server: example.com "GET /phone/images/icon_01.png HTTP/1.1" +2023/01/16 01:30:29 [error] client: 3.1.8.9, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/export.parquet b/docs/ja/integrations/data-ingestion/data-formats/assets/export.parquet new file mode 100644 index 00000000000..eb83250bfc9 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/export.parquet differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/html.results b/docs/ja/integrations/data-ingestion/data-formats/assets/html.results new file mode 100644 index 00000000000..fdc03901e52 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/html.results @@ -0,0 +1,14 @@ +

Top 10 IPs

+ + + +${data} +
IPRequests
+ +

Query information

+
+
Rows read
+
${rows_read:Escaped}
+
Time spent
+
${time:Escaped}
+
diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/html.row b/docs/ja/integrations/data-ingestion/data-formats/assets/html.row new file mode 100644 index 00000000000..449fba0b9bc --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/html.row @@ -0,0 +1,4 @@ + + ${ip:Escaped} + ${total:Escaped} + \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/list-nested.json b/docs/ja/integrations/data-ingestion/data-formats/assets/list-nested.json new file mode 100644 index 00000000000..7bf195ba46c --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/list-nested.json @@ -0,0 +1,29 @@ +[ + { + "page": { + "path": "Akiba_Hebrew_Academy", + "title": "Akiba Hebrew Academy", + "owner_id": 12 + }, + "month": "2017-08-01", + "hits": 241 + }, + { + "page": { + "path": "Aegithina_tiphia", + "title": "Aegithina Tiphia", + "owner_id": 3 + }, + "month": "2018-02-01", + "hits": 34 + }, + { + "page": { + "path": "1971-72_Utah_Stars_season", + "title": "Utah Stars: 71/72 season", + "owner_id": 432 + }, + "month": "2016-10-01", + "hits": 1 + } +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/list.json b/docs/ja/integrations/data-ingestion/data-formats/assets/list.json new file mode 100644 index 00000000000..7c749a3a7b9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/list.json @@ -0,0 +1,17 @@ +[ + { + "path": "Akiba_Hebrew_Academy", + "month": "2017-08-01", + "hits": 241 + }, + { + "path": "Aegithina_tiphia", + "month": "2018-02-01", + "hits": 34 + }, + { + "path": "1971-72_Utah_Stars_season", + "month": "2016-10-01", + "hits": 1 + } +] diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/mysql.sql b/docs/ja/integrations/data-ingestion/data-formats/assets/mysql.sql new file mode 100644 index 00000000000..527c20d94d0 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/mysql.sql @@ -0,0 +1,51 @@ +-- MySQL dump 10.13 Distrib 8.0.31, for Linux (x86_64) +-- +-- Host: localhost Database: test +-- ------------------------------------------------------ +-- Server version 8.0.31-0ubuntu0.22.04.1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `some_table` +-- + +DROP TABLE IF EXISTS `some_table`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `some_table` ( + `path` varchar(255) DEFAULT NULL, + `month` date DEFAULT NULL, + `hits` int unsigned DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `some_table` +-- + +LOCK TABLES `some_table` WRITE; +/*!40000 ALTER TABLE `some_table` DISABLE KEYS */; +INSERT INTO `some_table` VALUES ('Bangor_City_Forest','2015-07-01',34),('Alireza_Afzal','2017-02-01',24),('Akhaura-Laksam-Chittagong_Line','2015-09-01',30),('1973_National_500','2017-10-01',80),('Attachment','2017-09-01',1356),('Kellett_Strait','2017-01-01',5),('Ajarani_River','2018-01-01',30),('Akbarabad,_Khomeyn','2017-03-01',8),('Adriaan_Theodoor_Peperzak','2018-02-01',88),('Alucita_dryogramma','2015-09-01',1),('Brit_Med_J','2015-07-01',1),('4th_Metro_Manila_Film_Festival','2015-09-01',80),('Alialujah_Choir','2018-03-01',221),('1953-54_SM-sarja_season','2016-09-01',1),('Air_Force_Song','2018-02-01',19),('4-6_duoprism','2016-03-01',30),('Ashley_Spurlin','2017-06-01',94),('Asfaq_Kayani','2017-10-01',1),('1607_in_architecture','2016-06-01',7),('4-way_speakers','2015-10-01',2),('Blue_Heeler','2015-07-01',149),('5_Euro','2017-04-01',16),('2009_Spa-Francorchamps_GP2_Series_round','2016-04-01',12),('2015_Guru_Granth_Sahib_desecration','2015-11-01',6821),('Agriculture_Marketing_Service','2016-07-01',2),('2006_Football_League_Cup_Final','2015-11-01',1711),('2008_Uber_Cup_group_stage','2016-02-01',40),('1923_PGA_Championship','2016-08-01',97),('Fannie_Bay','2016-04-01',6),('AlchemyAPI','2016-04-01',344),('Cinema_of_Italy','2017-01-01',1217),('Arodes','2016-11-01',36),('Damien_Marley','2015-07-01',168),('Al_Jumayl_Baladiyat','2015-08-01',5),('2015_Alabama_State_Hornets_football_team','2017-06-01',32),('Aglossa_tanya','2016-03-01',1),('73rd_Pennsylvania_Infantry','2017-01-01',12),('2015_European_Junior_and_U23_Canoe_Slalom_Championships','2018-02-01',31),('African_Leopard','2016-08-01',64),('Faverolles,_Orne','2017-01-01',5),('Aaron_Fukuhara','2015-11-01',17),('Annular_ligaments_of_trachea','2017-01-01',31),('2014_US_Open_Series','2016-11-01',35),('A_Better_Mousetrap','2018-02-01',4),('Dibaklu','2016-11-01',1),('At_Samat_District','2015-06-01',35),('Aaron_Peasley','2017-05-01',32),('Apistomology','2015-12-01',2),('Buyat_Bay','2015-07-01',54),('1942_Estonian_Football_Championship','2017-05-01',22),('Action_for_Autism','2016-06-01',346),('100_Hz','2015-06-01',72),('2003_Arizona_State_Sun_Devils_football_team','2017-05-01',82),('Antona_obscura','2016-09-01',1),('Akiko_Sugiyama','2015-12-01',32),('Elysburg','2016-11-01',8),('2017_New_South_Wales_Cup','2017-09-01',38),('2011-12_Gold_Coast_United_FC_season','2017-06-01',1),('Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean','2016-04-01',15),('Albert_Dunn','2017-08-01',87),('Hahamakin_ang_Lahat','2017-01-01',984),('2013_Spuyten_Duyvil_derailment','2017-11-01',5),('Ayling','2017-01-01',5),('Anti-Establishment','2016-10-01',1),('1951_Spanish_motorcycle_Grand_Prix','2018-01-01',48),('2009-10_Brunei_Premier_League','2017-08-01',4),('23_Ursae_Majoris','2016-08-01',90),('1927-28_Austrian_football_championship','2017-08-01',4),('Andrew_McKeever','2017-10-01',3),('Clinocottus','2017-06-01',23),('2006_State_of_Origin','2015-11-01',7),('2013-14_Los_Angeles_Clippers_season','2015-07-01',8),('Cor_Jesu','2017-01-01',1),('Besseringen_B-Werk','2017-06-01',158),('Amy_Hempel','2017-07-01',1091),('Franc-Comtois','2016-04-01',2),('Allium_giganteum','2017-07-01',1103),('Abishai','2016-08-01',56),('Abraham_Clark_High_School','2016-04-01',88),('Baku_chronology','2015-06-01',1),('22nd_MEU','2015-10-01',39),('2015_Open_Engie_de_Touraine','2015-10-01',195),('Churchill_Bowl','2017-06-01',30),('AGMARK','2017-08-01',117),('American_standard_wire_gauge','2017-12-01',3),('Araby,_LA','2015-05-01',2),('217_BC','2016-12-01',202),('2008_Trinidad_and_Tobago_League_Cup','2016-02-01',6),('Alazan_Bay','2015-12-01',22),('Aluminum_fencing','2015-11-01',48),('Achilles_tendinitis','2016-10-01',5884),('AFP_Peacekeeping_Operations_Center','2017-01-01',64),('2013_Xinjiang_clashes','2016-01-01',1),('Arborea_Giudicato_of_Arborea','2015-09-01',3),('1941_Cleveland_Rams_season','2017-06-01',40),('Ju_Posht,_Rasht','2017-01-01',3),('Ascalenia','2016-07-01',10),('Aplectoides','2018-02-01',4),('European_Cup_1969-70','2016-11-01',14),('Armen_Mkertchian','2016-05-01',9),('2015_Aspria_Tennis_Cup_-_Singles','2018-02-01',1),('14_August_1947','2017-11-01',6),('Adobe_Creative_Suite_1','2015-05-01',1),('IC_chips','2017-01-01',2),('Austo_AE300','2016-07-01',4),('Date_palms','2015-07-01',79),('BCS_bowl_game','2017-06-01',13),('AR_Border','2017-06-01',1),('Aranda_de_Duero','2016-04-01',256),('1919_Wake_Forest_Demon_Deacons_football_team','2016-01-01',16),('All_The_Wrong_Clues_For_The_Right_Solution','2017-10-01',9),('Allan_Campbell_McLean','2015-06-01',131),('Bradford_Council_election,_2011','2017-06-01',5),('Astronomy_and_astrophysics','2015-09-01',62),('Dutch_Antillean_people','2015-07-01',57),('Army_Radio','2018-03-01',711),('BBVA_Bancomer','2016-11-01',709),('Lake_Aloha','2017-01-01',30),('Andy_Bean','2018-02-01',3092),('1941_Pittsburgh_Steelers_season','2016-05-01',147),('Aniopi_Melidoni','2016-06-01',4),('Aglossosia_fusca','2017-09-01',3),('Art_books','2017-04-01',36),('1929_Washington_Senators_season','2017-04-01',47),('Antaeotricha_congelata','2016-12-01',10),('Douglas_C-54G-5-DO_Skymaster','2017-01-01',1),('Chris_Jamison','2016-11-01',827),('Ace_Blackwell','2015-11-01',9),('Abdul_Qadir_Fitrat','2018-02-01',32),('Arnoldo_Vizcaino','2017-10-01',1),('2012_Open_EuroEnergie_de_Quimper_-_Doubles','2017-12-01',3),('Dale_Rominski','2017-01-01',7),('ADHD_coaching','2015-06-01',50),('Claire_Yiu','2016-11-01',209),('Applicant','2015-10-01',253),('Apache_OpenOffice','2017-06-01',6031),('Abel_Kiprop_Mutai','2015-09-01',22),('Airdrome_Taube','2017-04-01',46),('Andrey_Viktorovich','2016-06-01',1),('American_Idol_controversy','2016-03-01',36),('Anthrenocerus_confertus','2018-01-01',17),('Appraisal_Subcommittee','2018-03-01',17),('Babusa','2015-07-01',3),('500_homeruns','2016-06-01',1),('Argentina_national_volleyball_team','2016-08-01',64),('Chief_prosecutor_of_Russia','2015-07-01',1),('Absolution_DVD','2015-06-01',1),('1,3-Beta-glucan_synthase','2017-05-01',440),('Dave_Sinardet','2016-04-01',26),('Adeline_Whitney','2018-03-01',10),('Allon_shvut','2016-07-01',3),('2012_Penn_State_Nittany_Lions_football_season','2017-12-01',3),('Coleman-Franklin-Cannon_Mill','2017-01-01',4),('Action_director','2015-05-01',93),('AD_547','2016-01-01',1),('Acta_germanica','2017-09-01',1),('Abu_Dhabi_Global_Market_Square','2017-01-01',35),('Kozo_Shioya','2017-01-01',7),('China_Investment_Corp','2017-01-01',2),('Dmitri_Zakharovich_Protopopov','2016-04-01',129),('Anatra_Anadis','2017-10-01',208),('Archaikum','2017-11-01',5),('2000_Webby_Awards','2017-04-01',360),('2003_BCR_Open_Romania_-_Singles','2016-08-01',2),('Abacetus_bisignatus','2016-09-01',79),('American_school_of_kinshasa','2016-01-01',1),('Anna,_7th_Duchess_of_Bedford','2016-08-01',8),('Black_majority_district','2016-11-01',3),('Dagma_Lahlum','2015-07-01',1),('Credit_Saison','2015-07-01',517),('Ariyankuppam_firka','2016-02-01',19),('Annette_Fuentes','2016-06-01',17),('Angerstein,_John','2015-12-01',2),('Annenkov_Island','2016-03-01',280),('Anne_Frank_museum','2016-06-01',67),('Annales_sancti_Amandi','2017-06-01',22),('L-FABP','2017-01-01',1),('Alvord,_TX','2017-06-01',12),('2006_World_Team_Table_Tennis_Championships','2016-05-01',119),('Angriffen','2015-12-01',9),('Anthony_Oppenheimer','2017-03-01',452),('Absamat_Masaliyevich_Masaliyev','2016-09-01',1),('Airborne_Museum_at_Aldershot','2016-03-01',41),('Aktiubinsk_Oblast','2015-08-01',7),('100_East_Wisconsin','2015-05-01',782),('7th_Bangladesh_National_Film_Awards','2017-08-01',91),('Alejandro_Reyes','2017-12-01',35),('Applied_philosophy','2018-03-01',539),('Adhemar_Pimenta','2016-06-01',146),('Break_the_fourth_wall','2016-04-01',66),('Annoushka_Ducas','2017-10-01',411),('ATC_code_J01CA01','2015-06-01',1),('Evelyn_County,_New_South_Wales','2016-11-01',7),('Elastic_scattering','2016-11-01',1374),('1032_Pafuri','2015-07-01',35),('Andrew_Bromwich','2015-08-01',26),('Ishita_Arun','2017-01-01',249),('Aspergics','2016-07-01',1),('1857_in_Chile','2018-03-01',22),('Breffni','2015-07-01',38),('845_in_poetry','2017-08-01',2),('20321_Lightdonovan','2015-10-01',12),('Arthur_Chandler','2017-12-01',27),('CsISOLatin2','2017-06-01',1),('1900_Grand_National','2016-06-01',69),('Aeritalia_AMX','2017-03-01',3),('B_Sharps','2015-06-01',11),('544_area_code','2015-09-01',2),('30th_Guldbagge_Awards','2015-06-01',37),('Agrippina','2017-08-01',315),('Ardmore','2016-02-01',433),('Amplypterus_panopus','2016-03-01',23),('Alexander_Bukharov','2017-09-01',5),('Alaska_Raceway_Park','2017-01-01',46),('Albanian_National_Road_Race_Championships','2017-03-01',31),('1968_Democratic_National_Convention_protest_activity','2017-10-01',2802),('2012_Birthday_Honours','2017-10-01',427),('2000_NHL_expansion_draft','2017-06-01',1),('A_Town_Where_You_Live','2016-11-01',2920),('Ahmed_Shahzad','2018-03-01',25),('Elisabeth_Svendsen','2016-11-01',39),('2002_FINA_Synchronised_Swimming_World_Cup','2016-08-01',30),('Akatek','2017-04-01',10),('Animation_with_DAZ_Studio','2018-02-01',78),('Fergus_Craig','2016-11-01',119),('Ancel_Nalau','2015-11-01',5),('5171_Augustesen','2017-04-01',20),('Anne_McGuire','2017-11-01',329),('Australian_Photoplay_Company','2015-12-01',6),('1913_in_Canada','2017-04-01',137),('Arhopala_allata','2015-05-01',26),('Il_Paradiso_delle_Signore','2017-01-01',31),('Geri_Palast','2017-01-01',38),('Alan_Abela_Wadge','2017-03-01',77),('22nd_Tactical_Air_Support_Squadron','2017-10-01',7),('Avant_Stellar','2017-06-01',22),('Black_phantom_tetra','2016-11-01',205),('Billy_McCaffrey','2017-01-01',314),('Annie_Furuhjelm','2017-11-01',97),('1992_PGA_Tour','2017-12-01',307),('2008_Chilean_pork_crisis','2016-01-01',55),('2012_Currie_Cup_First_Division','2018-02-01',32),('Aleksei_Fomkin','2015-05-01',144),('Alexander_Krausnick-Groh','2016-05-01',101),('Adam_Richard_Wiles','2017-08-01',5),('ATCvet_code_QA01AD01','2015-09-01',2),('Abu_Bakr_Ibn_Bajja','2017-03-01',5),('Architecture-Studio','2016-04-01',94),('950s_BC','2016-02-01',257),('Abschwunges','2017-07-01',1),('Adonis_Geroskipou','2017-06-01',15),('2008-09_SV_Werder_Bremen_season','2016-03-01',3),('Closed_loops','2016-04-01',1),('AFC_Youth_Championship_1982','2015-12-01',10),('Aquila_Shoes','2015-08-01',209),('9842_Funakoshi','2017-12-01',11),('Educational_quotient','2016-04-01',21),('Antoni_Julian_Nowowiejski','2018-01-01',211),('Adi_Oka_Idhile','2017-11-01',16),('DEXIA-BIL_Luxembourg_Open','2016-11-01',3),('Andrew_James_Simpson','2016-03-01',43),('Alexander_Boksenberg','2017-12-01',61),('1827_in_Denmark','2017-03-01',39),('Afternoon_tea_with_suggs','2017-11-01',3),('Alpha,_MN','2017-06-01',6),('Ari_Onasis','2015-06-01',4),('1961-62_Football_League_First_Division','2015-11-01',1),('Andi_Lila','2015-06-01',2847),('A_Gathering_Of_Old_Men','2018-02-01',1),('Abul_Fazl_al-Abbas','2017-01-01',1),('Asgill,_Charles','2017-08-01',1),('Alexander_Arkhangelsky','2015-07-01',12),('1947-48_Portuguese_Liga','2015-06-01',1),('3rd_MMC_-_Varna','2016-07-01',3),('Alberts,_Wayne','2017-05-01',3),('Alois_Schickelgruber','2018-02-01',9),('Hefner_Stadium','2017-01-01',2),('410912_Lisakaroline','2018-02-01',26),('Academy_at_Mountain_State','2018-03-01',1),('617_Squadron','2016-05-01',489),('Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji','2015-07-01',5),('Arturo_Merino_Benitez_Airport','2017-10-01',13),('AEK_Athens_Futsal','2015-06-01',10),('Aggaeus','2018-02-01',2),('Association_for_Retarded_Citizens_of_the_United_States','2017-08-01',3),('Kielce_pogrom','2017-01-01',335),('1351_in_poetry','2016-01-01',17),('1923_Princeton_Tigers_football_team','2017-11-01',41),('Auzata_semipavonaria','2017-01-01',2),('892_in_poetry','2016-01-01',6),('Anton_Krotiak','2017-12-01',2),('Arthur_Shelley','2017-12-01',23),('2003_Kyoto_Purple_Sanga_season','2018-02-01',9),('Frederic_Bowker_Terrington_Carter','2016-04-01',6),('2-orthoplex','2016-03-01',1),('Acacia_australiana','2015-09-01',4),('2012_Newcastle_Knights_season','2016-06-01',103),('Ann_Wrights_Corner,_Virginia','2017-07-01',19),('12557_Caracol','2017-03-01',5),('2001_African_Footballer_of_the_Year','2017-05-01',1),('Bass_Pyramid','2017-01-01',22),('A_noodle','2015-05-01',5),('Aed_Bennan','2018-02-01',2),('1886_Yale_Bulldogs_football_team','2017-10-01',58),('2002_Players_Championship','2016-06-01',54),('African_Skimmer','2017-07-01',2),('3rd_Guldbagge_Awards','2016-12-01',39),('Arrows_A19B','2015-10-01',1),('Archduchess_Elisabetta_of_Austria-Este','2017-08-01',1526),('America_Islands','2015-11-01',1),('1932_Olympic_Games','2016-01-01',9),('2011_Chinese_pro-democracy_protests','2015-11-01',2044),('Bank_walkaway','2016-04-01',113),('594_in_Ireland','2017-04-01',1),('Association_of_Municipal_Corporations','2016-12-01',5),('Andreas_Brantelid','2015-09-01',167),('Amarthal_urf_Unchagaon','2017-05-01',82),('3-methoxymorphinan','2017-04-01',146),('2382_BC','2016-07-01',10),('1763_in_science','2016-07-01',28),('Arvert','2017-04-01',77),('Ale_yeast','2017-12-01',19),('A_Man_Without_a_Soul','2018-03-01',17),('Air_Force_Base_Louis_Trichardt','2017-09-01',1),('Athirson_Mazzoli_de_Oliveira','2017-06-01',3),('Anthony_Chan_Yau','2017-07-01',181),('Basic_Enlisted_Submarine_School','2017-06-01',392),('Aboriginal_Lands_of_Hawaiian_Ancestry','2015-09-01',11),('Fondren_Southwest,_Houston','2017-01-01',4),('3_World_Financial_Center','2017-07-01',64),('1971_IIHF_European_U19_Championship','2017-09-01',9),('1937-38_Allsvenskan','2015-12-01',6),('Christopher_Ashton_Kutcher','2017-06-01',2),('Australian_rules_football_in_south_australia','2016-12-01',1),('Amicable_pair','2018-01-01',7),('Alan_Tomes','2015-11-01',82),('Alexei_Petrovich,_Tsarevich_of_Russia','2015-12-01',3887),('Alexis_Damour','2015-10-01',66),('Bankruptcy_Act_of_1938','2017-06-01',76),('Amphiphyllum','2016-06-01',14),('Conway_High_School_West','2016-04-01',1),('5447_Lallement','2015-11-01',10),('Gabriel_Iddan','2017-01-01',1),('1879-80_Scottish_Cup','2017-04-01',3),('2011_Eneco_Tour','2016-10-01',31),('1471_in_England','2015-11-01',94),('Ashland_Town_Hall','2017-01-01',5),('Archduke_John','2015-05-01',20),('2000_Cameroonian_Premier_League','2017-09-01',18),('1997_flood','2017-11-01',5),('Agile_management','2015-09-01',26677),('Am_841','2017-12-01',3),('Apprentice_Mason','2018-01-01',4),('Hales-Jewett_theorem','2017-01-01',2),('Alien_Abductions','2017-10-01',14),('Arjun_Menon','2016-02-01',370),('Anthokyan','2016-01-01',4),('Automobili_Lamborghini','2016-02-01',1110),('Alain_Prost','2017-04-01',25196),('Fartein_Valen','2016-04-01',90),('Antonio_Galli_da_Bibiena','2016-05-01',5),('Al_Jawf,_Libya','2017-03-01',600),('AD_695','2018-02-01',1),('Amir_chand','2015-11-01',1),('Alcis_obliquisigna','2017-08-01',1),('Chandra_Talpade_Mohanty','2017-01-01',306),('Algerian_safe_house,_Jalalabad','2015-06-01',3),('Jake_Milner','2017-01-01',1),('Alternate_Communications_Center','2017-10-01',1),('In_the_Bleachers','2017-01-01',42),('Alex_Puodziukas','2016-04-01',7),('Altarpiece_of_Pilgrim_II','2018-02-01',2),('Cybernetical_Physics','2017-01-01',3),('Christopher_Unthank','2017-06-01',2),('1982_Independence_Bowl','2015-06-01',102),('Ascoli_Calcio_1898','2018-03-01',1115),('Briggs-Rauscher_reactions','2017-06-01',1),('Adjadja','2018-02-01',45),('Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed','2016-06-01',3),('Catholic_social_doctrine','2017-01-01',6),('2833_BC','2016-11-01',1),('Bethy_Woodward','2016-04-01',38),('Bateman_polynomials','2017-06-01',22),('1966_Buenos_Aires_Grand_Prix','2015-10-01',19),('A_River_Somewhere','2015-10-01',353),('2016-17_BVIFA_National_Football_League','2017-04-01',2),('1909_Major_League_Baseball_season','2015-10-01',362),('1988_Oklahoma_Sooners_football','2017-11-01',2),('2010s_in_Chechen_fashion','2016-10-01',1),('Accademia_Olimpica','2017-08-01',17),('Air_cooling','2015-07-01',2010),('Amir_Saoud','2016-11-01',22),('Alex_Auburn','2015-05-01',52),('Apamea_impulsa','2016-11-01',6),('Australian_federal_election,_2007','2015-07-01',1794),('Ain_Sakhri','2017-10-01',76),('Belosaepiidae','2015-07-01',68),('Acts_of_Parliament_in_the_United_Kingdom','2017-10-01',4070),('Equity_Office','2016-11-01',202),('David_Bintley','2017-01-01',51),('Aksel_Schiotz','2018-03-01',3),('Appropriation_Act_2000','2017-05-01',12),('Edward_Johnson_III','2016-11-01',491),('2006_Ohio_State_Buckeyes_football_team','2016-03-01',1452),('Battle_of_Fort_Beausejour','2015-07-01',97),('Abel_Foullon','2015-12-01',82),('Apollo_VIII','2015-10-01',19),('Carry_on_up_the_jungle','2015-07-01',8),('Armour_villa','2017-05-01',4),('201_Poplar','2015-08-01',265),('Arta_prefecture','2016-08-01',1),('2015-16_Ekstraklasa','2018-02-01',13),('Alport,_Ontario','2018-02-01',2),('Bongoland','2017-06-01',62),('Alfred_Charles_Post','2016-11-01',11),('Aam_Aadmi_Party_crisis','2016-10-01',1),('Andrea_Moda','2015-07-01',143),('Abdul_Halim_Sharar','2017-08-01',545),('Apostolic_Vicariate_of_Yunnan','2016-12-01',1),('Catherine_Steadman','2016-11-01',5218),('Agastachys_odorata','2015-10-01',38),('9783_Tensho-kan','2016-03-01',2),('AFL_Cairns','2017-10-01',337),('Abomey','2015-06-01',1062),('Anne_Crofton,_1st_Baroness_Crofton','2015-12-01',42),('Cash-flow_return_on_investment','2017-01-01',137),('Alberto_Arvelo_Torrealba_Municipality','2015-08-01',56),('Abyssinian_Shorthorned_Zebu','2017-09-01',124),('Albanian_hip_hop','2016-01-01',1812),('Alphonso_IV_of_Portugal','2016-02-01',12),('19th_The_Alberta_Mounted_Rifles','2016-10-01',1),('Chinese_shadow_theatre','2016-04-01',1),('American_Committee_of_the_Fourth_International','2017-08-01',4),('2014_Bahrain_GP2_Series_round','2016-03-01',80),('Alexandrian_orthodox','2017-09-01',2),('2010_Hurricane_Season','2015-05-01',18),('1938_All-Ireland_Senior_Camogie_Championship_Final','2017-01-01',1),('ATC_code_D01','2018-01-01',203),('Albedo','2015-08-01',23484),('Chavigny,_Meurthe-et-Moselle','2017-01-01',12),('Becky_Essex','2015-07-01',51),('Archaeological_Museum_Padre_Le_Paige','2018-02-01',2),('Abu_Bakar_Sillah','2017-01-01',5),('Back_chat','2017-01-01',2),('Anchylobela_dyseimata','2015-12-01',11),('Anthony_Overton','2017-03-01',261),('Bear_maul','2016-04-01',3),('Ambarawa,_Central_Java','2016-01-01',1),('Amber_lager','2016-11-01',87),('2nd_LAAD','2017-09-01',8),('Ashiya,_Hyogo','2018-03-01',24),('Angels_at_Risk','2018-02-01',74),('Audrey_Marie_Munson','2016-03-01',17),('1984_Australian_Football_Championships','2017-01-01',27),('Ammonia_fountain','2016-06-01',434),('Allister_Bentley','2018-03-01',11),('Alsager_Hay_Hill','2016-10-01',72),('1753_English_cricket_season','2015-05-01',51),('2009-10_New_Jersey_Devils_season','2016-10-01',1),('An_Untamed_State','2016-05-01',1109),('Beatrice_Carmichael','2016-11-01',5),('Abdul_Ghani_Ahmad','2017-12-01',115),('Arteria_suralis','2017-02-01',3),('Berzasca_River','2017-01-01',1),('Angel_Attack','2015-09-01',98),('1969_San_Francisco_49ers_football_team','2017-11-01',1),('Anthony_Beilenson','2017-09-01',114),('Crystalline_Entity','2016-04-01',180),('Granice','2017-01-01',2),('203rd_General_Hospital','2017-07-01',44),('Acrocercops_rhombiferellum','2017-12-01',20),('Ampliglossum_blanchetii','2017-05-01',1),('11553_Scheria','2017-03-01',2),('Ashkenozi','2017-02-01',1),('2010_Calder_Cup_Playoffs','2018-01-01',9),('Alice_Caymmi','2016-01-01',121),('Alfredo_Alvar','2017-04-01',44),('2006_Legends_Tour','2017-07-01',30),('Albano_Albanese','2015-10-01',53),('1943_Frankford_Junction_train_wreck','2016-08-01',510),('Evans_Court_Apartment_Building','2016-04-01',4),('Abu_al-Rayhan_Muhammad_ibn_al-Biruni','2017-11-01',1),('Abubakar_Muhammad_Rimi','2015-05-01',4),('Dostpur','2016-11-01',26),('Accessories_Council_Excellence_Awards','2016-03-01',14),('2006_North_American_heat_wave','2015-06-01',1161),('Amstelodamum','2017-09-01',12),('A_Very_Peculiar_Practice','2016-08-01',1860),('Allegorie_der_Liebe','2015-09-01',1),('Alex_Mackie','2017-02-01',95),('1812_Homestead_Farm_and_Museum','2017-09-01',29),('Argus_distribution','2016-03-01',8),('Anthony_Thomas_Stover','2017-02-01',1),('Arthur_Shallcross','2016-11-01',20),('Antoine_Francois_Fourcroy','2018-01-01',1),('Abbas_Halim','2016-11-01',21),('Akiva_Baer_ben_Joseph','2017-08-01',1),('Balatonfuered','2016-11-01',3),('Antemnae','2017-11-01',204),('Cling_Cling','2017-06-01',93),('B_flat_major','2017-01-01',28),('AirExplore','2017-12-01',930),('Auckland_Super_Sprint','2015-11-01',120),('Alfredo_De_Gasperis','2017-12-01',793),('Geoffrey_I_of_Vianden','2017-01-01',5),('Copa_de_Zaachila','2016-04-01',6),('Alboacen','2017-09-01',1),('BNH_Hospital_Bangkok','2017-06-01',2),('Agricultural_health_and_safety','2016-09-01',1),('Chiasms','2017-06-01',2),('Al_Karaana','2016-05-01',58),('Alberta_Highway_872','2016-11-01',1),('Among_the_mourners','2016-03-01',1),('Achema_Power_Plant','2015-06-01',55),('ATSE_Graz','2017-10-01',65),('Arthroscopy','2017-02-01',11721),('2010-2012_European_Nations_Cup_Second_Division','2018-01-01',7),('1967_Cincinnati_Reds','2015-08-01',4),('24th_Golden_Disc_Awards','2017-05-01',71),('Johnny_Floyd','2017-01-01',17),('Arthur_Rupin','2016-02-01',5),('Alpine_skiing_at_the_2011_Canada_Winter_Games','2015-09-01',38),('College_Press_Service','2017-01-01',8),('American_Psycho','2015-08-01',55567),('CBC_Winnipeg','2017-06-01',17),('Burning_the_process','2016-04-01',1),('2011_Stanley_Cup_playoffs','2017-01-01',1036),('Andrew_Mumford','2017-01-01',6),('1925_in_fine_arts_of_the_Soviet_Union','2018-02-01',28),('Aragvi_river','2017-02-01',2),('Andrew_Adamson','2018-03-01',16269),('Arcides_fulvohirta','2016-10-01',1),('Araya_Selassie_Yohannes','2015-11-01',423),('Apartment_house','2016-09-01',85),('Advanced_Art','2015-12-01',171),('1028_Lydina','2015-06-01',53),('2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti','2017-04-01',2),('Adolph_Weiss','2015-06-01',98),('Adam_Jerzy_Czartoryski','2015-09-01',1237),('1980_United_States_presidential_election','2017-05-01',56),('1956_Oscars','2016-08-01',10),('Burundian_Senate_election,_2005','2016-04-01',1),('Amarolea_floridana','2015-07-01',3),('August_Bier','2015-12-01',514),('Arbelodes_sebelensis','2018-03-01',6),('Abiah_Brown','2018-02-01',1),('A_Maceo_Smith_High_School','2016-10-01',2),('1488_in_architecture','2017-12-01',6),('2009_AMP_Energy_500','2016-04-01',45),('1921_Baylor_Bears_football_team','2017-03-01',21),('Dmitry_Akhba','2015-07-01',43),('2004_Big_12_Conference_Baseball_Tournament','2016-07-01',37),('Abdisalam_Omer','2018-02-01',116),('Alma,_son_of_Alma','2015-08-01',53),('An_Phoblacht','2016-10-01',962),('2009_Turner_Prize','2016-01-01',75),('Jack_Zajac','2017-01-01',24),('1906_Wimbledon_Championships','2016-04-01',22),('Chuckwalla_Valley','2017-06-01',22),('Alien_Quadrology','2016-02-01',1),('Chalcidoptera_contraria','2016-04-01',1),('Alaska_Republican_Gubernatorial_Primary_Election,_2006','2016-02-01',1),('333639_Yaima','2018-02-01',7),('Aquila_hastata','2015-11-01',28),('Al-Fua','2017-07-01',1),('Anihilation','2015-07-01',28),('International_Toy_Fair','2017-01-01',1),('38th_Regiment_Indiana_Infantry','2017-01-01',10),('Andrea_Stella','2017-07-01',75),('Anselmo_de_Moraes','2015-09-01',562),('Applemore','2016-05-01',3),('Akpinar,_Kirsehir','2015-06-01',3),('Ant_nest','2016-05-01',53),('Catherine_of_Siena','2016-11-01',8806),('Barbos','2015-06-01',12),('Amlaib_mac_Iduilb','2017-08-01',2),('Alice_Janowski','2018-03-01',17),('Acacia_leptocarpa','2017-03-01',48),('Al-Hadi_Yahya','2016-01-01',39),('2015_British_Figure_Skating_Championships','2017-07-01',38),('Avenues_Television','2016-03-01',214),('Dendropsophus_sartori','2015-07-01',11),('1952_in_Germany','2015-05-01',63),('Armuchee_High_School','2016-04-01',27),('April_1_RFC','2017-11-01',2),('Caroline_Bliss','2016-11-01',972),('66th_Rice_Bowl','2016-06-01',17),('Alec_Smight','2017-02-01',173),('Alexei_Panin','2017-09-01',3),('Codeword','2016-04-01',84),('Dormice','2015-07-01',63),('2105_BC','2017-11-01',6),('5th_National_Congress_of_Kuomintang','2016-06-01',5),('Caminho_das_Indias','2017-01-01',5),('Agerbo','2017-11-01',2),('Abe_Anellis','2018-01-01',86),('Aceh_Medal','2015-07-01',33),('Alltech_Arena','2016-10-01',144),('Aly_Oury','2016-06-01',260),('757th_Troop_Carrier_Squadron','2017-07-01',2),('Alec_Peters','2017-12-01',2731),('Agua_Buena_Airport','2017-09-01',12),('Alessandro_Livi','2016-08-01',104),('Andkaer','2017-04-01',3),('Cateran','2017-06-01',135),('57th_Venice_International_Film_Festival','2017-04-01',180),('Brijal_Patel','2017-06-01',98),('Cnemaspis_jerdonii','2015-07-01',6),('Aluminum_sodium_salt','2016-10-01',3),('Arnaldo_Antonio_Sanabria_Ayala','2017-09-01',4),('Angels_of_Iron','2018-02-01',83),('Bugs_Bunny_Rabbit_Rampage','2017-06-01',422),('Admiralty_Class_Destroyer','2017-10-01',2),('Atlas_Media','2017-05-01',2),('Arcesilaus_i_of_cyrene','2017-03-01',1),('2011_Tajikistan_national_football_team_results','2017-04-01',13),('Artur_Shakhnazarov','2017-12-01',22),('747_Express_Bus','2018-03-01',20),('101-in-1_Party_Megamix','2017-10-01',188),('Fastpoint_Games','2016-11-01',32),('Analog_Anthology_1','2017-07-01',1),('Archival_bond','2015-09-01',119),('1985_Air_Force_Falcons_football','2017-09-01',4),('American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem','2017-06-01',3),('Adaptive_Evolution_in_the_Human_Genome','2017-08-01',2),('Arthur_Strangways','2015-11-01',5),('1583_in_poetry','2015-09-01',68),('Andrew_igoudala','2015-06-01',2),('Euonychophora','2016-11-01',37),('Catechizing','2016-04-01',4),('1960-61_ice_hockey_Bundesliga_season','2018-03-01',3),('Buk_Vlaka','2017-06-01',10),('Arbor_Day','2018-03-01',16265),('Guan_Sheng','2017-01-01',73),('2014_Barcelona_Open_Banc_Sabadell','2016-08-01',57),('1976-77_Nationalliga_A','2016-04-01',1),('AFL_records','2015-11-01',16),('2005_Tour_Down_Under','2016-10-01',26),('92_BCE','2015-08-01',4),('Bento_Box_Animation','2017-01-01',1),('Alabama_Territory','2018-03-01',1195),('Abdul-Wasa_Al-Saqqaf','2016-07-01',21),('Archbishops_of_Semarang','2017-01-01',6),('Ambivina','2017-10-01',13),('Aghjaghala_Ulia','2017-08-01',2),('Blechnum_novae-zelandiae','2016-11-01',26),('Dictyosome','2016-04-01',19),('Arts_Council_of_Great_Britain','2016-12-01',785),('LBC_Radio','2017-01-01',3),('Ageo,_Saitama','2016-06-01',396),('Babla_Mehta','2016-12-01',674),('2012-13_Russian_Cup','2018-01-01',10),('Chandragupt','2017-06-01',6),('407th_Air_Refueling_Squadron','2016-01-01',96),('Aftermarket','2016-07-01',1253),('A_Portrait_of_New_Orleans','2016-08-01',18),('2000-01_Yemeni_League','2017-03-01',1),('Actinidia_chinensis','2015-11-01',907),('Amsterdam_Tournament_1999','2018-03-01',1),('Arthur_Iberall','2017-02-01',112),('Auricula_Meretricula','2016-02-01',103),('Archbishop_of_Lahore','2016-09-01',8),('Chippewa_Indians_of_Montana','2016-04-01',9),('Abidjan-Niger_Railway','2018-01-01',22),('29th_Annual_Grammy_Awards','2017-05-01',1087),('Ateles_geoffroyi_frontatus','2017-06-01',3),('Enrico_Cernuschi','2016-11-01',3),('A4183_road','2017-02-01',8),('Ahrayut','2016-10-01',75),('Alison_Castle','2016-03-01',55),('Automobile_aftermarket','2016-10-01',5),('2008_GAINSCO_Auto_Insurance_Indy_300','2016-07-01',51),('1937_Scottish_Cup_Final','2017-04-01',126),('2005_Clipsal_500_Adelaide','2018-02-01',22),('Farid_Farjad','2016-04-01',120),('13_Tribes_of_Long_Island','2015-12-01',11),('Afroneta_bamilekei','2017-01-01',2),('Frederick_Stuart_Greene','2017-01-01',1),('Andre_Braugher','2017-04-01',37655),('1906_International_Lawn_Tennis_Challenge','2017-10-01',73),('2009-10_NFL_Playoffs','2016-01-01',69),('Cricket_Wellington','2016-11-01',2),('Craig_Blazer','2015-07-01',21),('Aeolidiella_orientalis','2017-05-01',3),('Andre_Prokovsky','2017-06-01',4),('Angela_McKee','2017-11-01',14),('Airbase_Golubovci','2016-10-01',1),('2011_ISAF_Sailing_World_Championships','2017-05-01',89),('Bartica_Airport','2017-06-01',27),('Agusan_Dam','2016-09-01',454),('Bosque_Real_Country_Club','2015-07-01',42),('Georges_Duhamel','2017-01-01',122),('Allrounder','2017-03-01',63),('2017_Missouri_State_Bears_football_team','2017-09-01',868),('Allons_a_Lafayette','2017-11-01',17),('Agathla','2015-05-01',105),('1086_in_poetry','2015-09-01',25),('Absolute_extreme','2017-09-01',1),('Agathe_Bonitzer','2017-12-01',229),('Chinese_Red_Pine','2017-06-01',18),('Angular_dispersion','2016-02-01',11),('Jean-Sebastian_Giguere','2017-01-01',2),('Actinium-235','2018-03-01',4),('Ago,_filo_e_nodo','2017-02-01',11),('Aranea_cruentata','2016-03-01',1),('2009_Korea_National_League','2017-11-01',19),('Americom-8','2016-08-01',28),('2006_Junee_Bushfire','2018-03-01',81),('2013_Major_League_Baseball_Home_Run_Derby','2017-09-01',182),('1928_US_Presidential_Election','2016-12-01',42),('After-eighty_generation','2016-02-01',127),('1932_Hawthorn_Football_Club_season','2017-07-01',16),('Amelia_Elizabeth_Mary_Rygate','2017-05-01',2),('Aline_Khalaf','2017-12-01',465),('Akron_Junction,_New_York','2017-07-01',56),('Apollo_moon_landing_conspiracy_theories','2015-09-01',4),('1978_National_League_Championship_Series','2017-03-01',325),('1959-60_German_football_championship','2017-08-01',5),('Almost_a_Bride','2017-01-01',1),('Andrew_Lysaght,_junior','2015-10-01',20),('1902_Otani_expedition','2018-02-01',1),('1892_Currie_Cup','2016-09-01',53),('1988_USC_Trojans_football_team','2016-10-01',494),('1944_in_Northern_Ireland','2016-12-01',46),('Alfred_Acherman','2017-07-01',1),('Arcadia,_Nebraska','2017-02-01',148),('4_x_400_metre_relay','2018-03-01',1),('A4030_road','2016-07-01',1),('Chi-li','2016-11-01',3),('Aircraft_fairing','2016-11-01',1861),('Buddhism_in_Belize','2015-07-01',40),('Alameda_County_Open','2017-02-01',33),('Area_of_countries_and_regions_of_the_United_Kingdom','2017-10-01',6),('2014_Weber_State_Wildcats_football_team','2016-10-01',47),('American_Journal_of_Comparative_Law','2016-04-01',62),('A_Teaspoon_Every_Four_Hours','2017-03-01',47),('Astasis','2016-03-01',1195),('Akhrakouaeronon','2015-11-01',62),('Annenkrone','2016-03-01',40),('Ballotine','2016-12-01',4753),('2000_Kipawa_earthquake','2015-11-01',139),('Archdiocese_of_cashel_and_emly','2017-01-01',1),('Chevrolet_SS396','2017-01-01',1),('Achyroseris','2016-03-01',1),('Daniel_Pulteney','2016-11-01',29),('2006_Major_League_Baseball_draft','2017-07-01',10637),('Adetunji_Idowu_Olurin','2016-01-01',37),('Ardatov,_Nizhny_Novgorod_Oblast','2017-04-01',18),('Andrew_Hilditch','2015-08-01',398),('A_Very_Merry_Daughter_Of_the_Bride','2017-04-01',67),('1993_in_radio','2017-08-01',85),('Deltan','2016-11-01',91),('Adnan_Custovic','2017-12-01',26),('Di_Gennaro','2017-01-01',4),('237_AD','2017-11-01',1),('Aaron_Gombar','2018-03-01',2),('Acrolophus','2017-04-01',47),('Alfred_Bergman','2017-06-01',27),('Charles_Bebb','2017-06-01',39),('Dirico','2017-01-01',24),('1982_Major_League_Baseball_Draft','2016-12-01',90),('DDT_wrestling','2016-11-01',4),('1988-89_Houston_Rockets_season','2016-02-01',10),('Acacia_loderi','2015-11-01',35),('2015_Deauville_American_Film_Festival','2016-10-01',126),('Andropadus_importunus','2016-02-01',9),('Antonio_Bacchetti','2017-04-01',52),('Ann_Trindade','2015-09-01',49),('5_x_Monk_5_x_Lacy','2016-05-01',37),('Barlochan,_Ontario','2017-06-01',2),('Achaian','2017-03-01',35),('Flow_rider','2017-01-01',1),('Antiblemma_discerpta','2018-02-01',1),('1997_Illinois_Fighting_Illini_football_team','2017-11-01',331),('Ahrntal','2016-03-01',540),('Apollo_Conference','2015-10-01',329),('Algenib_in_Perseus','2016-01-01',1),('Craig_Norgate','2016-04-01',42),('Antwerp_Zoo','2015-12-01',879),('Cold_Contagious','2017-06-01',161),('Bolito','2016-11-01',181),('Chinese_bridges','2016-11-01',1),('14th_Indiana_Infantry_Regiment','2017-04-01',115),('Bindunuwewa_massacre','2015-07-01',52),('Eastshore_Highway','2016-11-01',2),('Daemonologie','2017-01-01',1655),('Aero_Pacifico','2015-07-01',1),('Blue_Ribbon_Schools_Program','2017-06-01',557),('Ash_Township,_MI','2018-02-01',3),('Al-Hatab_Square','2018-02-01',450),('Alje_Vennema','2018-02-01',187),('1920_All-Ireland_Senior_Football_Championship_Final','2016-05-01',40),('Criss_Oliva','2016-11-01',801),('Bethlehem,_Ohio','2017-01-01',16),('1976_WHA_Amateur_Draft','2015-08-01',47),('Angela_Fimmano','2017-06-01',17),('Alexander_Bonini_of_Alexandria','2017-09-01',1),('Anarchist_faq','2015-05-01',13),('Aleksander_Benedykt_Sobieski','2016-05-01',240),('Cape_Florida_Lighthouse','2016-04-01',6),('Fernando_VI_of_Spain','2017-01-01',3),('Crossing_number','2017-06-01',29),('1984_NSL_Cup','2017-05-01',26),('Barbara_Weldon','2015-06-01',29),('Andreas_Olsen','2017-01-01',32),('Battle_of_Baima','2016-04-01',2),('Amory_Hansen','2016-05-01',26),('Akhmimic','2015-11-01',41),('Al_Awda','2018-02-01',18),('Adelheid-Marie_of_Anhalt-Dessau','2016-07-01',70),('Americans_for_Technology_Leadership','2015-10-01',90),('Belizean_diplomatic_missions','2017-06-01',3),('African_communist','2016-05-01',3),('Andosol','2016-09-01',246),('Alan_Attraction','2016-05-01',15),('A_Yank_in_Rome','2015-12-01',70),('2004_in_the_United_Arab_Emirates','2018-02-01',33),('Additionality','2017-06-01',371),('Assassination_of_Trotsky','2015-06-01',47),('Alice_Sotero','2018-02-01',27),('Agyneta_platnicki','2016-04-01',4),('Alexandra_Vasilyevna_Velyaminova','2015-07-01',30),('1881_in_Chile','2016-06-01',16),('Arterial_ischemic_stroke','2018-01-01',57),('Astro_Glacier','2015-09-01',27),('Chester_Earl_Merrow','2017-06-01',58),('Alejandro_de_la_Madrid','2015-11-01',1630),('70936_Kamen','2017-08-01',1),('AK_Steel_Holding_Corp','2015-08-01',8),('1124_Stroobantia','2017-10-01',23),('Asian_Wedding','2016-10-01',15),('23837_Matthewnanni','2015-10-01',18),('Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden','2017-03-01',4893),('Betsy_Hodges','2016-04-01',560),('Arthur_and_the_Invisibles','2015-08-01',14924),('Arkansas-Ole_Miss_football_rivalry','2015-05-01',7),('Asia_Cup','2015-09-01',5938),('Arginine_racemase','2016-12-01',15),('585th_Field_Company,_Royal_Engineers','2018-03-01',1),('1975_Stagg_Bowl','2017-08-01',6),('Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath','2017-01-01',1),('Askajian','2016-02-01',26),('2006_Nebraska_Cornhuskers_football_team','2015-08-01',975),('Cicero_Francis_Lowe_House','2015-07-01',10),('Conan_IV,_Duke_of_Brittany','2016-11-01',252),('2005_World_Modern_Pentathlon_Championships','2016-07-01',38),('1946_Aleutian_Islands_earthquake','2017-03-01',2019),('ANKRD17','2017-09-01',19),('1970_Maryland_Terrapins_football_team','2017-11-01',42),('Ali_Dehkhoda','2017-04-01',1),('1244_in_art','2015-07-01',22),('1520s_in_Denmark','2016-01-01',20),('Abdoulaye_Gaye','2017-12-01',10),('An_Angel_Has_Arrived','2016-03-01',36),('1453_BC','2015-08-01',26),('2017_National_Games_of_China','2017-05-01',1293),('A_Night_in_Sickbay','2016-05-01',251),('Dateline_Diamonds','2017-01-01',53),('419_guestbook_spamming','2016-02-01',5),('Familiar_bluet','2017-01-01',4),('Abu_Bakr_Mirza','2017-10-01',86),('7272_Darbydyar','2017-11-01',4),('Ages_of_consent_in_Latin_America','2017-03-01',961),('1982_Japan_Soccer_League_Cup','2016-04-01',14),('2810_BC','2015-07-01',9),('Druga_Liga_Republike_Srpske','2017-01-01',1),('1998_Swedish_Rally','2017-09-01',34),('1567_in_Norway','2015-10-01',89),('126_Army_Engineer_Regiment,_Royal_Engineers','2016-03-01',5),('2017_American_League_Wild_Card_Game','2017-10-01',25120),('August_Follen','2017-01-01',2),('Ala_Gertner','2015-11-01',876),('Glenwood,_Harford_County,_Maryland','2017-01-01',3),('Applied_ecology','2017-12-01',730),('Ariarathes_V_Eusebes_Philopator','2018-03-01',5),('2006_AFC_Champions_League','2017-09-01',947),('60_minutes_2','2016-10-01',2),('Embryonic_shield','2017-01-01',2),('2001_Meath_Intermediate_Football_Championship','2015-11-01',8),('Apparition_of_Christ_to_Madonna','2017-06-01',5),('Hoosier_Road_Elementary','2017-01-01',1),('Arua_Uda','2016-12-01',29),('Array_comprehension','2015-11-01',8),('Baszki','2015-06-01',36),('Akron_Neighborhoods','2016-01-01',4),('Catholic_Church_in_Costa_Rica','2017-06-01',85),('Canada-Sweden_relations','2015-07-01',1),('Barza_Radio_Community','2016-11-01',6),('Dalhousie_Middle_School','2016-11-01',5),('Alliphis_bakeri','2017-11-01',2),('Bartica_massacre','2017-06-01',53),('30th_January','2015-11-01',10),('1920_revolution','2017-05-01',5),('Amyraldism','2017-08-01',828),('AA_Jefferson_District','2016-05-01',45),('Eunebristis_cinclidias','2017-01-01',1),('A_Scott_Connelly','2017-06-01',5),('Antony_Durose','2016-07-01',19),('Arval_Brethren','2017-11-01',579),('Anthidium_dissectum','2017-05-01',2),('Aru,_Democratic_Republic_of_the_Congo','2017-04-01',81),('1956-57_West_Indian_cricket_season','2017-04-01',2),('2014_Moscow_Film_Festival','2017-08-01',2),('Anna_Gurji','2017-06-01',27),('Allen_Memorial_Medical_Library','2016-07-01',120),('Anton_Sistermans','2017-02-01',36),('Clotheshorses','2017-06-01',1),('36_Stratagems','2017-08-01',25),('Attack_of_the_crab_monsters','2016-10-01',16),('30_rock_awards','2015-09-01',2),('Aeroflot,_Uralsk_Civil_Aviation_Directorate','2017-08-01',2),('Amblyseius_parabufortus','2017-06-01',3),('Indian_coral_tree','2017-01-01',3),('3285_Ruth_Wolfe','2016-02-01',9),('Anderson_da_Silva_Gibin','2016-08-01',73),('5001st_Composite_Group','2017-03-01',4),('Danzik','2016-04-01',8),('4810_Ruslanova','2016-03-01',2),('Arkendale,_Virginia','2016-04-01',14),('Al_Francis_Bichara','2016-09-01',239),('Cayena','2017-01-01',1),('A_Glass_of_Darkness','2017-04-01',95),('GMC_CCKW','2017-01-01',887),('Alabama_State_Route_107','2015-11-01',13),('2011_in_motorsport','2017-12-01',26),('Adecco_General_Staffing,_New_Zealand','2017-12-01',86),('Anbargah','2015-10-01',6),('1995_Asian_Cup_Winners_Cup','2016-06-01',7),('1986_Wales_rugby_union_tour_of_the_South_Pacific','2016-12-01',30),('Adya_Goud_Brahmin','2017-03-01',2),('Akcakiraz','2015-08-01',5),('24249_Bobbiolson','2017-12-01',4),('Ahmanson_Theatre','2016-02-01',801),('Abdullah_ibn_Jahsh','2016-10-01',196),('1937_in_Chile','2015-08-01',24),('2000_in_England','2016-01-01',57),('A_Deepness_In_The_Sky','2017-08-01',2),('Area_code_678','2015-07-01',480),('Avalon_Hill','2017-01-01',880),('Anna,_Duchess_of_Prussia','2015-12-01',315),('Alexandr_Syman','2017-04-01',24),('7400_series_logic','2017-11-01',2),('Greenleaf_Township,_Minnesota','2017-01-01',1),('Acetylsal','2017-04-01',6),('Earth_and_Man_National_Museum','2016-11-01',43),('Affetside','2015-10-01',185),('1971_CFL_season','2015-08-01',202),('Beth_Bader','2016-11-01',21),('Enrolled_Nurse','2016-04-01',5),('Al-Azraq','2016-12-01',22),('4th_South_Carolina_Regiment','2015-07-01',42),('Amanda_Overmyer','2017-02-01',356),('Auto_wrap','2016-02-01',8),('Anonymous_internet_banking','2015-07-01',98),('Curatoria','2016-11-01',3),('A-roll','2016-05-01',134),('Accra_hearts_of_oak_sc','2017-10-01',4),('Apostasy_from_Judaism','2015-12-01',45),('Acantharctia_tenebrosa','2018-01-01',3),('Abigail_Keasey_Frankel','2017-11-01',25),('2008_Paraguayan_general_election','2016-01-01',1),('Adams_motor','2015-09-01',37),('Drummond_Community_High_School','2017-01-01',17),('Andrews_Nakahara','2017-10-01',474),('10th_Maccabiah','2017-04-01',30),('Ackerman,_Rick','2015-08-01',4),('Dumri,_Buxar','2016-11-01',35),('Asking_Jesus_into_your_heart','2016-09-01',1),('Adamowicz_brothers','2016-12-01',161),('Alien_Musibat','2017-12-01',2),('Ahmad_Al_Tayer','2016-04-01',39),('Analytical_phonics','2016-01-01',520),('Do_It_Good','2016-04-01',281),('2004_Kumbakonam_School_fire','2017-12-01',2114),('1977_Chattanooga_Mocs_football_team','2016-08-01',3),('Globe_valves','2017-01-01',11),('Abelmoschus_crinitus','2016-04-01',18),('1874_Yale_Bulldogs_football_team','2016-02-01',37),('Climer','2017-06-01',1),('Auchroisk','2017-06-01',37),('2010_Albirex_Niigata_season','2016-10-01',19),('Adhocracy','2017-06-01',2217),('Chios_Massacre','2015-07-01',1110),('African_Red_Slip','2017-02-01',221),('1976_Portland_Timbers_season','2016-07-01',41),('Alsace-Larraine','2015-09-01',2),('3750_Ilizarov','2017-07-01',12),('Aleksandr_Shkaev','2017-05-01',1),('32_bar_form','2016-01-01',12),('Aequatorium_jamesonii','2018-03-01',14),('Abade_neiva','2016-09-01',2),('Arakvaz','2016-08-01',23),('207_Sqn','2017-10-01',2),('Ducal_hat','2016-11-01',10),('2_Degrees','2017-03-01',19),('Ahmeddiyya_Islam','2016-03-01',4),('Amidi-ye_Kohneh','2017-11-01',13),('Contributions_to_Indian_Sociology','2016-11-01',42),('Clark_Leiblee','2016-04-01',5),('Abraham_of_Strathearn','2017-09-01',14); +/*!40000 ALTER TABLE `some_table` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2023-01-16 16:55:58 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/object-per-line.json b/docs/ja/integrations/data-ingestion/data-formats/assets/object-per-line.json new file mode 100644 index 00000000000..cda20604d9a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/object-per-line.json @@ -0,0 +1,3 @@ +{"path":"1-krona","month":"2017-01-01","hits":4} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3} +{"path":"Bob_Dolman","month":"2016-11-01","hits":245} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/objects.json b/docs/ja/integrations/data-ingestion/data-formats/assets/objects.json new file mode 100644 index 00000000000..ff5b12ecdcb --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/objects.json @@ -0,0 +1,17 @@ +{ + "a": { + "path":"April_25,_2017", + "month":"2018-01-01", + "hits":2 + }, + "b": { + "path":"Akahori_Station", + "month":"2016-06-01", + "hits":11 + }, + "c": { + "path": "Abducens_palsy", + "month":"2016-05-01", + "hits":28 + } +} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/out.html b/docs/ja/integrations/data-ingestion/data-formats/assets/out.html new file mode 100644 index 00000000000..a3fa7fdfcc9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/out.html @@ -0,0 +1,53 @@ +

Top 10 IPs

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IPRequests
9.8.4.63
9.5.1.13
2.4.8.93
4.8.8.23
4.5.4.43
3.3.6.42
8.9.5.92
2.5.1.82
6.8.3.62
6.6.3.52
+ +

Query information

+
+
Rows read
+
1000
+
Time spent
+
0.000211939
+
diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/output.results b/docs/ja/integrations/data-ingestion/data-formats/assets/output.results new file mode 100644 index 00000000000..11fb9a76417 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/output.results @@ -0,0 +1,5 @@ +== Top 10 IPs == + +${data} + +--- ${rows_read:XML} rows read in ${time:XML} --- \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/output.rows b/docs/ja/integrations/data-ingestion/data-formats/assets/output.rows new file mode 100644 index 00000000000..50d989feba3 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/output.rows @@ -0,0 +1 @@ +${ip:Escaped} generated ${total:Escaped} requests \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/proto.bin b/docs/ja/integrations/data-ingestion/data-formats/assets/proto.bin new file mode 100644 index 00000000000..064c23a4efb Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/proto.bin differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/row.template b/docs/ja/integrations/data-ingestion/data-formats/assets/row.template new file mode 100644 index 00000000000..b8855dcb77a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/row.template @@ -0,0 +1 @@ +${time:Escaped} [error] client: ${ip:CSV}, server: ${host:CSV} ${request:JSON} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/schema.capnp b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.capnp new file mode 100644 index 00000000000..12859fac734 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.capnp @@ -0,0 +1,7 @@ +@0xec8ff1a10aa10dbe; + +struct PathStats { + path @0 :Text; + month @1 :UInt32; + hits @2 :UInt32; +} diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/schema.proto b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.proto new file mode 100644 index 00000000000..b86c5cd42c1 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/schema.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +message MessageType { + string path = 1; + date month = 2; + uint32 hits = 3; +}; diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.sql b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.sql new file mode 100644 index 00000000000..d782a6c5520 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.sql @@ -0,0 +1,8 @@ +CREATE TABLE some_data +( + `path` String, + `month` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY tuple() diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.tsv b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.tsv new file mode 100644 index 00000000000..917a23a097f --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/assets/some_data.tsv @@ -0,0 +1,2000 @@ +Bangor_City_Forest 2015-07-01 34 +Alireza_Afzal 2017-02-01 24 +Akhaura-Laksam-Chittagong_Line 2015-09-01 30 +1973_National_500 2017-10-01 80 +Attachment 2017-09-01 1356 +Kellett_Strait 2017-01-01 5 +Ajarani_River 2018-01-01 30 +Akbarabad,_Khomeyn 2017-03-01 8 +Adriaan_Theodoor_Peperzak 2018-02-01 88 +Alucita_dryogramma 2015-09-01 1 +Brit_Med_J 2015-07-01 1 +4th_Metro_Manila_Film_Festival 2015-09-01 80 +Alialujah_Choir 2018-03-01 221 +1953-54_SM-sarja_season 2016-09-01 1 +Air_Force_Song 2018-02-01 19 +4-6_duoprism 2016-03-01 30 +Ashley_Spurlin 2017-06-01 94 +Asfaq_Kayani 2017-10-01 1 +1607_in_architecture 2016-06-01 7 +4-way_speakers 2015-10-01 2 +Blue_Heeler 2015-07-01 149 +5_Euro 2017-04-01 16 +2009_Spa-Francorchamps_GP2_Series_round 2016-04-01 12 +2015_Guru_Granth_Sahib_desecration 2015-11-01 6821 +Agriculture_Marketing_Service 2016-07-01 2 +2006_Football_League_Cup_Final 2015-11-01 1711 +2008_Uber_Cup_group_stage 2016-02-01 40 +1923_PGA_Championship 2016-08-01 97 +Fannie_Bay 2016-04-01 6 +AlchemyAPI 2016-04-01 344 +Cinema_of_Italy 2017-01-01 1217 +Arodes 2016-11-01 36 +Damien_Marley 2015-07-01 168 +Al_Jumayl_Baladiyat 2015-08-01 5 +2015_Alabama_State_Hornets_football_team 2017-06-01 32 +Aglossa_tanya 2016-03-01 1 +73rd_Pennsylvania_Infantry 2017-01-01 12 +2015_European_Junior_and_U23_Canoe_Slalom_Championships 2018-02-01 31 +African_Leopard 2016-08-01 64 +Faverolles,_Orne 2017-01-01 5 +Aaron_Fukuhara 2015-11-01 17 +Annular_ligaments_of_trachea 2017-01-01 31 +2014_US_Open_Series 2016-11-01 35 +A_Better_Mousetrap 2018-02-01 4 +Dibaklu 2016-11-01 1 +At_Samat_District 2015-06-01 35 +Aaron_Peasley 2017-05-01 32 +Apistomology 2015-12-01 2 +Buyat_Bay 2015-07-01 54 +1942_Estonian_Football_Championship 2017-05-01 22 +Action_for_Autism 2016-06-01 346 +100_Hz 2015-06-01 72 +2003_Arizona_State_Sun_Devils_football_team 2017-05-01 82 +Antona_obscura 2016-09-01 1 +Akiko_Sugiyama 2015-12-01 32 +Elysburg 2016-11-01 8 +2017_New_South_Wales_Cup 2017-09-01 38 +2011-12_Gold_Coast_United_FC_season 2017-06-01 1 +Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean 2016-04-01 15 +Albert_Dunn 2017-08-01 87 +Hahamakin_ang_Lahat 2017-01-01 984 +2013_Spuyten_Duyvil_derailment 2017-11-01 5 +Ayling 2017-01-01 5 +Anti-Establishment 2016-10-01 1 +1951_Spanish_motorcycle_Grand_Prix 2018-01-01 48 +2009-10_Brunei_Premier_League 2017-08-01 4 +23_Ursae_Majoris 2016-08-01 90 +1927-28_Austrian_football_championship 2017-08-01 4 +Andrew_McKeever 2017-10-01 3 +Clinocottus 2017-06-01 23 +2006_State_of_Origin 2015-11-01 7 +2013-14_Los_Angeles_Clippers_season 2015-07-01 8 +Cor_Jesu 2017-01-01 1 +Besseringen_B-Werk 2017-06-01 158 +Amy_Hempel 2017-07-01 1091 +Franc-Comtois 2016-04-01 2 +Allium_giganteum 2017-07-01 1103 +Abishai 2016-08-01 56 +Abraham_Clark_High_School 2016-04-01 88 +Baku_chronology 2015-06-01 1 +22nd_MEU 2015-10-01 39 +2015_Open_Engie_de_Touraine 2015-10-01 195 +Churchill_Bowl 2017-06-01 30 +AGMARK 2017-08-01 117 +American_standard_wire_gauge 2017-12-01 3 +Araby,_LA 2015-05-01 2 +217_BC 2016-12-01 202 +2008_Trinidad_and_Tobago_League_Cup 2016-02-01 6 +Alazan_Bay 2015-12-01 22 +Aluminum_fencing 2015-11-01 48 +Achilles_tendinitis 2016-10-01 5884 +AFP_Peacekeeping_Operations_Center 2017-01-01 64 +2013_Xinjiang_clashes 2016-01-01 1 +Arborea_Giudicato_of_Arborea 2015-09-01 3 +1941_Cleveland_Rams_season 2017-06-01 40 +Ju_Posht,_Rasht 2017-01-01 3 +Ascalenia 2016-07-01 10 +Aplectoides 2018-02-01 4 +European_Cup_1969-70 2016-11-01 14 +Armen_Mkertchian 2016-05-01 9 +2015_Aspria_Tennis_Cup_-_Singles 2018-02-01 1 +14_August_1947 2017-11-01 6 +Adobe_Creative_Suite_1 2015-05-01 1 +IC_chips 2017-01-01 2 +Austo_AE300 2016-07-01 4 +Date_palms 2015-07-01 79 +BCS_bowl_game 2017-06-01 13 +AR_Border 2017-06-01 1 +Aranda_de_Duero 2016-04-01 256 +1919_Wake_Forest_Demon_Deacons_football_team 2016-01-01 16 +All_The_Wrong_Clues_For_The_Right_Solution 2017-10-01 9 +Allan_Campbell_McLean 2015-06-01 131 +Bradford_Council_election,_2011 2017-06-01 5 +Astronomy_and_astrophysics 2015-09-01 62 +Dutch_Antillean_people 2015-07-01 57 +Army_Radio 2018-03-01 711 +BBVA_Bancomer 2016-11-01 709 +Lake_Aloha 2017-01-01 30 +Andy_Bean 2018-02-01 3092 +1941_Pittsburgh_Steelers_season 2016-05-01 147 +Aniopi_Melidoni 2016-06-01 4 +Aglossosia_fusca 2017-09-01 3 +Art_books 2017-04-01 36 +1929_Washington_Senators_season 2017-04-01 47 +Antaeotricha_congelata 2016-12-01 10 +Douglas_C-54G-5-DO_Skymaster 2017-01-01 1 +Chris_Jamison 2016-11-01 827 +Ace_Blackwell 2015-11-01 9 +Abdul_Qadir_Fitrat 2018-02-01 32 +Arnoldo_Vizcaino 2017-10-01 1 +2012_Open_EuroEnergie_de_Quimper_-_Doubles 2017-12-01 3 +Dale_Rominski 2017-01-01 7 +ADHD_coaching 2015-06-01 50 +Claire_Yiu 2016-11-01 209 +Applicant 2015-10-01 253 +Apache_OpenOffice 2017-06-01 6031 +Abel_Kiprop_Mutai 2015-09-01 22 +Airdrome_Taube 2017-04-01 46 +Andrey_Viktorovich 2016-06-01 1 +American_Idol_controversy 2016-03-01 36 +Anthrenocerus_confertus 2018-01-01 17 +Appraisal_Subcommittee 2018-03-01 17 +Babusa 2015-07-01 3 +500_homeruns 2016-06-01 1 +Argentina_national_volleyball_team 2016-08-01 64 +Chief_prosecutor_of_Russia 2015-07-01 1 +Absolution_DVD 2015-06-01 1 +1,3-Beta-glucan_synthase 2017-05-01 440 +Dave_Sinardet 2016-04-01 26 +Adeline_Whitney 2018-03-01 10 +Allon_shvut 2016-07-01 3 +2012_Penn_State_Nittany_Lions_football_season 2017-12-01 3 +Coleman-Franklin-Cannon_Mill 2017-01-01 4 +Action_director 2015-05-01 93 +AD_547 2016-01-01 1 +Acta_germanica 2017-09-01 1 +Abu_Dhabi_Global_Market_Square 2017-01-01 35 +Kozo_Shioya 2017-01-01 7 +China_Investment_Corp 2017-01-01 2 +Dmitri_Zakharovich_Protopopov 2016-04-01 129 +Anatra_Anadis 2017-10-01 208 +Archaikum 2017-11-01 5 +2000_Webby_Awards 2017-04-01 360 +2003_BCR_Open_Romania_-_Singles 2016-08-01 2 +Abacetus_bisignatus 2016-09-01 79 +American_school_of_kinshasa 2016-01-01 1 +Anna,_7th_Duchess_of_Bedford 2016-08-01 8 +Black_majority_district 2016-11-01 3 +Dagma_Lahlum 2015-07-01 1 +Credit_Saison 2015-07-01 517 +Ariyankuppam_firka 2016-02-01 19 +Annette_Fuentes 2016-06-01 17 +Angerstein,_John 2015-12-01 2 +Annenkov_Island 2016-03-01 280 +Anne_Frank_museum 2016-06-01 67 +Annales_sancti_Amandi 2017-06-01 22 +L-FABP 2017-01-01 1 +Alvord,_TX 2017-06-01 12 +2006_World_Team_Table_Tennis_Championships 2016-05-01 119 +Angriffen 2015-12-01 9 +Anthony_Oppenheimer 2017-03-01 452 +Absamat_Masaliyevich_Masaliyev 2016-09-01 1 +Airborne_Museum_at_Aldershot 2016-03-01 41 +Aktiubinsk_Oblast 2015-08-01 7 +100_East_Wisconsin 2015-05-01 782 +7th_Bangladesh_National_Film_Awards 2017-08-01 91 +Alejandro_Reyes 2017-12-01 35 +Applied_philosophy 2018-03-01 539 +Adhemar_Pimenta 2016-06-01 146 +Break_the_fourth_wall 2016-04-01 66 +Annoushka_Ducas 2017-10-01 411 +ATC_code_J01CA01 2015-06-01 1 +Evelyn_County,_New_South_Wales 2016-11-01 7 +Elastic_scattering 2016-11-01 1374 +1032_Pafuri 2015-07-01 35 +Andrew_Bromwich 2015-08-01 26 +Ishita_Arun 2017-01-01 249 +Aspergics 2016-07-01 1 +1857_in_Chile 2018-03-01 22 +Breffni 2015-07-01 38 +845_in_poetry 2017-08-01 2 +20321_Lightdonovan 2015-10-01 12 +Arthur_Chandler 2017-12-01 27 +CsISOLatin2 2017-06-01 1 +1900_Grand_National 2016-06-01 69 +Aeritalia_AMX 2017-03-01 3 +B_Sharps 2015-06-01 11 +544_area_code 2015-09-01 2 +30th_Guldbagge_Awards 2015-06-01 37 +Agrippina 2017-08-01 315 +Ardmore 2016-02-01 433 +Amplypterus_panopus 2016-03-01 23 +Alexander_Bukharov 2017-09-01 5 +Alaska_Raceway_Park 2017-01-01 46 +Albanian_National_Road_Race_Championships 2017-03-01 31 +1968_Democratic_National_Convention_protest_activity 2017-10-01 2802 +2012_Birthday_Honours 2017-10-01 427 +2000_NHL_expansion_draft 2017-06-01 1 +A_Town_Where_You_Live 2016-11-01 2920 +Ahmed_Shahzad 2018-03-01 25 +Elisabeth_Svendsen 2016-11-01 39 +2002_FINA_Synchronised_Swimming_World_Cup 2016-08-01 30 +Akatek 2017-04-01 10 +Animation_with_DAZ_Studio 2018-02-01 78 +Fergus_Craig 2016-11-01 119 +Ancel_Nalau 2015-11-01 5 +5171_Augustesen 2017-04-01 20 +Anne_McGuire 2017-11-01 329 +Australian_Photoplay_Company 2015-12-01 6 +1913_in_Canada 2017-04-01 137 +Arhopala_allata 2015-05-01 26 +Il_Paradiso_delle_Signore 2017-01-01 31 +Geri_Palast 2017-01-01 38 +Alan_Abela_Wadge 2017-03-01 77 +22nd_Tactical_Air_Support_Squadron 2017-10-01 7 +Avant_Stellar 2017-06-01 22 +Black_phantom_tetra 2016-11-01 205 +Billy_McCaffrey 2017-01-01 314 +Annie_Furuhjelm 2017-11-01 97 +1992_PGA_Tour 2017-12-01 307 +2008_Chilean_pork_crisis 2016-01-01 55 +2012_Currie_Cup_First_Division 2018-02-01 32 +Aleksei_Fomkin 2015-05-01 144 +Alexander_Krausnick-Groh 2016-05-01 101 +Adam_Richard_Wiles 2017-08-01 5 +ATCvet_code_QA01AD01 2015-09-01 2 +Abu_Bakr_Ibn_Bajja 2017-03-01 5 +Architecture-Studio 2016-04-01 94 +950s_BC 2016-02-01 257 +Abschwunges 2017-07-01 1 +Adonis_Geroskipou 2017-06-01 15 +2008-09_SV_Werder_Bremen_season 2016-03-01 3 +Closed_loops 2016-04-01 1 +AFC_Youth_Championship_1982 2015-12-01 10 +Aquila_Shoes 2015-08-01 209 +9842_Funakoshi 2017-12-01 11 +Educational_quotient 2016-04-01 21 +Antoni_Julian_Nowowiejski 2018-01-01 211 +Adi_Oka_Idhile 2017-11-01 16 +DEXIA-BIL_Luxembourg_Open 2016-11-01 3 +Andrew_James_Simpson 2016-03-01 43 +Alexander_Boksenberg 2017-12-01 61 +1827_in_Denmark 2017-03-01 39 +Afternoon_tea_with_suggs 2017-11-01 3 +Alpha,_MN 2017-06-01 6 +Ari_Onasis 2015-06-01 4 +1961-62_Football_League_First_Division 2015-11-01 1 +Andi_Lila 2015-06-01 2847 +A_Gathering_Of_Old_Men 2018-02-01 1 +Abul_Fazl_al-Abbas 2017-01-01 1 +Asgill,_Charles 2017-08-01 1 +Alexander_Arkhangelsky 2015-07-01 12 +1947-48_Portuguese_Liga 2015-06-01 1 +3rd_MMC_-_Varna 2016-07-01 3 +Alberts,_Wayne 2017-05-01 3 +Alois_Schickelgruber 2018-02-01 9 +Hefner_Stadium 2017-01-01 2 +410912_Lisakaroline 2018-02-01 26 +Academy_at_Mountain_State 2018-03-01 1 +617_Squadron 2016-05-01 489 +Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji 2015-07-01 5 +Arturo_Merino_Benitez_Airport 2017-10-01 13 +AEK_Athens_Futsal 2015-06-01 10 +Aggaeus 2018-02-01 2 +Association_for_Retarded_Citizens_of_the_United_States 2017-08-01 3 +Kielce_pogrom 2017-01-01 335 +1351_in_poetry 2016-01-01 17 +1923_Princeton_Tigers_football_team 2017-11-01 41 +Auzata_semipavonaria 2017-01-01 2 +892_in_poetry 2016-01-01 6 +Anton_Krotiak 2017-12-01 2 +Arthur_Shelley 2017-12-01 23 +2003_Kyoto_Purple_Sanga_season 2018-02-01 9 +Frederic_Bowker_Terrington_Carter 2016-04-01 6 +2-orthoplex 2016-03-01 1 +Acacia_australiana 2015-09-01 4 +2012_Newcastle_Knights_season 2016-06-01 103 +Ann_Wrights_Corner,_Virginia 2017-07-01 19 +12557_Caracol 2017-03-01 5 +2001_African_Footballer_of_the_Year 2017-05-01 1 +Bass_Pyramid 2017-01-01 22 +A_noodle 2015-05-01 5 +Aed_Bennan 2018-02-01 2 +1886_Yale_Bulldogs_football_team 2017-10-01 58 +2002_Players_Championship 2016-06-01 54 +African_Skimmer 2017-07-01 2 +3rd_Guldbagge_Awards 2016-12-01 39 +Arrows_A19B 2015-10-01 1 +Archduchess_Elisabetta_of_Austria-Este 2017-08-01 1526 +America_Islands 2015-11-01 1 +1932_Olympic_Games 2016-01-01 9 +2011_Chinese_pro-democracy_protests 2015-11-01 2044 +Bank_walkaway 2016-04-01 113 +594_in_Ireland 2017-04-01 1 +Association_of_Municipal_Corporations 2016-12-01 5 +Andreas_Brantelid 2015-09-01 167 +Amarthal_urf_Unchagaon 2017-05-01 82 +3-methoxymorphinan 2017-04-01 146 +2382_BC 2016-07-01 10 +1763_in_science 2016-07-01 28 +Arvert 2017-04-01 77 +Ale_yeast 2017-12-01 19 +A_Man_Without_a_Soul 2018-03-01 17 +Air_Force_Base_Louis_Trichardt 2017-09-01 1 +Athirson_Mazzoli_de_Oliveira 2017-06-01 3 +Anthony_Chan_Yau 2017-07-01 181 +Basic_Enlisted_Submarine_School 2017-06-01 392 +Aboriginal_Lands_of_Hawaiian_Ancestry 2015-09-01 11 +Fondren_Southwest,_Houston 2017-01-01 4 +3_World_Financial_Center 2017-07-01 64 +1971_IIHF_European_U19_Championship 2017-09-01 9 +1937-38_Allsvenskan 2015-12-01 6 +Christopher_Ashton_Kutcher 2017-06-01 2 +Australian_rules_football_in_south_australia 2016-12-01 1 +Amicable_pair 2018-01-01 7 +Alan_Tomes 2015-11-01 82 +Alexei_Petrovich,_Tsarevich_of_Russia 2015-12-01 3887 +Alexis_Damour 2015-10-01 66 +Bankruptcy_Act_of_1938 2017-06-01 76 +Amphiphyllum 2016-06-01 14 +Conway_High_School_West 2016-04-01 1 +5447_Lallement 2015-11-01 10 +Gabriel_Iddan 2017-01-01 1 +1879-80_Scottish_Cup 2017-04-01 3 +2011_Eneco_Tour 2016-10-01 31 +1471_in_England 2015-11-01 94 +Ashland_Town_Hall 2017-01-01 5 +Archduke_John 2015-05-01 20 +2000_Cameroonian_Premier_League 2017-09-01 18 +1997_flood 2017-11-01 5 +Agile_management 2015-09-01 26677 +Am_841 2017-12-01 3 +Apprentice_Mason 2018-01-01 4 +Hales-Jewett_theorem 2017-01-01 2 +Alien_Abductions 2017-10-01 14 +Arjun_Menon 2016-02-01 370 +Anthokyan 2016-01-01 4 +Automobili_Lamborghini 2016-02-01 1110 +Alain_Prost 2017-04-01 25196 +Fartein_Valen 2016-04-01 90 +Antonio_Galli_da_Bibiena 2016-05-01 5 +Al_Jawf,_Libya 2017-03-01 600 +AD_695 2018-02-01 1 +Amir_chand 2015-11-01 1 +Alcis_obliquisigna 2017-08-01 1 +Chandra_Talpade_Mohanty 2017-01-01 306 +Algerian_safe_house,_Jalalabad 2015-06-01 3 +Jake_Milner 2017-01-01 1 +Alternate_Communications_Center 2017-10-01 1 +In_the_Bleachers 2017-01-01 42 +Alex_Puodziukas 2016-04-01 7 +Altarpiece_of_Pilgrim_II 2018-02-01 2 +Cybernetical_Physics 2017-01-01 3 +Christopher_Unthank 2017-06-01 2 +1982_Independence_Bowl 2015-06-01 102 +Ascoli_Calcio_1898 2018-03-01 1115 +Briggs-Rauscher_reactions 2017-06-01 1 +Adjadja 2018-02-01 45 +Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed 2016-06-01 3 +Catholic_social_doctrine 2017-01-01 6 +2833_BC 2016-11-01 1 +Bethy_Woodward 2016-04-01 38 +Bateman_polynomials 2017-06-01 22 +1966_Buenos_Aires_Grand_Prix 2015-10-01 19 +A_River_Somewhere 2015-10-01 353 +2016-17_BVIFA_National_Football_League 2017-04-01 2 +1909_Major_League_Baseball_season 2015-10-01 362 +1988_Oklahoma_Sooners_football 2017-11-01 2 +2010s_in_Chechen_fashion 2016-10-01 1 +Accademia_Olimpica 2017-08-01 17 +Air_cooling 2015-07-01 2010 +Amir_Saoud 2016-11-01 22 +Alex_Auburn 2015-05-01 52 +Apamea_impulsa 2016-11-01 6 +Australian_federal_election,_2007 2015-07-01 1794 +Ain_Sakhri 2017-10-01 76 +Belosaepiidae 2015-07-01 68 +Acts_of_Parliament_in_the_United_Kingdom 2017-10-01 4070 +Equity_Office 2016-11-01 202 +David_Bintley 2017-01-01 51 +Aksel_Schiotz 2018-03-01 3 +Appropriation_Act_2000 2017-05-01 12 +Edward_Johnson_III 2016-11-01 491 +2006_Ohio_State_Buckeyes_football_team 2016-03-01 1452 +Battle_of_Fort_Beausejour 2015-07-01 97 +Abel_Foullon 2015-12-01 82 +Apollo_VIII 2015-10-01 19 +Carry_on_up_the_jungle 2015-07-01 8 +Armour_villa 2017-05-01 4 +201_Poplar 2015-08-01 265 +Arta_prefecture 2016-08-01 1 +2015-16_Ekstraklasa 2018-02-01 13 +Alport,_Ontario 2018-02-01 2 +Bongoland 2017-06-01 62 +Alfred_Charles_Post 2016-11-01 11 +Aam_Aadmi_Party_crisis 2016-10-01 1 +Andrea_Moda 2015-07-01 143 +Abdul_Halim_Sharar 2017-08-01 545 +Apostolic_Vicariate_of_Yunnan 2016-12-01 1 +Catherine_Steadman 2016-11-01 5218 +Agastachys_odorata 2015-10-01 38 +9783_Tensho-kan 2016-03-01 2 +AFL_Cairns 2017-10-01 337 +Abomey 2015-06-01 1062 +Anne_Crofton,_1st_Baroness_Crofton 2015-12-01 42 +Cash-flow_return_on_investment 2017-01-01 137 +Alberto_Arvelo_Torrealba_Municipality 2015-08-01 56 +Abyssinian_Shorthorned_Zebu 2017-09-01 124 +Albanian_hip_hop 2016-01-01 1812 +Alphonso_IV_of_Portugal 2016-02-01 12 +19th_The_Alberta_Mounted_Rifles 2016-10-01 1 +Chinese_shadow_theatre 2016-04-01 1 +American_Committee_of_the_Fourth_International 2017-08-01 4 +2014_Bahrain_GP2_Series_round 2016-03-01 80 +Alexandrian_orthodox 2017-09-01 2 +2010_Hurricane_Season 2015-05-01 18 +1938_All-Ireland_Senior_Camogie_Championship_Final 2017-01-01 1 +ATC_code_D01 2018-01-01 203 +Albedo 2015-08-01 23484 +Chavigny,_Meurthe-et-Moselle 2017-01-01 12 +Becky_Essex 2015-07-01 51 +Archaeological_Museum_Padre_Le_Paige 2018-02-01 2 +Abu_Bakar_Sillah 2017-01-01 5 +Back_chat 2017-01-01 2 +Anchylobela_dyseimata 2015-12-01 11 +Anthony_Overton 2017-03-01 261 +Bear_maul 2016-04-01 3 +Ambarawa,_Central_Java 2016-01-01 1 +Amber_lager 2016-11-01 87 +2nd_LAAD 2017-09-01 8 +Ashiya,_Hyogo 2018-03-01 24 +Angels_at_Risk 2018-02-01 74 +Audrey_Marie_Munson 2016-03-01 17 +1984_Australian_Football_Championships 2017-01-01 27 +Ammonia_fountain 2016-06-01 434 +Allister_Bentley 2018-03-01 11 +Alsager_Hay_Hill 2016-10-01 72 +1753_English_cricket_season 2015-05-01 51 +2009-10_New_Jersey_Devils_season 2016-10-01 1 +An_Untamed_State 2016-05-01 1109 +Beatrice_Carmichael 2016-11-01 5 +Abdul_Ghani_Ahmad 2017-12-01 115 +Arteria_suralis 2017-02-01 3 +Berzasca_River 2017-01-01 1 +Angel_Attack 2015-09-01 98 +1969_San_Francisco_49ers_football_team 2017-11-01 1 +Anthony_Beilenson 2017-09-01 114 +Crystalline_Entity 2016-04-01 180 +Granice 2017-01-01 2 +203rd_General_Hospital 2017-07-01 44 +Acrocercops_rhombiferellum 2017-12-01 20 +Ampliglossum_blanchetii 2017-05-01 1 +11553_Scheria 2017-03-01 2 +Ashkenozi 2017-02-01 1 +2010_Calder_Cup_Playoffs 2018-01-01 9 +Alice_Caymmi 2016-01-01 121 +Alfredo_Alvar 2017-04-01 44 +2006_Legends_Tour 2017-07-01 30 +Albano_Albanese 2015-10-01 53 +1943_Frankford_Junction_train_wreck 2016-08-01 510 +Evans_Court_Apartment_Building 2016-04-01 4 +Abu_al-Rayhan_Muhammad_ibn_al-Biruni 2017-11-01 1 +Abubakar_Muhammad_Rimi 2015-05-01 4 +Dostpur 2016-11-01 26 +Accessories_Council_Excellence_Awards 2016-03-01 14 +2006_North_American_heat_wave 2015-06-01 1161 +Amstelodamum 2017-09-01 12 +A_Very_Peculiar_Practice 2016-08-01 1860 +Allegorie_der_Liebe 2015-09-01 1 +Alex_Mackie 2017-02-01 95 +1812_Homestead_Farm_and_Museum 2017-09-01 29 +Argus_distribution 2016-03-01 8 +Anthony_Thomas_Stover 2017-02-01 1 +Arthur_Shallcross 2016-11-01 20 +Antoine_Francois_Fourcroy 2018-01-01 1 +Abbas_Halim 2016-11-01 21 +Akiva_Baer_ben_Joseph 2017-08-01 1 +Balatonfuered 2016-11-01 3 +Antemnae 2017-11-01 204 +Cling_Cling 2017-06-01 93 +B_flat_major 2017-01-01 28 +AirExplore 2017-12-01 930 +Auckland_Super_Sprint 2015-11-01 120 +Alfredo_De_Gasperis 2017-12-01 793 +Geoffrey_I_of_Vianden 2017-01-01 5 +Copa_de_Zaachila 2016-04-01 6 +Alboacen 2017-09-01 1 +BNH_Hospital_Bangkok 2017-06-01 2 +Agricultural_health_and_safety 2016-09-01 1 +Chiasms 2017-06-01 2 +Al_Karaana 2016-05-01 58 +Alberta_Highway_872 2016-11-01 1 +Among_the_mourners 2016-03-01 1 +Achema_Power_Plant 2015-06-01 55 +ATSE_Graz 2017-10-01 65 +Arthroscopy 2017-02-01 11721 +2010-2012_European_Nations_Cup_Second_Division 2018-01-01 7 +1967_Cincinnati_Reds 2015-08-01 4 +24th_Golden_Disc_Awards 2017-05-01 71 +Johnny_Floyd 2017-01-01 17 +Arthur_Rupin 2016-02-01 5 +Alpine_skiing_at_the_2011_Canada_Winter_Games 2015-09-01 38 +College_Press_Service 2017-01-01 8 +American_Psycho 2015-08-01 55567 +CBC_Winnipeg 2017-06-01 17 +Burning_the_process 2016-04-01 1 +2011_Stanley_Cup_playoffs 2017-01-01 1036 +Andrew_Mumford 2017-01-01 6 +1925_in_fine_arts_of_the_Soviet_Union 2018-02-01 28 +Aragvi_river 2017-02-01 2 +Andrew_Adamson 2018-03-01 16269 +Arcides_fulvohirta 2016-10-01 1 +Araya_Selassie_Yohannes 2015-11-01 423 +Apartment_house 2016-09-01 85 +Advanced_Art 2015-12-01 171 +1028_Lydina 2015-06-01 53 +2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti 2017-04-01 2 +Adolph_Weiss 2015-06-01 98 +Adam_Jerzy_Czartoryski 2015-09-01 1237 +1980_United_States_presidential_election 2017-05-01 56 +1956_Oscars 2016-08-01 10 +Burundian_Senate_election,_2005 2016-04-01 1 +Amarolea_floridana 2015-07-01 3 +August_Bier 2015-12-01 514 +Arbelodes_sebelensis 2018-03-01 6 +Abiah_Brown 2018-02-01 1 +A_Maceo_Smith_High_School 2016-10-01 2 +1488_in_architecture 2017-12-01 6 +2009_AMP_Energy_500 2016-04-01 45 +1921_Baylor_Bears_football_team 2017-03-01 21 +Dmitry_Akhba 2015-07-01 43 +2004_Big_12_Conference_Baseball_Tournament 2016-07-01 37 +Abdisalam_Omer 2018-02-01 116 +Alma,_son_of_Alma 2015-08-01 53 +An_Phoblacht 2016-10-01 962 +2009_Turner_Prize 2016-01-01 75 +Jack_Zajac 2017-01-01 24 +1906_Wimbledon_Championships 2016-04-01 22 +Chuckwalla_Valley 2017-06-01 22 +Alien_Quadrology 2016-02-01 1 +Chalcidoptera_contraria 2016-04-01 1 +Alaska_Republican_Gubernatorial_Primary_Election,_2006 2016-02-01 1 +333639_Yaima 2018-02-01 7 +Aquila_hastata 2015-11-01 28 +Al-Fua 2017-07-01 1 +Anihilation 2015-07-01 28 +International_Toy_Fair 2017-01-01 1 +38th_Regiment_Indiana_Infantry 2017-01-01 10 +Andrea_Stella 2017-07-01 75 +Anselmo_de_Moraes 2015-09-01 562 +Applemore 2016-05-01 3 +Akpinar,_Kirsehir 2015-06-01 3 +Ant_nest 2016-05-01 53 +Catherine_of_Siena 2016-11-01 8806 +Barbos 2015-06-01 12 +Amlaib_mac_Iduilb 2017-08-01 2 +Alice_Janowski 2018-03-01 17 +Acacia_leptocarpa 2017-03-01 48 +Al-Hadi_Yahya 2016-01-01 39 +2015_British_Figure_Skating_Championships 2017-07-01 38 +Avenues_Television 2016-03-01 214 +Dendropsophus_sartori 2015-07-01 11 +1952_in_Germany 2015-05-01 63 +Armuchee_High_School 2016-04-01 27 +April_1_RFC 2017-11-01 2 +Caroline_Bliss 2016-11-01 972 +66th_Rice_Bowl 2016-06-01 17 +Alec_Smight 2017-02-01 173 +Alexei_Panin 2017-09-01 3 +Codeword 2016-04-01 84 +Dormice 2015-07-01 63 +2105_BC 2017-11-01 6 +5th_National_Congress_of_Kuomintang 2016-06-01 5 +Caminho_das_Indias 2017-01-01 5 +Agerbo 2017-11-01 2 +Abe_Anellis 2018-01-01 86 +Aceh_Medal 2015-07-01 33 +Alltech_Arena 2016-10-01 144 +Aly_Oury 2016-06-01 260 +757th_Troop_Carrier_Squadron 2017-07-01 2 +Alec_Peters 2017-12-01 2731 +Agua_Buena_Airport 2017-09-01 12 +Alessandro_Livi 2016-08-01 104 +Andkaer 2017-04-01 3 +Cateran 2017-06-01 135 +57th_Venice_International_Film_Festival 2017-04-01 180 +Brijal_Patel 2017-06-01 98 +Cnemaspis_jerdonii 2015-07-01 6 +Aluminum_sodium_salt 2016-10-01 3 +Arnaldo_Antonio_Sanabria_Ayala 2017-09-01 4 +Angels_of_Iron 2018-02-01 83 +Bugs_Bunny_Rabbit_Rampage 2017-06-01 422 +Admiralty_Class_Destroyer 2017-10-01 2 +Atlas_Media 2017-05-01 2 +Arcesilaus_i_of_cyrene 2017-03-01 1 +2011_Tajikistan_national_football_team_results 2017-04-01 13 +Artur_Shakhnazarov 2017-12-01 22 +747_Express_Bus 2018-03-01 20 +101-in-1_Party_Megamix 2017-10-01 188 +Fastpoint_Games 2016-11-01 32 +Analog_Anthology_1 2017-07-01 1 +Archival_bond 2015-09-01 119 +1985_Air_Force_Falcons_football 2017-09-01 4 +American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem 2017-06-01 3 +Adaptive_Evolution_in_the_Human_Genome 2017-08-01 2 +Arthur_Strangways 2015-11-01 5 +1583_in_poetry 2015-09-01 68 +Andrew_igoudala 2015-06-01 2 +Euonychophora 2016-11-01 37 +Catechizing 2016-04-01 4 +1960-61_ice_hockey_Bundesliga_season 2018-03-01 3 +Buk_Vlaka 2017-06-01 10 +Arbor_Day 2018-03-01 16265 +Guan_Sheng 2017-01-01 73 +2014_Barcelona_Open_Banc_Sabadell 2016-08-01 57 +1976-77_Nationalliga_A 2016-04-01 1 +AFL_records 2015-11-01 16 +2005_Tour_Down_Under 2016-10-01 26 +92_BCE 2015-08-01 4 +Bento_Box_Animation 2017-01-01 1 +Alabama_Territory 2018-03-01 1195 +Abdul-Wasa_Al-Saqqaf 2016-07-01 21 +Archbishops_of_Semarang 2017-01-01 6 +Ambivina 2017-10-01 13 +Aghjaghala_Ulia 2017-08-01 2 +Blechnum_novae-zelandiae 2016-11-01 26 +Dictyosome 2016-04-01 19 +Arts_Council_of_Great_Britain 2016-12-01 785 +LBC_Radio 2017-01-01 3 +Ageo,_Saitama 2016-06-01 396 +Babla_Mehta 2016-12-01 674 +2012-13_Russian_Cup 2018-01-01 10 +Chandragupt 2017-06-01 6 +407th_Air_Refueling_Squadron 2016-01-01 96 +Aftermarket 2016-07-01 1253 +A_Portrait_of_New_Orleans 2016-08-01 18 +2000-01_Yemeni_League 2017-03-01 1 +Actinidia_chinensis 2015-11-01 907 +Amsterdam_Tournament_1999 2018-03-01 1 +Arthur_Iberall 2017-02-01 112 +Auricula_Meretricula 2016-02-01 103 +Archbishop_of_Lahore 2016-09-01 8 +Chippewa_Indians_of_Montana 2016-04-01 9 +Abidjan-Niger_Railway 2018-01-01 22 +29th_Annual_Grammy_Awards 2017-05-01 1087 +Ateles_geoffroyi_frontatus 2017-06-01 3 +Enrico_Cernuschi 2016-11-01 3 +A4183_road 2017-02-01 8 +Ahrayut 2016-10-01 75 +Alison_Castle 2016-03-01 55 +Automobile_aftermarket 2016-10-01 5 +2008_GAINSCO_Auto_Insurance_Indy_300 2016-07-01 51 +1937_Scottish_Cup_Final 2017-04-01 126 +2005_Clipsal_500_Adelaide 2018-02-01 22 +Farid_Farjad 2016-04-01 120 +13_Tribes_of_Long_Island 2015-12-01 11 +Afroneta_bamilekei 2017-01-01 2 +Frederick_Stuart_Greene 2017-01-01 1 +Andre_Braugher 2017-04-01 37655 +1906_International_Lawn_Tennis_Challenge 2017-10-01 73 +2009-10_NFL_Playoffs 2016-01-01 69 +Cricket_Wellington 2016-11-01 2 +Craig_Blazer 2015-07-01 21 +Aeolidiella_orientalis 2017-05-01 3 +Andre_Prokovsky 2017-06-01 4 +Angela_McKee 2017-11-01 14 +Airbase_Golubovci 2016-10-01 1 +2011_ISAF_Sailing_World_Championships 2017-05-01 89 +Bartica_Airport 2017-06-01 27 +Agusan_Dam 2016-09-01 454 +Bosque_Real_Country_Club 2015-07-01 42 +Georges_Duhamel 2017-01-01 122 +Allrounder 2017-03-01 63 +2017_Missouri_State_Bears_football_team 2017-09-01 868 +Allons_a_Lafayette 2017-11-01 17 +Agathla 2015-05-01 105 +1086_in_poetry 2015-09-01 25 +Absolute_extreme 2017-09-01 1 +Agathe_Bonitzer 2017-12-01 229 +Chinese_Red_Pine 2017-06-01 18 +Angular_dispersion 2016-02-01 11 +Jean-Sebastian_Giguere 2017-01-01 2 +Actinium-235 2018-03-01 4 +Ago,_filo_e_nodo 2017-02-01 11 +Aranea_cruentata 2016-03-01 1 +2009_Korea_National_League 2017-11-01 19 +Americom-8 2016-08-01 28 +2006_Junee_Bushfire 2018-03-01 81 +2013_Major_League_Baseball_Home_Run_Derby 2017-09-01 182 +1928_US_Presidential_Election 2016-12-01 42 +After-eighty_generation 2016-02-01 127 +1932_Hawthorn_Football_Club_season 2017-07-01 16 +Amelia_Elizabeth_Mary_Rygate 2017-05-01 2 +Aline_Khalaf 2017-12-01 465 +Akron_Junction,_New_York 2017-07-01 56 +Apollo_moon_landing_conspiracy_theories 2015-09-01 4 +1978_National_League_Championship_Series 2017-03-01 325 +1959-60_German_football_championship 2017-08-01 5 +Almost_a_Bride 2017-01-01 1 +Andrew_Lysaght,_junior 2015-10-01 20 +1902_Otani_expedition 2018-02-01 1 +1892_Currie_Cup 2016-09-01 53 +1988_USC_Trojans_football_team 2016-10-01 494 +1944_in_Northern_Ireland 2016-12-01 46 +Alfred_Acherman 2017-07-01 1 +Arcadia,_Nebraska 2017-02-01 148 +4_x_400_metre_relay 2018-03-01 1 +A4030_road 2016-07-01 1 +Chi-li 2016-11-01 3 +Aircraft_fairing 2016-11-01 1861 +Buddhism_in_Belize 2015-07-01 40 +Alameda_County_Open 2017-02-01 33 +Area_of_countries_and_regions_of_the_United_Kingdom 2017-10-01 6 +2014_Weber_State_Wildcats_football_team 2016-10-01 47 +American_Journal_of_Comparative_Law 2016-04-01 62 +A_Teaspoon_Every_Four_Hours 2017-03-01 47 +Astasis 2016-03-01 1195 +Akhrakouaeronon 2015-11-01 62 +Annenkrone 2016-03-01 40 +Ballotine 2016-12-01 4753 +2000_Kipawa_earthquake 2015-11-01 139 +Archdiocese_of_cashel_and_emly 2017-01-01 1 +Chevrolet_SS396 2017-01-01 1 +Achyroseris 2016-03-01 1 +Daniel_Pulteney 2016-11-01 29 +2006_Major_League_Baseball_draft 2017-07-01 10637 +Adetunji_Idowu_Olurin 2016-01-01 37 +Ardatov,_Nizhny_Novgorod_Oblast 2017-04-01 18 +Andrew_Hilditch 2015-08-01 398 +A_Very_Merry_Daughter_Of_the_Bride 2017-04-01 67 +1993_in_radio 2017-08-01 85 +Deltan 2016-11-01 91 +Adnan_Custovic 2017-12-01 26 +Di_Gennaro 2017-01-01 4 +237_AD 2017-11-01 1 +Aaron_Gombar 2018-03-01 2 +Acrolophus 2017-04-01 47 +Alfred_Bergman 2017-06-01 27 +Charles_Bebb 2017-06-01 39 +Dirico 2017-01-01 24 +1982_Major_League_Baseball_Draft 2016-12-01 90 +DDT_wrestling 2016-11-01 4 +1988-89_Houston_Rockets_season 2016-02-01 10 +Acacia_loderi 2015-11-01 35 +2015_Deauville_American_Film_Festival 2016-10-01 126 +Andropadus_importunus 2016-02-01 9 +Antonio_Bacchetti 2017-04-01 52 +Ann_Trindade 2015-09-01 49 +5_x_Monk_5_x_Lacy 2016-05-01 37 +Barlochan,_Ontario 2017-06-01 2 +Achaian 2017-03-01 35 +Flow_rider 2017-01-01 1 +Antiblemma_discerpta 2018-02-01 1 +1997_Illinois_Fighting_Illini_football_team 2017-11-01 331 +Ahrntal 2016-03-01 540 +Apollo_Conference 2015-10-01 329 +Algenib_in_Perseus 2016-01-01 1 +Craig_Norgate 2016-04-01 42 +Antwerp_Zoo 2015-12-01 879 +Cold_Contagious 2017-06-01 161 +Bolito 2016-11-01 181 +Chinese_bridges 2016-11-01 1 +14th_Indiana_Infantry_Regiment 2017-04-01 115 +Bindunuwewa_massacre 2015-07-01 52 +Eastshore_Highway 2016-11-01 2 +Daemonologie 2017-01-01 1655 +Aero_Pacifico 2015-07-01 1 +Blue_Ribbon_Schools_Program 2017-06-01 557 +Ash_Township,_MI 2018-02-01 3 +Al-Hatab_Square 2018-02-01 450 +Alje_Vennema 2018-02-01 187 +1920_All-Ireland_Senior_Football_Championship_Final 2016-05-01 40 +Criss_Oliva 2016-11-01 801 +Bethlehem,_Ohio 2017-01-01 16 +1976_WHA_Amateur_Draft 2015-08-01 47 +Angela_Fimmano 2017-06-01 17 +Alexander_Bonini_of_Alexandria 2017-09-01 1 +Anarchist_faq 2015-05-01 13 +Aleksander_Benedykt_Sobieski 2016-05-01 240 +Cape_Florida_Lighthouse 2016-04-01 6 +Fernando_VI_of_Spain 2017-01-01 3 +Crossing_number 2017-06-01 29 +1984_NSL_Cup 2017-05-01 26 +Barbara_Weldon 2015-06-01 29 +Andreas_Olsen 2017-01-01 32 +Battle_of_Baima 2016-04-01 2 +Amory_Hansen 2016-05-01 26 +Akhmimic 2015-11-01 41 +Al_Awda 2018-02-01 18 +Adelheid-Marie_of_Anhalt-Dessau 2016-07-01 70 +Americans_for_Technology_Leadership 2015-10-01 90 +Belizean_diplomatic_missions 2017-06-01 3 +African_communist 2016-05-01 3 +Andosol 2016-09-01 246 +Alan_Attraction 2016-05-01 15 +A_Yank_in_Rome 2015-12-01 70 +2004_in_the_United_Arab_Emirates 2018-02-01 33 +Additionality 2017-06-01 371 +Assassination_of_Trotsky 2015-06-01 47 +Alice_Sotero 2018-02-01 27 +Agyneta_platnicki 2016-04-01 4 +Alexandra_Vasilyevna_Velyaminova 2015-07-01 30 +1881_in_Chile 2016-06-01 16 +Arterial_ischemic_stroke 2018-01-01 57 +Astro_Glacier 2015-09-01 27 +Chester_Earl_Merrow 2017-06-01 58 +Alejandro_de_la_Madrid 2015-11-01 1630 +70936_Kamen 2017-08-01 1 +AK_Steel_Holding_Corp 2015-08-01 8 +1124_Stroobantia 2017-10-01 23 +Asian_Wedding 2016-10-01 15 +23837_Matthewnanni 2015-10-01 18 +Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden 2017-03-01 4893 +Betsy_Hodges 2016-04-01 560 +Arthur_and_the_Invisibles 2015-08-01 14924 +Arkansas-Ole_Miss_football_rivalry 2015-05-01 7 +Asia_Cup 2015-09-01 5938 +Arginine_racemase 2016-12-01 15 +585th_Field_Company,_Royal_Engineers 2018-03-01 1 +1975_Stagg_Bowl 2017-08-01 6 +Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath 2017-01-01 1 +Askajian 2016-02-01 26 +2006_Nebraska_Cornhuskers_football_team 2015-08-01 975 +Cicero_Francis_Lowe_House 2015-07-01 10 +Conan_IV,_Duke_of_Brittany 2016-11-01 252 +2005_World_Modern_Pentathlon_Championships 2016-07-01 38 +1946_Aleutian_Islands_earthquake 2017-03-01 2019 +ANKRD17 2017-09-01 19 +1970_Maryland_Terrapins_football_team 2017-11-01 42 +Ali_Dehkhoda 2017-04-01 1 +1244_in_art 2015-07-01 22 +1520s_in_Denmark 2016-01-01 20 +Abdoulaye_Gaye 2017-12-01 10 +An_Angel_Has_Arrived 2016-03-01 36 +1453_BC 2015-08-01 26 +2017_National_Games_of_China 2017-05-01 1293 +A_Night_in_Sickbay 2016-05-01 251 +Dateline_Diamonds 2017-01-01 53 +419_guestbook_spamming 2016-02-01 5 +Familiar_bluet 2017-01-01 4 +Abu_Bakr_Mirza 2017-10-01 86 +7272_Darbydyar 2017-11-01 4 +Ages_of_consent_in_Latin_America 2017-03-01 961 +1982_Japan_Soccer_League_Cup 2016-04-01 14 +2810_BC 2015-07-01 9 +Druga_Liga_Republike_Srpske 2017-01-01 1 +1998_Swedish_Rally 2017-09-01 34 +1567_in_Norway 2015-10-01 89 +126_Army_Engineer_Regiment,_Royal_Engineers 2016-03-01 5 +2017_American_League_Wild_Card_Game 2017-10-01 25120 +August_Follen 2017-01-01 2 +Ala_Gertner 2015-11-01 876 +Glenwood,_Harford_County,_Maryland 2017-01-01 3 +Applied_ecology 2017-12-01 730 +Ariarathes_V_Eusebes_Philopator 2018-03-01 5 +2006_AFC_Champions_League 2017-09-01 947 +60_minutes_2 2016-10-01 2 +Embryonic_shield 2017-01-01 2 +2001_Meath_Intermediate_Football_Championship 2015-11-01 8 +Apparition_of_Christ_to_Madonna 2017-06-01 5 +Hoosier_Road_Elementary 2017-01-01 1 +Arua_Uda 2016-12-01 29 +Array_comprehension 2015-11-01 8 +Baszki 2015-06-01 36 +Akron_Neighborhoods 2016-01-01 4 +Catholic_Church_in_Costa_Rica 2017-06-01 85 +Canada-Sweden_relations 2015-07-01 1 +Barza_Radio_Community 2016-11-01 6 +Dalhousie_Middle_School 2016-11-01 5 +Alliphis_bakeri 2017-11-01 2 +Bartica_massacre 2017-06-01 53 +30th_January 2015-11-01 10 +1920_revolution 2017-05-01 5 +Amyraldism 2017-08-01 828 +AA_Jefferson_District 2016-05-01 45 +Eunebristis_cinclidias 2017-01-01 1 +A_Scott_Connelly 2017-06-01 5 +Antony_Durose 2016-07-01 19 +Arval_Brethren 2017-11-01 579 +Anthidium_dissectum 2017-05-01 2 +Aru,_Democratic_Republic_of_the_Congo 2017-04-01 81 +1956-57_West_Indian_cricket_season 2017-04-01 2 +2014_Moscow_Film_Festival 2017-08-01 2 +Anna_Gurji 2017-06-01 27 +Allen_Memorial_Medical_Library 2016-07-01 120 +Anton_Sistermans 2017-02-01 36 +Clotheshorses 2017-06-01 1 +36_Stratagems 2017-08-01 25 +Attack_of_the_crab_monsters 2016-10-01 16 +30_rock_awards 2015-09-01 2 +Aeroflot,_Uralsk_Civil_Aviation_Directorate 2017-08-01 2 +Amblyseius_parabufortus 2017-06-01 3 +Indian_coral_tree 2017-01-01 3 +3285_Ruth_Wolfe 2016-02-01 9 +Anderson_da_Silva_Gibin 2016-08-01 73 +5001st_Composite_Group 2017-03-01 4 +Danzik 2016-04-01 8 +4810_Ruslanova 2016-03-01 2 +Arkendale,_Virginia 2016-04-01 14 +Al_Francis_Bichara 2016-09-01 239 +Cayena 2017-01-01 1 +A_Glass_of_Darkness 2017-04-01 95 +GMC_CCKW 2017-01-01 887 +Alabama_State_Route_107 2015-11-01 13 +2011_in_motorsport 2017-12-01 26 +Adecco_General_Staffing,_New_Zealand 2017-12-01 86 +Anbargah 2015-10-01 6 +1995_Asian_Cup_Winners_Cup 2016-06-01 7 +1986_Wales_rugby_union_tour_of_the_South_Pacific 2016-12-01 30 +Adya_Goud_Brahmin 2017-03-01 2 +Akcakiraz 2015-08-01 5 +24249_Bobbiolson 2017-12-01 4 +Ahmanson_Theatre 2016-02-01 801 +Abdullah_ibn_Jahsh 2016-10-01 196 +1937_in_Chile 2015-08-01 24 +2000_in_England 2016-01-01 57 +A_Deepness_In_The_Sky 2017-08-01 2 +Area_code_678 2015-07-01 480 +Avalon_Hill 2017-01-01 880 +Anna,_Duchess_of_Prussia 2015-12-01 315 +Alexandr_Syman 2017-04-01 24 +7400_series_logic 2017-11-01 2 +Greenleaf_Township,_Minnesota 2017-01-01 1 +Acetylsal 2017-04-01 6 +Earth_and_Man_National_Museum 2016-11-01 43 +Affetside 2015-10-01 185 +1971_CFL_season 2015-08-01 202 +Beth_Bader 2016-11-01 21 +Enrolled_Nurse 2016-04-01 5 +Al-Azraq 2016-12-01 22 +4th_South_Carolina_Regiment 2015-07-01 42 +Amanda_Overmyer 2017-02-01 356 +Auto_wrap 2016-02-01 8 +Anonymous_internet_banking 2015-07-01 98 +Curatoria 2016-11-01 3 +A-roll 2016-05-01 134 +Accra_hearts_of_oak_sc 2017-10-01 4 +Apostasy_from_Judaism 2015-12-01 45 +Acantharctia_tenebrosa 2018-01-01 3 +Abigail_Keasey_Frankel 2017-11-01 25 +2008_Paraguayan_general_election 2016-01-01 1 +Adams_motor 2015-09-01 37 +Drummond_Community_High_School 2017-01-01 17 +Andrews_Nakahara 2017-10-01 474 +10th_Maccabiah 2017-04-01 30 +Ackerman,_Rick 2015-08-01 4 +Dumri,_Buxar 2016-11-01 35 +Asking_Jesus_into_your_heart 2016-09-01 1 +Adamowicz_brothers 2016-12-01 161 +Alien_Musibat 2017-12-01 2 +Ahmad_Al_Tayer 2016-04-01 39 +Analytical_phonics 2016-01-01 520 +Do_It_Good 2016-04-01 281 +2004_Kumbakonam_School_fire 2017-12-01 2114 +1977_Chattanooga_Mocs_football_team 2016-08-01 3 +Globe_valves 2017-01-01 11 +Abelmoschus_crinitus 2016-04-01 18 +1874_Yale_Bulldogs_football_team 2016-02-01 37 +Climer 2017-06-01 1 +Auchroisk 2017-06-01 37 +2010_Albirex_Niigata_season 2016-10-01 19 +Adhocracy 2017-06-01 2217 +Chios_Massacre 2015-07-01 1110 +African_Red_Slip 2017-02-01 221 +1976_Portland_Timbers_season 2016-07-01 41 +Alsace-Larraine 2015-09-01 2 +3750_Ilizarov 2017-07-01 12 +Aleksandr_Shkaev 2017-05-01 1 +32_bar_form 2016-01-01 12 +Aequatorium_jamesonii 2018-03-01 14 +Abade_neiva 2016-09-01 2 +Arakvaz 2016-08-01 23 +207_Sqn 2017-10-01 2 +Ducal_hat 2016-11-01 10 +2_Degrees 2017-03-01 19 +Ahmeddiyya_Islam 2016-03-01 4 +Amidi-ye_Kohneh 2017-11-01 13 +Contributions_to_Indian_Sociology 2016-11-01 42 +Clark_Leiblee 2016-04-01 5 +Abraham_of_Strathearn 2017-09-01 14 +Bangor_City_Forest 2015-07-01 34 +Alireza_Afzal 2017-02-01 24 +Akhaura-Laksam-Chittagong_Line 2015-09-01 30 +1973_National_500 2017-10-01 80 +Attachment 2017-09-01 1356 +Kellett_Strait 2017-01-01 5 +Ajarani_River 2018-01-01 30 +Akbarabad,_Khomeyn 2017-03-01 8 +Adriaan_Theodoor_Peperzak 2018-02-01 88 +Alucita_dryogramma 2015-09-01 1 +Brit_Med_J 2015-07-01 1 +4th_Metro_Manila_Film_Festival 2015-09-01 80 +Alialujah_Choir 2018-03-01 221 +1953-54_SM-sarja_season 2016-09-01 1 +Air_Force_Song 2018-02-01 19 +4-6_duoprism 2016-03-01 30 +Ashley_Spurlin 2017-06-01 94 +Asfaq_Kayani 2017-10-01 1 +1607_in_architecture 2016-06-01 7 +4-way_speakers 2015-10-01 2 +Blue_Heeler 2015-07-01 149 +5_Euro 2017-04-01 16 +2009_Spa-Francorchamps_GP2_Series_round 2016-04-01 12 +2015_Guru_Granth_Sahib_desecration 2015-11-01 6821 +Agriculture_Marketing_Service 2016-07-01 2 +2006_Football_League_Cup_Final 2015-11-01 1711 +2008_Uber_Cup_group_stage 2016-02-01 40 +1923_PGA_Championship 2016-08-01 97 +Fannie_Bay 2016-04-01 6 +AlchemyAPI 2016-04-01 344 +Cinema_of_Italy 2017-01-01 1217 +Arodes 2016-11-01 36 +Damien_Marley 2015-07-01 168 +Al_Jumayl_Baladiyat 2015-08-01 5 +2015_Alabama_State_Hornets_football_team 2017-06-01 32 +Aglossa_tanya 2016-03-01 1 +73rd_Pennsylvania_Infantry 2017-01-01 12 +2015_European_Junior_and_U23_Canoe_Slalom_Championships 2018-02-01 31 +African_Leopard 2016-08-01 64 +Faverolles,_Orne 2017-01-01 5 +Aaron_Fukuhara 2015-11-01 17 +Annular_ligaments_of_trachea 2017-01-01 31 +2014_US_Open_Series 2016-11-01 35 +A_Better_Mousetrap 2018-02-01 4 +Dibaklu 2016-11-01 1 +At_Samat_District 2015-06-01 35 +Aaron_Peasley 2017-05-01 32 +Apistomology 2015-12-01 2 +Buyat_Bay 2015-07-01 54 +1942_Estonian_Football_Championship 2017-05-01 22 +Action_for_Autism 2016-06-01 346 +100_Hz 2015-06-01 72 +2003_Arizona_State_Sun_Devils_football_team 2017-05-01 82 +Antona_obscura 2016-09-01 1 +Akiko_Sugiyama 2015-12-01 32 +Elysburg 2016-11-01 8 +2017_New_South_Wales_Cup 2017-09-01 38 +2011-12_Gold_Coast_United_FC_season 2017-06-01 1 +Agency_for_the_Prohibition_of_Nuclear_Weapons_in_Latin_America_and_the_Caribbean 2016-04-01 15 +Albert_Dunn 2017-08-01 87 +Hahamakin_ang_Lahat 2017-01-01 984 +2013_Spuyten_Duyvil_derailment 2017-11-01 5 +Ayling 2017-01-01 5 +Anti-Establishment 2016-10-01 1 +1951_Spanish_motorcycle_Grand_Prix 2018-01-01 48 +2009-10_Brunei_Premier_League 2017-08-01 4 +23_Ursae_Majoris 2016-08-01 90 +1927-28_Austrian_football_championship 2017-08-01 4 +Andrew_McKeever 2017-10-01 3 +Clinocottus 2017-06-01 23 +2006_State_of_Origin 2015-11-01 7 +2013-14_Los_Angeles_Clippers_season 2015-07-01 8 +Cor_Jesu 2017-01-01 1 +Besseringen_B-Werk 2017-06-01 158 +Amy_Hempel 2017-07-01 1091 +Franc-Comtois 2016-04-01 2 +Allium_giganteum 2017-07-01 1103 +Abishai 2016-08-01 56 +Abraham_Clark_High_School 2016-04-01 88 +Baku_chronology 2015-06-01 1 +22nd_MEU 2015-10-01 39 +2015_Open_Engie_de_Touraine 2015-10-01 195 +Churchill_Bowl 2017-06-01 30 +AGMARK 2017-08-01 117 +American_standard_wire_gauge 2017-12-01 3 +Araby,_LA 2015-05-01 2 +217_BC 2016-12-01 202 +2008_Trinidad_and_Tobago_League_Cup 2016-02-01 6 +Alazan_Bay 2015-12-01 22 +Aluminum_fencing 2015-11-01 48 +Achilles_tendinitis 2016-10-01 5884 +AFP_Peacekeeping_Operations_Center 2017-01-01 64 +2013_Xinjiang_clashes 2016-01-01 1 +Arborea_Giudicato_of_Arborea 2015-09-01 3 +1941_Cleveland_Rams_season 2017-06-01 40 +Ju_Posht,_Rasht 2017-01-01 3 +Ascalenia 2016-07-01 10 +Aplectoides 2018-02-01 4 +European_Cup_1969-70 2016-11-01 14 +Armen_Mkertchian 2016-05-01 9 +2015_Aspria_Tennis_Cup_-_Singles 2018-02-01 1 +14_August_1947 2017-11-01 6 +Adobe_Creative_Suite_1 2015-05-01 1 +IC_chips 2017-01-01 2 +Austo_AE300 2016-07-01 4 +Date_palms 2015-07-01 79 +BCS_bowl_game 2017-06-01 13 +AR_Border 2017-06-01 1 +Aranda_de_Duero 2016-04-01 256 +1919_Wake_Forest_Demon_Deacons_football_team 2016-01-01 16 +All_The_Wrong_Clues_For_The_Right_Solution 2017-10-01 9 +Allan_Campbell_McLean 2015-06-01 131 +Bradford_Council_election,_2011 2017-06-01 5 +Astronomy_and_astrophysics 2015-09-01 62 +Dutch_Antillean_people 2015-07-01 57 +Army_Radio 2018-03-01 711 +BBVA_Bancomer 2016-11-01 709 +Lake_Aloha 2017-01-01 30 +Andy_Bean 2018-02-01 3092 +1941_Pittsburgh_Steelers_season 2016-05-01 147 +Aniopi_Melidoni 2016-06-01 4 +Aglossosia_fusca 2017-09-01 3 +Art_books 2017-04-01 36 +1929_Washington_Senators_season 2017-04-01 47 +Antaeotricha_congelata 2016-12-01 10 +Douglas_C-54G-5-DO_Skymaster 2017-01-01 1 +Chris_Jamison 2016-11-01 827 +Ace_Blackwell 2015-11-01 9 +Abdul_Qadir_Fitrat 2018-02-01 32 +Arnoldo_Vizcaino 2017-10-01 1 +2012_Open_EuroEnergie_de_Quimper_-_Doubles 2017-12-01 3 +Dale_Rominski 2017-01-01 7 +ADHD_coaching 2015-06-01 50 +Claire_Yiu 2016-11-01 209 +Applicant 2015-10-01 253 +Apache_OpenOffice 2017-06-01 6031 +Abel_Kiprop_Mutai 2015-09-01 22 +Airdrome_Taube 2017-04-01 46 +Andrey_Viktorovich 2016-06-01 1 +American_Idol_controversy 2016-03-01 36 +Anthrenocerus_confertus 2018-01-01 17 +Appraisal_Subcommittee 2018-03-01 17 +Babusa 2015-07-01 3 +500_homeruns 2016-06-01 1 +Argentina_national_volleyball_team 2016-08-01 64 +Chief_prosecutor_of_Russia 2015-07-01 1 +Absolution_DVD 2015-06-01 1 +1,3-Beta-glucan_synthase 2017-05-01 440 +Dave_Sinardet 2016-04-01 26 +Adeline_Whitney 2018-03-01 10 +Allon_shvut 2016-07-01 3 +2012_Penn_State_Nittany_Lions_football_season 2017-12-01 3 +Coleman-Franklin-Cannon_Mill 2017-01-01 4 +Action_director 2015-05-01 93 +AD_547 2016-01-01 1 +Acta_germanica 2017-09-01 1 +Abu_Dhabi_Global_Market_Square 2017-01-01 35 +Kozo_Shioya 2017-01-01 7 +China_Investment_Corp 2017-01-01 2 +Dmitri_Zakharovich_Protopopov 2016-04-01 129 +Anatra_Anadis 2017-10-01 208 +Archaikum 2017-11-01 5 +2000_Webby_Awards 2017-04-01 360 +2003_BCR_Open_Romania_-_Singles 2016-08-01 2 +Abacetus_bisignatus 2016-09-01 79 +American_school_of_kinshasa 2016-01-01 1 +Anna,_7th_Duchess_of_Bedford 2016-08-01 8 +Black_majority_district 2016-11-01 3 +Dagma_Lahlum 2015-07-01 1 +Credit_Saison 2015-07-01 517 +Ariyankuppam_firka 2016-02-01 19 +Annette_Fuentes 2016-06-01 17 +Angerstein,_John 2015-12-01 2 +Annenkov_Island 2016-03-01 280 +Anne_Frank_museum 2016-06-01 67 +Annales_sancti_Amandi 2017-06-01 22 +L-FABP 2017-01-01 1 +Alvord,_TX 2017-06-01 12 +2006_World_Team_Table_Tennis_Championships 2016-05-01 119 +Angriffen 2015-12-01 9 +Anthony_Oppenheimer 2017-03-01 452 +Absamat_Masaliyevich_Masaliyev 2016-09-01 1 +Airborne_Museum_at_Aldershot 2016-03-01 41 +Aktiubinsk_Oblast 2015-08-01 7 +100_East_Wisconsin 2015-05-01 782 +7th_Bangladesh_National_Film_Awards 2017-08-01 91 +Alejandro_Reyes 2017-12-01 35 +Applied_philosophy 2018-03-01 539 +Adhemar_Pimenta 2016-06-01 146 +Break_the_fourth_wall 2016-04-01 66 +Annoushka_Ducas 2017-10-01 411 +ATC_code_J01CA01 2015-06-01 1 +Evelyn_County,_New_South_Wales 2016-11-01 7 +Elastic_scattering 2016-11-01 1374 +1032_Pafuri 2015-07-01 35 +Andrew_Bromwich 2015-08-01 26 +Ishita_Arun 2017-01-01 249 +Aspergics 2016-07-01 1 +1857_in_Chile 2018-03-01 22 +Breffni 2015-07-01 38 +845_in_poetry 2017-08-01 2 +20321_Lightdonovan 2015-10-01 12 +Arthur_Chandler 2017-12-01 27 +CsISOLatin2 2017-06-01 1 +1900_Grand_National 2016-06-01 69 +Aeritalia_AMX 2017-03-01 3 +B_Sharps 2015-06-01 11 +544_area_code 2015-09-01 2 +30th_Guldbagge_Awards 2015-06-01 37 +Agrippina 2017-08-01 315 +Ardmore 2016-02-01 433 +Amplypterus_panopus 2016-03-01 23 +Alexander_Bukharov 2017-09-01 5 +Alaska_Raceway_Park 2017-01-01 46 +Albanian_National_Road_Race_Championships 2017-03-01 31 +1968_Democratic_National_Convention_protest_activity 2017-10-01 2802 +2012_Birthday_Honours 2017-10-01 427 +2000_NHL_expansion_draft 2017-06-01 1 +A_Town_Where_You_Live 2016-11-01 2920 +Ahmed_Shahzad 2018-03-01 25 +Elisabeth_Svendsen 2016-11-01 39 +2002_FINA_Synchronised_Swimming_World_Cup 2016-08-01 30 +Akatek 2017-04-01 10 +Animation_with_DAZ_Studio 2018-02-01 78 +Fergus_Craig 2016-11-01 119 +Ancel_Nalau 2015-11-01 5 +5171_Augustesen 2017-04-01 20 +Anne_McGuire 2017-11-01 329 +Australian_Photoplay_Company 2015-12-01 6 +1913_in_Canada 2017-04-01 137 +Arhopala_allata 2015-05-01 26 +Il_Paradiso_delle_Signore 2017-01-01 31 +Geri_Palast 2017-01-01 38 +Alan_Abela_Wadge 2017-03-01 77 +22nd_Tactical_Air_Support_Squadron 2017-10-01 7 +Avant_Stellar 2017-06-01 22 +Black_phantom_tetra 2016-11-01 205 +Billy_McCaffrey 2017-01-01 314 +Annie_Furuhjelm 2017-11-01 97 +1992_PGA_Tour 2017-12-01 307 +2008_Chilean_pork_crisis 2016-01-01 55 +2012_Currie_Cup_First_Division 2018-02-01 32 +Aleksei_Fomkin 2015-05-01 144 +Alexander_Krausnick-Groh 2016-05-01 101 +Adam_Richard_Wiles 2017-08-01 5 +ATCvet_code_QA01AD01 2015-09-01 2 +Abu_Bakr_Ibn_Bajja 2017-03-01 5 +Architecture-Studio 2016-04-01 94 +950s_BC 2016-02-01 257 +Abschwunges 2017-07-01 1 +Adonis_Geroskipou 2017-06-01 15 +2008-09_SV_Werder_Bremen_season 2016-03-01 3 +Closed_loops 2016-04-01 1 +AFC_Youth_Championship_1982 2015-12-01 10 +Aquila_Shoes 2015-08-01 209 +9842_Funakoshi 2017-12-01 11 +Educational_quotient 2016-04-01 21 +Antoni_Julian_Nowowiejski 2018-01-01 211 +Adi_Oka_Idhile 2017-11-01 16 +DEXIA-BIL_Luxembourg_Open 2016-11-01 3 +Andrew_James_Simpson 2016-03-01 43 +Alexander_Boksenberg 2017-12-01 61 +1827_in_Denmark 2017-03-01 39 +Afternoon_tea_with_suggs 2017-11-01 3 +Alpha,_MN 2017-06-01 6 +Ari_Onasis 2015-06-01 4 +1961-62_Football_League_First_Division 2015-11-01 1 +Andi_Lila 2015-06-01 2847 +A_Gathering_Of_Old_Men 2018-02-01 1 +Abul_Fazl_al-Abbas 2017-01-01 1 +Asgill,_Charles 2017-08-01 1 +Alexander_Arkhangelsky 2015-07-01 12 +1947-48_Portuguese_Liga 2015-06-01 1 +3rd_MMC_-_Varna 2016-07-01 3 +Alberts,_Wayne 2017-05-01 3 +Alois_Schickelgruber 2018-02-01 9 +Hefner_Stadium 2017-01-01 2 +410912_Lisakaroline 2018-02-01 26 +Academy_at_Mountain_State 2018-03-01 1 +617_Squadron 2016-05-01 489 +Al_Silm_Haji_Hajjaj_Awwad_Al_Hajjaji 2015-07-01 5 +Arturo_Merino_Benitez_Airport 2017-10-01 13 +AEK_Athens_Futsal 2015-06-01 10 +Aggaeus 2018-02-01 2 +Association_for_Retarded_Citizens_of_the_United_States 2017-08-01 3 +Kielce_pogrom 2017-01-01 335 +1351_in_poetry 2016-01-01 17 +1923_Princeton_Tigers_football_team 2017-11-01 41 +Auzata_semipavonaria 2017-01-01 2 +892_in_poetry 2016-01-01 6 +Anton_Krotiak 2017-12-01 2 +Arthur_Shelley 2017-12-01 23 +2003_Kyoto_Purple_Sanga_season 2018-02-01 9 +Frederic_Bowker_Terrington_Carter 2016-04-01 6 +2-orthoplex 2016-03-01 1 +Acacia_australiana 2015-09-01 4 +2012_Newcastle_Knights_season 2016-06-01 103 +Ann_Wrights_Corner,_Virginia 2017-07-01 19 +12557_Caracol 2017-03-01 5 +2001_African_Footballer_of_the_Year 2017-05-01 1 +Bass_Pyramid 2017-01-01 22 +A_noodle 2015-05-01 5 +Aed_Bennan 2018-02-01 2 +1886_Yale_Bulldogs_football_team 2017-10-01 58 +2002_Players_Championship 2016-06-01 54 +African_Skimmer 2017-07-01 2 +3rd_Guldbagge_Awards 2016-12-01 39 +Arrows_A19B 2015-10-01 1 +Archduchess_Elisabetta_of_Austria-Este 2017-08-01 1526 +America_Islands 2015-11-01 1 +1932_Olympic_Games 2016-01-01 9 +2011_Chinese_pro-democracy_protests 2015-11-01 2044 +Bank_walkaway 2016-04-01 113 +594_in_Ireland 2017-04-01 1 +Association_of_Municipal_Corporations 2016-12-01 5 +Andreas_Brantelid 2015-09-01 167 +Amarthal_urf_Unchagaon 2017-05-01 82 +3-methoxymorphinan 2017-04-01 146 +2382_BC 2016-07-01 10 +1763_in_science 2016-07-01 28 +Arvert 2017-04-01 77 +Ale_yeast 2017-12-01 19 +A_Man_Without_a_Soul 2018-03-01 17 +Air_Force_Base_Louis_Trichardt 2017-09-01 1 +Athirson_Mazzoli_de_Oliveira 2017-06-01 3 +Anthony_Chan_Yau 2017-07-01 181 +Basic_Enlisted_Submarine_School 2017-06-01 392 +Aboriginal_Lands_of_Hawaiian_Ancestry 2015-09-01 11 +Fondren_Southwest,_Houston 2017-01-01 4 +3_World_Financial_Center 2017-07-01 64 +1971_IIHF_European_U19_Championship 2017-09-01 9 +1937-38_Allsvenskan 2015-12-01 6 +Christopher_Ashton_Kutcher 2017-06-01 2 +Australian_rules_football_in_south_australia 2016-12-01 1 +Amicable_pair 2018-01-01 7 +Alan_Tomes 2015-11-01 82 +Alexei_Petrovich,_Tsarevich_of_Russia 2015-12-01 3887 +Alexis_Damour 2015-10-01 66 +Bankruptcy_Act_of_1938 2017-06-01 76 +Amphiphyllum 2016-06-01 14 +Conway_High_School_West 2016-04-01 1 +5447_Lallement 2015-11-01 10 +Gabriel_Iddan 2017-01-01 1 +1879-80_Scottish_Cup 2017-04-01 3 +2011_Eneco_Tour 2016-10-01 31 +1471_in_England 2015-11-01 94 +Ashland_Town_Hall 2017-01-01 5 +Archduke_John 2015-05-01 20 +2000_Cameroonian_Premier_League 2017-09-01 18 +1997_flood 2017-11-01 5 +Agile_management 2015-09-01 26677 +Am_841 2017-12-01 3 +Apprentice_Mason 2018-01-01 4 +Hales-Jewett_theorem 2017-01-01 2 +Alien_Abductions 2017-10-01 14 +Arjun_Menon 2016-02-01 370 +Anthokyan 2016-01-01 4 +Automobili_Lamborghini 2016-02-01 1110 +Alain_Prost 2017-04-01 25196 +Fartein_Valen 2016-04-01 90 +Antonio_Galli_da_Bibiena 2016-05-01 5 +Al_Jawf,_Libya 2017-03-01 600 +AD_695 2018-02-01 1 +Amir_chand 2015-11-01 1 +Alcis_obliquisigna 2017-08-01 1 +Chandra_Talpade_Mohanty 2017-01-01 306 +Algerian_safe_house,_Jalalabad 2015-06-01 3 +Jake_Milner 2017-01-01 1 +Alternate_Communications_Center 2017-10-01 1 +In_the_Bleachers 2017-01-01 42 +Alex_Puodziukas 2016-04-01 7 +Altarpiece_of_Pilgrim_II 2018-02-01 2 +Cybernetical_Physics 2017-01-01 3 +Christopher_Unthank 2017-06-01 2 +1982_Independence_Bowl 2015-06-01 102 +Ascoli_Calcio_1898 2018-03-01 1115 +Briggs-Rauscher_reactions 2017-06-01 1 +Adjadja 2018-02-01 45 +Afghanistan_from_Ahmad_Shah_until_Dost_Mohammed 2016-06-01 3 +Catholic_social_doctrine 2017-01-01 6 +2833_BC 2016-11-01 1 +Bethy_Woodward 2016-04-01 38 +Bateman_polynomials 2017-06-01 22 +1966_Buenos_Aires_Grand_Prix 2015-10-01 19 +A_River_Somewhere 2015-10-01 353 +2016-17_BVIFA_National_Football_League 2017-04-01 2 +1909_Major_League_Baseball_season 2015-10-01 362 +1988_Oklahoma_Sooners_football 2017-11-01 2 +2010s_in_Chechen_fashion 2016-10-01 1 +Accademia_Olimpica 2017-08-01 17 +Air_cooling 2015-07-01 2010 +Amir_Saoud 2016-11-01 22 +Alex_Auburn 2015-05-01 52 +Apamea_impulsa 2016-11-01 6 +Australian_federal_election,_2007 2015-07-01 1794 +Ain_Sakhri 2017-10-01 76 +Belosaepiidae 2015-07-01 68 +Acts_of_Parliament_in_the_United_Kingdom 2017-10-01 4070 +Equity_Office 2016-11-01 202 +David_Bintley 2017-01-01 51 +Aksel_Schiotz 2018-03-01 3 +Appropriation_Act_2000 2017-05-01 12 +Edward_Johnson_III 2016-11-01 491 +2006_Ohio_State_Buckeyes_football_team 2016-03-01 1452 +Battle_of_Fort_Beausejour 2015-07-01 97 +Abel_Foullon 2015-12-01 82 +Apollo_VIII 2015-10-01 19 +Carry_on_up_the_jungle 2015-07-01 8 +Armour_villa 2017-05-01 4 +201_Poplar 2015-08-01 265 +Arta_prefecture 2016-08-01 1 +2015-16_Ekstraklasa 2018-02-01 13 +Alport,_Ontario 2018-02-01 2 +Bongoland 2017-06-01 62 +Alfred_Charles_Post 2016-11-01 11 +Aam_Aadmi_Party_crisis 2016-10-01 1 +Andrea_Moda 2015-07-01 143 +Abdul_Halim_Sharar 2017-08-01 545 +Apostolic_Vicariate_of_Yunnan 2016-12-01 1 +Catherine_Steadman 2016-11-01 5218 +Agastachys_odorata 2015-10-01 38 +9783_Tensho-kan 2016-03-01 2 +AFL_Cairns 2017-10-01 337 +Abomey 2015-06-01 1062 +Anne_Crofton,_1st_Baroness_Crofton 2015-12-01 42 +Cash-flow_return_on_investment 2017-01-01 137 +Alberto_Arvelo_Torrealba_Municipality 2015-08-01 56 +Abyssinian_Shorthorned_Zebu 2017-09-01 124 +Albanian_hip_hop 2016-01-01 1812 +Alphonso_IV_of_Portugal 2016-02-01 12 +19th_The_Alberta_Mounted_Rifles 2016-10-01 1 +Chinese_shadow_theatre 2016-04-01 1 +American_Committee_of_the_Fourth_International 2017-08-01 4 +2014_Bahrain_GP2_Series_round 2016-03-01 80 +Alexandrian_orthodox 2017-09-01 2 +2010_Hurricane_Season 2015-05-01 18 +1938_All-Ireland_Senior_Camogie_Championship_Final 2017-01-01 1 +ATC_code_D01 2018-01-01 203 +Albedo 2015-08-01 23484 +Chavigny,_Meurthe-et-Moselle 2017-01-01 12 +Becky_Essex 2015-07-01 51 +Archaeological_Museum_Padre_Le_Paige 2018-02-01 2 +Abu_Bakar_Sillah 2017-01-01 5 +Back_chat 2017-01-01 2 +Anchylobela_dyseimata 2015-12-01 11 +Anthony_Overton 2017-03-01 261 +Bear_maul 2016-04-01 3 +Ambarawa,_Central_Java 2016-01-01 1 +Amber_lager 2016-11-01 87 +2nd_LAAD 2017-09-01 8 +Ashiya,_Hyogo 2018-03-01 24 +Angels_at_Risk 2018-02-01 74 +Audrey_Marie_Munson 2016-03-01 17 +1984_Australian_Football_Championships 2017-01-01 27 +Ammonia_fountain 2016-06-01 434 +Allister_Bentley 2018-03-01 11 +Alsager_Hay_Hill 2016-10-01 72 +1753_English_cricket_season 2015-05-01 51 +2009-10_New_Jersey_Devils_season 2016-10-01 1 +An_Untamed_State 2016-05-01 1109 +Beatrice_Carmichael 2016-11-01 5 +Abdul_Ghani_Ahmad 2017-12-01 115 +Arteria_suralis 2017-02-01 3 +Berzasca_River 2017-01-01 1 +Angel_Attack 2015-09-01 98 +1969_San_Francisco_49ers_football_team 2017-11-01 1 +Anthony_Beilenson 2017-09-01 114 +Crystalline_Entity 2016-04-01 180 +Granice 2017-01-01 2 +203rd_General_Hospital 2017-07-01 44 +Acrocercops_rhombiferellum 2017-12-01 20 +Ampliglossum_blanchetii 2017-05-01 1 +11553_Scheria 2017-03-01 2 +Ashkenozi 2017-02-01 1 +2010_Calder_Cup_Playoffs 2018-01-01 9 +Alice_Caymmi 2016-01-01 121 +Alfredo_Alvar 2017-04-01 44 +2006_Legends_Tour 2017-07-01 30 +Albano_Albanese 2015-10-01 53 +1943_Frankford_Junction_train_wreck 2016-08-01 510 +Evans_Court_Apartment_Building 2016-04-01 4 +Abu_al-Rayhan_Muhammad_ibn_al-Biruni 2017-11-01 1 +Abubakar_Muhammad_Rimi 2015-05-01 4 +Dostpur 2016-11-01 26 +Accessories_Council_Excellence_Awards 2016-03-01 14 +2006_North_American_heat_wave 2015-06-01 1161 +Amstelodamum 2017-09-01 12 +A_Very_Peculiar_Practice 2016-08-01 1860 +Allegorie_der_Liebe 2015-09-01 1 +Alex_Mackie 2017-02-01 95 +1812_Homestead_Farm_and_Museum 2017-09-01 29 +Argus_distribution 2016-03-01 8 +Anthony_Thomas_Stover 2017-02-01 1 +Arthur_Shallcross 2016-11-01 20 +Antoine_Francois_Fourcroy 2018-01-01 1 +Abbas_Halim 2016-11-01 21 +Akiva_Baer_ben_Joseph 2017-08-01 1 +Balatonfuered 2016-11-01 3 +Antemnae 2017-11-01 204 +Cling_Cling 2017-06-01 93 +B_flat_major 2017-01-01 28 +AirExplore 2017-12-01 930 +Auckland_Super_Sprint 2015-11-01 120 +Alfredo_De_Gasperis 2017-12-01 793 +Geoffrey_I_of_Vianden 2017-01-01 5 +Copa_de_Zaachila 2016-04-01 6 +Alboacen 2017-09-01 1 +BNH_Hospital_Bangkok 2017-06-01 2 +Agricultural_health_and_safety 2016-09-01 1 +Chiasms 2017-06-01 2 +Al_Karaana 2016-05-01 58 +Alberta_Highway_872 2016-11-01 1 +Among_the_mourners 2016-03-01 1 +Achema_Power_Plant 2015-06-01 55 +ATSE_Graz 2017-10-01 65 +Arthroscopy 2017-02-01 11721 +2010-2012_European_Nations_Cup_Second_Division 2018-01-01 7 +1967_Cincinnati_Reds 2015-08-01 4 +24th_Golden_Disc_Awards 2017-05-01 71 +Johnny_Floyd 2017-01-01 17 +Arthur_Rupin 2016-02-01 5 +Alpine_skiing_at_the_2011_Canada_Winter_Games 2015-09-01 38 +College_Press_Service 2017-01-01 8 +American_Psycho 2015-08-01 55567 +CBC_Winnipeg 2017-06-01 17 +Burning_the_process 2016-04-01 1 +2011_Stanley_Cup_playoffs 2017-01-01 1036 +Andrew_Mumford 2017-01-01 6 +1925_in_fine_arts_of_the_Soviet_Union 2018-02-01 28 +Aragvi_river 2017-02-01 2 +Andrew_Adamson 2018-03-01 16269 +Arcides_fulvohirta 2016-10-01 1 +Araya_Selassie_Yohannes 2015-11-01 423 +Apartment_house 2016-09-01 85 +Advanced_Art 2015-12-01 171 +1028_Lydina 2015-06-01 53 +2005_July_6_United_Nations_assault_on_Cite_Soleil,_Haiti 2017-04-01 2 +Adolph_Weiss 2015-06-01 98 +Adam_Jerzy_Czartoryski 2015-09-01 1237 +1980_United_States_presidential_election 2017-05-01 56 +1956_Oscars 2016-08-01 10 +Burundian_Senate_election,_2005 2016-04-01 1 +Amarolea_floridana 2015-07-01 3 +August_Bier 2015-12-01 514 +Arbelodes_sebelensis 2018-03-01 6 +Abiah_Brown 2018-02-01 1 +A_Maceo_Smith_High_School 2016-10-01 2 +1488_in_architecture 2017-12-01 6 +2009_AMP_Energy_500 2016-04-01 45 +1921_Baylor_Bears_football_team 2017-03-01 21 +Dmitry_Akhba 2015-07-01 43 +2004_Big_12_Conference_Baseball_Tournament 2016-07-01 37 +Abdisalam_Omer 2018-02-01 116 +Alma,_son_of_Alma 2015-08-01 53 +An_Phoblacht 2016-10-01 962 +2009_Turner_Prize 2016-01-01 75 +Jack_Zajac 2017-01-01 24 +1906_Wimbledon_Championships 2016-04-01 22 +Chuckwalla_Valley 2017-06-01 22 +Alien_Quadrology 2016-02-01 1 +Chalcidoptera_contraria 2016-04-01 1 +Alaska_Republican_Gubernatorial_Primary_Election,_2006 2016-02-01 1 +333639_Yaima 2018-02-01 7 +Aquila_hastata 2015-11-01 28 +Al-Fua 2017-07-01 1 +Anihilation 2015-07-01 28 +International_Toy_Fair 2017-01-01 1 +38th_Regiment_Indiana_Infantry 2017-01-01 10 +Andrea_Stella 2017-07-01 75 +Anselmo_de_Moraes 2015-09-01 562 +Applemore 2016-05-01 3 +Akpinar,_Kirsehir 2015-06-01 3 +Ant_nest 2016-05-01 53 +Catherine_of_Siena 2016-11-01 8806 +Barbos 2015-06-01 12 +Amlaib_mac_Iduilb 2017-08-01 2 +Alice_Janowski 2018-03-01 17 +Acacia_leptocarpa 2017-03-01 48 +Al-Hadi_Yahya 2016-01-01 39 +2015_British_Figure_Skating_Championships 2017-07-01 38 +Avenues_Television 2016-03-01 214 +Dendropsophus_sartori 2015-07-01 11 +1952_in_Germany 2015-05-01 63 +Armuchee_High_School 2016-04-01 27 +April_1_RFC 2017-11-01 2 +Caroline_Bliss 2016-11-01 972 +66th_Rice_Bowl 2016-06-01 17 +Alec_Smight 2017-02-01 173 +Alexei_Panin 2017-09-01 3 +Codeword 2016-04-01 84 +Dormice 2015-07-01 63 +2105_BC 2017-11-01 6 +5th_National_Congress_of_Kuomintang 2016-06-01 5 +Caminho_das_Indias 2017-01-01 5 +Agerbo 2017-11-01 2 +Abe_Anellis 2018-01-01 86 +Aceh_Medal 2015-07-01 33 +Alltech_Arena 2016-10-01 144 +Aly_Oury 2016-06-01 260 +757th_Troop_Carrier_Squadron 2017-07-01 2 +Alec_Peters 2017-12-01 2731 +Agua_Buena_Airport 2017-09-01 12 +Alessandro_Livi 2016-08-01 104 +Andkaer 2017-04-01 3 +Cateran 2017-06-01 135 +57th_Venice_International_Film_Festival 2017-04-01 180 +Brijal_Patel 2017-06-01 98 +Cnemaspis_jerdonii 2015-07-01 6 +Aluminum_sodium_salt 2016-10-01 3 +Arnaldo_Antonio_Sanabria_Ayala 2017-09-01 4 +Angels_of_Iron 2018-02-01 83 +Bugs_Bunny_Rabbit_Rampage 2017-06-01 422 +Admiralty_Class_Destroyer 2017-10-01 2 +Atlas_Media 2017-05-01 2 +Arcesilaus_i_of_cyrene 2017-03-01 1 +2011_Tajikistan_national_football_team_results 2017-04-01 13 +Artur_Shakhnazarov 2017-12-01 22 +747_Express_Bus 2018-03-01 20 +101-in-1_Party_Megamix 2017-10-01 188 +Fastpoint_Games 2016-11-01 32 +Analog_Anthology_1 2017-07-01 1 +Archival_bond 2015-09-01 119 +1985_Air_Force_Falcons_football 2017-09-01 4 +American_Airlines_plane_diverted_to_Miami_after_landing_gear_problem 2017-06-01 3 +Adaptive_Evolution_in_the_Human_Genome 2017-08-01 2 +Arthur_Strangways 2015-11-01 5 +1583_in_poetry 2015-09-01 68 +Andrew_igoudala 2015-06-01 2 +Euonychophora 2016-11-01 37 +Catechizing 2016-04-01 4 +1960-61_ice_hockey_Bundesliga_season 2018-03-01 3 +Buk_Vlaka 2017-06-01 10 +Arbor_Day 2018-03-01 16265 +Guan_Sheng 2017-01-01 73 +2014_Barcelona_Open_Banc_Sabadell 2016-08-01 57 +1976-77_Nationalliga_A 2016-04-01 1 +AFL_records 2015-11-01 16 +2005_Tour_Down_Under 2016-10-01 26 +92_BCE 2015-08-01 4 +Bento_Box_Animation 2017-01-01 1 +Alabama_Territory 2018-03-01 1195 +Abdul-Wasa_Al-Saqqaf 2016-07-01 21 +Archbishops_of_Semarang 2017-01-01 6 +Ambivina 2017-10-01 13 +Aghjaghala_Ulia 2017-08-01 2 +Blechnum_novae-zelandiae 2016-11-01 26 +Dictyosome 2016-04-01 19 +Arts_Council_of_Great_Britain 2016-12-01 785 +LBC_Radio 2017-01-01 3 +Ageo,_Saitama 2016-06-01 396 +Babla_Mehta 2016-12-01 674 +2012-13_Russian_Cup 2018-01-01 10 +Chandragupt 2017-06-01 6 +407th_Air_Refueling_Squadron 2016-01-01 96 +Aftermarket 2016-07-01 1253 +A_Portrait_of_New_Orleans 2016-08-01 18 +2000-01_Yemeni_League 2017-03-01 1 +Actinidia_chinensis 2015-11-01 907 +Amsterdam_Tournament_1999 2018-03-01 1 +Arthur_Iberall 2017-02-01 112 +Auricula_Meretricula 2016-02-01 103 +Archbishop_of_Lahore 2016-09-01 8 +Chippewa_Indians_of_Montana 2016-04-01 9 +Abidjan-Niger_Railway 2018-01-01 22 +29th_Annual_Grammy_Awards 2017-05-01 1087 +Ateles_geoffroyi_frontatus 2017-06-01 3 +Enrico_Cernuschi 2016-11-01 3 +A4183_road 2017-02-01 8 +Ahrayut 2016-10-01 75 +Alison_Castle 2016-03-01 55 +Automobile_aftermarket 2016-10-01 5 +2008_GAINSCO_Auto_Insurance_Indy_300 2016-07-01 51 +1937_Scottish_Cup_Final 2017-04-01 126 +2005_Clipsal_500_Adelaide 2018-02-01 22 +Farid_Farjad 2016-04-01 120 +13_Tribes_of_Long_Island 2015-12-01 11 +Afroneta_bamilekei 2017-01-01 2 +Frederick_Stuart_Greene 2017-01-01 1 +Andre_Braugher 2017-04-01 37655 +1906_International_Lawn_Tennis_Challenge 2017-10-01 73 +2009-10_NFL_Playoffs 2016-01-01 69 +Cricket_Wellington 2016-11-01 2 +Craig_Blazer 2015-07-01 21 +Aeolidiella_orientalis 2017-05-01 3 +Andre_Prokovsky 2017-06-01 4 +Angela_McKee 2017-11-01 14 +Airbase_Golubovci 2016-10-01 1 +2011_ISAF_Sailing_World_Championships 2017-05-01 89 +Bartica_Airport 2017-06-01 27 +Agusan_Dam 2016-09-01 454 +Bosque_Real_Country_Club 2015-07-01 42 +Georges_Duhamel 2017-01-01 122 +Allrounder 2017-03-01 63 +2017_Missouri_State_Bears_football_team 2017-09-01 868 +Allons_a_Lafayette 2017-11-01 17 +Agathla 2015-05-01 105 +1086_in_poetry 2015-09-01 25 +Absolute_extreme 2017-09-01 1 +Agathe_Bonitzer 2017-12-01 229 +Chinese_Red_Pine 2017-06-01 18 +Angular_dispersion 2016-02-01 11 +Jean-Sebastian_Giguere 2017-01-01 2 +Actinium-235 2018-03-01 4 +Ago,_filo_e_nodo 2017-02-01 11 +Aranea_cruentata 2016-03-01 1 +2009_Korea_National_League 2017-11-01 19 +Americom-8 2016-08-01 28 +2006_Junee_Bushfire 2018-03-01 81 +2013_Major_League_Baseball_Home_Run_Derby 2017-09-01 182 +1928_US_Presidential_Election 2016-12-01 42 +After-eighty_generation 2016-02-01 127 +1932_Hawthorn_Football_Club_season 2017-07-01 16 +Amelia_Elizabeth_Mary_Rygate 2017-05-01 2 +Aline_Khalaf 2017-12-01 465 +Akron_Junction,_New_York 2017-07-01 56 +Apollo_moon_landing_conspiracy_theories 2015-09-01 4 +1978_National_League_Championship_Series 2017-03-01 325 +1959-60_German_football_championship 2017-08-01 5 +Almost_a_Bride 2017-01-01 1 +Andrew_Lysaght,_junior 2015-10-01 20 +1902_Otani_expedition 2018-02-01 1 +1892_Currie_Cup 2016-09-01 53 +1988_USC_Trojans_football_team 2016-10-01 494 +1944_in_Northern_Ireland 2016-12-01 46 +Alfred_Acherman 2017-07-01 1 +Arcadia,_Nebraska 2017-02-01 148 +4_x_400_metre_relay 2018-03-01 1 +A4030_road 2016-07-01 1 +Chi-li 2016-11-01 3 +Aircraft_fairing 2016-11-01 1861 +Buddhism_in_Belize 2015-07-01 40 +Alameda_County_Open 2017-02-01 33 +Area_of_countries_and_regions_of_the_United_Kingdom 2017-10-01 6 +2014_Weber_State_Wildcats_football_team 2016-10-01 47 +American_Journal_of_Comparative_Law 2016-04-01 62 +A_Teaspoon_Every_Four_Hours 2017-03-01 47 +Astasis 2016-03-01 1195 +Akhrakouaeronon 2015-11-01 62 +Annenkrone 2016-03-01 40 +Ballotine 2016-12-01 4753 +2000_Kipawa_earthquake 2015-11-01 139 +Archdiocese_of_cashel_and_emly 2017-01-01 1 +Chevrolet_SS396 2017-01-01 1 +Achyroseris 2016-03-01 1 +Daniel_Pulteney 2016-11-01 29 +2006_Major_League_Baseball_draft 2017-07-01 10637 +Adetunji_Idowu_Olurin 2016-01-01 37 +Ardatov,_Nizhny_Novgorod_Oblast 2017-04-01 18 +Andrew_Hilditch 2015-08-01 398 +A_Very_Merry_Daughter_Of_the_Bride 2017-04-01 67 +1993_in_radio 2017-08-01 85 +Deltan 2016-11-01 91 +Adnan_Custovic 2017-12-01 26 +Di_Gennaro 2017-01-01 4 +237_AD 2017-11-01 1 +Aaron_Gombar 2018-03-01 2 +Acrolophus 2017-04-01 47 +Alfred_Bergman 2017-06-01 27 +Charles_Bebb 2017-06-01 39 +Dirico 2017-01-01 24 +1982_Major_League_Baseball_Draft 2016-12-01 90 +DDT_wrestling 2016-11-01 4 +1988-89_Houston_Rockets_season 2016-02-01 10 +Acacia_loderi 2015-11-01 35 +2015_Deauville_American_Film_Festival 2016-10-01 126 +Andropadus_importunus 2016-02-01 9 +Antonio_Bacchetti 2017-04-01 52 +Ann_Trindade 2015-09-01 49 +5_x_Monk_5_x_Lacy 2016-05-01 37 +Barlochan,_Ontario 2017-06-01 2 +Achaian 2017-03-01 35 +Flow_rider 2017-01-01 1 +Antiblemma_discerpta 2018-02-01 1 +1997_Illinois_Fighting_Illini_football_team 2017-11-01 331 +Ahrntal 2016-03-01 540 +Apollo_Conference 2015-10-01 329 +Algenib_in_Perseus 2016-01-01 1 +Craig_Norgate 2016-04-01 42 +Antwerp_Zoo 2015-12-01 879 +Cold_Contagious 2017-06-01 161 +Bolito 2016-11-01 181 +Chinese_bridges 2016-11-01 1 +14th_Indiana_Infantry_Regiment 2017-04-01 115 +Bindunuwewa_massacre 2015-07-01 52 +Eastshore_Highway 2016-11-01 2 +Daemonologie 2017-01-01 1655 +Aero_Pacifico 2015-07-01 1 +Blue_Ribbon_Schools_Program 2017-06-01 557 +Ash_Township,_MI 2018-02-01 3 +Al-Hatab_Square 2018-02-01 450 +Alje_Vennema 2018-02-01 187 +1920_All-Ireland_Senior_Football_Championship_Final 2016-05-01 40 +Criss_Oliva 2016-11-01 801 +Bethlehem,_Ohio 2017-01-01 16 +1976_WHA_Amateur_Draft 2015-08-01 47 +Angela_Fimmano 2017-06-01 17 +Alexander_Bonini_of_Alexandria 2017-09-01 1 +Anarchist_faq 2015-05-01 13 +Aleksander_Benedykt_Sobieski 2016-05-01 240 +Cape_Florida_Lighthouse 2016-04-01 6 +Fernando_VI_of_Spain 2017-01-01 3 +Crossing_number 2017-06-01 29 +1984_NSL_Cup 2017-05-01 26 +Barbara_Weldon 2015-06-01 29 +Andreas_Olsen 2017-01-01 32 +Battle_of_Baima 2016-04-01 2 +Amory_Hansen 2016-05-01 26 +Akhmimic 2015-11-01 41 +Al_Awda 2018-02-01 18 +Adelheid-Marie_of_Anhalt-Dessau 2016-07-01 70 +Americans_for_Technology_Leadership 2015-10-01 90 +Belizean_diplomatic_missions 2017-06-01 3 +African_communist 2016-05-01 3 +Andosol 2016-09-01 246 +Alan_Attraction 2016-05-01 15 +A_Yank_in_Rome 2015-12-01 70 +2004_in_the_United_Arab_Emirates 2018-02-01 33 +Additionality 2017-06-01 371 +Assassination_of_Trotsky 2015-06-01 47 +Alice_Sotero 2018-02-01 27 +Agyneta_platnicki 2016-04-01 4 +Alexandra_Vasilyevna_Velyaminova 2015-07-01 30 +1881_in_Chile 2016-06-01 16 +Arterial_ischemic_stroke 2018-01-01 57 +Astro_Glacier 2015-09-01 27 +Chester_Earl_Merrow 2017-06-01 58 +Alejandro_de_la_Madrid 2015-11-01 1630 +70936_Kamen 2017-08-01 1 +AK_Steel_Holding_Corp 2015-08-01 8 +1124_Stroobantia 2017-10-01 23 +Asian_Wedding 2016-10-01 15 +23837_Matthewnanni 2015-10-01 18 +Acharya_Jagadish_Chandra_Bose_Indian_Botanic_Garden 2017-03-01 4893 +Betsy_Hodges 2016-04-01 560 +Arthur_and_the_Invisibles 2015-08-01 14924 +Arkansas-Ole_Miss_football_rivalry 2015-05-01 7 +Asia_Cup 2015-09-01 5938 +Arginine_racemase 2016-12-01 15 +585th_Field_Company,_Royal_Engineers 2018-03-01 1 +1975_Stagg_Bowl 2017-08-01 6 +Dame_Commander_of_The_Most_Honourable_Order_of_the_Bath 2017-01-01 1 +Askajian 2016-02-01 26 +2006_Nebraska_Cornhuskers_football_team 2015-08-01 975 +Cicero_Francis_Lowe_House 2015-07-01 10 +Conan_IV,_Duke_of_Brittany 2016-11-01 252 +2005_World_Modern_Pentathlon_Championships 2016-07-01 38 +1946_Aleutian_Islands_earthquake 2017-03-01 2019 +ANKRD17 2017-09-01 19 +1970_Maryland_Terrapins_football_team 2017-11-01 42 +Ali_Dehkhoda 2017-04-01 1 +1244_in_art 2015-07-01 22 +1520s_in_Denmark 2016-01-01 20 +Abdoulaye_Gaye 2017-12-01 10 +An_Angel_Has_Arrived 2016-03-01 36 +1453_BC 2015-08-01 26 +2017_National_Games_of_China 2017-05-01 1293 +A_Night_in_Sickbay 2016-05-01 251 +Dateline_Diamonds 2017-01-01 53 +419_guestbook_spamming 2016-02-01 5 +Familiar_bluet 2017-01-01 4 +Abu_Bakr_Mirza 2017-10-01 86 +7272_Darbydyar 2017-11-01 4 +Ages_of_consent_in_Latin_America 2017-03-01 961 +1982_Japan_Soccer_League_Cup 2016-04-01 14 +2810_BC 2015-07-01 9 +Druga_Liga_Republike_Srpske 2017-01-01 1 +1998_Swedish_Rally 2017-09-01 34 +1567_in_Norway 2015-10-01 89 +126_Army_Engineer_Regiment,_Royal_Engineers 2016-03-01 5 +2017_American_League_Wild_Card_Game 2017-10-01 25120 +August_Follen 2017-01-01 2 +Ala_Gertner 2015-11-01 876 +Glenwood,_Harford_County,_Maryland 2017-01-01 3 +Applied_ecology 2017-12-01 730 +Ariarathes_V_Eusebes_Philopator 2018-03-01 5 +2006_AFC_Champions_League 2017-09-01 947 +60_minutes_2 2016-10-01 2 +Embryonic_shield 2017-01-01 2 +2001_Meath_Intermediate_Football_Championship 2015-11-01 8 +Apparition_of_Christ_to_Madonna 2017-06-01 5 +Hoosier_Road_Elementary 2017-01-01 1 +Arua_Uda 2016-12-01 29 +Array_comprehension 2015-11-01 8 +Baszki 2015-06-01 36 +Akron_Neighborhoods 2016-01-01 4 +Catholic_Church_in_Costa_Rica 2017-06-01 85 +Canada-Sweden_relations 2015-07-01 1 +Barza_Radio_Community 2016-11-01 6 +Dalhousie_Middle_School 2016-11-01 5 +Alliphis_bakeri 2017-11-01 2 +Bartica_massacre 2017-06-01 53 +30th_January 2015-11-01 10 +1920_revolution 2017-05-01 5 +Amyraldism 2017-08-01 828 +AA_Jefferson_District 2016-05-01 45 +Eunebristis_cinclidias 2017-01-01 1 +A_Scott_Connelly 2017-06-01 5 +Antony_Durose 2016-07-01 19 +Arval_Brethren 2017-11-01 579 +Anthidium_dissectum 2017-05-01 2 +Aru,_Democratic_Republic_of_the_Congo 2017-04-01 81 +1956-57_West_Indian_cricket_season 2017-04-01 2 +2014_Moscow_Film_Festival 2017-08-01 2 +Anna_Gurji 2017-06-01 27 +Allen_Memorial_Medical_Library 2016-07-01 120 +Anton_Sistermans 2017-02-01 36 +Clotheshorses 2017-06-01 1 +36_Stratagems 2017-08-01 25 +Attack_of_the_crab_monsters 2016-10-01 16 +30_rock_awards 2015-09-01 2 +Aeroflot,_Uralsk_Civil_Aviation_Directorate 2017-08-01 2 +Amblyseius_parabufortus 2017-06-01 3 +Indian_coral_tree 2017-01-01 3 +3285_Ruth_Wolfe 2016-02-01 9 +Anderson_da_Silva_Gibin 2016-08-01 73 +5001st_Composite_Group 2017-03-01 4 +Danzik 2016-04-01 8 +4810_Ruslanova 2016-03-01 2 +Arkendale,_Virginia 2016-04-01 14 +Al_Francis_Bichara 2016-09-01 239 +Cayena 2017-01-01 1 +A_Glass_of_Darkness 2017-04-01 95 +GMC_CCKW 2017-01-01 887 +Alabama_State_Route_107 2015-11-01 13 +2011_in_motorsport 2017-12-01 26 +Adecco_General_Staffing,_New_Zealand 2017-12-01 86 +Anbargah 2015-10-01 6 +1995_Asian_Cup_Winners_Cup 2016-06-01 7 +1986_Wales_rugby_union_tour_of_the_South_Pacific 2016-12-01 30 +Adya_Goud_Brahmin 2017-03-01 2 +Akcakiraz 2015-08-01 5 +24249_Bobbiolson 2017-12-01 4 +Ahmanson_Theatre 2016-02-01 801 +Abdullah_ibn_Jahsh 2016-10-01 196 +1937_in_Chile 2015-08-01 24 +2000_in_England 2016-01-01 57 +A_Deepness_In_The_Sky 2017-08-01 2 +Area_code_678 2015-07-01 480 +Avalon_Hill 2017-01-01 880 +Anna,_Duchess_of_Prussia 2015-12-01 315 +Alexandr_Syman 2017-04-01 24 +7400_series_logic 2017-11-01 2 +Greenleaf_Township,_Minnesota 2017-01-01 1 +Acetylsal 2017-04-01 6 +Earth_and_Man_National_Museum 2016-11-01 43 +Affetside 2015-10-01 185 +1971_CFL_season 2015-08-01 202 +Beth_Bader 2016-11-01 21 +Enrolled_Nurse 2016-04-01 5 +Al-Azraq 2016-12-01 22 +4th_South_Carolina_Regiment 2015-07-01 42 +Amanda_Overmyer 2017-02-01 356 +Auto_wrap 2016-02-01 8 +Anonymous_internet_banking 2015-07-01 98 +Curatoria 2016-11-01 3 +A-roll 2016-05-01 134 +Accra_hearts_of_oak_sc 2017-10-01 4 +Apostasy_from_Judaism 2015-12-01 45 +Acantharctia_tenebrosa 2018-01-01 3 +Abigail_Keasey_Frankel 2017-11-01 25 +2008_Paraguayan_general_election 2016-01-01 1 +Adams_motor 2015-09-01 37 +Drummond_Community_High_School 2017-01-01 17 +Andrews_Nakahara 2017-10-01 474 +10th_Maccabiah 2017-04-01 30 +Ackerman,_Rick 2015-08-01 4 +Dumri,_Buxar 2016-11-01 35 +Asking_Jesus_into_your_heart 2016-09-01 1 +Adamowicz_brothers 2016-12-01 161 +Alien_Musibat 2017-12-01 2 +Ahmad_Al_Tayer 2016-04-01 39 +Analytical_phonics 2016-01-01 520 +Do_It_Good 2016-04-01 281 +2004_Kumbakonam_School_fire 2017-12-01 2114 +1977_Chattanooga_Mocs_football_team 2016-08-01 3 +Globe_valves 2017-01-01 11 +Abelmoschus_crinitus 2016-04-01 18 +1874_Yale_Bulldogs_football_team 2016-02-01 37 +Climer 2017-06-01 1 +Auchroisk 2017-06-01 37 +2010_Albirex_Niigata_season 2016-10-01 19 +Adhocracy 2017-06-01 2217 +Chios_Massacre 2015-07-01 1110 +African_Red_Slip 2017-02-01 221 +1976_Portland_Timbers_season 2016-07-01 41 +Alsace-Larraine 2015-09-01 2 +3750_Ilizarov 2017-07-01 12 +Aleksandr_Shkaev 2017-05-01 1 +32_bar_form 2016-01-01 12 +Aequatorium_jamesonii 2018-03-01 14 +Abade_neiva 2016-09-01 2 +Arakvaz 2016-08-01 23 +207_Sqn 2017-10-01 2 +Ducal_hat 2016-11-01 10 +2_Degrees 2017-03-01 19 +Ahmeddiyya_Islam 2016-03-01 4 +Amidi-ye_Kohneh 2017-11-01 13 +Contributions_to_Indian_Sociology 2016-11-01 42 +Clark_Leiblee 2016-04-01 5 +Abraham_of_Strathearn 2017-09-01 14 diff --git a/docs/ja/integrations/data-ingestion/data-formats/assets/time.parquet b/docs/ja/integrations/data-ingestion/data-formats/assets/time.parquet new file mode 100644 index 00000000000..37402b87f1a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/assets/time.parquet differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/binary.md b/docs/ja/integrations/data-ingestion/data-formats/binary.md new file mode 100644 index 00000000000..d364d7dcf85 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/binary.md @@ -0,0 +1,233 @@ +--- +sidebar_label: バイナリとネイティブ +slug: /ja/integrations/data-formats/binary-native +--- + +# ClickHouseでのネイティブおよびバイナリフォーマットの使用 + +ClickHouseは複数のバイナリフォーマットをサポートしており、これによりパフォーマンスとスペースの効率が向上します。バイナリフォーマットは、データがバイナリ形式で保存されるため、文字エンコーディングの安全性も確保されます。 + +ここでは、デモンストレーション用に `some_data` [テーブル](assets/some_data.sql)および[データ](assets/some_data.tsv)を使用します。ご自身のClickHouseインスタンスで再現してみてください。 + +## ネイティブClickHouseフォーマットでのエクスポート + +ClickHouseノード間でデータをエクスポートおよびインポートする最も効率的なデータフォーマットは[ネイティブ](/docs/ja/interfaces/formats.md/#native)フォーマットです。エクスポートは `INTO OUTFILE` 句を使用して行われます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'data.clickhouse' FORMAT Native +``` + +これにより、ネイティブフォーマットの[data.clickhouse](assets/data.clickhouse)ファイルが作成されます。 + +### ネイティブフォーマットからのインポート + +データをインポートするには、小さなファイルや探索目的で[file()](/docs/ja/sql-reference/table-functions/file.md)を使用できます: + +```sql +DESCRIBE file('data.clickhouse', Native); +``` +```response +┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ String │ │ │ │ │ │ +│ month │ Date │ │ │ │ │ │ +│ hits │ UInt32 │ │ │ │ │ │ +└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +:::tip +`file()` 関数を使用する場合、ClickHouse Cloudではファイルが存在するマシン上で `clickhouse client` でコマンドを実行する必要があります。他のオプションとして[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)を使用してローカルでファイルを探索することができます。 +::: + +本番環境では、`FROM INFILE` を使用してデータをインポートします: + +```sql +INSERT INTO sometable +FROM INFILE 'data.clickhouse' +FORMAT Native +``` + +### ネイティブフォーマットの圧縮 + +データをネイティブフォーマットにエクスポートする際(および他のほとんどのフォーマット)に、`COMPRESSION` 句を使用して圧縮を有効にすることもできます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'data.clickhouse' +COMPRESSION 'lz4' +FORMAT Native +``` + +エクスポートにはLZ4圧縮を使用しました。データをインポートするときにはそれを指定する必要があります: + +```sql +INSERT INTO sometable +FROM INFILE 'data.clickhouse' +COMPRESSION 'lz4' +FORMAT Native +``` + +## RowBinaryへのエクスポート + +サポートされているもう一つのバイナリフォーマットは[RowBinary](/docs/ja/interfaces/formats.md/#rowbinary)で、バイナリ表現された行でデータをインポートおよびエクスポートできます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'data.binary' FORMAT RowBinary +``` + +これにより、バイナリ行形式の[data.binary](assets/data.binary)ファイルが生成されます。 + +### RowBinaryファイルの探索 + +このフォーマットでは自動スキーマ推論はサポートされていないので、読み込む前にスキーマを明示的に定義する必要があります: + +```sql +SELECT * +FROM file('data.binary', RowBinary, 'path String, month Date, hits UInt32') +LIMIT 5 +``` +```response +┌─path───────────────────────────┬──────month─┬─hits─┐ +│ Bangor_City_Forest │ 2015-07-01 │ 34 │ +│ Alireza_Afzal │ 2017-02-01 │ 24 │ +│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │ 30 │ +│ 1973_National_500 │ 2017-10-01 │ 80 │ +│ Attachment │ 2017-09-01 │ 1356 │ +└────────────────────────────────┴────────────┴──────┘ +``` + +[RowBinaryWithNames](/docs/ja/interfaces/formats.md/#rowbinarywithnames)を利用すると、カラム一覧を含むヘッダー行も追加されます。[RowBinaryWithNamesAndTypes](/docs/ja/interfaces/formats.md/#rowbinarywithnamesandtypes)では、カラムタイプを含む追加のヘッダー行も追加されます。 + +### RowBinaryファイルからのインポート + +RowBinaryファイルからデータを読み込むには、`FROM INFILE` 句を使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data.binary' +FORMAT RowBinary +``` + +## RawBLOBを使用した単一バイナリ値のインポート + +バイナリファイル全体を読み込み、テーブルのフィールドに保存したい場合があります。このような場合には、RawBLOB形式を使用できます。この形式は単一カラムテーブルでのみ直接使用できます: + +```sql +CREATE TABLE images(data String) Engine = Memory +``` + +画像ファイルを `images` テーブルに保存してみましょう: + +```bash +cat image.jpg | clickhouse-client -q "INSERT INTO images FORMAT RawBLOB" +``` + +`data` フィールドの長さを確認すると、元のファイルサイズと等しくなります: + +```sql +SELECT length(data) FROM images +``` +```response +┌─length(data)─┐ +│ 6121 │ +└──────────────┘ +``` + +### RawBLOBデータのエクスポート + +この形式はまた、`INTO OUTFILE` 句を使用してデータをエクスポートする際にも使用できます: + +```sql +SELECT * FROM images LIMIT 1 +INTO OUTFILE 'out.jpg' +FORMAT RawBLOB +``` + +`LIMIT 1`を使用する必要があるのは、複数の値をエクスポートするとファイルが破損するためです。 + +## MessagePack + +ClickHouseは[MessagePack](https://msgpack.org/)を使用して[MsgPack](/docs/ja/interfaces/formats.md/#msgpack)のインポートとエクスポートをサポートしています。MessagePack形式にエクスポートするには: + +```sql +SELECT * +FROM some_data +INTO OUTFILE 'data.msgpk' +FORMAT MsgPack +``` + +[MessagePackファイル](assets/data.msgpk)からデータをインポートするには: + +```sql +INSERT INTO sometable +FROM INFILE 'data.msgpk' +FORMAT MsgPack +``` + +## プロトコルバッファ + +[プロトコルバッファ](/docs/ja/interfaces/formats.md/#protobuf)を使用するには、まず[スキーマファイル](assets/schema.proto)を定義する必要があります: + +```protobuf +syntax = "proto3"; + +message MessageType { + string path = 1; + date month = 2; + uint32 hits = 3; +}; +``` + +このスキーマファイルのパス(私たちの場合は`schema.proto`)は、[Protobuf](/docs/ja/interfaces/formats.md/#protobuf)フォーマット用の`format_schema`設定オプションに設定されます: + +```sql +SELECT * FROM some_data +INTO OUTFILE 'proto.bin' +FORMAT Protobuf +SETTINGS format_schema = 'schema:MessageType' +``` + +これにより、データが[proto.bin](assets/proto.bin)ファイルに保存されます。ClickHouseはProtobufデータのインポートやネストされたメッセージもサポートしています。[ProtobufSingle](/docs/ja/interfaces/formats.md/#protobufsingle)を使用して、単一のプロトコルバッファメッセージを扱うことも検討してください(この場合、長さ区切りは省略されます)。 + +## Cap’n Proto + +ClickHouseがサポートするもう一つの人気のあるバイナリシリアライゼーションフォーマットは[Cap’n Proto](https://capnproto.org/)です。`Protobuf`形式と同様に、スキーマファイル([schema.capnp](assets/schema.capnp))を定義する必要があります: + +``` +@0xec8ff1a10aa10dbe; + +struct PathStats { + path @0 :Text; + month @1 :UInt32; + hits @2 :UInt32; +} +``` + +このスキーマを使用して[CapnProto](/docs/ja/interfaces/formats.md/#capnproto)フォーマットでインポートとエクスポートを行います: + +```sql +SELECT + path, + CAST(month, 'UInt32') AS month, + hits +FROM some_data +INTO OUTFILE 'capnp.bin' +FORMAT CapnProto +SETTINGS format_schema = 'schema:PathStats' +``` + +[`CapnProto`対応の型](/docs/ja/interfaces/formats.md/#data_types-matching-capnproto)に合わせるため、`Date`カラムを`UInt32`としてキャストする必要があることに注意してください。 + +## その他のフォーマット + +ClickHouseでは、さまざまなシナリオやプラットフォームに対応するために、多くのフォーマット、テキストフォーマットとバイナリフォーマットの両方が導入されています。以下の記事で、さらに多くのフォーマットとそれを扱う方法を探索してください: + +- [CSVおよびTSVフォーマット](csv-tsv.md) +- [Parquet](parquet.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- **ネイティブおよびバイナリフォーマット** +- [SQLフォーマット](sql.md) + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)もチェックし、ClickHouseサーバーを起動せずにローカル/リモートファイルで作業するためのポータブルな完全機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md b/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md new file mode 100644 index 00000000000..6fb356fdb24 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md @@ -0,0 +1,375 @@ +--- +sidebar_label: CSV と TSV +slug: /ja/integrations/data-formats/csv-tsv +--- + +# ClickHouseでのCSVとTSVデータの操作 + +ClickHouseは、CSVからのデータのインポートおよびエクスポートをサポートしています。CSVファイルはヘッダ行、カスタムデリミタ、エスケープシンボルなど、さまざまなフォーマット仕様を持つ場合があります。そのため、ClickHouseは各ケースに効率的に対応するためのフォーマットと設定を提供しています。 + +## CSVファイルからのデータのインポート + +データをインポートする前に、次のような関連する構造のテーブルを作成します: + +```sql +CREATE TABLE sometable +( + `path` String, + `month` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY tuple(month, path) +``` + +この[CSVファイル](assets/data_small.csv)から`sometable`テーブルにデータをインポートするには、ファイルを直接clickhouse-clientにパイプします: + +```bash +clickhouse-client -q "INSERT INTO sometable FORMAT CSV" < data_small.csv +``` + +[FORMAT CSV](/docs/ja/interfaces/formats.md/#csv)を使用して、CSVフォーマットのデータを取り込むことをClickHouseに知らせます。別の方法として、ローカルファイルからデータをロードする場合は、[FROM INFILE](/docs/ja/sql-reference/statements/insert-into.md/#inserting-data-from-a-file)句を使用します: + +```sql +INSERT INTO sometable +FROM INFILE 'data_small.csv' +FORMAT CSV +``` + +ここでは、`FORMAT CSV`句を使用して、ClickHouseがファイルフォーマットを理解できるようにしています。URLから直接データをロードするには[url()](/docs/ja/sql-reference/table-functions/url.md/)関数や、S3ファイルからは[s3()](/docs/ja/sql-reference/table-functions/s3.md/)関数を使用できます。 + +:::tip +`file()`および`INFILE`/`OUTFILE`に対して明示的なフォーマット設定をスキップできます。 +その場合、ClickHouseはファイルの拡張子に基づいてフォーマットを自動的に検出します。 +::: + +### ヘッダ付きのCSVファイル + +[ヘッダ付きのCSVファイル](assets/data_small_headers.csv)があると仮定します: + +```bash +head data-small-headers.csv +``` +```response +"path","month","hits" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +``` + +このファイルからデータをインポートするには、[CSVWithNames](/docs/ja/interfaces/formats.md/#csvwithnames)フォーマットを使用します: + +```bash +clickhouse-client -q "INSERT INTO sometable FORMAT CSVWithNames" < data_small_headers.csv +``` + +この場合、ClickHouseはファイルの最初の行をスキップしてデータをインポートします。 + +:::tip +23.1[バージョン](https://github.com/ClickHouse/ClickHouse/releases)以降では、`CSV`タイプを使用した場合にClickHouseがCSVファイルのヘッダを自動的に検出するようになるので、`CSVWithNames`や`CSVWithNamesAndTypes`を使用する必要がありません。 +::: + +### カスタムデリミタ付きのCSVファイル + +CSVファイルがカンマ以外のデリミタを使用する場合は、[format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter)オプションを使用して関連するシンボルを設定できます: + +```sql +SET format_csv_delimiter = ';' +``` + +これで、CSVファイルからのインポート時にカンマの代わりに`;`シンボルがデリミタとして使用されます。 + +### CSVファイルの行のスキップ + +時には、CSVファイルからのデータインポート時に特定の行数をスキップすることがあります。これは[input_format_csv_skip_first_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_csv_skip_first_lines)オプションを使用して行うことができます: + +```sql +SET input_format_csv_skip_first_lines = 10 +``` + +この場合、CSVファイルの最初の10行をスキップします: + +```sql +SELECT count(*) FROM file('data-small.csv', CSV) +``` +```response +┌─count()─┐ +│ 990 │ +└─────────┘ +``` + +[ファイル](assets/data_small.csv)には1k行がありますが、最初の10行をスキップするように指示したため、ClickHouseは990行のみをロードしました。 + +:::tip +`file()`関数を使用する場合、ClickHouse Cloudでは、ファイルが存在するマシン上で`clickhouse client`を実行する必要があります。ローカルでファイルを探索するには[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)を使用することもできます。 +::: + +### CSVファイルでのNULL値の扱い + +NULL値は、ファイルを生成したアプリケーションに応じて異なる方法でエンコードされることがあります。デフォルトでは、ClickHouseはCSVで`\N`をNULL値として使用しますが、[format_csv_null_representation](/docs/ja/operations/settings/settings-formats.md/#format_tsv_null_representation)オプションを使用して変更できます。 + +次のCSVファイルがあるとします: + +```bash +> cat nulls.csv +Donald,90 +Joe,Nothing +Nothing,70 +``` + +このファイルからデータをロードすると、ClickHouseは`Nothing`を文字列として扱います(これが正しい): + +```sql +SELECT * FROM file('nulls.csv') +``` +```response +┌─c1──────┬─c2──────┐ +│ Donald │ 90 │ +│ Joe │ Nothing │ +│ Nothing │ 70 │ +└─────────┴─────────┘ +``` + +ClickHouseに`Nothing`を`NULL`として扱わせたい場合は、次のオプションを使用して定義できます: + +```sql +SET format_csv_null_representation = 'Nothing' +``` + +これで、期待通りに`NULL`が入ります: + +```sql +SELECT * FROM file('nulls.csv') +``` +```response +┌─c1─────┬─c2───┐ +│ Donald │ 90 │ +│ Joe │ ᴺᵁᴸᴸ │ +│ ᴺᵁᴸᴸ │ 70 │ +└────────┴──────┘ +``` + +## TSV(タブ区切り)ファイル + +タブ区切りデータフォーマットは、データ交換フォーマットとして広く使用されているフォーマットです。[TSVファイル](assets/data_small.tsv)からClickHouseにデータをロードするには、[TabSeparated](/docs/ja/interfaces/formats.md/#tabseparated)フォーマットを使用します: + +```bash +clickhouse-client -q "INSERT INTO sometable FORMAT TabSeparated" < data_small.tsv +``` + +ヘッダを持つTSVファイルを操作するための[TabSeparatedWithNames](/docs/ja/interfaces/formats.md/#tabseparatedwithnames)フォーマットもあります。また、CSVと同様に、[input_format_tsv_skip_first_lines](/docs/ja/operations/settings/settings-formats.md/#input_format_tsv_skip_first_lines)オプションを使用して最初のX行をスキップすることもできます。 + +### Raw TSV + +時折、TSVファイルはタブや改行をエスケープせずに保存されることがあります。そのようなファイルを扱うためには、[TabSeparatedRaw](/docs/ja/interfaces/formats.md/#tabseparatedraw)を使用するべきです。 + +## CSVへのエクスポート + +前の例のいずれかのフォーマットは、データをエクスポートするためにも使用できます。テーブル(またはクエリ)からCSVフォーマットにデータをエクスポートするには、同じ`FORMAT`句を使用します: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSV +``` +```response +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +``` + +CSVファイルにヘッダを追加するには、[CSVWithNames](/docs/ja/interfaces/formats.md/#csvwithnames)フォーマットを使用します: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSVWithNames +``` +```response +"path","month","hits" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +``` + +### エクスポートしたデータをCSVファイルに保存 + +エクスポートしたデータをファイルに保存するには、[INTO…OUTFILE](/docs/ja/sql-reference/statements/select/into-outfile.md)句を使用します: + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'out.csv' +FORMAT CSVWithNames +``` +```response +36838935 rows in set. Elapsed: 1.304 sec. Processed 36.84 million rows, 1.42 GB (28.24 million rows/s., 1.09 GB/s.) +``` + +36百万行をCSVファイルに保存するのにClickHouseが約**1**秒かかりました。 + +### カスタムデリミタでのCSVエクスポート + +カンマ以外のデリミタを使用したい場合は、[format_csv_delimiter](/docs/ja/operations/settings/settings-formats.md/#format_csv_delimiter)設定オプションを使用できます: + +```sql +SET format_csv_delimiter = '|' +``` + +これで、ClickHouseはCSVフォーマットで`|`をデリミタとして使用します: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSV +``` +```response +"Akiba_Hebrew_Academy"|"2017-08-01"|241 +"Aegithina_tiphia"|"2018-02-01"|34 +"1971-72_Utah_Stars_season"|"2016-10-01"|1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8"|"2015-12-01"|73 +"2016_Greater_Western_Sydney_Giants_season"|"2017-05-01"|86 +``` + +### Windows向けのCSVエクスポート + +Windows環境で問題なく動作するCSVファイルが必要な場合は、[output_format_csv_crlf_end_of_line](/docs/ja/operations/settings/settings-formats.md/#output_format_csv_crlf_end_of_line)オプションを有効にすることを検討すべきです。これにより、改行として`\n`の代わりに`\r\n`が使用されます: + +```sql +SET output_format_csv_crlf_end_of_line = 1; +``` + +## CSVファイルのスキーマ推論 + +多くの場合、不明なCSVファイルを操作しなければならないため、カラムにどのデータ型を使用するかを探索する必要があります。ClickHouseはデフォルトで、指定されたCSVファイルの分析に基づいてデータ型を推測しようとします。これは「スキーマ推論」として知られています。検出されたデータ型は、[file()](/docs/ja/sql-reference/table-functions/file.md)関数と組み合わせて`DESCRIBE`ステートメントを使用して探索できます: + +```sql +DESCRIBE file('data-small.csv', CSV) +``` +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ c1 │ Nullable(String) │ │ │ │ │ │ +│ c2 │ Nullable(Date) │ │ │ │ │ │ +│ c3 │ Nullable(Int64) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ここで、ClickHouseは効率的にCSVファイルのカラム型を推測できました。ClickHouseに推測させたくない場合は、次のオプションを使用して無効にできます: + +```sql +SET input_format_csv_use_best_effort_in_schema_inference = 0 +``` + +すべてのカラムタイプは、この場合`String`として扱われます。 + +### カラムタイプを明示的に指定したCSVのエクスポートとインポート {#exporting-and-importing-csv-with-explicit-column-types} + +ClickHouseは、[CSVWithNamesAndTypes](/docs/ja/interfaces/formats.md/#csvwithnamesandtypes)(および他の*WithNamesフォーマットファミリー)を使用してデータをエクスポートする際にカラムタイプを明示的に設定することもできます: + +```sql +SELECT * +FROM sometable +LIMIT 5 +FORMAT CSVWithNamesAndTypes +``` +```response +"path","month","hits" +"String","Date","UInt32" +"Akiba_Hebrew_Academy","2017-08-01",241 +"Aegithina_tiphia","2018-02-01",34 +"1971-72_Utah_Stars_season","2016-10-01",1 +"2015_UEFA_European_Under-21_Championship_qualification_Group_8","2015-12-01",73 +"2016_Greater_Western_Sydney_Giants_season","2017-05-01",86 +``` + +このフォーマットでは、カラム名を持つ1行とカラム型を持つもう1行の2つのヘッダ行が含まれます。これにより、ClickHouse(および他のアプリ)は[そのようなファイル](assets/data_csv_types.csv)からデータをロードする際にカラムタイプを識別できます: + +```sql +DESCRIBE file('data_csv_types.csv', CSVWithNamesAndTypes) +``` +```response +┌─name──┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ String │ │ │ │ │ │ +│ month │ Date │ │ │ │ │ │ +│ hits │ UInt32 │ │ │ │ │ │ +└───────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +これで、ClickHouseは推測の代わりに、(2番目の)ヘッダ行に基づいてカラム型を識別します。 + +## カスタムデリミタ、セパレータ、およびエスケープルール + +複雑なケースでは、テキストデータは非常にカスタムな形式でフォーマットされ、それでも構造を持つことがあります。このようなケースには、カスタムエスケープルール、デリミタ、行セパレータ、開始/終了シンボルを設定できる特別な[CustomSeparated](/docs/ja/interfaces/formats.md/#format-customseparated)フォーマットがあります。 + +次のデータがファイルにあると仮定します: + +``` +row('Akiba_Hebrew_Academy';'2017-08-01';241),row('Aegithina_tiphia';'2018-02-01';34),... +``` + +個別の行が`row()`で囲まれ、行は`,`で分離され、個別の値は`;`で区切られていることがわかります。この場合、次の設定を使用してこのファイルからデータを読み込むことができます: + +```sql +SET format_custom_row_before_delimiter = 'row('; +SET format_custom_row_after_delimiter = ')'; +SET format_custom_field_delimiter = ';'; +SET format_custom_row_between_delimiter = ','; +SET format_custom_escaping_rule = 'Quoted'; +``` + +これで、カスタムフォーマット[ファイル](assets/data_small_custom.txt)からデータをロードできます: + +```sql +SELECT * +FROM file('data_small_custom.txt', CustomSeparated) +LIMIT 3 +``` +```response +┌─c1────────────────────────┬─────────c2─┬──c3─┐ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +└───────────────────────────┴────────────┴─────┘ +``` + +[CustomSeparatedWithNames](/docs/ja/interfaces/formats.md/#customseparatedwithnames)を使用して、ヘッダを正しくエクスポートおよびインポートすることもできます。さらに複雑なケースに対処するために、正規表現やテンプレートフォーマットについては[regexとテンプレート](templates-regex.md)を探ってください。 + +## 大容量CSVファイルの操作 + +CSVファイルは大容量になることがあり、ClickHouseはどのようなサイズのファイルでも効率的に操作します。大容量のファイルは通常圧縮されており、ClickHouseは処理前に解凍する必要はありません。Insert中に`COMPRESSION`句を使用できます: + +```sql +INSERT INTO sometable +FROM INFILE 'data_csv.csv.gz' +COMPRESSION 'gzip' FORMAT CSV +``` + +`COMPRESSION`句を省略した場合、ClickHouseはファイルの拡張子に基づいて圧縮形式を推測しようとします。同じアプローチを使用して、ファイルを直接圧縮フォーマットにエクスポートすることもできます: + +```sql +SELECT * +FROM for_csv +INTO OUTFILE 'data_csv.csv.gz' +COMPRESSION 'gzip' FORMAT CSV +``` + +これにより、圧縮された`data_csv.csv.gz`ファイルが作成されます。 + +## その他のフォーマット + +ClickHouseは、さまざまなシナリオやプラットフォームをカバーするために、多くのフォーマット、テキストおよびバイナリー形式のサポートを導入しています。次の記事で、これらのフォーマットおよびそれらを使用する方法についてさらに探ってください: + +- **CSVとTSVフォーマット** +- [Parquet](parquet.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- [ネイティブおよびバイナリーフォーマット](binary.md) +- [SQLフォーマット](sql.md) + +また、ローカル/リモートファイルでClickhouseサーバーを必要とせずに作業を行うための携帯型完全集合ツールである[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)もチェックしてください。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/images/working-with-json_01.png b/docs/ja/integrations/data-ingestion/data-formats/images/working-with-json_01.png new file mode 100644 index 00000000000..012e2f1cdf8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/data-formats/images/working-with-json_01.png differ diff --git a/docs/ja/integrations/data-ingestion/data-formats/intro.md b/docs/ja/integrations/data-ingestion/data-formats/intro.md new file mode 100644 index 00000000000..15b47b7bdee --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/intro.md @@ -0,0 +1,36 @@ +--- +slug: /ja/integrations/data-formats +sidebar_label: 概要 +sidebar_position: 1 +keywords: [clickhouse, CSV, TSV, Parquet, clickhouse-client, clickhouse-local] +--- + +# ClickHouseへのさまざまなデータ形式からのインポート + +このドキュメントのセクションでは、さまざまなファイル形式からのロード例を見つけることができます。 + +### [**バイナリ**](/docs/ja/integrations/data-ingestion/data-formats/binary.md) + +ClickHouse Native、MessagePack、Protocol Buffers、Cap’n Protoなどのバイナリ形式のエクスポートとロード。 + +### [**CSVとTSV**](/docs/ja/integrations/data-ingestion/data-formats/csv-tsv.md) + +カスタムヘッダーとセパレーターを使用したCSVファミリー(TSVを含む)のインポートとエクスポート。 + +### [**JSON**](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) + +オブジェクトや行区切りNDJSONなど、さまざまな形式でのJSONのロードとエクスポート。 + +### [**Parquetデータ**](/docs/ja/integrations/data-ingestion/data-formats/parquet.md) + +ParquetやArrowなど、一般的なApache形式の処理。 + +### [**SQLデータ**](/docs/ja/integrations/data-ingestion/data-formats/sql.md) + +MySQLやPostgresqlにインポートするためのSQLダンプを必要としていますか?これ以上探す必要はありません。 + +BIツールのGrafana、Tableauなどを接続したい場合は、ドキュメントの[ビジュアル化カテゴリー](../../data-visualization.md)をご覧ください。 + +## 関連コンテンツ + +- ブログ: [ClickHouseにおけるデータ形式の紹介](https://clickhouse.com/blog/data-formats-clickhouse-csv-tsv-parquet-native) diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/exporting.md b/docs/ja/integrations/data-ingestion/data-formats/json/exporting.md new file mode 100644 index 00000000000..7714c91d473 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/exporting.md @@ -0,0 +1,173 @@ +--- +title: JSONのエクスポート +slug: /ja/integrations/data-formats/json/exporting +description: ClickHouseからJSONデータをエクスポートする方法 +keywords: [json, clickhouse, formats, exporting] +--- + +# JSONのエクスポート + +インポート用に使用されるほぼすべてのJSONフォーマットは、エクスポートにも使用できます。最も一般的なのは[`JSONEachRow`](/docs/ja/interfaces/formats.md/#jsoneachrow)です: + +```sql +SELECT * FROM sometable FORMAT JSONEachRow +``` +```response +{"path":"Bob_Dolman","month":"2016-11-01","hits":245} +{"path":"1-krona","month":"2017-01-01","hits":4} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3} +``` + +または、カラム名を省略してディスク容量を節約するために[`JSONCompactEachRow`](/ja/interfaces/formats#jsoncompacteachrow)を使用できます: + +```sql +SELECT * FROM sometable FORMAT JSONCompactEachRow +``` +```response +["Bob_Dolman", "2016-11-01", 245] +["1-krona", "2017-01-01", 4] +["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3] +``` + +## データ型を文字列としてオーバーライドする {#overriding-data-types-as-strings} + +ClickHouseはデータ型を尊重し、JSONを標準に従ってエクスポートします。しかし、すべての値を文字列としてエンコードする必要がある場合は、[JSONStringsEachRow](/docs/ja/interfaces/formats.md/#jsonstringseachrow)フォーマットを使用できます: + +```sql +SELECT * FROM sometable FORMAT JSONStringsEachRow +``` +```response +{"path":"Bob_Dolman","month":"2016-11-01","hits":"245"} +{"path":"1-krona","month":"2017-01-01","hits":"4"} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":"3"} +``` + +ここでは、数値カラム`hits`が文字列としてエンコードされています。文字列としてのエクスポートはすべてのJSON*フォーマットでサポートされており、`JSONStrings\*`や`JSONCompactStrings\*`フォーマットを探索できます: + +```sql +SELECT * FROM sometable FORMAT JSONCompactStringsEachRow +``` +```response +["Bob_Dolman", "2016-11-01", "245"] +["1-krona", "2017-01-01", "4"] +["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", "3"] +``` + +## データと共にメタデータをエクスポートする + +アプリで一般的な[JSON](/docs/ja/interfaces/formats.md/#json)フォーマットは、結果データだけでなくカラムタイプやクエリ統計もエクスポートします: + +```sql +SELECT * FROM sometable FORMAT JSON +``` +```response +{ + "meta": + [ + { + "name": "path", + "type": "String" + }, + … + ], + + "data": + [ + { + "path": "Bob_Dolman", + "month": "2016-11-01", + "hits": 245 + }, + … + ], + + "rows": 3, + + "statistics": + { + "elapsed": 0.000497457, + "rows_read": 3, + "bytes_read": 87 + } +} +``` + +[JSONCompact](/docs/ja/interfaces/formats.md/#jsoncompact)フォーマットは、同じメタデータを表示しますが、データ自体をコンパクトな形式で出力します: + +```sql +SELECT * FROM sometable FORMAT JSONCompact +``` +```response +{ + "meta": + [ + { + "name": "path", + "type": "String" + }, + … + ], + + "data": + [ + ["Bob_Dolman", "2016-11-01", 245], + ["1-krona", "2017-01-01", 4], + ["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3] + ], + + "rows": 3, + + "statistics": + { + "elapsed": 0.00074981, + "rows_read": 3, + "bytes_read": 87 + } +} +``` + +すべての値を文字列としてエンコードするために、[`JSONStrings`](/docs/ja/interfaces/formats.md/#jsonstrings)または[`JSONCompactStrings`](/docs/ja/interfaces/formats.md/#jsoncompactstrings)バリアントを検討してください。 + +## JSONデータと構造をコンパクトにエクスポートする方法 + +データとその構造の両方を持つより効率的な方法は、[`JSONCompactEachRowWithNamesAndTypes`](/docs/ja/interfaces/formats.md/#jsoncompacteachrowwithnamesandtypes)フォーマットを使用することです: + +```sql +SELECT * FROM sometable FORMAT JSONCompactEachRowWithNamesAndTypes +``` +```response +["path", "month", "hits"] +["String", "Date", "UInt32"] +["Bob_Dolman", "2016-11-01", 245] +["1-krona", "2017-01-01", 4] +["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3] +``` + +この形式は、カラム名とタイプを持つ2つのヘッダ行を前置したコンパクトなJSON形式を使用します。このフォーマットは別のClickHouseインスタンス(または他のアプリ)にデータをインジェストするために使用できます。 + +## JSONをファイルにエクスポートする + +JSONデータをファイルに保存するには、[INTO OUTFILE](/docs/ja/sql-reference/statements/select/into-outfile.md)句を使用できます: + +```sql +SELECT * FROM sometable INTO OUTFILE 'out.json' FORMAT JSONEachRow +``` +```response +36838935 rows in set. Elapsed: 2.220 sec. Processed 36.84 million rows, 1.27 GB (16.60 million rows/s., 572.47 MB/s.) +``` + +ClickHouseは37百万件近いレコードをJSONファイルにエクスポートするのにわずか2秒しかかかりません。また、`COMPRESSION`句を使用してオンザフライの圧縮を有効にしてエクスポートすることもできます: + +```sql +SELECT * FROM sometable INTO OUTFILE 'out.json.gz' FORMAT JSONEachRow +``` +```response +36838935 rows in set. Elapsed: 22.680 sec. Processed 36.84 million rows, 1.27 GB (1.62 million rows/s., 56.02 MB/s.) +``` + +達成するのにより多くの時間がかかりますが、はるかに小さな圧縮ファイルが生成されます: + +```bash +2.2G out.json +576M out.json.gz +``` diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/formats.md b/docs/ja/integrations/data-ingestion/data-formats/json/formats.md new file mode 100644 index 00000000000..681b82a9703 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/formats.md @@ -0,0 +1,380 @@ +--- +title: 他のJSON形式の処理 +slug: /ja/integrations/data-formats/json/other-formats +description: 他のJSON形式の処理 +keywords: [json, formats, json formats] +--- + +# 他の形式の処理 + +以前のJSONデータのロード例では、[`JSONEachRow`](/ja/interfaces/formats#jsoneachrow) (ndjson) の使用を前提としています。以下に一般的な形式でのJSONのロード例を示します。 + +## JSONオブジェクトの配列 + +JSONデータの最も一般的な形式の1つは、JSON配列にJSONオブジェクトのリストがある形式です。[この例](../assets/list.json)のように: + +```bash +> cat list.json +[ + { + "path": "Akiba_Hebrew_Academy", + "month": "2017-08-01", + "hits": 241 + }, + { + "path": "Aegithina_tiphia", + "month": "2018-02-01", + "hits": 34 + }, + ... +] +``` + +このようなデータのためのテーブルを作成しましょう: + +```sql +CREATE TABLE sometable +( + `path` String, + `month` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY tuple(month, path) +``` + +JSONオブジェクトのリストをインポートするには、[`JSONEachRow`](/docs/ja/interfaces/formats.md/#jsoneachrow)形式を使用します([list.json](../assets/list.json) ファイルからデータを挿入する): + +```sql +INSERT INTO sometable +FROM INFILE 'list.json' +FORMAT JSONEachRow +``` + +`FROM INFILE`句を使用してローカルファイルからデータをロードし、インポートが成功したことを確認できます: + +```sql +SELECT * +FROM sometable +``` +```response +┌─path──────────────────────┬──────month─┬─hits─┐ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +└───────────────────────────┴────────────┴──────┘ +``` + +## NDJSON (行区切りJSON) の処理 + +多くのアプリケーションがJSON形式でデータをログに記録し、各ログ行が個別のJSONオブジェクトとなることがあります。[このファイル](../assets/object-per-line.json) のように: + +```bash +cat object-per-line.json +``` +```response +{"path":"1-krona","month":"2017-01-01","hits":4} +{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3} +{"path":"Bob_Dolman","month":"2016-11-01","hits":245} +``` + +同じ`JSONEachRow`形式はこのようなファイルにも対応できます: + +```sql +INSERT INTO sometable FROM INFILE 'object-per-line.json' FORMAT JSONEachRow; +SELECT * FROM sometable; +``` +```response +┌─path──────────────────────┬──────month─┬─hits─┐ +│ Bob_Dolman │ 2016-11-01 │ 245 │ +│ 1-krona │ 2017-01-01 │ 4 │ +│ Ahmadabad-e_Kalij-e_Sofla │ 2017-01-01 │ 3 │ +└───────────────────────────┴────────────┴──────┘ +``` + +## JSONオブジェクトキー + +場合によっては、JSONオブジェクトのリストが配列要素ではなくオブジェクトプロパティとしてエンコードされることがあります(例として[objects.json](../assets/objects.json) を参照): + +``` +cat objects.json +``` +```response +{ + "a": { + "path":"April_25,_2017", + "month":"2018-01-01", + "hits":2 + }, + "b": { + "path":"Akahori_Station", + "month":"2016-06-01", + "hits":11 + }, + ... +} +``` + +ClickHouseは、この種のデータを[`JSONObjectEachRow`](/docs/ja/interfaces/formats.md/#jsonobjecteachrow)形式を使用してロードできます: + +```sql +INSERT INTO sometable FROM INFILE 'objects.json' FORMAT JSONObjectEachRow; +SELECT * FROM sometable; +``` +```response +┌─path────────────┬──────month─┬─hits─┐ +│ Abducens_palsy │ 2016-05-01 │ 28 │ +│ Akahori_Station │ 2016-06-01 │ 11 │ +│ April_25,_2017 │ 2018-01-01 │ 2 │ +└─────────────────┴────────────┴──────┘ +``` + +### 親オブジェクトキーの値を指定する + +テーブルに親オブジェクトキーの値を保存したい場合は、[次のオプション](/docs/ja/operations/settings/settings-formats.md/#format_json_object_each_row_column_for_object_name)を使用してキー値を保存する列の名前を定義できます: + +```sql +SET format_json_object_each_row_column_for_object_name = 'id' +``` + +元のJSONファイルからどのデータがロードされるかを[`file()`](/docs/ja/sql-reference/functions/files.md/#file) 関数を使用して確認できます: + +```sql +SELECT * FROM file('objects.json', JSONObjectEachRow) +``` +```response +┌─id─┬─path────────────┬──────month─┬─hits─┐ +│ a │ April_25,_2017 │ 2018-01-01 │ 2 │ +│ b │ Akahori_Station │ 2016-06-01 │ 11 │ +│ c │ Abducens_palsy │ 2016-05-01 │ 28 │ +└────┴─────────────────┴────────────┴──────┘ +``` + +`id` カラムがキー値によって正しく埋められていることに注意してください。 + +## JSON配列 + +時には、スペースを節約するために、JSONファイルがオブジェクトではなく配列としてエンコードされることがあります。この場合、[JSON配列のリスト](../assets/arrays.json) を扱います: + +```bash +cat arrays.json +``` +```response +["Akiba_Hebrew_Academy", "2017-08-01", 241], +["Aegithina_tiphia", "2018-02-01", 34], +["1971-72_Utah_Stars_season", "2016-10-01", 1] +``` + +この場合、ClickHouseはこのデータをロードし、配列内の順番に基づいて各値を対応するカラムに割り当てます。[`JSONCompactEachRow`](/docs/ja/interfaces/formats.md/#jsoncompacteachrow)形式を使用します: + +```sql +SELECT * FROM sometable +``` +```response +┌─c1────────────────────────┬─────────c2─┬──c3─┐ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +└───────────────────────────┴────────────┴─────┘ +``` + +### JSON配列から個々のカラムをインポートする + +場合によっては、データが行単位ではなくカラム単位でエンコードされていることがあります。この場合、親JSONオブジェクトに値を持つカラムが含まれています。[次のファイル](../assets/columns.json)を見てみましょう: + +```bash +cat columns.json +``` +```response +{ + "path": ["2007_Copa_America", "Car_dealerships_in_the_USA", "Dihydromyricetin_reductase"], + "month": ["2016-07-01", "2015-07-01", "2015-07-01"], + "hits": [178, 11, 1] +} +``` + +ClickHouseは、このようにフォーマットされたデータを解析するために[`JSONColumns`](/docs/ja/interfaces/formats.md/#jsoncolumns)形式を使用します: + +```sql +SELECT * FROM file('columns.json', JSONColumns) +``` +```response +┌─path───────────────────────┬──────month─┬─hits─┐ +│ 2007_Copa_America │ 2016-07-01 │ 178 │ +│ Car_dealerships_in_the_USA │ 2015-07-01 │ 11 │ +│ Dihydromyricetin_reductase │ 2015-07-01 │ 1 │ +└────────────────────────────┴────────────┴──────┘ +``` + +よりコンパクトな形式もサポートされており、オブジェクトではなく[列の配列](../assets/columns-array.json)を扱う場合には[`JSONCompactColumns`](/docs/ja/interfaces/formats.md/#jsoncompactcolumns)形式を使用します: + +```sql +SELECT * FROM file('columns-array.json', JSONCompactColumns) +``` +```response +┌─c1──────────────┬─────────c2─┬─c3─┐ +│ Heidenrod │ 2017-01-01 │ 10 │ +│ Arthur_Henrique │ 2016-11-01 │ 12 │ +│ Alan_Ebnother │ 2015-11-01 │ 66 │ +└─────────────────┴────────────┴────┘ +``` + +## 解析せずにJSONオブジェクトを保存する + +場合によっては、JSONオブジェクトを解析せずに単一の`String`(またはJSON) カラムに保存したいことがあります。異なる構造のJSONオブジェクトのリストを扱う場合に便利です。[このファイル](../assets/custom.json)を見てみましょう。ここには親リストの中に異なるJSONオブジェクトがあります: + +```bash +cat custom.json +``` +```response +[ + {"name": "Joe", "age": 99, "type": "person"}, + {"url": "/my.post.MD", "hits": 1263, "type": "post"}, + {"message": "Warning on disk usage", "type": "log"} +] +``` + +これらの元のJSONオブジェクトを次のテーブルに保存したいと思います: + +```sql +CREATE TABLE events +( + `data` String +) +ENGINE = MergeTree +ORDER BY () +``` + +そして、JSONオブジェクトを解析せずに保持するために[`JSONAsString`](/docs/ja/interfaces/formats.md/#jsonasstring)形式を使用してファイルからこのテーブルにデータをロードできます: + +```sql +INSERT INTO events (data) +FROM INFILE 'custom.json' +FORMAT JSONAsString +``` + +保存されたオブジェクトをクエリするために[JSON functions](/docs/ja/sql-reference/functions/json-functions.md)を使用できます: + +```sql +SELECT + JSONExtractString(data, 'type') AS type, + data +FROM events +``` +```response +┌─type───┬─data─────────────────────────────────────────────────┐ +│ person │ {"name": "Joe", "age": 99, "type": "person"} │ +│ post │ {"url": "/my.post.MD", "hits": 1263, "type": "post"} │ +│ log │ {"message": "Warning on disk usage", "type": "log"} │ +└────────┴──────────────────────────────────────────────────────┘ +``` + +`JSONAsString`は通常`JSONEachRow`形式で使用されるJSONオブジェクトが行ごとにフォーマットされたファイルでも問題なく動作します。 + +## 入れ子になったオブジェクトのスキーマ + +[入れ子になったJSONオブジェクト](../assets/list-nested.json)を扱う場合は、追加でスキーマを定義し、複合型([`Array`](/docs/ja/sql-reference/data-types/array.md/)、[`Object Data Type`](/ja/sql-reference/data-types/object-data-type)または[`Tuple`](/docs/ja/sql-reference/data-types/tuple.md/))を使用してデータをロードできます: + +```sql +SELECT * +FROM file('list-nested.json', JSONEachRow, 'page Tuple(path String, title String, owner_id UInt16), month Date, hits UInt32') +LIMIT 1 +``` +```response +┌─page───────────────────────────────────────────────┬──────month─┬─hits─┐ +│ ('Akiba_Hebrew_Academy','Akiba Hebrew Academy',12) │ 2017-08-01 │ 241 │ +└────────────────────────────────────────────────────┴────────────┴──────┘ +``` + +## 入れ子になったJSONオブジェクトへのアクセス + +入れ子になったJSONキーを参照するために、[次の設定オプション](/docs/ja/operations/settings/settings-formats.md/#input_format_import_nested_json)を有効にします: + +```sql +SET input_format_import_nested_json = 1 +``` + +これにより、入れ子になったJSONオブジェクトキーをドット表記法を使用して参照できます(機能させるためにバックティック記号でラップすることを忘れないでください): + +```sql +SELECT * +FROM file('list-nested.json', JSONEachRow, '`page.owner_id` UInt32, `page.title` String, month Date, hits UInt32') +LIMIT 1 +``` +```results +┌─page.owner_id─┬─page.title───────────┬──────month─┬─hits─┐ +│ 12 │ Akiba Hebrew Academy │ 2017-08-01 │ 241 │ +└───────────────┴──────────────────────┴────────────┴──────┘ +``` + +この方法で、入れ子になったJSONオブジェクトをフラット化したり、いくつかの入れ子になった値を使用してそれらを個別のカラムとして保存できます。 + +## 不明なカラムをスキップする + +デフォルトでは、ClickHouseはJSONデータのインポート時に不明なカラムを無視します。`month`カラムがないテーブルに元のファイルをインポートしてみましょう: + +```sql +CREATE TABLE shorttable +( + `path` String, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY path +``` + +元の3カラムのJSONデータをこのテーブルに挿入することができます: + +```sql +INSERT INTO shorttable FROM INFILE 'list.json' FORMAT JSONEachRow; +SELECT * FROM shorttable +``` +```response +┌─path──────────────────────┬─hits─┐ +│ 1971-72_Utah_Stars_season │ 1 │ +│ Aegithina_tiphia │ 34 │ +│ Akiba_Hebrew_Academy │ 241 │ +└───────────────────────────┴──────┘ +``` + +ClickHouseはインポート時に不明なカラムを無視します。これは[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)設定オプションによって無効にできます: + +```sql +SET input_format_skip_unknown_fields = 0; +INSERT INTO shorttable FROM INFILE 'list.json' FORMAT JSONEachRow; +``` +```response +Ok. +Exception on client: +Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: month: (in file/uri /data/clickhouse/user_files/list.json): (at row 1) +``` + +ClickHouseはJSONとテーブルのカラム構造が不一致の際に例外をスローします。 + +## BSON + +ClickHouseは、[BSON](https://bsonspec.org/)でエンコードされたファイルのデータのエクスポートとインポートを許可します。この形式は、いくつかのデータベース管理システム(例: [MongoDB](https://github.com/mongodb/mongo) データベース)で使用されます。 + +BSONデータをインポートするには、[BSONEachRow](/docs/ja/interfaces/formats.md/#bsoneachrow)形式を使用します。[このBSONファイル](../assets/data.bson)からデータをインポートしてみましょう: + +```sql +SELECT * FROM file('data.bson', BSONEachRow) +``` +```response +┌─path──────────────────────┬─month─┬─hits─┐ +│ Bob_Dolman │ 17106 │ 245 │ +│ 1-krona │ 17167 │ 4 │ +│ Ahmadabad-e_Kalij-e_Sofla │ 17167 │ 3 │ +└───────────────────────────┴───────┴──────┘ +``` + +同じ形式を使用してBSONファイルにエクスポートすることもできます: + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'out.bson' +FORMAT BSONEachRow +``` + +その後、データが`out.bson`ファイルにエクスポートされます。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/inference.md b/docs/ja/integrations/data-ingestion/data-formats/json/inference.md new file mode 100644 index 00000000000..4b7ebe1a6a3 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/inference.md @@ -0,0 +1,279 @@ +--- +title: JSON スキーマの推論 +slug: /ja/integrations/data-formats/json/inference +description: JSON スキーマの推論の使用方法 +keywords: [json, schema, inference, schema inference] +--- + +ClickHouse は JSON データの構造を自動的に判別できます。これを利用して、`clickhouse-local` や S3バケット上のディスクに直接 JSON データをクエリ**する、またはデータを ClickHouse にロードする前にスキーマを自動的に作成することが可能です。 + +## 型推論を使用する場合 + +* **一貫した構造** - 型を推論しようとしているデータに、興味のある全カラムが含まれている場合。推論後に追加されたカラムを含むデータは無視され、クエリできません。 +* **一貫した型** - 特定のカラムのデータ型が互換性を持たなければなりません。 + +:::note 重要 +もし新しいキーがスキーマを変更する十分な警告なしに追加される動的な JSON をお持ちの場合は、例えば Kubernetes のログラベルなど、[**JSON スキーマの設計**](/docs/ja/integrations/data-formats/json/schema)の読解を推奨します。 +::: + +## 型の検出 + +以前の例では、NDJSON形式の[Python PyPI データセット](https://clickpy.clickhouse.com/)の簡単なバージョンを使用していました。このセクションでは、2.5百万の学術論文を含むネストされた構造を持つより複雑な[arXiv データセット](https://www.kaggle.com/datasets/Cornell-University/arxiv?resource=download)を調査します。このデータセットは NDJSON として配布され、各行が発表された学術論文を表しています。以下に例となる行を示します。 + +```json +{ + "id": "2101.11408", + "submitter": "Daniel Lemire", + "authors": "Daniel Lemire", + "title": "Number Parsing at a Gigabyte per Second", + "comments": "Software at https://github.com/fastfloat/fast_float and\n https://github.com/lemire/simple_fastfloat_benchmark/", + "journal-ref": "Software: Practice and Experience 51 (8), 2021", + "doi": "10.1002/spe.2984", + "report-no": null, + "categories": "cs.DS cs.MS", + "license": "http://creativecommons.org/licenses/by/4.0/", + "abstract": "With disks and networks providing gigabytes per second ....\n", + "versions": [ + { + "created": "Mon, 11 Jan 2021 20:31:27 GMT", + "version": "v1" + }, + { + "created": "Sat, 30 Jan 2021 23:57:29 GMT", + "version": "v2" + } + ], + "update_date": "2022-11-07", + "authors_parsed": [ + [ + "Lemire", + "Daniel", + "" + ] + ] +} +``` + +このデータは、以前の例よりも複雑なスキーマを必要とします。このスキーマを定義するプロセスを以下に示し、`Tuple` や `Array` などの複雑な型を導入します。 + +このデータセットは公開されている S3 バケット `s3://datasets-documentation/arxiv/arxiv.json.gz` に保存されています。 + +上記のデータセットにはネストされた JSON オブジェクトが含まれていることがわかります。ユーザーはスキーマを作成しバージョン管理するべきですが、推論によりデータから型を推測することができます。これによりスキーマ DDL が自動生成され、手動で作成する必要がなくなり、開発プロセスが加速されます。 + +:::note 自動フォーマット検出 +スキーマを検出するだけでなく、JSON スキーマ推論はファイルの拡張子や内容からデータのフォーマットを自動的に推測します。上記のファイルは、その結果として自動的に NDJSON として認識されます。 +::: + +[s3 関数](/ja/sql-reference/table-functions/s3)と `DESCRIBE` コマンドを使用すると、推論される型を確認できます。 + +```sql +DESCRIBE TABLE s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +SETTINGS describe_compact_output = 1 +``` +```response +┌─name───────────┬─type────────────────────────────────────────────────────────────────────┐ +│ id │ Nullable(String) │ +│ submitter │ Nullable(String) │ +│ authors │ Nullable(String) │ +│ title │ Nullable(String) │ +│ comments │ Nullable(String) │ +│ journal-ref │ Nullable(String) │ +│ doi │ Nullable(String) │ +│ report-no │ Nullable(String) │ +│ categories │ Nullable(String) │ +│ license │ Nullable(String) │ +│ abstract │ Nullable(String) │ +│ versions │ Array(Tuple(created Nullable(String),version Nullable(String))) │ +│ update_date │ Nullable(Date) │ +│ authors_parsed │ Array(Array(Nullable(String))) │ +└────────────────┴─────────────────────────────────────────────────────────────────────────┘ +``` + +:::note null の回避 +多くのカラムが Nullable として検出されていることがわかります。[Nullable の使用は推奨されていません](https://clickhouse.com/docs/ja/sql-reference/data-types/nullable#storage-features)が、絶対に必要な場合を除いて使用は避けてください。[schema_inference_make_columns_nullable](https://clickhouse.com/docs/ja/interfaces/schema-inference#schema_inference_make_columns_nullable)を使用して、Nullable が適用されるときの挙動を制御できます。 +::: + +ほとんどのカラムが自動的に `String` として検出されている一方、`update_date` カラムは正しく `Date` として検出されています。`versions` カラムはオブジェクトのリストを格納するために `Array(Tuple(created String, version String))` として作成され、`authors_parsed` はネストされた配列のために `Array(Array(String))` として定義されています。 + +:::note 型検出の制御 +日付や日時の自動検出は、設定 [`input_format_try_infer_dates`](/docs/ja/interfaces/schema-inference#input_format_try_infer_dates)および[`input_format_try_infer_datetimes`](/docs/ja/interfaces/schema-inference#input_format_try_infer_datetimes)(いずれもデフォルトで有効)を通して制御できます。オブジェクトをタプルとして推測することは、設定 [`input_format_json_try_infer_named_tuples_from_objects`](/docs/ja/operations/settings/formats#input_format_json_try_infer_named_tuples_from_objects)によって制御されます。JSON のスキーマ推論を制御するその他の設定、例えば数字の自動検出は[こちらを参照してください](/docs/ja/interfaces/schema-inference#text-formats)。 +::: + +## JSON のクエリ + +スキーマ推論に依存して JSON データをその場でクエリできます。下記にあるように、日付と配列が自動的に検出されることを利用して、各年のトップ著者を探します。 + +```sql +SELECT + toYear(update_date) AS year, + authors, + count() AS c +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +GROUP BY + year, + authors +ORDER BY + year ASC, + c DESC +LIMIT 1 BY year + +┌─year─┬─authors────────────────────────────────────┬───c─┐ +│ 2007 │ The BABAR Collaboration, B. Aubert, et al │ 98 │ +│ 2008 │ The OPAL collaboration, G. Abbiendi, et al │ 59 │ +│ 2009 │ Ashoke Sen │ 77 │ +│ 2010 │ The BABAR Collaboration, B. Aubert, et al │ 117 │ +│ 2011 │ Amelia Carolina Sparavigna │ 21 │ +│ 2012 │ ZEUS Collaboration │ 140 │ +│ 2013 │ CMS Collaboration │ 125 │ +│ 2014 │ CMS Collaboration │ 87 │ +│ 2015 │ ATLAS Collaboration │ 118 │ +│ 2016 │ ATLAS Collaboration │ 126 │ +│ 2017 │ CMS Collaboration │ 122 │ +│ 2018 │ CMS Collaboration │ 138 │ +│ 2019 │ CMS Collaboration │ 113 │ +│ 2020 │ CMS Collaboration │ 94 │ +│ 2021 │ CMS Collaboration │ 69 │ +│ 2022 │ CMS Collaboration │ 62 │ +│ 2023 │ ATLAS Collaboration │ 128 │ +│ 2024 │ ATLAS Collaboration │ 120 │ +└──────┴────────────────────────────────────────────┴─────┘ + +18 rows in set. Elapsed: 20.172 sec. Processed 2.52 million rows, 1.39 GB (124.72 thousand rows/s., 68.76 MB/s.) +``` + +スキーマ推論により、スキーマを指定することなく JSON ファイルをクエリできるため、アドホックなデータ解析作業が加速されます。 + +## テーブルの作成 + +スキーマ推論に依存して、テーブルのスキーマを作成することができます。以下の `CREATE AS EMPTY` コマンドは、テーブルの DDL を推論し、テーブルが作成されることを引き起こします。これはデータをロードしません: + +```sql +CREATE TABLE arxiv +ENGINE = MergeTree +ORDER BY update_date EMPTY +AS SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +SETTINGS schema_inference_make_columns_nullable = 0 +``` + +テーブルスキーマを確認するには、`SHOW CREATE TABLE` コマンドを使用します: + +```sql +SHOW CREATE TABLE arxiv + +CREATE TABLE arxiv +( + `id` String, + `submitter` String, + `authors` String, + `title` String, + `comments` String, + `journal-ref` String, + `doi` String, + `report-no` String, + `categories` String, + `license` String, + `abstract` String, + `versions` Array(Tuple(created String, version String)), + `update_date` Date, + `authors_parsed` Array(Array(String)) +) +ENGINE = MergeTree +ORDER BY update_date +SETTINGS index_granularity = 8192 +``` + +上記は、このデータに適した正しいスキーマです。スキーマ推論は、データのサンプリングと行単位での読み取りに基づいて行われます。カラム値はフォーマットに従って抽出され、再帰パーサーとヒューリスティックが各値の型を判定するために使用されます。スキーマ推論でデータから読み取る行数とバイト数の最大値は、設定 [`input_format_max_rows_to_read_for_schema_inference`](/docs/ja/interfaces/schema-inference#input_format_max_rows_to_read_for_schema_inferenceinput_format_max_bytes_to_read_for_schema_inference)(デフォルトで25000)および [`input_format_max_bytes_to_read_for_schema_inference`](/docs/ja/interfaces/schema-inference#input_format_max_rows_to_read_for_schema_inferenceinput_format_max_bytes_to_read_for_schema_inference)(デフォルトで32MB)によって制御されます。検出が正しくない場合、ユーザーは[こちら](/docs/ja/interfaces/schema-inference#schema_inference_hints)で説明されているようにヒントを提供できます。 + +### スニペットからテーブルを作成する + +上記の例では、S3 のファイルを使用してテーブルスキーマを作成しています。ユーザーは単一行のスニペットからスキーマを作成したいかもしれません。これは、[format](/docs/ja/sql-reference/table-functions/format)関数を使用して実現できます: + +```sql +CREATE TABLE arxiv +ENGINE = MergeTree +ORDER BY update_date EMPTY +AS SELECT * +FROM format(JSONEachRow, '{"id":"2101.11408","submitter":"Daniel Lemire","authors":"Daniel Lemire","title":"Number Parsing at a Gigabyte per Second","comments":"Software at https://github.com/fastfloat/fast_float and","doi":"10.1002/spe.2984","report-no":null,"categories":"cs.DS cs.MS","license":"http://creativecommons.org/licenses/by/4.0/","abstract":"Withdisks and networks providing gigabytes per second ","versions":[{"created":"Mon, 11 Jan 2021 20:31:27 GMT","version":"v1"},{"created":"Sat, 30 Jan 2021 23:57:29 GMT","version":"v2"}],"update_date":"2022-11-07","authors_parsed":[["Lemire","Daniel",""]]}') SETTINGS schema_inference_make_columns_nullable = 0 + +SHOW CREATE TABLE arxiv + +CREATE TABLE arxiv +( + `id` String, + `submitter` String, + `authors` String, + `title` String, + `comments` String, + `doi` String, + `report-no` String, + `categories` String, + `license` String, + `abstract` String, + `versions` Array(Tuple(created String, version String)), + `update_date` Date, + `authors_parsed` Array(Array(String)) +) +ENGINE = MergeTree +ORDER BY update_date +``` + +## JSON データのロード + +前述のコマンドはデータをロードできるテーブルを作成しました。以下の `INSERT INTO SELECT` を使用してデータをテーブルに挿入できます: + +```sql +INSERT INTO arxiv SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') + +0 rows in set. Elapsed: 38.498 sec. Processed 2.52 million rows, 1.39 GB (65.35 thousand rows/s., 36.03 MB/s.) +Peak memory usage: 870.67 MiB. +``` + +その他のソース、たとえばファイルからのデータロードの例は[こちら](/docs/ja/sql-reference/statements/insert-into)を参照してください。 + +ロード後、フォーマット `PrettyJSONEachRow` を使用して行を元の構造で表示し、データをクエリできます: + +```sql +SELECT * +FROM arxiv +LIMIT 1 +FORMAT PrettyJSONEachRow + +{ + "id": "0704.0004", + "submitter": "David Callan", + "authors": "David Callan", + "title": "A determinant of Stirling cycle numbers counts unlabeled acyclic", + "comments": "11 pages", + "journal-ref": "", + "doi": "", + "report-no": "", + "categories": "math.CO", + "license": "", + "abstract": " We show that a determinant of Stirling cycle numbers counts unlabeled acyclic\nsingle-source automata.", + "versions": [ + { + "created": "Sat, 31 Mar 2007 03:16:14 GMT", + "version": "v1" + } + ], + "update_date": "2007-05-23", + "authors_parsed": [ + [ + "Callan", + "David" + ] + ] +} + +1 row in set. Elapsed: 0.009 sec. +``` + +## エラーの処理 + +時折、不適切なデータに遭遇することがあります。特定のカラムが適切な型を持っていない場合や不適切にフォーマットされた JSON などです。そのため、挿入エラーを引き起こすデータがある場合に特定の行を無視するための [`input_format_allow_errors_ratio`](/docs/ja/operations/settings/formats#input_format_allow_errors_ratio) 設定を使用できます。さらに、推論を支援するための[ヒント](/docs/ja/interfaces/schema-inference#schema_inference_hints)を提供することも可能です。 + +## さらなる学習 + +データ型推論についての詳細は、[こちら](/ja/interfaces/schema-inference)のドキュメントページを参照してください。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/intro.md b/docs/ja/integrations/data-ingestion/data-formats/json/intro.md new file mode 100644 index 00000000000..0dc3f760df9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/intro.md @@ -0,0 +1,37 @@ +--- +sidebar_label: 概要 +sidebar_position: 10 +title: JSONの操作 +slug: /ja/integrations/data-formats/json/overview +description: ClickHouseでのJSONの操作 +keywords: [json, clickhouse] +--- + +# 概要 + +
+ +
+ +
+ +ClickHouseは、JSONを扱うためのいくつかのアプローチを提供しており、それぞれに利点と欠点、および利用用途があります。このガイドでは、JSONをどのようにロードし、スキーマを最適に設計するかについて説明します。以下のセクションで構成されています: + +- [JSONのロード](/docs/ja/integrations/data-formats/json/loading) - 簡単なスキーマを使用してClickHouseでJSON(特に[NDJSON](https://github.com/ndjson/ndjson-spec))をロードし、クエリを実行します。 +- [JSONスキーマの推測](/docs/ja/integrations/data-formats/json/inference) - JSONスキーマの推測を使用してJSONをクエリし、テーブルスキーマを作成します。 +- [JSONスキーマの設計](/docs/ja/integrations/data-formats/json/schema) - JSONスキーマを設計し最適化するためのステップ。 +- [JSONのエクスポート](/docs/ja/integrations/data-formats/json/exporting) - JSONをどのようにエクスポートするかについて。 +- [その他のJSON形式の処理](/docs/ja/integrations/data-formats/json/other-formats) - NDJSON以外のJSON形式を処理するためのいくつかのヒント。 +- [JSONをモデリングするためのその他のアプローチ](/docs/ja/integrations/data-formats/json/other-approaches) - JSONをモデリングするための高度なアプローチ。**推奨されません。** + +:::note 重要: 新しいJSONタイプが間もなくリリースされます +このガイドでは、既存のJSON処理技術について考慮しています。現在、新しいJSONタイプが活発に開発されており、間もなく利用可能になります。この機能の進捗状況については、[このGitHub issue](https://github.com/ClickHouse/ClickHouse/issues/54864)を追ってください。この新しいデータタイプは、既存の廃止予定の[オブジェクトデータタイプ](/docs/ja/sql-reference/data-types/object-data-type)(エイリアス`JSON`)に取って代わります。 +::: diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/loading.md b/docs/ja/integrations/data-ingestion/data-formats/json/loading.md new file mode 100644 index 00000000000..ea23837cc90 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/loading.md @@ -0,0 +1,101 @@ +--- +sidebar_label: JSONの読み込み +sidebar_position: 20 +title: JSONの操作 +slug: /ja/integrations/data-formats/json/loading +description: JSONの読み込み +keywords: [json, clickhouse, 挿入, 読み込み] +--- + +# JSONの読み込み + +このセクションでは、JSONデータが[NDJSON](https://github.com/ndjson/ndjson-spec)(改行区切りJSON)形式、ClickHouseでいうところの[`JSONEachRow`](/ja/interfaces/formats#jsoneachrow)であると仮定します。これは、その簡潔さと効率的なスペース使用からJSONを読み込むための推奨形式ですが、他の形式も[入力と出力](/docs/ja/interfaces/formats#json)に対してサポートされています。 + +次のJSONサンプルを考えます。これは[Python PyPIデータセット](https://clickpy.clickhouse.com/)の行を表しています: + +```json +{ + "date": "2022-11-15", + "country_code": "ES", + "project": "clickhouse-connect", + "type": "bdist_wheel", + "installer": "pip", + "python_minor": "3.9", + "system": "Linux", + "version": "0.3.0" +} +``` + +このJSONオブジェクトをClickHouseにロードするためには、テーブルスキーマを定義する必要があります。以下に示されているのは、**JSONキーがカラム名にマッピングされる**シンプルなスキーマです: + +```sql +CREATE TABLE pypi ( + `date` Date, + `country_code` String, + `project` String, + `type` String, + `installer` String, + `python_minor` String, + `system` String, + `version` String +) +ENGINE = MergeTree +ORDER BY (project, date) +``` + +:::note 並び替えキーについて +ここでは、`ORDER BY`句を使用して並び替えキーを選択しています。並び替えキーの詳細と選択方法については、[こちら](/docs/ja/data-modeling/schema-design#choosing-an-ordering-key)を参照してください。 +::: + +ClickHouseは複数の形式でJSONデータを読み込むことができ、拡張子と内容から自動的に型を推測します。上記のテーブルに対してJSONファイルを読み取るには、[S3関数](/docs/ja/sql-reference/table-functions/s3)を使用します: + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/json/*.json.gz') +LIMIT 1 +┌───────date─┬─country_code─┬─project────────────┬─type────────┬─installer────┬─python_minor─┬─system─┬─version─┐ +│ 2022-11-15 │ CN │ clickhouse-connect │ bdist_wheel │ bandersnatch │ │ │ 0.2.8 │ +└────────────┴──────────────┴────────────────────┴─────────────┴──────────────┴──────────────┴────────┴─────────┘ + +1 row in set. Elapsed: 1.232 sec. +``` + +ここではファイル形式を指定する必要がないことに注目してください。代わりに、バケット内のすべての`*.json.gz`ファイルを読み取るためにglobパターンを使用しています。ClickHouseは拡張子と内容から形式が`JSONEachRow`(ndjson)であることを自動的に推測します。ClickHouseが形式を検出できない場合でも、パラメータ関数を使用して手動で形式を指定できます。 + +```sql +SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/json/*.json.gz', JSONEachRow) +``` + +:::note 圧縮ファイルについて +上記のファイルは圧縮されていますが、これはClickHouseによって自動的に検出および処理されます。 +::: + +これらのファイルの行を読み込むには、[`INSERT INTO SELECT`](/ja/sql-reference/statements/insert-into#inserting-the-results-of-select)を使用します: + +```sql +INSERT INTO pypi SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/pypi/json/*.json.gz') +Ok. + +0 rows in set. Elapsed: 10.445 sec. Processed 19.49 million rows, 35.71 MB (1.87 million rows/s., 3.42 MB/s.) + +SELECT * FROM pypi LIMIT 2 + +┌───────date─┬─country_code─┬─project────────────┐ +│ 2022-05-26 │ CN │ clickhouse-connect │ +│ 2022-05-26 │ CN │ clickhouse-connect │ +└────────────┴──────────────┴────────────────────┘ + +2 rows in set. Elapsed: 0.005 sec. Processed 8.19 thousand rows, 908.03 KB (1.63 million rows/s., 180.38 MB/s.) +``` + +行は[`FORMAT`句](/ja/sql-reference/statements/select/format)を使ってインラインで読み込むこともできます。例えば + +```sql +INSERT INTO pypi +FORMAT JSONEachRow +{"date":"2022-11-15","country_code":"CN","project":"clickhouse-connect","type":"bdist_wheel","installer":"bandersnatch","python_minor":"","system":"","version":"0.2.8"} +``` + +これらの例はJSONEachRow形式の使用を前提としています。他の一般的なJSON形式もサポートされており、それらのロード方法についての例は[こちら](/docs/ja/integrations/data-formats/json/other-formats)で提供されています。 + +上記では非常にシンプルなJSONデータの読み込み例を提供しました。ネストされた構造を含むより複雑なJSONについては、[**JSONスキーマの設計**](/docs/ja/integrations/data-formats/json/schema)ガイドを参照してください。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/other.md b/docs/ja/integrations/data-ingestion/data-formats/json/other.md new file mode 100644 index 00000000000..e946e9de57c --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/other.md @@ -0,0 +1,318 @@ +--- +title: JSONをモデル化する他のアプローチ +slug: /ja/integrations/data-formats/json/other-approaches +description: JSONをモデル化する他のアプローチ +keywords: [json, formats] +--- + +# JSONをモデル化する他のアプローチ + +**以下は、ClickHouseでJSONをモデル化する際の代替手段です。これらは完全性のために文書化されていますが、ほとんどの使用ケースでは推奨されず、適用されません。** + +## ネストを使用する + +[Nested型](/docs/ja/sql-reference/data-types/nested-data-structures/nested)は、変更されることが少ない静的なオブジェクトをモデル化するために使用できます。これは`Tuple`および`Array(Tuple)`の代替手段を提供します。一般的に、この型はその動作がしばしば混乱を招くため、JSONに使用することは避けることをお勧めします。`Nested`の主な利点は、サブカラムがソートキーで使用できることです。 + +以下に、静的オブジェクトをモデル化するためのNested型の使用例を示します。次のような単純なログエントリをJSONで考えます: + +```json +{ + "timestamp": 897819077, + "clientip": "45.212.12.0", + "request": { + "method": "GET", + "path": "/french/images/hm_nav_bar.gif", + "version": "HTTP/1.0" + }, + "status": 200, + "size": 3305 +} +``` + +`request`キーを`Nested`として宣言できます。`Tuple`と同様に、サブカラムを指定する必要があります。 + +```sql +-- デフォルト +SET flatten_nested=1 +CREATE table http +( + timestamp Int32, + clientip IPv4, + request Nested(method LowCardinality(String), path String, version LowCardinality(String)), + status UInt16, + size UInt32, +) ENGINE = MergeTree() ORDER BY (status, timestamp); +``` + +### flatten_nested + +設定`flatten_nested`はネストの動作を制御します。 + +#### flatten_nested=1 + +`1`(デフォルト)の値は、任意のレベルのネストをサポートしません。この値では、ネストされたデータ構造を同じ長さの複数の[Array](/docs/ja/sql-reference/data-types/array)カラムとして考えるのが最も簡単です。`method`、`path`、および`version`のフィールドは全て別々の`Array(Type)`カラムとして機能し、重要な制約として **`method`、`path`、および`version`フィールドの長さは同じでなければなりません。** これを説明するために、`SHOW CREATE TABLE`を使用すると以下のようになります: + +```sql +SHOW CREATE TABLE http + +CREATE TABLE http +( + `timestamp` Int32, + `clientip` IPv4, + `request.method` Array(LowCardinality(String)), + `request.path` Array(String), + `request.version` Array(LowCardinality(String)), + `status` UInt16, + `size` UInt32 +) +ENGINE = MergeTree +ORDER BY (status, timestamp) +``` + +以下、このテーブルに挿入します: + +```sql +SET input_format_import_nested_json = 1; +INSERT INTO http +FORMAT JSONEachRow +{"timestamp":897819077,"clientip":"45.212.12.0","request":[{"method":"GET","path":"/french/images/hm_nav_bar.gif","version":"HTTP/1.0"}],"status":200,"size":3305} +``` + +ここでのいくつかの重要なポイント: + +* JSONをネストされた構造として挿入するために、`input_format_import_nested_json`設定を使用する必要があります。これがない場合、JSONをフラットにする必要があります。例: + + ```sql + INSERT INTO http FORMAT JSONEachRow + {"timestamp":897819077,"clientip":"45.212.12.0","request":{"method":["GET"],"path":["/french/images/hm_nav_bar.gif"],"version":["HTTP/1.0"]},"status":200,"size":3305} + ``` +* ネストされたフィールド`method`、`path`、および`version`はJSON配列として渡す必要があります。例: + + ```json + { + "@timestamp": 897819077, + "clientip": "45.212.12.0", + "request": { + "method": [ + "GET" + ], + "path": [ + "/french/images/hm_nav_bar.gif" + ], + "version": [ + "HTTP/1.0" + ] + }, + "status": 200, + "size": 3305 + } + ``` + +カラムはドット表記を使用してクエリできます: + +```sql +SELECT clientip, status, size, `request.method` FROM http WHERE has(request.method, 'GET'); + +┌─clientip────┬─status─┬─size─┬─request.method─┐ +│ 45.212.12.0 │ 200 │ 3305 │ ['GET'] │ +└─────────────┴────────┴──────┴────────────────┘ +1 row in set. Elapsed: 0.002 sec. +``` + +サブカラムの`Array`使用は、完全な[Array関数](/docs/ja/sql-reference/functions/array-functions)を潜在的に活用できることを意味し、カラムに複数の値がある場合には[`ARRAY JOIN`](/docs/ja/sql-reference/statements/select/array-join)句が役立ちます。 + +#### flatten_nested=0 + +これは任意のレベルのネストを許可し、ネストされたカラムは`Tuple`の単一の配列として保持されます - 実質的に`Array(Tuple)`と同じになります。 + +**これが`Nested`を使ったJSONの使用において推奨される方法であり、しばしば最も単純な方法です。以下に示すように、オブジェクトすべてがリストであることを必要とするだけです。** + +以下では、テーブルを再作成し、行を再挿入します: + +```sql +CREATE TABLE http +( + `timestamp` Int32, + `clientip` IPv4, + `request` Nested(method LowCardinality(String), path String, version LowCardinality(String)), + `status` UInt16, + `size` UInt32 +) +ENGINE = MergeTree +ORDER BY (status, timestamp) + +SHOW CREATE TABLE http + +-- note Nested type is preserved. +CREATE TABLE default.http +( + `timestamp` Int32, + `clientip` IPv4, + `request` Nested(method LowCardinality(String), path String, version LowCardinality(String)), + `status` UInt16, + `size` UInt32 +) +ENGINE = MergeTree +ORDER BY (status, timestamp) + +INSERT INTO http +FORMAT JSONEachRow +{"timestamp":897819077,"clientip":"45.212.12.0","request":[{"method":"GET","path":"/french/images/hm_nav_bar.gif","version":"HTTP/1.0"}],"status":200,"size":3305} +``` + +ここでのいくつかの重要なポイント: + +* `input_format_import_nested_json`は挿入に必要ありません。 +* `SHOW CREATE TABLE`では`Nested`型が保持されます。このカラムの内部には実質的には`Array(Tuple(Nested(method LowCardinality(String), path String, version LowCardinality(String))))`があります。 +* 結果として、`request`を配列として挿入する必要があります。例: + + ```json + { + "timestamp": 897819077, + "clientip": "45.212.12.0", + "request": [ + { + "method": "GET", + "path": "/french/images/hm_nav_bar.gif", + "version": "HTTP/1.0" + } + ], + "status": 200, + "size": 3305 + } + ``` + +カラムは再度、ドット表記を使用してクエリできます: + +```sql +SELECT clientip, status, size, `request.method` FROM http WHERE has(request.method, 'GET'); + +┌─clientip────┬─status─┬─size─┬─request.method─┐ +│ 45.212.12.0 │ 200 │ 3305 │ ['GET'] │ +└─────────────┴────────┴──────┴────────────────┘ +1 row in set. Elapsed: 0.002 sec. +``` + +### 例 + +上記のデータの大きな例は、s3のパブリックバケットにあります:`s3://datasets-documentation/http/`。 + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', 'JSONEachRow') +LIMIT 1 +FORMAT PrettyJSONEachRow + +{ + "@timestamp": "893964617", + "clientip": "40.135.0.0", + "request": { + "method": "GET", + "path": "\/images\/hm_bg.jpg", + "version": "HTTP\/1.0" + }, + "status": "200", + "size": "24736" +} + +1 row in set. Elapsed: 0.312 sec. +``` + +JSONの制約と入力形式を考慮して、このサンプルデータセットを次のクエリを使用して挿入します。ここでは、`flatten_nested=0`を設定します。 + +次の文は1000万行を挿入するため、実行に数分かかる場合があります。必要であれば`LIMIT`を適用してください。 + +```sql +INSERT INTO http +SELECT `@timestamp` AS `timestamp`, clientip, [request], status, +size FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', +'JSONEachRow'); +``` + +このデータをクエリするには、リクエストフィールドを配列としてアクセスする必要があります。以下では、固定された期間にわたるエラーとhttpメソッドをまとめています。 + +```sql +SELECT status, request.method[1] as method, count() as c +FROM http +WHERE status >= 400 + AND toDateTime(timestamp) BETWEEN '1998-01-01 00:00:00' AND '1998-06-01 00:00:00' +GROUP by method, status +ORDER BY c DESC LIMIT 5; + +┌─status─┬─method─┬─────c─┐ +│ 404 │ GET │ 11267 │ +│ 404 │ HEAD │ 276 │ +│ 500 │ GET │ 160 │ +│ 500 │ POST │ 115 │ +│ 400 │ GET │ 81 │ +└────────┴────────┴───────┘ + +5 rows in set. Elapsed: 0.007 sec. +``` + +### ペアワイズ配列を使用する + +ペアワイズ配列は、JSONをStringとして表現する柔軟性と、より構造化されたアプローチのパフォーマンスとのバランスを提供します。スキーマは柔軟で、ルートに新しいフィールドを追加することができます。ただし、これは非常に複雑なクエリ構文を必要とし、ネストされた構造と互換性がありません。 + +例として、次のテーブルを考えてみます: + +```sql +CREATE TABLE http_with_arrays ( + keys Array(String), + values Array(String) +) +ENGINE = MergeTree ORDER BY tuple(); +``` + +このテーブルに挿入するには、JSONをキーと値のリストとして構造化する必要があります。以下のクエリは、これを達成するための`JSONExtractKeysAndValues`の使用例を示しています: + +```sql +SELECT + arrayMap(x -> (x.1), JSONExtractKeysAndValues(json, 'String')) AS keys, + arrayMap(x -> (x.2), JSONExtractKeysAndValues(json, 'String')) AS values +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', 'JSONAsString') +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +keys: ['@timestamp','clientip','request','status','size'] +values: ['893964617','40.135.0.0','{"method":"GET","path":"/images/hm_bg.jpg","version":"HTTP/1.0"}','200','24736'] + +1 row in set. Elapsed: 0.416 sec. +``` + +リクエストカラムがネストされた構造として文字列で表現されている点に注意してください。ルートに任意の新しいキーを挿入できます。また、JSON自体に任意の違いを持たせることもできます。ローカルテーブルに挿入するには、次を実行します: + +```sql +INSERT INTO http_with_arrays +SELECT + arrayMap(x -> (x.1), JSONExtractKeysAndValues(json, 'String')) AS keys, + arrayMap(x -> (x.2), JSONExtractKeysAndValues(json, 'String')) AS values +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/http/documents-01.ndjson.gz', 'JSONAsString') + +0 rows in set. Elapsed: 12.121 sec. Processed 10.00 million rows, 107.30 MB (825.01 thousand rows/s., 8.85 MB/s.) +``` + +この構造をクエリするには、必要なキーのインデックスを識別するために[`indexOf`](/ja/sql-reference/functions/array-functions#indexofarr-x)関数を使用する必要があります(これは値の順序に一致するはずです)。これを使って値の配列カラムにアクセスできます。つまり、`values[indexOf(keys, 'status')]`。リクエストカラムには引き続きJSONの解析メソッドが必要です - この場合、`simpleJSONExtractString`を使用します。 + +```sql +SELECT toUInt16(values[indexOf(keys, 'status')]) as status, + simpleJSONExtractString(values[indexOf(keys, 'request')], 'method') as method, + count() as c +FROM http_with_arrays +WHERE status >= 400 + AND toDateTime(values[indexOf(keys, '@timestamp')]) BETWEEN '1998-01-01 00:00:00' AND '1998-06-01 00:00:00' +GROUP by method, status ORDER BY c DESC LIMIT 5; + +┌─status─┬─method─┬─────c─┐ +│ 404 │ GET │ 11267 │ +│ 404 │ HEAD │ 276 │ +│ 500 │ GET │ 160 │ +│ 500 │ POST │ 115 │ +│ 400 │ GET │ 81 │ +└────────┴────────┴───────┘ + +5 rows in set. Elapsed: 0.383 sec. Processed 8.22 million rows, 1.97 GB (21.45 million rows/s., 5.15 GB/s.) +Peak memory usage: 51.35 MiB. +``` diff --git a/docs/ja/integrations/data-ingestion/data-formats/json/schema.md b/docs/ja/integrations/data-ingestion/data-formats/json/schema.md new file mode 100644 index 00000000000..15d35d35aec --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/json/schema.md @@ -0,0 +1,789 @@ +--- +title: JSON スキーマの設計 +slug: /ja/integrations/data-formats/json/schema +description: JSON スキーマを最適に設計する方法 +keywords: [json, clickhouse, 挿入, ロード, フォーマット, スキーマ] +--- + +# スキーマを設計する + +[スキーマ推論](/docs/ja/integrations/data-formats/JSON/inference) を使用して JSON データの初期スキーマを設定し、S3 などの場所で JSON データファイルをクエリできますが、ユーザーはデータの最適化されたバージョン管理スキーマを確立することを目指すべきです。以下では、JSON 構造をモデリングするためのオプションについて説明します。 + +## 可能な限り抽出する + +可能な限り、JSON キーをスキーマのルートにあるカラムに抽出することをお勧めします。これによりクエリ構文が簡素化されるだけでなく、必要に応じてこれらのカラムを `ORDER BY` 句で使用したり、[二次インデックス](/docs/ja/optimize/skipping-indexes) を指定したりすることができます。 + +ガイド [**JSON スキーマ推論**](/docs/ja/integrations/data-formats/json/inference) で探求された [arxiv データセット](https://www.kaggle.com/datasets/Cornell-University/arxiv?resource=download) を考えてみましょう: + +```json +{ + "id": "2101.11408", + "submitter": "Daniel Lemire", + "authors": "Daniel Lemire", + "title": "Number Parsing at a Gigabyte per Second", + "comments": "Software at https://github.com/fastfloat/fast_float and\n https://github.com/lemire/simple_fastfloat_benchmark/", + "journal-ref": "Software: Practice and Experience 51 (8), 2021", + "doi": "10.1002/spe.2984", + "report-no": null, + "categories": "cs.DS cs.MS", + "license": "http://creativecommons.org/licenses/by/4.0/", + "abstract": "With disks and networks providing gigabytes per second ....\n", + "versions": [ + { + "created": "Mon, 11 Jan 2021 20:31:27 GMT", + "version": "v1" + }, + { + "created": "Sat, 30 Jan 2021 23:57:29 GMT", + "version": "v2" + } + ], + "update_date": "2022-11-07", + "authors_parsed": [ + [ + "Lemire", + "Daniel", + "" + ] + ] +} +``` + +`versions.created` の最初の値を `published_date` という名前でメインの注文キーにするとします。これを挿入前または挿入時に ClickHouse の [マテリアライズドビュー](/ja/guides/developer/cascading-materialized-views) または [マテリアライズドカラム](/ja/sql-reference/statements/alter/column#materialize-column) を使用して抽出する必要があります。 + +マテリアライズドカラムは、クエリ時にデータを抽出する最も簡単な方法を提供し、抽出ロジックが単純な SQL 式としてキャプチャできる場合に最も推奨されます。例として、`published_date` を arxiv スキーマにマテリアライズドカラムとして追加し、以下のように注文キーとして定義できます: + +```sql +CREATE TABLE arxiv +( + `id` String, + `submitter` String, + `authors` String, + `title` String, + `comments` String, + `journal-ref` String, + `doi` String, + `report-no` String, + `categories` String, + `license` String, + `abstract` String, + `versions` Array(Tuple(created String, version String)), + `update_date` Date, + `authors_parsed` Array(Array(String)), + `published_date` DateTime DEFAULT parseDateTimeBestEffort(versions[1].1) +) +ENGINE = MergeTree +ORDER BY published_date +``` + + +:::note ネストされたカラム式 +上記の方法では、位置で `created` カラムを参照する `versions[1].1` の表記を使用してタプルにアクセスする必要があります。これは、推奨される構文 `versions.created_at[1]` よりも簡単ではありません。 +::: + +データをロードすると、カラムが抽出されます: + +```sql +INSERT INTO arxiv SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz') +0 rows in set. Elapsed: 39.827 sec. Processed 2.52 million rows, 1.39 GB (63.17 thousand rows/s., 34.83 MB/s.) + +SELECT published_date +FROM arxiv_2 +LIMIT 2 +┌──────published_date─┐ +│ 2007-03-31 02:26:18 │ +│ 2007-03-31 03:16:14 │ +└─────────────────────┘ + +2 rows in set. Elapsed: 0.001 sec. +``` + +:::note マテリアライズドカラムの動作 +マテリアライズドカラムの値は常に挿入時に計算され、`INSERT` クエリで指定することはできません。マテリアライズドカラムはデフォルトでは `SELECT *` で返されません。これは、`SELECT *` の結果を常にテーブルに戻して `INSERT` できるという不変性を維持するためです。この動作は `asterisk_include_materialized_columns=1` を設定することで無効にできます。 +::: + +より複雑なフィルタリングと変換タスクには、[マテリアライズドビュー](/docs/ja/materialized-view) の使用をお勧めします。 + +## 静的 JSON と動的 JSON + +JSON のスキーマを定義する主なタスクは、それぞれのキーの値に対して適切な型を選定することです。ユーザーは次のルールを JSON 階層内の各キーに適用して、それぞれのキーに対して適切な型を決定することをお勧めします。 + +1. **プリミティブ型** - キーの値がプリミティブ型である場合、それがサブオブジェクトの一部であろうとルートであろうと、一般的なスキーマ[設計のベストプラクティス](/docs/ja/data-modeling/schema-design)と[型最適化ルール](/docs/ja/data-modeling/schema-design#optimizing-types)に従ってその型を選択してください。 以下の`phone_numbers`のようなプリミティブの配列は、`Array()` 例えば `Array(String)` としてモデル化することができます。 +2. **静的か動的か** - キーの値が複雑なオブジェクト、すなわちオブジェクトまたはオブジェクトの配列である場合、それが変更対象であるかどうか確認してください。新しいキーがめったに追加されないオブジェクトで、新しいキーの追加が予測可能で [`ALTER TABLE ADD COLUMN`](/docs/ja/sql-reference/statements/alter/column#add-column) によるスキーマ変更で対応できる場合は、**静的**とみなすことができます。これは、いくつかの JSON ドキュメントでのみキーのサブセットが提供されるオブジェクトを含みます。新しいキーが頻繁に追加され、または予測できないオブジェクトは **動的**とみなされるべきです。値が **静的** か **動的** かを確認するには、関連するセクション [**静的オブジェクトの処理**](/docs/ja/integrations/data-formats/json/schema#handling-static-objects) および [**動的オブジェクトの処理**](/docs/ja/integrations/data-formats/json/schema#handling-dynamic-objects) を参照してください。 + +

+ +**重要:** 上述のルールは再帰的に適用されるべきです。キーの値が動的であると判断された場合、それ以上の評価は不要であり、[**動的オブジェクトの処理**](/docs/ja/integrations/data-formats/json/schema#handling-dynamic-objects) のガイドラインに従うことができます。オブジェクトが静的である場合、キーの値がプリミティブであるか動的キーに遭遇するまでサブキーを評価し続けます。 + +これらのルールを説明するために、人を表す次の JSON 例を使用します: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": -43.9509, + "lng": -34.4618 + } + } + ], + "phone_numbers": ["010-692-6593", "020-192-3333"], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse", + "catchPhrase": "The real-time data warehouse for analytics", + "labels": { + "type": "database systems", + "founded": "2021" + } + }, + "dob": "2007-03-31", + "tags": { + "hobby": "Databases", + "holidays": [ + { + "year": 2024, + "location": "Azores, Portugal" + } + ], + "car": { + "model": "Tesla", + "year": 2023 + } + } +} +``` + +これらのルールを適用すると: + +- ルートキー `name`、`username`、`email`、`website` は `String` 型として表現できます。`phone_numbers` カラムはタイプ `Array(String)` のプリミティブの配列であり、`dob` と `id` はそれぞれ `Date` と `UInt32` 型です。 +- `address` オブジェクトには新しいキーが追加されません(新しいアドレスオブジェクトのみ)。したがって、**静的**とみなすことができます。再帰すると、すべてのサブカラムは(`geo` を除いて)プリミティブ(および `String` 型)とみなすことができます。これも `lat` および `lon` の 2 つの `Float32` カラムを持つ静的構造です。 +- `tags` カラムは **動的** です。このオブジェクトに任意のタグが追加され、構造の変更があると仮定します。 +- `company` オブジェクトは **静的** で、指定された最大 3 つのキーしか持ちません。サブキー `name` および `catchPhrase` は `String` 型です。キー `labels` は **動的** です。このオブジェクトに任意のタグを追加できると仮定します。値は常にタイプ文字列のキーと値のペアになります。 + +## 静的オブジェクトの処理 + +静的オブジェクトには名前付きタプル、すなわち `Tuple` を使用することをお勧めします。オブジェクトの配列はタプルの配列、すなわち `Array(Tuple)` を使用して保持できます。タプル内では、カラムとそれに対応する型は同じルールを使用して定義されるべきです。これは、以下に示すように、ネストされたオブジェクトを表すネストされた `Tuple` を導く可能性があります。 + +これを示すために、前述の JSON の人の例を使用し、動的オブジェクトを省略します: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": -43.9509, + "lng": -34.4618 + } + } + ], + "phone_numbers": ["010-692-6593", "020-192-3333"], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse", + "catchPhrase": "The real-time data warehouse for analytics" + }, + "dob": "2007-03-31" +} +``` + +このテーブルのスキーマは以下のようになります: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String), + `dob` Date +) +ENGINE = MergeTree +ORDER BY username +``` + +`company` カラムが `Tuple(catchPhrase String, name String)` として定義されていることに注意してください。`address` フィールドはネストされた `Tuple` を持つ `Array(Tuple)` を使用しています。 + +JSON は現状の構造でこのテーブルに挿入できます: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} +``` + +上記の例ではデータが最小限ですが、以下に示すように、タプルフィールドをピリオド区切り名でクエリできます。 + +```sql +SELECT + address.street, + company.name +FROM people + +┌─address.street────┬─company.name─┐ +│ ['Victor Plains'] │ ClickHouse │ +└───────────────────┴──────────────┘ +``` + +`address.street` カラムが `Array` として返される方法に注意してください。配列内の特定のオブジェクトを位置によってクエリするには、配列のオフセットをカラム名の後に指定する必要があります。例えば、最初の住所から通りを取得するには: + +```sql +SELECT address.street[1] AS street +FROM people + +┌─street────────┐ +│ Victor Plains │ +└───────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +タプルの主な欠点は、サブカラムを注文キーとして使用できないことです。したがって、以下は失敗します: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String), + `dob` Date +) +ENGINE = MergeTree +ORDER BY company.name + +Code: 47. DB::Exception: Missing columns: 'company.name' while processing query: 'company.name', required columns: 'company.name' 'company.name'. (UNKNOWN_IDENTIFIER) +``` + +:::note 注文キー内のタプル +タプルカラムは注文キーに使用できませんが、タプル全体を使用することができます。ただし、これはあまり意味をなさない場合が多いです。 +::: + +### デフォルト値の処理 + +JSON オブジェクトは構造化されていても、しばしば既知のキーのサブセットしか提供されません。幸いにも、`Tuple` 型は JSON ペイロードのすべてのカラムを要求するわけではありません。指定されていない場合、デフォルトの値が使用されます。 + +前述の `people` テーブルと、`suite`、`geo`、`phone_numbers` および `catchPhrase` キーが欠けている以下のスパースな JSON を考えてみてください。 + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "city": "Wisokyburgh", + "zipcode": "90566-7771" + } + ], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse" + }, + "dob": "2007-03-31" +} +``` + +この行が正常に挿入されることが以下に示されています: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","city":"Wisokyburgh","zipcode":"90566-7771"}],"website":"clickhouse.com","company":{"name":"ClickHouse"},"dob":"2007-03-31"} + +Ok. + +1 row in set. Elapsed: 0.002 sec. +``` + +この 1 行をクエリすると、(サブオブジェクトを含む)省略されたカラムに対してデフォルト値が使用されていることが確認できます: + +```sql +SELECT * +FROM people +FORMAT PrettyJSONEachRow + +{ + "id": "1", + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "city": "Wisokyburgh", + "geo": { + "lat": 0, + "lng": 0 + }, + "street": "Victor Plains", + "suite": "", + "zipcode": "90566-7771" + } + ], + "phone_numbers": [], + "website": "clickhouse.com", + "company": { + "catchPhrase": "", + "name": "ClickHouse" + }, + "dob": "2007-03-31" +} + +1 row in set. Elapsed: 0.001 sec. +``` + +:::note 空と null の区別 +値が空であることと提供されないことを区別する必要がある場合は、[Nullable 型](/docs/ja/sql-reference/data-types/nullable) を使用することができます。これが絶対に必要でない限り、[Nullable カラムは避ける](/docs/ja/cloud/bestpractices/avoid-nullable-columns) べきです。なぜなら、これによりこれらのカラムのストレージとクエリのパフォーマンスが悪化するためです。 +::: + +### 新しいカラムの処理 + +JSON キーが静的である場合、構造化されたアプローチが最も簡単ですが、新しいキーが事前に知られていて、スキーマに応じて変更可能な場合、このアプローチを使用することも可能です。 + +ClickHouse はデフォルトで、スキーマに存在しない JSON キーをペイロードに提供しても無視します。以下のように、`nickname` キーが追加された修正済み JSON ペイロードを考えてみてください: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "nickname": "Clicky", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "address": [ + { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": -43.9509, + "lng": -34.4618 + } + } + ], + "phone_numbers": ["010-692-6593", "020-192-3333"], + "website": "clickhouse.com", + "company": { + "name": "ClickHouse", + "catchPhrase": "The real-time data warehouse for analytics" + }, + "dob": "2007-03-31" +} +``` + +`nickname` キーが無視された状態でこの JSON を正常に挿入できます: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","nickname":"Clicky","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} + +Ok. + +1 row in set. Elapsed: 0.002 sec. +``` + +カラムは [`ALTER TABLE ADD COLUMN`](/ja/sql-reference/statements/alter/column#add-column) コマンドを使用してスキーマに追加できます。 `DEFAULT` 句を介してデフォルトを指定することができ、これはその後の挿入で指定されていない場合に使用されます。この値が存在しない行(作成前に挿入された行)に対しても、このデフォルト値が返されます。 `DEFAULT` 値が指定されていない場合、型に対するデフォルト値が使用されます。 + +例えば: + +```sql +-- 初期行を挿入(nickname は無視されます) +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","nickname":"Clicky","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} + +-- カラムを追加 +ALTER TABLE people + (ADD COLUMN `nickname` String DEFAULT 'no_nickname') + +-- 新しい行を挿入(同じデータ、異なるID) +INSERT INTO people FORMAT JSONEachRow +{"id":2,"name":"Clicky McCliickHouse","nickname":"Clicky","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics"},"dob":"2007-03-31"} + +-- 2 行を選択 +SELECT id, nickname FROM people + +┌─id─┬─nickname────┐ +│ 2 │ Clicky │ +│ 1 │ no_nickname │ +└────┴─────────────┘ + +2 rows in set. Elapsed: 0.001 sec. +``` + +## 動的オブジェクトの処理 + +動的オブジェクトの処理には、次の 2 つの推奨アプローチがあります: + +- [Map(String,V)](/docs/ja/sql-reference/data-types/map) 型 +- [String](/docs/ja/sql-reference/data-types/string) を使用した JSON 関数 + +以下のルールを適用して、最も適切なものを決定できます。 + +1. オブジェクトが非常に動的で、予測可能な構造がなく、任意のネストされたオブジェクトを含む場合、`String` 型を使用することをお勧めします。必要なフィールドはクエリ時に JSON 関数を使用して抽出できます。 +2. オブジェクトが主に 1 つのタイプの任意のキーを格納するために使用されている場合、`Map` 型を検討します。理想的には、ユニークなキーの数は数百を超えないべきです。`Map` 型は、ラベルやタグ、例えばログデータ内の Kubernetes ポッドラベルに使用されるべきです。 + +
+ +:::note オブジェクトレベルのアプローチの適用 +同じスキーマ内で異なるオブジェクトに異なる技術が適用される可能性があります。一部のオブジェクトは `String` で最善に解決し、他のオブジェクトは `Map` を適用します。`String` 型が使用されると、これ以上スキーマの決定を行う必要はありません。対照的に、`Map` キーとしてサブオブジェクト(JSON を表す `String` を含む)をネストすることが可能です。 +::: + +### String を使用する + +動的な JSON を持つユーザーにとって、構造化されたアプローチを使用することはしばしば現実的ではないため、スキーマが十分に理解されていないか変更対象となるためです。絶対の柔軟性を得るために、ユーザーはデータを `String` として格納し、必要に応じて関数を使用してフィールドを抽出することができます。これは、構造化されたオブジェクトとして JSON を処理することの対極を表します。この柔軟性は、クエリ構文の複雑化およびパフォーマンスの低下という形でコストを負います。 + +前述の、[オリジナルの person オブジェクト](/docs/ja/integrations/data-formats/json/schema#static-vs-dynamic-json) を例にすると、`tags` カラムの構造が確保できません。オリジナルの行を挿入し(`company.labels` も含めますが、ここでは無視します)、`Tags` カラムを `String` と宣言します: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String), + `dob` Date, + `tags` String +) +ENGINE = MergeTree +ORDER BY username + +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics","labels":{"type":"database systems","founded":"2021"}},"dob":"2007-03-31","tags":{"hobby":"Databases","holidays":[{"year":2024,"location":"Azores, Portugal"}],"car":{"model":"Tesla","year":2023}}} + +Ok. +1 row in set. Elapsed: 0.002 sec. +``` + +`tags` カラムを選択すると、JSON が文字列として挿入されたことが見て取れます: + +```sql +SELECT tags +FROM people + +┌─tags───────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ {"hobby":"Databases","holidays":[{"year":2024,"location":"Azores, Portugal"}],"car":{"model":"Tesla","year":2023}} │ +└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +[JSONExtract](/docs/ja/sql-reference/functions/json-functions#jsonextract-functions) 関数を使用して、この JSON から値を取得できます。以下の簡単な例をご覧ください: + +```sql +SELECT JSONExtractString(tags, 'holidays') as holidays FROM people + +┌─holidays──────────────────────────────────────┐ +│ [{"year":2024,"location":"Azores, Portugal"}] │ +└───────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` + +関数が JSON 内のパスを抽出するために `String` カラム `tags` と JSON 内のパスが必要なことに注意してください。ネストされたパスには、関数をネストする必要があります。例えば、 `tags.car.year` カラムを抽出するための `JSONExtractUInt(JSONExtractString(tags, 'car'), 'year')` です。ネストされたパスの抽出は、関数 [JSON_QUERY](/docs/ja/sql-reference/functions/json-functions.md/#json_queryjson-path) もしくは [JSON_VALUE](/docs/ja/sql-reference/functions/json-functions.md/#json_valuejson-path) を通じて簡素化することができます。 + +`arxiv` データセットを考えてみて、すべての本文を `String` として扱うケースの極端な例を考えてみましょう。 + +```sql +CREATE TABLE arxiv ( + body String +) +ENGINE = MergeTree ORDER BY () +``` + +このスキーマに挿入するには、`JSONAsString` フォーマットを使用する必要があります: + +```sql +INSERT INTO arxiv SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/arxiv/arxiv.json.gz', 'JSONAsString') + +0 rows in set. Elapsed: 25.186 sec. Processed 2.52 million rows, 1.38 GB (99.89 thousand rows/s., 54.79 MB/s.) +``` + +年ごとにリリースされた論文の数をカウントする必要があるとします。スキーマの [構造化バージョン](/docs/ja/integrations/data-formats/json/inference#creating-tables) と、単一の文字列を使用した場合のクエリを比較してみましょう: + +```sql +-- 構造化スキーマを使用 +SELECT + toYear(parseDateTimeBestEffort(versions.created[1])) AS published_year, + count() AS c +FROM arxiv_v2 +GROUP BY published_year +ORDER BY c ASC +LIMIT 10 + +┌─published_year─┬─────c─┐ +│ 1986 │ 1 │ +│ 1988 │ 1 │ +│ 1989 │ 6 │ +│ 1990 │ 26 │ +│ 1991 │ 353 │ +│ 1992 │ 3190 │ +│ 1993 │ 6729 │ +│ 1994 │ 10078 │ +│ 1995 │ 13006 │ +│ 1996 │ 15872 │ +└────────────────┴───────┘ + +10 rows in set. Elapsed: 0.264 sec. Processed 2.31 million rows, 153.57 MB (8.75 million rows/s., 582.58 MB/s.) + +-- 非構造化文字列を使用 + +SELECT + toYear(parseDateTimeBestEffort(JSON_VALUE(body, '$.versions[0].created'))) AS published_year, + count() AS c +FROM arxiv +GROUP BY published_year +ORDER BY published_year ASC +LIMIT 10 + +┌─published_year─┬─────c─┐ +│ 1986 │ 1 │ +│ 1988 │ 1 │ +│ 1989 │ 6 │ +│ 1990 │ 26 │ +│ 1991 │ 353 │ +│ 1992 │ 3190 │ +│ 1993 │ 6729 │ +│ 1994 │ 10078 │ +│ 1995 │ 13006 │ +│ 1996 │ 15872 │ +└────────────────┴───────┘ + +10 rows in set. Elapsed: 1.281 sec. Processed 2.49 million rows, 4.22 GB (1.94 million rows/s., 3.29 GB/s.) +Peak memory usage: 205.98 MiB. +``` + +ここで、`JSON_VALUE(body, '$.versions[0].created')` のようにクエリで JSON をメソッドによってフィルターするために xpath 式を使用していることに注意してください。 + +文字列関数は、インデックスを伴う明示的な型変換よりも顕著に遅いため、上記のクエリは常にフルテーブルスキャンとすべての行の処理を必要とします。このような小さなデータセットでは、クエリは依然として高速である可能性がありますが、大規模なデータセットにおいてはパフォーマンスが低下する可能性があります。 + +このアプローチの柔軟性は明確なパフォーマンスと構文のコストがかかるため、スキーマ内の非常に動的なオブジェクトにのみ使用するべきです。 + +#### シンプルJSON関数 + +上記の例では、JSON* 関数ファミリーを使用しています。これらの関数は、[simdjson](https://github.com/simdjson/simdjson) に基づいた厳密な JSON パーサーを利用し、異なるレベルでネストされた場合のフィールドを区別します。これらの関数は、構文的には正しいがフォーマットが整っていない JSON、例としてフィールド間に二重スペースがある場合を処理することができます。 + +より高速で厳格な一連の関数が利用可能です。これらの `simpleJSON*` 関数は、JSON の構造とフォーマットに対して厳しい前提を作ることによって主に性能を向上させます。具体的には: + +* フィールド名は定数である必要があります。 +* フィールド名のエンコーディングが一貫していること。例:`simpleJSONHas('{"abc":"def"}', 'abc') = 1` ですが、`visitParamHas('{"\\u0061\\u0062\\u0063":"def"}', 'abc') = 0` です。 +* フィールド名はすべてのネストされた構造で一意である必要があります。ネストレベル間の区別はなく、マッチングは無差別です。複数のマッチングフィールドがある場合、最初の出現が使用されます。 +* ストリングリテラル外での特殊文字はありません。これにはスペースが含まれます。次の例は無効であり、パースされません。 + + ```json + {"@timestamp": 893964617, "clientip": "40.135.0.0", "request": {"method": "GET", + "path": "/images/hm_bg.jpg", "version": "HTTP/1.0"}, "status": 200, "size": 24736} + ``` + + 一方、次の例は正しく解析されます: + + ```json + {"@timestamp":893964617,"clientip":"40.135.0.0","request":{"method":"GET", + "path":"/images/hm_bg.jpg","version":"HTTP/1.0"},"status":200,"size":24736} + ``` + +これらの関数が適切であり、性能が重要で JSON が上記の要件を満たす場合に、使用することができます。以下は、`simpleJSON*` 関数を使用して再書かれた前述のクエリの例です: + +```sql +SELECT + toYear(parseDateTimeBestEffort(simpleJSONExtractString(simpleJSONExtractRaw(body, 'versions'), 'created'))) AS published_year, + count() AS c +FROM arxiv +GROUP BY published_year +ORDER BY published_year ASC +LIMIT 10 + +┌─published_year─┬─────c─┐ +│ 1986 │ 1 │ +│ 1988 │ 1 │ +│ 1989 │ 6 │ +│ 1990 │ 26 │ +│ 1991 │ 353 │ +│ 1992 │ 3190 │ +│ 1993 │ 6729 │ +│ 1994 │ 10078 │ +│ 1995 │ 13006 │ +│ 1996 │ 15872 │ +└────────────────┴───────┘ + +10 rows in set. Elapsed: 0.964 sec. Processed 2.48 million rows, 4.21 GB (2.58 million rows/s., 4.36 GB/s.) +Peak memory usage: 211.49 MiB. +``` + +上記の例では、公開日付用に最初の値を取得するために `simpleJSONExtractString` を使用して `created` キーを抽出しています。この場合、性能向上のため `simpleJSON*` 関数の制限が受け入れられます。 + +### Map を使用する + +オブジェクトが主に 1 つのタイプの任意のキーを格納するために使用されている場合、`Map` 型を検討します。理想的には、ユニークなキーの数は数百を超えないべきです。`Map` 型は、ラベルやタグ、例えばログデータ内の Kubernetes ポッドラベルに使用されるべきです。`Map` がサポートするオブジェクトの構築にはいくつかの制限があります: + +- フィールドはすべて同じ型である必要があります。 +- サブカラムにアクセスするには、特殊なマップ構文が必要です。フィールドはカラムとして存在せず、オブジェクト全体がカラムです。 +- サブカラムにアクセスすると、`Map` 値全体、すなわちすべての兄弟とその各々の値がロードされます。大きなマップでは、これが重大なパフォーマンスペナルティになる可能性があります。 + +:::note 文字列キー +オブジェクトを `Map` としてモデリングする場合、JSON キー名を格納するために `String` キーが使用されます。したがって、マップは常に `Map(String, T)` となり、`T` はデータによって異なります。 +::: + +#### プリミティブ値 + +`Map` を最も単純に適用する方法は、オブジェクトが同じプリミティブ型の値を含む場合です。ほとんどのケースでは、値 `T` に `String` 型を使用することが含まれます。 + +前述の [people の JSON](/docs/ja/integrations/data-formats/json/schema#static-vs-dynamic-json) を考えた際、`company.labels` オブジェクトが動的であると判断しました。重要なのは、このオブジェクトには `String` 型のキー値ペアが追加されると考えられることです。したがって、これを `Map(String, String)` として宣言できます: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `address` Array(Tuple(city String, geo Tuple(lat Float32, lng Float32), street String, suite String, zipcode String)), + `phone_numbers` Array(String), + `website` String, + `company` Tuple(catchPhrase String, name String, labels Map(String,String)), + `dob` Date, + `tags` String +) +ENGINE = MergeTree +ORDER BY username +``` + +元の完全な JSON オブジェクトを挿入できます: + +```sql +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","address":[{"street":"Victor Plains","suite":"Suite 879","city":"Wisokyburgh","zipcode":"90566-7771","geo":{"lat":-43.9509,"lng":-34.4618}}],"phone_numbers":["010-692-6593","020-192-3333"],"website":"clickhouse.com","company":{"name":"ClickHouse","catchPhrase":"The real-time data warehouse for analytics","labels":{"type":"database systems","founded":"2021"}},"dob":"2007-03-31","tags":{"hobby":"Databases","holidays":[{"year":2024,"location":"Azores, Portugal"}],"car":{"model":"Tesla","year":2023}}} + +Ok. + +1 row in set. Elapsed: 0.002 sec. +``` + +リクエストオブジェクト内のフィールドをクエリする際には、以下のようなマップ構文が必要です: + +```sql +SELECT company.labels FROM people + +┌─company.labels───────────────────────────────┐ +│ {'type':'database systems','founded':'2021'} │ +└──────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.001 sec. + +SELECT company.labels['type'] AS type FROM people + +┌─type─────────────┐ +│ database systems │ +└──────────────────┘ + +1 row in set. Elapsed: 0.001 sec. +``` + +この型をクエリするための `Map` 関数の完全なセットが [ここに](/docs/ja/sql-reference/functions/tuple-map-functions.md) 示されています。データが一貫した型でない場合、[必要な型の型変換](/docs/ja/sql-reference/functions/type-conversion-functions) を行う関数が存在します。 + +#### オブジェクト値 + +オブジェクトが一貫性のあるタイプを持つサブオブジェクトを持つ場合も、`Map` 型を考慮できます。 + +たとえば、`tags` キー用の `persons` オブジェクトが一貫した構造を要求する場合、各 `tag` のサブオブジェクトには `name` と `time` カラムが含まれます。簡素化されたこのような JSON ドキュメントの例は以下のようになります: + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "tags": { + "hobby": { + "name": "Diving", + "time": "2024-07-11 14:18:01" + }, + "car": { + "name": "Tesla", + "time": "2024-07-11 15:18:23" + } + } +} +``` + +これは、`Map(String, Tuple(name String, time DateTime))` を使用してモデリングすることができます。以下に示します: + +```sql +CREATE TABLE people +( + `id` Int64, + `name` String, + `username` String, + `email` String, + `tags` Map(String, Tuple(name String, time DateTime)) +) +ENGINE = MergeTree +ORDER BY username + +INSERT INTO people FORMAT JSONEachRow +{"id":1,"name":"Clicky McCliickHouse","username":"Clicky","email":"clicky@clickhouse.com","tags":{"hobby":{"name":"Diving","time":"2024-07-11 14:18:01"},"car":{"name":"Tesla","time":"2024-07-11 15:18:23"}}} + +Ok. + +1 row in set. Elapsed: 0.002 sec. + +SELECT tags['hobby'] AS hobby +FROM people +FORMAT JSONEachRow + +{"hobby":{"name":"Diving","time":"2024-07-11 14:18:01"}} + +1 row in set. Elapsed: 0.001 sec. +``` + +このケースでのマップの適用は一般的には稀であり、データが再モデリングされ、動的キー名がサブオブジェクトを持たないようにすることが適切であることを示唆します。例えば、上記の例を以下のように再モデリングすることで、`Array(Tuple(key String, name String, time DateTime))` を使用できるようになります。 + +```json +{ + "id": 1, + "name": "Clicky McCliickHouse", + "username": "Clicky", + "email": "clicky@clickhouse.com", + "tags": [ + { + "key": "hobby", + "name": "Diving", + "time": "2024-07-11 14:18:01" + }, + { + "key": "car", + "name": "Tesla", + "time": "2024-07-11 15:18:23" + } + ] +} +``` diff --git a/docs/ja/integrations/data-ingestion/data-formats/parquet.md b/docs/ja/integrations/data-ingestion/data-formats/parquet.md new file mode 100644 index 00000000000..8a6ede08183 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/parquet.md @@ -0,0 +1,195 @@ +--- +sidebar_label: Parquet +sidebar_position: 3 +slug: /ja/integrations/data-formats/parquet +--- + +# ClickHouseでのParquetの取り扱い + +Parquetは、データを列指向で効率的に保存するためのファイル形式です。ClickHouseはParquetファイルの読み書きをサポートしています。 + +:::tip +クエリでファイルパスを参照する場合、ClickHouseがどの場所から読み取ろうとするかは、使用しているClickHouseのバリアントに依存します。 + +[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)を使用している場合、ClickHouse Localを起動した場所に相対的な位置から読み取ります。 +ClickHouse Serverまたは`clickhouse client`を介してClickHouse Cloudを使用している場合、サーバー上の`/var/lib/clickhouse/user_files/`ディレクトリに相対的な位置から読み取ります。 +::: + +## Parquetからのインポート + +データを読み込む前に、[file()](/docs/ja/sql-reference/functions/files.md/#file)関数を使用して[例のparquetファイル](assets/data.parquet)の構造を調べることができます。 + +```sql +DESCRIBE TABLE file('data.parquet', Parquet); +``` + +第2引数として[Parquet](/docs/ja/interfaces/formats.md/#data-format-parquet)を使用したので、ClickHouseはファイル形式を認識します。これによりカラムと型が表示されます。 + +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ Nullable(String) │ │ │ │ │ │ +│ date │ Nullable(String) │ │ │ │ │ │ +│ hits │ Nullable(Int64) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +データを実際にインポートする前に、SQLの力を利用してファイルを調べることもできます。 + +```sql +SELECT * +FROM file('data.parquet', Parquet) +LIMIT 3; +``` + +```response +┌─path──────────────────────┬─date───────┬─hits─┐ +│ Akiba_Hebrew_Academy │ 2017-08-01 │ 241 │ +│ Aegithina_tiphia │ 2018-02-01 │ 34 │ +│ 1971-72_Utah_Stars_season │ 2016-10-01 │ 1 │ +└───────────────────────────┴────────────┴──────┘ +``` + +:::tip +`file()`および`INFILE`/`OUTFILE`のための明示的な形式設定を省略することができます。その場合、ClickHouseはファイル拡張子に基づいて形式を自動的に検出します。 +::: + +## 既存テーブルへのインポート + +Parquetデータをインポートするためのテーブルを作成してみましょう。 + +```sql +CREATE TABLE sometable +( + `path` String, + `date` Date, + `hits` UInt32 +) +ENGINE = MergeTree +ORDER BY (date, path); +``` + +次に、`FROM INFILE`句を使用してデータをインポートできます。 + +```sql +INSERT INTO sometable +FROM INFILE 'data.parquet' FORMAT Parquet; + +SELECT * +FROM sometable +LIMIT 5; +``` + +```response +┌─path──────────────────────────┬───────date─┬─hits─┐ +│ 1988_in_philosophy │ 2015-05-01 │ 70 │ +│ 2004_Green_Bay_Packers_season │ 2015-05-01 │ 970 │ +│ 24_hours_of_lemans │ 2015-05-01 │ 37 │ +│ 25604_Karlin │ 2015-05-01 │ 20 │ +│ ASCII_ART │ 2015-05-01 │ 9 │ +└───────────────────────────────┴────────────┴──────┘ +``` + +ClickHouseがParquetの文字列(`date`カラムで)を`Date`型に自動的に変換することに注目してください。これは、ClickHouseがターゲットテーブルの型に基づいて型キャストを自動的に行うためです。 + +## ローカルファイルをリモートサーバーに挿入 + +ローカルのParquetファイルをリモートのClickHouseサーバーに挿入したい場合は、以下のようにファイルの内容を`clickhouse-client`にパイプすることで行えます。 + +```sql +clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet +``` + +## Parquetファイルから新しいテーブルを作成 + +ClickHouseはParquetファイルのスキーマを読み取るため、即座にテーブルを作成することができます。 + +```sql +CREATE TABLE imported_from_parquet +ENGINE = MergeTree +ORDER BY tuple() AS +SELECT * +FROM file('data.parquet', Parquet) +``` + +これにより、指定されたParquetファイルから自動的にテーブルを作成および入力します。 + +```sql +DESCRIBE TABLE imported_from_parquet; +``` + +```response +┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ Nullable(String) │ │ │ │ │ │ +│ date │ Nullable(String) │ │ │ │ │ │ +│ hits │ Nullable(Int64) │ │ │ │ │ │ +└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +デフォルトでは、ClickHouseはカラム名、型、および値に厳密です。しかし、インポート中に存在しないカラムやサポートされていない値をスキップすることもできます。これらは[Parquet設定](/docs/ja/interfaces/formats.md/#parquet-format-settings)で管理できます。 + +## Parquet形式へのエクスポート + +:::tip +`INTO OUTFILE`を使用してClickHouse Cloudでエクスポートする際には、ファイルが書き込まれるマシンで`clickhouse client`でコマンドを実行する必要があります。 +::: + +任意のテーブルやクエリ結果をParquetファイルにエクスポートするには、`INTO OUTFILE`句を使用できます。 + +```sql +SELECT * +FROM sometable +INTO OUTFILE 'export.parquet' +FORMAT Parquet +``` + +これにより、作業ディレクトリに`export.parquet`ファイルが作成されます。 + +## ClickHouseとParquetデータ型 + +ClickHouseとParquetのデータ型はほとんどが同じですが、[若干異なる部分](/docs/ja/interfaces/formats.md/#data-types-matching-parquet)もあります。例えば、ClickHouseは`DateTime`型をParquetの`int64`としてエクスポートします。これを再びClickHouseにインポートすると、次のように数値が表示されます([time.parquetファイル](assets/time.parquet))。 + +```sql +SELECT * FROM file('time.parquet', Parquet); +``` + +```response +┌─n─┬───────time─┐ +│ 0 │ 1673622611 │ +│ 1 │ 1673622610 │ +│ 2 │ 1673622609 │ +│ 3 │ 1673622608 │ +│ 4 │ 1673622607 │ +└───┴────────────┘ +``` + +この場合、[型変換](/docs/ja/sql-reference/functions/type-conversion-functions.md)を使用することができます。 + +```sql +SELECT + n, + toDateTime(time) <--- int から時刻へ +FROM file('time.parquet', Parquet); +``` + +```response +┌─n─┬────toDateTime(time)─┐ +│ 0 │ 2023-01-13 15:10:11 │ +│ 1 │ 2023-01-13 15:10:10 │ +│ 2 │ 2023-01-13 15:10:09 │ +│ 3 │ 2023-01-13 15:10:08 │ +│ 4 │ 2023-01-13 15:10:07 │ +└───┴─────────────────────┘ +``` + +## 詳細な情報 + +ClickHouseは、多くの形式、テキスト、バイナリをサポートしており、さまざまなシナリオやプラットフォームに対応しています。以下の記事で多様な形式とそれらの取り扱い方法を探ってみてください。 + +- [CSV and TSV形式](csv-tsv.md) +- [Avro, Arrow and ORC](arrow-avro-orc.md) +- [JSON形式](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [Regexとテンプレート](templates-regex.md) +- [ネイティブとバイナリ形式](binary.md) +- [SQL形式](sql.md) + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)も確認してみてください。ClickHouseサーバーがなくてもローカル/リモートファイルで作業できるポータブルなフル機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/sql.md b/docs/ja/integrations/data-ingestion/data-formats/sql.md new file mode 100644 index 00000000000..046dd7b588f --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/sql.md @@ -0,0 +1,112 @@ +--- +sidebar_label: SQL ダンプ +slug: /ja/integrations/data-formats/sql +--- + +# ClickHouseでのSQLデータの挿入とダンプ + +ClickHouseは、さまざまな方法でOLTPデータベースインフラストラクチャに簡単に統合することができます。その一つの方法は、他のデータベースとClickHouse間でSQLダンプを利用してデータを転送することです。 + +## SQLダンプの作成 + +データは[SQLInsert](/docs/ja/interfaces/formats.md/#sqlinsert)を使用してSQL形式でダンプできます。ClickHouseはデータを`INSERT INTO VALUES(...)`の形式で書き込み、`output_format_sql_insert_table_name`設定オプションをテーブル名として使用します。 + +```sql +SET output_format_sql_insert_table_name = 'some_table'; +SELECT * FROM some_data +INTO OUTFILE 'dump.sql' +FORMAT SQLInsert +``` + +カラム名は[`output_format_sql_insert_include_column_names`](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_include_column_names)オプションを無効にすることで省略できます。 + +```sql +SET output_format_sql_insert_include_column_names = 0 +``` + +今度は[dump.sql](assets/dump.sql)ファイルを他のOLTPデータベースに供給できます。 + +```bash +mysql some_db < dump.sql +``` + +ここでは、`some_db` MySQLデータベースに`some_table`テーブルが存在すると仮定しています。 + +一部のDBMSは、1回のバッチで処理できる値の量に制限がある場合があります。デフォルトではClickHouseは65kの値のバッチを作成しますが、[`output_format_sql_insert_max_batch_size`](/docs/ja/operations/settings/settings-formats.md/#output_format_sql_insert_max_batch_size)オプションでこれを変更できます。 + +```sql +SET output_format_sql_insert_max_batch_size = 1000; +``` + +### 一連の値のエクスポート + +ClickHouseには、`INSERT INTO table VALUES`部分を省略し、一連の値のみを返す[Values](/docs/ja/interfaces/formats.md/#data-format-values)形式があります。 + +```sql +SELECT * FROM some_data LIMIT 3 FORMAT Values +``` +```response +('Bangor_City_Forest','2015-07-01',34),('Alireza_Afzal','2017-02-01',24),('Akhaura-Laksam-Chittagong_Line','2015-09-01',30) +``` + +## SQLダンプからのデータの挿入 + +SQLダンプを読み取るためには、[MySQLDump](/docs/ja/interfaces/formats.md/#mysqldump)を使用します。 + +```sql +SELECT * +FROM file('dump.sql', MySQLDump) +LIMIT 5 +``` +```response +┌─path───────────────────────────┬──────month─┬─hits─┐ +│ Bangor_City_Forest │ 2015-07-01 │ 34 │ +│ Alireza_Afzal │ 2017-02-01 │ 24 │ +│ Akhaura-Laksam-Chittagong_Line │ 2015-09-01 │ 30 │ +│ 1973_National_500 │ 2017-10-01 │ 80 │ +│ Attachment │ 2017-09-01 │ 1356 │ +└────────────────────────────────┴────────────┴──────┘ +``` + +デフォルトでClickHouseは未知のカラムをスキップします(これは[input_format_skip_unknown_fields](/docs/ja/operations/settings/settings-formats.md/#input_format_skip_unknown_fields)オプションによって制御されます)し、ダンプに複数のテーブルが含まれる場合、最初に見つかったテーブルのデータを処理します。DDL文はスキップされます。MySQLダンプからテーブルにデータを読み込むためには(例: [mysql.sql](assets/mysql.sql) ファイル)以下のようにします。 + +```sql +INSERT INTO some_data +FROM INFILE 'mysql.sql' FORMAT MySQLDump +``` + +また、MySQLダンプファイルから自動的にテーブルを作成することもできます。 + +```sql +CREATE TABLE table_from_mysql +ENGINE = MergeTree +ORDER BY tuple() AS +SELECT * +FROM file('mysql.sql', MySQLDump) +``` + +ここでは、ClickHouseが自動的に推測した構造に基づいて`table_from_mysql`という名前のテーブルを作成しました。ClickHouseはデータに基づいてタイプを検出するか、利用可能な場合はDDLを使用します。 + +```sql +DESCRIBE TABLE table_from_mysql; +``` +```response +┌─name──┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ path │ Nullable(String) │ │ │ │ │ │ +│ month │ Nullable(Date32) │ │ │ │ │ │ +│ hits │ Nullable(UInt32) │ │ │ │ │ │ +└───────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +## その他のフォーマット + +ClickHouseは、さまざまなシナリオやプラットフォームに対応するために、多くのフォーマットをテキストとバイナリの両方でサポートしています。以下の記事でさらに多くのフォーマットやその扱い方について学んでください。 + +- [CSVとTSVフォーマット](csv-tsv.md) +- [Parquet](parquet.md) +- [JSONフォーマット](/docs/ja/integrations/data-ingestion/data-formats/json/intro.md) +- [正規表現とテンプレート](templates-regex.md) +- [ネイティブとバイナリフォーマット](binary.md) +- **SQLフォーマット** + +また、[clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local)も確認してください。これは、ClickHouseサーバーを使わずにローカル/リモートファイル上でSQLで作業するためのポータブルなフル機能のツールです。 diff --git a/docs/ja/integrations/data-ingestion/data-formats/templates-regex.md b/docs/ja/integrations/data-ingestion/data-formats/templates-regex.md new file mode 100644 index 00000000000..0e5734f4920 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/data-formats/templates-regex.md @@ -0,0 +1,243 @@ +--- +sidebar_label: 正規表現とテンプレート +sidebar_position: 3 +slug: /ja/integrations/data-formats/templates-regexp +--- + +# ClickHouseでテンプレートと正規表現を使用したカスタムテキストデータのインポートとエクスポート + +私たちはしばしばカスタムテキストフォーマットのデータを扱わなければならないことがあります。それは標準ではないフォーマット、不正なJSON、壊れたCSVなどです。CSVやJSONのような標準パーサを使用しても、これらのすべてのケースで動作するわけではありません。しかし、ClickHouseには強力なテンプレートと正規表現フォーマットがあります。 + +## テンプレートに基づいたインポート +次の[ログファイル](assets/error.log)からデータをインポートしたいとします。 + +```bash +head error.log +``` +```response +2023/01/15 14:51:17 [error] client: 7.2.8.1, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/16 06:02:09 [error] client: 8.4.2.7, server: example.com "GET /apple-touch-icon-120x120.png HTTP/1.1" +2023/01/15 13:46:13 [error] client: 6.9.3.7, server: example.com "GET /apple-touch-icon.png HTTP/1.1" +2023/01/16 05:34:55 [error] client: 9.9.7.6, server: example.com "GET /h5/static/cert/icon_yanzhengma.png HTTP/1.1" +``` + +このデータをインポートするために、[テンプレート](/docs/ja/interfaces/formats.md/#format-template)フォーマットを使用することができます。入力データの各行に値のプレースホルダーを持つテンプレート文字列を定義する必要があります。 + +``` +
%20FORMAT%20JSONEachRow`を指定します。**注意**:クエリはエンコードされている必要があります。 + * `Endpoint Authentication type` - BASIC + * `Auth username` - ClickHouseのユーザー名 + * `Auth password` - ClickHouseのパスワード + +:::note + このHTTP Urlはエラーが発生しやすいです。正確なエスケープを心がけてください。 +::: + +Auth options for Confluent HTTP Sink +
+ +* 設定 + * `Input Kafka record value format` ソースデータに依存しますが、ほとんどの場合JSONまたはAvroです。以下の設定では`JSON`を想定しています。 + * `advanced configurations` セクションでは: + * `HTTP Request Method` - POSTに設定 + * `Request Body Format` - json + * `Batch batch size` - ClickHouseの推奨に基づき、**最低でも1000**に設定します。 + * `Batch json as array` - true + * `Retry on HTTP codes` - 400-500ですが、必要に応じて適応。例:ClickHouseの前にHTTPプロキシがある場合は変更が必要な場合があります。 + * `Maximum Reties` - デフォルト(10)が適切ですが、より強力なリトライを望む場合は調整してください。 + +Advanced options for Confluent HTTP Sink + +#### 5. 接続性のテスト +HTTP Sinkで設定したトピックにメッセージを作成 +Create a message in the topic + +
+ +そして、作成されたメッセージがClickHouseインスタンスに書き込まれたことを確認します。 + +### トラブルシューティング +#### HTTP Sinkがメッセージをバッチ処理しない + +[Sinkドキュメント](https://docs.confluent.io/kafka-connectors/http/current/overview.html#http-sink-connector-for-cp)からの引用: +> Kafkaヘッダ値が異なるメッセージの場合、HTTP Sinkコネクタは要求をバッチ処理しません。 + +1. Kafkaレコードに同じキーがあることを確認します。 +2. HTTP APIのURLにパラメータを追加すると、各レコードがユニークなURLを生成する可能性があります。このため、追加のURLパラメータを使用する場合、バッチ処理は無効になります。 + +#### 400 Bad Request +##### CANNOT_PARSE_QUOTED_STRING +HTTP Sinkが`String`カラムにJSONオブジェクトを挿入する際に以下のメッセージで失敗する場合: + +``` +Code: 26. DB::ParsingException: Cannot parse JSON string: expected opening quote: (while reading the value of key key_name): While executing JSONEachRowRowInputFormat: (at row 1). (CANNOT_PARSE_QUOTED_STRING) +``` + +URLに`input_format_json_read_objects_as_strings=1`設定をエンコードされた文字列として追加します `SETTINGS%20input_format_json_read_objects_as_strings%3D1` + +### GitHubデータセットをロードする(オプション) + +この例では、GitHubデータセットの配列フィールドを保ちます。例では空のgithubトピックを想定し、メッセージの挿入に[kcat](https://github.com/edenhill/kcat)を使用します。 + +##### 1. 設定を準備する + +[これらの手順](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#set-up-a-local-connect-worker-with-cp-install) に従って、インストールタイプに関連するConnectをセットアップしてください。スタンドアロンと分散型クラスターの違いに注意してください。Confluent Cloudを使用する場合、分散設定が該当します。 + +最も重要なパラメータは`http.api.url`です。ClickHouse用の[HTTPインターフェース](../../../../interfaces/http.md) では、INSERT文をURLのパラメータとしてエンコードする必要があります。これはフォーマット(この場合、`JSONEachRow`)とターゲットデータベースを含む必要があります。フォーマットはKafkaデータと一貫していなければなりません。これらのパラメータはURLエスケープされなければなりません。GitHubデータセット用のこのフォーマットの例を以下に示します(ClickHouseがローカルで実行されていると想定): + +``` +://:?query=INSERT%20INTO%20.
%20FORMAT%20JSONEachRow + +http://localhost:8123?query=INSERT%20INTO%20default.github%20FORMAT%20JSONEachRow +``` + +HTTP SinkをClickHouseで使用するための追加パラメータは以下の通りです。完全なパラメータリストは[こちら](https://docs.confluent.io/kafka-connect-http/current/connector_config.html)をご覧ください: + +* `request.method` - **POST**に設定 +* `retry.on.status.codes` - エラーステータスコード(400-500)でリトライするように設定します。データで予想されるエラーに基づいて詳細化してください。 +* `request.body.format` - 多くの場合、これはJSONです。 +* `auth.type` - ClickHouseのセキュリティを使用する場合、BASICに設定します。他のClickHouse互換認証メカニズムは現在サポートされていません。 +* `ssl.enabled` - SSLを使用する場合はtrueに設定します。 +* `connection.user` - ClickHouseのユーザー名。 +* `connection.password` - ClickHouseのパスワード。 +* `batch.max.size` - 1回のバッチで送信する行数です。適切に大きな数になるように設定します。ClickHouse [推奨事項](../../../../concepts/why-clickhouse-is-so-fast.md#performance-when-inserting-data) に基づき、1000が最小と考えられます。 +* `tasks.max` - HTTP Sinkコネクタは1つ以上のタスクを実行することをサポートします。これによりパフォーマンスを向上させることができます。バッチサイズとともに、これがパフォーマンスを向上させる主な手段です。 +* `key.converter` - キーのタイプに応じて設定します。 +* `value.converter` - トピック上のデータのタイプに基づいて設定します。このデータはスキーマを必要としません。ここでのフォーマットは、`http.api.url`パラメータで指定されたFORMATと一貫している必要があります。最も単純なのはJSONを使用し、org.apache.kafka.connect.json.JsonConverterコンバータを使用することです。値を文字列として扱うことも可能です(org.apache.kafka.connect.storage.StringConverterコンバータを通じて)- ただし、これはINSERTステートメントで関数を使用して値を抽出する必要があるでしょう。[Avroフォーマット](../../../../interfaces/formats.md#data-format-avro) もClickHouseでサポートされており、io.confluent.connect.avro.AvroConverterコンバータを使用する場合に利用可能です。 + +プロキシの設定やリトライ、高度なSSL設定を含む設定の詳細は[こちら](https://docs.confluent.io/kafka-connect-http/current/connector_config.html)をご覧ください。 + +Githubサンプルデータ用の例の設定ファイルは[こちら](https://github.com/ClickHouse/clickhouse-docs/tree/main/docs/en/integrations/data-ingestion/kafka/code/connectors/http_sink)にあります。Connectがスタンドアロンモードで実行され、KafkaがConfluent Cloudでホストされていると仮定しています。 + +##### 2. ClickHouseテーブルを作成する + +テーブルが作成されていることを確認してください。MergeTreeを使用した最小限のGitHubデータセットの例を以下に示します。 + + +```sql +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4,'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at) + +``` + +##### 3. Kafkaにデータを追加する + +Kafkaにメッセージを挿入します。以下では[kcat](https://github.com/edenhill/kcat)を使用して10,000件のメッセージを挿入します。 + +```bash +head -n 10000 github_all_columns.ndjson | kcat -b : -X security.protocol=sasl_ssl -X sasl.mechanisms=PLAIN -X sasl.username= -X sasl.password= -t github +``` + +ターゲットテーブル「Github」で簡単な読み取りを行い、データの挿入を確認します。 + +```sql +SELECT count() FROM default.github; + +| count() | +| :--- | +| 10000 | + +``` diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.excalidraw new file mode 100644 index 00000000000..d8e362fcfeb --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.excalidraw @@ -0,0 +1,755 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 878, + "versionNonce": 328208404, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 682.5, + "y": 706.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 394, + "seed": 1090013588, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + } + ], + "updated": 1652465060451, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 231, + "versionNonce": 960998188, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 687.5, + "y": 868.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 1493094828, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 671, + "versionNonce": 549252500, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 696.6291629162916, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 490, + "versionNonce": 134309292, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 399, + "y": 700, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 394.99999999999994, + "seed": 894230420, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + } + ], + "updated": 1652465060451, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 522, + "versionNonce": 2138184468, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 421.61840277777765, + "y": 1013.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 344, + "versionNonce": 2090848300, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 445, + "y": 848.7499999999999, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 83, + "height": 72, + "seed": 2071509291, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic", + "baseline": 61, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic" + }, + { + "type": "text", + "version": 448, + "versionNonce": 2049284244, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1347, + "y": 1185, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 173, + "height": 35, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "User queries", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "User queries" + }, + { + "type": "arrow", + "version": 1403, + "versionNonce": 1460464300, + "isDeleted": false, + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 605.0000000000001, + "y": 904.7304815823768, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 78.02606572763841, + "height": 0.2695184176232033, + "seed": 172826772, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060451, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.034746004512532146, + "gap": 1 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 78.02606572763841, + 0.2695184176232033 + ] + ] + }, + { + "type": "rectangle", + "version": 969, + "versionNonce": 479028756, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 997.5, + "y": 710, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 394, + "seed": 1345975444, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652465060451, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 255, + "versionNonce": 1240642860, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1002.5, + "y": 872, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 617182356, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 771, + "versionNonce": 195003284, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1019.6291629162915, + "y": 1041, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 825, + "versionNonce": 582692780, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1301.5, + "y": 871, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 70, + "seed": 1144070700, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "MergeTree \nfamily table", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "MergeTree family table" + }, + { + "type": "rectangle", + "version": 1361, + "versionNonce": 1569845524, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1296.5, + "y": 709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 394, + "seed": 378158636, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + } + ], + "updated": 1652465060452, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 1146, + "versionNonce": 1905285676, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1316.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1396, + "versionNonce": 1910156948, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 993.7407827330846, + "y": 909.7665001139045, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 107.74078273308464, + "height": 1.766500113904499, + "seed": 1006009620, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": -0.023096342081524727, + "gap": 3.759217266915357 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -107.74078273308464, + -1.766500113904499 + ] + ] + }, + { + "type": "arrow", + "version": 2562, + "versionNonce": 2048313108, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1293.4366941211092, + "y": 913.2775351569246, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 78.93669412110921, + "height": 2.764348193272099, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465081783, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.01860928002735619, + "gap": 3.0633058788907874 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": 0.06413755642360305, + "gap": 2 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -78.93669412110921, + 2.764348193272099 + ] + ] + }, + { + "type": "arrow", + "version": 3666, + "versionNonce": 1227865108, + "isDeleted": false, + "id": "0CozKSjnZtY-uQsjp7TAa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1473.9239300813729, + "y": 1187.3723869577298, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 2.5516436994646483, + "height": 77.82917299595692, + "seed": 735765420, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652465060452, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.6178204858620798, + "gap": 6.543213961772835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5516436994646483, + -77.82917299595692 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + }, + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.png new file mode 100644 index 00000000000..c467d4d0438 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_01.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.excalidraw new file mode 100644 index 00000000000..4d32c5c0c9f --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.excalidraw @@ -0,0 +1,1048 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 822, + "versionNonce": 1029316756, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.5, + "y": 706.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 394, + "seed": 1090013588, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + }, + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "20AgrF3HvHf7UeyROfh63", + "type": "arrow" + } + ], + "updated": 1652459081172, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 181, + "versionNonce": 35805716, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 783.5, + "y": 868.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 1493094828, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 666, + "versionNonce": 1800864044, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 792.6291629162916, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [ + "Jv6-AChTrMCrVUCMAxkkv" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 438, + "versionNonce": 197133612, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 374, + "y": 700, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 394.99999999999994, + "seed": 894230420, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + } + ], + "updated": 1652458820139, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 517, + "versionNonce": 1371621524, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 396.61840277777765, + "y": 1013.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458820119, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 330, + "versionNonce": 474233516, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 420, + "y": 848.7499999999999, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 83, + "height": 72, + "seed": 2071509291, + "groupIds": [ + "4eZZpSvd60X5qb-FZFK5F" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458820119, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic", + "baseline": 61, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic" + }, + { + "type": "text", + "version": 443, + "versionNonce": 1348424748, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1441, + "y": 1181, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 226, + "height": 35, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652459130524, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(6) User queries", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(6) User queries" + }, + { + "type": "arrow", + "version": 1398, + "versionNonce": 34256556, + "isDeleted": false, + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 581, + "y": 824.6550741354022, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 196.5, + "height": 0.44225680624845154, + "seed": 172826772, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": -0.3695889031240465, + "gap": 1 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": 0.39634447611422324, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 196.5, + 0.44225680624845154 + ] + ] + }, + { + "type": "rectangle", + "version": 912, + "versionNonce": 699792300, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1109.5, + "y": 710, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 394, + "seed": 1345975444, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652458937733, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 198, + "versionNonce": 748954260, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1114.5, + "y": 872, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 617182356, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 766, + "versionNonce": 2031354028, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1131.6291629162915, + "y": 1041, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [ + "62LlCOWxTeDkXJ6fupA__" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 455, + "versionNonce": 925846420, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1474.5, + "y": 871, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 70, + "seed": 1144070700, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652459040868, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "MergeTree \nfamily table", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "MergeTree family table" + }, + { + "type": "rectangle", + "version": 1136, + "versionNonce": 250341292, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1469.5, + "y": 709, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 394, + "seed": 378158636, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + } + ], + "updated": 1652459040868, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 954, + "versionNonce": 1656679596, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1489.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "WaWg_oFZTAxIjjhW8pi0O" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459040869, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 1155, + "versionNonce": 2003689004, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1104.7407827330846, + "y": 909.9101994992986, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 137.98378221250425, + "height": 2.066634598782457, + "seed": 1006009620, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459417283, + "link": null, + "locked": false, + "startBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": -0.02317883163991407, + "gap": 4.759217266915357 + }, + "endBinding": { + "elementId": "PPMZXqupvG_AFJpkJkyTs", + "focus": 1.3955304257290362, + "gap": 14 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -137.98378221250425, + -2.066634598782457 + ] + ] + }, + { + "type": "arrow", + "version": 1871, + "versionNonce": 116003372, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1465.4366941211092, + "y": 912.6083644337409, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 139.9366941211092, + "height": 4.0506980513524695, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459040869, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.017801345344272513, + "gap": 4.063305878890787 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "focus": 0.0639631242434834, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -139.9366941211092, + 4.0506980513524695 + ] + ] + }, + { + "type": "arrow", + "version": 2340, + "versionNonce": 1410627372, + "isDeleted": false, + "id": "0CozKSjnZtY-uQsjp7TAa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1646.9239300813729, + "y": 1187.3723869577298, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 2.5516436994646483, + "height": 77.82917299595692, + "seed": 735765420, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459041009, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "focus": -0.6178204858620798, + "gap": 6.543213961772835 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5516436994646483, + -77.82917299595692 + ] + ] + }, + { + "type": "arrow", + "version": 1382, + "versionNonce": 1181162540, + "isDeleted": false, + "id": "fnewN-MLbbnm7F-0VOy8F", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 584.5422455342772, + "y": 955.0509996486933, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 190.97078732954185, + "height": 1.6618431469032657, + "seed": 1459117844, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458937733, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.29481001141426355, + "gap": 4.5422455342771855 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": -0.24749175012578659, + "gap": 2.986967136180965 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 190.97078732954185, + -1.6618431469032657 + ] + ] + }, + { + "id": "3GiF6AItYJOR_SCCtWz48", + "type": "text", + "x": 587.5, + "y": 782, + "width": 182, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1111672852, + "version": 57, + "versionNonce": 1496301460, + "isDeleted": false, + "boundElements": null, + "updated": 1652458913553, + "link": null, + "locked": false, + "text": "(3) messages", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 25, + "containerId": null, + "originalText": "(3) messages" + }, + { + "id": "cqZdtZeI6DgfZ0mE1UVDj", + "type": "text", + "x": 590.5, + "y": 900, + "width": 183, + "height": 35, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 96965804, + "version": 41, + "versionNonce": 1015763244, + "isDeleted": false, + "boundElements": null, + "updated": 1652458954553, + "link": null, + "locked": false, + "text": "(2) messages", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 25, + "containerId": null, + "originalText": "(2) messages" + }, + { + "id": "PPMZXqupvG_AFJpkJkyTs", + "type": "text", + "x": 989.5, + "y": 824, + "width": 115, + "height": 70, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1424642220, + "version": 43, + "versionNonce": 1459172268, + "isDeleted": false, + "boundElements": [ + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652459417282, + "link": null, + "locked": false, + "text": "(4) read\nrows", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 60, + "containerId": null, + "originalText": "(4) read\nrows" + }, + { + "id": "DycObbWQ7GIFaHs1NENKr", + "type": "text", + "x": 1335.5, + "y": 830, + "width": 130, + "height": 70, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1772574612, + "version": 29, + "versionNonce": 440341012, + "isDeleted": false, + "boundElements": null, + "updated": 1652459030033, + "link": null, + "locked": false, + "text": "(5) insert\nrows", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 60, + "containerId": null, + "originalText": "(5) insert\nrows" + }, + { + "type": "text", + "version": 493, + "versionNonce": 1460463916, + "isDeleted": false, + "id": "F1AWugVwb8emy-O_UUz7p", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 762, + "y": 1183.7283930191138, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 218, + "height": 35, + "seed": 399215788, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652459103504, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(1) Insert rows", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(1) Insert rows" + }, + { + "type": "arrow", + "version": 2399, + "versionNonce": 1081526316, + "isDeleted": false, + "id": "20AgrF3HvHf7UeyROfh63", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 939.9239300813729, + "y": 1185.1007799768436, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 2.5516436994646483, + "height": 77.82917299595692, + "seed": 1174529044, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652459081172, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": -0.46277159554651515, + "gap": 6.771606980886645 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.5516436994646483, + -77.82917299595692 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + }, + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.png new file mode 100644 index 00000000000..dfdbd2267f4 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_02.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.excalidraw new file mode 100644 index 00000000000..1800c44efb9 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.excalidraw @@ -0,0 +1,1484 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 877, + "versionNonce": 1057700116, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 778.5, + "y": 795.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 305, + "seed": 1090013588, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "RGcUE81uoGG9Wjr69IRRM" + }, + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + }, + { + "id": "z5NUzY_cWtaUODVlgPgjz", + "type": "arrow" + } + ], + "updated": 1652460591599, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 230, + "versionNonce": 727979564, + "isDeleted": false, + "id": "RGcUE81uoGG9Wjr69IRRM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 783.5, + "y": 913, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 1493094828, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460429499, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "w3o5tB4I0DAoE2Z_8IKNs", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 670, + "versionNonce": 525893036, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 792.6291629162916, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460421719, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 489, + "versionNonce": 433248404, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 374, + "y": 799, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 295.99999999999994, + "seed": 894230420, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "fnewN-MLbbnm7F-0VOy8F", + "type": "arrow" + }, + { + "id": "20AgrF3HvHf7UeyROfh63", + "type": "arrow" + } + ], + "updated": 1652460582837, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 521, + "versionNonce": 1895931948, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 396.61840277777765, + "y": 1013.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460438687, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 343, + "versionNonce": 1367918740, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 420, + "y": 848.7499999999999, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 104, + "height": 108, + "seed": 2071509291, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460438687, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic\n(github)", + "baseline": 97, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic\n(github)" + }, + { + "type": "rectangle", + "version": 968, + "versionNonce": 354049580, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1109.5, + "y": 798, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 306, + "seed": 1345975444, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "IUs6Kr5j_CgrMHavwSWab" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + } + ], + "updated": 1652460413189, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 254, + "versionNonce": 652405396, + "isDeleted": false, + "id": "IUs6Kr5j_CgrMHavwSWab", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1114.5, + "y": 916, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 617182356, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460413189, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "fTTGbxiaLOJbMhRhUsc4v", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 770, + "versionNonce": 2137439276, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1131.6291629162915, + "y": 1041, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460405919, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 824, + "versionNonce": 829597740, + "isDeleted": false, + "id": "DQhN188gSYbb8QNCNO-ur", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1480.5, + "y": 927.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 193, + "height": 70, + "seed": 1144070700, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460395640, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "MergeTree \nfamily table", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "RjSTnPTzFEcCQwfgRryLR", + "originalText": "MergeTree family table" + }, + { + "type": "rectangle", + "version": 1360, + "versionNonce": 1234027284, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1475.5, + "y": 810, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 203, + "height": 305, + "seed": 378158636, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "DQhN188gSYbb8QNCNO-ur" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + } + ], + "updated": 1652460395640, + "link": null, + "locked": false, + "fontSize": 26.280792193787637, + "baseline": 350.9999999999999 + }, + { + "type": "image", + "version": 1145, + "versionNonce": 947799572, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1495.6291629162915, + "y": 1054, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460387151, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 2558, + "versionNonce": 1039248660, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1471.4366941211092, + "y": 963.7977243135721, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 145.9366941211092, + "height": 1.9431502892945218, + "seed": 2125579948, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460413189, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "gap": 4.063305878890787, + "focus": -0.017801345344272513 + }, + "endBinding": { + "elementId": "fTTGbxiaLOJbMhRhUsc4v", + "gap": 1, + "focus": 0.0639631242434834 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -145.9366941211092, + -1.9431502892945218 + ] + ] + }, + { + "type": "arrow", + "version": 3665, + "versionNonce": 1826298132, + "isDeleted": false, + "id": "0CozKSjnZtY-uQsjp7TAa", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1595.5129981322245, + "y": 1125.5684007913123, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 222.32892493558256, + "height": 121.75343195272853, + "seed": 735765420, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "startBinding": { + "elementId": "RjSTnPTzFEcCQwfgRryLR", + "gap": 10.568400791312115, + "focus": -0.8313797330069356 + }, + "endBinding": { + "elementId": "VtcX1BJjwsOGzM0IvQqzO", + "gap": 2.6840731966419753, + "focus": -0.08099668900567501 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -222.32892493558256, + 121.75343195272853 + ] + ] + }, + { + "type": "arrow", + "version": 1651, + "versionNonce": 455902484, + "isDeleted": false, + "id": "fnewN-MLbbnm7F-0VOy8F", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 586.5422455342772, + "y": 964.6509936995194, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 190.97078732954185, + "height": 2.323802059964578, + "seed": 1459117844, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460575675, + "link": null, + "locked": false, + "startBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.12719275448043063, + "gap": 6.5422455342771855 + }, + "endBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": -0.08503908527857361, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 190.97078732954185, + -2.323802059964578 + ] + ] + }, + { + "type": "text", + "version": 42, + "versionNonce": 1867358996, + "isDeleted": false, + "id": "cqZdtZeI6DgfZ0mE1UVDj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 590.5, + "y": 900, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 183, + "height": 35, + "seed": 96965804, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": null, + "updated": 1652460380446, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(2) messages", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(2) messages" + }, + { + "type": "text", + "version": 87, + "versionNonce": 33250092, + "isDeleted": false, + "id": "PPMZXqupvG_AFJpkJkyTs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 993.5, + "y": 893, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 116, + "height": 70, + "seed": 1424642220, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460600846, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(3) read\nrows", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(3) read\nrows" + }, + { + "type": "text", + "version": 63, + "versionNonce": 407470892, + "isDeleted": false, + "id": "DycObbWQ7GIFaHs1NENKr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1332.5, + "y": 867, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 131, + "height": 70, + "seed": 1772574612, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460605666, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(4) insert\nrows", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(4) insert\nrows" + }, + { + "type": "text", + "version": 632, + "versionNonce": 891215660, + "isDeleted": false, + "id": "F1AWugVwb8emy-O_UUz7p", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 214, + "y": 843.7283930191138, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 142, + "height": 70, + "seed": 399215788, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460556676, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(1) Insert\n messages", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(1) Insert\n messages" + }, + { + "type": "arrow", + "version": 2726, + "versionNonce": 1126638868, + "isDeleted": false, + "id": "20AgrF3HvHf7UeyROfh63", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 231.47673829484896, + "y": 943.6052132454781, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 140.833858347953, + "height": 5.315910734403133, + "seed": 1174529044, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460553074, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "OpHRgAlXBOkspHa9237pK", + "focus": 0.08336612785291998, + "gap": 1.6894033571980458 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 140.833858347953, + -5.315910734403133 + ] + ] + }, + { + "type": "rectangle", + "version": 1992, + "versionNonce": 904332076, + "isDeleted": false, + "id": "6hrZ8Lxc1IkAujP2-UOiE", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 784.5, + "y": 1191, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 204, + "height": 265, + "seed": 1390883244, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "k1iyxZ_8w-N2G2s3vA0QL", + "type": "text" + }, + { + "id": "dgu7t4SGC1_vz6zFKXgqT", + "type": "arrow" + }, + { + "type": "text", + "id": "k1iyxZ_8w-N2G2s3vA0QL" + }, + { + "id": "wlxapT8t7hjX8nTBYrMKs", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1347, + "versionNonce": 2056209172, + "isDeleted": false, + "id": "k1iyxZ_8w-N2G2s3vA0QL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 789.5, + "y": 1288.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 70, + "seed": 396300052, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Kafka Table \nEngine", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "6hrZ8Lxc1IkAujP2-UOiE", + "originalText": "Kafka Table Engine" + }, + { + "type": "image", + "version": 1749, + "versionNonce": 726214700, + "isDeleted": false, + "id": "n9YlHz9gqfbSWi7lSMwv6", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 798.6291629162915, + "y": 1400, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 15473708, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 1628, + "versionNonce": 1734197396, + "isDeleted": false, + "id": "jb4EQeDdqJ3eIcsJHTGnc", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 378, + "y": 1184.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 206, + "height": 265.99999999999994, + "seed": 1754533012, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "zXkcojDwCzWlWnSDKS0c3", + "type": "arrow" + }, + { + "id": "dgu7t4SGC1_vz6zFKXgqT", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 1630, + "versionNonce": 382419628, + "isDeleted": false, + "id": "xEoHwdvH0P_uYns_Ms3Oq", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 400.61840277777765, + "y": 1369, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 602912428, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 1485, + "versionNonce": 8424980, + "isDeleted": false, + "id": "MIxwP1DPYMwHsQgVazdsX", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 396, + "y": 1204.25, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 175, + "height": 108, + "seed": 487414292, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "dgu7t4SGC1_vz6zFKXgqT", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28.500000000000032, + "fontFamily": 1, + "text": "Kafka\nTopic\n(github_out)", + "baseline": 97, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka\nTopic\n(github_out)" + }, + { + "type": "rectangle", + "version": 2148, + "versionNonce": 1458416532, + "isDeleted": false, + "id": "VtcX1BJjwsOGzM0IvQqzO", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1155.5, + "y": 1192.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 215, + "height": 261, + "seed": 1448803244, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "-6G9aET6IBY_stKpoxVD7", + "type": "text" + }, + { + "id": "CrtJtOfS32z5l1W2UQfaP", + "type": "arrow" + }, + { + "type": "text", + "id": "-6G9aET6IBY_stKpoxVD7" + }, + { + "id": "0CozKSjnZtY-uQsjp7TAa", + "type": "arrow" + }, + { + "id": "wlxapT8t7hjX8nTBYrMKs", + "type": "arrow" + } + ], + "updated": 1652460510794, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 1430, + "versionNonce": 230610580, + "isDeleted": false, + "id": "-6G9aET6IBY_stKpoxVD7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1160.5, + "y": 1288, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 205, + "height": 70, + "seed": 228910356, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Materialized \nView", + "baseline": 60, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "VtcX1BJjwsOGzM0IvQqzO", + "originalText": "Materialized View" + }, + { + "type": "image", + "version": 1877, + "versionNonce": 1395559596, + "isDeleted": false, + "id": "w1F0_rc6Oz2UmAQRAHPlJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1177.6291629162915, + "y": 1390.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 928425516, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "arrow", + "version": 4947, + "versionNonce": 589450924, + "isDeleted": false, + "id": "dgu7t4SGC1_vz6zFKXgqT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 591.007128303637, + "y": 1329.819177277539, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 189.52804472557273, + "height": 2.7145468799994887, + "seed": 521124628, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460540565, + "link": null, + "locked": false, + "startBinding": { + "elementId": "MIxwP1DPYMwHsQgVazdsX", + "focus": 1.3231617705533951, + "gap": 20.007128303637046 + }, + "endBinding": { + "elementId": "6hrZ8Lxc1IkAujP2-UOiE", + "focus": -0.015578660553000877, + "gap": 3.9648269707902273 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 189.52804472557273, + -2.7145468799994887 + ] + ] + }, + { + "type": "text", + "version": 1150, + "versionNonce": 1435506476, + "isDeleted": false, + "id": "pREuftuG5AnRKp6e3-fvJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 615.5, + "y": 1228.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 128, + "height": 70, + "seed": 353319060, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460510794, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(7) insert\nmessages", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(7) insert\nmessages" + }, + { + "type": "text", + "version": 1194, + "versionNonce": 1408603156, + "isDeleted": false, + "id": "WmVT-x9q2H7XouyFThDry", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1009.5, + "y": 1241.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 131, + "height": 70, + "seed": 1896696492, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652460525154, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "(6) insert\nrows", + "baseline": 60, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "(6) insert\nrows" + }, + { + "id": "1WeLblNsCSvF3GRcE7reh", + "type": "text", + "x": 1445.25, + "y": 1213.364196509557, + "width": 184, + "height": 70, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "sharp", + "seed": 1282224276, + "version": 105, + "versionNonce": 1991606932, + "isDeleted": false, + "boundElements": null, + "updated": 1652460610106, + "link": null, + "locked": false, + "text": "(5) trigger on\n insert", + "fontSize": 28, + "fontFamily": 1, + "textAlign": "left", + "verticalAlign": "top", + "baseline": 60, + "containerId": null, + "originalText": "(5) trigger on\n insert" + }, + { + "type": "arrow", + "version": 5205, + "versionNonce": 1721554604, + "isDeleted": false, + "id": "wlxapT8t7hjX8nTBYrMKs", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 994.7646063352292, + "y": 1333.6314390588707, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 159.73539366477075, + "height": 1.9453894833075083, + "seed": 642100396, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460510813, + "link": null, + "locked": false, + "startBinding": { + "elementId": "6hrZ8Lxc1IkAujP2-UOiE", + "focus": 0.06589468890984199, + "gap": 6.264606335229246 + }, + "endBinding": { + "elementId": "VtcX1BJjwsOGzM0IvQqzO", + "focus": -0.1054420222882615, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 159.73539366477075, + 1.9453894833075083 + ] + ] + }, + { + "type": "arrow", + "version": 1817, + "versionNonce": 1397390228, + "isDeleted": false, + "id": "z5NUzY_cWtaUODVlgPgjz", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 982.7646063352291, + "y": 978.0260975395391, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 129.64692341642296, + "height": 4.110324198034277, + "seed": 1603864108, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652460596744, + "link": null, + "locked": false, + "startBinding": { + "elementId": "w3o5tB4I0DAoE2Z_8IKNs", + "focus": 0.17198514904952156, + "gap": 1 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 129.64692341642296, + 4.110324198034277 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + }, + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.png new file mode 100644 index 00000000000..4d2c2cfd31a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_03.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.excalidraw b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.excalidraw new file mode 100644 index 00000000000..34deb7a6532 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.excalidraw @@ -0,0 +1,2384 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 410, + "versionNonce": 1606949524, + "isDeleted": false, + "id": "OpHRgAlXBOkspHa9237pK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 645, + "y": 397, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 560, + "height": 203, + "seed": 1180344869, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458539756, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 491, + "versionNonce": 1603764372, + "isDeleted": false, + "id": "BawcP8SgldqVfO4MEwxKZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 654.6184027777776, + "y": 407.5, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 37.42083333333335, + "height": 60.75084554678695, + "seed": 1892392779, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "scale": [ + 1, + 1 + ] + }, + { + "type": "image", + "version": 569, + "versionNonce": 671974060, + "isDeleted": false, + "id": "5wdzcM6SoclCftewiStkr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 412.62916291629165, + "y": 1044.5, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1527032971, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 722, + "versionNonce": 1266830868, + "isDeleted": false, + "id": "w3o5tB4I0DAoE2Z_8IKNs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 398.5, + "y": 706.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 299, + "height": 394.0000000000001, + "seed": 970209765, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 688, + "versionNonce": 1595952428, + "isDeleted": false, + "id": "yQt730wUg7Jm8prLoV0E4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 444.5, + "y": 730.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 554015205, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "I1HdsARxC3Fg0QwmFP7e_" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + }, + { + "id": "dqp4aHQM2LJ8LFkHyQVug", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 728, + "versionNonce": 1538747284, + "isDeleted": false, + "id": "no4hhjrIRjKPwEb_SIdv3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 447, + "y": 833, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 695150059, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "type": "text", + "id": "bbHzLDczYqvtwX1DL-R5S" + }, + { + "id": "dqp4aHQM2LJ8LFkHyQVug", + "type": "arrow" + }, + { + "id": "bsNl3So8xnScud4e0q3gT", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 743, + "versionNonce": 1853212588, + "isDeleted": false, + "id": "s7dSLvint5sJvavB_FVTn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 449, + "y": 938, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 1620350539, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "bsNl3So8xnScud4e0q3gT", + "type": "arrow" + }, + { + "id": "_l-d0XevHle03pX6piCdU", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 389, + "versionNonce": 845994260, + "isDeleted": false, + "id": "I1HdsARxC3Fg0QwmFP7e_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 449.5, + "y": 765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1933919371, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Kafka Table Engine", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "yQt730wUg7Jm8prLoV0E4", + "originalText": "Kafka Table Engine" + }, + { + "type": "text", + "version": 387, + "versionNonce": 439874092, + "isDeleted": false, + "id": "bbHzLDczYqvtwX1DL-R5S", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 452, + "y": 867.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1488694821, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "no4hhjrIRjKPwEb_SIdv3", + "originalText": "Materialized View" + }, + { + "type": "text", + "version": 455, + "versionNonce": 991467156, + "isDeleted": false, + "id": "eFshv2EPB1O6JDPdNKtb5", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 495, + "y": 955.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 98, + "height": 63, + "seed": 21572139, + "groupIds": [ + "oihEWuXq_eCQqfBeqPNXn" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Replicated\nMerge Tree \n", + "baseline": 57, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replicated\nMerge Tree \n" + }, + { + "type": "text", + "version": 304, + "versionNonce": 40936468, + "isDeleted": false, + "id": "aeFLYYiDEiobVoUWJkufD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 865, + "y": 448, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 120, + "height": 52, + "seed": 2071509291, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "Kafka Topic\n", + "baseline": 44, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Kafka Topic\n" + }, + { + "type": "rectangle", + "version": 62, + "versionNonce": 359290668, + "isDeleted": false, + "id": "6kWQPOWnbWeeWakZ-aoHJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 663, + "y": 562, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 1295853643, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 107, + "versionNonce": 241893780, + "isDeleted": false, + "id": "hBSwH5KkpMp4AZuOon4qJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 714, + "y": 563, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 960398469, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 151, + "versionNonce": 586060204, + "isDeleted": false, + "id": "SLQgImQNj2b86-9I3Z10u", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 880, + "y": 565, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 1962219307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "H1KleDze5j-giRfLVU-ly", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 183, + "versionNonce": 910012180, + "isDeleted": false, + "id": "lK29vU6mpWmEzPz8ut4fk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 931, + "y": 566, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 689582213, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "vHObq0tLqdKgChmGZY1e4", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 190, + "versionNonce": 419920940, + "isDeleted": false, + "id": "pF3Aoc6O1u0CmRgF4Exsv", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1085, + "y": 565, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 639862923, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 224, + "versionNonce": 2053024916, + "isDeleted": false, + "id": "Cbu4Qs9Hw9NcJzecuNVnZ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1135, + "y": 565, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 15583237, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "yOeYgKv0-55ugVRrvTZbF", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 116, + "versionNonce": 1637815980, + "isDeleted": false, + "id": "4HpPg65wWidd2ra-SuNxk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1230, + "y": 435, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 36, + "height": 24, + "seed": 1332885227, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 217, + "versionNonce": 1552153108, + "isDeleted": false, + "id": "6olbLzrgL1MA0e-Mk_Sno", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1276, + "y": 436, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 85, + "height": 26, + "seed": 1581616747, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "partition", + "baseline": 18, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "partition" + }, + { + "type": "arrow", + "version": 1099, + "versionNonce": 425681196, + "isDeleted": false, + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 688, + "y": 587, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 152, + "height": 138, + "seed": 2110100235, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "6kWQPOWnbWeeWakZ-aoHJ", + "focus": -0.6829155060352831, + "gap": 1 + }, + "endBinding": { + "elementId": "yQt730wUg7Jm8prLoV0E4", + "focus": -0.40897243107769427, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -152, + 138 + ] + ] + }, + { + "type": "arrow", + "version": 679, + "versionNonce": 933468052, + "isDeleted": false, + "id": "yNYMjvDf-J0CBK_4SAyJq", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 739, + "y": 591, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 157, + "height": 134, + "seed": 594821957, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "hBSwH5KkpMp4AZuOon4qJ", + "focus": -0.8030726256983242, + "gap": 4 + }, + "endBinding": { + "elementId": "yQt730wUg7Jm8prLoV0E4", + "focus": -0.11283152311189693, + "gap": 5.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -157, + 134 + ] + ] + }, + { + "type": "arrow", + "version": 917, + "versionNonce": 934435756, + "isDeleted": false, + "id": "dqp4aHQM2LJ8LFkHyQVug", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 536, + "y": 818, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0, + "height": 14, + "seed": 832282699, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "no4hhjrIRjKPwEb_SIdv3", + "focus": 0.0631578947368421, + "gap": 15 + }, + "endBinding": { + "elementId": "yQt730wUg7Jm8prLoV0E4", + "focus": -0.03684210526315789, + "gap": 11.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 922, + "versionNonce": 401835284, + "isDeleted": false, + "id": "bsNl3So8xnScud4e0q3gT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 536, + "y": 924, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 1, + "height": 14, + "seed": 914334411, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "s7dSLvint5sJvavB_FVTn", + "focus": 0.12436363636363634, + "gap": 14 + }, + "endBinding": { + "elementId": "no4hhjrIRjKPwEb_SIdv3", + "focus": -0.027636363636363633, + "gap": 15 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1, + 14 + ] + ] + }, + { + "type": "image", + "version": 653, + "versionNonce": 918685228, + "isDeleted": false, + "id": "xUOJ_PvsPr3ef2_P8dO_l", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 805.6291629162915, + "y": 1045, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1010175947, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 799, + "versionNonce": 317309588, + "isDeleted": false, + "id": "fTTGbxiaLOJbMhRhUsc4v", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 791.5, + "y": 707, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 299, + "height": 394.0000000000001, + "seed": 1439426149, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 739, + "versionNonce": 997744812, + "isDeleted": false, + "id": "TdP4oWRlEc-9pLfHaDcgV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 837.5, + "y": 731, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 706207339, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "GofrK5Hib8jBiHa3Owk54", + "type": "text" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + }, + { + "type": "text", + "id": "GofrK5Hib8jBiHa3Owk54" + }, + { + "id": "Z_UeBHZwQ5H4kXzc0nY8W", + "type": "arrow" + }, + { + "id": "H1KleDze5j-giRfLVU-ly", + "type": "arrow" + }, + { + "id": "vHObq0tLqdKgChmGZY1e4", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 780, + "versionNonce": 524046356, + "isDeleted": false, + "id": "YMjqZ7fDrBGho7Y5hVDRZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 840, + "y": 833.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 179032517, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "w6pNx7-pQfFpnmLxrrAYA", + "type": "text" + }, + { + "id": "Z_UeBHZwQ5H4kXzc0nY8W", + "type": "arrow" + }, + { + "type": "text", + "id": "w6pNx7-pQfFpnmLxrrAYA" + }, + { + "id": "5QiNVNtXFF14U-aj2fOgo", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 794, + "versionNonce": 1031760684, + "isDeleted": false, + "id": "-wJsaOPL1Fd19lt_0PbzL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 842, + "y": 938.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 604428555, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "5QiNVNtXFF14U-aj2fOgo", + "type": "arrow" + }, + { + "id": "_l-d0XevHle03pX6piCdU", + "type": "arrow" + }, + { + "id": "XtxP2K6AUmA8yxdc-7ttT", + "type": "arrow" + }, + { + "id": "ej-I5ud4HGqwa2-L9SDby", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 437, + "versionNonce": 1826696596, + "isDeleted": false, + "id": "GofrK5Hib8jBiHa3Owk54", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 842.5, + "y": 765.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 657936677, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Kafka Table Engine", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "TdP4oWRlEc-9pLfHaDcgV", + "originalText": "Kafka Table Engine" + }, + { + "type": "text", + "version": 441, + "versionNonce": 792798636, + "isDeleted": false, + "id": "w6pNx7-pQfFpnmLxrrAYA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 845, + "y": 868, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 125665195, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "YMjqZ7fDrBGho7Y5hVDRZ", + "originalText": "Materialized View" + }, + { + "type": "text", + "version": 503, + "versionNonce": 1024350996, + "isDeleted": false, + "id": "HE2GVgZnlQRR5zx3gsWdp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 888, + "y": 956, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 98, + "height": 63, + "seed": 1490805893, + "groupIds": [ + "p8D-qlcPz9Jt6CGm3Hykj" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Replicated\nMerge Tree \n", + "baseline": 57, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replicated\nMerge Tree \n" + }, + { + "type": "arrow", + "version": 1066, + "versionNonce": 635932716, + "isDeleted": false, + "id": "Z_UeBHZwQ5H4kXzc0nY8W", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 929, + "y": 818.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0, + "height": 14, + "seed": 514216523, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "YMjqZ7fDrBGho7Y5hVDRZ", + "focus": 0.0631578947368421, + "gap": 15 + }, + "endBinding": { + "elementId": "TdP4oWRlEc-9pLfHaDcgV", + "focus": -0.03684210526315789, + "gap": 11.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 1070, + "versionNonce": 976869524, + "isDeleted": false, + "id": "5QiNVNtXFF14U-aj2fOgo", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 929, + "y": 924.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 1, + "height": 14, + "seed": 1129778149, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": 0.12436363636363634, + "gap": 14 + }, + "endBinding": { + "elementId": "YMjqZ7fDrBGho7Y5hVDRZ", + "focus": -0.027636363636363633, + "gap": 15 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1, + 14 + ] + ] + }, + { + "type": "image", + "version": 780, + "versionNonce": 22850220, + "isDeleted": false, + "id": "mHwVKgVtq-QNgT610tzXi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1195.6291629162915, + "y": 1042, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 50.74167416741681, + "height": 45.09920000000007, + "seed": 1030718757, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "status": "saved", + "fileId": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "scale": [ + 1, + 1 + ] + }, + { + "type": "rectangle", + "version": 962, + "versionNonce": 1343858196, + "isDeleted": false, + "id": "RjSTnPTzFEcCQwfgRryLR", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1181.5, + "y": 704, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 299, + "height": 394.0000000000001, + "seed": 923962283, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 729, + "versionNonce": 340423980, + "isDeleted": false, + "id": "4Sf2JJTKTIv4fXMhyftIK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1227.5, + "y": 728, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 1642961029, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "nS45VyL5gQgr4yEFQKF1O", + "type": "text" + }, + { + "id": "S5iZiJVKGX3m4Jxzm3sW1", + "type": "arrow" + }, + { + "id": "yNYMjvDf-J0CBK_4SAyJq", + "type": "arrow" + }, + { + "type": "text", + "id": "nS45VyL5gQgr4yEFQKF1O" + }, + { + "id": "U6eE3bs8s0eDq1lmlfqFA", + "type": "arrow" + }, + { + "id": "qr6MKD1-7_7vReZvNxdKb", + "type": "arrow" + }, + { + "id": "yOeYgKv0-55ugVRrvTZbF", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 768, + "versionNonce": 61064084, + "isDeleted": false, + "id": "nDwemTlbCnE6JVk1juOuX", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1230, + "y": 830.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 800710219, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "Z0vWSwzkszboISa94ozDk", + "type": "text" + }, + { + "id": "U6eE3bs8s0eDq1lmlfqFA", + "type": "arrow" + }, + { + "type": "text", + "id": "Z0vWSwzkszboISa94ozDk" + }, + { + "id": "SjiA7FvjQPxrv-qfmRHWQ", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 782, + "versionNonce": 1276833708, + "isDeleted": false, + "id": "en2eREDEBckio9tpltvw4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1232, + "y": 935.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 190.00000000000003, + "height": 89.99999999999999, + "seed": 672284645, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "VmaWWRKBGZIpvSBPgiLg7", + "type": "arrow" + }, + { + "id": "Sxgek1GT7gVMM_dga8BOX", + "type": "arrow" + }, + { + "id": "pBM9wdru5a8pA3ErwiEVN", + "type": "arrow" + }, + { + "id": "czegUU8fG-rLrZaA50yq5", + "type": "arrow" + }, + { + "id": "V--avbs4_p6yFKQAQjIU4", + "type": "arrow" + }, + { + "id": "nixiZJMbyCAz_mgPpJLNo", + "type": "arrow" + }, + { + "id": "YvGcMZo4sI_GeyjPUVvwa", + "type": "arrow" + }, + { + "id": "SjiA7FvjQPxrv-qfmRHWQ", + "type": "arrow" + }, + { + "id": "0IqXaCVB97fUCwQlxDYn8", + "type": "arrow" + } + ], + "updated": 1652458511555, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 426, + "versionNonce": 1259221268, + "isDeleted": false, + "id": "nS45VyL5gQgr4yEFQKF1O", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1232.5, + "y": 762.5, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1226693867, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Kafka Table Engine", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "4Sf2JJTKTIv4fXMhyftIK", + "originalText": "Kafka Table Engine" + }, + { + "type": "text", + "version": 425, + "versionNonce": 1492654636, + "isDeleted": false, + "id": "Z0vWSwzkszboISa94ozDk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1235, + "y": 865, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 180, + "height": 21, + "seed": 1173027653, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Materialized View", + "baseline": 15, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "nDwemTlbCnE6JVk1juOuX", + "originalText": "Materialized View" + }, + { + "type": "text", + "version": 492, + "versionNonce": 1708060308, + "isDeleted": false, + "id": "C91KrmcNBK1wntk4LkBCb", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1278, + "y": 953, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 98, + "height": 63, + "seed": 516491147, + "groupIds": [ + "U6eS78sTSSn0o38G1hVr7" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "fontSize": 16, + "fontFamily": 1, + "text": "Replicated\nMerge Tree \n", + "baseline": 57, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "Replicated\nMerge Tree \n" + }, + { + "type": "arrow", + "version": 1020, + "versionNonce": 1439429804, + "isDeleted": false, + "id": "U6eE3bs8s0eDq1lmlfqFA", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1319, + "y": 815.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0, + "height": 14, + "seed": 1406487205, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "nDwemTlbCnE6JVk1juOuX", + "focus": 0.0631578947368421, + "gap": 15 + }, + "endBinding": { + "elementId": "4Sf2JJTKTIv4fXMhyftIK", + "focus": -0.03684210526315789, + "gap": 11.5 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 1024, + "versionNonce": 882637844, + "isDeleted": false, + "id": "SjiA7FvjQPxrv-qfmRHWQ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1319, + "y": 921.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 1, + "height": 14, + "seed": 1995824683, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "en2eREDEBckio9tpltvw4", + "focus": 0.12436363636363634, + "gap": 14 + }, + "endBinding": { + "elementId": "nDwemTlbCnE6JVk1juOuX", + "focus": -0.027636363636363633, + "gap": 15 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1, + 14 + ] + ] + }, + { + "type": "arrow", + "version": 707, + "versionNonce": 1883275052, + "isDeleted": false, + "id": "H1KleDze5j-giRfLVU-ly", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 896.6471822090416, + "y": 594, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0.8984692097415063, + "height": 131, + "seed": 206213061, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "SLQgImQNj2b86-9I3Z10u", + "focus": 0.06836643444191433, + "gap": 5 + }, + "endBinding": { + "elementId": "TdP4oWRlEc-9pLfHaDcgV", + "focus": -0.3892729439809281, + "gap": 6 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.8984692097415063, + 131 + ] + ] + }, + { + "type": "arrow", + "version": 723, + "versionNonce": 292247956, + "isDeleted": false, + "id": "vHObq0tLqdKgChmGZY1e4", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 949.6763431306226, + "y": 593, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 0.9822442535212303, + "height": 131.00000000000023, + "seed": 40415301, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "lK29vU6mpWmEzPz8ut4fk", + "focus": -0.031170433654243393, + "gap": 3 + }, + "endBinding": { + "elementId": "TdP4oWRlEc-9pLfHaDcgV", + "focus": 0.19455621301774917, + "gap": 6.999999999999773 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.9822442535212303, + 131.00000000000023 + ] + ] + }, + { + "type": "arrow", + "version": 368, + "versionNonce": 281000364, + "isDeleted": false, + "id": "qr6MKD1-7_7vReZvNxdKb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1111, + "y": 587, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 153, + "height": 141, + "seed": 34914181, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "4Sf2JJTKTIv4fXMhyftIK", + "focus": -0.06723372781065089, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 153, + 141 + ] + ] + }, + { + "type": "arrow", + "version": 672, + "versionNonce": 661849876, + "isDeleted": false, + "id": "yOeYgKv0-55ugVRrvTZbF", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1165, + "y": 589, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 153, + "height": 138, + "seed": 647723019, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "Cbu4Qs9Hw9NcJzecuNVnZ", + "focus": 0.04166666666666667, + "gap": 1 + }, + "endBinding": { + "elementId": "4Sf2JJTKTIv4fXMhyftIK", + "focus": 0.3209302325581395, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 153, + 138 + ] + ] + }, + { + "type": "arrow", + "version": 979, + "versionNonce": 41133100, + "isDeleted": false, + "id": "_l-d0XevHle03pX6piCdU", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 644, + "y": 976, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 197, + "height": 2, + "seed": 1796874123, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "s7dSLvint5sJvavB_FVTn", + "focus": -0.1302043070127002, + "gap": 5 + }, + "endBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": 0.2278851463279956, + "gap": 1 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 197, + -2 + ] + ] + }, + { + "type": "arrow", + "version": 915, + "versionNonce": 1260979348, + "isDeleted": false, + "id": "XtxP2K6AUmA8yxdc-7ttT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 837, + "y": 977, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 199, + "height": 1, + "seed": 643942629, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": 0.13187845303867404, + "gap": 5 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -199, + -1 + ] + ] + }, + { + "type": "arrow", + "version": 702, + "versionNonce": 457588396, + "isDeleted": false, + "id": "ej-I5ud4HGqwa2-L9SDby", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1036.5, + "y": 980.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 197, + "height": 2, + "seed": 1342950315, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "-wJsaOPL1Fd19lt_0PbzL", + "focus": -0.04329099944781889, + "gap": 4.5 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 197, + -2 + ] + ] + }, + { + "type": "arrow", + "version": 1368, + "versionNonce": 1380143636, + "isDeleted": false, + "id": "0IqXaCVB97fUCwQlxDYn8", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 0, + "opacity": 100, + "angle": 0, + "x": 1229.5, + "y": 981.5, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 199, + "height": 1, + "seed": 1613256837, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1652458511555, + "link": null, + "locked": false, + "startBinding": { + "elementId": "en2eREDEBckio9tpltvw4", + "focus": -0.03276243093922652, + "gap": 2.5 + }, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -199, + -1 + ] + ] + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96": { + "mimeType": "image/png", + "id": "b2dcc1fcc0af9092763d1d21dbe9ff1d70032f96", + "dataURL": "data:image/png;base64,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", + "created": 1648219881114 + }, + "6a7ab914e457c49e24cbce1b5454bd1d4dcce288": { + "mimeType": "image/svg+xml", + "id": "6a7ab914e457c49e24cbce1b5454bd1d4dcce288", + "dataURL": "data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjIyMjIiIHZpZXdCb3g9IjAgMCA5IDgiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648219958285 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.png b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.png new file mode 100644 index 00000000000..6923a7d710e Binary files /dev/null and b/docs/ja/integrations/data-ingestion/kafka/images/kafka_04.png differ diff --git a/docs/ja/integrations/data-ingestion/kafka/index.md b/docs/ja/integrations/data-ingestion/kafka/index.md new file mode 100644 index 00000000000..feece2ad98b --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/index.md @@ -0,0 +1,58 @@ +--- +sidebar_label: ClickHouseとKafkaの統合 +sidebar_position: 1 +slug: /ja/integrations/kafka +description: ClickHouseとKafkaの紹介 +--- + +# ClickHouseとKafkaの統合 + +[Apache Kafka](https://kafka.apache.org/)は、数千の企業が高性能データパイプライン、ストリーミング分析、データ統合、ミッションクリティカルなアプリケーションのために使用しているオープンソースの分散イベントストリーミングプラットフォームです。KafkaとClickHouseが関与するほとんどの場合、ユーザーはKafkaベースのデータをClickHouseに挿入したいと考えています。以下に、その両方のユースケースに対するいくつかのオプションを示し、それぞれのアプローチの利点と欠点を特定します。 + +## オプションの選択 + +KafkaをClickHouseと統合する際、高レベルのアプローチについて早期にアーキテクチャ上の決定を下す必要があります。以下に最も一般的な戦略を示します。 + +### Kafka用ClickPipes(ClickHouse Cloud) +* [**ClickPipes**](../clickpipes/kafka.md)は、ClickHouse Cloudにデータを取り込む最も簡単で直感的な方法を提供します。現在、Apache Kafka、Confluent Cloud、およびAmazon MSKをサポートしており、今後さらに多くのデータソースが追加される予定です。 + +### 3rd-Party CloudベースのKafka接続 +* [**Confluent Cloud**](./confluent/index.md) - Confluentプラットフォームは、ClickHouse Connector SinkをConfluent Cloud上で[アップロードして稼働](./confluent/custom-connector.md)するオプションや、Apache KafkaをHTTPまたはHTTPS経由でAPIと統合する[Confluentプラットフォーム用のHTTP Sink Connector](./confluent/kafka-connect-http.md)を利用するオプションを提供します。 + +* [**Amazon MSK**](./msk/index.md) - Amazon MSK Connectフレームワークをサポートして、Apache KafkaクラスターからClickHouseなどの外部システムにデータを転送します。Amazon MSKにClickHouse Kafka Connectをインストールすることができます。 + +* [**Redpanda Cloud**](https://cloud.redpanda.com/) - Redpandaは、Kafka API互換のストリーミングデータプラットフォームで、ClickHouseのアップストリームデータソースとして使用できます。ホストされたクラウドプラットフォームであるRedpanda Cloudは、Kafkaプロトコル経由でClickHouseと統合され、ストリーミング分析ワークロードのリアルタイムデータ取り込みを可能にします。 + +### セルフマネージドKafka接続 +* [**Kafka Connect**](./kafka-clickhouse-connect-sink.md) - Kafka Connectは、Apache Kafkaの無料のオープンソースコンポーネントで、Kafkaと他のデータシステム間でのシンプルなデータ統合用に設計された集中データハブとして機能します。コネクタは、Kafkaから他のデータストアへのデータのスケーラブルで信頼性の高いストリーミングをシンプルに提供します。Source Connectorsは他のシステムからKafkaトピックにデータを挿入し、Sink ConnectorsはKafkaトピックからClickHouseなどのデータストアにデータを配信します。 + +* [**Vector**](./kafka-vector.md) - Vectorはベンダーに依存しないデータパイプラインです。Kafkaからデータを読み込み、ClickHouseにイベントを送信する能力があり、堅牢な統合オプションを提供します。 + +* [**JDBC Connect Sink**](./kafka-connect-jdbc.md) - Kafka Connect JDBC Sinkコネクタは、Kafkaトピックから任意のJDBCドライバーを備えたリレーショナルデータベースにデータをエクスポートすることを可能にします。 + +* **カスタムコード** - KafkaとClickHouse用のそれぞれのクライアントライブラリを使用したカスタムコードは、イベントのカスタム処理が必要な場合に適切なケースがあります。この文書の範囲を超えています。 + +* [**Kafkaテーブルエンジン**](./kafka-table-engine.md)は、ネイティブClickHouse統合(ClickHouse Cloudでは利用不可)を提供します。このテーブルエンジンは**プル**してデータをソースシステムから取得します。これには、ClickHouseがKafkaに直接アクセスできることが必要です。 + +* [**名前付きコレクションを用いたKafkaテーブルエンジン**](./kafka-table-engine-named-collections.md) - 名前付きコレクションを使用することで、KafkaとのネイティブClickHouse統合が可能になります。このアプローチは、複数のKafkaクラスターへの安全な接続を許可し、構成管理を集中化し、スケーラビリティとセキュリティを向上させます。 + +### アプローチの選択 +いくつかの決定ポイントに要約されます: + +* **接続性** - Kafkaテーブルエンジンは、ClickHouseが目的地である場合、Kafkaからプルできる必要があります。これには双方向接続性が必要です。例えば、ClickHouseがクラウドにあり、Kafkaがセルフマネージドされている場合のように、ネットワークが分断されている場合、コンプライアンスやセキュリティ上の理由からこれを解除することをためらうかもしれません。(このアプローチは現在のClickHouse Cloudではサポートされていません。)Kafkaテーブルエンジンは、消費者用のスレッドを使用して、ClickHouse自身のリソースを利用します。このリソースの負担をClickHouseにかけることは、リソースの制約のために不可能かもしれず、また、アーキテクトは関心の分離を好むかもしれません。この場合、別のプロセスとして実行され、異なるハードウェア上にデプロイできるKafka Connectのようなツールが好ましいかもしれません。これにより、Kafkaデータのプルを担当するプロセスをClickHouseとは独立してスケールすることができます。 + +* **クラウドでのホスティング** - クラウドベンダは、プラットフォーム上で利用可能なKafkaコンポーネントに制限を設ける場合があります。各クラウドベンダの推奨オプションを探るために、ガイドに従ってください。 + +* **外部でのエンリッチメント** - メッセージは、Materialized Viewのselectステートメント内の関数を使用してClickHouseに挿入される前に操作できますが、ユーザーは複雑なエンリッチメントをClickHouse外部に移動することを好むかもしれません。 + +* **データフローの方向** - Vectorは、KafkaからClickHouseへのデータ転送のみをサポートしています。 + +## 前提条件 + +リンクされたユーザーガイドは、以下を前提としています: + +* Kafkaの基礎(プロデューサー、コンシューマー、トピックなど)に精通していること。 +* これらの例のためにトピックを準備していること。すべてのデータがKafkaにJSONとして保存されていると想定していますが、Avroを使用している場合も原則は同じです。 +* kcat(以前はkafkacatと呼ばれていました)が素晴らしい[こちら](https://github.com/edenhill/kcat)にあることを利用して、Kafkaデータを公開および消費します。 +* サンプルデータをロードするためのいくつかのpythonスクリプトを参照していますが、例を自分のデータセットに適応させてください。 +* ClickHouseのMaterialized Viewについて大まかに理解していること。 diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink.md b/docs/ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink.md new file mode 100644 index 00000000000..869fb91991a --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink.md @@ -0,0 +1,403 @@ +--- +sidebar_label: ClickHouse Kafka Connect Sink +sidebar_position: 2 +slug: /ja/integrations/kafka/clickhouse-kafka-connect-sink +description: ClickHouse公式のKafkaコネクタ。 +--- + +import ConnectionDetails from '@site/docs/ja/\_snippets/\_gather_your_details_http.mdx'; + +# ClickHouse Kafka Connect Sink + +:::note +サポートが必要な場合は、[このリポジトリで問題を報告](https://github.com/ClickHouse/clickhouse-kafka-connect/issues)するか、[ClickHouseの公的Slack](https://clickhouse.com/slack)で質問してください。 +::: + +**ClickHouse Kafka Connect Sink** は、KafkaトピックからClickHouseテーブルにデータを転送するKafkaコネクタです。 + +### ライセンス + +Kafka Connector Sink は [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) の下で配布されています。 + +### 環境要件 + +環境に [Kafka Connect](https://docs.confluent.io/platform/current/connect/index.html) フレームワークv2.7以上をインストールする必要があります。 + +### バージョン互換性マトリックス + +| ClickHouse Kafka Connect バージョン | ClickHouse バージョン | Kafka Connect | Confluent プラットフォーム | +|--------------------------------------|------------------------|---------------|----------------------------| +| 1.0.0 | > 23.3 | > 2.7 | > 6.1 | + +### 主な特徴 + +- 標準でExactly-onceセマンティクスを提供。新しいClickHouseのコア機能[KeepeMap](https://github.com/ClickHouse/ClickHouse/pull/39976)により実現され、最小限のアーキテクチャが可能です。 +- サードパーティのステートストアのサポート:現在はIn-memoryがデフォルトですが、KeeperMapを使用できます(Redisは近日追加予定)。 +- コア統合:ClickHouseによって構築、保守、およびサポートされています。 +- [ClickHouse Cloud](https://clickhouse.com/cloud)に対して継続的にテストされています。 +- 宣言されたスキーマとスキーマレスでのデータ挿入。 +- 全てのClickHouseデータタイプに対応。 + +### インストール手順 + +#### 接続情報を収集する + + + +#### 一般的なインストール手順 + +コネクタは、プラグインを実行するために必要なすべてのクラスファイルを含む単一のUber JARファイルとして配布されます。 + +プラグインをインストールするには、以下の手順を実行してください: + +- ClickHouse Kafka Connect Sink リポジトリの [リリース](https://github.com/ClickHouse/clickhouse-kafka-connect/releases) ページからコネクタ JAR ファイルを含む ZIP アーカイブをダウンロードします。 +- ZIP ファイルの内容を展開し、目的の場所にコピーします。 +- プラグインを Confluent Platform が見つけることができるように、Connect プロパティファイルの [plugin.path](https://kafka.apache.org/documentation/#connectconfigs_plugin.path) 設定にプラグインディレクトリを追加します。 +- トピック名、ClickHouseインスタンスのホスト名、およびパスワードを設定します。 + +```yml +connector.class=com.clickhouse.kafka.connect.ClickHouseSinkConnector +tasks.max=1 +topics= +ssl=true +jdbcConnectionProperties=?sslmode=STRICT +security.protocol=SSL +hostname= +database= +password= +ssl.truststore.location=/tmp/kafka.client.truststore.jks +port=8443 +value.converter.schemas.enable=false +value.converter=org.apache.kafka.connect.json.JsonConverter +exactlyOnce=true +username=default +schemas.enable=false +``` + +- Confluent Platformを再起動します。 +- Confluent Platformを使用している場合、Confluent Control Center UI にログインして、ClickHouse Sink が利用可能なコネクタのリストに表示されているか確認します。 + +### 設定オプション + +ClickHouse Sink を ClickHouseサーバーに接続するには、以下の情報を提供する必要があります: + +- 接続詳細:ホスト名(**必須**)とポート(オプション) +- ユーザー資格情報:パスワード(**必須**)とユーザー名(オプション) +- コネクタクラス:`com.clickhouse.kafka.connect.ClickHouseSinkConnector`(**必須**) +- トピックまたは topics.regex: ポーリングするKafka トピック - トピック名はテーブル名と一致している必要があります(**必須**) +- キーと値のコンバーター:トピック内のデータのタイプに基づいて設定します。ワーカ設定で定義されていない場合に必要です。 + +設定オプションの全表: + +| プロパティ名 | 説明 | デフォルト値 | +|--------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------| +| `hostname` (**必須**) | サーバーのホスト名またはIPアドレス | N/A | +| `port` | ClickHouseのポート - デフォルトは8443(クラウドではHTTPS用)ですが、HTTP(自ホストデフォルトの場合)を使用する場合は8123にする必要があります | `8443` | +| `ssl` | ClickHouseへのSSL接続を有効にする | `true` | +| `jdbcConnectionProperties` | ClickHouseへの接続時のプロパティ。`?`で始まり、`param=value`間は`&`で結合される必要があります | `""` | +| `username` | ClickHouseのデータベースユーザー名 | `default` | +| `password` (**必須**) | ClickHouseのデータベースパスワード | N/A | +| `database` | ClickHouseのデータベース名 | `default` | +| `connector.class` (**必須**) | コネクタクラス(デフォルト値として明示的に設定してください) | `"com.clickhouse.kafka.connect.ClickHouseSinkConnector"` | +| `tasks.max` | コネクタタスクの数 | `"1"` | +| `errors.retry.timeout` | ClickHouse JDBC リトライタイムアウト | `"60"` | +| `exactlyOnce` | Exactly Once 有効 | `"false"` | +| `topics` (**必須**) | ポーリングするKafkaトピック - トピック名はテーブル名と一致する必要があります | `""` | +| `key.converter` (**必須** - 説明参照) | キーのタイプに応じて設定します。キーを渡している場合(ワーカ設定で定義されていない場合)はここで必要です。 | `"org.apache.kafka.connect.storage.StringConverter"` | +| `value.converter` (**必須** - 説明参照) | トピック内のデータのタイプに基づいて設定します。サポートされる形式:- JSON、String、AvroまたはProtobuf フォーマット。ワーカ設定で定義されていない場合にここで必要です。 | `"org.apache.kafka.connect.json.JsonConverter"` | +| `value.converter.schemas.enable` | コネクタ値コンバータスキーマサポート | `"false"` | +| `errors.tolerance` | コネクタエラートレランス。サポートされる値:none、all | `"none"` | +| `errors.deadletterqueue.topic.name` | セットされている場合(errors.tolerance=allの場合)、失敗したバッチに対してDLQが使用されます([トラブルシューティング](#Troubleshooting)を参照) | `""` | +| `errors.deadletterqueue.context.headers.enable` | DLQに追加のヘッダーを追加します | `""` | +| `clickhouseSettings` | ClickHouse設定のコンマ区切りリスト(例: "insert_quorum=2, など...") | `""` | +| `topic2TableMap` | トピック名をテーブル名にマッピングするカンマ区切りリスト(例: "topic1=table1, topic2=table2, など...") | `""` | +| `tableRefreshInterval` | テーブル定義キャッシュの更新間隔(秒単位) | `0` | +| `keeperOnCluster` | 自ホストインスタンスのために ON CLUSTER パラメータを設定可能にします(例: " ON CLUSTER clusterNameInConfigFileDefinition ")exactly-once connect_state テーブル用([分散DDLクエリ](https://clickhouse.com/docs/ja/sql-reference/distributed-ddl)参照) | `""` | +| `bypassRowBinary` | スキーマベースのデータ(Avro、Protobufなど)に対するRowBinaryおよびRowBinaryWithDefaultsの使用を無効にすることができます - 欠損カラムがある場合や、Nullable/Defaultが許容できない場合にのみ使用してください | `"false"` | +| `dateTimeFormats` | DateTime64スキーマフィールドを解析するための日付時間形式、`-`で区切ります(例: 'someDateField=yyyy-MM-dd HH:mm:ss.SSSSSSSSS;someOtherDateField=yyyy-MM-dd HH:mm:ss')。 | `""` | +| `tolerateStateMismatch` | 現在のオフセットよりも"早い"レコードを削除できるようにコネクタを設定します(例: オフセット5が送信され、最後に記録されたオフセットが250の場合) | `"false"` | + +### ターゲットテーブル + +ClickHouse Connect SinkはKafkaトピックからメッセージを読み取り、適切なテーブルに書き込みます。ClickHouse Connect Sinkは既存のテーブルにデータを書き込みます。データを挿入する前に、ClickHouseに適切なスキーマを持つターゲットテーブルが作成されていることを確認してください。 + +各トピックにはClickHouse内で専用のターゲットテーブルが必要です。ターゲットテーブル名はソーストピック名と一致している必要があります。 + +### 前処理 + +ClickHouse Kafka Connect Sinkに送信される前にアウトバウンドメッセージを変換する必要がある場合は、[Kafka Connect Transformations](https://docs.confluent.io/platform/current/connect/transforms/overview.html) を使用してください。 + +### サポートされているデータ型 + +**スキーマ宣言あり:** + +| Kafka Connect タイプ | ClickHouse タイプ | サポート | プリミティブ | +| ----------------------------------------- |----------------------| -------- | ----------- | +| STRING | String | ✅ | Yes | +| INT8 | Int8 | ✅ | Yes | +| INT16 | Int16 | ✅ | Yes | +| INT32 | Int32 | ✅ | Yes | +| INT64 | Int64 | ✅ | Yes | +| FLOAT32 | Float32 | ✅ | Yes | +| FLOAT64 | Float64 | ✅ | Yes | +| BOOLEAN | Boolean | ✅ | Yes | +| ARRAY | Array(T) | ✅ | No | +| MAP | Map(Primitive, T) | ✅ | No | +| STRUCT | Variant(T1, T2, …) | ✅ | No | +| STRUCT | Tuple(a T1, b T2, …) | ✅ | No | +| STRUCT | Nested(a T1, b T2, …) | ✅ | No | +| BYTES | String | ✅ | No | +| org.apache.kafka.connect.data.Time | Int64 / DateTime64 | ✅ | No | +| org.apache.kafka.connect.data.Timestamp | Int32 / Date32 | ✅ | No | +| org.apache.kafka.connect.data.Decimal | Decimal | ✅ | No | + +**スキーマ宣言なし:** + +レコードはJSONに変換され、ClickHouseに[JSONEachRow](../../../sql-reference/formats.mdx#jsoneachrow)フォーマットの値として送信されます。 + +### 設定レシピ + +以下は、すぐに開始するための一般的な設定レシピです。 + +#### 基本設定 + +開始するための最も基本的な設定です - Kafka Connect を分散モードで実行し、ClickHouse サーバーが `localhost:8443` でSSLを有効にして実行されていることを前提とし、データはスキーマレスのJSONです。 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + "tasks.max": "1", + "consumer.override.max.poll.records": "5000", + "consumer.override.max.partition.fetch.bytes": "5242880", + "database": "default", + "errors.retry.timeout": "60", + "exactlyOnce": "false", + "hostname": "localhost", + "port": "8443", + "ssl": "true", + "jdbcConnectionProperties": "?ssl=true&sslmode=strict", + "username": "default", + "password": "", + "topics": "", + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + "value.converter.schemas.enable": "false", + "clickhouseSettings": "" + } +} +``` + +#### 複数トピックでの基本設定 + +コネクタは複数のトピックからデータを取得できます。 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "topics": "SAMPLE_TOPIC, ANOTHER_TOPIC, YET_ANOTHER_TOPIC", + ... + } +} +``` + +#### DLQを使用した基本設定 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "errors.tolerance": "all", + "errors.deadletterqueue.topic.name": "", + "errors.deadletterqueue.context.headers.enable": "true", + } +} +``` + +#### 異なるデータ形式での使用 + +##### Avro スキーマサポート + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "io.confluent.connect.avro.AvroConverter", + "value.converter.schema.registry.url": ":", + "value.converter.schemas.enable": "true", + } +} +``` + +##### Protobuf スキーマサポート + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "io.confluent.connect.protobuf.ProtobufConverter", + "value.converter.schema.registry.url": ":", + "value.converter.schemas.enable": "true", + } +} +``` + +注意: クラスが足りないという問題に直面した場合、すべての環境においてprotobufコンバータが付属しているわけではないため、依存ファイルを含むJarの別のリリースが必要になるかもしれません。 + +##### JSON スキーマサポート + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "org.apache.kafka.connect.json.JsonConverter", + } +} +``` + +##### String サポート + +コネクタは異なるClickHouseフォーマットでのStringコンバータをサポートします:[JSON](https://clickhouse.com/docs/ja/interfaces/formats#jsoneachrow)、[CSV](https://clickhouse.com/docs/ja/interfaces/formats#csv)、[TSV](https://clickhouse.com/docs/ja/interfaces/formats#tabseparated)。 + +```json +{ + "name": "clickhouse-connect", + "config": { + "connector.class": "com.clickhouse.kafka.connect.ClickHouseSinkConnector", + ... + "value.converter": "org.apache.kafka.connect.storage.StringConverter", + "customInsertFormat": "true", + "insertFormat": "CSV" + } +} +``` + +### ロギング + +クライアントKafka Connect Platformによってロギングが自動的に提供されます。ロギングの送信先と形式はKafka connectの[設定ファイル](https://docs.confluent.io/platform/current/connect/logging.html#log4j-properties-file)を通して設定できます。 + +Confluent Platformを使用する場合、CLIコマンドを実行してログを表示することができます: + +```bash +confluent local services connect log +``` + +追加の詳細については公式の[チュートリアル](https://docs.confluent.io/platform/current/connect/logging.html)をご覧ください。 + +### モニタリング + +ClickHouse Kafka Connectは[Java Management Extensions (JMX)](https://www.oracle.com/technical-resources/articles/javase/jmx.html)を通してランタイムメトリックをレポートします。JMXはKafka Connectorでデフォルトで有効になっています。 + +ClickHouse Connect MBeanName: + +```java +com.clickhouse:type=ClickHouseKafkaConnector,name=SinkTask{id} +``` + +ClickHouse Kafka Connectは次のメトリックを報告します: + +| 名前 | タイプ | 説明 | +|------------------------|------|----------------------------------------------------------------------------------| +| receivedRecords | long | 受信したレコードの総数。 | +| recordProcessingTime | long | レコードを統一された構造にグループ化および変換するのに費やされた総時間(ナノ秒単位)。 | +| taskProcessingTime | long | データをClickHouseに処理および挿入するのに費やされた総時間(ナノ秒単位)。 | + +### 制限事項 + +- 削除はサポートされていません。 +- バッチサイズはKafka Consumerのプロパティから継承されます。 +- Exactly-onceをKeeperMapで使用していてオフセットが変更または戻された場合、その特定のトピックからKeeperMapの内容を削除する必要があります。(さらなる詳細については下記のトラブルシューティングガイドをご覧ください) + +### パフォーマンスの調整 + +もし「Sinkコネクタのバッチサイズを調整したい」と考えたことがあるとしたら、このセクションはそのためのものです。 + +##### Connect Fetch対Connector Poll + +Kafka Connect(我々のSinkコネクタが基づいているフレームワーク)は、バックグラウンドでKafkaトピックからメッセージを取得します(コネクタとは独立して)。 + +このプロセスは `fetch.min.bytes` および `fetch.max.bytes` を使用して制御できます。`fetch.min.bytes` はフレームワークがコネクタに値を渡す前に必要な最小量を設定し(時間制限は `fetch.max.wait.ms` によって設定)、`fetch.max.bytes` は上限サイズを設定します。もしコネクタに大きなバッチを渡したい場合は、最小取得または最大待機を増やしてより大きなデータバンドルを構築するオプションがあります。 + +取得されたデータは次にコネクタクライアントがメッセージをポーリングすることによって消費され、各ポーリングの量は`max.poll.records` によって制御されます。注意してください、フェッチはポールとは独立しています! + +これらの設定を調整する際、ユーザーはフェッチサイズが `max.poll.records` の複数のバッチを生成することを目指すべきです(`fetch.min.bytes` および `fetch.max.bytes` は圧縮データを表していることを念頭に置いてください) - そうすることで、各コネクタタスクが可能な限り大きなバッチを挿入しています。 + +ClickHouseは大小を問わず頻繁に行われる小さいバッチよりも、多少の遅延があっても大バッチに最適化されています - バッチが大きいほど良いです。 + +```properties +consumer.max.poll.records=5000 +consumer.max.partition.fetch.bytes=5242880 +``` + +詳細については[Confluentのドキュメント](https://docs.confluent.io/platform/current/connect/references/allconfigs.html#override-the-worker-configuration)または[Kafkaのドキュメント](https://kafka.apache.org/documentation/#consumerconfigs)をご覧ください。 + +#### 高スループットの複数トピック + +もしコネクタが複数のトピックを購読するよう設定されており、topic2TableMapを使用してトピックをテーブルにマッピングしている場合でも、挿入でボトルネックが発生して消費者ラグが見られるときは、それぞれのトピックごとに1つのコネクタを作成することを検討してください。このボトルネックの主な原因は、現在バッチがテーブルに対して[逐次的に](https://github.com/ClickHouse/clickhouse-kafka-connect/blob/578ac07e8be1a920aaa3b26e49183595c3edd04b/src/main/java/com/clickhouse/kafka/connect/sink/ProxySinkTask.java#L95-L100)挿入されているからです。 + +1つのコネクタをトピックごとに作成することは、可能な限り最速の挿入速度を得るための回避策です。 + +### トラブルシューティング + +#### "State mismatch for topic \[someTopic\] partition \[0\]" + +これは、KeeperMapに保存されたオフセットがKafkaに保存されたオフセットと異なる場合に発生します。通常、トピックが削除された場合やオフセットが手動で調整された場合に発生します。 +これを解決するには、その特定のトピックとパーティションに対して保存された古い値を削除する必要があります。 + +**注意: この調整にはexactly-onceの影響があります。** + +#### "コネクタが再試行するエラーは何か?" + +現在は一時的で再試行可能と考えられるエラーに焦点を当てています。以下を含みます: + +- `ClickHouseException` - これはオーバーロードされた場合などにClickHouseが投げることができる一般的な例外です。 + 特に一時的と考えられるエラーコード: + - 3 - UNEXPECTED_END_OF_FILE + - 159 - TIMEOUT_EXCEEDED + - 164 - READONLY + - 202 - TOO_MANY_SIMULTANEOUS_QUERIES + - 203 - NO_FREE_CONNECTION + - 209 - SOCKET_TIMEOUT + - 210 - NETWORK_ERROR + - 242 - TABLE_IS_READ_ONLY + - 252 - TOO_MANY_PARTS + - 285 - TOO_FEW_LIVE_REPLICAS + - 319 - UNKNOWN_STATUS_OF_INSERT + - 425 - SYSTEM_ERROR + - 999 - KEEPER_EXCEPTION + - 1002 - UNKNOWN_EXCEPTION +- `SocketTimeoutException` - ソケットがタイムアウトした場合にスローされます。 +- `UnknownHostException` - ホストが解決できない場合にスローされます。 +- `IOException` - ネットワークに問題がある場合にスローされます。 + +#### "全てのデータが空白/ゼロである" +データのフィールドがテーブルのフィールドと一致していない可能性が高いです - これは特にCDC(およびDebeziumフォーマット)で一般的です。 +一般的な解決策は、コネクタ設定にflatten変換を追加することです: + +```properties +transforms=flatten +transforms.flatten.type=org.apache.kafka.connect.transforms.Flatten$Value +transforms.flatten.delimiter=_ +``` + +これによりデータがネストされたJSONからフラットなJSONに変換され(デリミタとして `_` を使用)、テーブル内のフィールドは「field1_field2_field3」の形式で構成されます(例: "before_id", "after_id" など)。 + +#### "KafkaキーをClickHouseで使用したい" +Kafkaキーはデフォルトで値フィールドに保存されませんが、`KeyToValue` 変換を使用してキーを値フィールドに移動することができます(新しい `_key` フィールド名の下): + +```properties +transforms=keyToValue +transforms.keyToValue.type=com.clickhouse.kafka.connect.transforms.KeyToValue +transforms.keyToValue.field=_key +``` diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-connect-jdbc.md b/docs/ja/integrations/data-ingestion/kafka/kafka-connect-jdbc.md new file mode 100644 index 00000000000..e94b83686bf --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-connect-jdbc.md @@ -0,0 +1,148 @@ +--- +sidebar_label: Kafka Connect JDBC コネクタ +sidebar_position: 4 +slug: /ja/integrations/kafka/kafka-connect-jdbc +description: Kafka Connect と ClickHouse を使用した JDBC コネクタ シンク +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# JDBC コネクタ + +:::note +このコネクタは、データが簡単でプリミティブ・データ型(例:int)で構成されている場合にのみ使用するべきです。ClickHouse固有の型、例えばマップはサポートされていません。 +::: + +以下の例では、Kafka Connect の Confluent ディストリビューションを使用します。 + +以下では、Kafka の単一トピックからメッセージを取り込み、ClickHouse テーブルに行を挿入する簡単なインストールについて説明します。Kafka 環境を持っていない場合、Confluent Cloud の使用を推奨します。これは、無料で利用できる十分なレベルを提供しています。 + +JDBC コネクタにはスキーマが必要であることに注意してください(JDBC コネクタでプレーンな JSON や CSV を使用することはできません)。スキーマは各メッセージにエンコードすることもできますが、関連オーバーヘッドを避けるために [Confluent スキーマレジスト](https://www.confluent.io/blog/kafka-connect-deep-dive-converters-serialization-explained/#json-schemas)y の利用を強く推奨します。提供された挿入スクリプトはメッセージからスキーマを自動的に推測し、それをレジストリに挿入します。このスクリプトは他のデータセットでも再利用可能です。Kafka のキーは文字列であると仮定しています。Kafka スキーマの詳細は[こちら](https://docs.confluent.io/platform/current/schema-registry/index.html)で確認できます。 + +### ライセンス +JDBC コネクタは [Confluent Community License](https://www.confluent.io/confluent-community-license) の下で配布されています。 + +### 手順 +#### 接続の詳細を収集する + + +#### 1. Kafka Connect と コネクタをインストールする + +Confluent パッケージをダウンロードし、ローカルにインストールしたと仮定しています。コネクタのインストールの手順については[こちら](https://docs.confluent.io/kafka-connect-jdbc/current/#install-the-jdbc-connector)を参照してください。 + +confluent-hub のインストール方法を使用すると、ローカルの構成ファイルが更新されます。 + +Kafka から ClickHouse にデータを送信するには、コネクタの Sink コンポーネントを使用します。 + +#### 2. JDBC ドライバをダウンロードしてインストールする + +ClickHouse JDBC ドライバー `clickhouse-jdbc--shaded.jar` を[こちら](https://github.com/ClickHouse/clickhouse-java/releases)からダウンロードしてインストールします。そして、[こちら](https://docs.confluent.io/kafka-connect-jdbc/current/#installing-jdbc-drivers)の詳細に従って Kafka Connect にインストールします。他のドライバも動作する可能性がありますが、テストされていません。 + +:::note + +一般的な問題: ドキュメントは jar を `share/java/kafka-connect-jdbc/` にコピーすることを推奨しています。ドライバが見つからない場合、ドライバを `share/confluent-hub-components/confluentinc-kafka-connect-jdbc/lib/` にコピーするか、`plugin.path` を変更してドライバを含めるようにします。詳しくは以下を参照してください。 + +::: + +#### 3. 構成を準備する + +[こちらの手順](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#set-up-a-local-connect-worker-with-cp-install)に従って、インストールタイプに関連する Connect をセットアップし、スタンドアロンと分散クラスターの違いに注意してください。Confluent Cloud を使用する場合、分散セットアップが関連します。 + +以下のパラメータは、ClickHouse で JDBC コネクタを使用する場合に関連します。全パラメータ一覧は[こちら](https://docs.confluent.io/kafka-connect-jdbc/current/sink-connector/index.html)で確認できます。 + +* `connection.url` - 形式は `jdbc:clickhouse://<clickhouse host>:<clickhouse http port>/<target database>` とする必要があります。 +* `connection.user` - ターゲットデータベースへの書き込みアクセス権を持つユーザー +* `table.name.format` - データを挿入する ClickHouse テーブル。存在している必要があります。 +* `batch.size` - 一度に送信する行数。ClickHouse の[推奨事項](../../../concepts/why-clickhouse-is-so-fast.md#performance-when-inserting-data)に基づき、1000 を最小値として考慮してください。 +* `tasks.max` - JDBC Sink コネクタは 1 つ以上のタスクの実行をサポートしています。これによりパフォーマンスを向上させることができます。バッチサイズと共に、パフォーマンス向上の主要手段を表します。 +* `value.converter.schemas.enable` - スキーマレジストリを使用している場合は false に設定し、メッセージにスキーマを埋め込む場合は true に設定します。 +* `value.converter` - データタイプに応じて設定します。たとえば JSON の場合は “io.confluent.connect.json.JsonSchemaConverter”。 +* `key.converter` - “org.apache.kafka.connect.storage.StringConverter” に設定します。文字列キーを利用します。 +* `pk.mode` - ClickHouse には関連しないため、none に設定します。 +* `auto.create` - サポートされておらず、false に設定する必要があります。 +* `auto.evolve` - 将来的にサポートされる可能性があるため、false を推奨します。 +* `insert.mode` - “insert” に設定します。他のモードは現在サポートされていません。 +* `key.converter` - キーのタイプに応じて設定します。 +* `value.converter` - トピック上のデータタイプに基づいて設定します。このデータはサポートされたスキーマを持っている必要があります。JSON、Avro、または Protobuf 形式など。 + +サンプルデータセットをテストに使用する場合、以下を設定してください: + +* `value.converter.schemas.enable` - スキーマレジストリを使用するため false に設定します。スキーマを各メッセージに埋め込む場合は true に設定します。 +* `key.converter` - Set to “org.apache.kafka.connect.storage.StringConverter”. 文字列キーを利用します。 +* `value.converter` - Set “io.confluent.connect.json.JsonSchemaConverter”. +* `value.converter.schema.registry.url` - スキーマサーバーの URL を設定し、`value.converter.schema.registry.basic.auth.user.info` によりスキーマサーバーへの認証情報を入力します。 + +Github のサンプルデータ用の構成ファイルの例は[こちら](https://github.com/ClickHouse/kafka-samples/tree/main/github_events/jdbc_sink)で確認できます。Connect がスタンドアロンモードで実行され、Kafka が Confluent Cloud にホストされていることを前提としています。 + +#### 4. ClickHouse テーブルを作成する + +テーブルが作成されていることを確認し、既存の例から存在する場合は削除します。以下に示すのは、削減された Github データセットに対応した例です。未対応の Array や Map 型の不在に注意してください: + +```sql +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at) +``` + +#### 5. Kafka Connect を起動する + +Kafka Connect を[スタンドアロン](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#standalone-cluster)または[分散](https://docs.confluent.io/cloud/current/cp-component/connect-cloud-config.html#distributed-cluster)モードで起動します。 + +```bash +./bin/connect-standalone connect.properties.ini github-jdbc-sink.properties.ini +``` + +#### 6. Kafka にデータを追加する + +提供された[スクリプトと設定](https://github.com/ClickHouse/kafka-samples/tree/main/producer)を使用して Kafka にメッセージを挿入します。github.config を修正して Kafka の認証情報を含める必要があります。このスクリプトは現在、Confluent Cloud での使用向けに構成されています。 + +```bash +python producer.py -c github.config +``` + +このスクリプトは、任意の ndjson ファイルを Kafka トピックに挿入するために使用できます。スキーマを自動的に推測しようとします。提供されたサンプル設定は 10k のメッセージのみを挿入しますが、必要があれば[こちら](https://github.com/ClickHouse/clickhouse-docs/tree/main/docs/en/integrations/data-ingestion/kafka/code/producer/github.config#L25)で修正してください。この構成はまた、Kafka への挿入中にデータセットから互換性のない Array フィールドを削除します。 + +これは JDBC コネクタがメッセージを INSERT 文に変換するために必要です。自身のデータを使用する場合、スキーマを各メッセージに挿入(`value.converter.schemas.enable` を true に設定)するか、クライアントがメッセージをスキーマレジストリに参照しながら公開することを確認してください。 + +Kafka Connect はメッセージの消費を始め、ClickHouse に行を挿入していくはずです。「[JDBC Compliant Mode] トランザクションはサポートされていません。」の警告は予期されており、無視することができます。 + +ターゲットテーブル「Github」で簡単な読み取りを行うと、データ挿入が確認できます。 + +```sql +SELECT count() FROM default.github; +``` + +```response +| count\(\) | +| :--- | +| 10000 | +``` + +### 推奨されるさらなる読み物 + +* [Kafka Sink Configuration Parameters](https://docs.confluent.io/kafka-connect-jdbc/current/sink-connector/sink_config_options.html#sink-config-options) +* [Kafka Connect Deep Dive – JDBC Source Connector](https://www.confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector) +* [Kafka Connect JDBC Sink deep-dive: Working with Primary Keys](https://rmoff.net/2021/03/12/kafka-connect-jdbc-sink-deep-dive-working-with-primary-keys/) +* [Kafka Connect in Action: JDBC Sink](https://www.youtube.com/watch?v=b-3qN_tlYR4&t=981s) - 読むより視聴を好む方に。 +* [Kafka Connect Deep Dive – Converters and Serialization Explained](https://www.confluent.io/blog/kafka-connect-deep-dive-converters-serialization-explained/#json-schemas) diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine-named-collections.md b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine-named-collections.md new file mode 100644 index 00000000000..2965a1c7494 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine-named-collections.md @@ -0,0 +1,214 @@ +--- +title: Named Collectionsを使用したClickHouseとKafkaの統合 +description: named collectionsを使用してClickHouseをKafkaに接続する方法 +keywords: [named collection, 方法, kafka] +--- + +# Named Collectionsを使用したClickHouseとKafkaの統合 + +## はじめに + +このガイドでは、named collectionsを使用してClickHouseをKafkaに接続する方法を探ります。named collectionsのための設定ファイルを使用することには、以下のような利点があります: +- 設定の集中管理と容易な管理。 +- SQLテーブル定義を変更せずに設定を変更可能。 +- 単一の設定ファイルを調査することで、設定のレビューとトラブルシューティングが容易。 + +このガイドは、Apache Kafka 3.4.1とClickHouse 24.5.1でテストされています。 + +## 前提条件 + +このドキュメントは以下を前提としています: +1. 動作中のKafkaクラスター。 +2. 設定済みで稼働中のClickHouseクラスター。 +3. SQLの基本的な知識と、ClickHouseおよびKafkaの設定に関する基本理解。 + +## 必要条件 + +named collectionを作成するユーザーが必要なアクセス権を持っていることを確認してください: + +```xml +1 +1 +1 +1 +``` + +アクセス制御を有効にする詳細については、[ユーザー管理ガイド](./../../../guides/sre/user-management/index.md)を参照してください。 + +## 設定 + +ClickHouseの`config.xml`ファイルに以下のセクションを追加してください: + +```xml + + + + + c1-kafka-1:9094,c1-kafka-2:9094,c1-kafka-3:9094 + cluster_1_clickhouse_topic + cluster_1_clickhouse_consumer + JSONEachRow + 0 + 1 + 1 + + + + SASL_SSL + false + PLAIN + kafka-client + kafkapassword1 + all + latest + + + + + + c2-kafka-1:29094,c2-kafka-2:29094,c2-kafka-3:29094 + cluster_2_clickhouse_topic + cluster_2_clickhouse_consumer + JSONEachRow + 0 + 1 + 1 + + + + SASL_SSL + false + PLAIN + kafka-client + kafkapassword2 + all + latest + + + +``` + +### 設定メモ + +1. Kafkaアドレスや関連設定をお使いのKafkaクラスター設定に合わせて調整してください。 +2. ``の前のセクションには、ClickHouse Kafkaエンジンのパラメータが含まれます。すべてのパラメータについては、[Kafkaエンジンパラメータ](https://clickhouse.com/docs/ja/engines/table-engines/integrations/kafka)を参照してください。 +3. ``内のセクションには、Kafka拡張設定オプションが含まれます。より多くのオプションについては、[librdkafka設定](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md)を参照してください。 +4. この例では、`SASL_SSL`セキュリティプロトコルと`PLAIN`メカニズムを使用しています。これらの設定をあなたのKafkaクラスター設定に基づいて調整してください。 + +## テーブルとデータベースの作成 + +ClickHouseクラスター上に必要なデータベースとテーブルを作成します。ClickHouseを単一ノードとして実行している場合は、SQLコマンドのクラスタ部分を省略し、`ReplicatedMergeTree`の代わりに他のエンジンを使用してください。 + +### データベースの作成 + +```sql +CREATE DATABASE kafka_testing ON CLUSTER LAB_CLICKHOUSE_CLUSTER; +``` + +### Kafkaテーブルの作成 + +最初のKafkaクラスター用の最初のKafkaテーブルを作成: + +```sql +CREATE TABLE kafka_testing.first_kafka_table ON CLUSTER LAB_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) +ENGINE = Kafka(cluster_1); +``` + +2つ目のKafkaクラスター用の2つ目のKafkaテーブルを作成: + +```sql +CREATE TABLE kafka_testing.second_kafka_table ON CLUSTER STAGE_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) +ENGINE = Kafka(cluster_2); +``` + +### レプリケートテーブルの作成 + +最初のKafkaテーブル用のテーブルを作成: + +```sql +CREATE TABLE kafka_testing.first_replicated_table ON CLUSTER STAGE_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) ENGINE = ReplicatedMergeTree() +ORDER BY id; +``` + +2つ目のKafkaテーブル用のテーブルを作成: + +```sql +CREATE TABLE kafka_testing.second_replicated_table ON CLUSTER STAGE_CLICKHOUSE_CLUSTER +( + `id` UInt32, + `first_name` String, + `last_name` String +) ENGINE = ReplicatedMergeTree() +ORDER BY id; +``` + +### Materialized Viewの作成 + +最初のKafkaテーブルから最初のレプリケートテーブルにデータを挿入するためのmaterialized viewを作成: + +```sql +CREATE MATERIALIZED VIEW kafka_testing.cluster_1_mv ON CLUSTER STAGE_CLICKHOUSE_CLUSTER TO first_replicated_table AS +SELECT + id, + first_name, + last_name +FROM first_kafka_table; +``` + +2つ目のKafkaテーブルから2つ目のレプリケートテーブルにデータを挿入するためのmaterialized viewを作成: + +```sql +CREATE MATERIALIZED VIEW kafka_testing.cluster_2_mv ON CLUSTER STAGE_CLICKHOUSE_CLUSTER TO second_replicated_table AS +SELECT + id, + first_name, + last_name +FROM second_kafka_table; +``` + +## 設定の検証 + +Kafkaクラスター上で以下の消費者グループが見えるはずです: +- `cluster_1_clickhouse_consumer` on `cluster_1` +- `cluster_2_clickhouse_consumer` on `cluster_2` + +ClickHouseノードのいずれかで以下のクエリを実行して、両方のテーブルのデータを確認してください: + +```sql +SELECT * FROM first_replicated_table LIMIT 10; +``` + +```sql +SELECT * FROM second_replicated_table LIMIT 10; +``` + +### メモ + +このガイドでは、両方のKafkaトピックに取り込まれるデータは同じですが、実際には異なるでしょう。必要に応じて多くのKafkaクラスターを追加することが可能です。 + +例の出力: + +```sql +┌─id─┬─first_name─┬─last_name─┐ +│ 0 │ FirstName0 │ LastName0 │ +│ 1 │ FirstName1 │ LastName1 │ +│ 2 │ FirstName2 │ LastName2 │ +└────┴────────────┴───────────┘ +``` + +これで、Named Collectionsを使用したClickHouseとKafkaの統合のセットアップは完了です。ClickHouseの`config.xml`ファイルにKafka設定を集中させることで、設定の管理と調整がより簡単になり、効率的な統合が可能になります。 diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine.md b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine.md new file mode 100644 index 00000000000..36e2e3f7415 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-table-engine.md @@ -0,0 +1,486 @@ +--- +sidebar_label: Kafka テーブルエンジン +sidebar_position: 5 +slug: /ja/integrations/kafka/kafka-table-engine +description: Kafka テーブルエンジンの使用 +--- + +# Kafka テーブルエンジンの使用 + +:::note +Kafka テーブルエンジンは[ClickHouse Cloud](https://clickhouse.com/cloud)ではサポートされていません。[ClickPipes](../clickpipes/kafka.md)または[Kafka Connect](./kafka-clickhouse-connect-sink.md)を検討してください。 +::: + +### Kafka を ClickHouse へ + +Kafka テーブルエンジンを使用するには、[ClickHouse の Materialized View](../../../guides/developer/cascading-materialized-views.md)について基本的な知識が必要です。 + +#### 概要 + +初めに注目するのは最も一般的なユースケースです。Kafka テーブルエンジンを使用して Kafka から ClickHouse にデータを挿入します。 + +Kafka テーブルエンジンは、ClickHouse が Kafka トピックから直接データを読み込むことを可能にします。トピック上のメッセージを表示するのに便利ですが、設計上、クエリがテーブルに発行されたときにキューからデータを消費し、コンシューマオフセットを増やしてから結果を呼び出し元に返します。したがって、これらのオフセットをリセットしない限り、データを再読することはできません。 + +このテーブルエンジンから読み込んだデータを保存するためには、データをキャプチャして別のテーブルに挿入する方法が必要です。トリガーに基づく Materialized View がネイティブにその機能を提供します。Materialized View はテーブルエンジンの読み取りを開始し、ドキュメントのバッチを受信します。TO 句がデータの宛先を決定する - 通常は [MergeTree ファミリー](../../../engines/table-engines/mergetree-family/index.md)のテーブルです。このプロセスは以下の図で視覚化されています。 + +Kafka テーブルエンジン + +#### ステップ + +##### 1. 準備 + +対象トピックにデータがある場合、以下の要素をデータセットに適用できます。あるいは、サンプルの Github データセットが[こちら](https://datasets-documentation.s3.eu-west-3.amazonaws.com/kafka/github_all_columns.ndjson)で提供されています。このデータセットは以下の例で使用されており、完全なデータセット([こちら](https://ghe.clickhouse.tech/))に比べてスキーマが縮小され、行のサブセット(具体的には[ClickHouse リポジトリ](https://github.com/ClickHouse/ClickHouse)に関連する Github イベントに限定)を使用していますが、それでもデータセットと共に公開されているほとんどのクエリを実行するには十分です。 + +##### 2. ClickHouse を設定 + +安全な Kafka に接続している場合はこのステップが必要です。これらの設定は SQL DDL コマンドを通じて渡すことができず、ClickHouse の config.xml に設定する必要があります。SASL で保護されたインスタンスに接続していると仮定します。これは Confluent Cloud と対話する際の最も簡単な方法です。 + +```xml + + + username + password + sasl_ssl + PLAIN + + +``` + +上記のスニペットを新しいファイルとして conf.d/ ディレクトリに置くか、既存の設定ファイルにマージします。設定できる設定については[こちら](../../../engines/table-engines/integrations/kafka.md#configuration)を参照してください。 + +このチュートリアルでは `KafkaEngine` というデータベースを作成します。 + +```sql +CREATE DATABASE KafkaEngine; +``` + +データベースを作成したら、そこに切り替える必要があります。 + +```sql +USE KafkaEngine; +``` + +##### 3. 目的のテーブルを作成する + +目的のテーブルを準備します。以下の例では簡潔にするために縮小された GitHub スキーマを使用します。MergeTree テーブルエンジンを使用していますが、この例は [MergeTree ファミリー](../../../engines/table-engines/mergetree-family/index.md)のいずれのメンバーにも簡単に適応できます。 + +```sql +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at) +``` + +##### 4. トピックを作成してデータを挿入する + +次に、トピックを作成します。これを行うためのいくつかのツールがあります。Kafka をローカルマシンまたは Docker コンテナ内で実行している場合、[RPK](https://docs.redpanda.com/current/get-started/rpk-install/) がよく機能します。以下のコマンドを実行して 5パーティションの `github` というトピックを作成できます。 + +```bash +rpk topic create -p 5 github --brokers : +``` + +Confluent Cloud 上で Kafka を実行している場合は、[Confluent CLI](https://docs.confluent.io/platform/current/tutorials/examples/clients/docs/kcat.html#produce-records)を使用することをお勧めします。 + +```bash +confluent kafka topic create --if-not-exists github +``` + +次に、このトピックにデータを投入する必要があります。これは [kcat](https://github.com/edenhill/kcat) を使用して行います。認証が無効な状態で Kafka をローカルで実行している場合は、次のようなコマンドを実行できます。 + +```bash +cat github_all_columns.ndjson | +kcat -P \ + -b : \ + -t github +``` + +または、SASL を使用して認証する Kafka クラスターの場合: + +```bash +cat github_all_columns.ndjson | +kcat -P \ + -b : \ + -t github + -X security.protocol=sasl_ssl \ + -X sasl.mechanisms=PLAIN \ + -X sasl.username= \ + -X sasl.password= \ +``` + +データセットには 200,000 行が含まれているため、数秒で取り込まれるはずです。より大きなデータセットを扱いたい場合は、[the large datasets section](https://github.com/ClickHouse/kafka-samples/tree/main/producer#large-datasets) of the [ClickHouse/kafka-samples](https://github.com/ClickHouse/kafka-samples) GitHub リポジトリをご覧ください。 + +##### 5. Kafka テーブルエンジンの作成 + +以下の例は、マージツリーテーブルと同じスキーマを持つテーブルエンジンを作成します。これは厳密には必要ありません。ターゲットテーブルにエイリアスやエフェメラルカラムを持つことができます。ただし、設定は重要です。Kafka トピックから JSON を消費するためのデータタイプとして `JSONEachRow` を使用している点に注意してください。`github` および `clickhouse` はそれぞれトピック名とコンシューマグループ名を表しています。トピックは実際には値のリストにすることができます。 + +```sql +CREATE TABLE github_queue +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) + ENGINE = Kafka('kafka_host:9092', 'github', 'clickhouse', + 'JSONEachRow') settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1; +``` + +エンジンの設定とパフォーマンスチューニングについては後述します。この時点で、テーブル `github_queue` に対する単純な select を行うといくつかの行が読み取れるはずです。その際には、コンシューマオフセットが進むため、これらの行を再読するには[リセット](#common-operations)が必要です。制限と必要なパラメーター `stream_like_engine_allow_direct_select` に注意してください。 + +##### 6. Materialized View の作成 + +Materialized View は、以前に作成した2つのテーブルを接続し、カフカテーブルエンジンからデータを読み取り、ターゲットのマージツリーテーブルにデータを挿入します。多くのデータ変換を行えます。ここでは簡単な読み取りと挿入を行います。* を使用すると、カラム名が同一(大文字小文字を区別)であることが前提となります。 + +```sql +CREATE MATERIALIZED VIEW github_mv TO github AS +SELECT * +FROM github_queue; +``` + +作成時点で、Materialized View は Kafka エンジンに接続し、読み取りを開始し、行をターゲットテーブルに挿入します。このプロセスは無期限に続き、Kafka へのメッセージの追加が消費され続けます。Kafka にさらにメッセージを追加するために挿入スクリプトを再度実行してみてください。 + +##### 7. 挿入された行を確認する + +ターゲットテーブルにデータが存在することを確認します。 + +```sql +SELECT count() FROM github; +``` + +200,000 行が表示されるはずです: +```response +┌─count()─┐ +│ 200000 │ +└─────────┘ +``` + +#### 一般的な操作 + +##### メッセージ消費の停止と再開 + +メッセージ消費を停止するには、Kafka エンジンテーブルをデタッチします。 + +```sql +DETACH TABLE github_queue; +``` + +これはコンシューマグループのオフセットに影響を与えません。消費を再開し、前回のオフセットから続行するにはテーブルを再アタッチします。 + +```sql +ATTACH TABLE github_queue; +``` + +##### Kafka メタデータの追加 + +元の Kafka メッセージから、ClickHouse に取り込まれた後のメタデータを追跡することは有用です。たとえば、特定のトピックやパーティションからどれだけ消費したかを知りたい場合です。この目的のために、Kafka テーブルエンジンにはいくつかの[仮想カラム](../../../engines/table-engines/index.md#table_engines-virtual_columns)が公開されています。これらをターゲットテーブルのカラムとして保持するには、スキーマと Materialized View の select 文を変更します。 + +まず、ターゲットテーブルにカラムを追加する前に、上で説明した停止操作を実行します。 + +```sql +DETACH TABLE github_queue; +``` + +以下は、行がどのトピックおよびパーティションから来たのかを識別する情報カラムを追加します。 + +```sql +ALTER TABLE github + ADD COLUMN topic String, + ADD COLUMN partition UInt64; +``` + +次に、必要なように仮想カラムをマップする必要があります。 +仮想カラムは `_` で始まります。 +仮想カラムの完全なリストは[こちら](../../../engines/table-engines/integrations/kafka.md#virtual-columns)にあります。 + +仮想カラムでテーブルを更新するには、Materialized View を削除し、Kafka エンジンテーブルを再アタッチし、Materialized View を再作成する必要があります。 + +```sql +DROP VIEW github_mv; +``` + +```sql +ATTACH TABLE github_queue; +``` + +```sql +CREATE MATERIALIZED VIEW github_mv TO github AS +SELECT *, _topic as topic, _partition as partition +FROM github_queue; +``` + +新たに消費された行にはメタデータが含まれます。 + +```sql +SELECT actor_login, event_type, created_at, topic, partition +FROM github +LIMIT 10; +``` + +結果は次のようになります。 + +| actor_login | event_type | created_at | topic | partition | +| :--- | :--- | :--- | :--- | :--- | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:22:00 | github | 0 | +| queeup | CommitCommentEvent | 2011-02-12 02:23:23 | github | 0 | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:23:24 | github | 0 | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:24:50 | github | 0 | +| IgorMinar | CommitCommentEvent | 2011-02-12 02:25:20 | github | 0 | +| dapi | CommitCommentEvent | 2011-02-12 06:18:36 | github | 0 | +| sourcerebels | CommitCommentEvent | 2011-02-12 06:34:10 | github | 0 | +| jamierumbelow | CommitCommentEvent | 2011-02-12 12:21:40 | github | 0 | +| jpn | CommitCommentEvent | 2011-02-12 12:24:31 | github | 0 | +| Oxonium | CommitCommentEvent | 2011-02-12 12:31:28 | github | 0 | + +##### Kafka エンジンの設定を変更する + +Kafka エンジンテーブルをドロップして新しい設定で再作成することをお勧めします。このプロセス中に Materialized View を変更する必要はありません - Kafka エンジンテーブルが再作成されるとメッセージ消費は再開されます。 + +##### 問題のデバッグ + +認証の問題などのエラーは、Kafka エンジン DDL に対する応答に報告されません。問題の診断には、主要な ClickHouse ログファイル clickhouse-server.err.log を使用することをお勧めします。基盤となる Kafka クライアントライブラリ [librdkafka](https://github.com/edenhill/librdkafka) のさらなるトレースログは設定を通じて有効にできます。 + +```xml + + all + +``` + +##### 破損したメッセージの処理 + +Kafka はしばしばデータの「一時保管所」として使用されます。これにより、トピックに混在したメッセージ形式や不一致のフィールド名が含まれることがあります。この状況を避け、Kafka Streams や ksqlDB などの Kafka 機能を活用し、メッセージが Kafka に挿入される前に、整形され、一貫性のあるものにします。これらのオプションが利用できない場合、ClickHouse には役立ついくつかの機能があります。 + +* メッセージフィールドを文字列として処理します。必要に応じて、Materialized View 文で関数を使用してクレンジングやキャスティングを行うことができます。これは本番環境でのソリューションを表すものではありませんが、1回限りのインジェストには役立つかもしれません。 +* JSONEachRow フォーマットを使用して、トピックから JSON を消費している場合は、設定 [`input_format_skip_unknown_fields`](../../../operations/settings/settings-formats.md#settings-input-format-skip-unknown-fields) を使用します。データを書き込む際に、デフォルトで ClickHouse はターゲットテーブルに存在しないカラムが入力データに含まれているときに例外を投げます。ただし、このオプションが有効にされている場合、これらの余分なカラムは無視されます。これもまた本番レベルのソリューションではなく、他の人を混乱させるかもしれません。 +* `kafka_skip_broken_messages` 設定を考慮してください。これは、ユーザーがブロックごとに破損したメッセージに対する許容度を指定する必要があり、kafka_max_block_size の文脈で考慮されます。この許容度を超えると(絶対メッセージ単位で測定)、通常の例外処理に戻り、他のメッセージがスキップされます。 + +##### 配信セマンティクスと重複に関する課題 + +Kafka テーブルエンジンは少なくとも一度のセマンティクスを持っています。稀な状況で重複が生じる可能性があります。たとえば、メッセージが Kafka から読み取られ、ClickHouse に正常に挿入された場合、新しいオフセットをコミットする前に Kafka への接続が失われることがあります。この状況ではブロックの再試行が必要です。このブロックは、分散テーブルや ReplicatedMergeTree をターゲットテーブルとして使用することで[データの重複排除](../../../engines/table-engines/mergetree-family/replication.md#table_engines-replication)することができます。これは重複行の可能性を減らしますが、同一ブロックに依存します。Kafka の再バランスなどのイベントによってこの仮定が無効になる可能性があり、稀に重複を引き起こす可能性があります。 + +##### クォーラムベースの挿入 + +ClickHouse でのより高い配信保証が必要な場合には[クォーラムベースの挿入](../../../operations/settings/settings.md#settings-insert_quorum)を行う必要があります。これは Materialized View やターゲットテーブルに設定することはできません。ただし、ユーザープロファイルに設定することができます。 + +```xml + + + 2 + + +``` + +### ClickHouse から Kafka へ + +あまり一般的でないユースケースですが、ClickHouse のデータも Kafka に保持できます。たとえば、行を手動で Kafka テーブルエンジンに挿入します。このデータは同じ Kafka エンジンによって読み取られ、その Materialized View はデータを MergeTree テーブルに配置します。最後に、既存のソーステーブルから Kafka に挿入する際の Materialized View の応用を示します。 + +#### ステップ + +私たちの初期の目的は以下の図で最もよく示されています: + +Kafka テーブルエンジンの挿入 + +[Kafka を ClickHouse へ](#kafka-to-clickhouse)のステップで作成されたテーブルとビューを持っていることを前提とし、トピックが完全に消費されていると仮定します。 + +##### 1. 直接行を挿入する + +まず、ターゲットテーブルの件数を確認します。 + +```sql +SELECT count() FROM github; +``` + +200,000 行があるはずです: +```response +┌─count()─┐ +│ 200000 │ +└─────────┘ +``` + +GitHub ターゲットテーブルから Kafka テーブルエンジン github_queue に行を挿入します。JSONEachRow フォーマットを活用し、SELECT を 100 に制限する点に注意してください。 + +```sql +INSERT INTO github_queue SELECT * FROM github LIMIT 100 FORMAT JSONEachRow +``` + +GitHub の行数を再確認して、100 増加したことを確認します。上記の図に示すように、行は Kafka へ Kafka テーブルエンジンを介して挿入され、その後 Materialized View によって GitHub ターゲットテーブルに再挿入されました! + +```sql +SELECT count() FROM github; +``` + +100 行追加されているはずです: +```response +┌─count()─┐ +│ 200100 │ +└─────────┘ +``` + +##### 2. Materialized View の使用 + +Materialized View を利用して、テーブルへのドキュメント挿入時に Kafka エンジン(およびトピック)にメッセージをプッシュできます。GitHub テーブルに行が挿入されると、Materialized View がトリガーされ、行が再び Kafka エンジンおよび新しいトピックに挿入されます。これもまた以下の図で最もよく示されています: + +Kafka テーブルエンジン挿入と Materialized View + +`github_out` または同等の新しい Kafka トピックを作成します。このトピックを指す Kafka テーブルエンジン `github_out_queue` を作成します。 + +```sql +CREATE TABLE github_out_queue +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) + ENGINE = Kafka('host:port', 'github_out', 'clickhouse_out', + 'JSONEachRow') settings kafka_thread_per_consumer = 0, kafka_num_consumers = 1; +``` + +次に、新しい Materialized View `github_out_mv` を作成して GitHub テーブルを指し、トリガーされると上記のエンジンに行を挿入するようにします。GitHub テーブルへの追加は、結果として新しい Kafka トピックにプッシュされます。 + +```sql +CREATE MATERIALIZED VIEW github_out_mv TO github_out_queue AS +SELECT file_time, event_type, actor_login, repo_name, + created_at, updated_at, action, comment_id, path, + ref, ref_type, creator_user_login, number, title, + labels, state, assignee, assignees, closed_at, merged_at, + merge_commit_sha, requested_reviewers, merged_by, + review_comments, member_login +FROM github +FORMAT JsonEachRow; +``` + +オリジナルの github トピックに挿入すると、ドキュメントが「github_clickhouse」トピックに魔法のように現れます。ネイティブ Kafka ツールを使用してこれを確認してください。たとえば、Confluent Cloud ホストのトピックに対して [kcat](https://github.com/edenhill/kcat) を使用して github トピックに 100 行をインサートします。 + +```sql +head -n 10 github_all_columns.ndjson | +kcat -P \ + -b : \ + -t github + -X security.protocol=sasl_ssl \ + -X sasl.mechanisms=PLAIN \ + -X sasl.username= \ + -X sasl.password= +``` + +`github_out` トピックの読み取りでメッセージの配信が確認されます。 + +```sql +kcat -C \ + -b : \ + -t github_out \ + -X security.protocol=sasl_ssl \ + -X sasl.mechanisms=PLAIN \ + -X sasl.username= \ + -X sasl.password= \ + -e -q | +wc -l +``` + +これは複雑な例ですが、Kafka エンジンと組み合わせて使用する場合の Materialized View の力を示しています。 + +### クラスターとパフォーマンス + +#### ClickHouse クラスターを使用する + +Kafka コンシューマグループを通じて、複数の ClickHouse インスタンスが同じトピックを読むことができます。各コンシューマは 1:1 マッピングでトピックパーティションに割り当てられます。Kafka テーブルエンジンを使用して ClickHouse 消費をスケーリングする際には、クラスタ内のコンシューマの総数がトピックのパーティション数を超えることができないことを考慮してください。したがって、事前にトピックのパーティションを適切に構成してください。 + +複数の ClickHouse インスタンスが、Kafka テーブルエンジンの作成中に指定された同じコンシューマグループ ID を使用してトピックを読み込むように構成できます。したがって、各インスタンスは一つまたは複数のパーティションから読み取り、セグメントをローカルのターゲットテーブルに挿入します。ターゲットテーブルは、データの重複を処理するために ReplicatedMergeTree を使用して構成することができます。このアプローチにより、十分な Kafka パーティションがある場合は、ClickHouse クラスターに合わせて Kafka リードをスケールアウトすることができます。 + +レプリケートされた Kafka テーブルエンジン + +#### パフォーマンスのチューニング + +Kafka エンジン テーブルのスループットパフォーマンスを向上させる際には次の点を考慮してください。 + +* パフォーマンスはメッセージサイズ、フォーマット、およびターゲットテーブルのタイプによって異なります。単一テーブルエンジン上でのスループットは、100k 行/秒を目標にするべきです。既定では、メッセージはブロックで読み取られ、kafka_max_block_size パラメータによって制御されます。これはデフォルトでは [max_insert_block_size](../../../operations/settings/settings.md#setting-max_insert_block_size) に設定されており、デフォルトは 1,048,576 です。メッセージが非常に大きくない限り、これを増加させるべきです。500k から 1M の範囲は一般的です。スループットパフォーマンスへの影響をテストし評価してください。 +* テーブルエンジンのコンシューマ数は kafka_num_consumers を使用して増やすことができます。ただし、デフォルトでは kafka_thread_per_consumer を 1 に変更しない限り、挿入はシングルスレッドで行われます。これを 1 に設定すると、フラッシュが並行して実行されるようになります。なお、1 消費者あたり 1 スレッドの Kafka エンジン テーブルを作成することは、複数の Kafka エンジンを個別のマテリアライズドビューとともに作成することと論理的に同等です。 +* コンシューマの増加は無料の操作ではありません。各コンシューマは独自のバッファとスレッドを保持し、サーバーへのオーバーヘッドを増やします。オーバーヘッドを意識し、まずクラスタ全体で線形にスケールしてください。可能であれば線形にスケールアウトします。 +* Kafka メッセージのスループットが変動し、遅延が許容される場合は、stream_flush_interval_ms を増やして、より大きなブロックがフラッシュされるようにします。 +* [background_message_broker_schedule_pool_size](../../../operations/settings/settings.md#background_message_broker_schedule_pool_size)は、バックグラウンドタスクを実行するスレッドの数です。これらのスレッドは Kafka ストリーミングに使用されます。この設定は ClickHouse サーバーの起動時に適用され、ユーザーセッションでは変更できず、デフォルトは 16 です。ログにタイムアウトが見られる場合、この設定を増やすべきかもしれません。 +* Kafka との通信には、ライブラリ librdkafka が使用されており、それ自体がスレッドを生成します。大量の Kafka テーブルやコンシューマの結果、大量のコンテキスト切り替えが発生する可能性があります。この負荷をクラスタ全体に分散し、可能であればターゲットテーブルのみを複製するか、複数のトピックを読み取るためのテーブルエンジンを使用することを検討してください - 値のリストがサポートされています。異なるトピックからのデータをフィルタリングする形で単一テーブルから複数のマテリアライズドビューを読み取ることができます。 + +設定の変更はテストされるべきです。Kafka コンシューマの遅延を監視して、適切なスケールアウトが行われていることを確認してください。 + +#### 追加の設定 + +上記の設定に加えて、以下も興味深いかもしれません: + +* [Kafka_max_wait_ms](../../../operations/settings/settings.md#kafka-max-wait-ms) - Kafka からメッセージを読み取る際の再試行までの待機時間をミリ秒単位で設定します。ユーザープロファイルレベルで設定され、デフォルトは 5000 です。 + +[librdkafka のすべての設定 ](https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md)は、ClickHouse 構成ファイルの _kafka_ 要素内に配置することができます - 設定名は XML 要素として、ピリオドをアンダースコアに置き換えて指定してください。 + +```xml + + + false + + +``` + +これらは専門的な設定であり、Kafka のドキュメントを参照して詳細な説明を確認することをお勧めします。 diff --git a/docs/ja/integrations/data-ingestion/kafka/kafka-vector.md b/docs/ja/integrations/data-ingestion/kafka/kafka-vector.md new file mode 100644 index 00000000000..eb64ada3c65 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/kafka-vector.md @@ -0,0 +1,129 @@ +--- +sidebar_label: KafkaとのVector +sidebar_position: 3 +slug: /ja/integrations/kafka/kafka-vector +description: KafkaとClickHouseでVectorを使用する +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +## KafkaとClickHouseでVectorを使用する + +Vectorは、Kafkaからデータを読み取り、ClickHouseにイベントを送信できる、ベンダーに依存しないデータパイプラインです。 + +ClickHouseとのVectorの[入門ガイド](../etl-tools/vector-to-clickhouse.md)は、ログのユースケースとファイルからイベントを読み取ることに焦点を当てています。私たちは、Kafkaトピックに保持されている[Githubサンプルデータセット](https://datasets-documentation.s3.eu-west-3.amazonaws.com/kafka/github_all_columns.ndjson)を利用します。 + +Vectorは、[sources](https://vector.dev/docs/about/concepts/#sources)を使用して、プッシュまたはプルモデルでデータを取得します。[sinks](https://vector.dev/docs/about/concepts/#sinks)は、イベントの宛先を提供します。そのため、KafkaのソースとClickHouseのシンクを使用します。注意点として、Kafkaはシンクとしてサポートされていますが、ClickHouseのソースは存在しません。したがって、ClickHouseからKafkaにデータを転送したいユーザーにはVectorは適切ではありません。 + +Vectorはまた、データの[変換](https://vector.dev/docs/reference/configuration/transforms/)もサポートしています。これはこのガイドの範囲外です。データセットにおいて変換が必要な場合は、Vectorのドキュメントを参照してください。 + +現在のClickHouseシンクの実装は、HTTPインターフェースを利用しています。ClickHouseシンクは現時点でJSONスキーマの利用をサポートしていません。データはプレーンなJSON形式または文字列としてKafkaに公開される必要があります。 + +### ライセンス +Vectorは、[MPL-2.0ライセンス](https://github.com/vectordotdev/vector/blob/master/LICENSE)の下で配布されています。 + +### 接続情報を収集する + + +### 手順 + +1. Kafkaの`github`トピックを作成し、[Githubデータセット](https://datasets-documentation.s3.eu-west-3.amazonaws.com/kafka/github_all_columns.ndjson)を挿入します。 + +```bash +cat /opt/data/github/github_all_columns.ndjson | kcat -b : -X security.protocol=sasl_ssl -X sasl.mechanisms=PLAIN -X sasl.username= -X sasl.password= -t github +``` + +このデータセットは`ClickHouse/ClickHouse`リポジトリに焦点を当てた200,000行で構成されています。 + +2. ターゲットテーブルが作成されていることを確認してください。以下ではデフォルトのデータベースを使用します。 + +```sql + +CREATE TABLE github +( + file_time DateTime, + event_type Enum('CommitCommentEvent' = 1, 'CreateEvent' = 2, 'DeleteEvent' = 3, 'ForkEvent' = 4, + 'GollumEvent' = 5, 'IssueCommentEvent' = 6, 'IssuesEvent' = 7, 'MemberEvent' = 8, 'PublicEvent' = 9, 'PullRequestEvent' = 10, 'PullRequestReviewCommentEvent' = 11, 'PushEvent' = 12, 'ReleaseEvent' = 13, 'SponsorshipEvent' = 14, 'WatchEvent' = 15, 'GistEvent' = 16, 'FollowEvent' = 17, 'DownloadEvent' = 18, 'PullRequestReviewEvent' = 19, 'ForkApplyEvent' = 20, 'Event' = 21, 'TeamAddEvent' = 22), + actor_login LowCardinality(String), + repo_name LowCardinality(String), + created_at DateTime, + updated_at DateTime, + action Enum('none' = 0, 'created' = 1, 'added' = 2, 'edited' = 3, 'deleted' = 4, 'opened' = 5, 'closed' = 6, 'reopened' = 7, 'assigned' = 8, 'unassigned' = 9, 'labeled' = 10, 'unlabeled' = 11, 'review_requested' = 12, 'review_request_removed' = 13, 'synchronize' = 14, 'started' = 15, 'published' = 16, 'update' = 17, 'create' = 18, 'fork' = 19, 'merged' = 20), + comment_id UInt64, + path String, + ref LowCardinality(String), + ref_type Enum('none' = 0, 'branch' = 1, 'tag' = 2, 'repository' = 3, 'unknown' = 4), + creator_user_login LowCardinality(String), + number UInt32, + title String, + labels Array(LowCardinality(String)), + state Enum('none' = 0, 'open' = 1, 'closed' = 2), + assignee LowCardinality(String), + assignees Array(LowCardinality(String)), + closed_at DateTime, + merged_at DateTime, + merge_commit_sha String, + requested_reviewers Array(LowCardinality(String)), + merged_by LowCardinality(String), + review_comments UInt32, + member_login LowCardinality(String) +) ENGINE = MergeTree ORDER BY (event_type, repo_name, created_at); + +``` + +3. [Vectorをダウンロードしてインストール](https://vector.dev/docs/setup/quickstart/)します。`kafka.toml`という設定ファイルを作成し、KafkaとClickHouseのインスタンスに合わせて値を変更します。 + +```toml +[sources.github] +type = "kafka" +auto_offset_reset = "smallest" +bootstrap_servers = ":" +group_id = "vector" +topics = [ "github" ] +tls.enabled = true +sasl.enabled = true +sasl.mechanism = "PLAIN" +sasl.username = "" +sasl.password = "" +decoding.codec = "json" + +[sinks.clickhouse] +type = "clickhouse" +inputs = ["github"] +endpoint = "http://localhost:8123" +database = "default" +table = "github" +skip_unknown_fields = true +auth.strategy = "basic" +auth.user = "username" +auth.password = "password" +buffer.max_events = 10000 +batch.timeout_secs = 1 +``` + +この設定とVectorの動作に関する重要な注意点: + +- この例はConfluent Cloudに対してテストされています。そのため、`sasl.*`および`ssl.enabled`のセキュリティオプションはセルフマネージドの場合には適切でない可能性があります。 +- 設定パラメータ`bootstrap_servers`にはプロトコル接頭辞は必要ありません。例えば `pkc-2396y.us-east-1.aws.confluent.cloud:9092` +- ソースパラメータの`decoding.codec = "json"`は、メッセージが単一のJSONオブジェクトとしてClickHouseシンクに渡されることを保証します。文字列としてメッセージを扱い、デフォルトの`bytes`値を使用する場合、メッセージの内容は`message`フィールドに追加されます。ほとんどの場合、これは[Vector入門](../etl-tools/vector-to-clickhouse.md#4-parse-the-logs)ガイドで説明されているようにClickHouseで処理が必要です。 +- Vectorはメッセージに[多くのフィールドを追加](https://vector.dev/docs/reference/configuration/sources/kafka/#output-data)します。この例では、ClickHouseシンクの設定パラメータ`skip_unknown_fields = true`を介してこれらのフィールドを無視しています。これは、ターゲットテーブルスキーマの一部でないフィールドを無視します。例えば`offset`などのメタフィールドが追加されるようにスキーマを調整しても問題ありません。 +- シンクがソースイベントへの参照として`inputs`パラメータをどのように使用するかに注意してください。 +- ClickHouseシンクの動作については[こちら](https://vector.dev/docs/reference/configuration/sinks/clickhouse/#buffers-and-batches)に記載されています。最適なスループットを得るために、ユーザーは`buffer.max_events`、`batch.timeout_secs`および`batch.max_bytes`パラメータのチューニングを行うことができます。 ClickHouseの[推奨事項](../../../concepts/why-clickhouse-is-so-fast.md#performance-when-inserting-data)に従い、1000のイベント数は1バッチあたりの最低値と考えられるべきです。高スループットのユースケースでは、`buffer.max_events` パラメータを増やすことができます。スループットに変動がある場合は、`batch.timeout_secs` パラメータを変更する必要があるかもしれません。 +- `auto_offset_reset = "smallest"`パラメータは、Kafkaソースがトピックの先頭から開始することを強制します。これにより、ステップ(1)で公開されたメッセージを消費することが保証されます。異なる動作を必要とする場合は[こちら](https://vector.dev/docs/reference/configuration/sources/kafka/#auto_offset_reset)をご覧ください。 + +1. Vectorを開始します。 + +```bash +vector --config ./kafka.toml +``` + +デフォルトでは、ClickHouseへの挿入が開始される前に[ヘルスチェック](https://vector.dev/docs/reference/configuration/sinks/clickhouse/#healthcheck)が必要です。これは接続可能性を確保し、スキーマを確認するためです。問題が発生した場合にさらに詳細なログを取得するには、`VECTOR_LOG=debug`を付けることが役立つ場合があります。 + +5. データの挿入を確認します。 + +```sql +SELECT count() as count FROM github; +``` + +| count | +| :--- | +| 200000 | diff --git a/docs/ja/integrations/data-ingestion/kafka/msk/index.md b/docs/ja/integrations/data-ingestion/kafka/msk/index.md new file mode 100644 index 00000000000..0cfc32faeec --- /dev/null +++ b/docs/ja/integrations/data-ingestion/kafka/msk/index.md @@ -0,0 +1,88 @@ +--- +sidebar_label: Amazon MSK と Kafka Connector Sink +sidebar_position: 1 +slug: /ja/integrations/kafka/cloud/amazon-msk/ +description: ClickHouse 公式 Kafka コネクタと Amazon MSK の連携 +keywords: [integration, kafka, amazon msk, sink, connector] +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Amazon MSK と ClickHouse の統合 + +
+ +
+ +## 前提条件 +以下を前提としています: +* あなたが [ClickHouse コネクタ Sink](../kafka-clickhouse-connect-sink.md)、Amazon MSK、MSK コネクタに精通していること。Amazon MSK [開始ガイド](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)と[MSK コネクトガイド](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect.html)を推奨します。 +* MSK ブローカーが公開アクセス可能であること。開発者ガイドの[公開アクセス](https://docs.aws.amazon.com/msk/latest/developerguide/public-access.html)セクションを参照してください。 + +## ClickHouse の公式 Kafka コネクタと Amazon MSK + +### 接続の詳細を集める + + + +### ステップ +1. [ClickHouse コネクタ Sink](../kafka-clickhouse-connect-sink.md)を理解していることを確認してください。 +1. [MSK インスタンスを作成する](https://docs.aws.amazon.com/msk/latest/developerguide/create-cluster.html)。 +1. [IAM ロールを作成して割り当てる](https://docs.aws.amazon.com/msk/latest/developerguide/create-client-iam-role.html)。 +1. ClickHouse Connect Sink の[リリースページ](https://github.com/ClickHouse/clickhouse-kafka-connect/releases)から `jar` ファイルをダウンロードします。 +1. Amazon MSK コンソールの[カスタムプラグインページ](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-plugins.html)でダウンロードした `jar` ファイルをインストールします。 +1. コネクタが公開 ClickHouse インスタンスと通信する場合は、[インターネットアクセスを有効にします](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-internet-access.html)。 +1. 設定でトピック名、ClickHouse インスタンスホスト名、およびパスワードを指定します。 +```yml +connector.class=com.clickhouse.kafka.connect.ClickHouseSinkConnector +tasks.max=1 +topics= +ssl=true +security.protocol=SSL +hostname= +database= +password= +ssl.truststore.location=/tmp/kafka.client.truststore.jks +port=8443 +value.converter.schemas.enable=false +value.converter=org.apache.kafka.connect.json.JsonConverter +exactlyOnce=true +username=default +schemas.enable=false +``` + +## パフォーマンスチューニング +パフォーマンスを向上させるワンステップとして、**worker** 設定に以下を追加して、Kafka から取得するバッチサイズとレコード数を調整することができます: +```yml +consumer.max.poll.records=[NUMBER OF RECORDS] +consumer.max.partition.fetch.bytes=[NUMBER OF RECORDS * RECORD SIZE IN BYTES] +``` + +使用する具体的な値は、希望のレコード数やレコードサイズに基づいて異なります。例えば、デフォルト値は以下の通りです: + +```yml +consumer.max.poll.records=500 +consumer.max.partition.fetch.bytes=1048576 +``` + +詳細情報(実装やその他の考慮事項について)は、公式の [Kafka](https://kafka.apache.org/documentation/#consumerconfigs) および +[Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-workers.html#msk-connect-create-custom-worker-config) ドキュメントで確認できます。 + +## MSK Connect のネットワーキングに関する注意事項 + +MSK Connect が ClickHouse に接続するために、MSK クラスターをプライベートサブネットに配置し、プライベート NAT を使用してインターネットアクセスを確保することを推奨します。これを設定する方法は以下に記載されています。パブリックサブネットもサポートされていますが、Elastic IP アドレスを ENI に常に割り当てる必要があるため、推奨されません。詳しくは [AWS の詳細](https://docs.aws.amazon.com/msk/latest/developerguide/msk-connect-internet-access.html)をご覧ください。 + +1. **プライベートサブネットの作成:** VPC 内に新しいサブネットを作成し、プライベートサブネットとして指定します。このサブネットにはインターネットへの直接アクセスがありません。 +1. **NAT ゲートウェイの作成:** VPC のパブリックサブネットに NAT ゲートウェイを作成します。NAT ゲートウェイは、プライベートサブネットのインスタンスがインターネットや他の AWS サービスと接続できるようにしますが、インターネットからこれらのインスタンスへの接続を防ぎます。 +1. **ルートテーブルの更新:** インターネットに向かうトラフィックを NAT ゲートウェイに送るルートを追加します。 +1. **セキュリティグループとネットワーク ACL の設定:** [セキュリティグループ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html)と[ネットワーク ACL(アクセス制御リスト)](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)を構成し、ClickHouse インスタンスへの関連するトラフィックを許可します。 + 1. ClickHouse Cloud の場合、セキュリティグループを構成してポート 9440 および 8443 でのインバウンドトラフィックを許可します。 + 2. セルフマネージドの ClickHouse の場合、セキュリティグループが設定ファイルのポート(デフォルトは 8123)でのインバウンドトラフィックを許可するように構成します。 +2. **MSK にセキュリティグループをアタッチ:** これらの新しいセキュリティグループを NAT ゲートウェイにルートされた状態で MSK クラスターにアタッチします。 diff --git a/docs/ja/integrations/data-ingestion/redshift/images/pivot.png b/docs/ja/integrations/data-ingestion/redshift/images/pivot.png new file mode 100644 index 00000000000..6169d9ebfc1 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/pivot.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/pull.png b/docs/ja/integrations/data-ingestion/redshift/images/pull.png new file mode 100644 index 00000000000..616eb570643 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/pull.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/push.png b/docs/ja/integrations/data-ingestion/redshift/images/push.png new file mode 100644 index 00000000000..c3f375f0e93 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/push.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/redshift-to-clickhouse.png b/docs/ja/integrations/data-ingestion/redshift/images/redshift-to-clickhouse.png new file mode 100644 index 00000000000..3e062438fb7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/redshift-to-clickhouse.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/s3-1.png b/docs/ja/integrations/data-ingestion/redshift/images/s3-1.png new file mode 100644 index 00000000000..067c368f51f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/s3-1.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/images/s3-2.png b/docs/ja/integrations/data-ingestion/redshift/images/s3-2.png new file mode 100644 index 00000000000..40c9a3b4b97 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/redshift/images/s3-2.png differ diff --git a/docs/ja/integrations/data-ingestion/redshift/index.md b/docs/ja/integrations/data-ingestion/redshift/index.md new file mode 100644 index 00000000000..fed1b92cbda --- /dev/null +++ b/docs/ja/integrations/data-ingestion/redshift/index.md @@ -0,0 +1,250 @@ +--- +sidebar_label: Redshift +slug: /ja/integrations/redshift +description: RedshiftからClickHouseへのデータ移行 +--- + +# RedshiftからClickHouseへのデータ移行 + +## 関連コンテンツ + +
+ +
+ +- ブログ: [分析ワークロードの最適化: Redshift vs ClickHouse 比較](https://clickhouse.com/blog/redshift-vs-clickhouse-comparison) + +## はじめに + +[Amazon Redshift](https://aws.amazon.com/redshift/) は、Amazon Web Services の提供の一部である人気のクラウドデータウェアハウジングソリューションです。このガイドでは、RedshiftインスタンスからClickHouseへのデータ移行のためのさまざまなアプローチを紹介します。以下の3つのオプションをカバーします。 + +RedshitからClickHouseへの移行オプション + +ClickHouse インスタンスの観点からは、次のいずれかの方法で移行できます: + +1. **[RedshiftからClickHouseへデータをPUSHする](#push-data-from-redshift-to-clickhouse)** サードパーティのETL/ELTツールやサービスを使用してClickHouseにデータを送信する + +2. **[RedshiftからClickHouseへデータをPULLする](#pull-data-from-redshift-to-clickhouse)** ClickHouse JDBC Bridgeを活用してRedshiftからデータを取得する + +3. **[S3を使用してRedshiftからClickHouseへデータをPIVOTする](#pivot-data-from-redshift-to-clickhouse-using-s3)** S3オブジェクトストレージを使用して「アンロードしてロードする」ロジックを適用する + +:::note +このチュートリアルではデータソースとしてRedshiftを使用しましたが、ここで紹介する移行アプローチはRedshiftに限定されず、その他の互換性のあるデータソースにも類似した手順を適用できます。 +::: + + +## RedshiftからClickHouseへデータをPUSHする + +プッシュのシナリオでは、サードパーティのツールやサービス(カスタムコードや[ETL/ELT](https://en.wikipedia.org/wiki/Extract,_transform,_load#ETL_vs._ELT)を使用するかのいずれか)を活用して、データをClickHouseインスタンスに送るという考え方です。例えば、[Airbyte](https://www.airbyte.com/)のようなソフトウェアを使用して、Redshiftインスタンス(ソースとして)からClickHouse(デスティネーションとして)にデータを移動することができます([Airbyteとの統合ガイド](/docs/ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)を参照)。 + +RedshitからClickHouseへのPUSH + +### 利点 + +* ETL/ELTソフトウェアの既存のコネクタカタログを活用できます。 +* データを同期させるための組み込み機能(追加/上書き/インクリメントロジック)があります。 +* データ変換シナリオを可能にします(例として、[dbtとの統合ガイド](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md)を参照)。 + +### 欠点 + +* ユーザーはETL/ELTインフラストラクチャのセットアップと保守が必要です。 +* アーキテクチャにサードパーティ要素を導入することで、潜在的なスケーラビリティのボトルネックとなる可能性があります。 + + +## RedshiftからClickHouseへデータをPULLする + +プルのシナリオでは、ClickHouse JDBC Bridgeを活用して、ClickHouseインスタンスから直接Redshiftクラスタに接続し、`INSERT INTO ... SELECT` クエリを実行します。 + +RedshitからClickHouseへのPULL + +### 利点 + +* JDBC互換のすべてのツールに対して汎用的です。 +* ClickHouseから複数の外部データソースをクエリできる優雅なソリューションです。 + +### 欠点 + +* ClickHouse JDBC Bridgeインスタンスが必要で、これが潜在的なスケーラビリティのボトルネックになる可能性があります。 + +:::note +RedshiftはPostgreSQLベースですが、ClickHouseのPostgreSQLテーブル関数やテーブルエンジンを使用することはできません。なぜならClickHouseはPostgreSQLバージョン9以上を必要とし、Redshift APIはそれ以前のバージョン(8.x)に基づいているからです。 +::: + +### チュートリアル + +このオプションを使用するには、ClickHouse JDBC Bridgeをセットアップする必要があります。ClickHouse JDBC Bridgeは、JDBC接続を処理し、ClickHouseインスタンスとデータソース間のプロキシとして機能するスタンドアロンのJavaアプリケーションです。このチュートリアルでは、[サンプルデータベース](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)を持つ事前にポピュレートされたRedshiftインスタンスを使用しました。 + +1. ClickHouse JDBC Bridgeをデプロイします。詳細については、[外部データソース用のJDBC](/docs/ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md)に関するユーザーガイドを参照してください。 + +:::note +ClickHouse Cloudを使用している場合は、ClickHouse JDBC Bridgeを別の環境で実行し、[remoteSecure](https://clickhouse.com/docs/ja/sql-reference/table-functions/remote/)関数を使用してClickHouse Cloudに接続する必要があります。 +::: + +2. ClickHouse JDBC Bridge用にRedshiftデータソースを設定します。例えば、 `/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json ` + + ```json + { + "redshift-server": { + "aliases": [ + "redshift" + ], + "driverUrls": [ + "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar" + ], + "driverClassName": "com.amazon.redshift.jdbc.Driver", + "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev", + "username": "awsuser", + "password": "", + "maximumPoolSize": 5 + } + } + ``` + +3. ClickHouse JDBC Bridgeがデプロイされ実行中になったら、ClickHouseからRedshiftインスタンスをクエリし始めることができます。 + + ```sql + SELECT * + FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5') + ``` + + ```response + Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0 + + ┌─username─┬─firstname─┬─lastname─┐ + │ PGL08LJI │ Vladimir │ Humphrey │ + │ XDZ38RDD │ Barry │ Roy │ + │ AEB55QTM │ Reagan │ Hodge │ + │ OWY35QYB │ Tamekah │ Juarez │ + │ MSD36KVR │ Mufutau │ Watkins │ + └──────────┴───────────┴──────────┘ + + 5 rows in set. Elapsed: 0.438 sec. + ``` + + ```sql + SELECT * + FROM jdbc('redshift', 'select count(*) from sales') + ``` + + ```response + Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b + + ┌──count─┐ + │ 172456 │ + └────────┘ + + 1 rows in set. Elapsed: 0.304 sec. + ``` + +4. 以下に、`INSERT INTO ... SELECT`文を使用してデータをインポートする例を示します。 + + ```sql + # 3カラムを持つテーブル作成 + CREATE TABLE users_imported + ( + `username` String, + `firstname` String, + `lastname` String + ) + ENGINE = MergeTree + ORDER BY firstname + ``` + + ```response + Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05 + + Ok. + + 0 rows in set. Elapsed: 0.233 sec. + ``` + + ```sql + # データのインポート + INSERT INTO users_imported (*) SELECT * + FROM jdbc('redshift', 'select username, firstname, lastname from users') + ``` + + ```response + Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1 + + Ok. + + 0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.) + ``` + +## S3を使用してRedshiftからClickHouseへデータをPIVOTする + +このシナリオでは、中間ピボットフォーマットでデータをS3にエクスポートし、次のステップでClickHouseにデータをロードします。 + +RedshitからS3を使用してPIVOT + +### 利点 + +* RedshiftとClickHouseの両方が強力なS3統合機能を持っています。 +* Redshiftの`UNLOAD`コマンドとClickHouse S3テーブル関数/テーブルエンジンのような既存の機能を活用します。 +* ClickHouseでの並列リードとS3との間の高いスループット能力のおかげでシームレスにスケールします。 +* Apache Parquetのような高度で圧縮されたフォーマットを活用できます。 + +### 欠点 + +* プロセスが2ステップになる(Redshiftからアンロードし、その後ClickHouseにロード)。 + +### チュートリアル + +1. Redshiftの[UNLOAD](https://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html)機能を使用して、既存のプライベートS3バケットにデータをエクスポートします。 + + RedshitからS3へのUNLOAD + + これにより、S3には生データを含むパートファイルが生成されます。 + + S3内のデータ + +2. ClickHouseでテーブルを作成します。 + + ```sql + CREATE TABLE users + ( + username String, + firstname String, + lastname String + ) + ENGINE = MergeTree + ORDER BY username + ``` + + あるいは、ClickHouseは`CREATE TABLE ... EMPTY AS SELECT`を使用してテーブル構造を推測しようとすることもできます。 + + ```sql + CREATE TABLE users + ENGINE = MergeTree ORDER BY username + EMPTY AS + SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') + ``` + + これは特に、Parquetのようにデータ型に関する情報を含むフォーマットでデータがある場合にうまく機能します。 + +3. `INSERT INTO ... SELECT`ステートメントを使用して、ClickHouseにS3ファイルをロードします。 + ```sql + INSERT INTO users SELECT * + FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '', '', 'CSV') + ``` + + ```response + Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557 + + Ok. + + 0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.) + ``` + +:::note +この例では、ピボットフォーマットとしてCSVを使用しました。しかし、本番環境のワークロードの場合、大規模な移行に適した選択肢として、Apache Parquetを推奨します。Parquetは圧縮を伴い、ストレージコストを削減し、転送時間を短縮することができます(デフォルトでは、各ロウグループはSNAPPYを使用して圧縮されています)。ClickHouseはまた、データのインジェストを高速化するためにParquetの列指向を活用しています。 +::: diff --git a/docs/ja/integrations/data-ingestion/s3-minio.md b/docs/ja/integrations/data-ingestion/s3-minio.md new file mode 100644 index 00000000000..fc3a3fd5f2d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/s3-minio.md @@ -0,0 +1,45 @@ +--- +sidebar_label: MinIO の使用 +sidebar_position: 6 +slug: /ja/integrations/minio +description: MinIO の使用 +--- + +# MinIO の使用 + +import SelfManaged from '@site/docs/ja/_snippets/_self_managed_only_no_roadmap.md'; + + + +すべての S3 機能とテーブルは [MinIO](https://min.io/) と互換性があります。特にネットワークのローカリティが最適な場合、セルフマネージドの MinIO ストアでは優れたスループットが得られることがあります。 + +また、バックエンドの MergeTree 構成も一部の構成を微調整することで互換性があります: + +```xml + + + ... + + + s3 + https://min.io/tables// + your_access_key_id + your_secret_access_key + + /var/lib/clickhouse/disks/s3/ + + + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + ... + + +``` + +:::tip +エンドポイントタグの二重スラッシュに注目してください。これはバケットルートを指定するために必要です。 +::: diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-key.png new file mode 100644 index 00000000000..3ec80580181 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-service-account.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-service-account.png new file mode 100644 index 00000000000..ca321eca8ec Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-HMAC-service-account.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png new file mode 100644 index 00000000000..a616c48610f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-1.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png new file mode 100644 index 00000000000..760a7ff667b Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-folder.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-folder.png new file mode 100644 index 00000000000..c24df729b46 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-bucket-folder.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png new file mode 100644 index 00000000000..3c702b62b52 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-a-service-account-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png new file mode 100644 index 00000000000..bed731ea198 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-0.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png new file mode 100644 index 00000000000..4bcc4df39e7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png new file mode 100644 index 00000000000..863861c84a2 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-3.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png new file mode 100644 index 00000000000..9bbb890b376 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-create-service-account-a.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-1.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-1.png new file mode 100644 index 00000000000..87bc2013c99 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-1.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-2.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-2.png new file mode 100644 index 00000000000..c0c063be597 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-examine-bucket-2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png new file mode 100644 index 00000000000..e2513f32a87 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-guide-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-new-key.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-new-key.png new file mode 100644 index 00000000000..7a2a856665f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-new-key.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/GCS-service-account-storage-admin.png b/docs/ja/integrations/data-ingestion/s3/images/GCS-service-account-storage-admin.png new file mode 100644 index 00000000000..85da020506f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/GCS-service-account-storage-admin.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/bucket1.png b/docs/ja/integrations/data-ingestion/s3/images/bucket1.png new file mode 100644 index 00000000000..67e0dd22b0f Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/bucket1.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/bucket2.png b/docs/ja/integrations/data-ingestion/s3/images/bucket2.png new file mode 100644 index 00000000000..c8a210b033b Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/bucket2.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/hardware_size.png b/docs/ja/integrations/data-ingestion/s3/images/hardware_size.png new file mode 100644 index 00000000000..f2d720147b8 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/hardware_size.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/insert_mechanics.png b/docs/ja/integrations/data-ingestion/s3/images/insert_mechanics.png new file mode 100644 index 00000000000..815e33c056a Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/insert_mechanics.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/insert_threads.png b/docs/ja/integrations/data-ingestion/s3/images/insert_threads.png new file mode 100644 index 00000000000..09d0da45cb6 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/insert_threads.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/merges.png b/docs/ja/integrations/data-ingestion/s3/images/merges.png new file mode 100644 index 00000000000..6a5e5f003c6 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/merges.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/mergetree.png b/docs/ja/integrations/data-ingestion/s3/images/mergetree.png new file mode 100644 index 00000000000..f48964b14d7 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/mergetree.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/pull.png b/docs/ja/integrations/data-ingestion/s3/images/pull.png new file mode 100644 index 00000000000..196c029e757 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/pull.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/resource_usage.png b/docs/ja/integrations/data-ingestion/s3/images/resource_usage.png new file mode 100644 index 00000000000..d36c9a08446 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/resource_usage.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/s3-j.png b/docs/ja/integrations/data-ingestion/s3/images/s3-j.png new file mode 100644 index 00000000000..a0249e7a80e Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/s3-j.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/s3Cluster.png b/docs/ja/integrations/data-ingestion/s3/images/s3Cluster.png new file mode 100644 index 00000000000..5cfcf2d8856 Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/s3Cluster.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/images/s3_01.png b/docs/ja/integrations/data-ingestion/s3/images/s3_01.png new file mode 100644 index 00000000000..6698407e9cb Binary files /dev/null and b/docs/ja/integrations/data-ingestion/s3/images/s3_01.png differ diff --git a/docs/ja/integrations/data-ingestion/s3/index.md b/docs/ja/integrations/data-ingestion/s3/index.md new file mode 100644 index 00000000000..7b1a2a6298d --- /dev/null +++ b/docs/ja/integrations/data-ingestion/s3/index.md @@ -0,0 +1,1246 @@ +--- +slug: /ja/integrations/s3 +sidebar_position: 1 +sidebar_label: S3とClickHouseの統合 + +--- +import BucketDetails from '@site/docs/ja/_snippets/_S3_authentication_and_bucket.md'; + +# S3とClickHouseの統合 + +S3からClickHouseにデータを挿入したり、S3をエクスポート先として使用したりできます。これにより「データレイク」アーキテクチャとの相互作用が可能になります。さらに、S3は「コールド」ストレージ階層を提供し、ストレージとコンピュートの分離を支援できます。以下のセクションでは、ニューヨーク市のタクシーデータセットを使用して、S3とClickHouse間でデータを移動するプロセスを示し、主要な構成パラメータを特定し、パフォーマンスを最適化するためのヒントを提供します。 + +## S3テーブル関数 + +`s3`テーブル関数を使用すると、S3互換ストレージからファイルを読み取ったり、ファイルを書き込んだりできます。構文の概要は次のとおりです: + +```sql +s3(path, [aws_access_key_id, aws_secret_access_key,] [format, [structure, [compression]]]) +``` + +ここで: + +* path — ファイルのパスを含むバケットURL。このURLは、読み取り専用モードで次のワイルドカードに対応します:`*`、`?`、`{abc,def}`、`{N..M}`(ここで`N`と`M`は数字、`'abc'`と`'def'`は文字列です)。詳細は、[パスでのワイルドカード使用に関するドキュメント](/docs/ja/engines/table-engines/integrations/s3/#wildcards-in-path)を参照してください。 +* format — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +* structure — テーブルの構造。形式は`'column1_name column1_type, column2_name column2_type, ...'`。 +* compression — パラメータはオプションです。サポートされる値は`none`、`gzip/gz`、`brotli/br`、`xz/LZMA`、`zstd/zst`です。デフォルトでは、ファイル拡張子によって圧縮を自動検出します。 + +パス式にワイルドカードを使用することで、複数のファイルを参照し、並列処理の可能性を開きます。 + +### 準備 + +S3ベースのデータセットと相互作用するために、標準の`MergeTree`テーブルを作成し、宛先とします。以下のステートメントでは、デフォルトデータベースに`trips`という名前のテーブルを作成します: + +```sql +CREATE TABLE trips +( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(pickup_date) +ORDER BY pickup_datetime +SETTINGS index_granularity = 8192 +``` + +`pickup_date`フィールドで[パーティショニング](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key.md/#custom-partitioning-key)を使用しています。通常、パーティションキーはデータ管理のためですが、後でこのキーを利用してS3への書き込みを並列化します。 + +私たちのタクシーデータセットの各エントリは、タクシーの旅を含んでいます。この匿名化されたデータは、約20MのレコードでS3バケットhttps://datasets-documentation.s3.eu-west-3.amazonaws.com/のフォルダ**nyc-taxi**に圧縮されています。データはTSV形式で、ファイルごとに約1Mの行が含まれています。 + +### S3からのデータ読み取り + +ClickHouseに保持することなく、S3データをソースとしてクエリできます。以下のクエリでは、10行をサンプルします。このバケットへのアクセスは公開されているため、ここでは認証情報が不要です: + +```sql +SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') +LIMIT 10; +``` + +`TabSeparatedWithNames`形式では、最初の行にカラム名が含まれているため、カラムを列挙する必要はありません。`CSV`や`TSV`などの他の形式では、自動生成されたカラム(例:`c1`、`c2`、`c3`など)がこのクエリに対して返されます。 + +クエリはまた、バケットパスとファイル名に関する情報を提供する[仮想カラム](../sql-reference/table-functions/s3#virtual-columns)(`_path`や`_file`など)をサポートしています。例えば: + +```sql +SELECT _path, _file, trip_id +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', 'TabSeparatedWithNames') +LIMIT 5; +``` + +```response +┌─_path──────────────────────────────────────┬─_file──────┬────trip_id─┐ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999902 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999919 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999944 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999969 │ +│ datasets-documentation/nyc-taxi/trips_0.gz │ trips_0.gz │ 1199999990 │ +└────────────────────────────────────────────┴────────────┴────────────┘ +``` + +このサンプルデータセットの行数を確認します。ワイルドカードを使用してファイルの拡張を行うため、全ての20ファイルを考慮します。このクエリは、ClickHouseインスタンスのコア数によっては約10秒間かかります: + +```sql +SELECT count() AS count +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames'); +``` + +```response +┌────count─┐ +│ 20000000 │ +└──────────┘ +``` + +データをサンプリングしたり、アドホックかつ探索的なクエリを実行するには便利ですが、S3から直接データを読み取るのは定期的に行うことではありません。本格的に取り組むときは、データをClickHouseの`MergeTree`テーブルにインポートします。 + +### clickhouse-localの使用 + +`clickhouse-local`プログラムを使用すると、ClickHouseサーバーをデプロイおよび構成することなく、ローカルファイルに対して高速処理を実行できます。`s3`テーブル関数を使用する任意のクエリは、このユーティリティを使用して実行できます。例えば: + +```sql +clickhouse-local --query "SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') LIMIT 10" +``` + +### S3からのデータ挿入 + +ClickHouseの完全な機能を活用するために、次にデータを読み取り、インスタンスに挿入します。`s3`関数と単純な`INSERT`文を組み合わせてこれを実現します。ターゲットテーブルに必要な構造が提供されているため、カラムを列挙する必要はありません。この場合、カラムはテーブルDDL文で指定された順序で出現する必要があります:カラムは`SELECT`句での位置に基づいてマッピングされます。すべての1,000万行の挿入は、ClickHouseインスタンスに応じて数分かかることがあります。以下では、1,000,000行を挿入して迅速な応答を確保しています。必要に応じて`LIMIT`句やカラム選択を調整して、部分集合をインポートします: + +```sql +INSERT INTO trips + SELECT * + FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') + LIMIT 1000000; +``` + +### ClickHouseローカルを使用したリモート挿入 + +ネットワークセキュリティポリシーによりClickHouseクラスタからの外部接続が制限されている場合、`clickhouse-local`を使用してS3データを挿入することが可能です。以下の例では、S3バケットから読み取り、`remote`関数を使用してClickHouseに挿入します: + +```sql +clickhouse-local --query "INSERT INTO TABLE FUNCTION remote('localhost:9000', 'default.trips', 'username', 'password') (*) SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames') LIMIT 10" +``` + +:::note +SSL接続でこれを実行するには、`remoteSecure`関数を利用してください。 +::: + +### データのエクスポート + +`s3`テーブル関数を使用して、S3にファイルを書き込むことができます。これには適切な権限が必要です。リクエストで必要な資格情報を渡しますが、他のオプションについては[資格情報の管理](#managing-credentials)ページを参照してください。 + +以下の単純な例では、ソースではなく宛先としてテーブル関数を使用します。ここで、`trips`テーブルから10,000行をS3バケットに流し込み、`lz4`圧縮と`CSV`の出力形式を指定します: + +```sql +INSERT INTO FUNCTION + s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips.csv.lz4', + 's3_key', + 's3_secret', + 'CSV' + ) +SELECT * +FROM trips +LIMIT 10000; +``` + +ここでは、ファイルの形式が拡張子から推測されることに注意してください。また、`s3`関数内で列を指定する必要はありません - `SELECT`から推測できます。 + +### 大規模ファイルの分割 + +データを単一のファイルとしてエクスポートすることはあまり望ましくありません。ClickHouseを含むほとんどのツールは、並列処理の可能性があるため、複数のファイルに対する読み取りや書き込みでより高いスループットパフォーマンスを達成します。`INSERT`コマンドを複数回実行し、データのサブセットをターゲットにすることができます。ClickHouseは、`パーティション`キーを使用してファイルを自動的に分割する手段を提供します。 + +以下の例では、`rand()`関数の剰余を使用して10個のファイルを作成します。結果のパーティションIDがファイル名で参照されることに注目してください。これにより、数値サフィックスが付いた10個のファイルが作成されます。例:`trips_0.csv.lz4`、`trips_1.csv.lz4`など...: + +```sql +INSERT INTO FUNCTION + s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips_{_partition_id}.csv.lz4', + 's3_key', + 's3_secret', + 'CSV' + ) + PARTITION BY rand() % 10 +SELECT * +FROM trips +LIMIT 100000; +``` + +または、データのフィールドを参照することもできます。このデータセットでは、`payment_type`が5のカードのナチュラルなパーティションキーを提供します。 + +```sql +INSERT INTO FUNCTION + s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips_{_partition_id}.csv.lz4', + 's3_key', + 's3_secret', + 'CSV' + ) + PARTITION BY payment_type +SELECT * +FROM trips +LIMIT 100000; +``` + +### クラスターの利用 + +上記の関数はすべて単一ノードでの実行に制限されています。読み取り速度はCPUコアにリニアにスケールするため、他のリソース(通常はネットワーク)が飽和するまで縦方向にスケールできます。しかし、このアプローチには限界があります。`INSERT INTO SELECT`クエリを実行するときに分散テーブルに挿入することで、いくつかのリソースプレッシャーを軽減することができますが、データの読み取り、解析、処理を行うノードが単一のままです。この課題に対処し、読み取りを水平にスケールするために、[s3Cluster](/docs/ja/sql-reference/table-functions/s3Cluster.md)関数があります。 + +クエリを受信したノード(イニシエーターとして知られています)は、クラスタ内のすべてのノードとの接続を作成します。ファイルを読み取る必要があるかを決定するglobパターンが、一連のファイルに解決されます。イニシエーターはファイルをクラスタ内のノードに配布し、これらのノードはワーカーとして機能します。これらのワーカーは、読み取りが完了したら処理するファイルを要求します。このプロセスにより、読み取りを水平にスケールできるようになります。 + +`s3Cluster`関数は、単一ノードバリアントと同じ形式をとりますが、ワーカーノードを示すターゲットクラスタが必要です: + +``` +s3Cluster(cluster_name, source, [access_key_id, secret_access_key,] format, structure) +``` + +* `cluster_name` — リモートおよびローカルサーバーへのアドレスと接続パラメータのセットを構築するために使用されるクラスタの名前。 +* `source` — ファイルまたは一連のファイルへのURL。読み取り専用モードで以下のワイルドカードをサポートします:*, ?, {'abc','def'} 及び {N..M}、N, M — 数字、abc, def — 文字列。詳細は[ワイルドカード使用のドキュメント](/docs/ja/engines/table-engines/integrations/s3.md/#wildcards-in-path)を参照してください。 +* `access_key_id`及び`secret_access_key` — 指定されたエンドポイントで使用する資格情報を指定します。オプションです。 +* `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +* `structure` — テーブルの構造。形式は'column1_name column1_type, column2_name column2_type, ...'です。 + +`s3`関数のように、バケットがセキュアではない、またはIAMロールを通じてセキュリティを定義している場合は、資格情報はオプションです。しかし、`s3Cluster`関数の場合、22.3.1ではリクエストに構造を指定する必要があります、つまりスキーマは推測されません。 + +この関数は、多くの場合、`INSERT INTO SELECT`の一部として使用されます。この場合、分散テーブルに挿入することが多いです。以下の簡単な例を示します。ここで`trips_all`は分散テーブルです。このテーブルがイベントクラスタを使用している間、読み取りと書き込みに使用されるノードの一貫性は要件ではありません: + +```sql +INSERT INTO default.trips_all + SELECT * + FROM s3Cluster( + 'events', + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', + 'TabSeparatedWithNames' + ) +``` + +挿入はイニシエーターノードに対して行われます。つまり、読み取りは各ノードで行われますが、結果の行はイニシエーターにルーティングされ、分配されます。高スループットのシナリオでは、これがボトルネックとなる可能性があります。これに対処するために、`s3Cluster`関数のパラメータ[parallel_distributed_insert_select](/docs/ja/operations/settings/settings/#parallel_distributed_insert_select)を設定します。 + +## S3テーブルエンジン + +`s3`関数は、S3に保存されたデータに対するアドホッククエリを可能にしますが、文法的に冗長です。`S3`テーブルエンジンを使用すると、バケットURLと資格情報を繰り返し指定する必要がありません。これを解決するために、ClickHouseはS3テーブルエンジンを提供します。 + +```sql +CREATE TABLE s3_engine_table (name String, value UInt32) + ENGINE = S3(path, [aws_access_key_id, aws_secret_access_key,] format, [compression]) + [SETTINGS ...] +``` + +* `path` — バケットURLとファイルパス。読み取り専用モードで以下のワイルドカードをサポートします:*, ?, {abc,def}、{N..M}(N, M — 数字、'abc', 'def' — 文字列)。詳細は[ここ](/docs/ja/engines/table-engines/integrations/s3#wildcards-in-path)を参照してください。 +* `format` — ファイルの[フォーマット](/docs/ja/interfaces/formats.md/#formats)。 +* `aws_access_key_id`、`aws_secret_access_key` - AWSアカウントユーザー用の長期的な資格情報。これを使用してリクエストに認証できます。パラメータはオプションです。資格情報が指定されていない場合、構成ファイルの値が使用されます。詳細は、[資格情報の管理](#managing-credentials)を参照してください。 +* `compression` — 圧縮タイプ。サポートされている値は、none、gzip/gz、brotli/br、xz/LZMA、zstd/zstです。パラメータはオプションです。デフォルトでは、ファイル拡張子により圧縮を自動検出します。 + +### データの読み取り + +以下の例では、`https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/`バケットにある最初の10個のTSVファイルを使用して`trips_raw`という名前のテーブルを作成します。それぞれのファイルには1M行が含まれています: + +```sql +CREATE TABLE trips_raw +( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type_` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` FixedString(7), + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` FixedString(7), + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String、 + `dropoff_puma` UInt16 +) ENGINE = S3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{0..9}.gz', 'TabSeparatedWithNames', 'gzip'); +``` + +{0..9}パターンを使用して最初の10個のファイルに限定している点に注目してください。作成後は、他のテーブルと同様にこのテーブルをクエリできます: + +```sql +SELECT DISTINCT(pickup_ntaname) +FROM trips_raw +LIMIT 10; +``` + +```response +┌─pickup_ntaname───────────────────────────────────┐ +│ Lenox Hill-Roosevelt Island │ +│ Airport │ +│ SoHo-TriBeCa-Civic Center-Little Italy │ +│ West Village │ +│ Chinatown │ +│ Hudson Yards-Chelsea-Flatiron-Union Square │ +│ Turtle Bay-East Midtown │ +│ Upper West Side │ +│ Murray Hill-Kips Bay │ +│ DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill │ +└──────────────────────────────────────────────────┘ +``` + +### データの挿入 + +`S3`テーブルエンジンは並列読み取りをサポートしています。書き込みは、テーブル定義にグロブパターンが含まれていない場合にのみサポートされます。したがって、上記のテーブルでは書込みはブロックされます。 + +書き込みを示すために、書き込み可能なS3バケットを指すテーブルを作成します: + +```sql +CREATE TABLE trips_dest +( + `trip_id` UInt32, + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_datetime` DateTime, + `tip_amount` Float32, + `total_amount` Float32 +) ENGINE = S3('/trips.bin', 'Native'); +``` + +```sql +INSERT INTO trips_dest + SELECT + trip_id, + pickup_date, + pickup_datetime, + dropoff_datetime, + tip_amount, + total_amount + FROM trips + LIMIT 10; +``` + +```sql +SELECT * FROM trips_dest LIMIT 5; +``` + +```response +┌────trip_id─┬─pickup_date─┬─────pickup_datetime─┬────dropoff_datetime─┬─tip_amount─┬─total_amount─┐ +│ 1200018648 │ 2015-07-01 │ 2015-07-01 00:00:16 │ 2015-07-01 00:02:57 │ 0 │ 7.3 │ +│ 1201452450 │ 2015-07-01 │ 2015-07-01 00:00:20 │ 2015-07-01 00:11:07 │ 1.96 │ 11.76 │ +│ 1202368372 │ 2015-07-01 │ 2015-07-01 00:00:40 │ 2015-07-01 00:05:46 │ 0 │ 7.3 │ +│ 1200831168 │ 2015-07-01 │ 2015-07-01 00:01:06 │ 2015-07-01 00:09:23 │ 2 │ 12.3 │ +│ 1201362116 │ 2015-07-01 │ 2015-07-01 00:01:07 │ 2015-07-01 00:03:31 │ 0 │ 5.3 │ +└────────────┴─────────────┴─────────────────────┴─────────────────────┴────────────┴──────────────┘ +``` + +行は新しいファイルにのみ挿入できます。マージサイクルやファイル分割操作はありません。一度書き込まれたファイルは、後続の挿入が失敗します。ユーザーには2つのオプションがあります: + +* 設定` s3_create_new_file_on_insert=1`を指定します。これにより、各挿入時に新しいファイルが作成されます。数値サフィックスがファイルの末尾に付加され、各挿入操作で単調に増加します。上記の例では、後続の挿入はtrips_1.binファイルの作成を引き起こすでしょう。 +* 設定`s3_truncate_on_insert=1`を指定します。これにより、ファイルが切り詰められ、完了後に新しく挿入された行のみが含まれます。 + +これらの設定はデフォルトで0に設定されており、いずれかを設定するようにしています。`s3_truncate_on_insert`が設定されている場合、優先されます。 + +`S3`テーブルエンジンに関するノート: + +- 伝統的な`MergeTree`ファミリーテーブルとは異なり、`S3`テーブルを削除することは、基になるデータを削除しません。 +- このテーブルタイプの完全な設定は[ここ](/docs/ja/engines/table-engines/integrations/s3.md/#settings)で見つけられます。 +- このエンジンを使用する際には、以下の注意点があります: + * ALTERクエリはサポートされていません + * サンプル操作はサポートされていません + * プライマリまたはスキップのインデックスの概念はありません。 + +## 資格情報の管理 + +前の例では、`s3`関数または`S3`テーブル定義で資格情報を渡しましたが、これは時折の使用には許容できますが、ユーザーはプロダクションでのより明示的でない認証メカニズムが求められます。これに対応して、ClickHouseは数つのオプションを提供します: + +* 接続の詳細を**config.xml**または**conf.d**下の同等の構成ファイルに指定します。デビアンパッケージを使用してインストールした場合の例ファイルの内容を以下に示します。 + + ```xml + ubuntu@single-node-clickhouse:/etc/clickhouse-server/config.d$ cat s3.xml + + + + https://dalem-files.s3.amazonaws.com/test/ + key + secret + + + + + + ``` + + これらの資格情報は、上記のエンドポイントが要求されたURLに対する完全なプレフィックス一致であるリクエストの場合に使用されます。また、例ではアクセストークンとしてのオルタナティブとしてアクセスキーとシークレットキーの代わりに、認証ヘッダーを宣言する能力があることに注意してください。サポートされている設定の完全なリストは[ここ](/docs/ja/engines/table-engines/integrations/s3.md/#settings)で見つけられます。 + +* 上記の例では、構成パラメータ`use_environment_credentials`の利用可能性を強調しています。この構成パラメータは、`s3`レベルでグローバルに設定することもできます: + + ```xml + + + true + + + ``` + + この設定は、環境からS3資格情報を取得しようとすることを許可するため、IAMロールを通じてアクセスを許可します。具体的には、次の順序での取得が実行されます: + + * 環境変数`AWS_ACCESS_KEY_ID`、`AWS_SECRET_ACCESS_KEY`および`AWS_SESSION_TOKEN`の検索。 + * **$HOME/.aws**でのチェック実施。 + * AWSセキュリティトークンサービスを通じた一時的な資格情報の取得 - すなわち [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) APIを通じて。 + * ECS環境変数`AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`または`AWS_CONTAINER_CREDENTIALS_FULL_URI`と`AWS_ECS_CONTAINER_AUTHORIZATION_TOKEN`での資格情報のチェック。 + * [Amazon EC2インスタンスメタデータ](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-metadata.html)を通じた資格情報の取得、ただし[AWS_EC2_METADATA_DISABLED](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html#envvars-list-AWS_EC2_METADATA_DISABLED)がtrueに設定されていない場合。 + * これらの設定は、プレフィックス一致ルールを使用して、特定のエンドポイント用に設定することもできます。 + +## パフォーマンス最適化 {#s3-optimizing-performance} + +S3関数を使用した読み取りおよび挿入を最適化する方法については、[専用のパフォーマンスガイド](./performance.md)を参照してください。 + +### S3ストレージのチューニング + +内部的に、ClickHouseのMergeTreeは、[`Wide`と`Compact`](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#mergetree-data-storage)という2つの主なストレージ形式を使用します。現在の実装は、(`min_bytes_for_wide_part`および`min_rows_for_wide_part`の設定により制御される)ClickHouseのデフォルトの動作を使用していますが、将来のリリースではS3の動作が変わることが予測されます。例えば、より大きなデフォルト値が設定され`Compact`フォーマットを推奨し、それによりファイルが少なくなることがあります。現在、S3ストレージを専用に使用している場合、ユーザーはこれらの設定を調整することを検討することができます。 + +## S3バックドMergeTree + +`s3`関数と関連するテーブルエンジンを使用すると、ClickHouseの親しみやすい構文を使用してS3データをクエリすることができます。ただし、データ管理機能とパフォーマンスに関しては、制限があります。プライマリインデックスのサポートがない、キャッシュサポートがない、ファイルの挿入はユーザーが管理する必要があります。 + +ClickHouseは、S3が特にクエリパフォーマンスが重要でない「コールド」データのストレージソリューションとして魅力的であることを認識しており、ユーザーがストレージとコンピュートを分離したいと考えています。これを達成するために、S3をMergeTreeエンジンのストレージとして使用するサポートが提供されています。これにより、ユーザーはS3のスケーラビリティとコストメリット、そしてMergeTreeエンジンの挿入およびクエリパフォーマンスを活用できるようになります。 + +### ストレージ階層 + +ClickHouseストレージボリュームは、物理ディスクをMergeTreeテーブルエンジンから抽象化することができます。任意の単一のボリュームは、ディスクの順序付けされたセットで構成されることができます。これにより、データストレージに複数のブロックデバイスを使用する可能性があるだけでなく、S3などの他のストレージタイプも使用可能です。ClickHouseデータパーツは、ストレージポリシーに従ってボリューム間で移動およびフィルレートされることができ、ストレージ階層の概念が作成されます。 + +ストレージ階層アンロックは、通常、最も新しいデータが最もクエリされる必要があり、高性能なストレージ、例えばNVMe SSD上でのみ小量のスペースを要求するホット-コールドアーキテクチャを解放します。データが古くなるにつれて、クエリ時間のSLAが増加し、クエリの頻度が減少します。このデータのファットテールは、HDDやS3などのオブジェクトストレージのような、パフォーマンスの低いストレージに格納されることができます。 + +### ディスクの作成 + +S3バケットをディスクとして利用するために、まずClickHouse構成ファイル内で宣言する必要があります。config.xmlを拡張するか、またはpreferでplugin.dに新しいファイルを提供します。以下に示す例はS3ディスク宣言の例です: + +```xml + + + ... + + + s3 + https://sample-bucket.s3.us-east-2.amazonaws.com/tables/ + your_access_key_id + your_secret_access_key + + /var/lib/clickhouse/disks/s3/ + + + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + ... + + +``` + +このディスク宣言に関連する設定の完全なリストは[ここ](/docs/ja/engines/table-engines/mergetree-family/mergetree.md/#table_engine-mergetree-s3)で見つけられます。資格情報は、[資格情報の管理](#managing-credentials)で説明された同じアプローチを使用してここで管理できます。たとえば、上記の設定ブロックで`use_environment_credentials`をtrueに設定してIAMロールを使用することができます。 + +### ストレージポリシーの作成 + +設定が完了すると、この「ディスク」はポリシーで宣言されたストレージボリュームで使用できます。以下の例では、S3が唯一のストレージであると仮定しています。これは、データがTTLやフィルレートに基づいて移動される可能性のあるより複雑なホット-コールドアーキテクチャを無視します。 + +```xml + + + + + ... + + + ... + + + + + +
+ s3 +
+
+
+
+
+
+``` + +### テーブルの作成 + +ディスクをwriteアクセスのあるバケットに設定していると仮定すると、以下の例のようにテーブルを作成できます。簡潔にするために、NYCタクシーのカラムの一部を使用し、データを直接S3バックドテーブルにストリームします: + +```sql +CREATE TABLE trips_s3 +( + `trip_id` UInt32, + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_datetime` DateTime, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `tip_amount` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4) +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(pickup_date) +ORDER BY pickup_datetime +SETTINGS index_granularity = 8192, storage_policy='s3_main' +``` + +```sql +INSERT INTO trips_s3 SELECT trip_id, pickup_date, pickup_datetime, dropoff_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, passenger_count, trip_distance, tip_amount, total_amount, payment_type FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames') LIMIT 1000000; +``` +ハードウェアによりますが、1百万行の挿入は実行に数分かかる場合があります。進捗は `system.processes` テーブルで確認できます。行数を1千万まで増やし、一部のサンプルクエリを試してみてください。 + +```sql +SELECT passenger_count, avg(tip_amount) as avg_tip, avg(total_amount) as avg_amount FROM trips_s3 GROUP BY passenger_count; +``` + +### テーブルの変更 + +特定のテーブルのストレージポリシーを変更する必要がある場合もあります。これは可能ですが、制限があります。新しいターゲットポリシーは、前のポリシーのすべてのディスクとボリュームを含んでいる必要があります。つまり、ポリシー変更を満たすためにデータは移行されません。これらの制約を検証する際、ボリュームとディスクはその名前によって識別され、違反しようとするとエラーが発生します。しかし、以前の例を使用する場合、以下の変更は有効です。 + +```xml + + + +
+ s3 +
+
+
+ + + + default + +
+ s3 +
+
+ 0.2 +
+
+``` + +```sql +ALTER TABLE trips_s3 MODIFY SETTING storage_policy='s3_tiered' +``` + +ここでは新しい `s3_tiered` ポリシーに既存のメインボリュームを再利用し、新しいホットボリュームを導入します。これは、パラメータ `` を通じて設定された1つのディスクだけで構成されたデフォルトディスクを使用します。ボリューム名およびディスクは変更されないことに注意してください。新しい挿入はデフォルトディスクに配置され、これが move_factor * disk_size に達すると、データは S3 に移動されます。 + +### レプリケーションの取り扱い + +S3ディスクを使用したレプリケーションは、`ReplicatedMergeTree` テーブルエンジンを使用して実現できます。[S3オブジェクトストレージを使用して2つのAWSリージョンで単一シャードをレプリケートする](#s3-multi-region)ガイドを参照してください。 + +### 読み取りと書き込み + +以下のノートでは、ClickHouseとS3間のインタラクションの実装をカバーしています。通常は情報提供のみですが、[パフォーマンスの最適化](#s3-optimizing-performance)に役立つかもしれません: + +* デフォルトでは、クエリ処理パイプラインの任意のステージで使用される最大クエリ処理スレッド数はコア数と等しいです。あるステージは他よりも並列化が容易なため、この値は上限を提供します。データがディスクからストリーミングされるため、複数のクエリステージが一度に実行されることがあり、クエリに使用されるスレッドの正確な数はこれを超える場合があります。設定 [max_threads](/docs/ja/operations/settings/settings.md/#settings-max_threads) を変更して調整できます。 +* S3の読み取りはデフォルトで非同期です。この動作は `remote_filesystem_read_method` 設定によって決まります。デフォルト値は `threadpool` です。リクエストに応じて、ClickHouseはストライプでグラニュールを読み取ります。各ストライプは多数のカラムを含む可能性があります。スレッドはグラニュールに対してカラムを一つずつ読み込みます。これを同期的に行う代わりに、データの待機前にすべてのカラムをプリフェッチします。これは各カラムでの同期待機に比べて大幅なパフォーマンス向上をもたらします。ほとんどの場合、この設定を変更する必要はありません。[パフォーマンスの最適化](#s3-optimizing-performance)を参照してください。 +* s3関数とテーブルの場合、並列ダウンロードは `max_download_threads` と `max_download_buffer_size` の値によって決定されます。ファイルが全スレッドを通じた合計バッファサイズより大きい場合のみ並列でダウンロードされます。これはバージョン > 22.3.1 でのみ利用可能です。 +* 書き込みは並列で実行され、最大100の同時ファイル書き込みスレッドがあります。`max_insert_delayed_streams_for_parallel_write` はデフォルト値1000で、並列で書き込まれるS3ブロブの数を制御します。書き込まれる各ファイルに対してバッファが必要なため(約1MB)、この値を低メモリシナリオで低く設定するのが適切な場合があります。 + +## S3オブジェクトストレージをClickHouseディスクとして使用する {#configuring-s3-for-clickhouse-use} + +バケットとIAMロールを作成するためのステップバイステップの指示が必要な場合は、**Create S3 buckets and an IAM role**を展開して指示に従ってください。 + + + +### ClickHouseをS3バケットをディスクとして使用するように設定 +以下の例は、サービスとしてインストールされたLinux Debパッケージに基づくデフォルトのClickHouseディレクトリを使用します。 + +1. ClickHouseの`config.d`ディレクトリに、新しいストレージ設定を格納するファイルを作成します。 +```bash +vim /etc/clickhouse-server/config.d/storage_config.xml +``` +2. 次のストレージ設定を追加します。先に取得したバケットパス、アクセスキーおよびシークレットキーを使用してください。 +```xml + + + + + s3 + https://mars-doc-test.s3.amazonaws.com/clickhouse3/ + ABC123 + Abc+123 + /var/lib/clickhouse/disks/s3_disk/ + + + cache + s3_disk + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+``` + +:::note +``タグ内の`s3_disk`および`s3_cache`タグは任意のラベルです。他のラベルに設定できますが、同じラベルを``タグの下の``タグに使用してディスクを参照する必要があります。 +``タグも任意であり、ClickHouseでリソースを作成する際の識別ストレージターゲットとして使用されるポリシー名です。 + +上記の設定はClickHouseバージョン22.8以降のものです。古いバージョンを使用している場合は[データの保存](docs/ja/operations/storing-data.md/#using-local-cache)ドキュメントを参照してください。 + +S3の使用に関する詳細は以下を参照してください: +統合ガイド:[S3バックドMergeTree](#s3-backed-mergetree) +::: + +3. ファイルの所有者を`clickhouse`ユーザーとグループに更新します +```bash +chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml +``` +4. 変更が反映されるようにClickHouseインスタンスを再起動 +```bash +service clickhouse-server restart +``` + +### テスト +1. ClickHouseクライアントでログインします。以下のように行います。 +```bash +clickhouse-client --user default --password ClickHouse123! +``` +2. 新しいS3ストレージポリシーを指定してテーブルを作成します +```sql +CREATE TABLE s3_table1 + ( + `id` UInt64, + `column1` String + ) + ENGINE = MergeTree + ORDER BY id + SETTINGS storage_policy = 's3_main'; +``` + +3. 正しいポリシーでテーブルが作成されたことを確認します +```sql +SHOW CREATE TABLE s3_table1; +``` +```response +┌─statement──────────────────────────────────────────────────── +│ CREATE TABLE default.s3_table1 +( + `id` UInt64, + `column1` String +) +ENGINE = MergeTree +ORDER BY id +SETTINGS storage_policy = 's3_main', index_granularity = 8192 +└────────────────────────────────────────────────────────────── +``` + +4. テスト行をテーブルに挿入します +```sql +INSERT INTO s3_table1 + (id, column1) + VALUES + (1, 'abc'), + (2, 'xyz'); +``` +```response +INSERT INTO s3_table1 (id, column1) FORMAT Values + +Query id: 0265dd92-3890-4d56-9d12-71d4038b85d5 + +Ok. + +2 rows in set. Elapsed: 0.337 sec. +``` +5. 行を表示します +```sql +SELECT * FROM s3_table1; +``` +```response +┌─id─┬─column1─┐ +│ 1 │ abc │ +│ 2 │ xyz │ +└────┴─────────┘ + +2 rows in set. Elapsed: 0.284 sec. +``` +6. AWSコンソールでバケットに移動し、新しいバケットとフォルダを選択してください。 +以下のようなものが表示されるはずです: + + ![create_s3_bucket_10](./images/s3-j.png) + +## S3オブジェクトストレージを使用したAWSリージョン間での単一シャードのレプリケート {#s3-multi-region} + +:::tip +オブジェクトストレージはClickHouse Cloudでデフォルトで使用されているため、ClickHouse Cloudを使用している場合、この手順に従う必要はありません。 +::: + +### 展開の計画 +このチュートリアルは、AWS EC2に2つのClickHouseサーバーノードと3つのClickHouse Keeper ノードを展開することを対象としています。ClickHouseサーバーのデータストアはS3です。ディザスタリカバリーをサポートするため、2つのAWSリージョンが使用され、各リージョンにはClickHouseサーバーとS3バケットが配置されます。 + +ClickHouseのテーブルは2つのサーバー間、したがって2つのリージョン間でレプリケートされます。 + +### ソフトウェアのインストール + +#### ClickHouseサーバーノード +ClickHouseサーバーノードでの展開手順を実行する際は、[インストール手順](/docs/ja/getting-started/install.md/#available-installation-options)を参照してください。 + +#### ClickHouseのデプロイ + +ClickHouseを2つのホストにデプロイします。サンプル構成ではこれらは `chnode1`、 `chnode2` と命名されます。 + +`chnode1`を1つのAWSリージョンに、 `chnode2`を別のリージョンに配置します。 + +#### ClickHouse Keeperのデプロイ + +ClickHouse Keeperを3つのホストにデプロイします。サンプル構成では、これらは `keepernode1`、 `keepernode2`、および `keepernode3` と命名されます。`keepernode1`は`chnode1`と同じリージョンに、`keepernode2`は`chnode2`と、`keepernode3`はどちらかのリージョンで異なるアベイラビリティゾーンにデプロイすることができます。 + +ClickHouse Keeperノードでの展開手順を実行する際は、[インストール手順](/docs/ja/getting-started/install.md/#install-standalone-clickhouse-keeper)を参照してください。 + +### S3バケットの作成 + +`chnode1`と`chnode2`を配置した各地域に2つのS3バケットを作成します。 + +バケットとIAMロールを作成するためのステップバイステップの指示が必要な場合は、**Create S3 buckets and an IAM role**を展開して指示に従ってください。 + + + +設定ファイルはその後 `/etc/clickhouse-server/config.d/` に配置されます。一つのバケットのサンプル設定ファイルを以下に示します。他のバケットも類似しており、3行の異なる点があります: + +```xml title="/etc/clickhouse-server/config.d/storage_config.xml" + + + + + s3 + + https://docs-clickhouse-s3.s3.us-east-2.amazonaws.com/clickhouses3/ + ABCDEFGHIJKLMNOPQRST + Tjdm4kf5snfkj303nfljnev79wkjn2l3knr81007 + + /var/lib/clickhouse/disks/s3_disk/ + + + + cache + s3 + /var/lib/clickhouse/disks/s3_cache/ + 10Gi + + + + + +
+ s3_disk +
+
+
+
+
+
+``` +:::note +このガイドの手順の多くでは、設定ファイルを `/etc/clickhouse-server/config.d/` に配置するよう求められます。これはLinuxシステムの設定オーバーライドファイルのデフォルトの場所です。このファイルをディレクトリに配置すると、ClickHouseは内容を使用してデフォルトの設定を上書きします。これらのファイルをオーバーライドディレクトリに置くことで、アップグレード中に設定を失うことを防ぐことができます。 +::: + +### ClickHouse Keeperの設定 + +ClickHouse Keeperを単独で(ClickHouseサーバーとは別に)実行する場合、設定は1つのXMLファイルです。このチュートリアルでは、そのファイルを `/etc/clickhouse-keeper/keeper_config.xml` としています。3つのKeeperサーバーは同じ設定を使用しますが、1つの設定だけが異なります;``です。 + +`server_id`は設定ファイルが使用されるホストに割り当てられるIDを示します。以下の例では、`server_id` は `3`であり、ファイルの下部にある`` セクションでは、サーバー3がホスト名`keepernode3`としてあります。これにより、ClickHouse Keeperプロセスはリーダーの選択およびその他のすべての活動時にどの他のサーバーに接続するかを知ります。 + +```xml title="/etc/clickhouse-keeper/keeper_config.xml" + + + trace + /var/log/clickhouse-keeper/clickhouse-keeper.log + /var/log/clickhouse-keeper/clickhouse-keeper.err.log + 1000M + 3 + + 0.0.0.0 + + 9181 + + 3 + /var/lib/clickhouse/coordination/log + /var/lib/clickhouse/coordination/snapshots + + + 10000 + 30000 + warning + + + + + 1 + keepernode1 + 9234 + + + 2 + keepernode2 + 9234 + + + + 3 + keepernode3 + 9234 + + + + + +``` + +設定ファイルをClickHouse Keeperにコピーして配置します( `` を設定するのを忘れないでください): +```bash +sudo -u clickhouse \ + cp keeper.xml /etc/clickhouse-keeper/keeper.xml +``` + +### ClickHouseサーバーの設定 + +#### クラスターの定義 + +ClickHouseクラスターは、設定の `` セクションで定義されます。このサンプルでは、`cluster_1S_2R`という1つのクラスターが定義されており、それは1つのシャードと2つのレプリカで構成されています。レプリカはホスト `chnode1` と `chnode2` に配置されています。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml" + + + + + + chnode1 + 9000 + + + chnode2 + 9000 + + + + + +``` + +クラスターを使用する際には、クラスター、シャード、レプリカの設定を埋め込むDDLクエリを作成するマクロを定義すると便利です。このサンプルでは、`shard` と `replica` の詳細を提供することなく、レプリケートされたテーブルエンジンを指定することができます。テーブルを作成した際に `system.tables` をクエリすることで、`shard`と`replica`マクロの使用方法を見ることができます。 + +```xml title="/etc/clickhouse-server/config.d/macros.xml" + + + /clickhouse/task_queue/ddl + + + cluster_1S_2R + 1 + replica_1 + + +``` +:::note +このマクロは `chnode1`用です。`chnode2` では `replica` を `replica_2` に設定してください。 +::: + +#### ゼロコピー レプリケーションの無効化 + +ClickHouseバージョン22.7以下では `allow_remote_fs_zero_copy_replication` 設定がデフォルトで `true` に設定されています。このディザスタリカバリーシナリオの場合、この設定は`false` に設定する必要があり、バージョン22.8およびそれ以降ではデフォルトで `false` に設定されています。 + +この設定は 1) この機能がまだプロダクションレディではない、2) ディザスタリカバリーシナリオではデータとメタデータの両方を複数の地域に保存しておく必要がある、という2つの理由から `false` にする必要があります。`allow_remote_fs_zero_copy_replication` を `false` に設定してください。 + +```xml title="/etc/clickhouse-server/config.d/remote-servers.xml" + + + false + + +``` + +ClickHouse Keeper は ClickHouse ノード間のデータレプリケーションを調整します。ClickHouse ノードに ClickHouse Keeper ノードを知らせるために、各 ClickHouse ノードに設定ファイルを追加します。 + +```xml title="/etc/clickhouse-server/config.d/use_keeper.xml" + + + + keepernode1 + 9181 + + + keepernode2 + 9181 + + + keepernode3 + 9181 + + + +``` + +### ネットワークの設定 + +サーバーが通信できるように、またあなたがサーバーと通信できるように、AWSでのセキュリティ設定を行う際は[ネットワークポート](../../../guides/sre/network-ports.md) リストを参照してください。 + +すべてのサーバーは、他のサーバーとの通信とS3との通信を行うためにネットワーク接続をリッスンする必要があります。デフォルトでは、ClickHouseはループバックアドレスでのみリッスンするため、これを変更する必要があります。これは `/etc/clickhouse-server/config.d/` に設定されます。ここにClickHouseとClickHouse KeeperをすべてのIPv4インターフェース上でリッスンするように設定するサンプルを示します。詳細についてはドキュメントあるいはデフォルトの設定ファイル `/etc/clickhouse/config.xml` を参照してください。 + +```xml title="/etc/clickhouse-server/config.d/networking.xml" + + 0.0.0.0 + +``` + +### サーバーの起動 + +#### ClickHouse Keeperの起動 + +各Keeperサーバーで以下のコマンドを実行します: + +```bash +sudo systemctl enable clickhouse-keeper +sudo systemctl start clickhouse-keeper +sudo systemctl status clickhouse-keeper +``` + +#### ClickHouse Keeperの状態を確認 + +ClickHouse Keeperにコマンドを送信するには`netcat`を使用します。例えば、`mntr` はClickHouse Keeperクラスタの状態を返します。各Keeperノードでコマンドを実行すると、1つのノードがリーダーであり、他の2つがフォロワーであることがわかるでしょう: + +```bash +echo mntr | nc localhost 9181 +``` +```response +zk_version v22.7.2.15-stable-f843089624e8dd3ff7927b8a125cf3a7a769c069 +zk_avg_latency 0 +zk_max_latency 11 +zk_min_latency 0 +zk_packets_received 1783 +zk_packets_sent 1783 +# highlight-start +zk_num_alive_connections 2 +zk_outstanding_requests 0 +zk_server_state leader +# highlight-end +zk_znode_count 135 +zk_watch_count 8 +zk_ephemerals_count 3 +zk_approximate_data_size 42533 +zk_key_arena_size 28672 +zk_latest_snapshot_size 0 +zk_open_file_descriptor_count 182 +zk_max_file_descriptor_count 18446744073709551615 +# highlight-start +zk_followers 2 +zk_synced_followers 2 +# highlight-end +``` + +#### ClickHouseサーバーの起動 + +各ClickHouseサーバーで +``` +sudo service clickhouse-server start +``` + +#### ClickHouseサーバーの確認 + +[クラスター設定](#define-a-cluster)を追加することで、2つのClickHouseノードにレプリケートされた単一のシャードが定義されました。この確認ステップでは、ClickHouseが起動した際にクラスターが構築されたことを確認し、そのクラスターを使用してレプリケートされたテーブルを作成します。 +- クラスターが存在することの確認: + ```sql + show clusters + ``` + ```response + ┌─cluster───────┐ + │ cluster_1S_2R │ + └───────────────┘ + + 1 row in set. Elapsed: 0.009 sec. ` + ``` + +- `ReplicatedMergeTree`テーブルエンジンを使用してテーブルを作成します: + ```sql + create table trips on cluster 'cluster_1S_2R' ( + `trip_id` UInt32, + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_datetime` DateTime, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `tip_amount` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4)) + ENGINE = ReplicatedMergeTree + PARTITION BY toYYYYMM(pickup_date) + ORDER BY pickup_datetime + SETTINGS index_granularity = 8192, storage_policy='s3_main' + ``` + ```response + ┌─host────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐ + │ chnode1 │ 9000 │ 0 │ │ 1 │ 0 │ + │ chnode2 │ 9000 │ 0 │ │ 0 │ 0 │ + └─────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘ + ``` +- 以前に定義したマクロの使用を理解する + + `shard` と `replica` のマクロは[以前に定義しました](#define-a-cluster)が、以下の行で各ClickHouseノード上でそれらの値がどのように置き換えられるかを見ることができます。また、`uuid` という値が使用されます;`uuid` はシステムによって生成されるのでマクロで定義されていません。 + ```sql + SELECT create_table_query + FROM system.tables + WHERE name = 'trips' + FORMAT Vertical + ``` + ```response + Query id: 4d326b66-0402-4c14-9c2f-212bedd282c0 + + Row 1: + ────── + create_table_query: CREATE TABLE default.trips (`trip_id` UInt32, `pickup_date` Date, `pickup_datetime` DateTime, `dropoff_datetime` DateTime, `pickup_longitude` Float64, `pickup_latitude` Float64, `dropoff_longitude` Float64, `dropoff_latitude` Float64, `passenger_count` UInt8, `trip_distance` Float64, `tip_amount` Float32, `total_amount` Float32, `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4)) + # highlight-next-line + ENGINE = ReplicatedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}') + PARTITION BY toYYYYMM(pickup_date) ORDER BY pickup_datetime SETTINGS index_granularity = 8192, storage_policy = 's3_main' + + 1 row in set. Elapsed: 0.012 sec. + ``` + :::note + 上記で示されている`clickhouse/tables/{uuid}/{shard}` というzookeeperパスをカスタマイズするには、`default_replica_path` および `default_replica_name` を設定できます。ドキュメントは[こちら](/docs/ja/operations/server-configuration-parameters/settings.md/#default_replica_path)です。 + ::: + +### テスト + +これらのテストは、データが2つのサーバー間でレプリケーションされていることと、S3バケットに保存されていることを確認します。 + +- ニューヨーク市タクシーデータセットからデータを追加: + ```sql + INSERT INTO trips + SELECT trip_id, + pickup_date, + pickup_datetime, + dropoff_datetime, + pickup_longitude, + pickup_latitude, + dropoff_longitude, + dropoff_latitude, + passenger_count, + trip_distance, + tip_amount, + total_amount, + payment_type + FROM s3('https://ch-nyc-taxi.s3.eu-west-3.amazonaws.com/tsv/trips_{0..9}.tsv.gz', 'TabSeparatedWithNames') LIMIT 1000000; + ``` +- データがS3に保存されていることを確認。 + + このクエリはディスク上のデータサイズと使用されるディスクを決定するポリシーを表示します。 + ```sql + SELECT + engine, + data_paths, + metadata_path, + storage_policy, + formatReadableSize(total_bytes) + FROM system.tables + WHERE name = 'trips' + FORMAT Vertical + ``` + ```response + Query id: af7a3d1b-7730-49e0-9314-cc51c4cf053c + + Row 1: + ────── + engine: ReplicatedMergeTree + data_paths: ['/var/lib/clickhouse/disks/s3_disk/store/551/551a859d-ec2d-4512-9554-3a4e60782853/'] + metadata_path: /var/lib/clickhouse/store/e18/e18d3538-4c43-43d9-b083-4d8e0f390cf7/trips.sql + storage_policy: s3_main + formatReadableSize(total_bytes): 36.42 MiB + + 1 row in set. Elapsed: 0.009 sec. + ``` + + ローカルディスク上のデータサイズを確認します。上記の通り、ローカルディスク上の数百万行データのサイズは36.42 MiBです。これはS3上にあり、ローカルディスクにはないはずです。上記のクエリはまたローカルディスク上にデータおよびメタデータがどこに保存されているかを示しています。ローカルデータをチェックしてください: + ```response + root@chnode1:~# du -sh /var/lib/clickhouse/disks/s3_disk/store/551 + 536K /var/lib/clickhouse/disks/s3_disk/store/551 + ``` + + 各S3バケットのデータサイズを確認します(総量は表示されていませんが、挿入後にはどちらのバケットも約36 MiBを格納しています): + + ![最初のS3バケット内のサイズ](./images/bucket1.png) + + ![第二のS3バケット内のサイズ](./images/bucket2.png) + +## S3Express + +[S3Express](https://aws.amazon.com/s3/storage-classes/express-one-zone/) はAmazon S3の新しい高性能な単一アベイラビリティゾーンストレージクラスです。 + +ClickHouseでS3Expressをテストした経験については、この[ブログ](https://aws.amazon.com/blogs/storage/clickhouse-cloud-amazon-s3-express-one-zone-making-a-blazing-fast-analytical-database-even-faster/) を参照できます。 + +:::note +S3Expressは単一AZ内にデータを保存します。したがって、AZ が停止した場合にはデータが利用できなくなります。 +::: + +### S3ディスク + +S3Expressバケットをバックアップとするストレージでテーブルを作成するには、以下の手順が必要です: + +1. `Directory`タイプのバケットを作成 +2. 必要なすべての権限をS3ユーザーに付与する適切なバケットポリシーのインストール(例:`"Action": "s3express:*"` を使用して無制限のアクセスを許可) +3. ストレージポリシーを設定する際に`region`パラメータを指定 + +ストレージ設定は通常のS3と同様で、例としては次のようになります: + +``` xml + + + + s3 + https://my-test-bucket--eun1-az1--x-s3.s3express-eun1-az1.eu-north-1.amazonaws.com/store/ + eu-north-1 + ... + ... + + + + + +
+ s3_express +
+
+
+
+
+``` + +そして、新しいストレージでテーブルを作成します: + +``` sql +CREATE TABLE t +( + a UInt64, + s String +) +ENGINE = MergeTree +ORDER BY a +SETTINGS storage_policy = 's3_express'; +``` + +### S3ストレージ + +S3ストレージも`Object URL`パスに対してのみサポートされています。例: + +``` sql +select * from s3('https://test-bucket--eun1-az1--x-s3.s3express-eun1-az1.eu-north-1.amazonaws.com/file.csv', ...) +``` + +また、設定にバケットのリージョンを指定する必要があります: + +``` xml + + + https://test-bucket--eun1-az1--x-s3.s3express-eun1-az1.eu-north-1.amazonaws.com + eu-north-1 + + +``` + +### バックアップ + +上記で作成したディスクにバックアップを保存することが可能です: + +``` sql +BACKUP TABLE t TO Disk('s3_express', 't.zip') + +┌─id───────────────────────────────────┬─status─────────┐ +│ c61f65ac-0d76-4390-8317-504a30ba7595 │ BACKUP_CREATED │ +└──────────────────────────────────────┴────────────────┘ +``` + +``` sql +RESTORE TABLE t AS t_restored FROM Disk('s3_express', 't.zip') + +┌─id───────────────────────────────────┬─status───┐ +│ 4870e829-8d76-4171-ae59-cffaf58dea04 │ RESTORED │ +└──────────────────────────────────────┴──────────┘ +``` diff --git a/docs/ja/integrations/data-ingestion/s3/performance.md b/docs/ja/integrations/data-ingestion/s3/performance.md new file mode 100644 index 00000000000..5ecae3db830 --- /dev/null +++ b/docs/ja/integrations/data-ingestion/s3/performance.md @@ -0,0 +1,392 @@ +--- +slug: /ja/integrations/s3/performance +sidebar_position: 2 +sidebar_label: パフォーマンスの最適化 +title: S3挿入と読み取りパフォーマンスの最適化 +description: S3の読み取りと挿入のパフォーマンスの最適化 +--- + +このセクションでは、[s3テーブル関数](/docs/ja/sql-reference/table-functions/s3)を使用してS3からデータを読み取ったり、挿入したりする際のパフォーマンス最適化に焦点を当てています。 + +:::info +**このガイドで説明するレッスンは、[GCS](/docs/ja/sql-reference/table-functions/gcs)や[Azure Blob Storage](/docs/ja/sql-reference/table-functions/azureBlobStorage)など独自のテーブル関数を持つ他のオブジェクトストレージ実装にも適用できます。** +::: + +挿入パフォーマンスを向上させるためにスレッドやブロックサイズを調整する前に、S3挿入のメカニズムを理解することをお勧めします。挿入メカニズムに精通している場合や、いくつかのクイックヒントを知りたい場合は、以下の[例](/docs/ja/integrations/s3/performance#example-dataset)にスキップしてください。 + +## 挿入メカニズム(単一ノード) + +ハードウェアのサイズに加えて、ClickHouseのデータ挿入メカニズム(単一ノード用)のパフォーマンスとリソース使用量に影響を与える主な要因は**挿入ブロックサイズ**と**挿入の並列度**です。 + +### 挿入ブロックサイズ + +![insert_mechanics](./images/insert_mechanics.png) + +`INSERT INTO SELECT`を実行すると、ClickHouseはデータの一部を受け取り、① 各[パーティショニングキー](/docs/ja/engines/table-engines/mergetree-family/custom-partitioning-key)ごとにメモリ内挿入ブロックを少なくとも1つ形成します。ブロック内のデータがソートされ、テーブルエンジン特有の最適化が適用されます。データは圧縮された後、② データベースストレージに新しいデータ部分として書き込まれます。 + +挿入ブロックサイズは、ClickHouseサーバーの[ディスクファイルI/O使用量](https://en.wikipedia.org/wiki/Category:Disk_file_systems)とメモリ使用量の両方に影響します。より大きな挿入ブロックは、より多くのメモリを使用しますが、初期パーツの生成をより大きくし、減少させます。ClickHouseが大量のデータをロードする際に必要とするパーツが少なくなるほど、ディスクファイルI/Oと自動的に必要とされる[バックグラウンドマージの数](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges)も少なくなります。 + +統合テーブルエンジンやテーブル関数との`INSERT INTO SELECT`クエリを使用すると、データはClickHouseサーバーによってプルされます: + +![pull data](./images/pull.png) + +データが完全にロードされるまでは、サーバーはループを実行します: + +```bash +① 次のデータ部分をプルして解析し、メモリ内データブロック(各パーティショニングキー用)を形成します。 + +② ブロックを新しいパーツとしてストレージに書き込みます。 + +①に戻る +``` + +①では、サイズは挿入ブロックの大きさに依存し、これは2つの設定で制御できます: + +- [`min_insert_block_size_rows`](https://clickhouse.com/docs/ja/operations/settings/settings#min-insert-block-size-rows)(デフォルト:`1048545`万行) +- [`min_insert_block_size_bytes`](https://clickhouse.com/docs/ja/operations/settings/settings#min-insert-block-size-bytes)(デフォルト:`256 MiB`) + +指定された行数が挿入ブロックに集まるか、設定されたデータ量に達すると(どちらかが先に起こる)、そのブロックは新しいパーツに書き込まれるトリガーとなります。挿入ループはステップ①で続きます。 + +`min_insert_block_size_bytes`の値は非圧縮メモリ内ブロックサイズを示し(圧縮済みのディスクセットサイズではありません)、作成されたブロックとパーツが設定された行数やバイト数を必ずしも正確に含んでいるわけではありません。これはClickHouseがデータを行-[ブロック](https://clickhouse.com/docs/ja/operations/settings/settings#setting-max_block_size)単位でストリーミングし、[処理](https://clickhouse.com/company/events/query-performance-introspection)するため、これらの設定は最低限の閾値を指定します。 + +#### マージに注意する + +設定された挿入ブロックサイズが小さいほど、大量のデータ負荷で生成される初期パーツは増え、データの取り込みと並行して実行されるバックグラウンドパーツマージが多くなるため、リソース競合(CPUとメモリ)が発生し、取り込み終了後に[健全な](/docs/ja/operations/settings/merge-tree-settings#parts-to-throw-insert)(3000)パーツ数に到達するまで追加の時間が必要になります。 + +:::important +ClickHouseのクエリパフォーマンスは、パーツ数が[推奨制限](/docs/ja/operations/settings/merge-tree-settings#parts-to-throw-insert)を超えると悪影響を受けます。 +::: + +ClickHouseは[マージパーツ](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse#data-needs-to-be-batched-for-optimal-performance)を継続的に実行し、[圧縮レベルに到達するまで](/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool)~150 GiBのサイズまでパーツを大きくしていきます。このダイアグラムは、ClickHouseサーバーがパーツをどのようにマージするかを示しています: + +![merges](./images/merges.png) + +単一のClickHouseサーバーは、いくつかの[バックグラウンドマージスレッド](/docs/ja/operations/server-configuration-parameters/settings#background_pool_size)を使用して並行して[パーツマージ](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges:~:text=to%20execute%20concurrent-,part%20merges,-.%20Each%20thread%20executes)を実行します。各スレッドはループを実行します: + +```bash +① 次にどのパーツをマージするかを決定し、それらをメモリにブロックとしてロード。 + +② メモリ内のロードされたブロックを大きなブロックにマージ。 + +③ マージされたブロックを新しいディスクパーツに書き込みます。 + +①に戻る +``` + +[CPUコアとRAMサイズの増加](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#hardware-size)がバックグラウンドマージスループットを増加させることに注意してください。 + +大きなパーツにマージされたパーツは[非アクティブ](/docs/ja/operations/system-tables/parts)としてマークされ、最終的に[設定可能な](/docs/ja/operations/settings/merge-tree-settings#old-parts-lifetime)時間が経過した後に削除されます。時間とともに、マージされたパーツのツリーを作成します(そのため[`MergeTree`](/docs/ja/engines/table-engines/mergetree-family)テーブルと呼ばれます)。 + +### 挿入の並列性 + +![resource_usage](./images/resource_usage.png) + +ClickHouseサーバーはデータを並行して処理し、挿入できます。挿入の並列度は、ClickHouseサーバーの取り込みスループットとメモリ使用量に影響を及ぼします。データを並行してロードおよび処理するには、メインメモリが多く必要ですが、データが迅速に処理されるため、取り込みスループットが向上します。 + +s3のようなテーブル関数では、globパターンを使用して読み込むファイル名のセットを指定することができます。globパターンが複数のファイルに一致する場合、ClickHouseはこれらのファイルを並行して読み込み、それにあるデータをテーブルに挿入することで並行して挿入スレッドを利用できます(サーバー単位): + +![insert_threads](./images/insert_threads.png) + +すべてのデータがすべてのファイルから処理されるまで、各挿入スレッドはループを実行します: + +```bash +① 未処理のファイルデータ(部分サイズは設定されたブロックサイズに基づいている)の次の部分を取得し、メモリ内データブロックを作成します。 + +② ブロックをストレージに新しいパーツとして書き込みます。 + +①に戻る。 +``` + +このような並行挿入スレッドの数は、[`max_insert_threads`](https://clickhouse.com/docs/ja/operations/settings/settings#settings-max-insert-threads)設定で設定できます。デフォルト値は、オープンソースのClickHouseでは`1`、[ClickHouse Cloud](https://clickhouse.com/cloud)では`4`です。 + +大量のファイルがある場合、複数の挿入スレッドによる並行処理がうまく機能し、利用可能なCPUコアとネットワーク帯域幅(並行ファイルダウンロードのため)を完全に saturatすることができます。数個の大きなファイルだけをテーブルにロードするシナリオでは、ClickHouseは自動的に高いデータ処理の並列度を確立し、大きなファイル内の異なる範囲を並行して読むために挿入スレッドごとに追加のリーダースレッドを生成し、ネットワーク帯域幅の使用を最適化します。 + +s3関数とテーブルの場合、個々のファイルの並行ダウンロードは、[max_download_threads](https://clickhouse.com/codebrowser/ClickHouse/src/Core/Settings.h.html#DB::SettingsTraits::Data::max_download_threads)と[max_download_buffer_size](https://clickhouse.com/codebrowser/ClickHouse/src/Core/Settings.h.html#DB::SettingsTraits::Data::max_download_buffer_size)の値によって決定されます。ファイルは、そのサイズが`2 * max_download_buffer_size`を超える場合にのみ並行してダウンロードされます。デフォルトでは`max_download_buffer_size`デフォルトは10MiBに設定されています。一部のケースでは、このバッファサイズを50MB(`max_download_buffer_size=52428800`)に安全に増やすことができ、ファイルが単一スレッドによってダウンロードされることを確保します。これにより、各スレッドがS3コールに費やす時間を短縮し、S3待ち時間も短くなる可能性があります。また、並行読み取りに対してファイルが小さすぎる場合、スループットを向上させるためにClickHouseは自動的にデータを事前に読み込みし、こうしたファイルを非同期で事前読み込みすることでスループットを向上させます。 + +## パフォーマンスの測定 + +S3テーブル関数を使用したクエリのパフォーマンスを最適化する必要があります。これは、本番環境のデータに対してクエリを実行する場合、つまり、ClickHouseの計算のみが使用され、データがオリジナルの形式でS3に残る場合、およびClickHouse MergeTreeテーブルエンジンにS3からデータを挿入する場合です。指定がない限り、以下の推奨事項は両方のシナリオに適用されます。 + +## ハードウェアサイズの影響 + +![Hardware size](./images/hardware_size.png) + +利用可能なCPUコアの数とRAMサイズは、以下に影響を与えます: + +- サポートされる[初期パーツサイズ](#insert-block-size) +- 可能な[挿入の並列度](#insert-parallelism) +- [バックグラウンドパーツマージ](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges)のスループット + +したがって、全体的な取り込みスループットに影響します。 + +## リージョンのローカリティ + +バケットがClickHouseインスタンスと同じリージョンに配置されていることを確認してください。この単純な最適化により、特にAWSインフラストラクチャでClickHouseインスタンスをデプロイする場合、スループットパフォーマンスが劇的に向上する可能性があります。 + +## フォーマット + +ClickHouseは、`s3`関数と`S3`エンジンを使用して、[サポートされているフォーマット](/docs/ja/interfaces/formats.md/#data-formatting)でS3バケットに格納されているファイルを読み取ることができます。生のファイルを読む場合、これらのフォーマットには異なる利点があります: + +* Native、Parquet、CSVWithNames、TabSeparatedWithNamesのようなカラム名がエンコードされたフォーマットは、クエリがより簡素化されます。これにより、ユーザーが`s3`関数でカラム名を指定する必要がなくなります。カラム名によってこの情報が推測できるからです。 +* フォーマットによって、読み取りと書き込みスループットに関してパフォーマンスが異なることがあります。NativeとParquetは、すでに列指向でよりコンパクトであるため、読み取りパフォーマンスに最適です。Nativeフォーマットは、ClickHouseがデータをメモリ内で格納する方法と一致するため、データをClickHouseにストリーミングする際の処理オーバーヘッドを削減するという利点もあります。 +* 大きなファイルを読み取る際には、ブロックサイズが読み取りのレイテンシに影響を与えることがよくあります。特にデータをサンプリングする場合(例:最上位のN行を返す)などです。CSVやTSVのようなフォーマットでは、行セットを返すためにファイルを解析する必要があります。NativeやParquetのようなフォーマットは、その結果としてより高速にサンプリングを許可します。 +* 各圧縮フォーマットは、圧縮レベル、速度、圧縮または解凍パフォーマンスを均衡させるという長所と短所を持ってきます。CSVやTSVのような生ファイルを圧縮する場合、lz4は最速の解凍パフォーマンスを提供し、圧縮レベルを犠牲にします。gzipは通常、圧縮を改善するが、若干の読み取り速度を犠牲にします。xzはさらに進んで最高の圧縮を提供し、圧縮と解凍のパフォーマンスが最も低下します。エクスポートする場合、gzとlz4は比較的同じ速度で圧縮します。これを接続速度と比較してください。圧縮や解凍の速度から得られる利点は、s3バケットへの接続が遅い場合には簡単に無効になります。 +* NativeまたはParquetのようなフォーマットは通常、圧縮のオーバーヘッドを正当化するものではありません。データサイズの削減は、おそらく最小限のものであるため、これらのフォーマットは元来コンパクトです。特にs3がグローバルに利用可能で高帯域幅であるため、ネットワーク転送時間を十分にオフセットすることはほとんどありません。 + +## 例のデータセット + +さらなる最適化を図るために、[Stack Overflowデータセットからの投稿](/docs/ja/data-modeling/schema-design#stack-overflow-dataset)を使用して、クエリと挿入パフォーマンスの両方を最適化します。 + +このデータセットは、2008年7月から2024年3月までの毎月の投稿に関する189のParquetファイルで構成されています。 + +我々は上記の[推奨事項](#formats)に従い、パフォーマンスの向上のためにParquetを使用し、バケットと同じ地域に配置されたClickHouseクラスタで全てのクエリを実行します。このクラスタには3つのノードがあり、それぞれ32GiBのRAMと8つのvCPUを持っています。 + +調整なしで、MergeTreeテーブルエンジンにこのデータセットを挿入し、最も多くの質問をしたユーザーを計算するクエリを実行するパフォーマンスを示します。これらのクエリは、意図的にデータ全体をスキャンする必要があります。 + +```sql +-- トップユーザー名 +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 + +┌─OwnerDisplayName─┬─num_posts─┐ +│ user330315 │ 10344 │ +│ user4039065 │ 5316 │ +│ user149341 │ 4102 │ +│ user529758 │ 3700 │ +│ user3559349 │ 3068 │ +└──────────────────┴───────────┘ + +5 rows in set. Elapsed: 3.013 sec. Processed 59.82 million rows, 24.03 GB (19.86 million rows/s., 7.98 GB/s.) +Peak memory usage: 603.64 MiB. + +-- postsテーブルにロード +INSERT INTO posts SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') + +0 rows in set. Elapsed: 191.692 sec. Processed 59.82 million rows, 24.03 GB (312.06 thousand rows/s., 125.37 MB/s.) +``` + +この例では数行しか返しません。`SELECT`クエリのパフォーマンスを測定する場合、大量のデータがクライアントに返されることを避けるためにクエリには[nullフォーマット](/docs/ja/interfaces/formats/#null)を利用するか、結果を[`Null`エンジン](/docs/ja/engines/table-engines/special/null.md)に直接送るべきです。これによりクライアントがデータで圧倒されることやネットワークの飽和を避けることができます。 + +:::info +クエリを読む時、初回のクエリは再実行された場合に比べて遅く見えることがよくあります。これはS3自身のキャッシングと[ClickHouseのスキーマ推測キャッシュ](/docs/ja/operations/system-tables/schema_inference_cache)の双方に起因します。これはファイルの推測されたスキーマを保存し、その結果、繰り返しアクセス時に推測ステップをスキップできるため、クエリ時間を短縮します。 +::: + +## 読み取り用のスレッドの使用 + +S3上での読み取りパフォーマンスは、ネットワーク帯域幅やローカルI/Oによって制限されていない限り、コア数に比例してスケールします。スレッド数を増やすことは、ユーザーが認識しておくべきメモリオーバーヘッドを持っています。以下の設定を調整することで、読み取りスループット性能が向上する可能性があります: + +* 通常、`max_threads`のデフォルト値(コアの数)が十分です。クエリに使用されるメモリの量が多く、この量を削減する必要がある、または結果に`LIMIT`が低い場合、この値を低く設定することができます。メモリに余裕があるユーザーは、この値を増やして、より高い読み取りスループットの可能性を追求することが望ましいでしょう。通常、これはコア数の少ないマシン、つまり10未満の場合にのみ有益です。さらなる並列化の利益は、他のリソースがボトルネックとして作用するとされ、通常は減少します。例えば、ネットワークとCPUの競合です。 +* 22.3.1以前のClickHouseのバージョンは、`s3`関数や`S3`テーブルエンジンを使用する際、複数のファイルにわたって読み取りを並列化しました。最適な読み取りパフォーマンスを達成するために、S3上でファイルをチャンクに分割し、読み取りにグロブパターンを使用する必要がありました。最新のバージョンは、ファイル内でのダウンロードを並列化します。 +* 低スレッド数のシナリオでは、ユーザーは`remote_filesystem_read_method`を「read」に設定して、S3からファイルの同期読み取りを行うことで利益を得ることができます。 +* s3関数とテーブルの場合、個別のファイルの並列ダウンロードは、`max_download_threads`と`max_download_buffer_size`の値によって決定されます。ファイルは、そのサイズが2 * `max_download_buffer_size`を超える場合にのみ並行してダウンロードされます。デフォルトでは、`max_download_buffer_size`のデフォルトは10MiBに設定されています。一部のケースでは、このバッファサイズを50 MB(`max_download_buffer_size=52428800`)に安全に増やすことができ、各ファイルが単一スレッドによってダウンロードされることを確保します。これにより、各スレッドがS3コールに費やす時間を短縮し、S3待ち時間も短くなる可能性があります。[このブログポスト](https://clickhouse.com/blog/clickhouse-1-trillion-row-challenge)を参考にしてください。 + +パフォーマンスを向上させるための変更を行う前に、適切に測定することを確認してください。S3 APIコールは遅延に敏感であり、クライアントのタイミングに影響を与える可能性があるため、パフォーマンス指標にはクエリログ、すなわち`system.query_log`を使用してください。 + +ここでのクエリを例に、`max_threads`を倍増して16に設定すると(デフォルトで`max_threads`はノードのコア数)、読み取りクエリ性能が2倍向上し、メモリが増える代わりに。さらなる`max_threads`の増加は減衰するリターンを示します。 + +```sql +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 +SETTINGS max_threads = 16 + +┌─OwnerDisplayName─┬─num_posts─┐ +│ user330315 │ 10344 │ +│ user4039065 │ 5316 │ +│ user149341 │ 4102 │ +│ user529758 │ 3700 │ +│ user3559349 │ 3068 │ +└──────────────────┴───────────┘ + +5 rows in set. Elapsed: 1.505 sec. Processed 59.82 million rows, 24.03 GB (39.76 million rows/s., 15.97 GB/s.) +Peak memory usage: 178.58 MiB. + +SETTINGS max_threads = 32 + +5 rows in set. Elapsed: 0.779 sec. Processed 59.82 million rows, 24.03 GB (76.81 million rows/s., 30.86 GB/s.) +Peak memory usage: 369.20 MiB. + +SETTINGS max_threads = 64 + +5 rows in set. Elapsed: 0.674 sec. Processed 59.82 million rows, 24.03 GB (88.81 million rows/s., 35.68 GB/s.) +Peak memory usage: 639.99 MiB. +``` + +## 挿入用スレッドとブロックサイズの調整 + +最大の取り込み性能を達成するには、(1)挿入ブロックサイズを選択し、(2)利用可能なCPUコアとRAMに基づいて適切な挿入の並列度を選択する必要があります。まとめると: + +- [挿入ブロックサイズを大きく設定するほど](#insert-block-size)、ClickHouseが作成するパーツが少なくなり、[ディスクファイル入出力](https://en.wikipedia.org/wiki/Category:Disk_file_systems)や[バックグラウンドマージ](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part1#more-parts--more-background-part-merges)が少なくなります。 +- [並行挿入スレッドの数を多く設定するほど](#insert-parallelism)、データはより迅速に処理されます。 + +これら2つの性能要因間には対立するトレードオフがあります(バックグラウンドパーツのマージともトレードオフがあります)。ClickHouseサーバーのメインメモリの量には制限があります。より大きなブロックはより多くのメインメモリを使用するため、利用可能な並行挿入スレッドの数を制限します。反対に、より多くの並行挿入スレッドはより多くのメインメモリを必要とし、メモリ内で同時に作成される挿入ブロックの数を制限します。さらに、挿入スレッドとバックグラウンドマージスレッド間のリソース競合が発生する可能性があります。高い数の配置された挿入スレッドは(1)マージする必要があるパーツを多く生成し、(2)バックグラウンドマージスレッドからCPUコアとメモリスペースを奪います。 + +[このブログポスト](https://clickhouse.com/blog/supercharge-your-clickhouse-data-loads-part2)を読むことをお勧めします。このパラメータの動作がどのように性能とリソースに影響を与えるかをより詳細に説明しています。チューニングが2つのパラメータの微妙なバランスを含むことがあることを示しています。この徹底的なテストは実用的でない場合があるため、まとめとして、次のことをお勧めします: + +```bash +• max_insert_threads:挿入スレッドに利用可能なCPUコアの約半分を選択します(バックグラウンドマージ専用のコアを十分に残します)。 + +• peak_memory_usage_in_bytes:意図したピークメモリ使用量を選択します。それが単独の取り込みである場合はすべての利用可能なRAM、他の同時タスクのために半分またはそれ以下を選択します。 + +次に: +min_insert_block_size_bytes = peak_memory_usage_in_bytes / (~3 * max_insert_threads) +``` + +この計算式を使用するときは、`min_insert_block_size_rows`を0に設定して(行ベースの閾値を無効にするため)、最大スレッド数を選択した値に設定し、`min_insert_block_size_bytes`を上記の計算結果に基づいて設定します。 + +上記の計算式を使用して、Stack Overflowの例を取り上げます。 + +- `max_insert_threads=4`(ノードあたり8コア) +- `peak_memory_usage_in_bytes` - 32 GiB(ノードリソースの100%)または`34359738368`バイト +- `min_insert_block_size_bytes` = `34359738368/(3*4) = 2863311530` + +```sql +INSERT INTO posts SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') SETTINGS min_insert_block_size_rows=0, max_insert_threads=4, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 128.566 sec. Processed 59.82 million rows, 24.03 GB (465.28 thousand rows/s., 186.92 MB/s.) +``` + +示されているように、これらの設定を調整することで、挿入性能が33%を超えて向上しました。単一ノードのパフォーマンスをさらに向上させるために、他の設定を調整することをユーザーにお任せします。 + +## リソースとノードでのスケーリング + +リソースとノードによるスケーリングは、読み取りおよび挿入クエリの両方に適用されます。 + +### 垂直スケーリング + +前の調整とクエリは、ClickHouse Cloudクラスター内の単一ノードしか使用していません。ユーザーには通常、ClickHouseのノードが複数利用可能です。ユーザーは最初に垂直スケーリングを行い、コア数に比例してS3スループットを向上させることをお勧めします。以前の挿入と読み取りクエリを再実行し、適切な設定でリソースを二倍にしてClickHouse Cloudノードを利用すると、どちらも約二倍速く実行されます。 + +```sql +INSERT INTO posts SELECT * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') SETTINGS min_insert_block_size_rows=0, max_insert_threads=8, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 67.294 sec. Processed 59.82 million rows, 24.03 GB (888.93 thousand rows/s., 357.12 MB/s.) + +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 +SETTINGS max_threads = 92 + +5 rows in set. Elapsed: 0.421 sec. Processed 59.82 million rows, 24.03 GB (142.08 million rows/s., 57.08 GB/s.) +``` + +:::note +個々のノードは、ネットワークやS3 GETリクエストによってもボトルネックとなり、垂直的なパフォーマンスのスケーリングを妨げる可能性があります。 +::: + +### 水平スケーリング + +最終的に、ハードウェアの利用可能性やコスト効率により、水平スケーリングが必要になることがよくあります。ClickHouse Cloudでは、本番クラスターは少なくとも3つのノードがあります。挿入についても全てのノードを利用することをユーザーは検討するでしょう。 + +S3のリーディングの利用は、[クラスターの利用](./index.md#utilizing-clusters)で説明したように、`s3Cluster`関数を使用する必要があります。これにより、リーディングがノード間で分散されます。 + +クエリを最初に受け取ったサーバーは、最初にグロブパターンを解決し、処理を動的に自身と他のサーバーに分散させます。 + +![s3Cluster](./images/s3Cluster.png) + +以前のリードクエリを3つのノードに負荷を分散し、クエリを`s3Cluster`を使用するよう調整します。これはClickHouse Cloudで自動的に、`default`クラスターを参照することで行われます。 + +[クラスターの利用](#utilizing-clusters)に示されているように、この作業はファイルレベルで分散されます。利用者がこの機能を活用するには、ノード数を超えるファイルが十分に必要です。 + +```sql +SELECT + OwnerDisplayName, + count() AS num_posts +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +WHERE OwnerDisplayName NOT IN ('', 'anon') +GROUP BY OwnerDisplayName +ORDER BY num_posts DESC +LIMIT 5 +SETTINGS max_threads = 16 + +┌─OwnerDisplayName─┬─num_posts─┐ +│ user330315 │ 10344 │ +│ user4039065 │ 5316 │ +│ user149341 │ 4102 │ +│ user529758 │ 3700 │ +│ user3559349 │ 3068 │ +└──────────────────┴───────────┘ + +5 rows in set. Elapsed: 0.622 sec. Processed 59.82 million rows, 24.03 GB (96.13 million rows/s., 38.62 GB/s.) +Peak memory usage: 176.74 MiB. +``` + +同様に、原挿入クエリを分散し、単一ノード用に以前見つけた設定を使用します: + +```sql +INSERT INTO posts SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') SETTINGS min_insert_block_size_rows=0, max_insert_threads=4, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 171.202 sec. Processed 59.82 million rows, 24.03 GB (349.41 thousand rows/s., 140.37 MB/s.) +``` + +読み込むファイルの数が性能向上を示しているが、挿入性能を示していないことが分かります。デフォルトでは、リーディングは`s3Cluster`を使用して分散されますが、挿入は初期ノードに対してのみ発生します。これは、ノードごとに挿入スレッドを生成することでネットワーク待ち時間のオーバーヘッドが削減され、計算領域が挿入プロセス専用に設定されるため、バックグラウンドマージの負荷も削減します。シナリオの高スループットでこのボトルネックが発生する可能性があります。これに対処するには、`s3cluster`関数のパラメーター`parallel_distributed_insert_select`を設定します。 + +これを`parallel_distributed_insert_select=2`に設定することで、`SELECT`と`INSERT`が、各ノードの分散エンジンの基礎テーブルから/に対して並行に実行されるようにします。 + +```sql +INSERT INTO posts +SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows=0, max_insert_threads=4, min_insert_block_size_bytes=2863311530 + +0 rows in set. Elapsed: 54.571 sec. Processed 59.82 million rows, 24.03 GB (1.10 million rows/s., 440.38 MB/s.) +Peak memory usage: 11.75 GiB. +``` + +期待された通り、これにより挿入パフォーマンスが3倍向上します。 + +## さらなる調整 + +### 重複除去の無効化 + +挿入操作は、タイムアウトなどのエラーにより失敗することがあります。挿入が失敗すると、データが正常に挿入されたかどうかにかかわらず、クライアントによって再試行される可能性があります。分散配置(ClickHouse Cloudなど)では、ClickHouseはデータがすでに正常に挿入されたかどうかを確認し、挿入されたデータが重複としてマークされている場合、データを目的のテーブルに挿入しません。ただし、ユーザーには通常の挿入が行われたかのように成功状態を受け取ります。 + +この動作は挿入オーバーヘッドをもたらし、クライアントからデータをロードする際やバッチで意味がありますが、オブジェクトストレージからの`INSERT INTO SELECT`実行時には不要になることがあります。この機能を無効にすることで、性能を向上させることが示されます: + +```sql +INSERT INTO posts +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows = 0, max_insert_threads = 4, min_insert_block_size_bytes = 2863311530, insert_deduplicate = 0 +SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows = 0, max_insert_threads = 4, min_insert_block_size_bytes = 2863311530, insert_deduplicate = 0 + +0 rows in set. Elapsed: 52.992 sec. Processed 59.82 million rows, 24.03 GB (1.13 million rows/s., 453.50 MB/s.) +Peak memory usage: 26.57 GiB. +``` + +### 挿入時の最適化 + +ClickHouseの`optimize_on_insert`設定は、挿入プロセス中にデータ部分がマージされるかどうかを制御します。有効にすると(デフォルトでは`optimize_on_insert = 1`)、小さいパーツが挿入時により大きなものにマージされ、読み込みパフォーマンスが向上する大きなパ-ツにとりこまれます。ただし、これに付随する挿入プロセスのオーバーヘッドがある可能性があります。 + +この設定を無効にすると(`optimize_on_insert = 0`)、挿入時のマージをスキップすることで、データを更に迅速に書き込みます。特に頻繁な小挿入時には、マージプロセスはバックグラウンドにて後回しされ、より高い挿入性能が可能になりますが、一時的に小さいパーツが増加する可能性があり、バックグラウンドマージが完了するまではクエリが遅くなる可能性があります。これは、挿入性能が優先事項で、バックグラウンドのマージプロセスが後で効率的に最適化できる場合に最適な設定です。設定を無効にすることで挿入スループットを改善できることが示されています: + +```sql +SELECT * +FROM s3Cluster('default', 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/by_month/*.parquet') +SETTINGS parallel_distributed_insert_select = 2, min_insert_block_size_rows = 0, max_insert_threads = 4, min_insert_block_size_bytes = 2863311530, insert_deduplicate = 0, optimize_on_insert = 0 + +0 rows in set. Elapsed: 49.688 sec. Processed 59.82 million rows, 24.03 GB (1.20 million rows/s., 483.66 MB/s.) +``` + +## その他のメモ + +* メモリが少ないシナリオでは、S3に挿入する場合、`max_insert_delayed_streams_for_parallel_write`を下げることを検討してください。 diff --git a/docs/ja/integrations/data-visualization.md b/docs/ja/integrations/data-visualization.md new file mode 100644 index 00000000000..9345e593c6c --- /dev/null +++ b/docs/ja/integrations/data-visualization.md @@ -0,0 +1,60 @@ +--- +sidebar_label: 概要 +sidebar_position: 1 +keywords: [clickhouse, connect, explo, tableau, grafana, metabase, mitzu, superset, deepnote, draxlr, rocketbi, omni, bi, visualization, tool] +--- + +# ClickHouseでのデータの可視化 + +
+ +
+ +
+ +データがClickHouseに入りましたので、次はデータを分析する時です。これには、BIツールを使って可視化を構築することがよく含まれます。多くの人気のあるBIおよび可視化ツールは、ClickHouseに接続します。一部のツールはClickHouseにそのまま接続可能で、他のツールはコネクタのインストールが必要です。以下のツールに関するドキュメントがあります: + +- [Explo](./data-visualization/explo-and-clickhouse.md) +- [Grafana](./data-visualization/grafana/index.md) +- [Tableau](./data-visualization/tableau-and-clickhouse.md) +- [Looker](./data-visualization/looker-and-clickhouse.md) +- [Metabase](./data-visualization/metabase-and-clickhouse.md) +- [Mitzu](./data-visualization/mitzu-and-clickhouse.md) +- [Omni](./data-visualization/omni-and-clickhouse.md) +- [Superset](./data-visualization/superset-and-clickhouse.md) +- [Deepnote](./data-visualization/deepnote.md) +- [Draxlr](./data-visualization/draxlr-and-clickhouse.md) +- [Rocket BI](./data-visualization/rocketbi-and-clickhouse.md) +- [Rill](https://docs.rilldata.com/reference/olap-engines/clickhouse) +- [Zing Data](./data-visualization/zingdata-and-clickhouse.md) + +## ClickHouse Cloudとデータ可視化ツールの互換性 + +| ツール | サポート via | テスト済み | ドキュメントあり | コメント | +|-------------------------------------------------------------------------|-------------------------------|--------|------------|-------------------------------------------------------------------------------------------------------------------------------------| +| [Apache Superset](./data-visualization/superset-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | | +| [AWS QuickSight](./data-visualization/quicksight-and-clickhouse.md) | MySQLインターフェース | ✅ | ✅ | 一部制限あり、詳細は[ドキュメント](./data-visualization/quicksight-and-clickhouse.md)をご覧ください | +| [Deepnote](./data-visualization/deepnote.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Explo](./data-visualization/explo-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Grafana](./data-visualization/grafana/index.md) | ClickHouse公式コネクタ | ✅ | ✅ | | +| [Hashboard](./data-visualization/hashboard-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Looker](./data-visualization/looker-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | 一部制限あり、詳細は[ドキュメント](./data-visualization/looker-and-clickhouse.md)をご覧ください | +| Looker | MySQLインターフェース | 🚧 | ❌ | | +| [Looker Studio](./data-visualization/looker-studio-and-clickhouse.md) | MySQLインターフェース | ✅ | ✅ | | +| [Metabase](./data-visualization/metabase-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | +| [Mitzu](./data-visualization/mitzu-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Omni](./data-visualization/omni-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | +| [Power BI Desktop](./data-visualization/powerbi-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | ODBC経由で、直接クエリモードをサポート | +| [Power BI service](https://clickhouse.com/docs/ja/integrations/powerbi#power-bi-service) | ClickHouse公式コネクタ | ✅ | ✅ | [Microsoft Data Gateway](https://learn.microsoft.com/en-us/power-bi/connect-data/service-gateway-custom-connectors)の設定が必要 | +| [Rill](https://docs.rilldata.com/reference/olap-engines/clickhouse) | ネイティブコネクタ | ✅ | ✅ | +| [Rocket BI](./data-visualization/rocketbi-and-clickhouse.md) | ネイティブコネクタ | ✅ | ❌ | | +| [Tableau Desktop](./data-visualization/tableau-and-clickhouse.md) | ClickHouse公式コネクタ | ✅ | ✅ | 認証プロセス中 | +| [Tableau Online](./data-visualization/tableau-online-and-clickhouse.md) | MySQLインターフェース | ✅ | ✅ | 一部制限あり、詳細は[ドキュメント](./data-visualization/tableau-online-and-clickhouse.md)をご覧ください | +| [Zing Data](./data-visualization/zingdata-and-clickhouse.md) | ネイティブコネクタ | ✅ | ✅ | | diff --git a/docs/ja/integrations/data-visualization/_category_.yml b/docs/ja/integrations/data-visualization/_category_.yml new file mode 100644 index 00000000000..fd768d017a4 --- /dev/null +++ b/docs/ja/integrations/data-visualization/_category_.yml @@ -0,0 +1,8 @@ +position: 300 +label: 'Data visualization' +collapsible: true +collapsed: true +link: + type: generated-index + title: Data visualization + slug: /ja/integrations/data-visualization diff --git a/docs/ja/integrations/data-visualization/deepnote.md b/docs/ja/integrations/data-visualization/deepnote.md new file mode 100644 index 00000000000..f735bbd04df --- /dev/null +++ b/docs/ja/integrations/data-visualization/deepnote.md @@ -0,0 +1,41 @@ +--- +sidebar_label: Deepnote +sidebar_position: 11 +slug: /ja/integrations/deepnote +keywords: [clickhouse, Deepnote, connect, integrate, notebook] +description: 非常に大きなデータセットを効率的にクエリし、使い慣れたノートブック環境で分析とモデリングを行う。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ClickHouse を Deepnote に接続する + +Deepnote は、チームが発見や知見を共有するために構築された協力型データノートブックです。Jupyter 互換であることに加えて、クラウドで動作し、データサイエンスプロジェクトを効率的に進めるための中央集権的な場所を提供します。 + +このガイドは、すでに Deepnote アカウントがあり、稼働中の ClickHouse インスタンスをお持ちであることを前提としています。 + +## インタラクティブな例 +Deepnote のデータノートブックから ClickHouse にクエリを実行するインタラクティブな例をお探しの場合は、以下のボタンをクリックして、[ClickHouse プレイグラウンド](../../getting-started/playground.md)に接続されたテンプレートプロジェクトを起動してください。 + +[](https://deepnote.com/launch?template=ClickHouse%20and%20Deepnote) + +## ClickHouse に接続する + +1. Deepnote で「Integrations」概要を選択し、ClickHouse タイルをクリックします。 + +ClickHouse integration tile + +2. ClickHouse インスタンスの接続詳細を入力します: + + + ClickHouse details dialog + + **_注意:_** ClickHouse への接続が IP アクセスリストで保護されている場合、Deepnote の IP アドレスを許可する必要があるかもしれません。詳細は [Deepnote のドキュメント](https://docs.deepnote.com/integrations/authorize-connections-from-deepnote-ip-addresses)を参照してください。 +3. おめでとうございます!これで ClickHouse が Deepnote に統合されました。 + +## ClickHouse 統合の使用方法 + +1. ノートブックの右側で ClickHouse 統合に接続を開始します。 + + ClickHouse details dialog +2. 次に、新しい ClickHouse クエリブロックを作成し、データベースにクエリを実行します。クエリ結果はデータフレームとして保存され、SQL ブロックで指定された変数に格納されます。 +3. また、既存の [SQL ブロック](https://docs.deepnote.com/features/sql-cells) を ClickHouse ブロックに変換することもできます。 diff --git a/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md b/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md new file mode 100644 index 00000000000..e7f9fcc2c74 --- /dev/null +++ b/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md @@ -0,0 +1,86 @@ +--- +sidebar_label: Draxlr +sidebar_position: 131 +slug: /ja/integrations/draxlr +keywords: [clickhouse, draxlr, connect, integrate, ui] +description: Draxlrは、データの視覚化と分析を可能にするビジネスインテリジェンスツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# DraxlrをClickHouseに接続する + +Draxlrは、ClickHouseデータベースへの接続を直感的なインターフェースで提供し、チームが数分で洞察を探索、視覚化、公開することを可能にします。このガイドでは、成功した接続を確立するための手順を順を追って説明します。 + +## 1. ClickHouseの認証情報を取得する + + +## 2. DraxlrをClickHouseに接続する + +1. ナビバーで**Connect a Database**ボタンをクリックします。 + +2. 利用可能なデータベースのリストから**ClickHouse**を選択し、次へをクリックします。 + +3. ホスティングサービスのいずれかを選び、次へをクリックします。 + +4. **Connection Name**フィールドに任意の名前を使用します。 + +5. フォームに接続詳細を追加します。 + + Connection Form + +6. **Next**ボタンをクリックし、接続が確立されるまで待ちます。接続が成功するとテーブルページが表示されます。 + +## 3. データを探索する + +1. リスト内のいずれかのテーブルをクリックします。 + +2. テーブル内のデータを表示するための探索ページに移動します。 + +3. フィルターの追加、結合、並べ替えを開始できます。 + + Connection Form + +4. **Graph**ボタンを使用してデータを視覚化するグラフタイプを選択することもできます。 + + Connection Form + + +## 4. SQLクエリの使用 + +1. ナビバーでExploreボタンをクリックします。 + +2. **Raw Query**ボタンをクリックし、テキストエリアにクエリを入力します。 + + Connection Form + +3. **Execute Query**ボタンをクリックして結果を確認します。 + + +## 5. クエリの保存 + +1. クエリを実行した後、**Save Query**ボタンをクリックします。 + + Connection Form + +2. **Query Name**テキストボックスにクエリの名前を付け、カテゴリ分けのためフォルダを選択できます。 + +3. **Add to dashboard**オプションを使用して、結果をダッシュボードに追加することもできます。 + +4. **Save**ボタンをクリックしてクエリを保存します。 + + +## 6. ダッシュボードの構築 + +1. ナビバーで**Dashboards**ボタンをクリックします。 + + Connection Form + +2. 左サイドバーの**Add +**ボタンをクリックして新しいダッシュボードを追加できます。 + +3. 新しいウィジェットを追加するには、右上の**Add**ボタンをクリックします。 + +4. 保存されたクエリのリストからクエリを選択し、視覚化タイプを選んで**Add Dashboard Item**ボタンをクリックします。 + + +## 詳細を学ぶ +Draxlrについてもっと知るためには、[Draxlrドキュメンテーション](https://draxlr.notion.site/draxlr/Draxlr-Docs-d228b23383f64d00a70836ff9643a928)サイトを訪れてください。 diff --git a/docs/ja/integrations/data-visualization/embeddable-and-clickhouse.md b/docs/ja/integrations/data-visualization/embeddable-and-clickhouse.md new file mode 100644 index 00000000000..b6e82a0fca9 --- /dev/null +++ b/docs/ja/integrations/data-visualization/embeddable-and-clickhouse.md @@ -0,0 +1,66 @@ +--- +sidebar_label: Embeddable +slug: /ja/integrations/embeddable +keywords: [clickhouse, embeddable, connect, integrate, ui] +description: Embeddableは、迅速でインタラクティブな完全カスタム分析体験をアプリに直接統合するための開発者向けツールキットです。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Embeddable と ClickHouse の接続 + +[Embeddable](https://embeddable.com/) では、コード内で [データモデル](https://trevorio.notion.site/Data-modeling-35637bbbc01046a1bc47715456bfa1d8) と [コンポーネント](https://trevorio.notion.site/Using-components-761f52ac2d0743b488371088a1024e49) を定義し(コードリポジトリに保存)、**SDK** を使用してこれらを強力なEmbeddableの**コード不要ビルダー**で利用できるようにします。 + +この結果、製品チームがデザインし、エンジニアリングチームが構築し、顧客対応およびデータチームが維持する、迅速でインタラクティブな顧客向けの分析を製品内に直接提供できるようになります。これが理想的な形です。 + +組み込みの行レベルセキュリティにより、各ユーザーは許可されたデータのみを見ることができます。また、完全に構成可能な2層のキャッシングにより、スケールに応じた迅速なリアルタイム分析を提供できます。 + +## 1. 接続情報を収集する + + +## 2. ClickHouse接続タイプを作成する + +データベース接続は、Embeddable APIを使用して追加します。この接続は、ClickHouseサービスに接続するために使用されます。次のAPI呼び出しを使用して接続を追加できます: + +```javascript +// セキュリティ上の理由から、これはクライアント側から*一切*呼び出してはいけません +fetch('https://api.embeddable.com/api/v1/connections', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + Authorization: `Bearer ${apiKey}` /* APIキーを安全に保持してください */, + }, + body: JSON.stringify({ + name: 'my-clickhouse-db', + type: 'clickhouse', + credentials: { + host: 'my.clickhouse.host', + user: 'clickhouse_user', + port: 8443, + password: '*****', + }, + }), +}); + + +Response: +Status 201 { errorMessage: null } +``` + +上記は `CREATE` アクションを示していますが、すべての `CRUD` 操作が利用可能です。 + +`apiKey` は、Embeddable ダッシュボードの1つで「**Publish**」をクリックして見つけることができます。 + +`name` は、この接続を識別するための一意の名前です。 +- デフォルトでは、データモデルは「default」と呼ばれる接続を探しますが、異なる `data_source` 名をモデルに供給することで、異なる接続に異なるデータモデルを接続できます(単にモデル内でdata_source名を指定してください)。 + +`type` は、Embeddableが使用するドライバーを指定します。 + +- ここでは `clickhouse` を使用しますが、1つのEmbeddable ワークスペースに複数の異なるデータソース(例: `postgres`, `bigquery`, `mongodb` など)を接続することができます。 + +`credentials` は、ドライバーが期待する必要な認証情報を含むJavaScriptオブジェクトです。 +- これらは安全に暗号化され、データモデルで記述したとおりのデータだけが取得されます。 +Embeddableは、各接続に対して読み取り専用のデータベースユーザーを作成することを強く推奨しています(Embeddableはデータベースから読み取るだけで、書き込みは行いません)。 + +本番、QA、テストなどの異なるデータベースに接続をサポートするため(または異なる顧客のために異なるデータベースをサポートするために)、各接続を環境に割り当てることができます([Environments API](https://www.notion.so/Environments-API-497169036b5148b38f7936aa75e62949?pvs=21)を参照)。 diff --git a/docs/ja/integrations/data-visualization/explo-and-clickhouse.md b/docs/ja/integrations/data-visualization/explo-and-clickhouse.md new file mode 100644 index 00000000000..ed2320bfd67 --- /dev/null +++ b/docs/ja/integrations/data-visualization/explo-and-clickhouse.md @@ -0,0 +1,113 @@ +--- +sidebar_label: Explo +sidebar_position: 131 +slug: /ja/integrations/explo +keywords: [clickhouse, Explo, connect, integrate, ui] +description: Exploはデータに関する質問を問うための使いやすいオープンソースのUIツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ExploをClickHouseに接続する + +あらゆるプラットフォーム向けの顧客向け分析。美しい視覚化のために設計され、簡素さを求めて構築されています。 + +## 目的 + +このガイドでは、ClickHouseからExploにデータを接続し、結果を視覚化する方法を説明します。チャートは以下のように表示されます: +Explo Dashboard + +

+ +:::tip データを追加 +作業するデータセットがない場合、例を追加することができます。このガイドでは[UK Price Paid](/docs/ja/getting-started/example-datasets/uk-price-paid.md)データセットを使用しているので、それを選ぶことをお勧めします。同じドキュメントカテゴリに他の例もいくつかあります。 +::: + +## 1. 接続に必要な詳細を集めます + + +## 2. ExploをClickHouseに接続する + +1. Exploアカウントにサインアップします。 + +2. 左側のサイドバーでExploの**データ**タブをクリックします。 + +Data Tab + +3. 右上の**データソースを接続**をクリックします。 + +Connect Data Source + +4. **はじめに**ページの情報を入力します。 + +Getting Started + +5. **Clickhouse**を選択します。 + +Clickhouse + +6. **Clickhouseの資格情報**を入力します。 + +Credentials + +7. **セキュリティ**を設定します。 + +Security + +8. Clickhouse内で、**ExploのIPをホワイトリストに追加**します。 +` +54.211.43.19, 52.55.98.121, 3.214.169.94, and 54.156.141.148 +` + +## 3. ダッシュボードを作成する + +1. 左側のナビゲーションバーで**ダッシュボード**タブに移動します。 + +Dashboard + +2. 右上の**ダッシュボードを作成**をクリックし、ダッシュボードに名前を付けます。これでダッシュボードが作成されました! + +Create Dashboard + +3. 次のような画面が表示されます: + +Explo Dashboard + +## 4. SQLクエリを実行する + +1. スキーマタイトルの下にある右側のサイドバーからテーブル名を取得します。それから以下のコマンドをデータセットエディタに入力します: +` +SELECT * FROM YOUR_TABLE_NAME +LIMIT 100 +` + +Explo Dashboard + +2. 実行をクリックし、プレビュータブに移動してデータを確認します。 + +Explo Dashboard + +## 5. チャートを作成する + +1. 左側からバーチャートのアイコンをドラッグして画面に配置します。 + +Explo Dashboard + +2. データセットを選択します。次のような画面が表示されます: + +Explo Dashboard + +3. **county**をX軸に、**Price**をY軸のセクションに入力します: + +Explo Dashboard + +4. 集約を**AVG**に変更します。 + +Explo Dashboard + +5. これで価格ごとに分類された住宅の平均価格が表示されました! + +Explo Dashboard + +## 詳細を学ぶ + +Exploやダッシュボードの作成について詳しくは、Exploのドキュメントを参照してください。 diff --git a/docs/ja/integrations/data-visualization/grafana/config.md b/docs/ja/integrations/data-visualization/grafana/config.md new file mode 100644 index 00000000000..724d81bf141 --- /dev/null +++ b/docs/ja/integrations/data-visualization/grafana/config.md @@ -0,0 +1,303 @@ +--- +sidebar_label: プラグイン設定 +sidebar_position: 3 +slug: /ja/integrations/grafana/config +description: GrafanaにおけるClickHouseデータソースプラグインの設定オプション +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +# GrafanaでのClickHouseデータソースの設定 + +設定を変更する最も簡単な方法は、GrafanaのUIでプラグイン設定ページを操作することですが、データソースは[YAMLファイルでプロビジョニング](https://grafana.com/docs/grafana/latest/administration/provisioning/#data-sources)することもできます。 + +このページでは、ClickHouseプラグインの設定で利用可能なオプションの一覧と、YAMLを使用してデータソースをプロビジョニングする人向けの設定スニペットを紹介します。 + +全てのオプションの概要については、設定オプションの完全なリストを[こちら](#all-yaml-options)にて確認できます。 + +## 共通設定 + +設定画面の例: +Secure native config の例 + +共通設定のためのYAML設定例: +```yaml +jsonData: + host: 127.0.0.1 # (必須) サーバーアドレス。 + port: 9000 # (必須) サーバーポート。nativeの場合はデフォルトで9440(セキュア)および9000(インセキュア)。HTTPの場合はデフォルトで8443(セキュア)および8123(インセキュア)。 + + protocol: native # (必須) 接続に使うプロトコル。"native" または "http" に設定可能。 + secure: false # 接続がセキュアな場合は true に設定。 + + username: default # 認証に使用されるユーザー名。 + + tlsSkipVerify: # true に設定するとTLS検証をスキップします。 + tlsAuth: # TLSクライアント認証を有効にするにはtrueに設定。 + tlsAuthWithCACert: # CA証明書が提供されている場合はtrueに設定。自己署名のTLS証明書を検証するために必要。 + +secureJsonData: + password: secureExamplePassword # 認証に使用されるパスワード。 + + tlsCACert: # TLS CA 証明書 + tlsClientCert: # TLS クライアント証明書 + tlsClientKey: # TLS クライアントキー +``` + +UIから設定を保存した際には、`version` プロパティが追加されます。これは、設定が保存されたプラグインのバージョンを示します。 + +### HTTPプロトコル + +HTTPプロトコルを介して接続する場合は、設定が追加で表示されます。 + +追加のHTTP設定オプション + +#### HTTPパス + +HTTPサーバーが異なるURLパスで公開されている場合、ここにそのパスを追加できます。 + +```yaml +jsonData: + # 最初のスラッシュを除いた形式 + path: additional/path/example +``` + +#### カスタムHTTPヘッダー + +サーバーに送信されるリクエストにカスタムヘッダーを追加できます。 + +ヘッダーはプレーンテキストまたはセキュア値のいずれかです。 +すべてのヘッダーキーはプレーンテキストで保存され、セキュアヘッダー値は(`password`フィールドと同様に)セキュア設定で保存されます。 + +:::warning HTTP上のセキュア値 +セキュアヘッダー値は、設定でセキュアに保存されますが、接続がセキュアではない場合でもHTTPで送信されます。 +::: + +プレーン/セキュアヘッダーのYAML例: +```yaml +jsonData: + httpHeaders: + - name: X-Example-Plain-Header + value: plain text value + secure: false + - name: X-Example-Secure-Header + # "value" は除外 + secure: true +secureJsonData: + secureHttpHeaders.X-Example-Secure-Header: secure header value +``` + +## 追加設定 + +これらの追加設定はオプションです。 + +追加設定の例 + +YAML例: +```yaml +jsonData: + defaultDatabase: default # クエリビルダーでロードされるデフォルトのデータベース。デフォルトは "default"。 + defaultTable: # クエリビルダーでロードされるデフォルトのテーブル。 + + dialTimeout: 10 # サーバーへの接続時のダイアルタイムアウト(秒)。デフォルトは "10"。 + queryTimeout: 60 # クエリ実行時のクエリタイムアウト(秒)。デフォルトは60。ユーザーに対する権限が必要です。権限エラーが発生する場合は、"0" に設定して無効化を試みてください。 + validateSql: false # true に設定すると、SQLエディタでSQLを検証します。 +``` + +### OpenTelemetry + +OpenTelemetry (OTel) はプラグイン内に深く統合されています。 +OpenTelemetryデータは、[エクスポータープラグイン](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter)を使用してClickHouseにエクスポートできます。 +最善の利用のためには、[ログ](#logs)と[トレース](#traces)の両方のためにOTelを設定することを推奨しています。 + +[データリンク](./query-builder.md#data-links) を有効にするには、これらのデフォルトを設定する必要があります。この機能は強力な可観測性ワークフローを可能にします。 + +### ログ + +[ログのクエリ構築](./query-builder.md#logs)を高速化するために、デフォルトのデータベース/テーブルと、ログクエリ用のカラムを設定することができます。これにより、クエリビルダーで実行可能なログクエリが事前にロードされ、観察ページでのブラウジングが高速化されます。 + +OpenTelemetryを使用している場合は、「**Use OTel**」スイッチを有効にし、**デフォルトログテーブル**を`otel_logs`に設定する必要があります。 +これにより、選択したOTelスキーマバージョンを使用するためにデフォルトのカラムが自動的にオーバーライドされます。 + +OpenTelemetryはログには必須ではありませんが、単一のログ/トレースデータセットを使用すると、[データリンク](./query-builder.md#data-links)によるスムーズな可観測性ワークフローを促進します。 + +ログ設定画面の例: +ログ設定 + +ログ設定のYAML例: +```yaml +jsonData: + logs: + defaultDatabase: default # デフォルトのログデータベース。 + defaultTable: otel_logs # デフォルトのログテーブル。OTelを使用している場合、これは "otel_logs" に設定する必要があります。 + + otelEnabled: false # OTelが有効である場合にtrueに設定。 + otelVersion: latest # 使用されるotelコレクタースキーマバージョン。バージョンはUIで表示されますが、"latest"はプラグイン内で使用可能な最新のバージョンを使用します。 + + # 新しいログクエリを開く際に選択されるデフォルトのカラム。OTelが有効である場合は無視されます。 + timeColumn: # ログの主な時間カラム。 + logLevelColumn: # ログのレベル/シビリティ。値は通常 "INFO"、"error"、または "Debug" のようになります。 + logMessageColumn: # ログのメッセージ/コンテンツ。 +``` + +### トレース + +[トレースのクエリ構築](./query-builder.md#traces)を高速化するために、デフォルトのデータベース/テーブルと、トレースクエリ用のカラムを設定することができます。これにより、クエリビルダーで実行可能なトレース検索クエリが事前にロードされ、観察ページでのブラウジングが高速化されます。 + +OpenTelemetryを使用している場合は、「**Use OTel**」スイッチを有効にし、**デフォルトトレーステーブル**を`otel_traces`に設定する必要があります。 +これにより、選択したOTelスキーマバージョンを使用するためにデフォルトのカラムが自動的にオーバーライドされます。 +OpenTelemetryは必須ではありませんが、この機能はトレースにそのスキーマを使用するのが最適です。 + +トレース設定画面の例: +トレース設定 + +トレース設定のYAML例: +```yaml +jsonData: + traces: + defaultDatabase: default # デフォルトのトレースデータベース。 + defaultTable: otel_traces # デフォルトのトレーステーブル。OTelを使用している場合、これは "otel_traces" に設定する必要があります。 + + otelEnabled: false # OTelが有効である場合にtrueに設定。 + otelVersion: latest # 使用されるotelコレクタースキーマバージョン。バージョンはUIで表示されますが、"latest"はプラグイン内で使用可能な最新のバージョンを使用します。 + + # 新しいトレースクエリを開くときに選択されるデフォルトのカラム。OTelが有効の場合は無視されます。 + traceIdColumn: # トレースIDカラム。 + spanIdColumn: # スパンIDカラム。 + operationNameColumn: # オペレーション名カラム。 + parentSpanIdColumn: # 親スパンIDカラム。 + serviceNameColumn: # サービス名カラム。 + durationTimeColumn: # 継続時間カラム。 + durationUnitColumn:

+ +
+ +## 1. 接続情報を集める + + +## 2. 読み取り専用ユーザーの作成 + +ClickHouse を Grafana のようなデータ可視化ツールに接続する場合、データが不適切に変更されないように読み取り専用ユーザーを作成することをお勧めします。 + +Grafana はクエリが安全であるかを検証しません。クエリには `DELETE` や `INSERT` を含む任意の SQL ステートメントを含めることができます。 + +読み取り専用ユーザーを設定するには、次の手順に従ってください: +1. [ClickHouse でのユーザーとロールの作成](/docs/ja/operations/access-rights)ガイドに従って `readonly` ユーザープロファイルを作成します。 +2. 基盤となる [clickhouse-go クライアント](https://github.com/ClickHouse/clickhouse-go) に必要な `max_execution_time` 設定を変更するための十分な権限が `readonly` ユーザーにあることを確認します。 +3. 公共の ClickHouse インスタンスを使用している場合、`readonly` プロファイルで `readonly=2` を設定することはお勧めしません。代わりに、`readonly=1` のままにし、この設定の変更を許可するために `max_execution_time` の制約タイプを [changeable_in_readonly](/docs/ja/operations/settings/constraints-on-settings) に設定します。 + +## 3. Grafana 用 ClickHouse プラグインをインストールする + +Grafana が ClickHouse へ接続できるようにする前に、適切な Grafana プラグインをインストールする必要があります。Grafana にログインしていることを前提に、次の手順に従います: + +1. サイドバーの **Connections** ページから、**Add new connection** タブを選択します。 + +2. **ClickHouse** を検索し、Grafana Labs の署名されたプラグインをクリックします: + + Connections ページで ClickHouse プラグインを選択 + +3. 次の画面で、**Install** ボタンをクリックします: + + ClickHouse プラグインをインストール + +## 4. ClickHouse データソースを定義する + +1. インストールが完了したら、**Add new data source** ボタンをクリックします。(**Data sources** タブからもデータソースを追加できます。) + + ClickHouse データソースを作成 + +2. 下にスクロールして **ClickHouse** データソースのタイプを見つけるか、**Add data source** ページの検索バーで検索します。**ClickHouse** データソースを選択すると、以下のページが表示されます: + + 接続設定ページ + +3. サーバー設定と認証情報を入力します。主要な設定は次のとおりです: + +- **Server host address:** ClickHouse サービスのホスト名。 +- **Server port:** ClickHouse サービスのポート。サーバー設定およびプロトコルによって異なります。 +- **Protocol:** ClickHouse サービスに接続するためのプロトコル。 +- **Secure connection:** サーバーがセキュア接続を必要とする場合に有効にします。 +- **Username** と **Password**: ClickHouse のユーザー資格情報を入力します。ユーザーを設定していない場合は、ユーザー名に `default` を試してください。[読み取り専用ユーザーを設定](#2-making-a-read-only-user)することをお勧めします。 + +詳細な設定については、[プラグイン設定](./config.md)ドキュメントを確認してください。 + +4. **Save & test** ボタンをクリックして、Grafana が ClickHouse サービスに接続できることを確認します。成功した場合、**Data source is working** メッセージが表示されます: + + Select Save & test + +## 5. 次のステップ + +これでデータソースの準備が整いました![query builder](./query-builder.md) でクエリを構築する方法について詳しく学びましょう。 + +設定の詳細については、[プラグイン設定](./config.md)ドキュメントを確認してください。 + +これらのドキュメントに含まれていない情報をお探しの場合は、[GitHub のプラグインリポジトリ](https://github.com/grafana/clickhouse-datasource)を確認してください。 + +## プラグインバージョンのアップグレード + +v4 以降では、新しいバージョンがリリースされると設定やクエリがアップグレードされます。 + +v3 からの設定とクエリは開いたときに v4 に移行されます。古い設定やダッシュボードは v4 でロードされますが、移行は新しいバージョンで再保存するまで保持されません。古い設定/クエリを開いた際に問題が発生した場合は、変更を破棄し、[GitHub で問題を報告](https://github.com/grafana/clickhouse-datasource/issues)してください。 + +新しいバージョンで作成された設定/クエリを以前のバージョンにダウングレードすることはできません。 + +## 関連コンテンツ + +- [GitHub のプラグインリポジトリ](https://github.com/grafana/clickhouse-datasource) +- ブログ: [Visualizing Data with ClickHouse - Part 1 - Grafana](https://clickhouse.com/blog/visualizing-data-with-grafana) +- ブログ: [Visualizing ClickHouse Data with Grafana - Video](https://www.youtube.com/watch?v=Ve-VPDxHgZU) +- ブログ: [ClickHouse Grafana plugin 4.0 - Leveling up SQL Observability](https://clickhouse.com/blog/clickhouse-grafana-plugin-4-0) +- ブログ: [データの ClickHouse への投入 - Part 3 - S3 の使用](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3) +- ブログ: [ClickHouse を用いた Observability ソリューションの構築 - Part 1 - ログ](https://clickhouse.com/blog/storing-log-data-in-clickhouse-fluent-bit-vector-open-telemetry) +- ブログ: [ClickHouse を用いた Observability ソリューションの構築 - Part 2 - トレース](https://clickhouse.com/blog/storing-traces-and-spans-open-telemetry-in-clickhouse) +- ブログ & ウェビナー: [ClickHouse + Grafana を用いたオープンソース GitHub アクティビティのストーリー](https://clickhouse.com/blog/introduction-to-clickhouse-and-grafana-webinar) diff --git a/docs/ja/integrations/data-visualization/grafana/query-builder.md b/docs/ja/integrations/data-visualization/grafana/query-builder.md new file mode 100644 index 00000000000..496cc8366f7 --- /dev/null +++ b/docs/ja/integrations/data-visualization/grafana/query-builder.md @@ -0,0 +1,247 @@ +--- +sidebar_label: クエリビルダー +sidebar_position: 2 +slug: /ja/integrations/grafana/query-builder +description: ClickHouse Grafana プラグインでのクエリビルダーの使用 +--- + +# クエリビルダー + +任意のクエリは ClickHouse プラグインで実行できます。 +クエリビルダーはシンプルなクエリには便利なオプションですが、複雑なクエリには [SQL エディタ](#sql-editor)を使用する必要があります。 + +クエリビルダー内のすべてのクエリには[クエリタイプ](#query-types)があり、少なくとも1つのカラムを選択する必要があります。 + +使用可能なクエリタイプは次のとおりです: +- [Table](#table): データを表形式で表示するための最も簡単なクエリタイプ。集計関数を含む単純なクエリにも複雑なクエリにも適しています。 +- [Logs](#logs): ログのクエリ作成に最適化されています。[デフォルト設定](./config.md#logs)されたエクスプローラビューで最適に機能します。 +- [Time Series](#time-series): 時系列クエリの作成に最適です。専用の時間カラムを選択し、集計関数を追加できます。 +- [Traces](#traces): トレースの検索/表示に最適化されています。[デフォルト設定](./config.md#traces)されたエクスプローラビューで最適に機能します。 +- [SQL Editor](#sql-editor): クエリの完全な制御を行いたい場合に使用できます。このモードでは任意の SQL クエリを実行できます。 + +## クエリタイプ + +*クエリタイプ*設定は、作成中のクエリのタイプに合うようにクエリビルダーのレイアウトを変更します。 +クエリタイプは、データの可視化に使用されるパネルも決定します。 + +### Table + +最も柔軟なクエリタイプは Table クエリです。これは、単純および集計クエリを処理するために設計された他のクエリビルダーを包括します。 + +| フィールド | 説明 | +|----|----| +| ビルダーモード | 単純なクエリは集計や Group By を含まず、集計クエリはこれらのオプションを含みます。 | +| カラム | 選択されたカラム。このフィールドに生の SQL を入力して、関数やカラムのエイリアシングを許可します。 | +| 集計 | [集計関数](/docs/ja/sql-reference/aggregate-functions/index.md)のリスト。関数とカラムのカスタム値を許可します。集計モードでのみ表示されます。 | +| Group By | [GROUP BY](/docs/ja/sql-reference/statements/select/group-by.md) 式のリスト。集計モードでのみ表示されます。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されます。一部の可視化では、すべてのデータを表示するために `0` に設定する必要があります。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | + +Example aggregate table query + +このクエリタイプは、データをテーブルとしてレンダリングします。 + +### Logs + +Logs クエリタイプは、ログデータのクエリ作成に焦点を当てたクエリビルダーを提供します。 +デフォルトはデータソースの[ログ設定](./config.md#logs)で設定することができ、クエリビルダーをデフォルトのデータベース/テーブルとカラムでプレロードできます。 +また、OpenTelemetry を有効にして、スキーマバージョンに応じたカラムを自動選択することもできます。 + +**時間**と**レベル**フィルターがデフォルトで追加され、時間カラムの Order By も含まれます。 +これらのフィルターは各フィールドに関連付けられており、カラムが変更されると更新されます。 +**レベル**フィルターはデフォルトでは SQL から除外されており、`IS ANYTHING` オプションから変更することで有効になります。 + +Logs クエリタイプは[データリンク](#data-links)をサポートしています。 + +| フィールド | 説明 | +|----|----| +| Use OTel | OpenTelemetry カラムを有効にします。選択された OTel スキーマバージョンで定義されたカラムを使用するように選択されたカラムを上書きします(カラム選択を無効にします)。 | +| カラム | ログ行に追加されるカラム。生の SQL をこのフィールドに入力して関数やカラムのエイリアシングを許可します。 | +| 時間 | ログのプライマリタイムスタンプカラム。時間的な型を表示しますが、カスタム値/関数も許可されます。 | +| ログレベル | 任意。ログの*レベル*または*重大度*。通常は`INFO`, `error`, `Debug`などの値が使用されます。 | +| メッセージ | ログメッセージの内容。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されますが、大規模なログデータセットには推奨されません。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | +| メッセージフィルター | `LIKE %value%` を使用してログを便利にフィルターリングするためのテキスト入力。入力が空の場合は除外されます。 | + +Example OTel logs query + +
+このクエリタイプは、上部にログヒストグラムパネルとともに、ログパネルとしてデータをレンダリングします。 + +クエリ内で選択された追加カラムは、展開されたログ行内で確認できます: +Example of extra fields on logs query + +### Time Series + +Time Series クエリタイプは[table](#table)に似ていますが、時系列データに焦点を当てています。 + +2つのビューはほぼ同じですが、以下の重要な違いがあります: +- 専用の*時間*フィールド。 +- 集計モードでは、時間間隔マクロが自動的に適用され、Time フィールドに対する Group By が追加されます。 +- 集計モードでは、「カラム」フィールドが非表示になります。 +- 時間範囲フィルターと Order By が **Time** フィールドに自動的に追加されます。 + +:::重要 あなたのビジュアライゼーションがデータを欠いている場合 +場合によっては、時系列パネルが `LIMIT` がデフォルトで `1000` に設定されているために切り捨てられたように表示されることがあります。 + +データセットが許せば、`LIMIT` 条項を削除して `0` に設定してみてください。 +::: + +| フィールド | 説明 | +|----|----| +| ビルダーモード | 単純なクエリは集計および Group By を含まず、集計クエリはこれらのオプションを含みます。 | +| 時間 | クエリのプライマリ時間カラム。時間的な型を表示しますが、カスタム値/関数も許可されます。 | +| カラム | 選択されたカラム。このフィールドに生の SQL を入力して、関数やカラムのエイリアシングを許可します。単純モードでのみ表示されます。 | +| 集計 | [集計関数](/docs/ja/sql-reference/aggregate-functions/index.md)のリスト。関数とカラムのカスタム値を許可します。集計モードでのみ表示されます。 | +| Group By | [GROUP BY](/docs/ja/sql-reference/statements/select/group-by.md) 式のリスト。集計モードでのみ表示されます。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されますが、時系列データセットではフルビジュアライゼーションを表示するために推奨されます。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | + +Example time series query + +このクエリタイプは、時系列パネルでデータをレンダリングします。 + +### Traces + +Traces クエリタイプは、トレースを簡単に検索および表示するためのクエリビルダーを提供します。 +これは OpenTelemetry データ用に設計されていますが、別のスキーマからトレースをレンダリングするためにカラムを選択することもできます。 +デフォルトはデータソースの[トレース設定](./config.md#traces)で設定することができ、クエリビルダーをデフォルトのデータベース/テーブルとカラムでプレロードできます。デフォルトが設定されている場合、カラム選択はデフォルトで折りたたまれます。 +また、OpenTelemetry を有効にして、スキーマバージョンに応じたカラムを自動選択することもできます。 + +デフォルトのフィルターは、トップレベルのスパンのみを表示する意図で追加されています。 +Time および Duration Time の Order By も含まれています。 +これらのフィルターは各フィールドに関連付けられており、カラムが変更されると更新されます。 +**サービス名**フィルターはデフォルトでは SQL から除外されており、`IS ANYTHING` オプションから変更することで有効になります。 + +Traces クエリタイプは[データリンク](#data-links)をサポートしています。 + +| フィールド | 説明 | +|----|----| +| Trace モード | クエリを Trace Search から Trace ID 検索に変更します。 | +| Use OTel | OpenTelemetry カラムを有効にします。選択された OTel スキーマバージョンで定義されたカラムを使用するように選択されたカラムを上書きします(カラム選択を無効にします)。 | +| Trace ID カラム | トレースの ID。 | +| Span ID カラム | スパン ID。 | +| Parent Span ID カラム | 親スパン ID。これは通常、トップレベルトレースでは空です。 | +| サービス名カラム | サービス名。 | +| 操作名カラム | 操作名。 | +| 開始時間カラム | トレーススパンのプライマリ時間カラム。スパンが開始された時刻。 | +| 期間時間カラム | スパンの期間。Grafana はデフォルトでこれをミリ秒の浮動小数点数で期待しています。変換は`Duration Unit`ドロップダウンを介して自動的に適用されます。 | +| 期間単位 | 期間に使用される時間の単位。デフォルトではナノ秒。選択された単位は、Grafana に必要なミリ秒の浮動小数点数に変換されます。 | +| タグカラム | スパンタグ。OTel に基づくスキーマを使用していない場合は除外します。特定のマップカラムタイプを期待します。 | +| サービスタグカラム | サービスタグ。OTel に基づくスキーマを使用していない場合は除外します。特定のマップカラムタイプを期待します。 | +| Order By | [ORDER BY](/docs/ja/sql-reference/statements/select/order-by.md) 式のリスト。 | +| Limit | クエリの末尾に [LIMIT](/docs/ja/sql-reference/statements/select/limit.md) 文を追加します。`0` に設定すると除外されますが、大規模なトレースデータセットには推奨されません。 | +| フィルター | `WHERE` 句に適用されるフィルターのリスト。 | +| Trace ID | フィルターで使用するトレース ID。Trace ID モードでのみ使用され、Trace ID [データリンク](#data-links)を開くときに使用されます。 | + +Example OTel trace query + +このクエリタイプは、Trace Search モードではテーブルビューで、Trace ID モードではトレースパネルでデータをレンダリングします。 + +## SQL エディタ + +クエリビルダーには複雑すぎるクエリの場合は、SQL エディタを使用できます。 +これにより、生の ClickHouse SQL を記述して実行することでクエリを完全に制御できます。 + +SQL エディタは、クエリエディタの上部で「SQL Editor」を選択することで開くことができます。 + +このモードでも[マクロ関数](#macros)を使用できます。 + +クエリタイプを切り替えて、クエリに最も適したビジュアライゼーションを取得できます。 +ダッシュボードビュー、特に時系列データでは、この切り替えも効果があります。 + +Example raw SQL query + +## データリンク + +Grafana [データリンク](https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links) +は新しいクエリへのリンクを作成するために使用できます。 +この機能は、ClickHouse プラグイン内でトレースをログにリンクしたりその逆を実行したりするために有効化されています。 +データソースの[設定](./config.md#opentelemetry)で OpenTelemetry を両方のログとトレースに設定すると最適に機能します。 + +
+ テーブル内のトレースリンクの例 + Trace links in table +
+ +
+ ログ内のトレースリンクの例 + Trace links in logs +
+ +### データリンクの作成方法 + +あなたは、クエリ内で`traceID`という名前のカラムを選択することでデータリンクを作成できます。この名前は大文字と小文字を区別せず、"ID"の前にアンダースコアを追加することもサポートしています。例えば、`traceId`, `TraceId`, `TRACE_ID`, `tracE_iD`はすべて有効です。 + +OpenTelemetry が[ログ](#logs)または[トレース](#traces)クエリで有効になっている場合、トレース ID カラムは自動的に含まれます。 + +トレース ID カラムを含めることで、「**View Trace**」および「**View Logs**」リンクがデータに添付されます。 + +### リンクの機能 + +データリンクが存在すると、提供されたトレース ID を使用してトレースおよびログを開くことができます。 + +「**View Trace**」はトレース付きの分割パネルを開き、「**View Logs**」はトレース ID でフィルタリングされたログクエリを開きます。 +リンクがダッシュボードではなくエクスプローラビューからクリックされた場合、リンクはエクスプローラビューの新しいタブで開かれます。 + +[ログ](./config.md#logs)と[トレース](./config.md#traces)の両方に対してデフォルトが構成されていることが、クエリタイプを跨ぐ(ログからトレース、トレースからログ)のに必要です。同じクエリタイプのリンクを開く場合には、ただクエリをコピーすることで済むため、デフォルトは必要ありません。 + +
+ ログクエリ(左パネル)からトレースを表示する例(右パネル) + Example of data links linking +
+ +## マクロ + +マクロはクエリに動的 SQL を追加する簡単な方法です。 +クエリが ClickHouse サーバーに送信される前に、プラグインはマクロを展開し、完全な式に置き換えます。 + +SQL エディタとクエリビルダーの両方のクエリでマクロを使用できます。 + +### マクロの使用方法 + +必要に応じて、クエリの任意の場所にマクロを複数回含めることができます。 + +以下は、`$__timeFilter` マクロを使用する例です: + +入力: +```sql +SELECT log_time, log_message +FROM logs +WHERE $__timeFilter(log_time) +``` + +最終的なクエリ出力: +```sql +SELECT log_time, log_message +FROM logs +WHERE log_time >= toDateTime(1415792726) AND log_time <= toDateTime(1447328726) +``` + +この例では、Grafana ダッシュボードの時間範囲が `log_time` カラムに適用されています。 + +プラグインは中括弧 `{}` を使用した表記もサポートしています。クエリが [パラメーター](/docs/ja/sql-reference/syntax.md#defining-and-using-query-parameters)内に必要な場合は、この表記を使用します。 + +### マクロのリスト + +プラグインで利用可能なすべてのマクロのリストです: + +| マクロ | 説明 | 出力例 | +| -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | +| `$__dateFilter(columnName)` | Grafana パネルの時間範囲を[Date](/docs/ja/sql-reference/data-types/date.md)として指定されたカラムにフィルタリングする条件に置き換えます。 | `columnName >= toDate('2022-10-21') AND columnName <= toDate('2022-10-23')` | +| `$__timeFilter(columnName)` | Grafana パネルの時間範囲を[DateTime](/docs/ja/sql-reference/data-types/datetime.md)として指定されたカラムにフィルタリングする条件に置き換えます。 | `columnName >= toDateTime(1415792726) AND time <= toDateTime(1447328726)` | +| `$__timeFilter_ms(columnName)` | Grafana パネルの時間範囲を[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md)として指定されたカラムにフィルタリングする条件に置き換えます。 | `columnName >= fromUnixTimestamp64Milli(1415792726123) AND columnName <= fromUnixTimestamp64Milli(1447328726456)` | +| `$__dateTimeFilter(dateColumn, timeColumn)` | `$__dateFilter()` と `$__timeFilter()` を別々の Date と DateTime カラムで組み合わせたショートハンドです。Alias `$__dt()` | `$__dateFilter(dateColumn) AND $__timeFilter(timeColumn)` | +| `$__fromTime` | Grafana パネルの範囲の開始時刻を[DateTime](/docs/ja/sql-reference/data-types/datetime.md)としてキャストしたものに置き換えます。 | `toDateTime(1415792726)` | +| `$__fromTime_ms` | パネル範囲の開始時刻を[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md)としてキャストしたものに置き換えます。 | `fromUnixTimestamp64Milli(1415792726123)` | +| `$__toTime` | Grafana パネル範囲の終了時刻を[DateTime](/docs/ja/sql-reference/data-types/datetime.md)としてキャストしたものに置き換えます。 | `toDateTime(1447328726)` | +| `$__toTime_ms` | パネル範囲の終了時刻を[DateTime64](/docs/ja/sql-reference/data-types/datetime64.md)としてキャストしたものに置き換えます。 | `fromUnixTimestamp64Milli(1447328726456)` | +| `$__timeInterval(columnName)` | ウィンドウサイズに基づく間隔を計算する関数で置き換えます。 | `toStartOfInterval(toDateTime(columnName), INTERVAL 20 second)` | +| `$__timeInterval_ms(columnName)` | ウィンドウサイズに基づく間隔を計算する関数で置き換えます(ミリ秒単位)。 | `toStartOfInterval(toDateTime64(columnName, 3), INTERVAL 20 millisecond)` | +| `$__interval_s` | ダッシュボード間隔を秒単位で置き換えます。 | `20` | +| `$__conditionalAll(condition, $templateVar)` | テンプレート変数がすべての値を選択していない場合は第一引数に置き換えます。テンプレート変数がすべての値を選択する場合は `1=1` に置き換えます。 | `condition` または `1=1` | + diff --git a/docs/ja/integrations/data-visualization/hashboard-and-clickhouse.md b/docs/ja/integrations/data-visualization/hashboard-and-clickhouse.md new file mode 100644 index 00000000000..35b18f89152 --- /dev/null +++ b/docs/ja/integrations/data-visualization/hashboard-and-clickhouse.md @@ -0,0 +1,45 @@ +--- +sidebar_label: Hashboard +sidebar_position: 132 +slug: /ja/integrations/hashboard +keywords: [clickhouse, hashboard, connect, integrate, ui, analytics] +description: HashboardはClickHouseと簡単に統合可能な強力な分析プラットフォームで、リアルタイムデータ分析を提供します。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +# ClickHouseとHashboardの接続 + +[Hashboard](https://hashboard.com)は、組織内の誰もがメトリクスを追跡し、行動可能なインサイトを発見できるインタラクティブなデータ探索ツールです。HashboardはあなたのClickHouseデータベースに対してライブSQLクエリを発行し、セルフサービス型のアドホックなデータ探索用途に特に役立ちます。 + +Hashboard data explorer + +
+ +このガイドでは、HashboardをあなたのClickHouseインスタンスに接続する手順を案内します。この情報は、Hashboardの[ClickHouseインテグレーションドキュメント](https://docs.hashboard.com/docs/database-connections/clickhouse)でもご覧いただけます。 + +## 前提条件 + +- 自身のインフラストラクチャ上または[ClickHouse Cloud](https://clickhouse.com/)上にホストされているClickHouseデータベース。 +- [Hashboardアカウント](https://hashboard.com/getAccess)とプロジェクト。 + +## HashboardをClickHouseに接続する手順 + +### 1. 接続詳細の収集 + + + +### 2. Hashboardで新しいデータベース接続を追加 + +1. [Hashboardプロジェクト](https://hashboard.com/app)に移動します。 +2. サイドナビゲーションバーのギアアイコンをクリックして設定ページを開きます。 +3. `+ New Database Connection`をクリックします。 +4. モーダルで「ClickHouse」を選択します。 +5. **Connection Name**、**Host**、**Port**、**Username**、**Password**、**Database**の各フィールドに、事前に収集した情報を入力します。 +6. 「Test」をクリックして接続が正常に構成されていることを確認します。 +7. 「Add」をクリックします。 + +これで、ClickHouseデータベースがHashboardに接続され、[Data Models](https://docs.hashboard.com/docs/data-modeling/add-data-model)、[Explorations](https://docs.hashboard.com/docs/visualizing-data/explorations)、[Metrics](https://docs.hashboard.com/docs/metrics)、[Dashboards](https://docs.hashboard.com/docs/dashboards)を構築できるようになります。これらの機能についての詳細はHashboardの対応するドキュメントを参照してください。 + +## 詳細情報 + +より高度な機能やトラブルシューティングの情報については、[Hashboardのドキュメント](https://docs.hashboard.com/)を参照してください。 diff --git a/docs/ja/integrations/data-visualization/images/deepnote_01.png b/docs/ja/integrations/data-visualization/images/deepnote_01.png new file mode 100644 index 00000000000..058db58ffa3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/deepnote_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/deepnote_02.png b/docs/ja/integrations/data-visualization/images/deepnote_02.png new file mode 100644 index 00000000000..46d63583428 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/deepnote_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/deepnote_03.png b/docs/ja/integrations/data-visualization/images/deepnote_03.png new file mode 100644 index 00000000000..a35e5386e92 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/deepnote_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_01.png b/docs/ja/integrations/data-visualization/images/draxlr_01.png new file mode 100644 index 00000000000..67a384a68a0 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_02.png b/docs/ja/integrations/data-visualization/images/draxlr_02.png new file mode 100644 index 00000000000..de741803fb5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_03.png b/docs/ja/integrations/data-visualization/images/draxlr_03.png new file mode 100644 index 00000000000..7244a2babb1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_04.png b/docs/ja/integrations/data-visualization/images/draxlr_04.png new file mode 100644 index 00000000000..285f69793f3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_05.png b/docs/ja/integrations/data-visualization/images/draxlr_05.png new file mode 100644 index 00000000000..e622fc7db62 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/draxlr_06.png b/docs/ja/integrations/data-visualization/images/draxlr_06.png new file mode 100644 index 00000000000..56191cb3803 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/draxlr_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_01.png b/docs/ja/integrations/data-visualization/images/explo_01.png new file mode 100644 index 00000000000..2da81827d8a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_02.png b/docs/ja/integrations/data-visualization/images/explo_02.png new file mode 100644 index 00000000000..f6ed60f0da3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_03.png b/docs/ja/integrations/data-visualization/images/explo_03.png new file mode 100644 index 00000000000..d33c033fc72 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_04.png b/docs/ja/integrations/data-visualization/images/explo_04.png new file mode 100644 index 00000000000..a335491d63a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_05.png b/docs/ja/integrations/data-visualization/images/explo_05.png new file mode 100644 index 00000000000..104607a8859 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_06.png b/docs/ja/integrations/data-visualization/images/explo_06.png new file mode 100644 index 00000000000..05e38075dd3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_07.png b/docs/ja/integrations/data-visualization/images/explo_07.png new file mode 100644 index 00000000000..eb981bed136 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_08.png b/docs/ja/integrations/data-visualization/images/explo_08.png new file mode 100644 index 00000000000..953838722fb Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_09.png b/docs/ja/integrations/data-visualization/images/explo_09.png new file mode 100644 index 00000000000..37813b8727a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_10.png b/docs/ja/integrations/data-visualization/images/explo_10.png new file mode 100644 index 00000000000..89dfa761179 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_11.png b/docs/ja/integrations/data-visualization/images/explo_11.png new file mode 100644 index 00000000000..a720e90a769 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_12.png b/docs/ja/integrations/data-visualization/images/explo_12.png new file mode 100644 index 00000000000..961a2128772 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_13.png b/docs/ja/integrations/data-visualization/images/explo_13.png new file mode 100644 index 00000000000..863d96c03e3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_13.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_14.png b/docs/ja/integrations/data-visualization/images/explo_14.png new file mode 100644 index 00000000000..e814c114b61 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_14.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_15.png b/docs/ja/integrations/data-visualization/images/explo_15.png new file mode 100644 index 00000000000..2ef119d4fff Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_15.png differ diff --git a/docs/ja/integrations/data-visualization/images/explo_16.png b/docs/ja/integrations/data-visualization/images/explo_16.png new file mode 100644 index 00000000000..a42adb352f8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/explo_16.png differ diff --git a/docs/ja/integrations/data-visualization/images/hashboard_01.png b/docs/ja/integrations/data-visualization/images/hashboard_01.png new file mode 100644 index 00000000000..97ff0834ecb Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/hashboard_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_01.png b/docs/ja/integrations/data-visualization/images/looker_01.png new file mode 100644 index 00000000000..f6fae3fa0c8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_02.png b/docs/ja/integrations/data-visualization/images/looker_02.png new file mode 100644 index 00000000000..06527e0daf0 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_03.png b/docs/ja/integrations/data-visualization/images/looker_03.png new file mode 100644 index 00000000000..d31f89c58f5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_04.png b/docs/ja/integrations/data-visualization/images/looker_04.png new file mode 100644 index 00000000000..17c774aeb4d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_01.png b/docs/ja/integrations/data-visualization/images/looker_studio_01.png new file mode 100644 index 00000000000..73b1032ae23 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_02.png b/docs/ja/integrations/data-visualization/images/looker_studio_02.png new file mode 100644 index 00000000000..08f6400a8be Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_03.png b/docs/ja/integrations/data-visualization/images/looker_studio_03.png new file mode 100644 index 00000000000..70ee103dbd5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_04.png b/docs/ja/integrations/data-visualization/images/looker_studio_04.png new file mode 100644 index 00000000000..6578d7a85be Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_05.png b/docs/ja/integrations/data-visualization/images/looker_studio_05.png new file mode 100644 index 00000000000..2a7c246c2a6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_06.png b/docs/ja/integrations/data-visualization/images/looker_studio_06.png new file mode 100644 index 00000000000..b3c95194751 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_enable_mysql.png b/docs/ja/integrations/data-visualization/images/looker_studio_enable_mysql.png new file mode 100644 index 00000000000..085cb598744 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_enable_mysql.png differ diff --git a/docs/ja/integrations/data-visualization/images/looker_studio_mysql_cloud.png b/docs/ja/integrations/data-visualization/images/looker_studio_mysql_cloud.png new file mode 100644 index 00000000000..61dfc680d01 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/looker_studio_mysql_cloud.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_01.png b/docs/ja/integrations/data-visualization/images/metabase_01.png new file mode 100644 index 00000000000..0dbe17723d5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_02.png b/docs/ja/integrations/data-visualization/images/metabase_02.png new file mode 100644 index 00000000000..64c61ab67cb Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_03.png b/docs/ja/integrations/data-visualization/images/metabase_03.png new file mode 100644 index 00000000000..f3cb6d5d2fa Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_04.png b/docs/ja/integrations/data-visualization/images/metabase_04.png new file mode 100644 index 00000000000..e2dd277cff1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_05.png b/docs/ja/integrations/data-visualization/images/metabase_05.png new file mode 100644 index 00000000000..befe59e7be8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_06.png b/docs/ja/integrations/data-visualization/images/metabase_06.png new file mode 100644 index 00000000000..30be79f1fe3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_07.png b/docs/ja/integrations/data-visualization/images/metabase_07.png new file mode 100644 index 00000000000..404656531d8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/metabase_08.png b/docs/ja/integrations/data-visualization/images/metabase_08.png new file mode 100644 index 00000000000..3d1452648b5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/metabase_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_01.png b/docs/ja/integrations/data-visualization/images/mitzu_01.png new file mode 100644 index 00000000000..9f3eb6c0a93 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_02.png b/docs/ja/integrations/data-visualization/images/mitzu_02.png new file mode 100644 index 00000000000..c98ae0fd711 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_03.png b/docs/ja/integrations/data-visualization/images/mitzu_03.png new file mode 100644 index 00000000000..e4a4d4c0558 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_04.png b/docs/ja/integrations/data-visualization/images/mitzu_04.png new file mode 100644 index 00000000000..e9274cd7a0a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_05.png b/docs/ja/integrations/data-visualization/images/mitzu_05.png new file mode 100644 index 00000000000..dca2c7109f6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_06.png b/docs/ja/integrations/data-visualization/images/mitzu_06.png new file mode 100644 index 00000000000..dee7598f9c1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_07.png b/docs/ja/integrations/data-visualization/images/mitzu_07.png new file mode 100644 index 00000000000..95e2ba778cf Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_08.png b/docs/ja/integrations/data-visualization/images/mitzu_08.png new file mode 100644 index 00000000000..26b2c6a4fe6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_09.png b/docs/ja/integrations/data-visualization/images/mitzu_09.png new file mode 100644 index 00000000000..b3d192a394a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_10.png b/docs/ja/integrations/data-visualization/images/mitzu_10.png new file mode 100644 index 00000000000..630ffa79e2d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_11.png b/docs/ja/integrations/data-visualization/images/mitzu_11.png new file mode 100644 index 00000000000..dd273052c31 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/mitzu_12.png b/docs/ja/integrations/data-visualization/images/mitzu_12.png new file mode 100644 index 00000000000..91163e0c84f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/mitzu_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/omni_01.png b/docs/ja/integrations/data-visualization/images/omni_01.png new file mode 100644 index 00000000000..44363553e0a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/omni_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/omni_02.png b/docs/ja/integrations/data-visualization/images/omni_02.png new file mode 100644 index 00000000000..6520b031e30 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/omni_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_01.png b/docs/ja/integrations/data-visualization/images/powerbi_01.png new file mode 100644 index 00000000000..beecd2f3e73 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_02.png b/docs/ja/integrations/data-visualization/images/powerbi_02.png new file mode 100644 index 00000000000..16ebb42b950 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_03.png b/docs/ja/integrations/data-visualization/images/powerbi_03.png new file mode 100644 index 00000000000..923fae266a9 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_04.png b/docs/ja/integrations/data-visualization/images/powerbi_04.png new file mode 100644 index 00000000000..8537f869dee Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_05.png b/docs/ja/integrations/data-visualization/images/powerbi_05.png new file mode 100644 index 00000000000..2c82b39c0b0 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_06.png b/docs/ja/integrations/data-visualization/images/powerbi_06.png new file mode 100644 index 00000000000..025c4b55784 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_07.png b/docs/ja/integrations/data-visualization/images/powerbi_07.png new file mode 100644 index 00000000000..6c85c225f01 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_08.png b/docs/ja/integrations/data-visualization/images/powerbi_08.png new file mode 100644 index 00000000000..4ae7901b77b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_09.png b/docs/ja/integrations/data-visualization/images/powerbi_09.png new file mode 100644 index 00000000000..0f7bf60dff2 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_10.png b/docs/ja/integrations/data-visualization/images/powerbi_10.png new file mode 100644 index 00000000000..657c2d7d4b2 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_11.png b/docs/ja/integrations/data-visualization/images/powerbi_11.png new file mode 100644 index 00000000000..cdfc86ff09d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_12.png b/docs/ja/integrations/data-visualization/images/powerbi_12.png new file mode 100644 index 00000000000..3756f70b563 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_13.png b/docs/ja/integrations/data-visualization/images/powerbi_13.png new file mode 100644 index 00000000000..f5bce5166ae Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_13.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_14.png b/docs/ja/integrations/data-visualization/images/powerbi_14.png new file mode 100644 index 00000000000..de81379958e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_14.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_15.png b/docs/ja/integrations/data-visualization/images/powerbi_15.png new file mode 100644 index 00000000000..bff9861ba12 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_15.png differ diff --git a/docs/ja/integrations/data-visualization/images/powerbi_16.png b/docs/ja/integrations/data-visualization/images/powerbi_16.png new file mode 100644 index 00000000000..75d61fc7fac Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/powerbi_16.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_01.png b/docs/ja/integrations/data-visualization/images/quicksight_01.png new file mode 100644 index 00000000000..6ff51aa17cf Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_02.png b/docs/ja/integrations/data-visualization/images/quicksight_02.png new file mode 100644 index 00000000000..06f386e1e2e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_03.png b/docs/ja/integrations/data-visualization/images/quicksight_03.png new file mode 100644 index 00000000000..78a7470f36d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_04.png b/docs/ja/integrations/data-visualization/images/quicksight_04.png new file mode 100644 index 00000000000..2989cc4ed3b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_05.png b/docs/ja/integrations/data-visualization/images/quicksight_05.png new file mode 100644 index 00000000000..742dc0d6715 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_06.png b/docs/ja/integrations/data-visualization/images/quicksight_06.png new file mode 100644 index 00000000000..03eac2f2561 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/quicksight_07.png b/docs/ja/integrations/data-visualization/images/quicksight_07.png new file mode 100644 index 00000000000..9d9a444e402 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/quicksight_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_01.gif b/docs/ja/integrations/data-visualization/images/rocketbi_01.gif new file mode 100644 index 00000000000..e3356da7747 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_01.gif differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_02.gif b/docs/ja/integrations/data-visualization/images/rocketbi_02.gif new file mode 100644 index 00000000000..5b2e9fd6a1f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_02.gif differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_03.png b/docs/ja/integrations/data-visualization/images/rocketbi_03.png new file mode 100644 index 00000000000..db9852d4cba Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_04.png b/docs/ja/integrations/data-visualization/images/rocketbi_04.png new file mode 100644 index 00000000000..6c5246b25cd Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_05.png b/docs/ja/integrations/data-visualization/images/rocketbi_05.png new file mode 100644 index 00000000000..dfc2f805115 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_06.png b/docs/ja/integrations/data-visualization/images/rocketbi_06.png new file mode 100644 index 00000000000..9565506839c Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_07.png b/docs/ja/integrations/data-visualization/images/rocketbi_07.png new file mode 100644 index 00000000000..45cb375761b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_08.png b/docs/ja/integrations/data-visualization/images/rocketbi_08.png new file mode 100644 index 00000000000..213a8298b0e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_09.png b/docs/ja/integrations/data-visualization/images/rocketbi_09.png new file mode 100644 index 00000000000..24494ec5084 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_10.png b/docs/ja/integrations/data-visualization/images/rocketbi_10.png new file mode 100644 index 00000000000..d986dacacf7 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_11.png b/docs/ja/integrations/data-visualization/images/rocketbi_11.png new file mode 100644 index 00000000000..40844806ba7 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_12.png b/docs/ja/integrations/data-visualization/images/rocketbi_12.png new file mode 100644 index 00000000000..8c34cee85db Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_13.png b/docs/ja/integrations/data-visualization/images/rocketbi_13.png new file mode 100644 index 00000000000..542cc0c5ef7 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_13.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_14.png b/docs/ja/integrations/data-visualization/images/rocketbi_14.png new file mode 100644 index 00000000000..f85769f0ea4 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_14.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_15.png b/docs/ja/integrations/data-visualization/images/rocketbi_15.png new file mode 100644 index 00000000000..d57adf3cac1 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_15.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_16.png b/docs/ja/integrations/data-visualization/images/rocketbi_16.png new file mode 100644 index 00000000000..bbf498a52ce Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_16.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_17.png b/docs/ja/integrations/data-visualization/images/rocketbi_17.png new file mode 100644 index 00000000000..ac2c9a5bc36 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_17.png differ diff --git a/docs/ja/integrations/data-visualization/images/rocketbi_18.png b/docs/ja/integrations/data-visualization/images/rocketbi_18.png new file mode 100644 index 00000000000..e0db7cd199a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/rocketbi_18.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_01.png b/docs/ja/integrations/data-visualization/images/superset_01.png new file mode 100644 index 00000000000..52788b720b6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_02.png b/docs/ja/integrations/data-visualization/images/superset_02.png new file mode 100644 index 00000000000..6504d9f0ff9 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_03.png b/docs/ja/integrations/data-visualization/images/superset_03.png new file mode 100644 index 00000000000..149b7e98dd8 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_04.png b/docs/ja/integrations/data-visualization/images/superset_04.png new file mode 100644 index 00000000000..a98d7a36a36 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_05.png b/docs/ja/integrations/data-visualization/images/superset_05.png new file mode 100644 index 00000000000..aa6d01f95b6 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_06.png b/docs/ja/integrations/data-visualization/images/superset_06.png new file mode 100644 index 00000000000..09a08d25c6a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_07.png b/docs/ja/integrations/data-visualization/images/superset_07.png new file mode 100644 index 00000000000..c231203f716 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_08.png b/docs/ja/integrations/data-visualization/images/superset_08.png new file mode 100644 index 00000000000..3d40c421718 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_09.png b/docs/ja/integrations/data-visualization/images/superset_09.png new file mode 100644 index 00000000000..a69e32d49fe Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_09.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_10.png b/docs/ja/integrations/data-visualization/images/superset_10.png new file mode 100644 index 00000000000..8ee9f50e6af Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_10.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_11.png b/docs/ja/integrations/data-visualization/images/superset_11.png new file mode 100644 index 00000000000..40060fc7fdd Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_11.png differ diff --git a/docs/ja/integrations/data-visualization/images/superset_12.png b/docs/ja/integrations/data-visualization/images/superset_12.png new file mode 100644 index 00000000000..1251aa82179 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/superset_12.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_clickhousesettings.png b/docs/ja/integrations/data-visualization/images/tableau_clickhousesettings.png new file mode 100644 index 00000000000..cc609279eca Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_clickhousesettings.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_connecttoserver.png b/docs/ja/integrations/data-visualization/images/tableau_connecttoserver.png new file mode 100644 index 00000000000..b5a6376e65a Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_connecttoserver.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_01.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_01.png new file mode 100644 index 00000000000..c233dcdde7f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_02.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_02.png new file mode 100644 index 00000000000..54bd68e390c Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_03.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_03.png new file mode 100644 index 00000000000..6587b7d99fd Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_04.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_04.png new file mode 100644 index 00000000000..28f80e067a3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_desktop_05.png b/docs/ja/integrations/data-visualization/images/tableau_desktop_05.png new file mode 100644 index 00000000000..650b90b4fce Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_desktop_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_newworkbook.png b/docs/ja/integrations/data-visualization/images/tableau_newworkbook.png new file mode 100644 index 00000000000..eefacd53250 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_newworkbook.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_01.png b/docs/ja/integrations/data-visualization/images/tableau_online_01.png new file mode 100644 index 00000000000..a169e606f5b Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_02.png b/docs/ja/integrations/data-visualization/images/tableau_online_02.png new file mode 100644 index 00000000000..a5f856e7f14 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_03.png b/docs/ja/integrations/data-visualization/images/tableau_online_03.png new file mode 100644 index 00000000000..62ccc9d06b2 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_online_04.png b/docs/ja/integrations/data-visualization/images/tableau_online_04.png new file mode 100644 index 00000000000..c6994773a7c Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_online_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_showtables.png b/docs/ja/integrations/data-visualization/images/tableau_showtables.png new file mode 100644 index 00000000000..dc0b00b5599 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_showtables.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_tpcdschema.png b/docs/ja/integrations/data-visualization/images/tableau_tpcdschema.png new file mode 100644 index 00000000000..3c191b46fac Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_tpcdschema.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook1.png b/docs/ja/integrations/data-visualization/images/tableau_workbook1.png new file mode 100644 index 00000000000..695097574d3 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook1.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook2.png b/docs/ja/integrations/data-visualization/images/tableau_workbook2.png new file mode 100644 index 00000000000..fbac3f71e5d Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook2.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook3.png b/docs/ja/integrations/data-visualization/images/tableau_workbook3.png new file mode 100644 index 00000000000..d5efed5ff13 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook3.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook4.png b/docs/ja/integrations/data-visualization/images/tableau_workbook4.png new file mode 100644 index 00000000000..4855d888c45 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook4.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook5.png b/docs/ja/integrations/data-visualization/images/tableau_workbook5.png new file mode 100644 index 00000000000..2b0cb26d9c9 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook5.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook6.png b/docs/ja/integrations/data-visualization/images/tableau_workbook6.png new file mode 100644 index 00000000000..9f38512eb1f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook6.png differ diff --git a/docs/ja/integrations/data-visualization/images/tableau_workbook7.png b/docs/ja/integrations/data-visualization/images/tableau_workbook7.png new file mode 100644 index 00000000000..2ad5c8409c4 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/tableau_workbook7.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_01.png b/docs/ja/integrations/data-visualization/images/zing_01.png new file mode 100644 index 00000000000..ffb8338b369 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_01.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_02.png b/docs/ja/integrations/data-visualization/images/zing_02.png new file mode 100644 index 00000000000..9b74019b5f5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_02.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_03.png b/docs/ja/integrations/data-visualization/images/zing_03.png new file mode 100644 index 00000000000..2f76d36070f Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_03.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_04.png b/docs/ja/integrations/data-visualization/images/zing_04.png new file mode 100644 index 00000000000..02f5be00fd5 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_04.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_05.png b/docs/ja/integrations/data-visualization/images/zing_05.png new file mode 100644 index 00000000000..08d7b845a09 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_05.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_06.png b/docs/ja/integrations/data-visualization/images/zing_06.png new file mode 100644 index 00000000000..f3522c5f242 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_06.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_07.png b/docs/ja/integrations/data-visualization/images/zing_07.png new file mode 100644 index 00000000000..771fcaa06ca Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_07.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_08.png b/docs/ja/integrations/data-visualization/images/zing_08.png new file mode 100644 index 00000000000..668028d211e Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_08.png differ diff --git a/docs/ja/integrations/data-visualization/images/zing_09.png b/docs/ja/integrations/data-visualization/images/zing_09.png new file mode 100644 index 00000000000..3e88c504592 Binary files /dev/null and b/docs/ja/integrations/data-visualization/images/zing_09.png differ diff --git a/docs/ja/integrations/data-visualization/looker-and-clickhouse.md b/docs/ja/integrations/data-visualization/looker-and-clickhouse.md new file mode 100644 index 00000000000..8e8387ac801 --- /dev/null +++ b/docs/ja/integrations/data-visualization/looker-and-clickhouse.md @@ -0,0 +1,60 @@ +--- +sidebar_label: Looker +slug: /ja/integrations/looker +keywords: [clickhouse, looker, connect, integrate, ui] +description: Lookerは、リアルタイムでインサイトを探索し共有するのに役立つエンタープライズプラットフォームであり、BI、データアプリケーション、および組み込み分析を提供します。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Looker + +Lookerは、公式のClickHouseデータソースを通じて、ClickHouse Cloudまたはオンプレミスのデプロイメントに接続できます。 + +## 1. 接続詳細の収集 + + +## 2. ClickHouseデータソースを作成する + +管理者 -> データベース -> 接続に移動し、右上の「接続を追加」ボタンをクリックします。 + +新しい接続を追加 +
+ +データソースの名前を選択し、方言のドロップダウンから `ClickHouse` を選びます。フォームに資格情報を入力します。 + +資格情報を指定 +
+ +ClickHouse Cloudを使用している場合やデプロイメントにSSLが必要な場合は、追加の設定でSSLをオンにしていることを確認してください。 + +SSLを有効化 +
+ +まず接続をテストし、それが完了したら、新しいClickHouseデータソースに接続します。 + +接続テスト完了 +
+ +これで、LookerプロジェクトにClickHouseデータソースをアタッチできるようになります。 + +## 3. 既知の制限事項 + +1. 以下のデータ型はデフォルトで文字列として処理されます: + * Array - JDBCドライバーの制限によりシリアル化が予期した通りに動作しません + * Decimal* - モデル内で数値に変更できます + * LowCardinality(...) - モデル内で適切な型に変更できます + * Enum8, Enum16 + * UUID + * Tuple + * Map + * JSON + * Nested + * FixedString + * Geo types + * MultiPolygon + * Polygon + * Point + * Ring +2. [対称集計機能](https://cloud.google.com/looker/docs/reference/param-explore-symmetric-aggregates)はサポートされていません +3. [フル外部結合](https://cloud.google.com/looker/docs/reference/param-explore-join-type#full_outer)はドライバーでまだ実装されていません diff --git a/docs/ja/integrations/data-visualization/looker-studio-and-clickhouse.md b/docs/ja/integrations/data-visualization/looker-studio-and-clickhouse.md new file mode 100644 index 00000000000..fb09f2736d2 --- /dev/null +++ b/docs/ja/integrations/data-visualization/looker-studio-and-clickhouse.md @@ -0,0 +1,67 @@ +--- +sidebar_label: Looker Studio +slug: /ja/integrations/lookerstudio +keywords: [clickhouse, looker, studio, connect, mysql, integrate, ui] +description: Looker Studio(以前のGoogleデータスタジオ)は、データをカスタマイズ可能な情報報告書やダッシュボードに変換するオンラインツールです。 +--- + +import MySQLCloudSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx'; +import MySQLOnPremiseSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx'; + +# Looker Studio + +Looker Studioは、公式のGoogle MySQLデータソースを使用して、MySQLインターフェース経由でClickHouseに接続できます。 + +## ClickHouse Cloudのセットアップ + + +## オンプレミスClickHouseサーバーのセットアップ + + +## Looker StudioをClickHouseに接続する + +まず、https://lookerstudio.google.com にGoogleアカウントでログインし、新しいデータソースを作成します。 + +新しいデータソースの作成 +
+ +Googleが提供する公式のMySQLコネクタ(名称は単に**MySQL**)を検索します。 + +MySQLコネクタの検索 +
+ +接続の詳細を指定します。MySQLインターフェースのポートはデフォルトで9004で、サーバーの設定によって異なる場合があります。 + +接続の詳細を指定 +
+ +次に、ClickHouseからデータを取得する方法を2つ選ぶことができます。まず、テーブルブラウザ機能を使用することができます。 + +テーブルブラウザの使用 +
+ +または、カスタムクエリを指定してデータを取得することもできます。 + +カスタムクエリを使用してデータを取得 +
+ +最後に、イントロスペクトされたテーブル構造を確認し、必要に応じてデータ型を調整できます。 + +イントロスペクトされたテーブル構造の表示 +
+ +これで、データの探査や新しいレポートの作成を進めることができます! + +## ClickHouse CloudでLooker Studioを使用する + +ClickHouse Cloudを使用する場合、最初にMySQLインターフェースを有効にする必要があります。接続ダイアログの「MySQL」タブでそれを行うことができます。 + +MySQLの有効化が必要 +
+ +Looker StudioのUIで「SSLを有効にする」オプションを選択します。ClickHouse CloudのSSL証明書は[Let's Encrypt](https://letsencrypt.org/certificates/)により署名されています。このルート証明書を[こちら](https://letsencrypt.org/certs/isrgrootx1.pem)からダウンロードできます。 + +ClickHouse CloudでのSSL設定 +
+ +その後の手順は、前述のセクションに記載されている手順と同じです。 diff --git a/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md b/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md new file mode 100644 index 00000000000..5a12200f8c8 --- /dev/null +++ b/docs/ja/integrations/data-visualization/metabase-and-clickhouse.md @@ -0,0 +1,90 @@ +--- +sidebar_label: Metabase +sidebar_position: 131 +slug: /ja/integrations/metabase +keywords: [clickhouse, metabase, 接続, 統合, UI] +description: Metabaseは、データに関する質問をするための使いやすいオープンソースのUIツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# MetabaseをClickHouseに接続する + +Metabaseは、データに関する質問をするための使いやすいオープンソースのUIツールです。MetabaseはJavaアプリケーションであり、JARファイルをダウンロードして`java -jar metabase.jar`で実行するだけで動作します。Metabaseは、JDBCドライバーを使用してClickHouseに接続します。このドライバーはダウンロードして`plugins`フォルダに配置する必要があります。 + +## 目的 + +このガイドでは、Metabaseを使用してClickHouseのデータに関するいくつかの質問をして、回答を視覚化します。その回答の一例は次のようになります: + + Pie Chart +

+ +:::tip データを追加する +作業するデータセットがない場合は、例のデータセットを追加できます。このガイドでは[UK Price Paid](/docs/ja/getting-started/example-datasets/uk-price-paid.md)データセットを使用するため、それを選ぶこともできます。同じドキュメンテーションカテゴリには他にもいくつかの選択肢があります。 +::: + +## 1. 接続の詳細を集める + + +## 2. Metabase用のClickHouseプラグインをダウンロードする + +1. `plugins`フォルダがない場合は、`metabase.jar`が保存されている場所のサブフォルダとして作成してください。 + +2. プラグインは`clickhouse.metabase-driver.jar`という名前のJARファイルです。最新バージョンのJARファイルをhttps://github.com/clickhouse/metabase-clickhouse-driver/releases/latestからダウンロードしてください。 + +3. `clickhouse.metabase-driver.jar`を`plugins`フォルダに保存します。 + +4. ドライバーが正しく読み込まれるようにMetabaseを開始(または再起動)します。 + +5. Metabaseをhttp://hostname:3000でアクセスします。初回起動時にはウェルカム画面が表示され、一連の質問を通過する必要があります。データベースの選択を促された場合は、「**後でデータを追加します**」を選択してください: + +## 3. MetabaseをClickHouseに接続する + +1. 右上の歯車アイコンをクリックして、**Admin Settings**を選択し、Metabase管理ページにアクセスします。 + +2. **データベースを追加**をクリックします。または、**データベース**タブをクリックして、**データベースを追加**ボタンを選択します。 + +3. ドライバーのインストールが正常に行われた場合は、ドロップダウンメニューの**データベースタイプ**として**ClickHouse**が表示されます: + + Add a ClickHouse database + +4. データベースに**表示名**を付けます。これはMetabaseの設定であるため、任意の名前を使用できます。 + +5. ClickHouseデータベースの接続詳細を入力します。ClickHouseサーバーがSSLを使用するように設定されている場合は、セキュア接続を有効にします。例: + + Connection details + +6. **保存**ボタンをクリックすると、Metabaseはデータベースのテーブルをスキャンします。 + +## 4. SQLクエリを実行する + +1. 右上の**Exit admin**ボタンをクリックして**管理設定**を終了します。 + +2. 右上の**+ New**メニューをクリックすると、質問を行い、SQLクエリを実行し、ダッシュボードを作成することができます: + + New menu + +3. 例えば、1995年から2022年までの年ごとの平均価格を返す`uk_price_paid`テーブルに対して実行されたSQLクエリは次の通りです: + + Run a SQL query + +## 5. 質問をする + +1. **+ New**をクリックし、**Question**を選択します。データベースとテーブルを基に質問を構築できます。例えば、以下の質問は`default`データベース内の`uk_price_paid`テーブルに関するものです。グレーター・マンチェスター郡内の町ごとの平均価格を計算する簡単な質問です: + + New question + +2. **Visualize**ボタンをクリックして、結果を表形式で表示します。 + + New question + +3. 結果の下にある**Visualization**ボタンをクリックして、視覚化を棒グラフ(または他の利用可能なオプションのいずれか)に変更します: + + Pie Chart visualization + +## 詳しく学ぶ + +Metabaseおよびダッシュボードの構築方法についての詳細は、Metabaseのドキュメンテーションを訪問してください。 + +## 関連コンテンツ + +- ブログ: [データの視覚化 - 第3部 - Metabase](https://clickhouse.com/blog/visualizing-data-with-metabase) diff --git a/docs/ja/integrations/data-visualization/mitzu-and-clickhouse.md b/docs/ja/integrations/data-visualization/mitzu-and-clickhouse.md new file mode 100644 index 00000000000..1e088bc9c28 --- /dev/null +++ b/docs/ja/integrations/data-visualization/mitzu-and-clickhouse.md @@ -0,0 +1,161 @@ +--- +sidebar_label: Mitzu +slug: /ja/integrations/mitzu +keywords: [clickhouse, mitzu, connect, integrate, ui] +description: Mitzuはノーコードのデータウェアハウスネイティブ製品分析アプリケーションです。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# MitzuをClickHouseに接続する + +Mitzuはノーコードのデータウェアハウスネイティブ製品分析アプリケーションです。Amplitude、Mixpanel、Posthogと同様に、MitzuはユーザーがSQLやPythonの知識なしに製品使用データをクエリできるようにします。Mitzuは企業の製品使用データをコピーするのではなく、企業のデータウェアハウスやデータレイク上でネイティブなSQLクエリを生成します。 + +## 目的 + +本ガイドでは以下をカバーします: + +- データウェアハウスネイティブの製品分析 +- MitzuをClickHouseに統合する方法 + +:::tip サンプルデータセット +Mitzuで使用するデータセットがない場合は、NYC Taxi Dataを使用できます。このデータセットはClickhouse Cloudで利用可能です。 +::: + +## 1. 接続情報を集める + + + +## 2. Mitzuにサインインまたはサインアップ + +最初のステップとして[https://app.mitzu.io](https://app.mitzu.io)にアクセスしてサインアップしてください。 + +サインイン + +## 3. ワークスペースを作成する + +組織を作成した後、最初のワークスペースを作成するように求められます。 + +ワークスペースを作成 + +## 4. MitzuをClickHouseに接続する + +ワークスペースが作成されたら、接続情報を手動で設定する必要があります。 + +接続情報を設定 + +ガイド付きオンボーディングでは、Mitzuは単一のテーブルと統合することができます。 + +> ClickHouseセットアップで製品分析を行うには、テーブルのいくつかの重要なカラムを指定する必要があります。 +> +> 以下がそのカラムです: +> +> - **ユーザーID** - ユーザーのユニークな識別子のカラム。 +> - **イベント時間** - イベントのタイムスタンプのカラム。 +> - オプション[**イベント名**] - テーブルに複数のイベントタイプが含まれている場合、イベントをセグメントするカラム。 + +テーブル接続を設定 + +
+ +:::tip 追加のテーブルを追加 +最初のガイド付きセットアップが完了した後、追加のテーブルを追加することが可能です。以下を参照してください。 +::: + +## 5. イベントカタログを作成する + +オンボーディングの最終ステップは、`イベントカタログ`の作成です。 + +イベントカタログを作成 + +このステップでは、上記で定義されたテーブルからすべてのイベントとそのプロパティを見つけます。 +このステップはデータセットのサイズによりますが、数分かかる場合があります。 + +すべてがうまくいけば、イベントを探索する準備が整います。 +探索する + +## 6. セグメンテーションクエリを実行する + +Mitzuでのユーザーセグメンテーションは、Amplitude、Mixpanel、Posthogと同様に簡単です。 + +探索ページの左側でイベントを選択し、時間軸の設定は上部で行います。 + +セグメンテーション + +
+ +:::tip フィルターとブレークダウン +フィルタリングは期待通りに行えます。プロパティ(ClickHouseカラム)を選び、フィルターしたい値をドロップダウンから選択します。 +ブレークダウンの場合は、任意のイベントまたはユーザープロパティを選択します(ユーザープロパティを統合する方法は以下を参照)。 +::: + +## 7. ファネルクエリを実行する + +ファネルのために最大9ステップを選択します。ファネルがユーザーによって完了される時間枠を選択します。 +単一行のSQLコードを書くことなく、すぐにコンバージョン率の洞察を得ることができます。 + +ファネル + +
+ +:::tip 傾向を視覚化する +`ファネル傾向`を選択して、時間の経過とともにファネルの傾向を視覚化します。 +::: + +## 8. リテンションクエリを実行する + +リテンション率計算のために最大2ステップを選択します。再帰的なウィンドウを選択するためのリテンションウィンドウを選択します。 +単一のSQLコードを書くことなく、すぐにコンバージョン率の洞察を得ることができます。 + +リテンション + +
+ +:::tip コホートリテンション +`週間コホートリテンション`を選択して、リテンション率が時間の経過とともにどのように変化しているかを視覚化します。 +::: + +## 9. SQLネイティブ + +MitzuはSQLネイティブです。これにより、Exploreページで選択した構成に基づいてネイティブSQLコードを生成します。 + +SQLネイティブ + +
+ +:::tip BIツールで作業を続ける +MitzuのUIで制限に達した場合、SQLコードをコピーしてBIツールで作業を続けることができます。 +::: + +## 10. イベントテーブルを追加する + +複数のテーブルに製品使用イベントを保存している場合、それらをイベントカタログにも追加できます。 +ページ上部のギアアイコンからワークスペース設定ページに移動し、イベントテーブルタブを選択します。 + +ClickHouseウェアハウスから残りのイベントテーブルを追加します。 + +追加のテーブル + +
+ +すべての他のイベントテーブルをワークスペースに追加したら、それらも設定する必要があります。 +**ユーザーID**、**イベント時間**、およびオプションで**イベント名**カラムを設定します。 + +テーブルを設定 + +設定ボタンをクリックし、一括でこれらのカラムを設定します。 +Mitzuには最大5000テーブルを追加できます。 + +最後に、**イベントカタログを保存して更新**することを忘れないでください。 + +## Mitzuサポート + +迷った場合は、[support@mitzu.io](email://support@mitzu.io)までお気軽にお問い合わせください。 + +または、Slackコミュニティに[こちら](https://join.slack.com/t/mitzu-io/shared_invite/zt-1h1ykr93a-_VtVu0XshfspFjOg6sczKg)から参加できます。 + +## 詳細を学ぶ + +Mitzuに関する詳細情報は[mitzu.io](https://mitzu.io)をご覧ください。 + +ドキュメントページは[docs.mitzu.io](https://docs.mitzu.io)に訪問してください。 diff --git a/docs/ja/integrations/data-visualization/omni-and-clickhouse.md b/docs/ja/integrations/data-visualization/omni-and-clickhouse.md new file mode 100644 index 00000000000..286aa0e7c3f --- /dev/null +++ b/docs/ja/integrations/data-visualization/omni-and-clickhouse.md @@ -0,0 +1,30 @@ +--- +sidebar_label: Omni +slug: /ja/integrations/omni +keywords: [clickhouse, omni, connect, integrate, ui] +description: Omniは、BI、データアプリケーション、埋め込み分析のためのエンタープライズプラットフォームで、リアルタイムでインサイトを探索し共有するのに役立ちます。 +--- + +import ConnectionDetails from '@site/docs/ja/\_snippets/\_gather_your_details_http.mdx'; + +# Omni + +Omniは、公式のClickHouseデータソースを通じて、ClickHouse Cloudまたはオンプレミス展開に接続することができます。 + +## 1. 接続情報を収集する + + + +## 2. ClickHouseデータソースを作成する + +Admin -> Connectionsに移動し、右上の「Add Connection」ボタンをクリックします。 + +新しい接続の追加 +
+ +`ClickHouse`を選択し、フォームに資格情報を入力します。 + +資格情報の指定 +
+ +これで、OmniでClickHouseからデータのクエリを実行し、可視化できるようになります。 diff --git a/docs/ja/integrations/data-visualization/powerbi-and-clickhouse.md b/docs/ja/integrations/data-visualization/powerbi-and-clickhouse.md new file mode 100644 index 00000000000..1baa8b5e29b --- /dev/null +++ b/docs/ja/integrations/data-visualization/powerbi-and-clickhouse.md @@ -0,0 +1,168 @@ +--- +sidebar_label: Power BI +slug: /ja/integrations/powerbi +keywords: [ clickhouse, powerbi, connect, integrate, ui ] +description: Microsoft Power BIは、ビジネスインテリジェンスに主眼を置いてMicrosoftが開発したインタラクティブなデータ可視化ソフトウェア製品です。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Power BI + +Power BIは、[ODBCドライバー](https://github.com/ClickHouse/clickhouse-odbc)や[ClickHouseネイティブコネクタ](https://github.com/ClickHouse/power-bi-clickhouse)を使用して、ClickHouse Cloudまたはオンプレミスのデプロイメントからデータを読み込むことができます。どちらの方法もロードモードをサポートしていますが、後者はDirect Queryモードもサポートし、テーブル全体をロードする必要がありません。 + +このチュートリアルでは、これらの方法のどちらかを使用してデータを読み込むプロセスを案内します。 +
+
+
+ +# ClickHouseネイティブコネクタ + +## 1. 接続情報を集める + + + +## 2. ClickHouse ODBCクライアントをインストールする + +最新のClickHouse ODBCリリースを[こちら](https://github.com/ClickHouse/clickhouse-odbc/releases)からダウンロードしてください。付属の`.msi`インストーラーを実行し、ウィザードに従ってください。"デバッグシンボル"はオプションで必要ありませんので、デフォルトのままで大丈夫です。 + +ODBCドライバーのインストール +
+ +ドライバーのインストールが完了したら、インストールが成功したことを確認できます。スタートメニューでODBCを検索し、「ODBCデータソース **(64-bit)**」を選択します。 + +新しいODBCデータソースの作成 +
+ +ClickHouseドライバーがリストにあることを確認します。 + +ODBCの存在確認 +
+ +まだPower BIがインストールされていない場合は、[Power BI Desktopをダウンロードしてインストール](https://www.microsoft.com/en-us/download/details.aspx?id=58494)してください。 + +## 3. ClickHouseネイティブコネクタをインストールする + +* カスタムコネクター用に次のディレクトリを作成します:[Documents]\Power BI Desktop\Custom Connectors +* 最新のリリース (.mezファイル) を[Releases Section](https://github.com/ClickHouse/power-bi-clickhouse/releases)からダウンロードし、前のステップで作成したディレクトリに配置します。 +* Power BIを開き、署名されていないコネクタの読み込みを有効にします:ファイル -> オプションと設定 -> オプション -> セキュリティ -> データ拡張 -> 警告なしまたは検証なしで任意の拡張機能をロードすることを許可 + +署名されていないコネクタの読み込みを有効にする +
+ +* Power BIを再起動します。 + +## 4. Power BIにデータを取得する + +Power BI Desktopの開始画面で、「データ取得」をクリックします。 + +Power BI Desktopの開始 +
+ +「ClickHouseConnector (Beta)」を検索します。 + +データソースの選択 +
+ +コネクタを選択し、次のボックスを埋めます: + +* サーバー(必須フィールド) - インスタンスのドメイン/アドレス。プレフィックス/サフィックスなしで追加してください。 +* ポート(必須フィールド) - インスタンスのポート。 +* データベース - データベース名。 +* オプション - [ClickHouse ODBC GitHubページ](https://github.com/ClickHouse/clickhouse-odbc#configuration)にリストされている任意のODBCオプション +* データ接続モード - ClickHouseに直接クエリを行うためにDirectQueryを選択します。小さな負荷がある場合は、インポートモードを選択し、データ全体をPower BIにロードすることができます。 + +ClickHouseインスタンス情報の入力 +
+ +* ユーザー名とパスワードを指定します。 + +ユーザー名とパスワードのプロンプト +
+ +最後に、Navigatorビューでデータベースとテーブルが表示されるはずです。希望のテーブルを選択し、「ロード」をクリックしてClickHouseからデータをインポートします。 + +Navigatorビュー +
+ +インポートが完了すると、通常通りPower BIでClickHouseデータにアクセスできるようになります。 +
+ +## Power BIサービス + +クラウドでの使用については、Microsoftのドキュメントを参照してください。オンプレミスデータゲートウェイを使用して[カスタムデータコネクタを使用する](https://learn.microsoft.com/en-us/power-bi/connect-data/service-gateway-custom-connectors)方法をご覧ください。 +## +
+
+ +# ODBCドライバー + +上記のネイティブコネクタセクションのステップ1と2に従ってください。 + +## 3. 新しいユーザーDSNを作成する + +ドライバーのインストールが完了したら、ODBCデータソースを作成できます。スタートメニューでODBCを検索し、「ODBCデータソース (64-bit)」を選択します。 + +新しいODBCデータソースの作成 +
+ +ここで新しいユーザーDSNを追加する必要があります。左の「追加」ボタンをクリックします。 + +新しいユーザーDSNの追加 +
+ +ODBCドライバーのUnicodeバージョンを選択します。 + +Unicodeバージョンの選択 +
+ +接続情報を入力します。「ホスト」フィールドにはプロトコルを含めないでください(例: http:// や https:// 部分を省略)。ClickHouse Cloudを使用している場合やオンプレミスのデプロイメントでSSLが有効になっている場合、「SSLMode」フィールドにrequireと入力します。「タイムアウト」フィールド値は秒単位で設定され、省略された場合はデフォルト値の30秒になります。 + +接続情報 +
+ +## 4. Power BIにデータを取得する + +まだPower BIがインストールされていない場合は、[Power BI Desktopをダウンロードしてインストール](https://www.microsoft.com/en-us/download/details.aspx?id=58494)してください。 + +Power BI Desktopの開始画面で、「データ取得」をクリックします。 + +Power BI Desktopの開始 +
+ +「その他」 -> 「ODBC」を選択します。 + +データソースメニュー +
+ +リストから先ほど作成したデータソースを選択します。 + +ODBCデータソースの選択 +
+ +データソース作成時にすべての資格情報を指定した場合、すぐに接続するはずです。そうでない場合は、ユーザー名とパスワードを指定するよう求められます。 + +Navigatorビュー +
+ +最後に、Navigatorビューでデータベースとテーブルが表示されるはずです。希望のテーブルを選択し、「ロード」をクリックしてClickHouseからデータをインポートします。 + +Navigatorビュー +
+ +インポートが完了すると、通常通りPower BIでClickHouseデータにアクセスできるようになります。 +
+
+ +:::note +UInt64などの符号なし整数型は、自動的にはデータセットにロードされません。Power BIでサポートされている最大の整数型はInt64です。
+データを正しくインポートするには、Navigatorで「ロード」ボタンを押す前に、「データを変換」をクリックしてください。 +::: + +この例では、`pageviews`テーブルにUInt64カラムがあり、デフォルトでは「バイナリ」として認識されています。「データを変換」を行うことで、カラムの型を再割り当てし、例えばTextとして設定することができます。 + +Navigatorビュー +
+ +完了したら、左上の「閉じて適用」をクリックし、データのロードを続行します。 diff --git a/docs/ja/integrations/data-visualization/quicksight-and-clickhouse.md b/docs/ja/integrations/data-visualization/quicksight-and-clickhouse.md new file mode 100644 index 00000000000..18bb4954d4c --- /dev/null +++ b/docs/ja/integrations/data-visualization/quicksight-and-clickhouse.md @@ -0,0 +1,146 @@ +--- +sidebar_label: QuickSight +slug: /ja/integrations/quicksight +keywords: [clickhouse, aws, amazon, quicksight, mysql, connect, integrate, ui] +description: Amazon QuickSightは、ハイパースケールで統一されたビジネスインテリジェンス(BI)を提供するデータ駆動の組織をサポートします。 +--- + +import MySQLOnPremiseSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx'; + +# QuickSight + +QuickSightは、公式のMySQLデータソースおよびDirect Queryモードを使用して、MySQLインターフェースを介してオンプレミスのClickHouseセットアップ(23.11+)に接続できます。 + +## オンプレミスClickHouseサーバーの設定 + +MySQLインターフェースを有効にしたClickHouseサーバーの設定方法については、[公式ドキュメント](https://clickhouse.com/docs/ja/interfaces/mysql)を参照してください。 + +サーバーの`config.xml`にエントリを追加することに加えて + +```xml + + 9004 + +``` + +Double SHA1パスワード暗号化を使用することが_必須_です。ユーザーがMySQLインターフェースを使用する際の設定です。 + +シェルからDouble SHA1で暗号化されたランダムパスワードを生成するには: + +```shell +PASSWORD=$(base64 < /dev/urandom | head -c16); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-' +``` + +出力は次のようになります: + +``` +LZOQYnqQN4L/T6L0 +fbc958cc745a82188a51f30de69eebfc67c40ee4 +``` + +1行目が生成されたパスワードで、2行目がClickHouseを設定するために使用できるハッシュです。 + +以下は、生成されたハッシュを使用する`mysql_user`の設定例です: + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + fbc958cc745a82188a51f30de69eebfc67c40ee4 + + ::/0 + + default + default + + +``` + +`password_double_sha1_hex`のエントリを、自分で生成したDouble SHA1ハッシュに置き換えてください。 + +QuickSightは、MySQLユーザーのプロファイルにいくつかの追加設定が必要です。 + +`/etc/clickhouse-server/users.d/mysql_user.xml` + +```xml + + + 1 + 1 + 1 + 1 + + +``` + +ただし、これをデフォルトのものではなく、MySQLユーザーが使用できる別のプロファイルに割り当てることをお勧めします。 + +最後に、ClickHouseサーバーを希望するIPアドレスでリッスンするように設定します。 `config.xml`で、次の部分のコメントを解除して、すべてのアドレスでリッスンするように設定します: + +```bash +:: +``` + +`mysql`バイナリが利用可能な場合は、コマンドラインから接続をテストできます。 上記のサンプルユーザー名(`mysql_user`)とパスワード(`LZOQYnqQN4L/T6L0`)を使用してコマンドラインで次のようにします: + +```bash +mysql --protocol tcp -h localhost -u mysql_user -P 9004 --password=LZOQYnqQN4L/T6L0 +``` + +``` +mysql> show databases; ++--------------------+ +| name | ++--------------------+ +| INFORMATION_SCHEMA | +| default | +| information_schema | +| system | ++--------------------+ +4 rows in set (0.00 sec) +Read 4 rows, 603.00 B in 0.00156 sec., 2564 rows/sec., 377.48 KiB/sec. +``` + +## QuickSightとClickHouseの接続 + +まず、https://quicksight.aws.amazon.com にアクセスし、[データセット] に移動して、「新しいデータセット」をクリックします。 + +Creating a new dataset +
+ +QuickSightにバンドルされている公式のMySQLコネクタ(**MySQL**のみ)を検索します。 + +MySQL connector search +
+ +接続の詳細を指定します。 MySQLインターフェースのポートはデフォルトで9004で、サーバー構成により異なる場合があります。 + +Specifying the connection details +
+ +次に、ClickHouseからデータを取得する方法として2つのオプションがあります。 まず、リストからテーブルを選択する方法です。 + +Selecting a table from the list +
+ +あるいは、カスタムSQLを指定してデータを取得することもできます。 + +Using custom SQL to fetch the data +
+ +「データの編集/プレビュー」をクリックすると、イントロスペクトされたテーブル構造を確認するか、データを取得する方法としてカスタムSQLを使用する場合は調整を行うことができます。 + +Viewing the introspected table structure +
+ +UIの左下隅で「Direct Query」モードが選択されていることを確認してください。 + +Choosing the Direct Query mode +
+ +これでデータセットの公開と新しいビジュアル化の作成を進めることができます! + +## 既知の制限事項 + +- SPICEインポートは期待通りに動作しません。Direct Queryモードを使用してください。[#58553](https://github.com/ClickHouse/ClickHouse/issues/58553)を参照してください。 diff --git a/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md b/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md new file mode 100644 index 00000000000..71b887c70ec --- /dev/null +++ b/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md @@ -0,0 +1,134 @@ +--- +sidebar_label: Rocket BI +sidebar_position: 131 +slug: /ja/integrations/rocketbi +keywords: [clickhouse, rocketbi, connect, integrate, ui] +description: RocketBIは、データを迅速に分析し、ドラッグ&ドロップでビジュアライゼーションを構築し、ウェブブラウザ上で同僚と共同作業できるセルフサービスのビジネスインテリジェンスプラットフォームです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# 目標: 最初のダッシュボードを作成する + +このガイドでは、Rocket.BIをインストールして簡単なダッシュボードを作成します。 +以下がそのダッシュボードです: + +github_rocketbi2 +
+ +[こちらのリンクからダッシュボードを確認できます。](https://demo.rocket.bi/dashboard/sales-dashboard-7?token=7eecf750-cbde-4c53-8fa8-8b905fec667e) + +## インストール + +事前にビルドされたDockerイメージを使用してRocketBIを起動します。 + +docker-compose.ymlと設定ファイルを取得します: +``` +wget https://raw.githubusercontent.com/datainsider-co/rocket-bi/main/docker/docker-compose.yml +wget https://raw.githubusercontent.com/datainsider-co/rocket-bi/main/docker/.clickhouse.env +``` +.clickhouse.envを編集し、ClickHouseサーバーの情報を追加します。 + +以下のコマンドでRocketBIを開始します: ```docker-compose up -d``` + +ブラウザで```localhost:5050```を開き、こちらのアカウントでログインします: ```hello@gmail.com/123456``` + +ソースからのビルドや高度な設定については、[Rocket.BI Readme](https://github.com/datainsider-co/rocket-bi/blob/main/README.md)をご参照ください。 + +## ダッシュボードを作ってみましょう + +ダッシュボードでは、レポートを見つけることができ、**+New**をクリックして視覚化を開始します。 +ダッシュボードで**無制限のダッシュボード**と**無制限のチャート**を作成できます。 + +rocketbi_create_chart +
+ +YouTubeで高解像度のチュートリアルを見る:[https://www.youtube.com/watch?v=TMkdMHHfvqY](https://www.youtube.com/watch?v=TMkdMHHfvqY) + +### チャートコントロールを作成する + +#### メトリクスコントロールを作成 +タブフィルターで使用したいメトリックフィールドを選択します。集計設定を確認してください。 + +rocketbi_chart_6 +
+ +フィルタに名前を付け、コントロールをダッシュボードに保存します。 + +Metrics Control + +#### 日付型コントロールを作成 +メインの日付カラムとして日付フィールドを選択します: + +rocketbi_chart_4 +
+ +異なるルックアップ範囲で重複バリアントを追加します。例えば、年、月、日付や曜日など。 + +rocketbi_chart_5 +
+ +フィルタに名前を付け、コントロールをダッシュボードに保存します。 + +Date Range Control + +### さあ、チャートを作りましょう + +#### 円グラフ: 地域別売上指標 +新しいチャートを追加し、円グラフを選択します。 + +Add Pie Chart +
+ +まず、データセットからカラム「Region」をドラッグ&ドロップして凡例フィールドに配置します。 + +Drag-n-drop Column to Chart +
+ +その後、チャートコントロールタブに移動します。 + +Navigate to Chart Control in Visualization +
+ +メトリクスコントロールを値フィールドにドラッグ&ドロップします。 + +Use Metrics Control in Chart +
+ +(メトリクスコントロールはソートとしても使えます) + +さらなるカスタマイズのためにチャート設定に移動します。 + +Custom the Chart with Setting +
+ +例えば、データラベルをパーセンテージに変更します。 + +Chart Customization Example +
+ +チャートを保存してダッシュボードに追加します。 + +Overview Dashboard with Pie Chart + +#### 時系列チャートに日付コントロールを使用 +積み上げカラムチャートを使用しましょう。 + +Create a Time-series chart with Tab Control +
+ +チャートコントロールで、メトリクスコントロールをY軸、日付範囲をX軸に使用します。 + +Use Date Range as Controller +
+ +地域カラムをブレークダウンに追加します。 + +Add Region into Breakdown +
+ +KPIとしてナンバーチャートを追加し、ダッシュボードを目立たせます。 + +Screenshot 2022-11-17 at 10 43 29 +
+ +これで、rocket.BIを使って最初のダッシュボードを無事に作成しました。 diff --git a/docs/ja/integrations/data-visualization/splunk-and-clickhouse.md b/docs/ja/integrations/data-visualization/splunk-and-clickhouse.md new file mode 100644 index 00000000000..e4617b3d4ea --- /dev/null +++ b/docs/ja/integrations/data-visualization/splunk-and-clickhouse.md @@ -0,0 +1,178 @@ +--- +sidebar_label: Splunk +sidebar_position: 198 +slug: /ja/integrations/splunk +keywords: [splunk, integration, data visualization] +description: SplunkダッシュボードをClickHouseに接続する +--- + +# SplunkをClickHouseに接続する + +Splunkはセキュリティと可観測性のための人気のある技術です。また、強力な検索エンジンとダッシュボーディングエンジンでもあります。さまざまなユースケースに対応するための数百のSplunkアプリが利用可能です。 + +ClickHouseに特化した利用として、[Splunk DB Connect App](https://splunkbase.splunk.com/app/2686)を活用し、ClickHouse JDBCドライバーを使ってClickHouseのテーブルを直接クエリします。 + +この統合の理想的なユースケースは、ClickHouseをnetflow、AvroまたはProtobufバイナリデータ、DNS、VPCフローログ、その他のOTELログのような大規模データソースのために使用している場合です。これらのデータはSplunk上で検索やダッシュボード作成を行うためにチームと共有できます。このアプローチを使用することで、データはSplunkのインデックスレイヤーに取り込まれず、[Metabase](https://www.metabase.com/)や[Superset](https://superset.apache.org/)のような他のビジュアライゼーション統合と同様にClickHouseから直接クエリされます。 + +## 目標 + +このガイドでは、ClickHouse JDBCドライバーを使用してClickHouseをSplunkに接続します。ローカル版のSplunk Enterpriseをインストールしますが、データはインデックス化されません。代わりに、DB Connectクエリエンジンを通して検索機能を使用します。 + +このガイドを使用すると、ClickHouseに接続された以下のようなダッシュボードを作成できます: + +![Splunk 1](../images/splunk/splunk-1.png) + +:::note +このガイドでは[ニューヨーク市タクシーデータセット](https://clickhouse.com/docs/ja/getting-started/example-datasets/nyc-taxi)を使用します。他にも使用可能なデータセットは[当社のドキュメント](http://localhost:3000/docs/en/getting-started/example-datasets)にあります。 +::: + +## 前提条件 + +開始する前に必要なもの: +- 検索ヘッド機能を使用するためのSplunk Enterprise +- お使いのOSまたはコンテナにインストールされている[Java Runtime Environment (JRE)](https://docs.splunk.com/Documentation/DBX/3.16.0/DeployDBX/Prerequisites) +- [Splunk DB Connect](https://splunkbase.splunk.com/app/2686) +- Splunk Enterprise OSインスタンスへの管理者アクセスまたはSSHアクセス +- ClickHouse接続の詳細 (ClickHouse Cloudを使用している場合の詳細は[こちら](https://clickhouse.com/docs/ja/integrations/metabase#1-gather-your-connection-details)を参照) + +## Splunk EnterpriseにDB Connectをインストールして設定する + +まず、Splunk EnterpriseインスタンスにJava Runtime Environmentをインストールする必要があります。Dockerを使用している場合、`microdnf install java-11-openjdk`コマンドを使用できます。 + +`java_home`パスをメモしておきます:`java -XshowSettings:properties -version`。 + +Splunk EnterpriseにDB Connect Appがインストールされていることを確認してください。Splunk Web UIのAppsセクションにあります。 +- Splunk WebにログインしてApps > Find More Appsに移動します。 +- 検索ボックスを使用してDB Connectを見つけます。 +- Splunk DB Connectの横の緑色の「Install」ボタンをクリックします。 +- 「Restart Splunk」をクリックします。 + +DB Connect Appのインストールに問題がある場合は、[こちらのリンク](https://splunkbase.splunk.com/app/2686)を参照して追加の指示を得てください。 + +DB Connect Appがインストールされていることを確認したら、java_homeパスをConfiguration -> SettingsでDB Connect Appに追加し、保存をクリックしてリセットします。 + +![Splunk 2](../images/splunk/splunk-2.png) + +## ClickHouse用のJDBCを設定する + +[ClickHouse JDBCドライバー](https://github.com/ClickHouse/clickhouse-java)をDB Connect Driversフォルダにダウンロードします: + +``` +$SPLUNK_HOME/etc/apps/splunk_app_db_connect/drivers +``` + +次に、ClickHouse JDBC Driverクラスの詳細を追加するために、`$SPLUNK_HOME/etc/apps/splunk_app_db_connect/default/db_connection_types.conf`ファイルで接続タイプの設定を編集する必要があります。 + +ファイルに次のセクションを追加します: + +``` +[ClickHouse] +displayName = ClickHouse +serviceClass = com.splunk.dbx2.DefaultDBX2JDBC +jdbcUrlFormat = jdbc:ch://:/ +jdbcUrlSSLFormat = jdbc:ch://:/?ssl=true +jdbcDriverClass = com.clickhouse.jdbc.ClickHouseDriver +ui_default_catalog = $database$ +``` + +`$SPLUNK_HOME/bin/splunk restart`を使ってSplunkを再起動します。 + +DB Connect Appに戻り、Configuration > Settings > Driversに移動します。ClickHouseの横に緑色のチェックマークが表示されているはずです: + +![Splunk 3](../images/splunk/splunk-3.png) + +## Splunk SearchをClickHouseに接続する + +DB Connect App Configuration -> Databases -> Identitiesに移動し、ClickHouseのIDを作成します。 + +Configuration -> Databases -> ConnectionsからClickHouseへの新しい接続を作成し、「New Connection」を選択します。 + + + +
+ +ClickHouseホストの詳細を追加し、「Enable SSL」にチェックを入れる: + +![Splunk 5](../images/splunk/splunk-5.png) + +接続を保存した後、SplunkにClickHouseに正常に接続されます! + +:::note +エラーが発生した場合は、SplunkインスタンスのIPアドレスがClickHouse Cloud IPアクセスリストに追加されていることを確認してください。詳細は[こちらのドキュメント](https://clickhouse.com/docs/ja/cloud/security/setting-ip-filters)を参照ください。 +::: + +## SQLクエリを実行する + +すべてが正常に動作するかテストするためにSQLクエリを実行します。 + +DB Connect AppのDataLabセクションからSQL Explorerで接続の詳細を選択します。このデモでは`trips`テーブルを使用します: + +![Splunk 6](../images/splunk/splunk-6.png) + +テーブル内のすべてのレコードのカウントを返すSQLクエリを`trips`テーブルで実行します: + +![Splunk 7](../images/splunk/splunk-7.png) + +クエリが成功した場合、結果が表示されるはずです。 + +## ダッシュボードを作成する + +SQLと強力なSplunk Processing Language (SPL)を組み合わせたダッシュボードを作成しましょう。 + +先に進む前に、まず[DPL Safeguardsを非アクティブ化](https://docs.splunk.com/Documentation/Splunk/9.2.1/Security/SPLsafeguards?ref=hk#Deactivate_SPL_safeguards)する必要があります。 + +最も頻繁にピックアップされたトップ10の地域を示す次のクエリを実行します: + +```sql +dbxquery query="SELECT pickup_ntaname, count(*) AS count +FROM default.trips GROUP BY pickup_ntaname +ORDER BY count DESC LIMIT 10;" connection="chc" +``` + +カラムチャートを作成するために可視化タブを選択します: + +![Splunk 8](../images/splunk/splunk-8.png) + +「Save As > Save to a Dashboard」をクリックしてダッシュボードを作成しましょう。 + +次に、乗客数に基づく平均料金を示すクエリを追加しましょう: + +```sql +dbxquery query="SELECT passenger_count,avg(total_amount) +FROM default.trips GROUP BY passenger_count;" connection="chc" +``` + +今回は、バーチャートの可視化を作成し、以前のダッシュボードに保存します。 + +![Splunk 9](../images/splunk/splunk-9.png) + +最後に、乗客数と旅行距離の相関を示すもう一つのクエリを追加します: + +```sql +dbxquery query="SELECT passenger_count, toYear(pickup_datetime) AS year, +round(trip_distance) AS distance, count(* FROM default.trips) +GROUP BY passenger_count, year, distance +ORDER BY year, count(*) DESC; " connection="chc" +``` + +最終的なダッシュボードは次のようになります: + +![Splunk 10](../images/splunk/splunk-10.png) + +## 時系列データ + +Splunkには、ダッシュボードで時系列データの可視化とプレゼンテーションに使用できる数百の組み込み関数があります。この例では、時系列データで動作するクエリをSplunkで作成するために、SQL + SPLを組み合わせます。 + +```sql +dbxquery query="SELECT time, orig_h, duration +FROM "demo"."conn" WHERE time >= now() - interval 1 HOURS" connection="chc" +| eval time = strptime(time, "%Y-%m-%d %H:%M:%S.%3Q") +| eval _time=time +| timechart avg(duration) as duration by orig_h +| eval duration=round(duration/60) +| sort - duration: +``` + +## 詳細を学ぶ + +Splunk DB Connectおよびダッシュボード構築に関する詳細情報をお探しの場合、[Splunkのドキュメント](https://docs.splunk.com/Documentation)をご覧ください。 diff --git a/docs/ja/integrations/data-visualization/superset-and-clickhouse.md b/docs/ja/integrations/data-visualization/superset-and-clickhouse.md new file mode 100644 index 00000000000..dbb06612e5a --- /dev/null +++ b/docs/ja/integrations/data-visualization/superset-and-clickhouse.md @@ -0,0 +1,100 @@ +--- +sidebar_label: Superset +sidebar_position: 198 +slug: /ja/integrations/superset +keywords: [clickhouse, superset, connect, integrate, ui] +description: Apache Supersetはオープンソースのデータ探索および視覚化プラットフォームです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# SupersetをClickHouseに接続する + +Apache Supersetは、Pythonで書かれたオープンソースのデータ探索および視覚化プラットフォームです。Supersetは、ClickHouseが提供するPythonドライバーを使用してClickHouseに接続します。それでは、その方法を見てみましょう... + +## 目的 + +このガイドでは、ClickHouseデータベースからデータを使用してSupersetでダッシュボードを作成します。ダッシュボードは次のようになります: + + New Dashboard +

+ +:::tip データを追加する +作業するデータセットがない場合は、例の1つを追加できます。このガイドでは[UK Price Paid](/docs/ja/getting-started/example-datasets/uk-price-paid.md)データセットを使用するので、それを選ぶこともできます。同じドキュメントカテゴリには他にもいくつかあります。 +::: + +## 1. 接続情報を収集する + + +## 2. ドライバをインストールする + +1. Supersetは`clickhouse-connect`ドライバーを使用してClickHouseに接続します。`clickhouse-connect`の詳細はhttps://pypi.org/project/clickhouse-connect/にあり、以下のコマンドでインストールできます: + + ```console + pip install clickhouse-connect + ``` + +2. Supersetを開始(または再起動)します。 + +## 3. SupersetをClickHouseに接続する + +1. Superset内で、上部メニューから**Data**を選択し、ドロップダウンメニューから**Databases**を選択します。**+ Database**ボタンをクリックして新しいデータベースを追加します: + + Add a new database + +2. 最初のステップでは、データベースのタイプとして**ClickHouse Connect**を選択します: + + Select ClickHouse + +3. 次のステップでは: + - SSLをオンまたはオフに設定します。 + - 先ほど収集した接続情報を入力します。 + - **DISPLAY NAME**を指定します。これは任意の名前にできます。複数のClickHouseデータベースに接続する場合は、名前をより説明的にします。 + + Test the connection + +4. **CONNECT**をクリックし、続けて**FINISH**ボタンをクリックしてセットアップウィザードを完了します。これで、データベースがデータベース一覧に表示されるはずです。 + +## 4. データセットを追加する + +1. SupersetでClickHouseのデータを操作するには、**_データセット_**を定義する必要があります。Supersetの上部メニューから**Data**を選択し、ドロップダウンメニューから**Datasets**を選択します。 + +2. データセットを追加するボタンをクリックします。データソースとして新しいデータベースを選択し、データベース内に定義されているテーブルが表示されます: + + New dataset + + +3. ダイアログウィンドウの下部にある**ADD**ボタンをクリックすると、テーブルがデータセットリストに表示されます。これでダッシュボードを作成してClickHouseデータを分析する準備が整いました! + + +## 5. Supersetでチャートとダッシュボードを作成する + +Supersetに慣れている場合、この次のセクションは簡単に感じるかもしれません。Supersetに初めて触れる方も、他の多くの視覚化ツールと似ており、始めるのに時間はかかりませんが、詳細と微妙な点は使用していく中で学んでいきます。 + +1. 最初にダッシュボードを作成します。Supersetの上部メニューから**Dashboards**を選択します。右上のボタンをクリックして新しいダッシュボードを追加します。次のダッシュボードは**UK property prices**という名前です: + + New dashboard + +2. 新しいチャートを作成するには、上部メニューから**Charts**を選択し、新しいチャートを追加するボタンをクリックします。多数のオプションが表示されます。次の例は、**uk_price_paid**データセットを使用した**Pie Chart**チャートを示しています: + + New chart + +3. Supersetの円グラフには、**Dimension**と**Metric**が必要で、他の設定はオプションです。次元とメトリックのフィールドを自分で選択でき、この例ではClickHouseフィールドの`district`を次元として、`AVG(price)`をメトリックとして使用しています。 + + The SUM metric + The SUM metric + +5. 円グラフではなくドーナツグラフを好む場合は、**CUSTOMIZE**でそれとその他のオプションを設定できます: + + Add Chart to Dashboard + +6. **SAVE**ボタンをクリックしてチャートを保存し、**ADD TO DASHBOARD**ドロップダウンから**UK property prices**を選び、**SAVE & GO TO DASHBOARD**を選択してチャートを保存し、ダッシュボードに追加します: + + Add Chart to Dashboard + +7. これで完了です。ClickHouseのデータに基づくSupersetでのダッシュボード作成は、非常に高速なデータ分析の世界を切り開きます! + + New Dashboard + +## 関連コンテンツ + +- ブログ: [ClickHouseでデータを視覚化する - Part 2 - Superset](https://clickhouse.com/blog/visualizing-data-with-superset) diff --git a/docs/ja/integrations/data-visualization/tableau-and-clickhouse.md b/docs/ja/integrations/data-visualization/tableau-and-clickhouse.md new file mode 100644 index 00000000000..6122be1cdf2 --- /dev/null +++ b/docs/ja/integrations/data-visualization/tableau-and-clickhouse.md @@ -0,0 +1,126 @@ +--- +sidebar_label: Tableau +sidebar_position: 205 +slug: /ja/integrations/tableau +keywords: [clickhouse, tableau, 接続, 統合, ui] +description: Tableau は ClickHouse のデータベースとテーブルをデータソースとして使用できます。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Tableau と ClickHouse の接続 + +Tableau は ClickHouse のデータベースとテーブルをデータソースとして使用できます。これには、特別な JDBC ドライバーをダウンロードして、Tableau が見つけることができる特定の場所に保存する必要があります。 + +## 接続方法 + +1. 接続情報を収集します + + +2. Tableau デスクトップをダウンロードしてインストールします。 +3. 最新バージョンのclickhouse-tableau-connector-jdbc TACO コネクタをダウンロードします。 +4. TACO コネクタを次のフォルダに保存します(OS に基づく): + - macOS: `~/Documents/My Tableau Repository/Connectors` + - Windows: `C:\Users[Windows User]\Documents\My Tableau Repository\Connectors` +5. `clickhouse-tableau-connector-jdbc` の指示に従って、対応するバージョンのClickHouse JDBC ドライバー をダウンロードします。 + +:::note +必ず **clickhouse-jdbc-x.x.x-shaded.jar** JAR ファイルをダウンロードしてください。 +::: + +6. JDBC ドライバーを次のフォルダに保存します(OS に基づき、フォルダが存在しない場合は作成可能): + - macOS: `~/Library/Tableau/Drivers` + - Windows: `C:\Program Files\Tableau\Drivers` +7. Tableau で ClickHouse データソースを設定し、データビジュアライゼーションを始めましょう! + +## Tableau で ClickHouse データソースを設定 + +ドライバーとコネクタをマシン上の適切なフォルダに配置したので、ClickHouse の **TPCD** データベースに接続するデータソースを Tableau で定義する方法を見てみましょう。 + +1. Tableau を起動します。(すでに起動している場合は、再起動してください。) + +2. 左側のメニューから、**To a Server** セクションの **More** をクリックします。すべてが正常に動作している場合、インストール済みコネクタのリストに **ClickHouse JDBC** が表示されるはずです: + + ![ClickHouse JDBC](./images/tableau_connecttoserver.png) + +3. **ClickHouse JDBC** をクリックすると、ダイアログウィンドウが表示されます。接続情報を入力してください: + + | 設定 | 値 | + | ----------- | --------------------------------------------------- | + | サーバー | **w0vdp\**\**.europe-west4.gcp.clickhouse.cloud** | + | ポート | **8443** | + | データベース | **default** | + | ユーザー名 | **default** | + | パスワード | *\***** | + +:::note +ClickHouse cloud を使用する場合、安全な接続のために SSL チェックボックスを有効にする必要があります。 +::: +
+ +設定は次のようになります: + +!["ClickHouse Settings"](./images/tableau_clickhousesettings.png) + +:::note +私たちの ClickHouse データベースは **TPCD** と名付けられていますが、上記のダイアログでは **データベース** を **default** に設定し、次のステップで **スキーマ** に **TPCD** を選択する必要があります。(これはコネクタのバグによるものかもしれないので、この動作が変わる可能性がありますが、現在は **default** をデータベースとして使用しなければならない状況です。) +::: + +4. **Sign In** ボタンをクリックすると、新しい Tableau ワークブックが表示されるはずです: + + !["New Workbook"](./images/tableau_newworkbook.png) + +5. **スキーマ** ドロップダウンから **TPCD** を選択すると、**TPCD** 内のテーブルのリストが表示されます: + + !["Select TPCD for the Schema"](./images/tableau_tpcdschema.png) + +これで Tableau でのビジュアライゼーションの準備が整いました! + +## Tableau でのビジュアライゼーション作成 + +Tableau で ClickHouse データソースを設定したので、データを可視化してみましょう... + +1. **CUSTOMER** テーブルをワークブックにドラッグします。カラムは表示されますが、データテーブルは空のままです: + + ![""](./images/tableau_workbook1.png) + +2. **Update Now** ボタンをクリックすると、**CUSTOMER** から 100 行がテーブルに反映されます。 + +3. **ORDERS** テーブルをワークブックにドラッグし、**Custkey** を両テーブル間のリレーションシップフィールドとして設定します: + + ![""](./images/tableau_workbook2.png) + +4. これで **ORDERS** と **LINEITEM** テーブルがデータソースとして関連付けられ、データに関する質問を解決するためにこのリレーションシップを使用できます。ワークブック下部の **Sheet 1** タブを選択します。 + + ![""](./images/tableau_workbook3.png) + +5. 各年に注文された特定のアイテムの数量を知りたいとしましょう。**ORDERS** から **Orderdate** を **Columns** セクション(水平フィールド)にドラッグし、**LINEITEM** から **Quantity** を **Rows** にドラッグします。Tableau は以下の折れ線グラフを生成します: + + ![""](./images/tableau_workbook4.png) + +あまり興味深い折れ線グラフではありませんが、データセットはスクリプトによって生成され、クエリパフォーマンステスト用に構築されたため、TCPD データのシミュレートされた注文には変化があまり見られません。 + +6. 四半期ごと、および出荷モード(空輸、郵送、船舶、トラックなど)ごとの平均注文金額(ドル)を知りたいとしましょう: + + - **New Worksheet** タブをクリックして新しいシートを作成 + - **ORDERS** から **OrderDate** を **Columns** にドラッグし、**Year** から **Quarter** に変更 + - **LINEITEM** から **Shipmode** を **Rows** にドラッグ + +次のように表示されるはずです: + +![""](./images/tableau_workbook5.png) + +7. **Abc** の値は、メトリックをテーブルにドラッグするまでスペースを埋めるだけです。**ORDERS** から **Totalprice** をテーブルにドラッグします。デフォルトの計算は **SUM** され、**Totalpricess** が合計されます: + + ![""](./images/tableau_workbook6.png) + +8. **SUM** をクリックして、**Measure** を **Average** に変更します。同じドロップダウンメニューから **Format** を選択し、**Numbers** を **Currency (Standard)** に変更します: + + ![""](./images/tableau_workbook7.png) + + よくできました!Tableau を ClickHouse に接続し、ClickHouse データを分析・可視化するための可能性の全世界を開かれました。 + +:::note +Tableau は素晴らしいツールであり、ClickHouse との接続がスムーズであることを私たちは喜んでいます!Tableau を初めて使用する方は、ダッシュボードとビジュアライゼーションの構築に関するドキュメントを参照してください。 +::: + +**まとめ:** Tableau を ClickHouse に接続するには、一般的な ODBC/JDBC ClickHouse ドライバーを使用することが可能です。しかし、このコネクタは接続設定プロセスを簡素化します。コネクタに問題がある場合は、GitHubでお気軽にお問い合わせください。 diff --git a/docs/ja/integrations/data-visualization/tableau-online-and-clickhouse.md b/docs/ja/integrations/data-visualization/tableau-online-and-clickhouse.md new file mode 100644 index 00000000000..e6418520dbf --- /dev/null +++ b/docs/ja/integrations/data-visualization/tableau-online-and-clickhouse.md @@ -0,0 +1,88 @@ +--- +sidebar_label: Tableau Online +slug: /ja/integrations/tableau-online +keywords: [clickhouse, tableau, online, mysql, connect, integrate, ui] +description: Tableau Onlineは、どこからでも人々がより早く、より自信を持って意思決定できるよう、データの力を簡素化します。 +--- + +import MySQLCloudSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_cloud_setup.mdx'; +import MySQLOnPremiseSetup from '@site/docs/ja/_snippets/_clickhouse_mysql_on_premise_setup.mdx'; + +# Tableau Online + +Tableau Onlineは、公式のMySQLデータソースを使用して、MySQLインターフェース経由でClickHouse CloudまたはオンプレミスのClickHouseセットアップに接続できます。 + +## ClickHouse Cloud セットアップ + + +## オンプレミスのClickHouse サーバーセットアップ + + +## Tableau OnlineからClickHouseに接続する(SSLなしオンプレミスの場合) + +Tableau Cloudサイトにログインし、新しい公開データソースを追加します。 + +Creating a new published data source +
+ +利用可能なコネクタのリストから「MySQL」を選択します。 + +Selecting MySQL connector +
+ +ClickHouseのセットアップ中に収集した接続情報を指定します。 + +Specifying your connection details +
+ +Tableau Onlineはデータベースを調べ、利用可能なテーブルのリストを提供します。目的のテーブルを右側のキャンバスにドラッグします。さらに、「今すぐ更新」をクリックしてデータをプレビューしたり、調査したフィールドのタイプや名前を微調整することもできます。 + +Selecting the tables to use +
+ +その後、右上の「Publish As」をクリックすれば、新しく作成したデータセットをTableau Onlineで通常通り使用できるようになります。 + +注:Tableau OnlineをTableau Desktopと組み合わせて使用し、ClickHouseデータセットを共有する場合は、こちらに表示されるセットアップガイドに従い、デフォルトのMySQLコネクタを使用するTableau Desktopを使用することを確認してください。[こちら](https://www.tableau.com/support/drivers)のデータソースドロップダウンでMySQLを選択した場合のみ表示されます。また、M1 Macをお使いの方は、[こちらのトラブルシューティングスレッド](https://community.tableau.com/s/question/0D58b0000Ar6OhvCQE/unable-to-install-mysql-driver-for-m1-mac)でドライバインストールの方法を確認してください。 + +## Tableau OnlineからClickHouseに接続する(CloudまたはオンプレミスセットアップでSSL使用) + +Tableau OnlineのMySQL接続設定ウィザードではSSL証明書を提供することができないため、接続設定はTableau Desktopを使用して行い、それをTableau Onlineにエクスポートする必要があります。このプロセスは比較的簡単です。 + +WindowsまたはMacマシンでTableau Desktopを実行し、「接続」->「サーバーに接続」->「MySQL」を選択します。 +おそらく、最初にマシンにMySQLドライバをインストールする必要があります。[こちら](https://www.tableau.com/support/drivers)のデータソースドロップダウンでMySQLを選択した場合に表示されるセットアップガイドに従ってください。また、M1 Macをお使いの方は、[こちらのトラブルシューティングスレッド](https://community.tableau.com/s/question/0D58b0000Ar6OhvCQE/unable-to-install-mysql-driver-for-m1-mac)でドライバインストールの方法を確認してください。 + +Create a new data source +
+ +:::note +MySQL接続設定画面で、「SSL」オプションが有効になっていることを確認してください。 +ClickHouse CloudのSSL証明書は、[LetsEncrypt](https://letsencrypt.org/certificates/)によって署名されています。 +このルート証明書を[こちら](https://letsencrypt.org/certs/isrgrootx1.pem)からダウンロードできます。 +::: + +ClickHouse CloudインスタンスのMySQLユーザー資格情報と、ダウンロードしたルート証明書へのパスを提供します。 + +Specifying your credentials +
+ +通常通り、目的のテーブルを選択し(Tableau Onlineと同様)、サーバー -> データソースの公開 -> Tableau Cloudを選択します。 + +Publish data source +
+ +重要:認証オプションで「埋め込みパスワード」を選択する必要があります。 + +Data source publishing settings - embedding your credentials +
+ +さらに、「発行したデータソースを使用するようにワークブックを更新」を選択します。 + +Data source publishing settings - updating the workbook for online usage +
+ +最後に「発行」をクリックすると、埋め込まれた資格情報を持つデータソースがTableau Onlineで自動的に開かれます。 + + +## 既知の制限事項 (ClickHouse 23.11) + +既知の制限事項はすべてClickHouse `23.11`で修正されています。他の互換性の問題が発生した場合は、[こちら](https://clickhouse.com/company/contact)からご連絡いただくか、新しい[問題を作成](https://github.com/ClickHouse/ClickHouse/issues)してください。 diff --git a/docs/ja/integrations/data-visualization/zingdata-and-clickhouse.md b/docs/ja/integrations/data-visualization/zingdata-and-clickhouse.md new file mode 100644 index 00000000000..a58aba52dee --- /dev/null +++ b/docs/ja/integrations/data-visualization/zingdata-and-clickhouse.md @@ -0,0 +1,73 @@ +--- +sidebar_label: Zing Data +sidebar_position: 206 +slug: /ja/integrations/zingdata +keywords: [clickhouse, zingdata, connect, integrate, ui] +description: Zing DataはiOS、Android、ウェブ用に作られた、ClickHouse向けのシンプルなソーシャルビジネスインテリジェンスです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# Zing DataをClickHouseに接続する + +Zing Dataは、データの探索と視覚化のためのプラットフォームです。Zing Dataは、ClickHouseが提供するJSドライバーを使用してClickHouseに接続します。 + +## 接続方法 +1. 接続情報を集めます。 + + +2. Zing Dataをダウンロードまたは訪問します。 + + * モバイルでZing Dataを使用するには、[Google Play Store](https://play.google.com/store/apps/details?id=com.getzingdata.android)または[Apple App Store](https://apps.apple.com/us/app/zing-data-collaborative-bi/id1563294091)からZing Dataアプリをダウンロードしてください。 + + * ウェブでZing Dataを使用するには、[Zing Webコンソール](https://console.getzingdata.com/)を訪問し、アカウントを作成します。 + +3. データソースを追加する + + * Zing DataとClickHouseデータを操作するためには、**_データソース_**を定義する必要があります。Zing Dataのモバイルアプリメニューで**Sources**を選択し、**Add a Datasource**をクリックします。 + + * ウェブでデータソースを追加するには、トップメニューの**Data Sources**をクリックし、**New Datasource**をクリックし、ドロップダウンメニューから**Clickhouse**を選択します。 + + ![""](./images/zing_01.png) + +4. 接続情報を入力し、**Check Connection**をクリックします。 + + ![](./images/zing_02.png) + +5. 接続が成功すると、Zingはテーブル選択画面に進みます。必要なテーブルを選択して**Save**をクリックします。Zingがデータソースに接続できない場合、資格情報を確認して再試行するようメッセージが表示されます。資格情報を確認して再試行しても問題が解決しない場合は、ここからZingサポートに連絡してください。 + + ![""](./images/zing_03.png) + +6. ClickHouseデータソースが追加されると、**Data Sources** / **Sources** タブの下で、Zing組織内のすべての人が利用可能になります。 + +## Zing Dataでのチャートとダッシュボードの作成 + +1. ClickHouseデータソースが追加された後、ウェブの**Zing App**をクリックするか、モバイルでデータソースをクリックしてチャートの作成を開始します。 + +2. チャートを作成するために、テーブルリストの中から任意のテーブルをクリックします。 + + ![""](./images/zing_04.png) + +3. 視覚的クエリ ビルダーを使用して、必要なフィールド、集計などを選び、**Run Question**をクリックします。 + + ![""](./images/zing_05.png) + +4. SQLに詳しい場合は、カスタムSQLを書くことでクエリを実行しチャートを作成することもできます。 + + ![""](./images/zing_06.png) + + ![""](./images/zing_07.png) + +5. チャートの例は以下のようになります。 質問は三点メニューを使って保存できます。チャートにコメントしたり、チームメンバーをタグ付けしたり、リアルタイムアラートを作成したり、チャートタイプを変更したりできます。 + + ![""](./images/zing_08.png) + +6. ダッシュボードはホーム画面の**Dashboards**の下にある「+」アイコンを使用して作成できます。既存の質問をドラッグして、ダッシュボードに表示することができます。 + + ![""](./images/zing_09.png) + +## 関連コンテンツ + +- ブログ: [ClickHouseでデータを視覚化する - Zing Data](https://getzingdata.com/blog/zing-adds-support-for-clickhouse-as-a-data-source/) +- [ドキュメント](https://docs.getzingdata.com/docs/) +- [クイックスタート](https://getzingdata.com/quickstart/) +- ダッシュボード作成ガイド [Create Dashboards](https://getzingdata.com/blog/new-feature-create-multi-question-dashboards/) diff --git a/docs/ja/integrations/deployment/easypanel/index.md b/docs/ja/integrations/deployment/easypanel/index.md new file mode 100644 index 00000000000..c10f9802286 --- /dev/null +++ b/docs/ja/integrations/deployment/easypanel/index.md @@ -0,0 +1,18 @@ +--- +sidebar_label: Easypanel +slug: /ja/integrations/easypanel +keywords: [clickhouse, easypanel, deployment, integrate, install] +description: 独自のサーバーにClickHouseをデプロイするために使用できます。 +--- +# EasypanelでClickHouseをデプロイする + +[Easypanel](https://easypanel.io)は、最新のサーバー管理パネルです。これを使用して、独自のサーバーにClickHouseをデプロイすることができます。 + +[![Deploy to Easypanel](https://easypanel.io/img/deploy-on-easypanel-40.svg)](https://easypanel.io/docs/templates/clickhouse) + +## 手順 + +1. クラウドプロバイダーでUbuntuを実行するVMを作成します。 +2. ウェブサイトの手順に従ってEasypanelをインストールします。 +3. 新しいプロジェクトを作成します。 +4. 専用のテンプレートを使用してClickHouseをインストールします。 diff --git a/docs/ja/integrations/images/logos/Apache_Spark_logo.svg b/docs/ja/integrations/images/logos/Apache_Spark_logo.svg new file mode 100644 index 00000000000..4fe9de52151 --- /dev/null +++ b/docs/ja/integrations/images/logos/Apache_Spark_logo.svg @@ -0,0 +1,13 @@ + + +Apache Spark logo + + + + image/svg+xml + + + + + + diff --git a/docs/ja/integrations/images/logos/Node.js_logo.svg b/docs/ja/integrations/images/logos/Node.js_logo.svg new file mode 100644 index 00000000000..96e278d43ca --- /dev/null +++ b/docs/ja/integrations/images/logos/Node.js_logo.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/Python-logo-notext.svg b/docs/ja/integrations/images/logos/Python-logo-notext.svg new file mode 100644 index 00000000000..c5b0258bb57 --- /dev/null +++ b/docs/ja/integrations/images/logos/Python-logo-notext.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/acceldata_logo.png b/docs/ja/integrations/images/logos/acceldata_logo.png new file mode 100644 index 00000000000..e0bc5ffde26 Binary files /dev/null and b/docs/ja/integrations/images/logos/acceldata_logo.png differ diff --git a/docs/ja/integrations/images/logos/adaptive_logo.png b/docs/ja/integrations/images/logos/adaptive_logo.png new file mode 100644 index 00000000000..07b69a05dd6 Binary files /dev/null and b/docs/ja/integrations/images/logos/adaptive_logo.png differ diff --git a/docs/ja/integrations/images/logos/airbyte-logo.png b/docs/ja/integrations/images/logos/airbyte-logo.png new file mode 100644 index 00000000000..4b79d89d62c Binary files /dev/null and b/docs/ja/integrations/images/logos/airbyte-logo.png differ diff --git a/docs/ja/integrations/images/logos/airbyte.svg b/docs/ja/integrations/images/logos/airbyte.svg new file mode 100644 index 00000000000..d9604d75cca --- /dev/null +++ b/docs/ja/integrations/images/logos/airbyte.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/airbyte_logo.png b/docs/ja/integrations/images/logos/airbyte_logo.png new file mode 100644 index 00000000000..de5b32da690 Binary files /dev/null and b/docs/ja/integrations/images/logos/airbyte_logo.png differ diff --git a/docs/ja/integrations/images/logos/amazon_kinesis_logo.svg b/docs/ja/integrations/images/logos/amazon_kinesis_logo.svg new file mode 100644 index 00000000000..c848407b742 --- /dev/null +++ b/docs/ja/integrations/images/logos/amazon_kinesis_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/amazon_msk.svg b/docs/ja/integrations/images/logos/amazon_msk.svg new file mode 100644 index 00000000000..c4ba73a0e63 --- /dev/null +++ b/docs/ja/integrations/images/logos/amazon_msk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/amazon_redshift.png b/docs/ja/integrations/images/logos/amazon_redshift.png new file mode 100644 index 00000000000..0d4e42f8aa4 Binary files /dev/null and b/docs/ja/integrations/images/logos/amazon_redshift.png differ diff --git a/docs/ja/integrations/images/logos/amazon_s3_logo.png b/docs/ja/integrations/images/logos/amazon_s3_logo.png new file mode 100644 index 00000000000..91e007c0b59 Binary files /dev/null and b/docs/ja/integrations/images/logos/amazon_s3_logo.png differ diff --git a/docs/ja/integrations/images/logos/amazon_s3_logo.svg b/docs/ja/integrations/images/logos/amazon_s3_logo.svg new file mode 100644 index 00000000000..725199615b6 --- /dev/null +++ b/docs/ja/integrations/images/logos/amazon_s3_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/apache-spark.png b/docs/ja/integrations/images/logos/apache-spark.png new file mode 100644 index 00000000000..619f4d0b54a Binary files /dev/null and b/docs/ja/integrations/images/logos/apache-spark.png differ diff --git a/docs/ja/integrations/images/logos/apache-streampark.png b/docs/ja/integrations/images/logos/apache-streampark.png new file mode 100644 index 00000000000..1bb845979ee Binary files /dev/null and b/docs/ja/integrations/images/logos/apache-streampark.png differ diff --git a/docs/ja/integrations/images/logos/atlas-logo.png b/docs/ja/integrations/images/logos/atlas-logo.png new file mode 100644 index 00000000000..880b918f469 Binary files /dev/null and b/docs/ja/integrations/images/logos/atlas-logo.png differ diff --git a/docs/ja/integrations/images/logos/automq.png b/docs/ja/integrations/images/logos/automq.png new file mode 100644 index 00000000000..d02521472e4 Binary files /dev/null and b/docs/ja/integrations/images/logos/automq.png differ diff --git a/docs/ja/integrations/images/logos/azure_event_hubs.svg b/docs/ja/integrations/images/logos/azure_event_hubs.svg new file mode 100644 index 00000000000..540f89c6b43 --- /dev/null +++ b/docs/ja/integrations/images/logos/azure_event_hubs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/blinkops_logo.png b/docs/ja/integrations/images/logos/blinkops_logo.png new file mode 100644 index 00000000000..32b40cdc358 Binary files /dev/null and b/docs/ja/integrations/images/logos/blinkops_logo.png differ diff --git a/docs/ja/integrations/images/logos/bytewax.svg b/docs/ja/integrations/images/logos/bytewax.svg new file mode 100644 index 00000000000..9ddaeaa60a0 --- /dev/null +++ b/docs/ja/integrations/images/logos/bytewax.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/cassandra.png b/docs/ja/integrations/images/logos/cassandra.png new file mode 100644 index 00000000000..6e23e5d35f6 Binary files /dev/null and b/docs/ja/integrations/images/logos/cassandra.png differ diff --git a/docs/ja/integrations/images/logos/chdb.svg b/docs/ja/integrations/images/logos/chdb.svg new file mode 100644 index 00000000000..f72e534eecc --- /dev/null +++ b/docs/ja/integrations/images/logos/chdb.svg @@ -0,0 +1,168 @@ + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/clickhouse-cl.png b/docs/ja/integrations/images/logos/clickhouse-cl.png new file mode 100644 index 00000000000..41bd16c7132 Binary files /dev/null and b/docs/ja/integrations/images/logos/clickhouse-cl.png differ diff --git a/docs/ja/integrations/images/logos/clickhouse-monitoring-dashboard.svg b/docs/ja/integrations/images/logos/clickhouse-monitoring-dashboard.svg new file mode 100644 index 00000000000..d5c3ac793f2 --- /dev/null +++ b/docs/ja/integrations/images/logos/clickhouse-monitoring-dashboard.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/clickhouse.svg b/docs/ja/integrations/images/logos/clickhouse.svg new file mode 100644 index 00000000000..adea893c397 --- /dev/null +++ b/docs/ja/integrations/images/logos/clickhouse.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/ja/integrations/images/logos/cloudquery_logo.svg b/docs/ja/integrations/images/logos/cloudquery_logo.svg new file mode 100644 index 00000000000..7a46be2aa6a --- /dev/null +++ b/docs/ja/integrations/images/logos/cloudquery_logo.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/clougence.svg b/docs/ja/integrations/images/logos/clougence.svg new file mode 100644 index 00000000000..739a38a7db0 --- /dev/null +++ b/docs/ja/integrations/images/logos/clougence.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/confluent.svg b/docs/ja/integrations/images/logos/confluent.svg new file mode 100644 index 00000000000..51fba858d1b --- /dev/null +++ b/docs/ja/integrations/images/logos/confluent.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/confluent_alt.svg b/docs/ja/integrations/images/logos/confluent_alt.svg new file mode 100644 index 00000000000..06bc03da60c --- /dev/null +++ b/docs/ja/integrations/images/logos/confluent_alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/csharp.svg b/docs/ja/integrations/images/logos/csharp.svg new file mode 100644 index 00000000000..f33e2d24538 --- /dev/null +++ b/docs/ja/integrations/images/logos/csharp.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/cubejs.svg b/docs/ja/integrations/images/logos/cubejs.svg new file mode 100644 index 00000000000..a1896d4a4a2 --- /dev/null +++ b/docs/ja/integrations/images/logos/cubejs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/data_grip.svg b/docs/ja/integrations/images/logos/data_grip.svg new file mode 100644 index 00000000000..c2b969968c0 --- /dev/null +++ b/docs/ja/integrations/images/logos/data_grip.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/dataease.png b/docs/ja/integrations/images/logos/dataease.png new file mode 100644 index 00000000000..5cfc76805e1 Binary files /dev/null and b/docs/ja/integrations/images/logos/dataease.png differ diff --git a/docs/ja/integrations/images/logos/datalens.png b/docs/ja/integrations/images/logos/datalens.png new file mode 100644 index 00000000000..d333cc345ac Binary files /dev/null and b/docs/ja/integrations/images/logos/datalens.png differ diff --git a/docs/ja/integrations/images/logos/dbeaver_logo.svg b/docs/ja/integrations/images/logos/dbeaver_logo.svg new file mode 100644 index 00000000000..f55e363df7a --- /dev/null +++ b/docs/ja/integrations/images/logos/dbeaver_logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/dbnet_logo.png b/docs/ja/integrations/images/logos/dbnet_logo.png new file mode 100644 index 00000000000..5efc05149cc Binary files /dev/null and b/docs/ja/integrations/images/logos/dbnet_logo.png differ diff --git a/docs/ja/integrations/images/logos/dbt.svg b/docs/ja/integrations/images/logos/dbt.svg new file mode 100644 index 00000000000..1e764ec4431 --- /dev/null +++ b/docs/ja/integrations/images/logos/dbt.svg @@ -0,0 +1,7 @@ + + + dbt + + + + diff --git a/docs/ja/integrations/images/logos/deep.png b/docs/ja/integrations/images/logos/deep.png new file mode 100644 index 00000000000..06f11c096c2 Binary files /dev/null and b/docs/ja/integrations/images/logos/deep.png differ diff --git a/docs/ja/integrations/images/logos/deepnote.svg b/docs/ja/integrations/images/logos/deepnote.svg new file mode 100644 index 00000000000..e0b8a4ac3b6 --- /dev/null +++ b/docs/ja/integrations/images/logos/deepnote.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/deltalake.png b/docs/ja/integrations/images/logos/deltalake.png new file mode 100644 index 00000000000..50287219024 Binary files /dev/null and b/docs/ja/integrations/images/logos/deltalake.png differ diff --git a/docs/ja/integrations/images/logos/dlthub_logo.svg b/docs/ja/integrations/images/logos/dlthub_logo.svg new file mode 100644 index 00000000000..db4bfa843be --- /dev/null +++ b/docs/ja/integrations/images/logos/dlthub_logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/draxlr.svg b/docs/ja/integrations/images/logos/draxlr.svg new file mode 100644 index 00000000000..2c468296edf --- /dev/null +++ b/docs/ja/integrations/images/logos/draxlr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/emqx.svg b/docs/ja/integrations/images/logos/emqx.svg new file mode 100644 index 00000000000..1b849cc76dd --- /dev/null +++ b/docs/ja/integrations/images/logos/emqx.svg @@ -0,0 +1,14 @@ + + + 320备份 + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/explo.png b/docs/ja/integrations/images/logos/explo.png new file mode 100644 index 00000000000..09d6fa12461 Binary files /dev/null and b/docs/ja/integrations/images/logos/explo.png differ diff --git a/docs/ja/integrations/images/logos/explo.svg b/docs/ja/integrations/images/logos/explo.svg new file mode 100644 index 00000000000..a2099e42eaf --- /dev/null +++ b/docs/ja/integrations/images/logos/explo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/fivetran.svg b/docs/ja/integrations/images/logos/fivetran.svg new file mode 100644 index 00000000000..33747d0ed88 --- /dev/null +++ b/docs/ja/integrations/images/logos/fivetran.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/gcs.svg b/docs/ja/integrations/images/logos/gcs.svg new file mode 100644 index 00000000000..afc4aaea59a --- /dev/null +++ b/docs/ja/integrations/images/logos/gcs.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/gigasheet.png b/docs/ja/integrations/images/logos/gigasheet.png new file mode 100644 index 00000000000..b90610047e3 Binary files /dev/null and b/docs/ja/integrations/images/logos/gigasheet.png differ diff --git a/docs/ja/integrations/images/logos/glassflow.svg b/docs/ja/integrations/images/logos/glassflow.svg new file mode 100644 index 00000000000..1f674071763 --- /dev/null +++ b/docs/ja/integrations/images/logos/glassflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/glue_logo.png b/docs/ja/integrations/images/logos/glue_logo.png new file mode 100644 index 00000000000..f076f4190af Binary files /dev/null and b/docs/ja/integrations/images/logos/glue_logo.png differ diff --git a/docs/ja/integrations/images/logos/golang.svg b/docs/ja/integrations/images/logos/golang.svg new file mode 100644 index 00000000000..c103808b45e --- /dev/null +++ b/docs/ja/integrations/images/logos/golang.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/goldsky.webp b/docs/ja/integrations/images/logos/goldsky.webp new file mode 100644 index 00000000000..3ea03458cc3 Binary files /dev/null and b/docs/ja/integrations/images/logos/goldsky.webp differ diff --git a/docs/ja/integrations/images/logos/goose_logo.png b/docs/ja/integrations/images/logos/goose_logo.png new file mode 100644 index 00000000000..470c5d9eb9d Binary files /dev/null and b/docs/ja/integrations/images/logos/goose_logo.png differ diff --git a/docs/ja/integrations/images/logos/grafana.svg b/docs/ja/integrations/images/logos/grafana.svg new file mode 100644 index 00000000000..c78f1104906 --- /dev/null +++ b/docs/ja/integrations/images/logos/grafana.svg @@ -0,0 +1,191 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/great-expectations.webp b/docs/ja/integrations/images/logos/great-expectations.webp new file mode 100644 index 00000000000..f6588b5e6db Binary files /dev/null and b/docs/ja/integrations/images/logos/great-expectations.webp differ diff --git a/docs/ja/integrations/images/logos/hadoop.svg b/docs/ja/integrations/images/logos/hadoop.svg new file mode 100644 index 00000000000..c1ce75ade0f --- /dev/null +++ b/docs/ja/integrations/images/logos/hadoop.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/hashboard.svg b/docs/ja/integrations/images/logos/hashboard.svg new file mode 100644 index 00000000000..969b33d86fa --- /dev/null +++ b/docs/ja/integrations/images/logos/hashboard.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/hive.svg b/docs/ja/integrations/images/logos/hive.svg new file mode 100644 index 00000000000..d271b347ad2 --- /dev/null +++ b/docs/ja/integrations/images/logos/hive.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/housewatch.png b/docs/ja/integrations/images/logos/housewatch.png new file mode 100644 index 00000000000..d16da2ea3f1 Binary files /dev/null and b/docs/ja/integrations/images/logos/housewatch.png differ diff --git a/docs/ja/integrations/images/logos/hudi.png b/docs/ja/integrations/images/logos/hudi.png new file mode 100644 index 00000000000..43bbdf0b7e6 Binary files /dev/null and b/docs/ja/integrations/images/logos/hudi.png differ diff --git a/docs/ja/integrations/images/logos/iceberg.png b/docs/ja/integrations/images/logos/iceberg.png new file mode 100644 index 00000000000..bae0f2a9175 Binary files /dev/null and b/docs/ja/integrations/images/logos/iceberg.png differ diff --git a/docs/ja/integrations/images/logos/java.svg b/docs/ja/integrations/images/logos/java.svg new file mode 100644 index 00000000000..a266da82834 --- /dev/null +++ b/docs/ja/integrations/images/logos/java.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/ja/integrations/images/logos/jdbc.svg b/docs/ja/integrations/images/logos/jdbc.svg new file mode 100644 index 00000000000..433302a9e56 --- /dev/null +++ b/docs/ja/integrations/images/logos/jdbc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/jitsu.svg b/docs/ja/integrations/images/logos/jitsu.svg new file mode 100644 index 00000000000..4488ec3aca6 --- /dev/null +++ b/docs/ja/integrations/images/logos/jitsu.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/jupyter.png b/docs/ja/integrations/images/logos/jupyter.png new file mode 100644 index 00000000000..e7a34e2c832 Binary files /dev/null and b/docs/ja/integrations/images/logos/jupyter.png differ diff --git a/docs/ja/integrations/images/logos/kafka.svg b/docs/ja/integrations/images/logos/kafka.svg new file mode 100644 index 00000000000..0f125035551 --- /dev/null +++ b/docs/ja/integrations/images/logos/kafka.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/kestra.svg b/docs/ja/integrations/images/logos/kestra.svg new file mode 100644 index 00000000000..aa30c11077e --- /dev/null +++ b/docs/ja/integrations/images/logos/kestra.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/logo-easypanel.png b/docs/ja/integrations/images/logos/logo-easypanel.png new file mode 100644 index 00000000000..ea909e265ed Binary files /dev/null and b/docs/ja/integrations/images/logos/logo-easypanel.png differ diff --git a/docs/ja/integrations/images/logos/logo-hex.png b/docs/ja/integrations/images/logos/logo-hex.png new file mode 100644 index 00000000000..60e01dff4e1 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo-hex.png differ diff --git a/docs/ja/integrations/images/logos/logo-vulcansql.png b/docs/ja/integrations/images/logos/logo-vulcansql.png new file mode 100644 index 00000000000..37dfdf59e21 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo-vulcansql.png differ diff --git a/docs/ja/integrations/images/logos/logo_airflow.png b/docs/ja/integrations/images/logos/logo_airflow.png new file mode 100644 index 00000000000..ec97d14b737 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_airflow.png differ diff --git a/docs/ja/integrations/images/logos/logo_beam.png b/docs/ja/integrations/images/logos/logo_beam.png new file mode 100644 index 00000000000..2921261a91c Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_beam.png differ diff --git a/docs/ja/integrations/images/logos/logo_bytebase.png b/docs/ja/integrations/images/logos/logo_bytebase.png new file mode 100644 index 00000000000..12fba79ef96 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_bytebase.png differ diff --git a/docs/ja/integrations/images/logos/logo_calyptia.png b/docs/ja/integrations/images/logos/logo_calyptia.png new file mode 100644 index 00000000000..4fef01c12a6 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_calyptia.png differ diff --git a/docs/ja/integrations/images/logos/logo_cpp.png b/docs/ja/integrations/images/logos/logo_cpp.png new file mode 100644 index 00000000000..38d99684e06 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_cpp.png differ diff --git a/docs/ja/integrations/images/logos/logo_dataddo.png b/docs/ja/integrations/images/logos/logo_dataddo.png new file mode 100644 index 00000000000..1f6af662622 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_dataddo.png differ diff --git a/docs/ja/integrations/images/logos/logo_datahub.png b/docs/ja/integrations/images/logos/logo_datahub.png new file mode 100644 index 00000000000..64e84f7446a Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_datahub.png differ diff --git a/docs/ja/integrations/images/logos/logo_dbvisualizer.png b/docs/ja/integrations/images/logos/logo_dbvisualizer.png new file mode 100644 index 00000000000..318362b081b Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_dbvisualizer.png differ diff --git a/docs/ja/integrations/images/logos/logo_decodable.png b/docs/ja/integrations/images/logos/logo_decodable.png new file mode 100644 index 00000000000..9defd326095 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_decodable.png differ diff --git a/docs/ja/integrations/images/logos/logo_deepflow.png b/docs/ja/integrations/images/logos/logo_deepflow.png new file mode 100644 index 00000000000..fd8201698f2 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_deepflow.png differ diff --git a/docs/ja/integrations/images/logos/logo_flink.png b/docs/ja/integrations/images/logos/logo_flink.png new file mode 100644 index 00000000000..ff83420f927 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_flink.png differ diff --git a/docs/ja/integrations/images/logos/logo_growthbook.png b/docs/ja/integrations/images/logos/logo_growthbook.png new file mode 100644 index 00000000000..c879a317f17 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_growthbook.png differ diff --git a/docs/ja/integrations/images/logos/logo_hightouch.png b/docs/ja/integrations/images/logos/logo_hightouch.png new file mode 100644 index 00000000000..492617c2415 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_hightouch.png differ diff --git a/docs/ja/integrations/images/logos/logo_holistics.png b/docs/ja/integrations/images/logos/logo_holistics.png new file mode 100644 index 00000000000..d41367dfb2f Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_holistics.png differ diff --git a/docs/ja/integrations/images/logos/logo_ibis.png b/docs/ja/integrations/images/logos/logo_ibis.png new file mode 100644 index 00000000000..515804f12bd Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_ibis.png differ diff --git a/docs/ja/integrations/images/logos/logo_inlong.png b/docs/ja/integrations/images/logos/logo_inlong.png new file mode 100644 index 00000000000..293aa09e065 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_inlong.png differ diff --git a/docs/ja/integrations/images/logos/logo_jaeger.png b/docs/ja/integrations/images/logos/logo_jaeger.png new file mode 100644 index 00000000000..b98e5b053d5 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_jaeger.png differ diff --git a/docs/ja/integrations/images/logos/logo_metabase.png b/docs/ja/integrations/images/logos/logo_metabase.png new file mode 100644 index 00000000000..2ee7383aa6a Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_metabase.png differ diff --git a/docs/ja/integrations/images/logos/logo_metaplane.png b/docs/ja/integrations/images/logos/logo_metaplane.png new file mode 100644 index 00000000000..8811d257e1c Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_metaplane.png differ diff --git a/docs/ja/integrations/images/logos/logo_mindsdb.png b/docs/ja/integrations/images/logos/logo_mindsdb.png new file mode 100644 index 00000000000..eb54d13e910 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mindsdb.png differ diff --git a/docs/ja/integrations/images/logos/logo_mitzu.png b/docs/ja/integrations/images/logos/logo_mitzu.png new file mode 100644 index 00000000000..8484a06b063 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mitzu.png differ diff --git a/docs/ja/integrations/images/logos/logo_mode.png b/docs/ja/integrations/images/logos/logo_mode.png new file mode 100644 index 00000000000..7fa819fa338 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mode.png differ diff --git a/docs/ja/integrations/images/logos/logo_mprove.png b/docs/ja/integrations/images/logos/logo_mprove.png new file mode 100644 index 00000000000..d4ab40947f0 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_mprove.png differ diff --git a/docs/ja/integrations/images/logos/logo_nifi.png b/docs/ja/integrations/images/logos/logo_nifi.png new file mode 100644 index 00000000000..d8707bf11f9 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_nifi.png differ diff --git a/docs/ja/integrations/images/logos/logo_openBlocks.png b/docs/ja/integrations/images/logos/logo_openBlocks.png new file mode 100644 index 00000000000..2db869632c6 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_openBlocks.png differ diff --git a/docs/ja/integrations/images/logos/logo_otel.png b/docs/ja/integrations/images/logos/logo_otel.png new file mode 100644 index 00000000000..62dc3426bcb Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_otel.png differ diff --git a/docs/ja/integrations/images/logos/logo_peerdb.jpg b/docs/ja/integrations/images/logos/logo_peerdb.jpg new file mode 100644 index 00000000000..1bb79bb37e6 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_peerdb.jpg differ diff --git a/docs/ja/integrations/images/logos/logo_php.png b/docs/ja/integrations/images/logos/logo_php.png new file mode 100644 index 00000000000..21045d41067 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_php.png differ diff --git a/docs/ja/integrations/images/logos/logo_qryn.png b/docs/ja/integrations/images/logos/logo_qryn.png new file mode 100644 index 00000000000..12997b2fa5b Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_qryn.png differ diff --git a/docs/ja/integrations/images/logos/logo_r.png b/docs/ja/integrations/images/logos/logo_r.png new file mode 100644 index 00000000000..12694661597 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_r.png differ diff --git a/docs/ja/integrations/images/logos/logo_redash.png b/docs/ja/integrations/images/logos/logo_redash.png new file mode 100644 index 00000000000..1bfd80d7635 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_redash.png differ diff --git a/docs/ja/integrations/images/logos/logo_redpanda.png b/docs/ja/integrations/images/logos/logo_redpanda.png new file mode 100644 index 00000000000..f62aa4928d0 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_redpanda.png differ diff --git a/docs/ja/integrations/images/logos/logo_ruby.png b/docs/ja/integrations/images/logos/logo_ruby.png new file mode 100644 index 00000000000..a4b78fcea7c Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_ruby.png differ diff --git a/docs/ja/integrations/images/logos/logo_rust.png b/docs/ja/integrations/images/logos/logo_rust.png new file mode 100644 index 00000000000..e3d6e9095af Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_rust.png differ diff --git a/docs/ja/integrations/images/logos/logo_scala.png b/docs/ja/integrations/images/logos/logo_scala.png new file mode 100644 index 00000000000..bd0498d9103 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_scala.png differ diff --git a/docs/ja/integrations/images/logos/logo_schemaspy.png b/docs/ja/integrations/images/logos/logo_schemaspy.png new file mode 100644 index 00000000000..b6b2ad7596a Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_schemaspy.png differ diff --git a/docs/ja/integrations/images/logos/logo_seatunnel.png b/docs/ja/integrations/images/logos/logo_seatunnel.png new file mode 100644 index 00000000000..cc80d5090db Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_seatunnel.png differ diff --git a/docs/ja/integrations/images/logos/logo_sisense.png b/docs/ja/integrations/images/logos/logo_sisense.png new file mode 100644 index 00000000000..728451df802 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_sisense.png differ diff --git a/docs/ja/integrations/images/logos/logo_supabase.png b/docs/ja/integrations/images/logos/logo_supabase.png new file mode 100644 index 00000000000..843be59ca50 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_supabase.png differ diff --git a/docs/ja/integrations/images/logos/logo_tableau.png b/docs/ja/integrations/images/logos/logo_tableau.png new file mode 100644 index 00000000000..f59982b3404 Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_tableau.png differ diff --git a/docs/ja/integrations/images/logos/logo_vs.png b/docs/ja/integrations/images/logos/logo_vs.png new file mode 100644 index 00000000000..40199ddbedd Binary files /dev/null and b/docs/ja/integrations/images/logos/logo_vs.png differ diff --git a/docs/ja/integrations/images/logos/looker.svg b/docs/ja/integrations/images/logos/looker.svg new file mode 100644 index 00000000000..8ed1a7cb443 --- /dev/null +++ b/docs/ja/integrations/images/logos/looker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/looker_studio.svg b/docs/ja/integrations/images/logos/looker_studio.svg new file mode 100644 index 00000000000..952b9039d9b --- /dev/null +++ b/docs/ja/integrations/images/logos/looker_studio.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/mage.jpg b/docs/ja/integrations/images/logos/mage.jpg new file mode 100644 index 00000000000..b6a669376c9 Binary files /dev/null and b/docs/ja/integrations/images/logos/mage.jpg differ diff --git a/docs/ja/integrations/images/logos/metabase.svg b/docs/ja/integrations/images/logos/metabase.svg new file mode 100644 index 00000000000..9602f6703b7 --- /dev/null +++ b/docs/ja/integrations/images/logos/metabase.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/minio.png b/docs/ja/integrations/images/logos/minio.png new file mode 100644 index 00000000000..72c994c68d2 Binary files /dev/null and b/docs/ja/integrations/images/logos/minio.png differ diff --git a/docs/ja/integrations/images/logos/mongodb.svg b/docs/ja/integrations/images/logos/mongodb.svg new file mode 100644 index 00000000000..fa3837793e1 --- /dev/null +++ b/docs/ja/integrations/images/logos/mongodb.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/msk.svg b/docs/ja/integrations/images/logos/msk.svg new file mode 100644 index 00000000000..2f3d43de1ed --- /dev/null +++ b/docs/ja/integrations/images/logos/msk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/mysql.svg b/docs/ja/integrations/images/logos/mysql.svg new file mode 100644 index 00000000000..5361d2629db --- /dev/null +++ b/docs/ja/integrations/images/logos/mysql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/nats.svg b/docs/ja/integrations/images/logos/nats.svg new file mode 100644 index 00000000000..8694a2f33b0 --- /dev/null +++ b/docs/ja/integrations/images/logos/nats.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/nodejs-logo.svg b/docs/ja/integrations/images/logos/nodejs-logo.svg new file mode 100644 index 00000000000..8d788c57cb6 --- /dev/null +++ b/docs/ja/integrations/images/logos/nodejs-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/observable.svg b/docs/ja/integrations/images/logos/observable.svg new file mode 100644 index 00000000000..1b18a61be7b --- /dev/null +++ b/docs/ja/integrations/images/logos/observable.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/odbc.png b/docs/ja/integrations/images/logos/odbc.png new file mode 100644 index 00000000000..250fd8ce283 Binary files /dev/null and b/docs/ja/integrations/images/logos/odbc.png differ diff --git a/docs/ja/integrations/images/logos/omni.svg b/docs/ja/integrations/images/logos/omni.svg new file mode 100644 index 00000000000..e57a03e713f --- /dev/null +++ b/docs/ja/integrations/images/logos/omni.svg @@ -0,0 +1,483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 00A1FF + + Primary + + Secondary + + 3F4755 + + A3ACBB + + E8BF43 + + + AA3F6B + + + + + + + 6773A2 + + 3FF2DE + + 4EE8FF + + FF5789 + + 290E05 + + diff --git a/docs/ja/integrations/images/logos/ops_ramp_logo.png b/docs/ja/integrations/images/logos/ops_ramp_logo.png new file mode 100644 index 00000000000..3f634d529fe Binary files /dev/null and b/docs/ja/integrations/images/logos/ops_ramp_logo.png differ diff --git a/docs/ja/integrations/images/logos/pinax-logo.png b/docs/ja/integrations/images/logos/pinax-logo.png new file mode 100644 index 00000000000..1ed48192871 Binary files /dev/null and b/docs/ja/integrations/images/logos/pinax-logo.png differ diff --git a/docs/ja/integrations/images/logos/popsink.svg b/docs/ja/integrations/images/logos/popsink.svg new file mode 100644 index 00000000000..584374bfd79 --- /dev/null +++ b/docs/ja/integrations/images/logos/popsink.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/postgresql.svg b/docs/ja/integrations/images/logos/postgresql.svg new file mode 100644 index 00000000000..313b7982444 --- /dev/null +++ b/docs/ja/integrations/images/logos/postgresql.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/powerbi.png b/docs/ja/integrations/images/logos/powerbi.png new file mode 100644 index 00000000000..fab7e5385e5 Binary files /dev/null and b/docs/ja/integrations/images/logos/powerbi.png differ diff --git a/docs/ja/integrations/images/logos/prequel.svg b/docs/ja/integrations/images/logos/prequel.svg new file mode 100644 index 00000000000..8646aba2207 --- /dev/null +++ b/docs/ja/integrations/images/logos/prequel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/pulse.png b/docs/ja/integrations/images/logos/pulse.png new file mode 100644 index 00000000000..9dd518e7217 Binary files /dev/null and b/docs/ja/integrations/images/logos/pulse.png differ diff --git a/docs/ja/integrations/images/logos/python-logo.png b/docs/ja/integrations/images/logos/python-logo.png new file mode 100644 index 00000000000..838816beb73 Binary files /dev/null and b/docs/ja/integrations/images/logos/python-logo.png differ diff --git a/docs/ja/integrations/images/logos/python-logo.svg b/docs/ja/integrations/images/logos/python-logo.svg new file mode 100644 index 00000000000..938831f7ed7 --- /dev/null +++ b/docs/ja/integrations/images/logos/python-logo.svg @@ -0,0 +1,288 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/python.svg b/docs/ja/integrations/images/logos/python.svg new file mode 100644 index 00000000000..39d0d512db6 --- /dev/null +++ b/docs/ja/integrations/images/logos/python.svg @@ -0,0 +1,4571 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@font-face{font-family:'Verdana';src:url("data:;base64,\ +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\ +ABUAFgAXABkAGwAcAAA=")} + + + + + + + + + + + + + + + + + + + + + + + + + 2006-06-28T15:19:32Z + 2006-06-28T15:19:32Z + Illustrator + + + + JPEG + 256 + 104 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA +AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK +DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f +Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAaAEAAwER +AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA +AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB +UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE +1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ +qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy +obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp +0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo ++DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 +FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh4LeBogTGpJr +UlR44qv+rW/++k/4EYq76tb/AO+k/wCBGKu+rW/++k/4EYq76tb/AO+k/wCBGKu+rW/++k/4EYq7 +6tb/AO+k/wCBGKu+rW/++k/4EYq76tb/AO+k/wCBGKu+rW/++k/4EYqp3FvbiMUiT7afsj+cYqqf +Vrf/AH0n/AjFXfVrf/fSf8CMVd9Wt/8AfSf8CMVd9Wt/99J/wIxV31a3/wB9J/wIxV31a3/30n/A +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 +XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX/2Q== + + + + + + + image/svg+xml + + +image/svg+xml + + + + + + + + + + eJzUvYd++jyyP/zeAPcQEnq1TS8JmB4gCS2FJIRqCAktlN19ztW/I7libGPaOfv/PLv5JbasMhqN +pug7MhsrdTc9mPcYt89DXBnM5vSS6a7ny+gVfnp1P5lsVuslemSr2a9I0kNAIfo+3OYKvjDL1Xg+ +i+JX+GUOfW2rr5nFd3d2lWHGPWZiv7LZ4VVjvJ4w8HLxz/p7PnNP5qO5e9pdrZml+18+d+Ph6iM9 +n/2LsfP9gIoz3TV8EfRSYS8RhEaiZOSKfoACqflmNhjPRqn5f6JXFHHl9l0FCf8V5fPBy8K4xqxk +JTxU4MpNeYJUJAIlfR4yCL9QPnjiJ0j4JjPvb6bMbF1ZzvvMapWeT+bLVfQq/Q+M4qE7gjfdqyYz +mcz/fZWadPu/kk9y89kaFZ1vlmNm+cj8252aTwZQwHkF9Bl0Z11J4UeGGTADPZ/Q94F2bjxhgKLT +7voqhMhL3/vauGvPK+gTqgB+R49D7fspPKkz6zWMGapGc1HLp6TDgYf4P9tHjRmN8bwCiVt2ttoG +M11MgNyYXj6gJUlQnoD4G1cKOoRLuCn4X8QHJYIkceWPhPkSIiGZf42Zf0evHuczhh0NvVzXx/+D +JpSkrkIRin1a20yY5fNsjAiCH0XYIT7MB8wEOEv4Njfp4pHh/0jxJ1ug0V2OmDVM/HyyWWOeDBPc +q8fNtNz9h0Hz6WMbeFows8b8BffPTREwgIAfhkLCUFHXyOAVFcQNBK/8FNcSiVvjuoMqQJ/z9QZD +ISB4BabgaTkejWdRrl+hdn45HojTEqKuwuwP3HVPWPL/CP9/to8w3PWambFTmZ0N0vMpousKcT/M +3wymFpYQ+074Hb+B5jYLw4fBF/H+beZrZgVtT5irSNA7Wnb/xVyRsJzoATAevFl56SW89qb7zGA8 +mXS92W5/s2a8j+vxZMB4n/hiBu+z8EWXLdLFtXm7/fESpnw4Yf7j7Ypl2O+7uPI+XzmDvzR4GfZT +RvIpI3w6Zqsfs2XGkjJjocwMV2/wztmyc7bsXFJ2LpSds13ZsEU3bNGNWNTg3QhlB93RiFl6B9BB +hvH2gd5eJKAmaBQrpo8Yy9vbTCbM2rvoLhEFFt9e+GLanQ16E6DSEi8tqG3g7c8X/wAzfK+9sNQG +zLS7/PWyfRCa88zm6wEz9NJZ79Nq0l19G4RHCxC90/FsIxbi//2HmXmnG/ljw045/t/5cjBkoKrx +jEG/g8jtbyboD75AF55zrf9tmBUa5GD+75mX+U9/0p3iX4G7xv3uBD4QvhrCGh3Pdrsx2sBUM9M5 +CPvhWvyLpQRI0PECjXy16PYZL81OBs0xG/dP1jtHPDIbQJe8zBT/gxkZSIwr5f9g68R/ic/Zh4Px +v8aIQQSiCTRvCr8Nl112RrOb5Rz3FK8Uod/4L1ydwTscw4A59oCWvQtoZz5ADILnWlxnve6KETqI +/4CisOFtVsAiBi8tYdGs5Hea5Yys0LksS5p79vm9lF3vhUL3bKEnttCTpD5+3E9siWe2xLO0mmf2 +1QDN1Go19kq+Zidi2u0vEb+DJMfFun28INglza5og/d7Mxt1l5vppLtZwzoEYf/r7XfhO0Mji2Vl +oNhurGBLEHcCXxuLqeysP0c7dPSqLdsIdzbGD6+8iFf+CbstNN7ZBkAm8tVfNZYbpvHPgtHdG24L +FrZiaJ371cu/0tHaBxkkOUFyRYZ8XpgQ5m/TncAfQe94NoQFuf5HsszRJOACIKVB+4EZRn8YyDCJ +VjtIm/W4OxmMh0Mv9H+K927vYjkfbPogi8ZQ4xpJVag+HPE+TZlR98pARgJeED1o5V6RkZC3u4AP +/sP1IhL2ZpgJqDUU6eeWCyzz/2FmI+aK8hOo8AQWULv+z7Q3n7S97L9bIw+wpGsDKSvAFWiPMzwu +DFhDrEw28Cq/nG8W97Ph3GBjVcoK2tSWs6cZ/PJ9lVpuVt9Xjfkc6YhbBbhXbC3o5XItLa3ZBpRV +r1+s6Ki6012QYFjsj/tK1Su8F9pR+1azQVADloxYB/5T+Ffzy3ofk1Kpl9uvhMoVvtBuAbPEeDUV +K5Y8EX/fxxEwURMQ9yuhGvZPsWPl8b/4h9qVZZghqMuSqcVPs2BWTOYLCRmFJyCUr167y4Vatah3 +sFQHQJX6ZrxmxImeTxfIxLiqf3cX6PFOSXaFgGyQrg+3W3vhHPxBhH2DdOv1PyBDDN7SDHZs/MdV +FOgym8OAvY/dKXPlMnjrY1DzGf4tcfVkANMoGAyB3kmGwxT6JxBEWijhI/3wT4gIRGT/vHUNvP5N +XL39A38U4ZcfePTvK/8VmHEt4moAT99quNwb7HqVLvT5Kma4ApEzhH8V+njlD+7pJt8/KoI6BkYJ +6iVJhrfU6Et1LrSncyGfzwcd8IUJ1DmKjARR78IU/oulr5/wIRoGKDAvzt/ND3ja3UzWLe2OCuYT ++g/3omaQWlTQJK27a6RK1zBbAh+LTLmXsytd0KnBNECNVnqyLsktVvzq7X8MO88rfUMlJTTG13nI ++ilDdVJi7owFFzhmoZIE+4oVi6ia/497DBXJHqpUzvWVN7Ez3XXXYG57+b9hjtFfY6zUdpf/sH+/ +PZQfwZTGf9huBlxZ4JL6GmlyV7b/TEGvHzBu9GMGnGMH1jG3ld//qzvZcAUiV957aHPr9fqfBfcW +zMplV6kHU2bdHUDHT+8AeVwHVsN//9+1PRn3mdX/YvMxsUz/G5T6JTPjysjYRFIQdIDluAfmwoot +GmM/2B1IHVTwPoMdbf+VY9ru8n/2dpH1EnprDKjHar2k/ncpj3q9S/1/9g6Fd3X+dw3mH6XBfDPI +wt4/Ob6Ahwr9lw2I7/vuqP49Hqy/9w4qEKY8EfK/bp64zu+Oqjdfr+fTMjNcs27OvQOERZ0CM+K/ +ZmS7A3Dt+8Z1SOsykQPf7JeMNsts1YZdKaZS8v9S+rAD0EWj7aH/q7scd3sTFJH439wbVDvxf96H +/8od8tBJja66yKJAiuf/8sRefgX2NysQDf/di1BhcNF/6Rse8OHqv3VwaAyXlMMwdmDXR0yQfbTq +jXHYmPzvI5V0FLvMMJn3f5nB/vHN5jM1Kvwfjo3v/X/JbvzfvFjOTaT/pZqkrgf0hOBoR9+T5JXg +wcCh66tydzbadEfMVWW+2CxkmiT+oLJkVszyX8xVg/nP+io7GK+7vfFkvOYsjGAg4AsIDUSuust1 +b95dDq766GTBFXm15Jltb0kUv5npLNsTOCNA+amwelFK7MDekpIO7C3b29lYd4ttsy56v152Z6tF +F+a1/w80Nx5crcb/wwjTxJM9crXoLpglvJxuJtjjxhbxEQRvv6BCT5v1YrO+quGTPeP/wQWvxHMZ +XPcCW988MKvvPV8QW/PP89LVGEp11wyMnMFyW7Pw7wzEzBw6N0IOfm69fzwwg/FmKmmwJVn5SuzJ +ncwAUmA2XF9JZLJsSfg5MgPlOcKHeMoPFmOPrLfdyXglezTtrn45Mgd5ii26A1FU0vdX9GY9F6jH +zz8hWWDE1VDo8pI7ccX018Ayve6kO+vvzvXWJ0AxdF7gag1rTV/J1Xo5/+XXPqlSuD8ZL4AlkUL5 +nyt0bmI+2/PFgl/1838xywVyjQriBUjTny8HzGB3Gq68j/P1Ia/F2feKcsy7HCxXHlZJlCu3O8W6 +s9l8LYyFnbWdQvy4VqttibhbcDPr7ykCGxisgIEulpZ+/J+FR9z6lGqHAvPFYLOnwGpfDf35tliS +FUCsoF0AnQxcrlm+0myLKynyKhY1SiVBsG6LGB+hUnIpLxkKKBfcWk6KM79g51171qEQiJXtchIp +Ky/63R2g8yCa9U1ItNK6a81CQLs1Vg81y0zRMlxJBbNSuRkzAkH+L0Z9WqEQKNuwBrkBqnSc+Rc6 +QarW0nC29qw2vZXGwFCRwWSxHM4FeaHUHbbYFLQXbrdXJPdo+utBJ7lW8+HQw3qTdBdfis5CHaXX +84XusujIkkAAlcIgH5iBvNc6ikt6raO00GsdZbd6vTv3qCzWWHqgje8pt5TEAfcUXYBiOZ4N5/ta +XkpGolwED4QrI4kc7JQbMEO0K0q8qsrCGBf+mffW6KD03oLsVjQcT7TWKyq4QmHLPWW29g+lUv3l +wLMeTwQNS2kFoTKrfn+mtRjZMotJ/x+JnrJLN7ZYd8J4/qWz3LcG26FS8+WIr0uzDFePkoBHRRbz +1VibyVApmO/F93z5P9ql5ssxOle+p7rJ0iOoOz109Fy7LL9TLuZrjUWDSoqiTpnLgBP3KAeoRG+8 +nnYX8g1SrTQeRXfFfqTOSULRuTZ/C+V6XBBSq+CAWY1Hs33kXiyWHmwQafEKKvQNImzFaElGXOzf ++opJI0kale0VIVBInLNQhFIUSlBojOAC2xsYuafw3o1AKLlnExDKiRuARk+llNHoo4Q0isoGFBmw +hzo0RCEU2q/hr9YTrtRiMVBvERXjWhTKqVcIRdB6nCj5znfKIo5nlltRNs3m2fK8cSA5KKTUAmy5 +E/aku2jWxgS3CzroQ/OFr5AdpWD47ppUamsSNdZd71nh6PzxcsWg2pbaMmP1O16AjJz97pNrSAmA +RT5SHF9x3kOH/ySjE70pUChbqV89yQzQLR8IV6aMLGF0thSdMcR+Kk0vCPdVHh3YRb4G9BXrF1Ez +PoRvWNvf+8La9Ck1m57rOmejN0QLSbVMXc2OZ4ulkQWf5iz4mtSC1+NVQTVouFJIqedpNhdt/qvx +DLsN0E4sc8TWX/IIWlUHg4CF3GxPH/e6PO9LdgHJy+y0xwxYYm7bJPAO+tcfi1aPpEX+6Df7wi++ +wOfFGoI/WBgQvMJnSNFYMQ5i9z2Pxtp9UxkNdx++deVeUtT8ZNwXuhXbXZPiOb3tA2VoctiDZohF ++HcGL3oufYLWOV1P39+HAxmod4COHJqdd0G3Kbmyv11nSsX+MGevUnTyL/Vl8yeeOnehVx8xiDFR +8wz/GbsH6yXXKW+sOaPzg5A9cyZeel6CmqwDdK2RaySji1Yk+B6cvhvMcXcnN8eVQXuxFV3fPNvo +WW+04r65+5vSpdfszXJ5lx5k3nOzj+xriqnRhWDnMWqZjR35wIpaBH22hS3dut8soJbWXdZZ9hSc +ie+1L2BM26sGs39FrR7g1auNG0ain/PHq9HnXJZcmjKu7t8LvHXcZJhlapN1PpRfM6V7Yz1c26Qf +cplAwkQ36Nkz+qKSjDWqG493FSjEXwufFPTm5SHpXRM5gznpj8creEDOu7zR4l/5TFXcC73k0EEM +mFSOHF/TXONu9pTqPLxnkt7lYA1deShmEk7qni7XO41TOnLQvNz2aNfisZgsRVZ3YaCKJzd/979k +l5/vBExYs5G7pW/7XG9uF2axNwbz3cIeR1NWcKcp020n49kkn+nQZ7sZbC7ISs5SfZtw7fVpS2a4 +sJN0o7jeyJ+V3uxrqKW4yXievuPLpT8zJqjg9SL5Yq2bgJNxcZKodHP2taWbdbUevQ== + + + qaCLuubq6cyTy2Vs1YAeu+4J0v0TlRArVUszq3Bu/UJ9zX8twSrjcCKmekLM0HDe1oLfyxaxihvM +Hl85QnH0ZrntJQx8Es77w3+xH/jTbicGlmZmu9HPZevhs6rcaD70FYjef3nERoGTxWa/TI9l1UaD +41LerNxo3GhbrkjzUrnRCvkJrVxTUYfSWFdW14NbpdHAt61rbWaVG/XbP51xaiQZKbQiNnud+/Lf +PC8mZaVGiVyqlFRpNHhjmi3ttyqNNr8MZiI3fKwrjvU6b4xbyGK7odhovkA1VMlLvd81OrhR0kH3 +sjyP8bP6uvzc3JVRo7HdWbU1fR8T0g6Nul07rFQmUlyjFatV1qjBHAhM2wux2e1G28vW96yh0miy +GwzlTKRio1+JTk1sVJSWbLMFk88W+1RuNG5srW6+mZpyo9W0/e7PNC0rNQoUi02idypjDXw7Eu/J +J+VG/c0mkYsQj4qNXudGIVNtSj3hRoFiclZqtXIqjQZvzL+zh7Rao10i7+q8KDVqMAMrEbSVsYWa +igRe37gSXKNNt01G3sSj/5Yjb/bzN7fV6HucKIfcJGo0jnhMNtYCMw/Wum4KGiXc8pGWP967Ko0G +b0K/g9yXUqMGM2o2Qzw4WhHc7E6j93/R5M/ysabYaD1m9ak2WmLqPgI3ajDvjvXDTdTb9mvlRksF +5vHj3W5TbPTFOhspNQoyGTVb/652eioE/sgTL6VFXLnRss/8nEvGb5UbXRSvcaNIU9od60s7f71W +a/SJeE2UMsqNPtxl21/VVkvWKLSCm209/d6rEvinGRjkVBr9DBOt1cSt3Ojjz2L6FAmDTFYca/ve +PVNtdGmuO40qjTafiex4WpQ1ajBzAuLRfW1MttxZaNTnkS+aTTvU5hrt+eyyRWN/L3cduFHKemcr +bI+0THQcURokPzR7JxsrVPvzxwv9oFfe6GpuueUaXSecspEaP7sfdrbRVJO8x41CK7wodC1Xz3dG +1GhyVyrdu/mRxklZo85Y4TrINpogS26ZIHQt/I8dA7uV+0zRdGlb/pqWy25vhhpNyUe6pJk5z78p +n3wjD/xEuZ0mEa16cKO4FY7A13Om02B3VabbDm53qvBs+ZpHVd82q+T0Re0tSH6i0DFvVN+D6M1Y +VN7CHFicaU6vYX6YkOxtMEy2G5yEIZjVb1j+fvZ9/cZ9vfs2VLmPfqq+DVOOWkf2VqQYvP/ufllV +v6Ypy3tf9W3ZOUtQqm8N5nLvaRhTff903e8VVN6GC5ZC/HnFvh1a/yKyb5+dY045BYoNyeuo/H2v +WJ9xX+++fck4f5eqb1/NPa9R9lZKsdfPTPRW9euO+StkUn37s64sCqpvDebfFypVVX0//c3dfam9 +hR5WYwHVt0XKf/emTjFzf9arl9W+thgt958O1bdZ+qHHqFPMUqQS16Ta17SRMtmjKm8DBSJ76+DH +HLXFZG+hlUZ1leDepz1x2ftGJ++gpW/9rho2rllzLu12pIPrxVcrPfputFMThr69ixRMP9s2d5TT +YXbNvtVb8mX4XKcbDfMrFlJ042Hgz3aXH2Znar563Hr2bsVSLkqGjY9YmBkdpRhpdGVqr0bXy1fd +YDa62oOG0fZh36DfKsCEv2mju9QOiGYhbxQ2R3TVVw9Dv9NOsE/nv0FTKDKMux2UkbcrW+Fce/3Z +TcYW5HWm6LwJ4KHhebFM6XnmC9j0JnJNWW8rdxnGkTXjdYfMmQ+eihrlkK0VUS1nMIsl76Lpj+be +GsEM65lqvzrKOcxx41zkMdWSwRt9YwFbLFSzt3SMBVltvlhbR43mp/FDV0c5tKX3dY3Fet/zjPga +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 +PXf+Cylwi7g8HC7tlUP/F1gVhvo= + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/qryn.svg b/docs/ja/integrations/images/logos/qryn.svg new file mode 100644 index 00000000000..fc04e953b48 --- /dev/null +++ b/docs/ja/integrations/images/logos/qryn.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/qstudio.png b/docs/ja/integrations/images/logos/qstudio.png new file mode 100644 index 00000000000..38e2b4f3093 Binary files /dev/null and b/docs/ja/integrations/images/logos/qstudio.png differ diff --git a/docs/ja/integrations/images/logos/quesma.svg b/docs/ja/integrations/images/logos/quesma.svg new file mode 100644 index 00000000000..cb9c996e5c5 --- /dev/null +++ b/docs/ja/integrations/images/logos/quesma.svg @@ -0,0 +1,15 @@ + + + + + + diff --git a/docs/ja/integrations/images/logos/quicksight.svg b/docs/ja/integrations/images/logos/quicksight.svg new file mode 100644 index 00000000000..66bb428daf9 --- /dev/null +++ b/docs/ja/integrations/images/logos/quicksight.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/rabbitmq.svg b/docs/ja/integrations/images/logos/rabbitmq.svg new file mode 100644 index 00000000000..17b4b6a60e7 --- /dev/null +++ b/docs/ja/integrations/images/logos/rabbitmq.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/redis.svg b/docs/ja/integrations/images/logos/redis.svg new file mode 100644 index 00000000000..90035f23c26 --- /dev/null +++ b/docs/ja/integrations/images/logos/redis.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/restack_logo.png b/docs/ja/integrations/images/logos/restack_logo.png new file mode 100644 index 00000000000..cccf00d650c Binary files /dev/null and b/docs/ja/integrations/images/logos/restack_logo.png differ diff --git a/docs/ja/integrations/images/logos/retool.svg b/docs/ja/integrations/images/logos/retool.svg new file mode 100644 index 00000000000..496e5e3d9d7 --- /dev/null +++ b/docs/ja/integrations/images/logos/retool.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/rill.svg b/docs/ja/integrations/images/logos/rill.svg new file mode 100644 index 00000000000..1545bc1b748 --- /dev/null +++ b/docs/ja/integrations/images/logos/rill.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/ja/integrations/images/logos/risingwave.svg b/docs/ja/integrations/images/logos/risingwave.svg new file mode 100644 index 00000000000..46c3c4b7b26 --- /dev/null +++ b/docs/ja/integrations/images/logos/risingwave.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/rocketbi-logo.svg b/docs/ja/integrations/images/logos/rocketbi-logo.svg new file mode 100644 index 00000000000..7428612a254 --- /dev/null +++ b/docs/ja/integrations/images/logos/rocketbi-logo.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/rocksdb.svg b/docs/ja/integrations/images/logos/rocksdb.svg new file mode 100644 index 00000000000..c6a9f2e1f1b --- /dev/null +++ b/docs/ja/integrations/images/logos/rocksdb.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/rsyslog.png b/docs/ja/integrations/images/logos/rsyslog.png new file mode 100644 index 00000000000..5d25c5df717 Binary files /dev/null and b/docs/ja/integrations/images/logos/rsyslog.png differ diff --git a/docs/ja/integrations/images/logos/rudderstack.svg b/docs/ja/integrations/images/logos/rudderstack.svg new file mode 100644 index 00000000000..6b03e8c07df --- /dev/null +++ b/docs/ja/integrations/images/logos/rudderstack.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/runreveal.png b/docs/ja/integrations/images/logos/runreveal.png new file mode 100644 index 00000000000..8813ed4c39c Binary files /dev/null and b/docs/ja/integrations/images/logos/runreveal.png differ diff --git a/docs/ja/integrations/images/logos/schemaspy_logo.png b/docs/ja/integrations/images/logos/schemaspy_logo.png new file mode 100644 index 00000000000..db244b3120a Binary files /dev/null and b/docs/ja/integrations/images/logos/schemaspy_logo.png differ diff --git a/docs/ja/integrations/images/logos/sematext_logo.png b/docs/ja/integrations/images/logos/sematext_logo.png new file mode 100644 index 00000000000..faf3bfe66cd Binary files /dev/null and b/docs/ja/integrations/images/logos/sematext_logo.png differ diff --git a/docs/ja/integrations/images/logos/signoz-logo.png b/docs/ja/integrations/images/logos/signoz-logo.png new file mode 100644 index 00000000000..8701ff89f85 Binary files /dev/null and b/docs/ja/integrations/images/logos/signoz-logo.png differ diff --git a/docs/ja/integrations/images/logos/signoz-logo.svg b/docs/ja/integrations/images/logos/signoz-logo.svg new file mode 100644 index 00000000000..7b18399c1bb --- /dev/null +++ b/docs/ja/integrations/images/logos/signoz-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/docs/ja/integrations/images/logos/skywalking_logo.jpeg b/docs/ja/integrations/images/logos/skywalking_logo.jpeg new file mode 100644 index 00000000000..dba7df077c7 Binary files /dev/null and b/docs/ja/integrations/images/logos/skywalking_logo.jpeg differ diff --git a/docs/ja/integrations/images/logos/snappy_flow_logo.png b/docs/ja/integrations/images/logos/snappy_flow_logo.png new file mode 100644 index 00000000000..269ad7f6f5a Binary files /dev/null and b/docs/ja/integrations/images/logos/snappy_flow_logo.png differ diff --git a/docs/ja/integrations/images/logos/soda_logo.png b/docs/ja/integrations/images/logos/soda_logo.png new file mode 100644 index 00000000000..e2ed7da1143 Binary files /dev/null and b/docs/ja/integrations/images/logos/soda_logo.png differ diff --git a/docs/ja/integrations/images/logos/sqlite.svg b/docs/ja/integrations/images/logos/sqlite.svg new file mode 100644 index 00000000000..3887c50bc7c --- /dev/null +++ b/docs/ja/integrations/images/logos/sqlite.svg @@ -0,0 +1 @@ + diff --git a/docs/ja/integrations/images/logos/streamingfast.png b/docs/ja/integrations/images/logos/streamingfast.png new file mode 100644 index 00000000000..11494844416 Binary files /dev/null and b/docs/ja/integrations/images/logos/streamingfast.png differ diff --git a/docs/ja/integrations/images/logos/streamkap-logo.png b/docs/ja/integrations/images/logos/streamkap-logo.png new file mode 100644 index 00000000000..3de27de76e7 Binary files /dev/null and b/docs/ja/integrations/images/logos/streamkap-logo.png differ diff --git a/docs/ja/integrations/images/logos/superset.svg b/docs/ja/integrations/images/logos/superset.svg new file mode 100644 index 00000000000..812613aa70b --- /dev/null +++ b/docs/ja/integrations/images/logos/superset.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/ja/integrations/images/logos/tableau.svg b/docs/ja/integrations/images/logos/tableau.svg new file mode 100644 index 00000000000..7331f29908a --- /dev/null +++ b/docs/ja/integrations/images/logos/tableau.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/ja/integrations/images/logos/tablum.svg b/docs/ja/integrations/images/logos/tablum.svg new file mode 100644 index 00000000000..9ed2a703dc2 --- /dev/null +++ b/docs/ja/integrations/images/logos/tablum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/teleport_logo.png b/docs/ja/integrations/images/logos/teleport_logo.png new file mode 100644 index 00000000000..1ebdf14d3da Binary files /dev/null and b/docs/ja/integrations/images/logos/teleport_logo.png differ diff --git a/docs/ja/integrations/images/logos/tooljet.png b/docs/ja/integrations/images/logos/tooljet.png new file mode 100644 index 00000000000..64b2e77f773 Binary files /dev/null and b/docs/ja/integrations/images/logos/tooljet.png differ diff --git a/docs/ja/integrations/images/logos/trickster-logo.svg b/docs/ja/integrations/images/logos/trickster-logo.svg new file mode 100644 index 00000000000..fd9d7c7c4f6 --- /dev/null +++ b/docs/ja/integrations/images/logos/trickster-logo.svg @@ -0,0 +1 @@ +trickster-logo \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/upstash.svg b/docs/ja/integrations/images/logos/upstash.svg new file mode 100644 index 00000000000..dfed2937070 --- /dev/null +++ b/docs/ja/integrations/images/logos/upstash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/vector.png b/docs/ja/integrations/images/logos/vector.png new file mode 100644 index 00000000000..2ba6bccd389 Binary files /dev/null and b/docs/ja/integrations/images/logos/vector.png differ diff --git a/docs/ja/integrations/images/logos/warpstream.svg b/docs/ja/integrations/images/logos/warpstream.svg new file mode 100644 index 00000000000..9009d1c3011 --- /dev/null +++ b/docs/ja/integrations/images/logos/warpstream.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/yepcode.svg b/docs/ja/integrations/images/logos/yepcode.svg new file mode 100644 index 00000000000..062b3fcfed3 --- /dev/null +++ b/docs/ja/integrations/images/logos/yepcode.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/ja/integrations/images/logos/zing-logo.png b/docs/ja/integrations/images/logos/zing-logo.png new file mode 100644 index 00000000000..01f5ee1c712 Binary files /dev/null and b/docs/ja/integrations/images/logos/zing-logo.png differ diff --git a/docs/ja/integrations/images/mysql_table_engine_01.png b/docs/ja/integrations/images/mysql_table_engine_01.png new file mode 100644 index 00000000000..2737e8cd84d Binary files /dev/null and b/docs/ja/integrations/images/mysql_table_engine_01.png differ diff --git a/docs/ja/integrations/images/playui.png b/docs/ja/integrations/images/playui.png new file mode 100644 index 00000000000..57dae518505 Binary files /dev/null and b/docs/ja/integrations/images/playui.png differ diff --git a/docs/ja/integrations/images/prometheus-datadog.png b/docs/ja/integrations/images/prometheus-datadog.png new file mode 100644 index 00000000000..9537b27901c Binary files /dev/null and b/docs/ja/integrations/images/prometheus-datadog.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-alloy.png b/docs/ja/integrations/images/prometheus-grafana-alloy.png new file mode 100644 index 00000000000..1256f76e29a Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-alloy.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-chart.png b/docs/ja/integrations/images/prometheus-grafana-chart.png new file mode 100644 index 00000000000..bd5d2b99aae Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-chart.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-dropdown.png b/docs/ja/integrations/images/prometheus-grafana-dropdown.png new file mode 100644 index 00000000000..e8c80e27a2b Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-dropdown.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-metrics-endpoint.png b/docs/ja/integrations/images/prometheus-grafana-metrics-endpoint.png new file mode 100644 index 00000000000..a702427422b Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-metrics-endpoint.png differ diff --git a/docs/ja/integrations/images/prometheus-grafana-metrics-explorer.png b/docs/ja/integrations/images/prometheus-grafana-metrics-explorer.png new file mode 100644 index 00000000000..b0c8e70e055 Binary files /dev/null and b/docs/ja/integrations/images/prometheus-grafana-metrics-explorer.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-1.png b/docs/ja/integrations/images/splunk/splunk-1.png new file mode 100644 index 00000000000..443f000c5db Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-1.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-10.png b/docs/ja/integrations/images/splunk/splunk-10.png new file mode 100644 index 00000000000..32fe77c11e7 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-10.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-2.png b/docs/ja/integrations/images/splunk/splunk-2.png new file mode 100644 index 00000000000..8bd43d27f57 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-2.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-3.png b/docs/ja/integrations/images/splunk/splunk-3.png new file mode 100644 index 00000000000..e9136637682 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-3.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-4.png b/docs/ja/integrations/images/splunk/splunk-4.png new file mode 100644 index 00000000000..341f160d5fe Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-4.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-5.png b/docs/ja/integrations/images/splunk/splunk-5.png new file mode 100644 index 00000000000..fd0a8a7f7b2 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-5.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-6.png b/docs/ja/integrations/images/splunk/splunk-6.png new file mode 100644 index 00000000000..1565adf518e Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-6.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-7.png b/docs/ja/integrations/images/splunk/splunk-7.png new file mode 100644 index 00000000000..ec8f2894b4d Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-7.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-8.png b/docs/ja/integrations/images/splunk/splunk-8.png new file mode 100644 index 00000000000..54808644dcb Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-8.png differ diff --git a/docs/ja/integrations/images/splunk/splunk-9.png b/docs/ja/integrations/images/splunk/splunk-9.png new file mode 100644 index 00000000000..8ab8fddce00 Binary files /dev/null and b/docs/ja/integrations/images/splunk/splunk-9.png differ diff --git a/docs/ja/integrations/index.mdx b/docs/ja/integrations/index.mdx new file mode 100644 index 00000000000..f664db81f93 --- /dev/null +++ b/docs/ja/integrations/index.mdx @@ -0,0 +1,289 @@ +--- +slug: /ja/integrations +title: インテグレーション +keywords: [インテグレーション, 統合, 連携] +description: ClickHouseとのインテグレーション +hide_table_of_contents: true +--- + +import AccelDataPNG from "./images/logos/acceldata_logo.png"; +import AmazonMskSVG from "./images/logos/amazon_msk.svg"; +import ApacheStreamParkPNG from "./images/logos/apache-streampark.png"; +import AzureEventHubsSVG from "./images/logos/azure_event_hubs.svg"; +import BlinkOpsPNG from "./images/logos/blinkops_logo.png"; +import CHDBSVG from "./images/logos/chdb.svg"; +import ClickHouseSVG from "./images/logos/clickhouse.svg"; +import ClickHouseMonitoringDashboardSVG from "./images/logos/clickhouse-monitoring-dashboard.svg"; +import CloudCanalSVG from "./images/logos/clougence.svg"; +import CloudQuerySVG from "./images/logos/cloudquery_logo.svg"; +import ConfluentSVG from "./images/logos/confluent.svg"; +import CsharpSVG from "./images/logos/csharp.svg"; +import CubejsSVG from "./images/logos/cubejs.svg"; +import DatagripSVG from "./images/logos/data_grip.svg"; +import DatalensSVG from "./images/logos/datalens.svg"; +import DbeaverSVG from "./images/logos/dbeaver_logo.svg"; +import DbtSVG from "./images/logos/dbt.svg"; +import DeepnoteSVG from "./images/logos/deepnote.svg"; +import DlthubSVG from "./images/logos/dlthub_logo.svg"; +import DraxlrSVG from "./images/logos/draxlr.svg"; +import EmqxSVG from "./images/logos/emqx.svg"; +import ExploSVG from "./images/logos/explo.svg"; +import FivetranSVG from "./images/logos/fivetran.svg"; +import GcsSVG from "./images/logos/gcs.svg"; +import GlassFlowSVG from "./images/logos/glassflow.svg"; +import GoLangSVG from "./images/logos/golang.svg"; +import GrafanaSVG from "./images/logos/grafana.svg"; +import HashboardSVG from "./images/logos/hashboard.svg"; +import HdfsSVG from "./images/logos/hadoop.svg"; +import HiveSVG from "./images/logos/hive.svg"; +import JavaSVG from "./images/logos/java.svg"; +import JdbcSVG from "./images/logos/jdbc.svg"; +import JitsuSVG from "./images/logos/jitsu.svg"; +import KafkaSVG from "./images/logos/kafka.svg"; +import KinesisSVG from "./images/logos/amazon_kinesis_logo.svg"; +import KestraSVG from "./images/logos/kestra.svg"; +import LookerSVG from "./images/logos/looker.svg"; +import LookerStudioSVG from "./images/logos/looker_studio.svg"; +import MongodbSVG from "./images/logos/mongodb.svg"; +import MysqlSVG from "./images/logos/mysql.svg"; +import NatsSVG from "./images/logos/nats.svg"; +import NodeSVG from "./images/logos/Node.js_logo.svg"; +import OmniSVG from "./images/logos/omni.svg"; +import ObservableSVG from "./images/logos/observable.svg"; +import OpsRampPNG from "./images/logos/ops_ramp_logo.png"; +import PopsinkSVG from "./images/logos/popsink.svg"; +import PostgresqlSVG from "./images/logos/postgresql.svg"; +import PrequelSVG from "./images/logos/prequel.svg"; +import PythonSVG from "./images/logos/Python-logo-notext.svg"; +import QrynSVG from "./images/logos/qryn.svg"; +import QuesmaSVG from "./images/logos/quesma.svg"; +import QuickSightSVG from "./images/logos/quicksight.svg"; +import RabbitmqSVG from "./images/logos/rabbitmq.svg"; +import RedisSVG from "./images/logos/redis.svg"; +import RestackPNG from "./images/logos/restack_logo.png"; +import RetoolSVG from "./images/logos/retool.svg"; +import RillSVG from "./images/logos/rill.svg"; +import RisingWaveSVG from "./images/logos/risingwave.svg"; +import RocketbiSVG from "./images/logos/rocketbi-logo.svg"; +import RocksdbSVG from "./images/logos/rocksdb.svg"; +import RudderstackSVG from "./images/logos/rudderstack.svg"; +import S3SVG from "./images/logos/amazon_s3_logo.svg"; +import SematextPNG from "./images/logos/sematext_logo.png"; +import SkyWalkingJPEG from "./images/logos/skywalking_logo.jpeg"; +import SnappyFlowPNG from "./images/logos/snappy_flow_logo.png"; +import SparkSVG from "./images/logos/Apache_Spark_logo.svg"; +import SodaPNG from "./images/logos/soda_logo.png"; +import SqliteSVG from "./images/logos/sqlite.svg"; +import SupersetSVG from "./images/logos/superset.svg"; +import TablumSVG from "./images/logos/tablum.svg"; +import Teleport from "./images/logos/teleport.png"; +import TricksterCacheSVG from "./images/logos/trickster-logo.svg"; +import UpstashSVG from "./images/logos/upstash.svg"; +import YepcodeSVG from "./images/logos/yepcode.svg"; +import WarpStreamSVG from "./images/logos/warpstream.svg"; +import BytewaxSVG from "./images/logos/bytewax.svg"; + +ClickHouseのインテグレーションは、以下のサポートレベルで分類されています: + +- **コアインテグレーション:** ClickHouseによって構築または保守されており、ClickHouseによってサポートされています。これらはClickHouse GitHubオーガニゼーションに存在します。 +- **パートナーインテグレーション:** サードパーティのソフトウェアベンダーによって構築または保守され、サポートされているものです。 +- **コミュニティインテグレーション:** コミュニティメンバーによって構築または保守され、サポートされています。公開されたGitHubリポジトリやコミュニティSlackチャンネル以外に直接的なサポートはありません。 + +各インテグレーションはさらに**言語クライアント**、**データインジェスチョン**、**データビジュアライゼーション**、**SQLクライアント**のカテゴリーに分類されています。 + +:::note +以下に示すClickHouseのインテグレーションリストを積極的にまとめていますが、これは完全なものではありません。ご自由に[貢献](https://github.com/ClickHouse/clickhouse-docs#contributing)し、関連するClickHouseインテグレーションをリストに追加してください。 +::: + +コアインテグレーション + +

+ +|名前|ロゴ|カテゴリー|説明|リソース| +|------|----|----------------|------------------|-------------| +|Amazon Kinesis||データインジェスチョン|Amazon Kinesisとのインテグレーション。|[ドキュメント](/docs/ja/integrations/clickpipes/kinesis/)| +|Amazon MSK||データインジェスチョン|Amazon Managed Streaming for Apache Kafka (MSK)とのインテグレーション。|[ドキュメント](/docs/ja/integrations/kafka/cloud/amazon-msk/)| +|Amazon S3||データインジェスチョン|ClickHouseの内蔵S3関数を使用して、S3データをインポート、エクスポート、トランスフォーム。|[ドキュメント](/docs/ja/integrations/data-ingestion/s3/index.md)| +|Amazon Glue|Amazon Glue logo|データインジェスチョン|ClickHouseにJDBCを介してクエリ。|[ドキュメント](/docs/ja/integrations/glue)| +|Apache Spark||データインジェスチョン|Spark ClickHouse Connectorは、Spark DataSource V2の上に構築された高性能コネクタです。|[GitHub](https://github.com/housepower/spark-clickhouse-connector),
[ドキュメント](/docs/ja/integrations/data-ingestion/apache-spark/index.md)| +|AutoMQ|AutoMQ logo|データインジェスチョン|S3とEBSに耐久性を分離するクラウドネイティブKafkaおよびRocketMQの代替。|[AutoMQ](https://www.automq.com/)| +|Cassandra|Cassandra logo|データインテグレーション|ClickHouseで[Cassandra](https://cassandra.apache.org/)をDictionaryソースとして使用可能。|[ドキュメント](/docs/ja/sql-reference/dictionaries/index.md#cassandra)| +|CHDB||SQLクライアント|組み込みのOLAP SQLエンジン。|[GitHub](https://github.com/chdb-io/chdb#/),
[ドキュメント](https://doc.chdb.io/)| +|ClickHouse Client||SQLクライアント|ClickHouseのネイティブコマンドラインクライアント。|[ドキュメント](/docs/ja/interfaces/cli.md)| +|DeltaLake|Delta Lake logo|データインテグレーション|Amazon S3にある既存の[Delta Lake](https://github.com/delta-io/delta)テーブルとの読み取り専用インテグレーションを提供。|[ドキュメント](/docs/ja/engines/table-engines/integrations/deltalake)| +|EmbeddedRocksDB||データインテグレーション|[rocksdb](http://rocksdb.org/)とClickHouseの統合を可能にします。|[ドキュメント](/docs/ja/engines/table-engines/integrations/embedded-rocksdb)| +|Fivetran||データインジェスチョン|[Fivetranデータムーブメントプラットフォーム](https://www.fivetran.com/)の[ClickHouse Cloud](https://clickhouse.com/cloud)宛先。|[ドキュメント](/docs/ja/integrations/data-ingestion/etl-tools/fivetran/index.md)| +|Google Cloud Storage||データインジェスチョン|ClickHouseの内蔵`S3`関数を使用してGCSデータをインポート、エクスポート、トランスフォーム。|[ドキュメント](/docs/ja/integrations/data-ingestion/s3/index.md)| +|Go||言語クライアント|Goクライアントは、低オーバーヘッドでパフォーマンスの高い接続を提供します。|[ドキュメント](/docs/ja/integrations/language-clients/go/index.md)| +|HDFS||データインテグレーション|[Apache Hadoop](https://en.wikipedia.org/wiki/Apache_Hadoop)エコシステムとの統合を提供し、[HDFS](https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html)でのデータ管理を可能にします。|[ドキュメント](/docs/ja/engines/table-engines/integrations/hdfs)| +|Hive||データインテグレーション|Hiveエンジンを使用してHDFS Hiveテーブルに対して`SELECT`クエリを実行可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/hive)| +|HouseWatch|HouseWatch logo|データ管理| ClickHouseクラスターを監視および管理するためのオープンソースツール。 |[GitHub](https://github.com/PostHog/HouseWatch)| +|Hudi|Apache Hudi logo|データインテグレーション|Amazon S3内の既存のApache [Hudi](https://hudi.apache.org/)テーブルとの読み取り専用インテグレーションを提供。|[ドキュメント](/docs/ja/engines/table-engines/integrations/hudi)| +|Iceberg|Apache Iceberg logo|データインテグレーション|Amazon S3内の既存のApache [Iceberg](https://iceberg.apache.org/)テーブルとの読み取り専用インテグレーションを提供。|[ドキュメント](/docs/ja/engines/table-engines/integrations/iceberg)| +|JDBC||データインテグレーション|[JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity)テーブルエンジンを介して外部データベースに接続可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/jdbc)| +|Java, JDBC||言語クライアント|JavaクライアントおよびJDBCドライバ。|[ドキュメント](/docs/ja/integrations/language-clients/java/index.md)| +|Kafka||データインジェスチョン|オープンソースの分散イベントストリーミングプラットフォームであるApache Kafkaとのインテグレーション。|[ドキュメント](/docs/ja/integrations/kafka)| +|Looker Studio||データビジュアライゼーション|Looker Studioは、データをインフォーマティブで見やすく、共有しやすく、完全にカスタマイズ可能なダッシュボードとレポートに変換する無料ツールです。|[ドキュメント](/docs/ja/integrations/lookerstudio)| +|Looker||データビジュアライゼーション|Lookerは、リアルタイムで洞察を探索し、共有するのを助ける企業向けプラットフォームです。|[ドキュメント](/docs/ja/integrations/looker)| +|Metabase|Metabase logo|データビジュアライゼーション|Metabaseは、データに関する質問をするための使いやすいオープンソースUIツールです。|[ドキュメント](/docs/ja/integrations/metabase)| +|MinIO|Metabase logo|データインジェスチョン|MinIOは、Amazon S3クラウドストレージサービスとAPI互換性を持つ高性能オブジェクトストレージです。|[ドキュメント](/docs/ja/integrations/minio)| +|MongoDB||データインテグレーション|MongoDBエンジンは、リモートMongoDBコレクションからデータを読み取る(`SELECT`クエリ)ための読み取り専用テーブルエンジンです。|[ドキュメント](/docs/ja/engines/table-engines/integrations/mongodb)| +|MySQL||データインテグレーション|MySQLエンジンは、リモートMySQLサーバーに格納されているデータに対して`SELECT`および`INSERT`クエリを実行することができます。|[ドキュメント](/docs/ja/engines/table-engines/integrations/mysql)| +|NATS||データインテグレーション|ClickHouseと[NATS](https://nats.io/)とのインテグレーションを可能にします。|[ドキュメント](/docs/ja/engines/table-engines/integrations/nats)| +|Node.JS||言語クライアント|ClickHouseに接続する公式JSクライアントです。|[ドキュメント](/docs/ja/integrations/language-clients/js.md)| +|ODBC|ODBC logo|データインテグレーション|[ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity)テーブルエンジンを介して外部データベースに接続可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/odbc)| +|PostgreSQL||データインジェスチョン|PostgreSQLデータベースからClickHouse CloudへのスナップショットおよびリアルタイムCDCデータレプリケーション。|[ドキュメント](/docs/ja/integrations/postgresql)| +|PowerBI|PowerBI logo|データビジュアライゼーション|Microsoft Power BIは、ビジネスインテリジェンスに焦点を当てたインタラクティブなデータビジュアライゼーションソフトウェア製品。|[ドキュメント](/docs/ja/integrations/powerbi)| +|Python||言語クライアント|PythonとClickHouseを接続するための一連のPythonパッケージ。|[ドキュメント](/docs/ja/integrations/language-clients/python/index.md)| +|QuickSight||データビジュアライゼーション|Amazon QuickSightは、ユニファイドビジネスインテリジェンス(BI)をハイパースケールで提供するデータ駆動型組織を支えます。|[ドキュメント](/docs/ja/integrations/quicksight)| +|RabbitMQ||データインテグレーション|ClickHouseが[RabbitMQ](https://www.rabbitmq.com/)に接続可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/rabbitmq)| +|Redis||データインテグレーション|ClickHouseが[Redis](https://redis.io/)をDictionaryソースとして使用可能。|[ドキュメント](/docs/ja/sql-reference/dictionaries/index.md#redis)| +|Rust|Rust logo|言語クライアント|ClickHouse用の型付きクライアント。|[ドキュメント](/docs/ja/integrations/language-clients/rust.md)| +|SQLite||データインテグレーション|SQLiteへのデータのインポートおよびエクスポートを可能にし、ClickHouseから直接SQLiteテーブルにクエリが可能。|[ドキュメント](/docs/ja/engines/table-engines/integrations/sqlite)| +|Superset||データビジュアライゼーション|Apache Supersetを使用して、ClickHouseデータを探索および視覚化します。|[ドキュメント](/docs/ja/integrations/data-visualization/superset-and-clickhouse.md)| +|Tableau Online|Tableau Online logo|データビジュアライゼーション|Tableau Onlineは、データの力を活用して、どこからでも迅速かつ自信を持って意思決定できるよう支援します。|[ドキュメント](/docs/ja/integrations/tableau-online)| +|dbt||データインジェスチョン|dbt(データビルドツール)を使用して、ClickHouse内でデータを選択ステートメントを記述するだけで変換します。dbtはELTのTを担当します。|[ドキュメント](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md)| + +
+
+ +パートナーインテグレーション + +
+ +|名前|ロゴ|カテゴリー|説明|リソース| +|------|----|----------------|------------------|-------------| +|Airbyte|Airbyte logo|データインジェスチョン|Airbyteを使用して、140以上のコネクターとELTデータパイプラインを作成し、ClickHouseにデータをロードおよび同期します。|[ドキュメント](/docs/ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md)| +|AccelData|AccelData Logo|データ管理|ADOCは、ユーザーが視覚化されたデータの信頼性と整合性を監視および保証し、リアルタイムのデータ処理と分析を促進します。|[ドキュメント](https://docs.acceldata.io/documentation/clickhouse) | +|Atlas|Atlas logo|スキーマ管理|ClickHouseのスキーマをコードとして管理します。|[ドキュメント](https://atlasgo.io/guides/clickhouse?utm_source=clickhouse&utm_term=docs)| +|Azure Event Hubs||データインジェスチョン|Apache Kafkaのネイティブプロトコルをサポートするデータストリーミングプラットフォーム。|[ウェブサイト](https://azure.microsoft.com/en-gb/products/event-hubs)| +|BlinkOps|BlinkOps Logo|セキュリティオートメーション|データとユーザー権限を管理する自動化を作成。|[ドキュメント](https://docs.blinkops.com/docs/integrations/clickhouse)| +|Bytewax||データインジェスチョン|Pythonストリームプロセッサをオープンソースとして提供し、データの変換とClickHouseへのインジェスチョンを可能にします。|[ドキュメント](https://bytewax.io/blog/building-a-click-house-sink-for-bytewax)| +|Calyptia (Fluent Bit)|Calyptia logo|データインジェスチョン|ログ、メトリクス、トレースの収集、処理、配信用のCNCF参加オープンソースプロジェクト。|[ブログ](https://clickhouse.com/blog/kubernetes-logs-to-clickhouse-fluent-bit)| +|CloudCanal||データインテグレーション|データ同期と移行ツール。|[ウェブサイト](https://www.cloudcanalx.com/us/)| +|CloudQuery||データインジェスチョン|オープンソースの高性能ELTフレームワーク。|[ドキュメント](https://www.cloudquery.io/docs/plugins/destinations/clickhouse/overview)| +|Confluent||データインジェスチョン|ConfluentプラットフォームでのApache Kafkaとのインテグレーション。|[ドキュメント](/docs/ja/integrations/kafka/cloud/confluent/custom-connector)| +|Cube.js||データビジュアライゼーション|Cubeはデータアプリ用のセマンティックレイヤーです。|[ウェブサイト](https://cube.dev/for/clickhouse-dashboard)| +|DBeaver||SQLクライアント|JDBCドライバを介してClickhouseに接続するマルチプラットフォームのデータベース管理ツール。|[ドキュメント](/docs/ja/integrations/sql-clients/dbeaver.md)| +|DataGrip||SQLクライアント|DataGripは、ClickHouse用の専用サポートを備えた強力なデータベースIDEです。|[ドキュメント](/docs/ja/integrations/sql-clients/datagrip.md)| +|Dataddo|Dataddo logo|データインテグレーション|データインテグレーションプラットフォーム|[ウェブサイト](https://www.dataddo.com/storage/clickhouse)| +|DbVisualizer|DbVisualizer logo|SQLクライアント|DbVisualizerは、ClickHouse向けの拡張サポートを提供するデータベースツールです。|[ドキュメント](/docs/ja/integrations/sql-clients/dbvisualizer.md)| +|Decodable|Decodable logo|データインジェスチョン|Apache Flink上の強力なストリームプロセッシング。|[ウェブサイト](https://www.decodable.co/connectors/clickhouse)| +|Deepnote||データビジュアライゼーション|Deepnoteは、チームでインサイトを発見し共有するために構築されたコラボレーティブなJupyter互換のデータノートブックです。|[ドキュメント](/docs/ja/integrations/data-visualization/deepnote.md)| +|DLT||データインテグレーション|データのロードを容易にするオープンソースのPythonライブラリ。|[ドキュメント](/docs/ja/integrations/dlt)| +|Draxlr||データビジュアライゼーション|Draxlrは、データのビジュアライゼーションと分析を提供するビジネスインテリジェンステゥールです。|[ドキュメント](/docs/ja/integrations/data-visualization/draxlr-and-clickhouse.md)| +|EMQX||データインジェスチョン|EMQXは、高性能のリアルタイムメッセージ処理エンジンを搭載し、大規模スケールでIoTデバイスのイベントストリーミングを実現するオープンソースMQTTブローカーです。|[ドキュメント](/docs/ja/integrations/emqx)| +|Explo|Explo logo|データビジュアライゼーション|Exploは、任意のプラットフォーム向けの顧客向け分析ツールです。|[ドキュメント](/docs/ja/integrations/explo)| +|Gigasheet|Gigasheet logo|データビジュアライゼーション|ビジネスユーザーが瞬時にClickHouseデータを分析および探索できるクラウドビッグデータ分析スプレッドシート。|[ウェブサイト](https://gigasheet.com/enterprise)| +|GlassFlow||データインジェスチョン|ClickHouse向けのPythonによるリアルタイムイベントストリーミングとデータ変換|[ドキュメント](https://docs.glassflow.dev/integrations/managed-connectors/sinks/clickhouse)| +|Goldsky||データインテグレーション|高性能Web3データインデクシング、サブグラフ、リアルタイムデータレプリケーションパイプライン。|[ドキュメント](https://docs.goldsky.com/introduction)| +|Grafana||データビジュアライゼーション|Grafanaを使用して、ダッシュボードを通じてデータを作成、探索、共有可能。|[ドキュメント](/docs/ja/integrations/data-visualization/grafana/index.md)| +|Great Expectations|Great Expectations logo|データ管理|オープンソースのデータ管理ツールで、有料のクラウドオファリングあり。|[ウェブサイト](https://greatexpectations.io/)| +|GrowthBook|GrowthBook logo|データビジュアライゼーション|データウェアハウスネイティブな実験プラットフォーム(機能フラグおよびA/Bテスト)。|[ドキュメント](https://docs.growthbook.io/warehouses/clickhouse)| +|HEX|HEX logo|データビジュアライゼーション|ノートブック、データアプリ、SQL、Python、コードなし、Rなどあらゆるものを備えたモダンで協力的なプラットフォーム。|[ドキュメント](https://learn.hex.tech/docs/connect-to-data/data-connections/overview)| +|Hashboard||データビジュアライゼーション|[Hashboard](https://hashboard.com)は、セルフサービスデータ探索とメトリクストラッキングを可能にするビジネスインテリジェンスプラットフォームです。|[ドキュメント](https://docs.hashboard.com/docs/database-connections/clickhouse)| +|HighTouch|HighTouch logo|データインテグレーション|データを直接ウェアハウスから140以上の宛先に同期|[ウェブサイト](https://hightouch.com/docs/sources/clickhouse)| +|Holistics|Holistics logo|データビジュアライゼーション|ClickHouseデータベース向けのビジネスインテリジェンス|[ウェブサイト](https://www.holistics.io/integrations/clickhouse/)| +|IBM Instana| |データ管理|InstanaはClickHouseサーバープロセスを自動検出して監視可能|[ドキュメント](https://www.ibm.com/docs/en/instana-observability/current?topic=technologies-monitoring-clickhouse)| +|Jitsu||データ分析|オープンソースのイベントコレクションプラットフォーム。|[ドキュメント](https://classic.jitsu.com/docs/destinations-configuration/clickhouse-destination)| +|LangChain|🦜️🔗|SDK|LangChainは言語モデルを利用したアプリケーション開発のためのフレームワーク|[ドキュメント](https://python.langchain.com/v0.2/docs/integrations/vectorstores/clickhouse/)| +|Mage|Metaplane logo|データインジェスチョン|データの変換と統合用オープンソースデータパイプラインツール|[ドキュメント](https://docs.mage.ai/integrations/databases/ClickHouse)| +|Metaplane|Metaplane logo|データ管理|すべてのデータチーム向けのデータ監視|[ウェブサイト](https://www.metaplane.dev/integrations)| +|MindsDB|MindsDB logo|AI/ML| 企業データからAIをカスタマイズするためのプラットフォーム |[ウェブサイト](https://mindsdb.com/clickhouse-machine-learning )| +|Mitzu|Mitzu logo|データビジュアライゼーション|Mitzuは、データをコピーせずにファネル、リテンション、ユーザーセグメンテーションの洞察を得るためのノーコードウェアハウスネイティブ製品分析アプリケーションです。|[ドキュメント](/docs/ja/integrations/mitzu)| +|Mode Analytics|Mode logo|データビジュアライゼーション|データチームを中心にしたビジネスインテリジェンス|[ウェブサイト](https://mode.com/)| +|Omni||データビジュアライゼーション|言語に対応したビジネスインテリジェンス。Omniと共にデータの探索、可視化、モデリングを自分の方法で行えます。スプレッドシートからSQLまで、一つのプラットフォームで。| [ウェブサイト](https://omni.co/)| +|Openblocks|Openblocks logo|SQLクライアント|OpenblocksはUIを構築するためのローコードプラットフォーム|[ドキュメント](https://docs.openblocks.dev/data-sources/connect-to-databases/clickhouse/)| +|OpsRamp (HP)| OpsRamp Logo|データ管理| ClickHouseに対する観測可能性メトリクスを提供|[ドキュメント](https://docs.opsramp.com/integrations/database-no-sql/automonitor-clickhouse-monitoring/)| +|Popsink||データインテグレーション|リアルタイムの変更データキャプチャ(CDC)パイプラインをClickHouseに構築。|[ドキュメント](https://docs.popsink.com/connectors/target/clickhouse/)| +|Prequel||データ共有|PrequelにClickHouseインスタンスを接続し、ユーザーやパートナーにデータを共有または同期。|[ドキュメント](https://docs.prequel.co/docs/sources-clickhouse-generic)| +|Quesma||データインテグレーション|KibanaおよびOpenSearch Dashboardsを使用してClickHouseのデータと組み合わせて使用。|[ウェブサイト](https://quesma.com/quesma-for-elk)| +|Redash|Redash logo|データビジュアライゼーション|データソースの接続とクエリの作成、ダッシュボードの作成、データの視覚化、および共有。|[ウェブサイト](https://redash.io/help/data-sources/querying/supported-data-sources)| +|Redpanda|Redpanda logo|データインジェスチョン|Redpandaは、開発者向けのストリーミングデータプラットフォームです。Apache KafkaにAPI互換であり、10倍速く、使いやすく、よりコスト効率的です。|[ブログ](https://redpanda.com/blog/real-time-olap-database-clickhouse-redpanda)| +|Restack Data Hub|Restack logo|データガバナンス|Restack Data Hubでより包括的なデータガバナンスおよび観測可能性フレームワークを実現可能。|[ドキュメント](https://www.restack.io/docs/datahub-knowledge-datahub-clickhouse-integration)| +|Restack OpenMetadata|Restack logo|データ品質|Restack OpenMetadataは、メタデータの抽出、クエリ使用状況の追跡、データプロファイリング、データ品質チェックをサポート。|[ドキュメント](https://www.restack.io/docs/openmetadata-knowledge-openmetadata-clickhouse-integration)| +|Retool||ノーコード|ドラッグアンドドロップインターフェースでアプリケーションを作成。|[ドキュメント](/docs/ja/integrations/retool)| +|Rill||データビジュアライゼーション|RillはOLAPエンジンと共にデータをスライス&ダイスするためのオペレーショナルBIツールです。|[ドキュメント](https://docs.rilldata.com/reference/olap-engines/clickhouse)| +|RisingWave||データインジェスチョン| ポストグレSQLのような体験のSQLストリーム処理。Apache Flinkより10倍速く、よりコスト効率的です。 |[ドキュメント](https://docs.risingwave.com/docs/current/sink-to-clickhouse/)| +|RudderStack||データインジェスチョン|RudderStackは、顧客データを簡単に収集し、必要とするツールとチームに送信します。|[ドキュメント](https://www.rudderstack.com/docs/destinations/warehouse-destinations/clickhouse/)| +|RunReveal|RunReveal logo|データインジェスチョン|あらゆるSaaSアプリケーションからの監査ログをClickHouseにインジェストおよび正規化。スケジュールされたクエリからアラートと検出を作成。|[ウェブサイト](https://runreveal.com)| +|Sematext|Sematext logo|データ管理|ClickHouseデータベースの観測可能性監視。|[ドキュメント](https://sematext.com/docs/integration/clickhouse/)| +|SiSense|SiSense logo|データビジュアライゼーション|あらゆるアプリケーションまたはワークフローに分析を埋め込み。|[ウェブサイト](https://www.sisense.com/data-connectors/)| +|SigNoz|SigNoz logo|データビジュアライゼーション|オープンソースの観測可能性プラットフォーム|[ドキュメント](https://www.signoz.io/docs/architecture/)| +|Snappy Flow|Snappy Flow logo|データ管理|プラグインを介してClickHouseデータベースのメトリクスを収集。|[ドキュメント](https://docs.snappyflow.io/docs/Integrations/clickhouse/instance)| +|Soda|Soda logo|データ品質|データがデータベースにロードされる前に品質を確認することにより、品質問題を検出、解決、防止できるSodaインテグレーション。|[ウェブサイト](https://www.soda.io/integrations/clickhouse)| +|StreamingFast|StreamingFast logo|データインジェスチョン| ブロックチェーンに依存しない、並列化された、ストリーミング優先のデータエンジン。|[ウェブサイト](https://www.streamingfast.io/)| +|Streamkap|Streamkap logo|データインジェスチョン|ClickHouseへのリアルタイムCDC(Change Data Capture)ストリーミングを数分で設定。|[ドキュメント](https://docs.streamkap.com/docs/clickhouse)| +|Supabase|Supabase logo|データインジェスチョン|オープンソースのFirebase代替|[GitHub](https://github.com/supabase/wrappers/tree/main/wrappers/src/fdw/clickhouse_fdw),[ブログ](https://clickhouse.com/blog/migrating-data-between-clickhouse-postgres)| +|Teleport|Teleport logo|セキュア接続|Teleport Database Serviceはx509証明書を用いてClickHouseに認証を行い、ClickHouseのHTTPとネイティブ(TCP)インターフェースで利用可能です。|[ドキュメント](https://goteleport.com/docs/database-access/enroll-self-hosted-databases/clickhouse-self-hosted/)| +|TABLUM.IO||SQLクライアント|様々なソースからデータをインジェストし、不整合を正規化・クレンジングし、SQLを通じてそれにアクセスできるようにします。|[ドキュメント](/docs/ja/integrations/sql-clients/tablum.md)| +|Tooljet|Tooljet logo|データビジュアライゼーション|ToolJetはカスタム内部ツールを作成してデプロイするためのオープンソースのローロードフレームワークです。|[ドキュメント](https://docs.tooljet.com/docs/1.x.x/data-sources/clickhouse/)| +|Upstash||データインジェスチョン|サーバーレスKafkaおよび他のソリューションを提供するデータプラットフォーム|[ウェブサイト](https://upstash.com/)| +|Vector|Vector logo|データインジェスチョン|ClickHouseとの組み込み互換性を備えた観測可能性パイプラインを構築するための軽量で超高速なツール。|[ドキュメント](/docs/ja/integrations/vector/)| +|WarpStream||データインジェスチョン|オブジェクトストレージ上に直接構築されたKafka互換のデータストリーミングプラットフォーム|[ウェブサイト](https://www.warpstream.com/)| +|YepCode||データインテグレーション|コードを書いて統合と自動化するためのツール。|[ドキュメント](https://yepcode.io/docs/integrations/clickhouse/)| +|Zing Data|Zing logo|データビジュアライゼーション|ClickHouse用のシンプルなソーシャルビジネスインテリジェンス。iOS、Android、ウェブ向けに設計されてます。|[ドキュメント](https://docs.getzingdata.com/docs/)| +
+ +
+ +コミュニティインテグレーション + +
+ +|名前|ロゴ|カテゴリー|説明|リソース| +|------|----|----------------|------------------|-------------| +|Apache Airflow|Airflow logo|データインジェスチョン|データエンジニアリングパイプラインのためのオープンソースワークフローマネジメントプラットフォーム|[Github](https://github.com/bryzgaloff/airflow-clickhouse-plugin)| +|Apache Beam|Beam logo|データインジェスチョン|データ処理ワークフローの定義と実行のためのオープンソースで統一化されたモデルと言語固有のSDKセット。Google Dataflowと互換性あり。|[ドキュメント](https://clickhouse.com/docs/ja/integrations/apache-beam),
[例](https://github.com/ClickHouse/clickhouse-beam-connector/)| +|Apache InLong|InLong logo|データインジェスチョン|大規模データのためのワンストップの統合フレームワーク|[ドキュメント](https://inlong.apache.org/docs/data_node/load_node/clickhouse)| +|Apache Nifi|Nifi logo|データインジェスチョン|ソフトウェアシステム間のデータフローを自動化|[ドキュメント](/docs/ja/integrations/nifi)| +|Apache SeaTunnel|SeaTunnel logo|データインジェスチョン|SeaTunnelは非常に使いやすい超高性能の分散データ統合プラットフォーム|[ウェブサイト](https://seatunnel.apache.org/docs/2.3.0/connector-v2/sink/Clickhouse)| +|Apache SkyWalking|SkyWalking logo|データ管理|クラウドネイティブアーキテクチャ内の分散システム向けの監視、トレース、診断機能を提供するオープンソースAPMシステム。|[ブログ](https://skywalking.apache.org/blog/2024-03-12-monitoring-clickhouse-through-skywalking/)| +|Apache StreamPark|SeaTunnel logo|データインジェスチョン|ストリーム処理アプリケーション開発フレームワークとストリーム処理オペレーションプラットフォーム。|[ウェブサイト](https://streampark.apache.org/docs/intro)| +|Bytebase|ByteBase logo|データ管理|オープンソースのデータベースDevOpsツール。アプリケーション開発ライフサイクル全体でデータベースを管理するGitLabです。|[ドキュメント](https://www.bytebase.com/docs/introduction/supported-databases)| +|C#||言語クライアント|ClickHouse.Clientは、ClickHouseのための機能豊富なADO.NETクライアント実装|[ドキュメント](https://github.com/DarkWanderer/ClickHouse.Client/wiki/Quick-start)| +|C++|Cpp logo|言語クライアント|ClickHouse用のC++クライアント|[GitHub](https://github.com/ClickHouse/clickhouse-cpp)| +|CHProxy| |データ管理|ChproxyはClickHouseデータベースのためのHTTPプロキシおよびロードバランサ|[GitHub](https://github.com/ContentSquare/chproxy)| +|Chat-DBT| |AIインテグレーション|Chat GPTを利用してClickHouseクエリを作成。|[GitHub](https://github.com/plmercereau/chat-dbt)| +|ClickHouse Monitoring Dashboard||ダッシュボード|ClickHouseのためのシンプルな監視ダッシュボード|[Github](https://github.com/duyet/clickhouse-monitoring)| +|Common Lisp|clickhouse-cl Logo|言語クライアント|Common Lisp ClickHouseクライアントライブラリ|[GitHub](https://github.com/juliojimenez/clickhouse-cl)| +|DBNet|Airflow logo|ソフトウェアIDE|Goをバックエンド、ブラウザをフロントエンドとするWebベースのSQL IDE。|[Github](https://github.com/dbnet-io/dbnet)| +|DataLens|Datalens logo|データビジュアライゼーション|オープンソースのデータ分析およびビジュアライゼーションツール。|[ウェブサイト](https://datalens.tech/),
[ドキュメント](https://datalens.tech/docs/en/)| +|Dataease|Dataease logo|データビジュアライゼーション|データを分析してビジネストレンドの洞察を得るためのオープンソースのデータビジュアライゼーション解析ツール。|[ウェブサイト](https://dataease.io/)| +|Datahub|Datahub logo|データ管理|データ発見、データ監視、フェデレーションガバナンスを可能にするオープンソースデータカタログ|[ドキュメント](https://datahubproject.io/docs/generated/ingestion/sources/clickhouse/)| +|Dbmate| |データ管理|データベーススキーマを複数の開発者やサーバー間で同期するためのデータベース移行ツール|[GitHub](https://github.com/amacneil/dbmate#clickhouse)| +|DeepFlow|Deepflow logo|データインジェスチョン|eBPFを利用したアプリケーション観測可能性|[ウェブサイト](https://deepflow.io)| +|Easypanel|Easypanel logo|デプロイメント方法|モダンなサーバーコントロールパネル。自身のサーバーにClickHouseをデプロイするために使用可能。|[ウェブサイト](https://easypanel.io),
[ドキュメント](docs/en/integrations/deployment/easypanel/index.md)| +|Explo||データビジュアライゼーション|Exploは、柔軟なコンポーネントを提供することで企業がリアルタイム分析ダッシュボードを構築するのを助けます。|[ウェブサイト](https://www.explo.co/integrations/clickhouse)| +|Flink|Flink logo|データインジェスチョン|Async Http Clientを活用したClickHouseデータベース用Flinkシンク|[GitHub](https://github.com/itinycheng/flink-connector-clickhouse)| +|Goose|Goose logo|データマイグレーション|SQLマイグレーションとGo関数をサポートするデータベースマイグレーションツール。|[GitHub](https://github.com/pressly/goose),
[ドキュメント](https://pressly.github.io/goose/)| +|Ibis|Ibis logo|言語クライアント|モダンなSQLのスケールとパフォーマンスを持つPython分析の柔軟性|[ウェブサイト](https://ibis-project.org/backends/ClickHouse/)| +|Jaeger|Jaeger logo|データインジェスチョン|ClickHouseにトレースを保存するためのJaeger gRPCストレージプラグイン実装|[GitHub](https://github.com/jaegertracing/jaeger-clickhouse)| +|JupySQL|JupySQL logo|SQLクライアント|Jupyterノートブック用のネイティブSQLクライアント。|[ドキュメント](/docs/ja/integrations/jupysql)| +|Kestra||データオーケストレーション|オープンソースのデータオーケストレーションおよびスケジューリングプラットフォーム|[ウェブサイト](https://kestra.io/plugins/plugin-jdbc-clickhouse/)| +|Logchain|Adaptive Logchain logo|セキュリティ|データセキュリティと特権アクセス管理|[ウェブサイト](https://github.com/adaptive-scale/logchain)| +|Meltano||データインジェスチョン|Meltanoはオープンソースのフルスタックデータ統合プラットフォーム|[ドキュメント](https://hub.meltano.com/extractors/tap-clickhouse) +|Mprove|mprove logo|データビジュアライゼーション|バージョン管理機能を有するセルフサービスビジネスインテリジェンス|[ウェブサイト](https://mprove.io/)| +|Netobserv||データ管理|OpenShiftおよびKubernetes用のネットワーク観測可能性オペレーター。|[ブログ](https://cloud.redhat.com/blog/deploying-network-observability-without-loki-an-example-with-clickhouse) +|Observable||データビジュアライゼーション|オンラインでデータの探索、分析、可視化、通信が協力的に行えるプラットフォーム。|[ウェブサイト](https://observablehq.com/@stas-sl/clickhouse-playground)| +|OpenTelemetry|Otel logo|データインジェスチョン|ClickHouseにログ、メトリクス、トレースのOpenTelemetryデータを送信するエクスポーター|[GitHub](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/clickhouseexporter)| +|PHP|PHP logo|言語クライアント|この拡張機能は、Yiiフレームワーク2.0用のClickHouse統合を提供します。|[GitHub](https://github.com/smi2/phpClickHouse)| +|Pgwarehouse||データインジェスチョン|Postgresテーブルを迅速にClickHouseにレプリケートするためのシンプルツール|[GitHub](https://github.com/scottpersinger/pgwarehouse)| +|Pinax|Pinax logo|ブロックチェーン分析|ブロックチェーン向けのインデックス、分析、検索ツール。|[ブログ](https://blog.pinax.network/substreams/simplify-real-time-blockchain-analytics-with-clickhouse/)| +|Pulse|PulseUI logo|データ管理|内部データUI用のデベロッパープラットフォーム。|[ウェブサイト](https://www.timestored.com/pulse/)| +|QStudio|QStudio logo|GUI|ClickHouseデータベースを操作するためのシンプルに使えるGUI。|[ウェブサイト](https://www.timestored.com/qstudio/database/clickhouse)| +|QStudio|qStudio logo|SQLクライアント|qStudioは、SQLスクリプトの実行と結果のチャート化が可能な無料のSQL GUIです。|[ドキュメント](https://www.timestored.com/qstudio/database/clickhouse)| +|Qryn|qryn logo|データインジェスチョン、管理、ビジュアライゼーション | qrynはClickHouseの上に構築された多言語対応の観測可能性スタックであり、Loki、Prometheus、Tempo、Opentelemetryなどの多くのフォーマットや標準APIと透過的に互換性があり、カスタムクライアント、コード、プラグインを必要としません。|[ドキュメント](https://qryn.dev), [Github](https://github.com/metrico), [ウェブサイト](https://qryn.cloud)| +|RSyslog|RSyslog logo|データインジェスチョン|ClickHouseへのロギングをネイティブにサポートするモジュール。|[ドキュメント](https://www.rsyslog.com/doc/master/configuration/modules/omclickhouse.html)| +|Rocket.BI||データビジュアライゼーション|RocketBIは、データを迅速に分析し、ドラッグ&ドロップでビジュアライゼーションを構築し、コラボレーションするのを助ける自己完結型のビジネスインテリジェンスプラットフォーム。|[GitHub](https://github.com/datainsider-co/rocket-bi),
[ドキュメント](/docs/ja/integrations/data-visualization/rocketbi-and-clickhouse.md)| + +|Ruby|Ruby logo|言語クライアント|ClickHouse用のモダンなRubyデータベースドライバ|[GitHub](https://github.com/shlima/click_house)| +|R|R logo|言語クライアント|RパッケージはClickHouseデータベース用のDBIインターフェースです|[GitHub](https://github.com/IMSMWU/RClickHouse)| +|SQLPad||SQLクライアント|SQLPadは、SQLクエリを書いて実行し、結果を視覚化するためのウェブアプリです|[Documentation](https://getsqlpad.com/en/connections/#clickhouse)| +|Scala|Scala logo|言語クライアント|Akka Httpを使用したClickHouseのScalaクライアント|[GitHub](https://github.com/crobox/clickhouse-scala-client)| +|SchemaSpy|SchemaSpy logo|データ可視化|SchemaSpyはClickHouseのスキーマ可視化をサポートします|[GitHub](https://github.com/schemaspy/schemaspy)| +|Tableau|Tableau logo|データ可視化|ビジネスインテリジェンスにフォーカスしたインタラクティブなデータ可視化ソフトウェア|[Documentation](/docs/ja/integrations/tableau)| +|TricksterCache||データ可視化| オープンソースのHTTPリバースプロキシキャッシュおよびタイムシリーズダッシュボードアクセラレーター |[Website](https://trickstercache.org/)| +|Visual Studio Client|VS logo|言語クライアント|Visual Studioの軽量クライアント|[Marketplace](https://marketplace.visualstudio.com/items?itemName=fanruten.clickhouse-light)| +|VulcanSQL|VulcanSQL logo|データAPIフレームワーク|データアプリケーション用のデータAPIフレームワークで、データ担当者がより速くデータAPIを作成し共有するのを支援します。SQLテンプレートをデータAPIに変換し、バックエンドスキルは不要です。|[Website](https://vulcansql.com/),
[Documentation](https://vulcansql.com/docs/connect/clickhouse)| +
diff --git a/docs/ja/integrations/language-clients/_category_.yml b/docs/ja/integrations/language-clients/_category_.yml new file mode 100644 index 00000000000..ced0e2470a4 --- /dev/null +++ b/docs/ja/integrations/language-clients/_category_.yml @@ -0,0 +1,8 @@ +position: 101 +label: 'Language clients' +collapsible: true +collapsed: true +link: + type: generated-index + title: Language clients + slug: /ja/integrations/language-clients diff --git a/docs/ja/integrations/language-clients/go/index.md b/docs/ja/integrations/language-clients/go/index.md new file mode 100644 index 00000000000..607e2ab4e85 --- /dev/null +++ b/docs/ja/integrations/language-clients/go/index.md @@ -0,0 +1,2619 @@ +--- +sidebar_label: Go +sidebar_position: 1 +keywords: [clickhouse, go, client, golang] +slug: /ja/integrations/go +description: ClickHouse用のGoクライアントにより、ユーザーはGo標準のdatabase/sqlインターフェースまたは最適化されたネイティブインターフェースを使用してClickHouseに接続することができます。 +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_native.md'; + +# ClickHouse Go + +## 簡単な例 +まずは簡単な例から始めましょう。これはClickHouseに接続し、システムデータベースからの選択を行います。始めるためには、接続情報が必要です。 + +### 接続情報 + + +### モジュールの初期化 + +```bash +mkdir clickhouse-golang-example +cd clickhouse-golang-example +go mod init clickhouse-golang-example +``` + +### サンプルコードをコピー + +このコードを`clickhouse-golang-example`ディレクトリに`main.go`としてコピーしてください。 + +```go title=main.go +package main + +import ( + "context" + "crypto/tls" + "fmt" + "log" + + "github.com/ClickHouse/clickhouse-go/v2" + "github.com/ClickHouse/clickhouse-go/v2/lib/driver" +) + +func main() { + conn, err := connect() + if err != nil { + panic((err)) + } + + ctx := context.Background() + rows, err := conn.Query(ctx, "SELECT name,toString(uuid) as uuid_str FROM system.tables LIMIT 5") + if err != nil { + log.Fatal(err) + } + + for rows.Next() { + var ( + name, uuid string + ) + if err := rows.Scan( + &name, + &uuid, + ); err != nil { + log.Fatal(err) + } + log.Printf("name: %s, uuid: %s", + name, uuid) + } + +} + +func connect() (driver.Conn, error) { + var ( + ctx = context.Background() + conn, err = clickhouse.Open(&clickhouse.Options{ + Addr: []string{":9440"}, + Auth: clickhouse.Auth{ + Database: "default", + Username: "default", + Password: "", + }, + ClientInfo: clickhouse.ClientInfo{ + Products: []struct { + Name string + Version string + }{ + {Name: "an-example-go-client", Version: "0.1"}, + }, + }, + + Debugf: func(format string, v ...interface{}) { + fmt.Printf(format, v) + }, + TLS: &tls.Config{ + InsecureSkipVerify: true, + }, + }) + ) + + if err != nil { + return nil, err + } + + if err := conn.Ping(ctx); err != nil { + if exception, ok := err.(*clickhouse.Exception); ok { + fmt.Printf("Exception [%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace) + } + return nil, err + } + return conn, nil +} +``` + +### go mod tidyを実行 + +```bash +go mod tidy +``` +### 接続情報を設定 +以前に調べた接続情報を`main.go`の`connect()`関数で設定します: + +```go +func connect() (driver.Conn, error) { + var ( + ctx = context.Background() + conn, err = clickhouse.Open(&clickhouse.Options{ + #highlight-next-line + Addr: []string{":9440"}, + Auth: clickhouse.Auth{ + #highlight-start + Database: "default", + Username: "default", + Password: "", + #highlight-end + }, +``` + +### 例を実行 +```bash +go run . +``` +```response +2023/03/06 14:18:33 name: COLUMNS, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: SCHEMATA, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: TABLES, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: VIEWS, uuid: 00000000-0000-0000-0000-000000000000 +2023/03/06 14:18:33 name: hourly_data, uuid: a4e36bd4-1e82-45b3-be77-74a0fe65c52b +``` + +### 詳細を学ぶ +このカテゴリーの残りのドキュメントでは、ClickHouse Goクライアントの詳細について説明します。 + +## ClickHouse Go クライアント + +ClickHouseは2つの公式Goクライアントをサポートしています。これらのクライアントは補完的であり、意図的に異なるユースケースをサポートしています。 + +* [clickhouse-go](https://github.com/ClickHouse/clickhouse-go) - 高レベルの言語クライアントで、Go標準のdatabase/sqlインターフェースまたはネイティブインターフェースのいずれかをサポートしています。 +* [ch-go](https://github.com/ClickHouse/ch-go) - 低レベルクライアント。ネイティブインターフェースのみ。 + +clickhouse-goは高レベルのインターフェースを提供し、行指向のセマンティクスを使用してデータのクエリと挿入を可能にし、データ型に対して寛容なバッチ処理を行います。ch-goは最適化された列指向のインターフェースを提供し、タイプの厳密さと複雑な使用を犠牲にして低CPUとメモリオーバーヘッドで高速なデータブロックのストリーミングを行います。 + +version 2.3から、clickhouse-goは低レベル関数(エンコーディング、デコーディング、圧縮など)にch-goを利用しています。clickhouse-goはまた、Goの`database/sql`インターフェース規格をサポートしています。どちらのクライアントもエンコードのためにネイティブフォーマットを使用して、最適なパフォーマンスを提供し、ネイティブClickHouseプロトコルを介して通信できます。clickhouse-goは、ユーザーがプロキシまたは負荷分散の要件を持っている場合にはHTTPを輸送機構としてもサポートしています。 + +クライアントライブラリを選択する際には、各クライアントの利点と欠点を認識しておく必要があります。詳細はChoosing a Client Libraryを参照してください。 + +| | ネイティブフォーマット | ネイティブプロトコル | HTTPプロトコル | 行指向API | 列指向API | タイプの柔軟性 | 圧縮 | クエリプレースホルダ | +|:-------------:|:------------------:|:------------------:|:--------------:|:--------------:|:-------------:|:------------------:|:-------------------:|:------------------:| +| clickhouse-go | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | +| ch-go | ✅ | ✅ | | | ✅ | | ✅ | | + +## クライアントの選択 + +クライアントライブラリの選択は、使用パターンと最適なパフォーマンスの要求に依存します。毎秒数百万件の挿入が必要な挿入中心のユースケースでは、低レベルクライアント[ch-go](https://github.com/ClickHouse/ch-go)の使用をお勧めします。このクライアントは、ClickHouseネイティブフォーマットが要求する行指向フォーマットから列へのデータ変換の関連オーバーヘッドを回避し、簡易化のために`interface{}`(`any`)タイプのリフレクションと使用を回避します。 + +集計を中心としたクエリワークロードまたはスループットが低い挿入ワークロードに関しては、[clickhouse-go](https://github.com/ClickHouse/clickhouse-go)が使い慣れた`database/sql`インターフェースとよりシンプルな行セマンティクスを提供します。ユーザーはオプションでHTTPを輸送プロトコルとして使用し、構造体との間で行をマーシャリングするためのヘルパー関数を利用することができます。 + +## clickhouse-go クライアント + +clickhouse-goクライアントは、ClickHouseと通信するための2つのAPIインターフェースを提供します: + +* ClickHouseクライアント専用API +* `database/sql`標準 - Golangが提供するSQLデータベース周りのジェネリックインターフェース。 + +`database/sql`は、データベースに依存しないインターフェースを提供し、開発者がデータストアを抽象化することを可能にしますが、パフォーマンスに影響を与えるいくつかのタイプとクエリセマンティクスを強制します。このため、パフォーマンスが重要な場合(https://github.com/clickHouse/clickHouse-go#benchmark)、クライアント専用APIの使用が推奨されます。ただし、複数データベースをサポートするツールにClickHouseを統合したいユーザーは標準インターフェースの使用を好むかもしれません。 + +いずれのインターフェースもデータをエンコードする際に[native format](/docs/ja/native-protocol/basics.md)とネイティブプロトコルを使用します。加えて、標準インターフェースはHTTPを介した通信もサポートしています。 + +| | ネイティブフォーマット | ネイティブプロトコル | HTTPプロトコル | バルク書き込みサポート | 構造体マーシャリング | 圧縮 | クエリプレースホルダ | +|:------------------:|:------------------:|:------------------:|:--------------:|:------------------:|:-----------------:|:-----------:|:------------------:| +| ClickHouse API | ✅ | ✅ | | ✅ | ✅ | ✅ | ✅ | +| `database/sql` API | ✅ | ✅ | ✅ | ✅ | | ✅ | ✅ | + +## インストール + +ドライバのv1は非推奨となっており、機能更新や新しいClickHouseタイプのサポートは行われません。ユーザーは、パフォーマンスが優れているv2への移行を推奨します。 + +2.xバージョンのクライアントをインストールするには、パッケージをgo.modファイルに追加してください: + +`require github.com/ClickHouse/clickhouse-go/v2 main` + +または、リポジトリをクローンしてください: + +```bash +git clone --branch v2 https://github.com/clickhouse/clickhouse-go.git $GOPATH/src/github +``` + +他のバージョンをインストールするには、パスまたはブランチ名を必要に応じて修正してください。 + +```bash +mkdir my-clickhouse-app && cd my-clickhouse-app + +cat > go.mod <<-END + module my-clickhouse-app + + go 1.18 + + require github.com/ClickHouse/clickhouse-go/v2 main +END + +cat > main.go <<-END + package main + + import ( + "fmt" + "github.com/ClickHouse/clickhouse-go/v2" + ) + + func main() { + conn, _ := clickhouse.Open(&clickhouse.Options{Addr: []string{"127.0.0.1:9000"}}) + v, _ := conn.ServerVersion() + fmt.Println(v.String()) + } +END + +go mod tidy +go run main.go + +``` + +### バージョニングと互換性 + +クライアントはClickHouseとは独立してリリースされます。2.xは現在の主な開発対象です。2.xの全バージョンは互いに互換性があるべきです。 + +#### ClickHouse互換性 + +クライアントは以下をサポートしています: + +- ここに記録されているClickHouseの全てのサポートされるバージョン。[ここ](https://github.com/ClickHouse/ClickHouse/blob/master/SECURITY.md)に記載されている通りです。ClickHouseのバージョンがもはやサポートされていない場合、それに対してクライアントリリースもアクティブにはテストされなくなります。 +- クライアントのリリース日から2年以内の全てのClickHouseバージョン。注意:LTSバージョンのみがアクティブにテストされます。 + +#### Golang互換性 + +| クライアントバージョン | Golangバージョン | +|:--------------:|:---------------:| +| => 2.0 <= 2.2 | 1.17, 1.18 | +| >= 2.3 | 1.18 | + + +## ClickHouse クライアント API + +ClickHouseクライアントAPI用の全てのコード例は[こちら](https://github.com/ClickHouse/clickhouse-go/tree/main/examples)にあります。 + +### 接続 + +以下の例はClickHouseに接続し、サーバーバージョンを返す例を示しています。ClickHouseがセキュリティ保護されておらず、デフォルトのユーザーでアクセス可能な場合を想定しています。 + +注意:デフォルトのネイティブポートを使用して接続しています。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +fmt.Println(v) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/connect.go) + +**後続の例では、明示的に示されていない限り、ClickHouseの`conn`変数が作成され、利用可能であると仮定します。** + +#### 接続設定 + +接続を開く際に、Options構造体を使用してクライアントの動作を制御できます。利用可能な設定は以下の通りです: + +* `Protocol` - ネイティブまたはHTTP。現在、HTTPは[database/sql API](#databasesql-api)のみサポートされています。 +* `TLS` - TLSオプション。非nilの値がTLSを有効にします。[Using TLS](#using-tls)を参照。 +* `Addr` - アドレス(ポート込み)のスライス。 +* `Auth` - 認証詳細。[Authentication](#authentication)を参照。 +* `DialContext` - 接続の確立方法を決定するカスタムダイヤル関数。 +* `Debug` - デバッグを有効にするためのtrue/false。 +* `Debugf` - デバッグ出力を消費する関数を提供します。`debug`がtrueに設定されている必要があります。 +* `Settings` - ClickHouseの設定のマップ。これらは全てのClickHouseクエリに適用されます。[Using Context](#using-context)を使用して、クエリごとに設定を設定できます。 +* `Compression` - ブロックの圧縮を有効にします。[Compression](#compression)を参照。 +* `DialTimeout` - 接続の確立にかかる最大時間。デフォルトは`1秒`。 +* `MaxOpenConns` - 任意の時点で使用できる最大接続数です。アイドルプールにある接続は増減する可能性がありますが、任意の時点で使用できる接続はこの数に限定されます。デフォルトはMaxIdleConns+5です。 +* `MaxIdleConns` - プールに保持する接続数。可能な場合、接続は再利用されます。デフォルトは`5`。 +* `ConnMaxLifetime` - 接続を利用可能な状態で保持する最長寿命。デフォルトは1時間です。この時間の後、接続は破棄され、必要に応じて新しい接続がプールに追加されます。 +* `ConnOpenStrategy` - ノードアドレスリストをどのように消費し、接続を確立するかを決定します。[Connecting to Multiple Nodes](#connecting-to-multiple-nodes)を参照。 +* `BlockBufferSize` - 一度にバッファにデコードするブロックの最大数。大きな値は並列化を増やしますが、メモリを犠牲にする可能性があります。ブロックサイズはクエリに依存するため、接続時にこれを設定できますが、返すデータに基づいてクエリごとにオーバーライドすることをお勧めします。デフォルトは`2`です。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + DialContext: func(ctx context.Context, addr string) (net.Conn, error) { + dialCount++ + var d net.Dialer + return d.DialContext(ctx, "tcp", addr) + }, + Debug: true, + Debugf: func(format string, v ...interface{}) { + fmt.Printf(format, v) + }, + Settings: clickhouse.Settings{ + "max_execution_time": 60, + }, + Compression: &clickhouse.Compression{ + Method: clickhouse.CompressionLZ4, + }, + DialTimeout: time.Duration(10) * time.Second, + MaxOpenConns: 5, + MaxIdleConns: 5, + ConnMaxLifetime: time.Duration(10) * time.Minute, + ConnOpenStrategy: clickhouse.ConnOpenInOrder, + BlockBufferSize: 10, +}) +if err != nil { + return err +} +``` +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/connect_settings.go) + +#### 接続プール + +クライアントは接続プールを維持し、必要に応じてクエリ間でこれらを再利用します。任意の時点で使用される接続は`MaxOpenConns`で制御され、プールの最大サイズは`MaxIdleConns`で制御されます。クライアントはクエリの実行ごとにプールから接続を取得し、それを再利用のためにプールに返却します。接続はバッチの期間中使用され、`Send()`で解放されます。 + +プール内の同じ接続が後続のクエリに使用される保証はありませんが、ユーザーが`MaxOpenConns=1`を設定した場合は例外です。これはめったに必要ありませんが、一時テーブルを使用している場合には必要になる場合があります。 + +また`ConnMaxLifetime`はデフォルトで1時間であることに注意してください。このことが原因で、ノードがクラスターを離れる際にClickHouseへの負荷が不均衡になることがあります。これは、ノードが利用不能になると、他のノードに接続がバランスされるためです。これらの接続は持続し、問題のあるノードがクラスターに戻ってもデフォルトで1時間更新されません。負荷の高いワークロードの場合にはこの値を下げることを検討してください。 + +### TLSを使用する + +低レベルでは、全てのクライアント接続メソッド(DSN/OpenDB/Open)は安全な接続を確立するために[Go tls パッケージ](https://pkg.go.dev/crypto/tls)を使用します。Options構造体に非nilの`tls.Config`ポインターが含まれている場合、クライアントはTLSを使用します。 + +```go +env, err := GetNativeTestEnvironment() +if err != nil { + return err +} +cwd, err := os.Getwd() +if err != nil { + return err +} +t := &tls.Config{} +caCert, err := ioutil.ReadFile(path.Join(cwd, "../../tests/resources/CAroot.crt")) +if err != nil { + return err +} +caCertPool := x509.NewCertPool() +successful := caCertPool.AppendCertsFromPEM(caCert) +if !successful { + return err +} +t.RootCAs = caCertPool +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.SslPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + TLS: t, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +if err != nil { + return err +} +fmt.Println(v.String()) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/ssl.go) + +この最小限の`TLS.Config`は通常、ClickHouseサーバーの安全なネイティブポート(通常は9440)に接続するのに十分です。ClickHouseサーバーに有効な証明書がない(期限切れ、ホスト名が間違っている、公開的に認識されるルート認証局によって署名されていない)場合は、InsecureSkipVerifyをtrueにすることもできますが、これは強く推奨されません。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.SslPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + TLS: &tls.Config{ + InsecureSkipVerify: true, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +``` +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/ssl_no_verify.go) + +追加のTLSパラメータが必要な場合は、アプリケーションコードで`tls.Config`構造体の必要なフィールドを設定する必要があります。これには、特定の暗号スイートの指定、特定のTLSバージョン(たとえば1.2または1.3)の強制、内部CA証明書チェーンの追加、ClickHouseサーバーによって要求された場合のクライアント証明書(および秘密鍵)の追加、そしてより専門的なセキュリティ設定の他のオプションが含まれます。 + +### 認証 + +接続情報でAuth構造体を指定して、ユーザー名とパスワードを指定します。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +if err != nil { + return err +} +v, err := conn.ServerVersion() +``` +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/auth.go) + +### 複数のノードへの接続 + +`Addr`構造体を介して複数のアドレスを指定できます。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{"127.0.0.1:9001", "127.0.0.1:9002", fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +if err != nil { + return err +} +fmt.Println(v.String()) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/1c0d81d0b1388dbb9e09209e535667df212f4ae4/examples/clickhouse_api/multi_host.go#L26-L45) + +2つの接続戦略が利用可能です: + +* `ConnOpenInOrder`(デフォルト) - アドレスは順番に消費されます。後のアドレスは、リスト内のより早いアドレスを使用して接続できない場合にのみ利用されます。これは事実上のフェイルオーバー戦略です。 +* `ConnOpenRoundRobin` - ラウンドロビン戦略を使用してアドレス間の負荷をバランスします。 + +これはオプション`ConnOpenStrategy`を介して制御できます。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{"127.0.0.1:9001", "127.0.0.1:9002", fmt.Sprintf("%s:%d", env.Host, env.Port)}, + ConnOpenStrategy: clickhouse.ConnOpenRoundRobin, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, +}) +if err != nil { + return err +} +v, err := conn.ServerVersion() +if err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/1c0d81d0b1388dbb9e09209e535667df212f4ae4/examples/clickhouse_api/multi_host.go#L50-L67) + +### 実行 + +任意のステートメントを`Exec`メソッドを介して実行できます。これはDDLや単純なステートメントに便利です。大きな挿入やクエリの繰り返しには使用しないでください。 + +```go +conn.Exec(context.Background(), `DROP TABLE IF EXISTS example`) +err = conn.Exec(context.Background(), ` + CREATE TABLE IF NOT EXISTS example ( + Col1 UInt8, + Col2 String + ) engine=Memory +`) +if err != nil { + return err +} +conn.Exec(context.Background(), "INSERT INTO example VALUES (1, 'test-1')") +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/exec.go) + +クエリに特定の設定を渡すためにContextをクエリに渡す機能に注意してください。詳細は[Using Context](#using-context)でご覧ください。 + +### バッチ挿入 + +大量の行を挿入するために、クライアントはバッチセマンティクスを提供します。これには、バッチの準備と、それへの行の追加が必要です。送信は最終的に`Send()`メソッドを介して行われます。バッチはSendが実行されるまでメモリ内に保持されます。 + +```go +conn, err := GetNativeConnection(nil, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(context.Background(), "DROP TABLE IF EXISTS example") +err = conn.Exec(ctx, ` + CREATE TABLE IF NOT EXISTS example ( + Col1 UInt8 + , Col2 String + , Col3 FixedString(3) + , Col4 UUID + , Col5 Map(String, UInt8) + , Col6 Array(String) + , Col7 Tuple(String, UInt8, Array(Map(String, String))) + , Col8 DateTime + ) Engine = Memory +`) +if err != nil { + return err +} + + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + err := batch.Append( + uint8(42), + "ClickHouse", + "Inc", + uuid.New(), + map[string]uint8{"key": 1}, // Map(String, UInt8) + []string{"Q", "W", "E", "R", "T", "Y"}, // Array(String) + []interface{}{ // Tuple(String, UInt8, Array(Map(String, String))) + "String Value", uint8(5), []map[string]string{ + {"key": "value"}, + {"key": "value"}, + {"key": "value"}, + }, + }, + time.Now(), + ) + if err != nil { + return err + } +} +return batch.Send() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/batch.go) + +ClickHouseの推奨事項は[こちら](https://clickhouse.com/docs/ja/about-us/performance/#performance-when-inserting-data)を参照してください。バッチはgoルーチン間で共有しないでください - ルーチンごとに別々のバッチを構築してください。 + +上記の例から、行を追加する際には変数タイプがカラムタイプと一致する必要があることに注意してください。マッピングは通常明らかですが、このインターフェースは柔軟であるように努めており、精度の損失がない限り型が変換されます。たとえば、次の例では、datetime64に文字列を挿入することを示しています。 + +```go +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + err := batch.Append( + "2006-01-02 15:04:05.999", + ) + if err != nil { + return err + } +} +return batch.Send() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/type_convert.go) + +各カラムタイプに対する対応するgoタイプの全体的な要約については、 [Type Conversions](#type-conversions)をご参照ください。 + +特定の変換のサポートが必要な場合は、問題を報告していただければと思います。 + +### クエリの実行 + +ユーザーは`QueryRow`メソッドを使用して単一の行をクエリするか、`Query`を介して結果セットを繰り返し処理するカーソルを取得することができます。前者はデータをシリアライズするための宛先を受け取るのに対し、後者は各行に対して`Scan`を呼び出す必要があります。 + +```go +row := conn.QueryRow(context.Background(), "SELECT * FROM example") +var ( + col1 uint8 + col2, col3, col4 string + col5 map[string]uint8 + col6 []string + col7 []interface{} + col8 time.Time +) +if err := row.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil { + return err +} +fmt.Printf("row: col1=%d, col2=%s, col3=%s, col4=%s, col5=%v, col6=%v, col7=%v, col8=%v\n", col1, col2, col3, col4, col5, col6, col7, col8) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/query_row.go) + +```go +rows, err := conn.Query(ctx, "SELECT Col1, Col2, Col3 FROM example WHERE Col1 >= 2") +if err != nil { + return err +} +for rows.Next() { + var ( + col1 uint8 + col2 string + col3 time.Time + ) + if err := rows.Scan(&col1, &col2, &col3); err != nil { + return err + } + fmt.Printf("row: col1=%d, col2=%s, col3=%s\n", col1, col2, col3) +} +rows.Close() +return rows.Err() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/query_rows.go) + +いずれの場合も、対応するカラム値をシリアライズするためにポインタを変数に渡す必要があることに注意してください。これらは`SELECT`ステートメントで指定された順序で渡す必要があります - デフォルトでは、上記のように`SELECT *`がある場合、カラムの宣言順序が使用されます。 + +挿入と同様に、`Scan`メソッドはターゲット変数が適切なタイプである必要があります。これも柔軟であるよう努めていますが、UUIDカラムを文字列変数に読み込むことなど、型が可能な限り変換されるようサポートしています。さまざまなカラムタイプに対するgolangタイプの一覧については、[Type Conversions](#type-conversions)をご参照ください。 + +最後に、`Query`と`QueryRow`メソッドにContextを渡す能力に注意してください。これは、クエリレベルの設定に使用できます。詳細は[Using Context](#using-context)で参照してください。 + +### 非同期挿入 + +非同期挿入はAsyncメソッドを介してサポートされています。これは、クライアントがデータを受信した後に応答するか、サーバーの挿入が完了するまで待機するかを指定することができます。これにより[wait_for_async_insert](https://clickhouse.com/docs/ja/operations/settings/settings/#wait-for-async-insert)を制御します。 + +```go +conn, err := GetNativeConnection(nil, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +if err := clickhouse_tests.CheckMinServerServerVersion(conn, 21, 12, 0); err != nil { + return nil +} +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(ctx, `DROP TABLE IF EXISTS example`) +const ddl = ` + CREATE TABLE example ( + Col1 UInt64 + , Col2 String + , Col3 Array(UInt8) + , Col4 DateTime + ) ENGINE = Memory +` +if err := conn.Exec(ctx, ddl); err != nil { + return err +} +for i := 0; i < 100; i++ { + if err := conn.AsyncInsert(ctx, fmt.Sprintf(`INSERT INTO example VALUES ( + %d, '%s', [1, 2, 3, 4, 5, 6, 7, 8, 9], now() + )`, i, "Golang SQL database driver"), false); err != nil { + return err + } +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/async.go) + +### 列指向の挿入 + +カラム形式で挿入することができます。データが既にこの構造に整理されている場合において、パフォーマンスの改善が予想されます。 + +```go +batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example") +if err != nil { + return err +} +var ( + col1 []uint64 + col2 []string + col3 [][]uint8 + col4 []time.Time +) +for i := 0; i < 1_000; i++ { + col1 = append(col1, uint64(i)) + col2 = append(col2, "Golang SQL database driver") + col3 = append(col3, []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9}) + col4 = append(col4, time.Now()) +} +if err := batch.Column(0).Append(col1); err != nil { + return err +} +if err := batch.Column(1).Append(col2); err != nil { + return err +} +if err := batch.Column(2).Append(col3); err != nil { + return err +} +if err := batch.Column(3).Append(col4); err != nil { + return err +} +return batch.Send() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/columnar_insert.go) + +### 構造体の使用 + +ユーザーにとって、Golangの構造体はClickHouseのデータの行を論理的に表現するものです。ネイティブインターフェースは、これを支援するための便利な関数を提供しています。 + +#### シリアライズ付き選択 + +Selectメソッドを使用すると、応答行を単一の呼び出しで構造体のスライスにマーシャルできます。 + +```go +var result []struct { + Col1 uint8 + Col2 string + ColumnWithName time.Time `ch:"Col3"` +} + +if err = conn.Select(ctx, &result, "SELECT Col1, Col2, Col3 FROM example"); err != nil { + return err +} + +for _, v := range result { + fmt.Printf("row: col1=%d, col2=%s, col3=%s\n", v.Col1, v.Col2, v.ColumnWithName) +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/select_struct.go) + +#### Scan 構造体 + +ScanStructは、クエリから単一の行を構造体にマーシャルすることを可能にします。 + +```go +var result struct { + Col1 int64 + Count uint64 `ch:"count"` +} +if err := conn.QueryRow(context.Background(), "SELECT Col1, COUNT() AS count FROM example WHERE Col1 = 5 GROUP BY Col1").ScanStruct(&result); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/scan_struct.go) + +#### 構造体の追加 + +AppendStructは[batch](#batch-insert)に構造体を追加して解釈できます。これは、構造体のカラムが名前と型の両方でテーブルと一致する必要があります。全てのカラムが同等の構造体フィールドを持つ必要がありますが、一部の構造体フィールドは同等のカラム表現を持っていない場合もあります。これらは単に無視されます。 + +```go +batch, err := conn.PrepareBatch(context.Background(), "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1_000; i++ { + err := batch.AppendStruct(&row{ + Col1: uint64(i), + Col2: "Golang SQL database driver", + Col3: []uint8{1, 2, 3, 4, 5, 6, 7, 8, 9}, + Col4: time.Now(), + ColIgnored: "this will be ignored", + }) + if err != nil { + return err + } +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/append_struct.go) + +### タイプ変換 + +クライアントは挿入とレスポンスのマーシャリングに関して可能な限り柔軟に対応することを目指しています。多くの場合、ClickHouseのカラムタイプに相当するGolangタイプが存在します。例:[UInt64](https://clickhouse.com/docs/ja/sql-reference/data-types/int-uint/) to [uint64](https://pkg.go.dev/builtin#uint64)。これらの論理的なマッピングは常にサポートされるべきです。ユーザーは、変数をカラムに挿入するか、受信データをまず変換することによって、その変換を行える場合において変数タイプを利用することを希望するかもしれません。この透明な変換は、精度の損失が許されない場合にのみ実行されます。例えば、uint32はUInt64カラムから受信データを得るために使用することはできません。逆に、指定フォーマット要件を満たせば、datetime64フィールドに文字列を挿入することもできます。 + +現在サポートされているプリミティブタイプの変換については[こちら](https://github.com/ClickHouse/clickhouse-go/blob/main/TYPES.md)を参照してください。 + +この作業は進行中であり、挿入タイミング(`Append`/`AppendRow`)と読み取り時(`Scan`でご利用いただけます)に分けられます。特定の変換のサポートが必要な場合は、問題を報告してください。 + +### 複雑なタイプ + +#### 日付/日時タイプ + +ClickHouse goクライアントは`Date`、`Date32`、`DateTime`、および`DateTime64`の日付/日時タイプをサポートしています。日付は`2006-01-02`の形式の文字列か、ネイティブGoの`time.Time{}`または`sql.NullTime`を使って挿入できます。日時も同様ですが、`2006-01-02 15:04:05`のフォーマットの文字列としてする必要があります。timezoneオフセットがある場合は、`2006-01-02 15:04:05 +08:00`のようにしてください。`time.Time{}`と`sql.NullTime`は読み取り時にもサポートされており、`sql.Scanner`インターフェースの任意の実装もサポートしています。 + +Timezone情報の扱いは、ClickHouseのタイプと値が挿入/読み取りされているかに依存します: + +* **DateTime/DateTime64** + * **挿入**時には、値はUNIXタイムスタンプ形式でClickHouseに送信されます。タイムゾーンが提供されない場合、クライアントのローカルタイムゾーンが仮定されます。`time.Time{}`や`sql.NullTime`は、対応する論理に変換されます。 + * **選択**時には、カラムのtimezoneが設定されている場合、そのtimezoneが`time.Time`値を返す際に使われます。されていない場合は、サーバーのtimezoneが使われます。 +* **Date/Date32** + * **挿入**時には、日付はUNIXタイムスタンプへの変換時にタイムゾーンを考慮されます、すなわち、タイムゾーンでオフセットされた上で日付として保存されます。日付はClickHouseにロケールがありません。これは、文字列内に指定されていない場合、ローカルタイムゾーンが使われます。 + * **選択**時には、日時が`time.Time{}`または`sql.NullTime{}`インスタンスに読み込まれるときにtimezone情報がありません。 + +#### 配列 + +配列はスライスとして挿入されるべきです。要素の型ルールは[プリミティブタイプ](#type-conversions)に対するものと一致し、可能な場合は要素が変換されます。 + +Scan時には、スライスへのポインタを指定する必要があります。 + +```go +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i int64 +for i = 0; i < 10; i++ { + err := batch.Append( + []string{strconv.Itoa(int(i)), strconv.Itoa(int(i + 1)), strconv.Itoa(int(i + 2)), strconv.Itoa(int(i + 3))}, + [][]int64{{i, i + 1}, {i + 2, i + 3}, {i + 4, i + 5}}, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +var ( + col1 []string + col2 [][]int64 +) +rows, err := conn.Query(ctx, "SELECT * FROM example") +if err != nil { + return err +} +for rows.Next() { + if err := rows.Scan(&col1, &col2); err != nil { + return err + } + fmt.Printf("row: col1=%v, col2=%v\n", col1, col2) +} +rows.Close() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/array.go) + +#### マップ + +マップは、前述の[タイプ変換](#type-conversions)で定義された型ルールに準拠したGolangマップとして挿入されるべきです。 + +```go +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i int64 +for i = 0; i < 10; i++ { + err := batch.Append( + map[string]uint64{strconv.Itoa(int(i)): uint64(i)}, + map[string][]string{strconv.Itoa(int(i)): {strconv.Itoa(int(i)), strconv.Itoa(int(i + 1)), strconv.Itoa(int(i + 2)), strconv.Itoa(int(i + 3))}}, + map[string]map[string]uint64{strconv.Itoa(int(i)): {strconv.Itoa(int(i)): uint64(i)}}, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +var ( + col1 map[string]uint64 + col2 map[string][]string + col3 map[string]map[string]uint64 +) +rows, err := conn.Query(ctx, "SELECT * FROM example") +if err != nil { + return err +} +for rows.Next() { + if err := rows.Scan(&col1, &col2, &col3); err != nil { + return err + } + fmt.Printf("row: col1=%v, col2=%v, col3=%v\n", col1, col2, col3) +} +rows.Close() +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/map.go) + +#### タプル + +タプルは任意の長さのカラムのグループを表します。カラムは明示的に名前を付けるか、型だけを指定することができます。例: + +```sql +// 非名 +Col1 Tuple(String, Int64) + +// 名 +Col2 Tuple(name String, id Int64, age uint8) +``` + +これらのアプローチの中で、名のタプルはより柔軟性があります。非名のタプルはスライスを使用して挿入および読み取りする必要がありますが、名のタプルはマップにも互換性があります。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Tuple(name String, age UInt8), + Col2 Tuple(String, UInt8), + Col3 Tuple(name String, id String) + ) + Engine Memory + `); err != nil { + return err +} + +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +// 名と非名のどちらもスライスで追加できる +if err = batch.Append([]interface{}{"Clicky McClickHouse", uint8(42)}, []interface{}{"Clicky McClickHouse Snr", uint8(78)}, []string{"Dale", "521211"}); err != nil { + return err +} +if err = batch.Append(map[string]interface{}{"name": "Clicky McClickHouse Jnr", "age": uint8(20)}, []interface{}{"Baby Clicky McClickHouse", uint8(1)}, map[string]string{"name": "Geoff", "id": "12123"}); err != nil { + return err +} +if err = batch.Send(); err != nil { + return err +} +var ( + col1 map[string]interface{} + col2 []interface{} + col3 map[string]string +) +// 名前付きのタプルはマップまたはスライスに取得可能、未命名はスライスのみ +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3); err != nil { + return err +} +fmt.Printf("row: col1=%v, col2=%v, col3=%v\n", col1, col2, col3) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/tuple.go) + +Note:型付きスライスとマップは、名前付きタプルのサブカラムが全て同一の型である場合にサポートされています。 + +#### ネストされたフィールド + +ネストされたフィールドは、名前付きのタプルの配列と同等です。使用法は、ユーザーが[flatten_nested](https://clickhouse.com/docs/ja/operations/settings/settings/#flatten-nested)を1に設定するか0に設定するかに依存します。 + +flatten_nestedを0に設定することで、ネストされたカラムは単一のタプルの配列として残ります。これにより、挿入と取得が簡単になります。マップのキーはカラムの名前と一致する必要があります。例: + +Note: マップはタプルを表現しているため`map[string]interface{}`でなければなりません。値は現在のところ強く型付けされていません。 + +```go +conn, err := GetNativeConnection(clickhouse.Settings{ + "flatten_nested": 0, +}, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(context.Background(), "DROP TABLE IF EXISTS example") +err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Nested(Col1_1 String, Col1_2 UInt8), + Col2 Nested( + Col2_1 UInt8, + Col2_2 Nested( + Col2_2_1 UInt8, + Col2_2_2 UInt8 + ) + ) + ) Engine Memory +`) +if err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i int64 +for i = 0; i < 10; i++ { + err := batch.Append( + []map[string]interface{}{ + { + "Col1_1": strconv.Itoa(int(i)), + "Col1_2": uint8(i), + }, + { + "Col1_1": strconv.Itoa(int(i + 1)), + "Col1_2": uint8(i + 1), + }, + { + "Col1_1": strconv.Itoa(int(i + 2)), + "Col1_2": uint8(i + 2), + }, + }, + []map[string]interface{}{ + { + "Col2_2": []map[string]interface{}{ + { + "Col2_2_1": uint8(i), + "Col2_2_2": uint8(i + 1), + }, + }, + "Col2_1": uint8(i), + }, + { + "Col2_2": []map[string]interface{}{ + { + "Col2_2_1": uint8(i + 2), + "Col2_2_2": uint8(i + 3), + }, + }, + "Col2_1": uint8(i + 1), + }, + }, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +var ( + col1 []map[string]interface{} + col2 []map[string]interface{} +) +rows, err := conn.Query(ctx, "SELECT * FROM example") +if err != nil { + return err +} +for rows.Next() { + if err := rows.Scan(&col1, &col2); err != nil { + return err + } + fmt.Printf("row: col1=%v, col2=%v\n", col1, col2) +} +rows.Close() +``` + +[Full Example - `flatten_tested=0`](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/nested.go#L28-L118) + +`flatten_nested`のデフォルト値1を使用する場合、ネストされたカラムは別々の配列にフラット化されます。これには挿入と取得にネストされたスライスを使用する必要があります。任意のレベルのネストが動作する可能性がありますが、公式にはサポートされていません。 + +```go +conn, err := GetNativeConnection(nil, nil, nil) +if err != nil { + return err +} +ctx := context.Background() +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(ctx, "DROP TABLE IF EXISTS example") +err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Nested(Col1_1 String, Col1_2 UInt8), + Col2 Nested( + Col2_1 UInt8, + Col2_2 Nested( + Col2_2_1 UInt8, + Col2_2_2 UInt8 + ) + ) + ) Engine Memory +`) +if err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +var i uint8 +for i = 0; i < 10; i++ { + col1_1_data := []string{strconv.Itoa(int(i)), strconv.Itoa(int(i + 1)), strconv.Itoa(int(i + 2))} + col1_2_data := []uint8{i, i + 1, i + 2} + col2_1_data := []uint8{i, i + 1, i + 2} + col2_2_data := [][][]interface{}{ + { + {i, i + 1}, + }, + { + {i + 2, i + 3}, + }, + { + {i + 4, i + 5}, + }, + } + err := batch.Append( + col1_1_data, + col1_2_data, + col2_1_data, + col2_2_data, + ) + if err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +``` + +[Full Example - `flatten_nested=1`](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/nested.go#L123-L180) + +Note: ネストされたカラムは同じ次元である必要があります。たとえば、上記の例では`Col_2_2`と`Col_2_1`は同一の要素数でなければなりません。 + +シンプルなインターフェースとネストに対する公式サポートのため、`flatten_nested=0`を推奨します。 + +#### 地理タイプ + +クライアントは、ジオタイプのポイント、リング、ポリゴン、およびマルチポリゴンをサポートします。これらのフィールドはGolangで[github.com/paulmach/orb](https://github.com/paulmach/orb)パッケージを使用して表現します。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + point Point, + ring Ring, + polygon Polygon, + mPolygon MultiPolygon + ) + Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} + +if err = batch.Append( + orb.Point{11, 22}, + orb.Ring{ + orb.Point{1, 2}, + orb.Point{1, 2}, + }, + orb.Polygon{ + orb.Ring{ + orb.Point{1, 2}, + orb.Point{12, 2}, + }, + orb.Ring{ + orb.Point{11, 2}, + orb.Point{1, 12}, + }, + }, + orb.MultiPolygon{ + orb.Polygon{ + orb.Ring{ + orb.Point{1, 2}, + orb.Point{12, 2}, + }, + orb.Ring{ + orb.Point{11, 2}, + orb.Point{1, 12}, + }, + }, + orb.Polygon{ + orb.Ring{ + orb.Point{1, 2}, + orb.Point{12, 2}, + }, + orb.Ring{ + orb.Point{11, 2}, + orb.Point{1, 12}, + }, + }, + }, +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + point orb.Point + ring orb.Ring + polygon orb.Polygon + mPolygon orb.MultiPolygon +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&point, &ring, &polygon, &mPolygon); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/geo.go) + +#### UUID + +UUIDタイプは[github.com/google/uuid](https://github.com/google/uuid)パッケージでサポートされています。ユーザーはまた、文字列や`sql.Scanner`や`Stringify`を実装する任意のタイプとしてUUIDを送信およびマーシャルすることができます。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + col1 UUID, + col2 UUID + ) + Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +col1Data, _ := uuid.NewUUID() +if err = batch.Append( + col1Data, + "603966d6-ed93-11ec-8ea0-0242ac120002", +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 uuid.UUID + col2 uuid.UUID +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/uuid.go) + +#### 小数点タイプ + +小数点タイプは[github.com/shopspring/decimal](https://github.com/shopspring/decimal)パッケージでサポートされています。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Decimal32(3), + Col2 Decimal(18,6), + Col3 Decimal(15,7), + Col4 Decimal128(8), + Col5 Decimal256(9) + ) Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +if err = batch.Append( + decimal.New(25, 4), + decimal.New(30, 5), + decimal.New(35, 6), + decimal.New(135, 7), + decimal.New(256, 8), +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 decimal.Decimal + col2 decimal.Decimal + col3 decimal.Decimal + col4 decimal.Decimal + col5 decimal.Decimal +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3, &col4, &col5); err != nil { + return err +} +fmt.Printf("col1=%v, col2=%v, col3=%v, col4=%v, col5=%v\n", col1, col2, col3, col4, col5) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/decimal.go) + +#### Nullableタイプ + +GoのNil値はClickHouseのNULL値を表します。これはフィールドがNullableとして宣言されている場合に使用できます。挿入時には、通常のカラムまたはNullableバージョンのどちらにもNilを渡すことができます。前者の場合、そのタイプのデフォルト値が保存され、NullableバージョンではClickHouseにNULL値が保存されます。 + +Scan時には、ユーザーはNil値を表現するためにNullableフィールドのためのNilをサポートする型へのポインタを渡す必要があります。例えば、以下の例ではcol1がNullable(String)であるため、これは**stringを受け取ります。これはnilを表現するための方法です。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + col1 Nullable(String), + col2 String, + col3 Nullable(Int8), + col4 Nullable(Int64) + ) + Engine Memory + `); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +if err = batch.Append( + nil, + nil, + nil, + sql.NullInt64{Int64: 0, Valid: false}, +); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 *string + col2 string + col3 *int8 + col4 sql.NullInt64 +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3, &col4); err != nil { + return err +} +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/nullable.go) + +クライアントはまた、`sql.Null*`タイプ、例えば`sql.NullInt64`もサポートしています。これらはその対になるClickHouseタイプと互換性があります。 + +#### 大きな整数 - Int128, Int256, UInt128, UInt256 + +64ビットを超える数値タイプは、ネイティブgoの[big](https://pkg.go.dev/math/big)パッケージを使用して表現されます。 + +```go +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Int128, + Col2 UInt128, + Col3 Array(Int128), + Col4 Int256, + Col5 Array(Int256), + Col6 UInt256, + Col7 Array(UInt256) + ) Engine Memory`); err != nil { + return err +} + +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} + +col1Data, _ := new(big.Int).SetString("170141183460469231731687303715884105727", 10) +col2Data := big.NewInt(128) +col3Data := []*big.Int{ + big.NewInt(-128), + big.NewInt(128128), + big.NewInt(128128128), +} +col4Data := big.NewInt(256) +col5Data := []*big.Int{ + big.NewInt(256), + big.NewInt(256256), + big.NewInt(256256256256), +} +col6Data := big.NewInt(256) +col7Data := []*big.Int{ + big.NewInt(256), + big.NewInt(256256), + big.NewInt(256256256256), +} + +if err = batch.Append(col1Data, col2Data, col3Data, col4Data, col5Data, col6Data, col7Data); err != nil { + return err +} + +if err = batch.Send(); err != nil { + return err +} + +var ( + col1 big.Int + col2 big.Int + col3 []*big.Int + col4 big.Int + col5 []*big.Int + col6 big.Int + col7 []*big.Int +) + +if err = conn.QueryRow(ctx, "SELECT * FROM example").Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7); err != nil { + return err +} +fmt.Printf("col1=%v, col2=%v, col3=%v, col4=%v, col5=%v, col6=%v, col7=%v\n", col1, col2, col3, col4, col5, col6, col7) +``` + +[Full Example](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/big_int.go) + +### 圧縮 + +サポートされる圧縮方法は、使用されているプロトコルに依存します。ネイティブプロトコルでは、クライアントは`LZ4`と`ZSTD`圧縮をサポートしています。その圧縮はブロックレベル上でのみ行われます。圧縮は接続時の`Compression`設定を含むことによって有効にできます。 + +```go +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Compression: &clickhouse.Compression{ + Method: clickhouse.CompressionZSTD, + }, + MaxOpenConns: 1, +}) +ctx := context.Background() +``` +```go +defer func() { + conn.Exec(ctx, "DROP TABLE example") +}() +conn.Exec(context.Background(), "DROP TABLE IF EXISTS example") +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 Array(String) + ) Engine Memory + `); err != nil { + return err +} +batch, err := conn.PrepareBatch(ctx, "INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + if err := batch.Append([]string{strconv.Itoa(i), strconv.Itoa(i + 1), strconv.Itoa(i + 2), strconv.Itoa(i + 3)}); err != nil { + return err + } +} +if err := batch.Send(); err != nil { + return err +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/compression.go) + +標準インターフェースをHTTP経由で使用する場合、追加の圧縮技術が利用可能です。詳細は[database/sql API - 圧縮](#compression)を参照してください。 + +### パラメータバインディング + +クライアントは、Exec、クエリ、そしてQueryRowメソッドのパラメータバインディングをサポートしています。以下の例で示すように、名前付き、番号付き、位置指定パラメータを使用してサポートされています。以下にそれらの例を示します。 + +```go +var count uint64 +// 位置バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 >= ? AND Col3 < ?", 500, now.Add(time.Duration(750)*time.Second)).Scan(&count); err != nil { + return err +} +// 250 +fmt.Printf("位置バインディングカウント: %d\n", count) +// 数値バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= $2 AND Col3 > $1", now.Add(time.Duration(150)*time.Second), 250).Scan(&count); err != nil { + return err +} +// 100 +fmt.Printf("数値バインディングカウント: %d\n", count) +// 名前付きバインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= @col1 AND Col3 > @col3", clickhouse.Named("col1", 100), clickhouse.Named("col3", now.Add(time.Duration(50)*time.Second))).Scan(&count); err != nil { + return err +} +// 50 +fmt.Printf("名前付きバインディングカウント: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/bind.go) + +#### 特別なケース + +デフォルトでは、スライスはクエリへのパラメータとして渡された場合、コンマで区切られた値のリストに展開されます。ユーザーがラップの`[ ]`で値のセットを注入する必要がある場合、ArraySetを使用するべきです。 + +グループ/タプルが必要である場合、IN演算子と一緒に使用すると有用な`( )`でラップされたものが、GroupSetを使用することで可能です。特に複数のグループが必要な場合に便利です。以下の例に示します。 + +最後に、DateTime64フィールドは、パラメータが適切にレンダリングされるよう精度が必要です。フィールドの精度レベルはクライアントからは知られないため、ユーザーが提供する必要があります。これを容易にするために、`DateNamed`パラメータを提供します。 + +```go +var count uint64 +// 配列は展開されます +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 IN (?)", []int{100, 200, 300, 400, 500}).Scan(&count); err != nil { + return err +} +fmt.Printf("配列展開カウント: %d\n", count) +// 配列は[]で保持されます +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col4 = ?", clickhouse.ArraySet{300, 301}).Scan(&count); err != nil { + return err +} +fmt.Printf("配列カウント: %d\n", count) +// グループセットを使うことで( )リストを形成できます +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 IN ?", clickhouse.GroupSet{[]interface{}{100, 200, 300, 400, 500}}).Scan(&count); err != nil { + return err +} +fmt.Printf("グループカウント: %d\n", count) +// ネストが必要な場合により有用です +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE (Col1, Col5) IN (?)", []clickhouse.GroupSet{{[]interface{}{100, 101}}, {[]interface{}{200, 201}}}).Scan(&count); err != nil { + return err +} +fmt.Printf("グループカウント: %d\n", count) +// タイムに精度が必要な場合はDateNamedを使用してください# +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col3 >= @col3", clickhouse.DateNamed("col3", now.Add(time.Duration(500)*time.Millisecond), clickhouse.NanoSeconds)).Scan(&count); err != nil { + return err +} +fmt.Printf("名前付き日付のカウント: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/bind_special.go) + +### コンテキストの使用 + +Goのコンテキストは、デッドラインやキャンセルシグナル、その他のリクエストにスコープ化された値をAPI境界間で渡す手段を提供します。コネクションの全てのメソッドは、最初の変数としてコンテキストを受け取ります。以前の例ではcontext.Background()を使用しましたが、この機能を使って設定やデッドラインを渡したり、クエリをキャンセルすることができます。 + +`withDeadline`を作成したコンテキストを渡すと、クエリに対して実行時間の制限を設けることができます。これは絶対的な時間であり、有効期限はコネクションを解放し、ClickHouseにキャンセル信号を送ることによってのみ解除されます。代替として`WithCancel`を使用して、クエリを明示的にキャンセルすることができます。 + +`clickhouse.WithQueryID`と`clickhouse.WithQuotaKey`のヘルパーにより、クエリIDと割り当てキーを指定できます。クエリIDはログでのクエリの追跡やキャンセル目的で有用です。割り当てキーは、ユニークなキー値に基づいてClickHouseの使用を制限するために使用できます - 詳細は[クオータ管理 ](https://clickhouse.com/docs/ja/operations/access-rights#quotas-management)を参照ください。 + +ユーザーはまた、特定のクエリにのみ設定を適用するためにコンテキストを使用して、コネクション全体には適用しません。[コネクション設定](#connection-settings)で示すように。 + +最後に、`clickhouse.WithBlockSize`を使用して、ブロックバッファのサイズを制御することができます。これにより、接続レベルの設定`BlockBufferSize`を上書きし、デコードされてメモリに保持されるブロックの最大数を制御します。値が大きいほど並列化が向上する可能性がありますが、メモリの消費が増える点には注意が必要です。 + +以下にこれらの例を示します。 + +```go +dialCount := 0 +conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + DialContext: func(ctx context.Context, addr string) (net.Conn, error) { + dialCount++ + var d net.Dialer + return d.DialContext(ctx, "tcp", addr) + }, +}) +if err != nil { + return err +} +if err := clickhouse_tests.CheckMinServerServerVersion(conn, 22, 6, 1); err != nil { + return nil +} +// 特定のAPIコールに設定を渡すためにコンテキストを使用できます +ctx := clickhouse.Context(context.Background(), clickhouse.WithSettings(clickhouse.Settings{ + "allow_experimental_object_type": "1", +})) + +conn.Exec(ctx, "DROP TABLE IF EXISTS example") + +// JSONカラムを作成するためにはallow_experimental_object_type=1が必要です +if err = conn.Exec(ctx, ` + CREATE TABLE example ( + Col1 JSON + ) + Engine Memory + `); err != nil { + return err +} + +// コンテキストを使用してクエリをキャンセルできます +ctx, cancel := context.WithCancel(context.Background()) +go func() { + cancel() +}() +if err = conn.QueryRow(ctx, "SELECT sleep(3)").Scan(); err == nil { + return fmt.Errorf("キャンセルを期待していました") +} + +// クエリにデッドラインを設定した場合 - 絶対時間に達した後にクエリをキャンセルします。 +// ClickHouseではクエリが完了まで続行されます +ctx, cancel = context.WithDeadline(context.Background(), time.Now().Add(-time.Second)) +defer cancel() +if err := conn.Ping(ctx); err == nil { + return fmt.Errorf("デッドライン超過を期待していました") +} + +// ログでのクエリトレースを助けるためにクエリIDを設定します。例えば、system.query_logを参照してください。 +var one uint8 +queryId, _ := uuid.NewUUID() +ctx = clickhouse.Context(context.Background(), clickhouse.WithQueryID(queryId.String())) +if err = conn.QueryRow(ctx, "SELECT 1").Scan(&one); err != nil { + return err +} + +conn.Exec(context.Background(), "DROP QUOTA IF EXISTS foobar") +defer func() { + conn.Exec(context.Background(), "DROP QUOTA IF EXISTS foobar") +}() +ctx = clickhouse.Context(context.Background(), clickhouse.WithQuotaKey("abcde")) +// クォータキーを設定 - まずクォータを作成する +if err = conn.Exec(ctx, "CREATE QUOTA IF NOT EXISTS foobar KEYED BY client_key FOR INTERVAL 1 minute MAX queries = 5 TO default"); err != nil { + return err +} + +type Number struct { + Number uint64 `ch:"number"` +} +for i := 1; i <= 6; i++ { + var result []Number + if err = conn.Select(ctx, &result, "SELECT number FROM numbers(10)"); err != nil { + return err + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/context.go) + +### 進捗/プロファイル/ログ情報 + +クエリに関する進捗、プロファイル、およびログ情報を要求することができます。進捗情報は、ClickHouseで読み取られたおよび処理された行とバイトの統計を報告します。それに対して、プロファイル情報はクライアントに返されたデータのサマリーを提供し、バイト、行、およびブロックの合計を含みます。最後に、ログ情報はスレッドに関する統計を提供します。例えば、メモリ使用量やデータ速度などです。 + +この情報を取得するには、[コンテキスト](#using-context)を使用する必要があります。これにコールバック関数を渡すことができます。 + +```go +totalRows := uint64(0) +// コンテキストを使用して進捗およびプロファイル情報用のコールバックを渡します +ctx := clickhouse.Context(context.Background(), clickhouse.WithProgress(func(p *clickhouse.Progress) { + fmt.Println("進捗: ", p) + totalRows += p.Rows +}), clickhouse.WithProfileInfo(func(p *clickhouse.ProfileInfo) { + fmt.Println("プロファイル情報: ", p) +}), clickhouse.WithLogs(func(log *clickhouse.Log) { + fmt.Println("ログ情報: ", log) +})) + +rows, err := conn.Query(ctx, "SELECT number from numbers(1000000) LIMIT 1000000") +if err != nil { + return err +} +for rows.Next() { +} + +fmt.Printf("合計行数: %d\n", totalRows) +rows.Close() +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/progress.go) + +### 動的スキャン + +ユーザーは、返されるフィールドのスキーマやタイプが不明なテーブルを読み取る必要があるかもしれません。これは、アドホックなデータ分析が行われたり、汎用的なツールが書かれる場合に一般的です。これを達成するために、クエリ応答にカラムタイプ情報が利用可能です。これはGoのリフレクションと組み合わせて、正しく型付けされた変数のランタイムインスタンスを作成し、Scanに渡すことができます。 + +```go +const query = ` +SELECT + 1 AS Col1 + , 'Text' AS Col2 +` +rows, err := conn.Query(context.Background(), query) +if err != nil { + return err +} +var ( + columnTypes = rows.ColumnTypes() + vars = make([]interface{}, len(columnTypes)) +) +for i := range columnTypes { + vars[i] = reflect.New(columnTypes[i].ScanType()).Interface() +} +for rows.Next() { + if err := rows.Scan(vars...); err != nil { + return err + } + for _, v := range vars { + switch v := v.(type) { + case *string: + fmt.Println(*v) + case *uint8: + fmt.Println(*v) + } + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/dynamic_scan_types.go) + +### 外部テーブル + +[外部テーブル](https://clickhouse.com/docs/ja/engines/table-engines/special/external-data/)は、クライアントがクリックハウスにデータを送信できるようにし、SELECTクエリと共にそのデータを使用することができます。このデータは一時的なテーブルに配置され、クエリ自体で評価のために使用されます。 + +クエリでクライアントに送信する外部データを作成するには、ext.NewTableを介して外部テーブルを構築し、これをコンテキストに渡す必要があります。 + +```go +table1, err := ext.NewTable("external_table_1", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) +if err != nil { + return err +} + +for i := 0; i < 10; i++ { + if err = table1.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()); err != nil { + return err + } +} + +table2, err := ext.NewTable("external_table_2", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) + +for i := 0; i < 10; i++ { + table2.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()) +} +ctx := clickhouse.Context(context.Background(), + clickhouse.WithExternalTable(table1, table2), +) +rows, err := conn.Query(ctx, "SELECT * FROM external_table_1") +if err != nil { + return err +} +for rows.Next() { + var ( + col1 uint8 + col2 string + col3 time.Time + ) + rows.Scan(&col1, &col2, &col3) + fmt.Printf("col1=%d, col2=%s, col3=%v\n", col1, col2, col3) +} +rows.Close() + +var count uint64 +if err := conn.QueryRow(ctx, "SELECT COUNT(*) FROM external_table_1").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1: %d\n", count) +if err := conn.QueryRow(ctx, "SELECT COUNT(*) FROM external_table_2").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_2: %d\n", count) +if err := conn.QueryRow(ctx, "SELECT COUNT(*) FROM (SELECT * FROM external_table_1 UNION ALL SELECT * FROM external_table_2)").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1 UNION external_table_2: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/external_data.go) + +### Open Telemetry + +ClickHouseはネイティブプロトコルの一部として[トレースコンテキスト](https://clickhouse.com/docs/ja/operations/opentelemetry/)を渡すことを許可しています。クライアントは`clickhouse.withSpan`関数を介してSpanを作成し、これをコンテキスト経由で渡すことによってこれを達成します。 + +```go +var count uint64 +rows := conn.QueryRow(clickhouse.Context(context.Background(), clickhouse.WithSpan( + trace.NewSpanContext(trace.SpanContextConfig{ + SpanID: trace.SpanID{1, 2, 3, 4, 5}, + TraceID: trace.TraceID{5, 4, 3, 2, 1}, + }), +)), "SELECT COUNT() FROM (SELECT number FROM system.numbers LIMIT 5)") +if err := rows.Scan(&count); err != nil { + return err +} +fmt.Printf("count: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/clickhouse_api/open_telemetry.go) + +トレースの利用についての詳細は[OpenTelemetryサポート](https://clickhouse.com/docs/ja/operations/opentelemetry/)で確認できます。 + +## データベース/SQL API + +`database/sql`または「標準」APIは、クライアントを異なるデータベースに接続する必要がある場合に標準的なインターフェースを遵守させ、クライアントアプリケーションが基礎となるデータベースについて認識していないシナリオで使用できます。これは一定のコストを伴います - 抽象化と間接の追加レイヤーおよびそれが必ずしもClickHouseと一致しないプリミティブです。しかし、このコストは、特に複数のデータベースに接続する必要があるツーリングシナリオで受け入れ可能であることが多いです。 + +さらに、このクライアントはHTTPをトランスポート層として使用するHTTP構文をサポートしています - データは依然として最適なパフォーマンスのためネイティブ形式でエンコードされます。 + +以下はClickHouse API文書の構造をミラーリングすることを目的としています。 + +標準APIの完全なコード例は[こちら](https://github.com/ClickHouse/clickhouse-go/tree/main/examples/std)で確認できます。 + +### 接続 + +DSN文字列`clickhouse://:?=`を使用した`Open`メソッドまたは`clickhouse.OpenDB`メソッドを通じて接続を確立できます。後者は`database/sql`仕様の一部ではありませんが、`sql.DB`インスタンスが返されます。 このメソッドはプロファイリングのような機能を提供し、`database/sql`仕様を通じて公開される明白な手段がありません。 + +```go +func Connect() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + }) + return conn.Ping() +} + +func ConnectDSN() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("clickhouse://%s:%d?username=%s&password=%s", env.Host, env.Port, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/connect.go) + +**以降の例では、明示的に示されない限り、ClickHouseの`conn`変数が作成され利用可能であることを仮定します。** + +#### 接続設定 + +次のパラメータは、DSN文字列に渡すことができます。 + +* `hosts` - ロードバランシングとフェイルオーバーのためのシングルアドレスホストのカンマ区切りリスト - [複数のノードへの接続](#connecting-to-multiple-nodes)を参照ください。 +* `username/password` - 認証情報 - [認証](#authentication)を参照ください。 +* `database` - デフォルトの現在のデータベースを選択 +* `dial_timeout` - 期間文字列は、オプションのフラクションと単位接尾辞を持つ、可能な限りサイン付きの一連の小数 - `300ms`、`1s`などです。 有効な時間単位は`ms`、`s`、`m`です。 +* `connection_open_strategy` - `random/in_order` (デフォルト `random`) - [複数のノードへの接続](#connecting-to-multiple-nodes)を参照ください。 + - `round_robin` - セットからラウンドロビンのサーバーを選択します + - `in_order` - 指定された順序で最初の生きているサーバーを選択します +* `debug` - デバッグ出力を有効にする (ブール値) +* `compress` - 圧縮アルゴリズムを指定 - `none`(デフォルト)、`zstd`、`lz4`、`gzip`、`deflate`、`br`。 `true`に設定されている場合、`lz4`が使われます。ネイティブ通信には`lz4`と`zstd`のみサポートされます。 +* `compress_level` - 圧縮レベル(デフォルトは`0`)。圧縮詳細を参照。これはアルゴリズムに特有: + - `gzip` - `-2`(最高速度)から`9`(最高圧縮) + - `deflate` - `-2`(最高速度)から`9`(最高圧縮) + - `br` - `0`(最高速度)から`11`(最高圧縮) + - `zstd`、`lz4` - 無視されます +* `secure` - セキュアなSSL接続を確立 (デフォルトは`false`) +* `skip_verify` - 証明書検証をスキップ (デフォルトは`false`) +* `block_buffer_size` - ユーザーがブロックバッファサイズを制御できるようにします。 [BlockBufferSize](#connection-settings)を参照してください。(デフォルトは`2`) + +```go +func ConnectSettings() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("clickhouse://127.0.0.1:9001,127.0.0.1:9002,%s:%d/%s?username=%s&password=%s&dial_timeout=10s&connection_open_strategy=round_robin&debug=true&compress=lz4", env.Host, env.Port, env.Database, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/connect_settings.go) + +#### コネクションプーリング + +[複数のノードへの接続](#connecting-to-multiple-nodes)に記載されている通りに、提供されたノードアドレスのリストの使用についてユーザーは影響を与えることができます。コネクション管理とプーリングは、意図的に`sql.DB`に委ねられます。 + +#### HTTP経由での接続 + +デフォルトでは、接続はネイティブプロトコルを介して確立されます。HTTPを必要とするユーザーは、HTTPプロトコルを含むようにDSNを変更するか、接続オプションでプロトコルを指定することでこれを有効にできます。 + +```go +func ConnectHTTP() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.HttpPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Protocol: clickhouse.HTTP, + }) + return conn.Ping() +} + +func ConnectDSNHTTP() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("http://%s:%d?username=%s&password=%s", env.Host, env.HttpPort, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/connect_http.go) + +#### 複数のノードへの接続 + +`OpenDB`を使用する場合、ClickHouse APIで使用される同じオプションアプローチを使用して複数のホストに接続します - オプションで`ConnOpenStrategy`を指定します。 + +DSNベースの接続の場合、文字列は複数のホストと`connection_open_strategy`パラメータを受け入れるため、この値に`round_robin`または`in_order`を設定することができます。 + +```go +func MultiStdHost() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := clickhouse.Open(&clickhouse.Options{ + Addr: []string{"127.0.0.1:9001", "127.0.0.1:9002", fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + ConnOpenStrategy: clickhouse.ConnOpenRoundRobin, + }) + if err != nil { + return err + } + v, err := conn.ServerVersion() + if err != nil { + return err + } + fmt.Println(v.String()) + return nil +} + +func MultiStdHostDSN() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("clickhouse://127.0.0.1:9001,127.0.0.1:9002,%s:%d?username=%s&password=%s&connection_open_strategy=round_robin", env.Host, env.Port, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/multi_host.go) + +### TLSの使用 + +DSN接続文字列を使用する場合、パラメータ"secure=true"でSSLを有効にできます。OpenDBメソッドは、非nil TLS構造の指定に依存して[ネイティブAPIのTLS](#using-tls)と同じアプローチを使用します。DSN接続文字列はSSL検証をスキップするためのskip_verifyパラメータをサポートしていますが、OpenDBメソッドは構成を渡すことを可能にしているため、より高度なTLS構成に必要です。 + +```go +func ConnectSSL() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + cwd, err := os.Getwd() + if err != nil { + return err + } + t := &tls.Config{} + caCert, err := ioutil.ReadFile(path.Join(cwd, "../../tests/resources/CAroot.crt")) + if err != nil { + return err + } + caCertPool := x509.NewCertPool() + successful := caCertPool.AppendCertsFromPEM(caCert) + if !successful { + return err + } + t.RootCAs = caCertPool + + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.SslPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + TLS: t, + }) + return conn.Ping() +} + +func ConnectDSNSSL() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn, err := sql.Open("clickhouse", fmt.Sprintf("https://%s:%d?secure=true&skip_verify=true&username=%s&password=%s", env.Host, env.HttpsPort, env.Username, env.Password)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/ssl.go) + +### 認証 + +OpenDBを使用する場合、通常のオプションで認証情報を渡すことができます。DSNベースの接続の場合、ユーザー名およびパスワードは接続文字列内に渡すことができ、パラメータとして、またはアドレスにエンコードされた資格情報として指定することができます。 + +```go +func ConnectAuth() error { + env, err := GetStdTestEnvironment() + if err != nil { + return err + } + conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.Port)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + }) + return conn.Ping() +} + +func ConnectDSNAuth() error { + env, err := GetStdTestEnvironment() + conn, err := sql.Open("clickhouse", fmt.Sprintf("http://%s:%d?username=%s&password=%s", env.Host, env.HttpPort, env.Username, env.Password)) + if err != nil { + return err + } + if err = conn.Ping(); err != nil { + return err + } + conn, err = sql.Open("clickhouse", fmt.Sprintf("http://%s:%s@%s:%d", env.Username, env.Password, env.Host, env.HttpPort)) + if err != nil { + return err + } + return conn.Ping() +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/auth.go) + +### 実行 + +接続が確立されると、ユーザーはExecメソッドを通じて`sql`文を実行することができます。 + +```go +conn.Exec(`DROP TABLE IF EXISTS example`) +_, err = conn.Exec(` + CREATE TABLE IF NOT EXISTS example ( + Col1 UInt8, + Col2 String + ) engine=Memory +`) +if err != nil { + return err +} +_, err = conn.Exec("INSERT INTO example VALUES (1, 'test-1')") +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/exec.go) + +このメソッドはコンテキストの受信をサポートしていません - デフォルトではバックグラウンドコンテキストで実行されます。コンテキストが必要な場合は、ExecContextを使用してください - コンテキストの使用を参照してください。 + +### バッチインサート + +バッチのセマンティクスは`Being`メソッドを使用して`sql.Tx`を作成することによって達成できます。そこから`INSERT`文を指定して`Prepare`メソッドを使用してバッチを取得します。これにより、`sql.Stmt`が返され、`Exec`メソッドで行を追加できます。 バッチは`Commit`が最初の`sql.Tx`で実行されるまでメモリに蓄積されます。 + +```go +batch, err := scope.Prepare("INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 1000; i++ { + _, err := batch.Exec( + uint8(42), + "ClickHouse", "Inc", + uuid.New(), + map[string]uint8{"key": 1}, // Map(String, UInt8) + []string{"Q", "W", "E", "R", "T", "Y"}, // Array(String) + []interface{}{ // Tuple(String, UInt8, Array(Map(String, String))) + "String Value", uint8(5), []map[string]string{ + map[string]string{"key": "value"}, + map[string]string{"key": "value"}, + map[string]string{"key": "value"}, + }, + }, + time.Now(), + ) + if err != nil { + return err + } +} +return scope.Commit() +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/batch.go) + +### 行のクエリ + +単一の行をクエリする際は、QueryRowメソッドを使用できます。これは*sql.Rowを返し、Scanを変数へのポインタと共に呼び出してカラムをマーシャル化します。QueryRowContextバリアントは、バックグラウンド以外のコンテキストを渡すことを可能にします。 + +```go +row := conn.QueryRow("SELECT * FROM example") +var ( + col1 uint8 + col2, col3, col4 string + col5 map[string]uint8 + col6 []string + col7 interface{} + col8 time.Time +) +if err := row.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil { + return err +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/query_row.go) + +次のメソッドを実行して複数の行を反復処理するには、`Query`メソッドを使用します。これは、行を反復処理するためにNextを呼び出せる`*sql.Rows`構造を返します。QueryContext相当は、コンテキストを渡すことを可能にします。 + +```go +rows, err := conn.Query("SELECT * FROM example") +if err != nil { + return err +} +var ( + col1 uint8 + col2, col3, col4 string + col5 map[string]uint8 + col6 []string + col7 interface{} + col8 time.Time +) +for rows.Next() { + if err := rows.Scan(&col1, &col2, &col3, &col4, &col5, &col6, &col7, &col8); err != nil { + return err + } + fmt.Printf("行: col1=%d, col2=%s, col3=%s, col4=%s, col5=%v, col6=%v, col7=%v, col8=%v\n", col1, col2, col3, col4, col5, col6, col7, col8) +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/query_rows.go) + +### 非同期インサート + +非同期インサートは、ExecContextメソッドを使用してインサートを実行することで達成できます。非同期モードを有効にしてコンテキストを渡す必要があります。 これにより、クライアントがサーバーがインサートを完了するのを待つか、データが受信されたら応答するかを指定できます。これにより、[wait_for_async_insert](https://clickhouse.com/docs/ja/operations/settings/settings/#wait-for-async-insert)パラメータが実質的に制御されます。 + +```go +const ddl = ` + CREATE TABLE example ( + Col1 UInt64 + , Col2 String + , Col3 Array(UInt8) + , Col4 DateTime + ) ENGINE = Memory + ` +if _, err := conn.Exec(ddl); err != nil { + return err +} +ctx := clickhouse.Context(context.Background(), clickhouse.WithStdAsync(false)) +{ + for i := 0; i < 100; i++ { + _, err := conn.ExecContext(ctx, fmt.Sprintf(`INSERT INTO example VALUES ( + %d, '%s', [1, 2, 3, 4, 5, 6, 7, 8, 9], now() + )`, i, "Golang SQL database driver")) + if err != nil { + return err + } + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/async.go) + +### カラム挿入 + +標準インターフェースを使用してのサポートはされていません。 + +### 構造体の使用 + +標準インターフェースを使用してのサポートはされていません。 + +### タイプ変換 + +標準`database/sql`インターフェースは、[ClickHouse API](#type-conversions)と同じタイプをサポートする必要があります。いくつかの例外、主に複雑なタイプについて、以下に記載します。ClickHouse APIと同様に、クライアントは挿入時の変数タイプの受け入れと応答のマーシャル化についてできるだけ柔軟であることを目指します。詳細は[タイプ変換](#type-conversions)を参照してください。 + +### 複雑なタイプ + +特に述べられていない限り、複雑なタイプの処理は[ClickHouse API](#complex-types)と同じである必要があります。違いは`database/sql`の内部によります。 + +#### マップ + +ClickHouse APIとは異なり、標準APIはスキャンタイプでマップの強い型付けを必要とします。例えば、`Map(String,String)`フィールドのために`map[string]interface{}`を渡すことはできず、代わりに`map[string]string`を使用する必要があります。 `interface{}`変数は常に互換性があり、より複雑な構造のために使用できます。構造体は読み取り時にサポートされていません。 + +```go +var ( + col1Data = map[string]uint64{ + "key_col_1_1": 1, + "key_col_1_2": 2, + } + col2Data = map[string]uint64{ + "key_col_2_1": 10, + "key_col_2_2": 20, + } + col3Data = map[string]uint64{} + col4Data = []map[string]string{ + {"A": "B"}, + {"C": "D"}, + } + col5Data = map[string]uint64{ + "key_col_5_1": 100, + "key_col_5_2": 200, + } +) +if _, err := batch.Exec(col1Data, col2Data, col3Data, col4Data, col5Data); err != nil { + return err +} +if err = scope.Commit(); err != nil { + return err +} +var ( + col1 interface{} + col2 map[string]uint64 + col3 map[string]uint64 + col4 []map[string]string + col5 map[string]uint64 +) +if err := conn.QueryRow("SELECT * FROM example").Scan(&col1, &col2, &col3, &col4, &col5); err != nil { + return err +} +fmt.Printf("col1=%v, col2=%v, col3=%v, col4=%v, col5=%v", col1, col2, col3, col4, col5) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/map.go) + +挿入の動作はClickHouse APIと同じです。 + +### 圧縮 + +標準APIはネイティブ[ClickHouse API](#compression)と同様の圧縮アルゴリズムをサポートしています。たとえば、ブロックレベルの`lz4`と`zstd`圧縮です。さらに、HTTP接続にはgzip、deflate、brもサポートされています。これらが有効化されている場合、圧縮はインサート時のブロックとクエリ応答のために行われます。他のリクエスト、例えばpingやクエリリクエストは圧縮されません。これは`lz4`と`zstd`オプションと一致しています。 + +もし`OpenDB`メソッドを使用して接続を確立する場合、圧縮の設定を渡すことができます。これには圧縮レベルを指定する能力が含まれます(以下を参照)。`sql.Open`を使用してDSNを介して接続する場合、`compress`パラメータを利用してください。これは特定の圧縮アルゴリズム、たとえば`gzip`、`deflate`、`br`、`zstd`または`lz4`あるいはブールフラグになります。`true`に設定されている場合、`lz4`が使われます。デフォルトは`none`です。すなわち、圧縮は無効です。 + +```go +conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.HttpPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Compression: &clickhouse.Compression{ + Method: clickhouse.CompressionBrotli, + Level: 5, + }, + Protocol: clickhouse.HTTP, +}) +``` +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/compression.go#L27-L76) + +```go +conn, err := sql.Open("clickhouse", fmt.Sprintf("http://%s:%d?username=%s&password=%s&compress=gzip&compress_level=5", env.Host, env.HttpPort, env.Username, env.Password)) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/compression.go#L78-L115) + +適用された圧縮のレベルは、DSNパラメータcompress_levelまたはCompressionオプションのLevelフィールドによって制御されます。デフォルトは0ですが、これはアルゴリズムによって特有です: + +* `gzip` - `-2` (ベストスピード)から`9` (ベスト圧縮) +* `deflate` - `-2` (ベストスピード)から`9` (ベスト圧縮) +* `br` - `0` (ベストスピード)から`11` (ベスト圧縮) +* `zstd`, `lz4` - 無視されます + +### パラメータバインディング + +標準APIは、[ClickHouse API](#parameter-binding)と同様のパラメータバインディング機能をサポートしており、Exec、Query、QueryRowメソッド(および対応する[コンテキスト](#using-context)バリアント)にパラメータを渡すことができます。位置指定、名前付き、および番号付きのパラメータがサポートされています。 + +```go +var count uint64 +// 位置バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 >= ? AND Col3 < ?", 500, now.Add(time.Duration(750)*time.Second)).Scan(&count); err != nil { + return err +} +// 250 +fmt.Printf("位置バインディングカウント: %d\n", count) +// 数値バインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= $2 AND Col3 > $1", now.Add(time.Duration(150)*time.Second), 250).Scan(&count); err != nil { + return err +} +// 100 +fmt.Printf("数値バインディングカウント: %d\n", count) +// 名前付きバインディング +if err = conn.QueryRow(ctx, "SELECT count() FROM example WHERE Col1 <= @col1 AND Col3 > @col3", clickhouse.Named("col1", 100), clickhouse.Named("col3", now.Add(time.Duration(50)*time.Second))).Scan(&count); err != nil { + return err +} +// 50 +fmt.Printf("名前付きバインディングカウント: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/bind.go) + +[特別なケース](#special-cases)が適用されることに注意してください。 + +### コンテキストの使用 + +標準APIは、[ClickHouse API](#using-context)と同様に、デッドライン、キャンセルシグナル、および他のリクエストスコープの値をコンテキストを通じて渡す能力をサポートしています。ClickHouse APIとは異なり、これはメソッドの`Context`バリアントを使用することによって達成されます。たとえば、バックグラウンドコンテキストを使用する`Exec`メソッドは`ExecContext`バリアントを持ち、そこでコンテキストを最初のパラメータとして渡すことができます。これにより、アプリケーションフローの任意の段階でコンテキストを渡すことができ、たとえば、接続を確立する際に`ConnContext`またはクエリ行をリクエストする際に`QueryRowContext`を使用することができます。以下に利用可能なメソッドの例を示します。 + +デッドライン、キャンセルシグナル、クエリID、クォータキーおよび接続設定を渡すためにコンテキストを使用する詳細については、[ClickHouse API](#using-context)のコンテキストの使用を参照してください。 + +```go +ctx := clickhouse.Context(context.Background(), clickhouse.WithSettings(clickhouse.Settings{ + "allow_experimental_object_type": "1", +})) +conn.ExecContext(ctx, "DROP TABLE IF EXISTS example") +// JSONカラムを作成するためにはallow_experimental_object_type=1が必要です +if _, err = conn.ExecContext(ctx, ` + CREATE TABLE example ( + Col1 JSON + ) + Engine Memory + `); err != nil { + return err +} + +// コンテキストを使用してクエリをキャンセルできます +ctx, cancel := context.WithCancel(context.Background()) +go func() { + cancel() +}() +if err = conn.QueryRowContext(ctx, "SELECT sleep(3)").Scan(); err == nil { + return fmt.Errorf("キャンセルを期待していました") +} + +// クエリにデッドラインを設定した場合 - 絶対時間に達した後にクエリをキャンセルします。再びコネクションの解除のみを行い、 +// ClickHouseではクエリが完了まで続行されます +ctx, cancel = context.WithDeadline(context.Background(), time.Now().Add(-time.Second)) +defer cancel() +if err := conn.PingContext(ctx); err == nil { + return fmt.Errorf("デッドライン超過を期待していました") +} + +// ログでのクエリトレースを助けるためにクエリIDを設定します。たとえば、system.query_logを参照してください。 +var one uint8 +ctx = clickhouse.Context(context.Background(), clickhouse.WithQueryID(uuid.NewString())) +if err = conn.QueryRowContext(ctx, "SELECT 1").Scan(&one); err != nil { + return err +} + +conn.ExecContext(context.Background(), "DROP QUOTA IF EXISTS foobar") +defer func() { + conn.ExecContext(context.Background(), "DROP QUOTA IF EXISTS foobar") +}() +ctx = clickhouse.Context(context.Background(), clickhouse.WithQuotaKey("abcde")) +// クォータキーを設定 - まずクォータを作成する +if _, err = conn.ExecContext(ctx, "CREATE QUOTA IF NOT EXISTS foobar KEYED BY client_key FOR INTERVAL 1 minute MAX queries = 5 TO default"); err != nil { + return err +} + +// クエリはコンテキストを使用してキャンセルできます +ctx, cancel = context.WithCancel(context.Background()) +// キャンセルの前に結果をいくつか取得します +ctx = clickhouse.Context(ctx, clickhouse.WithSettings(clickhouse.Settings{ + "max_block_size": "1", +})) +rows, err := conn.QueryContext(ctx, "SELECT sleepEachRow(1), number FROM numbers(100);") +if err != nil { + return err +} +var ( + col1 uint8 + col2 uint8 +) + +for rows.Next() { + if err := rows.Scan(&col1, &col2); err != nil { + if col2 > 3 { + fmt.Println("キャンセルを期待していました") + return nil + } + return err + } + fmt.Printf("行: col2=%d\n", col2) + if col2 == 3 { + cancel() + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/context.go) + +### セッション + +ネイティブ接続は本質的にセッションを持っていますが、HTTP接続の場合、ユーザーはコンテキストを設定として渡すためにセッションIDを作成する必要があります。これにより、一時テーブルなどのセッションにバインドされた機能が使用可能になります。 + +```go +conn := clickhouse.OpenDB(&clickhouse.Options{ + Addr: []string{fmt.Sprintf("%s:%d", env.Host, env.HttpPort)}, + Auth: clickhouse.Auth{ + Database: env.Database, + Username: env.Username, + Password: env.Password, + }, + Protocol: clickhouse.HTTP, + Settings: clickhouse.Settings{ + "session_id": uuid.NewString(), + }, +}) +if _, err := conn.Exec(`DROP TABLE IF EXISTS example`); err != nil { + return err +} +_, err = conn.Exec(` + CREATE TEMPORARY TABLE IF NOT EXISTS example ( + Col1 UInt8 + ) +`) +if err != nil { + return err +} +scope, err := conn.Begin() +if err != nil { + return err +} +batch, err := scope.Prepare("INSERT INTO example") +if err != nil { + return err +} +for i := 0; i < 10; i++ { + _, err := batch.Exec( + uint8(i), + ) + if err != nil { + return err + } +} +rows, err := conn.Query("SELECT * FROM example") +if err != nil { + return err +} +var ( + col1 uint8 +) +for rows.Next() { + if err := rows.Scan(&col1); err != nil { + return err + } + fmt.Printf("行: col1=%d\n", col1) +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/session.go) + +### 動的スキャン + +[ClickHouse API](#dynamic-scanning)に似て、カラムタイプ情報は利用可能で、ユーザーが実行時に正しく型付けされた変数のインスタンスを作成し、Scanに渡すことができます。これにより、タイプが未知の場合でもカラムを読み取ることができます。 + +```go +const query = ` +SELECT + 1 AS Col1 + , 'Text' AS Col2 +` +rows, err := conn.QueryContext(context.Background(), query) +if err != nil { + return err +} +columnTypes, err := rows.ColumnTypes() +if err != nil { + return err +} +vars := make([]interface{}, len(columnTypes)) +for i := range columnTypes { + vars[i] = reflect.New(columnTypes[i].ScanType()).Interface() +} +for rows.Next() { + if err := rows.Scan(vars...); err != nil { + return err + } + for _, v := range vars { + switch v := v.(type) { + case *string: + fmt.Println(*v) + case *uint8: + fmt.Println(*v) + } + } +} +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/dynamic_scan_types.go) + +### 外部テーブル + +[外部テーブル](https://clickhouse.com/docs/ja/engines/table-engines/special/external-data/)は、クライアントがSELECTクエリと共にClickHouseにデータを送信できるようにします。このデータは一時的なテーブルに置かれ、クエリ自体での評価に使用可能です。 + +クエリでクライアントに送信する外部データを作成するためには、ext.NewTableを介して外部テーブルを構築し、これをコンテキストに渡す必要があります。 + +```go +table1, err := ext.NewTable("external_table_1", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) +if err != nil { + return err +} + +for i := 0; i < 10; i++ { + if err = table1.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()); err != nil { + return err + } +} + +table2, err := ext.NewTable("external_table_2", + ext.Column("col1", "UInt8"), + ext.Column("col2", "String"), + ext.Column("col3", "DateTime"), +) + +for i := 0; i < 10; i++ { + table2.Append(uint8(i), fmt.Sprintf("value_%d", i), time.Now()) +} +ctx := clickhouse.Context(context.Background(), + clickhouse.WithExternalTable(table1, table2), +) +rows, err := conn.QueryContext(ctx, "SELECT * FROM external_table_1") +if err != nil { + return err +} +for rows.Next() { + var ( + col1 uint8 + col2 string + col3 time.Time + ) + rows.Scan(&col1, &col2, &col3) + fmt.Printf("col1=%d, col2=%s, col3=%v\n", col1, col2, col3) +} +rows.Close() + +var count uint64 +if err := conn.QueryRowContext(ctx, "SELECT COUNT(*) FROM external_table_1").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1: %d\n", count) +if err := conn.QueryRowContext(ctx, "SELECT COUNT(*) FROM external_table_2").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_2: %d\n", count) +if err := conn.QueryRowContext(ctx, "SELECT COUNT(*) FROM (SELECT * FROM external_table_1 UNION ALL SELECT * FROM external_table_2)").Scan(&count); err != nil { + return err +} +fmt.Printf("external_table_1 UNION external_table_2: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/external_data.go) + +### Open Telemetry + +ClickHouseはネイティブプロトコルの一部として[トレースコンテキスト](https://clickhouse.com/docs/ja/operations/opentelemetry/)を渡すことを許可しています。クライアントは`clickhouse.withSpan`関数を介してSpanを作成し、これをコンテキスト経由で渡すことによってこれを達成します。これはHTTPをトランスポートとして使用する場合にはサポートされていません。 + +```go +var count uint64 +rows := conn.QueryRowContext(clickhouse.Context(context.Background(), clickhouse.WithSpan( + trace.NewSpanContext(trace.SpanContextConfig{ + SpanID: trace.SpanID{1, 2, 3, 4, 5}, + TraceID: trace.TraceID{5, 4, 3, 2, 1}, + }), +)), "SELECT COUNT() FROM (SELECT number FROM system.numbers LIMIT 5)") +if err := rows.Scan(&count); err != nil { + return err +} +fmt.Printf("count: %d\n", count) +``` + +[完全な例](https://github.com/ClickHouse/clickhouse-go/blob/main/examples/std/open_telemetry.go) + +## パフォーマンステップ + +* 可能であれば、ClickHouse APIを利用する。それにより、重要なリフレクションと間接を避けることができます。 +* 大規模なデータセットを読み取る場合、[BlockBufferSize](#connection-settings)を変更することを検討してください。これにより、メモリのフットプリントが増えますが、行の反復中により多くのブロックが並列にデコードされるようになります。デフォルト値の2は保守的で、メモリオーバーヘッドを最小限に抑えます。高い値はメモリ内のブロック数を増やします。これはテストが必要で、異なるクエリは異なるブロックサイズを生成する可能性があります。そのため、コンテキストを介して[クエリレベル](#using-context)で設定できます。 +* データを挿入する際には、できるだけ具体的に型を指定してください。クライアントはUUIDやIPのための文字列を許可するなどの柔軟さを目指していますが、これはデータの検証を必要とし、挿入時にコストを伴います。 +* 可能な限り列指向のインサートを利用してください。これらは強く型付けされており、クライアントがあなたの値を変換する必要を避けます。 +* ClickHouseの最適なインサートパフォーマンスのための[推奨](https://clickhouse.com/docs/ja/sql-reference/statements/insert-into/#performance-considerations)に従ってください。 +``` diff --git a/docs/ja/integrations/language-clients/java/client-v1.md b/docs/ja/integrations/language-clients/java/client-v1.md new file mode 100644 index 00000000000..7fdad530fa9 --- /dev/null +++ b/docs/ja/integrations/language-clients/java/client-v1.md @@ -0,0 +1,348 @@ +--- +sidebar_label: クライアント V1 +sidebar_position: 3 +keywords: [clickhouse, java, client, integrate] +description: Java ClickHouse Connector v1 +slug: /ja/integrations/java/client-v1 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# クライアント (V1) + +DBサーバとそのプロトコルを介して通信するためのJavaクライアントライブラリです。現在の実装では[HTTPインターフェース](/docs/ja/interfaces/http)のみをサポートしています。このライブラリは、サーバにリクエストを送信するための独自のAPIを提供します。 + +*注意*: このコンポーネントは間もなく非推奨になります。 + +## セットアップ + + + + +```xml + + + com.clickhouse + clickhouse-http-client + 0.6.5 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-http-client +implementation("com.clickhouse:clickhouse-http-client:0.6.5") +``` + + + +```groovy +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-http-client +implementation 'com.clickhouse:clickhouse-http-client:0.6.5' +``` + + + + +バージョン `0.5.0` 以降、ドライバーは新しいクライアントHTTPライブラリを使用し、それを依存関係として追加する必要があります。 + + + + +```xml + + + org.apache.httpcomponents.client5 + httpclient5 + 5.3.1 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 +implementation("org.apache.httpcomponents.client5:httpclient5:5.3.1") +``` + + + +```groovy +// https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 +implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1' +``` + + + + +## 初期化 + +接続URL形式: `protocol://host[:port][/database][?param[=value][¶m[=value]][#tag[,tag]]`, 例として: + +- `http://localhost:8443?ssl=true&sslmode=NONE` +- `https://(https://explorer@play.clickhouse.com:443` + +単一ノードに接続: + +```java showLineNumbers +ClickHouseNode server = ClickHouseNode.of("http://localhost:8123/default?compress=0"); +``` +複数ノードのクラスタに接続: + +```java showLineNumbers +ClickHouseNodes servers = ClickHouseNodes.of( + "jdbc:ch:http://server1.domain,server2.domain,server3.domain/my_db" + + "?load_balancing_policy=random&health_check_interval=5000&failover=2"); +``` + +## クエリAPI + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from numbers limit :limit") + .params(1000) + .executeAndWait()) { + ClickHouseResponseSummary summary = response.getSummary(); + long totalRows = summary.getTotalRowsToRead(); +} +``` + +## ストリーミングクエリAPI + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from numbers limit :limit") + .params(1000) + .executeAndWait()) { + for (ClickHouseRecord r : response.records()) { + int num = r.getValue(0).asInteger(); + // 型変換 + String str = r.getValue(0).asString(); + LocalDate date = r.getValue(0).asDate(); + } +} +``` + +[リポジトリ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client)内の[完全なコード例](https://github.com/ClickHouse/clickhouse-java/blob/main/examples/client/src/main/java/com/clickhouse/examples/jdbc/Main.java#L73)を参照してください。 + +## 挿入API + +```java showLineNumbers + +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers).write() + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("insert into my_table select c2, c3 from input('c1 UInt8, c2 String, c3 Int32')") + .data(myInputStream) // `myInputStream` はRowBinary形式のデータソース + .executeAndWait()) { + ClickHouseResponseSummary summary = response.getSummary(); + summary.getWrittenRows(); +} +``` + +[リポジトリ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client)内の[完全なコード例](https://github.com/ClickHouse/clickhouse-java/blob/main/examples/client/src/main/java/com/clickhouse/examples/jdbc/Main.java#L39)を参照してください。 + +**RowBinary エンコーディング** + +RowBinary形式はその[ページ](/docs/ja/interfaces/formats#rowbinarywithnamesandtypes)に記述されています。 + +[コード](https://github.com/ClickHouse/clickhouse-kafka-connect/blob/main/src/main/java/com/clickhouse/kafka/connect/sink/db/ClickHouseWriter.java#L622)の例があります。 + +## 機能 +### 圧縮 + +このクライアントはデフォルトでLZ4圧縮を使用します。それには以下の依存関係が必要です。 + + + + +```xml + + + org.lz4 + lz4-java + 1.8.0 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/org.lz4/lz4-java +implementation("org.lz4:lz4-java:1.8.0") +``` + + + +```groovy +// https://mvnrepository.com/artifact/org.lz4/lz4-java +implementation 'org.lz4:lz4-java:1.8.0' +``` + + + + +代わりにgzipを使用したい場合は、接続URLに`compress_algorithm=gzip`を設定してください。 + +また、数通りの方法で圧縮を無効にすることができます。 + +1. 接続URLに `compress=0` を設定して無効にする: `http://localhost:8123/default?compress=0` +2. クライアント設定経由で無効にする: + +```java showLineNumbers +ClickHouseClient client = ClickHouseClient.builder() + .config(new ClickHouseConfig(Map.of(ClickHouseClientOption.COMPRESS, false))) + .nodeSelector(ClickHouseNodeSelector.of(ClickHouseProtocol.HTTP)) + .build(); +``` + +異なる圧縮オプションについての詳細は、[圧縮ドキュメント](/ja/native-protocol/compression)を参照してください。 + +### 複数クエリ + +同じセッション内で、複数のクエリを一つづつワーカースレッドで実行します: + +```java showLineNumbers +CompletableFuture> future = ClickHouseClient.send(servers.apply(servers.getNodeSelector()), + "create database if not exists my_base", + "use my_base", + "create table if not exists test_table(s String) engine=Memory", + "insert into test_table values('1')('2')('3')", + "select * from test_table limit 1", + "truncate table test_table", + "drop table if exists test_table"); +List results = future.get(); +``` + +### 名前付きパラメータ + +パラメータリストの位置に依存する代わりに、名前でパラメータを渡すことができます。この機能は`params`機能を使用することで利用可能になります。 + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from my_table where name=:name limit :limit") + .params("Ben", 1000) + .executeAndWait()) { + //... + } +} +``` + +:::note パラメータ +`String`型を含む全ての`params`シグネチャ(`String`, `String[]`, `Map`)は、渡されるキーが有効なClickHouseのSQL文字列であると仮定します。たとえば: + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from my_table where name=:name") + .params(Map.of("name","'Ben'")) + .executeAndWait()) { + //... + } +} +``` + +Stringオブジェクトを手動でClickHouse SQLに解析したくない場合は、`com.clickhouse.data`にあるヘルパー関数`ClickHouseValues.convertToSqlExpression`を使用できます: + +```java showLineNumbers +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP); + ClickHouseResponse response = client.read(servers) + .format(ClickHouseFormat.RowBinaryWithNamesAndTypes) + .query("select * from my_table where name=:name") + .params(Map.of("name", ClickHouseValues.convertToSqlExpression("Ben's"))) + .executeAndWait()) { + //... + } +} +``` + +上記の例では、`ClickHouseValues.convertToSqlExpression`が内部のシングルクォーテーションをエスケープし、変数を有効なシングルクォーテーションで囲みます。 + +他の型、例えば`Integer`、`UUID`、`Array`、`Enum`などは、`params`内で自動的に変換されます。 +::: + +## ノード検出 + +Javaクライアントは、ClickHouseノードを自動で検出する機能を提供します。自動検出はデフォルトで無効になっています。手動で有効にするには、`auto_discovery`を `true`に設定します: + +```java +properties.setProperty("auto_discovery", "true"); +``` + +または接続URL内で: + +```plaintext +jdbc:ch://my-server/system?auto_discovery=true +``` + +自動検出が有効な場合、接続URL内に全てのClickHouseノードを指定する必要はありません。URLに指定されたノードはシードとして扱われ、Javaクライアントはシステムテーブルやclickhouse-keeperもしくはzookeeperからさらに多くのノードを自動で検出します。 + +自動検出設定に関するオプションは以下の通りです: + +| プロパティ | デフォルト | 説明 | +|-------------------------|------------|-------------------------------------------------------------------------------------------------------| +| auto_discovery | `false` | クライアントがシステムテーブルまたはclickhouse-keeper/zookeeperからさらに多くのノードを検出するかどうか | +| node_discovery_interval | `0` | ノード検出の間隔をミリ秒で指定し、ゼロや負の値は一回限りの検出を意味します | +| node_discovery_limit | `100` | 一度に検出できるノードの最大数。ゼロや負の値は制限なしを意味します | + +### ロードバランシング + +Javaクライアントはロードバランシングポリシーに従って、リクエストを送信するClickHouseノードを選択します。一般に、ロードバランシングポリシーは以下のことを担当します: + +1. 管理されているノードリストからノードを取得する +2. ノードの状態を管理する +3. (もし自動検出が有効であれば)ノード検出のためのバックグラウンドプロセスをオプションでスケジュールし、ヘルスチェックを実行する + +ロードバランシングの設定に関するオプション一覧は以下の通りです: + +| プロパティ | デフォルト | 説明 | +|--------------------------|-------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| load_balancing_policy | `""` | ロードバランシングポリシーとして利用できるのは:
  • `firstAlive` - 管理ノードリストから最初の正常なノードにリクエストが送られます
  • `random` - 管理ノードリストからランダムに選ばれたノードにリクエストが送られます
  • `roundRobin` - 管理ノードリストの各ノードに順番にリクエストが送られます
  • `ClickHouseLoadBalancingPolicy`を実装した完全修飾クラス名 - カスタムロードバランシングポリシー
  • 指定がなければ、管理ノードリストの最初のノードにリクエストが送られます | +| load_balancing_tags | `""` | ノードをフィルタリングするためのロードバランシングタグ。指定されたタグを持つノードにのみリクエストが送られます | +| health_check_interval | `0` | ヘルスチェックの間隔をミリ秒で指定し、ゼロや負の値は一回限りを意味します | +| health_check_method | `ClickHouseHealthCheckMethod.SELECT_ONE` | ヘルスチェックの方法。以下のうち一つ:
  • `ClickHouseHealthCheckMethod.SELECT_ONE` - `select 1`クエリでのチェック
  • `ClickHouseHealthCheckMethod.PING` - 一般により高速なプロトコル固有のチェック
  • | +| node_check_interval | `0` | ノードチェックの間隔をミリ秒で指定し、負の数はゼロと見なされます。特定のノードの最後のチェックから指定された時間が経過している場合にノードの状態がチェックされます。
    `health_check_interval`と`node_check_interval`の違いは、`health_check_interval`はノードのリスト(すべてもしくは誤っているものに対して)の状態をチェックするバックグラウンドジョブをスケジュールするオプションであるのに対し、`node_check_interval`は特定のノードの最後のチェックから指定された時間が経過していることを指定するオプションです | +| check_all_nodes | `false` | すべてのノードと誤動作しているノードのどちらに対してヘルスチェックを実行するかを指定します | + + +### フェイルオーバーとリトライ + +Javaクライアントは、失敗したクエリに対するフェイルオーバーとリトライの動作をセットアップするための設定オプションを提供します: + +| プロパティ | デフォルト | 説明 | +|-----------------------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| failover | `0` | リクエストに対してフェイルオーバーが発生できる最大回数。ゼロまたは負の値はフェイルオーバーなしを意味します。フェイルオーバーは負の値を意味し、異なるノードに失敗したリクエストを送信します。 | +| retry | `0` | リクエストに対してリトライが発生できる最大回数。ゼロまたは負の値はリトライなしを意味します。ClickHouseサーバが`NETWORK_ERROR`エラーコードを返した場合のみ、リトライが行われます。 | +| repeat_on_session_lock | `true` | セッションがロックされてタイムアウトする場合(`session_timeout` または `connect_timeout` に従う)の実行を繰り返すかどうかを指定します。ClickHouseサーバが`SESSION_IS_LOCKED`エラーコードを返した場合に、失敗したリクエストが繰り返されます。 | + +### カスタムHTTPヘッダーの追加 + +JavaクライアントはリクエストにカスタムHTTPヘッダーを追加するためのHTTP/Sトランスポートレイヤーをサポートしています。 +`custom_http_headers`プロパティを使用し、ヘッダーを`,`で区切って指定します。ヘッダーキー/値は`=`で分割する必要があります。 + +## Javaクライアントサポート + +```java +options.put("custom_http_headers", "X-ClickHouse-Quota=test, X-ClickHouse-Test=test"); +``` + +## JDBCドライバー + +```java +properties.setProperty("custom_http_headers", "X-ClickHouse-Quota=test, X-ClickHouse-Test=test"); +``` + + diff --git a/docs/ja/integrations/language-clients/java/client-v2.md b/docs/ja/integrations/language-clients/java/client-v2.md new file mode 100644 index 00000000000..4d9ae7af986 --- /dev/null +++ b/docs/ja/integrations/language-clients/java/client-v2.md @@ -0,0 +1,538 @@ +--- +sidebar_label: Client V2 +sidebar_position: 2 +keywords: [clickhouse, java, client, integrate] +description: Java ClickHouse Connector v2 +slug: /ja/integrations/java/client-v2 +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# Java クライアント (V2) + +DBサーバーとそのプロトコルを介して通信するためのJavaクライアントライブラリです。現在の実装は[HTTPインターフェース](/docs/ja/interfaces/http)のみをサポートしています。このライブラリは、サーバーにリクエストを送信するための独自のAPIを提供します。また、さまざまなバイナリデータ形式(RowBinary* & Native*)で作業するためのツールも提供します。 + +## セットアップ + +- Maven Central (プロジェクトウェブページ): https://mvnrepository.com/artifact/com.clickhouse/client-v2 +- ナイトリービルド (リポジトリリンク): https://s01.oss.sonatype.org/content/repositories/snapshots/com/clickhouse/ + + + + +```xml + + com.clickhouse + client-v2 + 0.6.5 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/com.clickhouse/client-v2 +implementation("com.clickhouse:client-v2:0.6.5") +``` + + + +```groovy +// https://mvnrepository.com/artifact/com.clickhouse/client-v2 +implementation 'com.clickhouse:client-v2:0.6.5' +``` + + + + +## 初期化 + +`com.clickhouse.client.api.Client.Builder#build()`によってクライアントオブジェクトが初期化されます。各クライアントは独自のコンテキストを持ち、オブジェクト間で共有されません。ビルダーには便利な設定のためのメソッドが用意されています。 + +例: +```java showLineNumbers + Client client = new Client.Builder() + .addEndpoint("https://clickhouse-cloud-instance:8443/") + .setUsername(user) + .setPassword(password) + .build(); +``` + +`Client`は`AutoCloseable`であり、不要になったら閉じる必要があります。 + +## 設定 + +すべての設定はインスタンスメソッド(設定メソッドとして知られる)によって定義され、それぞれの値のスコープとコンテキストを明確にします。 +主要な設定パラメータは一つのスコープ(クライアントまたは操作)に定義され、互いにオーバーライドされません。 + +設定はクライアント作成時に定義されます。`com.clickhouse.client.api.Client.Builder`を参照してください。 + +## 共通定義 + +### ClickHouseFormat + +[サポートされるフォーマット](/docs/ja/interfaces/formats)の列挙です。ClickHouseがサポートするすべてのフォーマットを含みます。 + +* `raw` - ユーザーは生データをトランスコードする必要があります +* `full` - クライアントはデータを自分でトランスコードでき、生データストリームを受け入れます +* `-` - このフォーマットではClickHouseでは操作サポートされていません + +このクライアントバージョンがサポートするもの: + +| フォーマット | 入力 | 出力 | +|-----------------------------------------------------------------------------------------------------------------------------------|:------:|:------:| +| [TabSeparated](/docs/ja/interfaces/formats#tabseparated) | raw | raw | +| [TabSeparatedRaw](/docs/ja/interfaces/formats#tabseparatedraw) | raw | raw | +| [TabSeparatedWithNames](/docs/ja/interfaces/formats#tabseparatedwithnames) | raw | raw | +| [TabSeparatedWithNamesAndTypes](/docs/ja/interfaces/formats#tabseparatedwithnamesandtypes) | raw | raw | +| [TabSeparatedRawWithNames](/docs/ja/interfaces/formats#tabseparatedrawwithnames) | raw | raw | +| [TabSeparatedRawWithNamesAndTypes](/docs/ja/interfaces/formats#tabseparatedrawwithnamesandtypes) | raw | raw | +| [Template](/docs/ja/interfaces/formats#format-template) | raw | raw | +| [TemplateIgnoreSpaces](/docs/ja/interfaces/formats#templateignorespaces) | raw | - | +| [CSV](/docs/ja/interfaces/formats#csv) | raw | raw | +| [CSVWithNames](/docs/ja/interfaces/formats#csvwithnames) | raw | raw | +| [CSVWithNamesAndTypes](/docs/ja/interfaces/formats#csvwithnamesandtypes) | raw | raw | +| [CustomSeparated](/docs/ja/interfaces/formats#format-customseparated) | raw | raw | +| [CustomSeparatedWithNames](/docs/ja/interfaces/formats#customseparatedwithnames) | raw | raw | +| [CustomSeparatedWithNamesAndTypes](/docs/ja/interfaces/formats#customseparatedwithnamesandtypes) | raw | raw | +| [SQLInsert](/docs/ja/interfaces/formats#sqlinsert) | - | raw | +| [Values](/docs/ja/interfaces/formats#data-format-values) | raw | raw | +| [Vertical](/docs/ja/interfaces/formats#vertical) | - | raw | +| [JSON](/docs/ja/interfaces/formats#json) | raw | raw | +| [JSONAsString](/docs/ja/interfaces/formats#jsonasstring) | raw | - | +| [JSONAsObject](/docs/ja/interfaces/formats#jsonasobject) | raw | - | +| [JSONStrings](/docs/ja/interfaces/formats#jsonstrings) | raw | raw | +| [JSONColumns](/docs/ja/interfaces/formats#jsoncolumns) | raw | raw | +| [JSONColumnsWithMetadata](/docs/ja/interfaces/formats#jsoncolumnsmonoblock) | raw | raw | +| [JSONCompact](/docs/ja/interfaces/formats#jsoncompact) | raw | raw | +| [JSONCompactStrings](/docs/ja/interfaces/formats#jsoncompactstrings) | - | raw | +| [JSONCompactColumns](/docs/ja/interfaces/formats#jsoncompactcolumns) | raw | raw | +| [JSONEachRow](/docs/ja/interfaces/formats#jsoneachrow) | raw | raw | +| [PrettyJSONEachRow](/docs/ja/interfaces/formats#prettyjsoneachrow) | - | raw | +| [JSONEachRowWithProgress](/docs/ja/interfaces/formats#jsoneachrowwithprogress) | - | raw | +| [JSONStringsEachRow](/docs/ja/interfaces/formats#jsonstringseachrow) | raw | raw | +| [JSONStringsEachRowWithProgress](/docs/ja/interfaces/formats#jsonstringseachrowwithprogress) | - | raw | +| [JSONCompactEachRow](/docs/ja/interfaces/formats#jsoncompacteachrow) | raw | raw | +| [JSONCompactEachRowWithNames](/docs/ja/interfaces/formats#jsoncompacteachrowwithnames) | raw | raw | +| [JSONCompactEachRowWithNamesAndTypes](/docs/ja/interfaces/formats#jsoncompacteachrowwithnamesandtypes) | raw | raw | +| [JSONCompactStringsEachRow](/docs/ja/interfaces/formats#jsoncompactstringseachrow) | raw | raw | +| [JSONCompactStringsEachRowWithNames](/docs/ja/interfaces/formats#jsoncompactstringseachrowwithnames) | raw | raw | +| [JSONCompactStringsEachRowWithNamesAndTypes](/docs/ja/interfaces/formats#jsoncompactstringseachrowwithnamesandtypes) | raw | raw | +| [JSONObjectEachRow](/docs/ja/interfaces/formats#jsonobjecteachrow) | raw | raw | +| [BSONEachRow](/docs/ja/interfaces/formats#bsoneachrow) | raw | raw | +| [TSKV](/docs/ja/interfaces/formats#tskv) | raw | raw | +| [Pretty](/docs/ja/interfaces/formats#pretty) | - | raw | +| [PrettyNoEscapes](/docs/ja/interfaces/formats#prettynoescapes) | - | raw | +| [PrettyMonoBlock](/docs/ja/interfaces/formats#prettymonoblock) | - | raw | +| [PrettyNoEscapesMonoBlock](/docs/ja/interfaces/formats#prettynoescapesmonoblock) | - | raw | +| [PrettyCompact](/docs/ja/interfaces/formats#prettycompact) | - | raw | +| [PrettyCompactNoEscapes](/docs/ja/interfaces/formats#prettycompactnoescapes) | - | raw | +| [PrettyCompactMonoBlock](/docs/ja/interfaces/formats#prettycompactmonoblock) | - | raw | +| [PrettyCompactNoEscapesMonoBlock](/docs/ja/interfaces/formats#prettycompactnoescapesmonoblock) | - | raw | +| [PrettySpace](/docs/ja/interfaces/formats#prettyspace) | - | raw | +| [PrettySpaceNoEscapes](/docs/ja/interfaces/formats#prettyspacenoescapes) | - | raw | +| [PrettySpaceMonoBlock](/docs/ja/interfaces/formats#prettyspacemonoblock) | - | raw | +| [PrettySpaceNoEscapesMonoBlock](/docs/ja/interfaces/formats#prettyspacenoescapesmonoblock) | - | raw | +| [Prometheus](/docs/ja/interfaces/formats#prometheus) | - | raw | +| [Protobuf](/docs/ja/interfaces/formats#protobuf) | raw | raw | +| [ProtobufSingle](/docs/ja/interfaces/formats#protobufsingle) | raw | raw | +| [ProtobufList](/docs/ja/interfaces/formats#protobuflist) | raw | raw | +| [Avro](/docs/ja/interfaces/formats#data-format-avro) | raw | raw | +| [AvroConfluent](/docs/ja/interfaces/formats#data-format-avro-confluent) | raw | - | +| [Parquet](/docs/ja/interfaces/formats#data-format-parquet) | raw | raw | +| [ParquetMetadata](/docs/ja/interfaces/formats#data-format-parquet-metadata) | raw | - | +| [Arrow](/docs/ja/interfaces/formats#data-format-arrow) | raw | raw | +| [ArrowStream](/docs/ja/interfaces/formats#data-format-arrow-stream) | raw | raw | +| [ORC](/docs/ja/interfaces/formats#data-format-orc) | raw | raw | +| [One](/docs/ja/interfaces/formats#data-format-one) | raw | - | +| [Npy](/docs/ja/interfaces/formats#data-format-npy) | raw | raw | +| [RowBinary](/docs/ja/interfaces/formats#rowbinary) | full | full | +| [RowBinaryWithNames](/docs/ja/interfaces/formats#rowbinarywithnamesandtypes) | full | full | +| [RowBinaryWithNamesAndTypes](/docs/ja/interfaces/formats#rowbinarywithnamesandtypes) | full | full | +| [RowBinaryWithDefaults](/docs/ja/interfaces/formats#rowbinarywithdefaults) | full | - | +| [Native](/docs/ja/interfaces/formats#native) | full | raw | +| [Null](/docs/ja/interfaces/formats#null) | - | raw | +| [XML](/docs/ja/interfaces/formats#xml) | - | raw | +| [CapnProto](/docs/ja/interfaces/formats#capnproto) | raw | raw | +| [LineAsString](/docs/ja/interfaces/formats#lineasstring) | raw | raw | +| [Regexp](/docs/ja/interfaces/formats#data-format-regexp) | raw | - | +| [RawBLOB](/docs/ja/interfaces/formats#rawblob) | raw | raw | +| [MsgPack](/docs/ja/interfaces/formats#msgpack) | raw | raw | +| [MySQLDump](/docs/ja/interfaces/formats#mysqldump) | raw | - | +| [DWARF](/docs/ja/interfaces/formats#dwarf) | raw | - | +| [Markdown](/docs/ja/interfaces/formats#markdown) | - | raw | +| [Form](/docs/ja/interfaces/formats#form) | raw | - | + + +## データ挿入API + +### insert(String tableName, InputStream data, ClickHouseFormat format) + +指定されたフォーマットでエンコードされたバイトの`InputStream`としてデータを受け入れます。`data`が`format`でエンコードされていることが期待されます。 + +**シグネチャ** + +```java +CompletableFuture insert(String tableName, InputStream data, ClickHouseFormat format, InsertSettings settings) +CompletableFuture insert(String tableName, InputStream data, ClickHouseFormat format) +``` + +**パラメータ** + +`tableName` - 対象テーブル名。 + +`data` - エンコードされたデータの入力ストリーム。 + +`format` - データがエンコードされた形式。 + +`settings` - リクエスト設定。 + +**戻り値** + +`InsertResponse`型のFuture - 操作結果とサーバサイドのメトリクスなどの追加情報。 + +**例** + +```java showLineNumbers +try (InputStream dataStream = getDataStream()) { + try (InsertResponse response = client.insert(TABLE_NAME, dataStream, ClickHouseFormat.JSONEachRow, + insertSettings).get(3, TimeUnit.SECONDS)) { + + log.info("Insert finished: {} rows written", response.getMetrics().getMetric(ServerMetrics.NUM_ROWS_WRITTEN).getLong()); + } catch (Exception e) { + log.error("Failed to write JSONEachRow data", e); + throw new RuntimeException(e); + } +} + +``` + +### insert(String tableName, List data, InsertSettings settings) + +データベースに書き込みリクエストを送信します。オブジェクトのリストは効率的な形式に変換され、その後サーバーに送信されます。リストアイテムのクラスは、事前に`register(Class, TableSchema)`メソッドを使用して登録する必要があります。 + +**シグネチャ** +```java +client.insert(String tableName, List data, InsertSettings settings) +client.insert(String tableName, List data) +``` + +**パラメータ** + +`tableName` - 対象のテーブル名。 + +`data` - DTO (Data Transfer Object) オブジェクトのコレクション。 + +`settings` - リクエスト設定。 + +**戻り値** + +`InsertResponse`型のFuture - 操作結果とサーバサイドのメトリクスなどの追加情報。 + +**例** + +```java showLineNumbers +// 重要なステップ(1回だけ実行):テーブルスキーマに従ってオブジェクトシリアライザを事前コンパイルするためにクラスを登録。 +client.register(ArticleViewEvent.class, client.getTableSchema(TABLE_NAME)); + + +List events = loadBatch(); + +try (InsertResponse response = client.insert(TABLE_NAME, events).get()) { + // 応答を処理し、リクエストをサーブした後に閉じられ、接続が解放されます。 +} +``` + +### InsertSettings + +挿入操作のための設定オプション。 + +**設定メソッド** + +
    +
    setQueryId(String queryId)
    +
    操作に割り当てられるクエリIDを設定します
    + +
    setDeduplicationToken(String token)
    +
    重複除外トークンを設定します。このトークンはサーバーに送信され、クエリを識別するために使用されます。
    + +
    waitEndOfQuery(Boolean waitEndOfQuery)
    +
    クエリの終了を待ってから応答を送信するようサーバーにリクエストします。
    + +
    setInputStreamCopyBufferSize(int size)
    +
    コピー時のバッファサイズ。ユーザー提供の入力ストリームから出力ストリームへの書き込み操作中に使用されるバッファです。
    +
    + +### InsertResponse + +挿入操作の結果を保持する応答オブジェクトです。このオブジェクトはサーバーから応答を受け取った場合にのみ利用可能です。 + +:::note +このオブジェクトは、前の応答のデータがすべて読み取られるまで接続が再利用できないため、できるだけ早く閉じて接続を解放する必要があります。 +::: + +
    +
    OperationMetrics getMetrics()
    +
    操作メトリクスを含むオブジェクトを返します
    +
    String getQueryId()
    +
    アプリケーションによって操作に割り当てられたクエリ ID(操作設定またはサーバーによって)を返します。
    +
    + +## クエリAPI + +### query(String sqlQuery) + +`sqlQuery`をそのまま送信します。応答フォーマットはクエリ設定によって設定されます。`QueryResponse`は、対応するフォーマットのリーダーが消費すべき応答ストリームへの参照を保持します。 + +**シグネチャ** + +```java +CompletableFuture query(String sqlQuery, QuerySettings settings) +CompletableFuture query(String sqlQuery) +``` + +**パラメータ** + +`sqlQuery` - 単一のSQLステートメント。クエリはそのままサーバーに送信されます。 + +`settings` - リクエスト設定。 + +**戻り値** + +`QueryResponse`型のFuture - 結果データセットとサーバサイドのメトリクスなどの追加情報を含みます。データセットを消費した後に応答オブジェクトを閉じる必要があります。 + +**例** + +```java +final String sql = "select * from " + TABLE_NAME + " where title <> '' limit 10"; + +// デフォルトフォーマットはRowBinaryWithNamesAndTypesFormatReaderであるため、リーダーはすべてのカラム情報を持っています +try (QueryResponse response = client.query(sql).get(3, TimeUnit.SECONDS);) { + + // データに便利にアクセスするためのリーダーを作成 + ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(response); + + while (reader.hasNext()) { + reader.next(); // ストリームから次のレコードを読み取り、解析する + + // 値を取得 + double id = reader.getDouble("id"); + String title = reader.getString("title"); + String url = reader.getString("url"); + + // データを収集 + } +} catch (Exception e) { + log.error("Failed to read data", e); +} + +// ビジネスロジックは可能な限り早くHTTP接続を解放するように、読取りブロックの外に置いてください。 +``` + +### query(String sqlQuery, Map queryParams, QuerySettings settings) + +`sqlQuery`をそのまま送信します。さらに、クエリパラメータを送信し、サーバーがSQL式をコンパイルできるようにします。 + +**シグネチャ** +```java +CompletableFuture query(String sqlQuery, Map queryParams, QuerySettings settings) +``` + +**パラメータ** + +`sqlQuery` - `{}`を含むSQL式。 + +`queryParams` - サーバーでSQL式を完成させるための変数のマップ。 + +`settings` - リクエスト設定。 + +**戻り値** + +`QueryResponse`型のFuture - 結果データセットとサーバサイドのメトリクスなどの追加情報を含みます。データセットを消費した後に応答オブジェクトを閉じる必要があります。 + +**例** + +```java showLineNumbers + +// パラメータを定義。それらはリクエストと一緒にサーバーに送信されます。 +Map queryParams = new HashMap<>(); +queryParams.put("param1", 2); + +try (QueryResponse queryResponse = + client.query("SELECT * FROM " + table + " WHERE col1 >= {param1:UInt32}", queryParams, new QuerySettings()).get()) { + + // データに便利にアクセスするためのリーダーを作成 + ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(response); + + while (reader.hasNext()) { + reader.next(); // ストリームから次のレコードを読み取り、解析する + + // データを読み取る + } + +} catch (Exception e) { + log.error("Failed to read data", e); +} + +``` + +### queryAll(String sqlQuery) + +`RowBinaryWithNamesAndTypes`形式でデータをクエリします。結果をコレクションとして返します。読み取りパフォーマンスはリーダーと同じですが、全データセットを保持するためにはより多くのメモリが必要です。 + +**シグネチャ** +```java +List queryAll(String sqlQuery) +``` + +**パラメータ** + +`sqlQuery` - サーバーからデータをクエリするためのSQL式。 + +**戻り値** + +結果データを行スタイルでアクセスするために`GenericRecord`オブジェクトのリストで表現された完全なデータセットを返します。 + +**例** + +```java showLineNumbers +try { + log.info("テーブル全体を読み取り、レコードごとに処理中"); + final String sql = "select * from " + TABLE_NAME + " where title <> ''"; + + // 完全な結果セットを読み取り、レコードごとに処理 + client.queryAll(sql).forEach(row -> { + double id = row.getDouble("id"); + String title = row.getString("title"); + String url = row.getString("url"); + + log.info("id: {}, title: {}, url: {}", id, title, url); + }); +} catch (Exception e) { + log.error("Failed to read data", e); +} +``` + +### QuerySettings + +クエリ操作のための設定オプション。 + +**設定メソッド** + +
    +
    setQueryId(String queryId)
    +
    操作に割り当てられるクエリIDを設定します
    +
    setFormat(ClickHouseFormat format)
    +
    応答フォーマットを設定します。完全なリストは`RowBinaryWithNamesAndTypes`を参照してください。
    +
    setMaxExecutionTime(Integer maxExecutionTime)
    +
    サーバーでの操作実行時間を設定します。読み取りタイムアウトには影響しません。
    +
    waitEndOfQuery(Boolean waitEndOfQuery)
    +
    クエリの終了を待ってから応答を送信するようサーバーにリクエストします。
    +
    setUseServerTimeZone(Boolean useServerTimeZone)
    +
    サーバーのタイムゾーン(クライアント設定を参照)が、操作の結果の日時型を解析するために使用されます。デフォルト`false`
    +
    setUseTimeZone(String timeZone)
    +
    時間の変換のためにサーバーに`timeZone`を使用するよう要求します。session_timezoneを参照してください。
    +
    + +### QueryResponse + +クエリ実行の結果を保持する応答オブジェクトです。このオブジェクトはサーバーからの応答を受け取った場合にのみ利用可能です。 + +:::note +このオブジェクトは、前の応答のデータが完全に読み込まれるまで接続を再利用できないため、できるだけ早く閉じて接続を解放する必要があります。 +::: + +
    +
    ClickHouseFormat getFormat()
    +
    応答のデータがエンコードされているフォーマットを返します。
    +
    InputStream getInputStream()
    +
    指定された形式での非圧縮バイトストリームを返します。
    +
    OperationMetrics getMetrics()
    +
    操作メトリクスを含むオブジェクトを返します
    +
    String getQueryId()
    +
    アプリケーションによって操作に割り当てられたクエリ ID(操作設定またはサーバーによって)を返します。
    +
    TimeZone getTimeZone()
    +
    応答でのDate/DateTime型を処理するために使用するタイムゾーンを返します。
    +
    + +### 例 + +- [リポジトリ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client-v2)に例コードがあります +- 見本のSpring Service [実装](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/demo-service) + +## 共通API + +### getTableSchema(String table) + +`table`のスキーマを取得します。 + +**シグネチャ** + +```java +TableSchema getTableSchema(String table) +TableSchema getTableSchema(String table, String database) +``` + +**パラメータ** + +`table` - スキーマデータを取得するためのテーブル名。 + +`database` - 対象のテーブルが定義されているデータベース。 + +**戻り値** + +テーブルカラムのリストを持つ`TableSchema`オブジェクトを返します。 + +### getTableSchemaFromQuery(String sql) + +SQLステートメントからスキーマを取得します。 + +**シグネチャ** + +```java +TableSchema getTableSchemaFromQuery(String sql) +``` + +**パラメータ** + +`sql` - スキーマを返すべき"SELECT" SQLステートメント。 + +**戻り値** + +`sql`式に一致するカラムを持つ`TableSchema`オブジェクトを返します。 + +### TableSchema + +### register(Class clazz, TableSchema schema) + +Javaクラス用に書き込み/読み込みデータとするSerDeレイヤーをコンパイルします。このメソッドは、ゲッター/セッターペアと対応するカラムのためにシリアライザとデシリアライザを作成します。 +カラムの一致はメソッド名からその名前を抽出することで見つけられます。例えば、`getFirstName`はカラム `first_name`または`firstname`に対応します。 + +**シグネチャ** + +```java +void register(Class clazz, TableSchema schema) +``` + +**パラメータ** + +`clazz` - データの読み書きに使用されるPOJOを表すクラス。 + +`schema` - POJOプロパティと一致させるためのデータスキーマ。 + +**例** + +```java showLineNumbers +client.register(ArticleViewEvent.class, client.getTableSchema(TABLE_NAME)); +``` + +## 使用例 + +完全な例のコードは、 `example` [フォルダ](https://github.com/ClickHouse/clickhouse-java/tree/main/examples)にリポジトリ内に保存されています: + +- [client-v2](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/client-v2) - 主な例のセット。 +- [demo-service](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/demo-service) - Spring Bootアプリケーションでクライアントを使用する方法の例。 +- [demo-kotlin-service](https://github.com/ClickHouse/clickhouse-java/tree/main/examples/demo-kotlin-service) - Ktor (Kotlin) アプリケーションでクライアントを使用する方法の例。 diff --git a/docs/ja/integrations/language-clients/java/index.md b/docs/ja/integrations/language-clients/java/index.md new file mode 100644 index 00000000000..d44b004fa6c --- /dev/null +++ b/docs/ja/integrations/language-clients/java/index.md @@ -0,0 +1,119 @@ +--- +sidebar_label: Java +sidebar_position: 1 +keywords: [clickhouse, java, jdbc, client, integrate, r2dbc] +description: Java から ClickHouse への接続オプション +slug: /ja/integrations/java +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# Java クライアント概要 + +- [Client-V2](./client-v2.md) +- [Client-V1 (旧版)](./client-v1.md) +- [JDBC ドライバー](./jdbc-driver.md) +- [R2DBC ドライバー](./r2dbc.md) + +## ClickHouse クライアント + +Java クライアントは、ClickHouse サーバーとのネットワーク通信の詳細を抽象化する独自の API を実装するライブラリです。現在、HTTP インターフェースのみサポートされています。このライブラリは、様々な ClickHouse フォーマットおよび関連する機能を扱うためのユーティリティを提供します。 + +Java クライアントは 2015 年に開発されました。そのコードベースは非常に維持しにくく、API は混乱し、これ以上最適化するのが難しくなりました。そのため、2024 年に新しいコンポーネント `client-v2` へのリファクタリングを行いました。これには、明確な API、より軽量なコードベース、パフォーマンスの向上、より良い ClickHouse フォーマットサポート(主に RowBinary と Native)が含まれます。JDBC は近い将来このクライアントを使用する予定です。 + +### サポートされているデータタイプ + +|**データタイプ** |**Client V2 サポート**|**Client V1 サポート**| +|-----------------------|----------------------|----------------------| +|Int8 |✔ |✔ | +|Int16 |✔ |✔ | +|Int32 |✔ |✔ | +|Int64 |✔ |✔ | +|Int128 |✔ |✔ | +|Int256 |✔ |✔ | +|UInt8 |✔ |✔ | +|UInt16 |✔ |✔ | +|UInt32 |✔ |✔ | +|UInt64 |✔ |✔ | +|UInt128 |✔ |✔ | +|UInt256 |✔ |✔ | +|Float32 |✔ |✔ | +|Float64 |✔ |✔ | +|Decimal |✔ |✔ | +|Decimal32 |✔ |✔ | +|Decimal64 |✔ |✔ | +|Decimal128 |✔ |✔ | +|Decimal256 |✔ |✔ | +|Bool |✔ |✔ | +|String |✔ |✔ | +|FixedString |✔ |✔ | +|Nullable |✔ |✔ | +|Date |✔ |✔ | +|Date32 |✔ |✔ | +|DateTime |✔ |✔ | +|DateTime32 |✔ |✔ | +|DateTime64 |✔ |✔ | +|Interval |✗ |✗ | +|Enum |✔ |✔ | +|Enum8 |✔ |✔ | +|Enum16 |✔ |✔ | +|Array |✔ |✔ | +|Map |✔ |✔ | +|Nested |✔ |✔ | +|Tuple |✔ |✔ | +|UUID |✔ |✔ | +|IPv4 |✔ |✔ | +|IPv6 |✔ |✔ | +|Object |✗ |✔ | +|Point |✔ |✔ | +|Nothing |✔ |✔ | +|MultiPolygon |✔ |✔ | +|Ring |✔ |✔ | +|Polygon |✔ |✔ | +|SimpleAggregateFunction|✔ |✔ | +|AggregateFunction |✗ |✔ | + +[ClickHouse データタイプ](/docs/ja/sql-reference/data-types) + +:::note +- AggregatedFunction - :warning: `SELECT * FROM table ...` はサポートされていません +- Decimal - 一貫性のために 21.9+ で `SET output_format_decimal_trailing_zeros=1` を使用 +- Enum - 文字列および整数の両方として扱うことができます +- UInt64 - client-v1 では `long` にマッピングされます +::: + +### 機能 + +クライアントの機能の表: + +| 名称 | Client V2 | Client V1 | コメント | +|----------------------------------------------|:---------:|:---------:|:---------:| +| Http 接続 |✔ |✔ | | +| Http 圧縮(LZ4) |✔ |✔ | | +| サーバー応答の圧縮 - LZ4 |✔ |✔ | | +| クライアント要求の圧縮 - LZ4 |✔ |✔ | | +| HTTPs |✔ |✔ | | +| クライアント SSL 証明書 (mTLS) |✔ |✔ | | +| Http プロキシ |✔ |✔ | | +| POJO シリアライズ・デシリアライズ |✔ |✗ | | +| コネクションプール |✔ |✔ | Apache HTTP クライアントを使用する場合 | +| 名前付きパラメータ |✔ |✔ | | +| 失敗時のリトライ |✔ |✔ | | +| フェイルオーバー |✗ |✔ | | +| ロードバランシング |✗ |✔ | | +| サーバー自動検出 |✗ |✔ | | +| ログコメント |✗ |✔ | | +| セッションロール |✗ |✔ | V2 で導入予定 | +| SSL クライアント認証 |✗ |✔ | V2 で導入予定 | +| セッションタイムゾーン |✔ |✔ | | + +JDBC ドライバーは、基盤となるクライアント実装と同様の機能を継承します。他の JDBC の機能はその [ページ](/docs/ja/integrations/java/jdbc-driver#features) に記載されています。 + +### 互換性 + +- このリポジトリ内のすべてのプロジェクトは、すべての [アクティブな LTS バージョン](https://github.com/ClickHouse/ClickHouse/pulls?q=is%3Aopen+is%3Apr+label%3Arelease) の ClickHouse でテストされています。 +- [サポートポリシー](https://github.com/ClickHouse/ClickHouse/blob/master/SECURITY.md#security-change-log-and-support) +- セキュリティ修正や新たな改善を逃さないよう、クライアントを継続的にアップグレードすることをお勧めします +- v2 API への移行で問題がある場合は、[問題を作成](https://github.com/ClickHouse/clickhouse-java/issues/new?assignees=&labels=v2-feedback&projects=&template=v2-feedback.md&title=) していただければ対応します! diff --git a/docs/ja/integrations/language-clients/java/jdbc-driver.md b/docs/ja/integrations/language-clients/java/jdbc-driver.md new file mode 100644 index 00000000000..03b1515784d --- /dev/null +++ b/docs/ja/integrations/language-clients/java/jdbc-driver.md @@ -0,0 +1,401 @@ +--- +sidebar_label: JDBC ドライバー +sidebar_position: 4 +keywords: [clickhouse, java, jdbc, ドライバー, 統合] +description: ClickHouse JDBC ドライバー +slug: /ja/integrations/java/jdbc-driver +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + + +# JDBC ドライバー + +`clickhouse-jdbc` は標準の JDBC インターフェースを実装しています。[clickhouse-client](/docs/ja/integrations/clickhouse-client-local.md) の上に構築されており、カスタムタイプマッピング、トランザクションサポート、標準的な同期 `UPDATE` および `DELETE` 文などの追加機能を提供します。これにより、レガシーアプリケーションやツールでも簡単に使用できます。 + +:::note +最新の JDBC (0.6.5) バージョンは Client-V1 を使用しています +::: + +`clickhouse-jdbc` API は同期的であり、一般により大きなオーバーヘッド(例:SQL パース、タイプマッピング/変換など)があります。パフォーマンスが重要な場合や、ClickHouse へのより直接的なアクセスを好む場合は、[clickhouse-client](/docs/ja/integrations/clickhouse-client-local.md) の使用を検討してください。 + +## 環境要件 + +- [OpenJDK](https://openjdk.java.net) バージョン >= 8 + + +### セットアップ + + + + +```xml + + + com.clickhouse + clickhouse-jdbc + 0.6.5 + + all + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc +// すべての依存関係を含む uber jar を使用し、より小さい jar のために分類子を http に変更 +implementation("com.clickhouse:clickhouse-jdbc:0.6.5:all") +``` + + + +```groovy +// https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc +// すべての依存関係を含む uber jar を使用し、より小さい jar のために分類子を http に変更 +implementation 'com.clickhouse:clickhouse-jdbc:0.6.5:all' +``` + + + + +バージョン `0.5.0` 以降、Apache HTTP クライアントを使用して Client がパックされています。パッケージに共有バージョンがないため、依存関係としてロガーを追加する必要があります。 + + + + +```xml + + + org.slf4j + slf4j-api + 2.0.16 + +``` + + + + +```kotlin +// https://mvnrepository.com/artifact/org.slf4j/slf4j-api +implementation("org.slf4j:slf4j-api:2.0.16") +``` + + + +```groovy +// https://mvnrepository.com/artifact/org.slf4j/slf4j-api +implementation 'org.slf4j:slf4j-api:2.0.16' +``` + + + + +## 設定 + +**ドライバークラス**: `com.clickhouse.jdbc.ClickHouseDriver` + +**URL 構文**: `jdbc:(ch|clickhouse)[:]://endpoint1[,endpoint2,...][/][?param1=value1¶m2=value2][#tag1,tag2,...]`, 例: + +- `jdbc:ch://localhost` は `jdbc:clickhouse:http://localhost:8123` と同じです +- `jdbc:ch:https://localhost` は `jdbc:clickhouse:http://localhost:8443?ssl=true&sslmode=STRICT` と同じです +- `jdbc:ch:grpc://localhost` は `jdbc:clickhouse:grpc://localhost:9100` と同じです + +**接続プロパティ**: + +| プロパティ | デフォルト | 説明 | +| ------------------------ | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| continueBatchOnError | `false` | エラーが発生したときにバッチ処理を続行するかどうか | +| createDatabaseIfNotExist | `false` | データベースが存在しない場合に作成するかどうか | +| custom_http_headers | | カンマ区切りのカスタム HTTP ヘッダー、例: `User-Agent=client1,X-Gateway-Id=123` | +| custom_http_params | | カンマ区切りのカスタム HTTP クエリパラメータ、例: `extremes=0,max_result_rows=100` | +| nullAsDefault | `0` | `0` - null 値をそのまま扱い、null 値を非null カラムに挿入する際に例外を投げる; `1` - null 値をそのまま扱い、挿入時のnull チェックを無効にする; `2` - クエリおよび挿入の両方でnull を対応するデータタイプのデフォルト値に置き換える | +| jdbcCompliance | `true` | 標準の同期UPDATE/DELETE およびフェイクトランザクションをサポートするかどうか | +| typeMappings | | ClickHouse データタイプと Java クラスとのマッピングをカスタマイズし、[getColumnType()](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSetMetaData.html#getColumnType-int-) および [getObject(Class)](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-java.lang.String-java.lang.Class-) の結果に影響します。例: `UInt128=java.lang.String,UInt256=java.lang.String` | +| wrapperObject | `false` | [getObject()](https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getObject-int-) がArray /Tuple に対して java.sql.Array / java.sql.Struct を返すかどうか | + +注: 詳細は [JDBC specific configuration](https://github.com/ClickHouse/clickhouse-java/blob/main/clickhouse-jdbc/src/main/java/com/clickhouse/jdbc/JdbcConfig.java) を参照してください。 + +## サポートされているデータタイプ + +JDBC ドライバーはクライアントライブラリと同じデータフォーマットをサポートしています。 + +:::note +- AggregatedFunction - :warning: `SELECT * FROM table ...` はサポートされていません +- Decimal - 一貫性のために 21.9+ で `SET output_format_decimal_trailing_zeros=1` +- Enum - 文字列と整数の両方として扱われることができます +- UInt64 - `long` にマップされます (client-v1 では) +::: + +## 接続を作成する + +```java +String url = "jdbc:ch://my-server/system"; // デフォルトで http プロトコルとポート 8123 を使用 + +Properties properties = new Properties(); + +ClickHouseDataSource dataSource = new ClickHouseDataSource(url, properties); +try (Connection conn = dataSource.getConnection("default", "password"); + Statement stmt = conn.createStatement()) { +} +``` + +## シンプルなステートメント + +```java showLineNumbers + +try (Connection conn = dataSource.getConnection(...); + Statement stmt = conn.createStatement()) { + ResultSet rs = stmt.executeQuery("select * from numbers(50000)"); + while(rs.next()) { + // ... + } +} +``` + +## 挿入 + +:::note +- `PreparedStatement` を `Statement` の代わりに使用してください +::: + +使用は簡単ですが、入力関数(下記参照)と比較してパフォーマンスが遅くなります: + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement("insert into mytable(* except (description))")) { + ps.setString(1, "test"); // id + ps.setObject(2, LocalDateTime.now()); // タイムスタンプ + ps.addBatch(); // パラメータはバイナリ形式でバッファされたストリームに即座に書き込まれます + ... + ps.executeBatch(); // 手元のすべてをストリームして ClickHouse に送信します +} +``` + +### 入力テーブル関数を使用 + +優れたパフォーマンス特性を持つオプション: + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement( + "insert into mytable select col1, col2 from input('col1 String, col2 DateTime64(3), col3 Int32')")) { + // カラム定義が解析され、ドライバーは 3 つのパラメータがあることを知ります: col1, col2 および col3 + ps.setString(1, "test"); // col1 + ps.setObject(2, LocalDateTime.now()); // col2, setTimestamp は遅いので推奨されません + ps.setInt(3, 123); // col3 + ps.addBatch(); // パラメータはバイナリ形式でバッファーされたストリームに即座に書き込まれます + ... + ps.executeBatch(); // 手元のすべてをストリームして ClickHouse に送信します +} +``` +- 可能な限り [入力関数ドキュメント](/ja/sql-reference/table-functions/input/) を参照してください + +### プレースホルダを使用した挿入 + +このオプションは、クライアント側で解析される長い SQL 式が必要になるため、小さな挿入の場合にのみ推奨されます: + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement("insert into mytable values(trim(?),?,?)")) { + ps.setString(1, "test"); // id + ps.setObject(2, LocalDateTime.now()); // タイムスタンプ + ps.setString(3, null); // description + ps.addBatch(); // クエリにパラメータを追加 + ... + ps.executeBatch(); // 構成されたクエリを発行: insert into mytable values(...)(...)...(...) +} +``` + +## DateTime とタイムゾーンの処理 + +`java.sql.Timestamp` ではなく `java.time.LocalDateTime` または `java.time.OffsetDateTime`、および `java.sql.Date` ではなく `java.time.LocalDate` を使用してください。 + +```java showLineNumbers +try (PreparedStatement ps = conn.prepareStatement("select date_time from mytable where date_time > ?")) { + ps.setObject(2, LocalDateTime.now()); + ResultSet rs = ps.executeQuery(); + while(rs.next()) { + LocalDateTime dateTime = (LocalDateTime) rs.getObject(1); + } + ... +} +``` + +## `AggregateFunction` の処理 + +:::note +現時点では、`groupBitmap` のみがサポートされています。 +::: + +```java showLineNumbers +// 入力関数を使用したバッチ挿入 +try (ClickHouseConnection conn = newConnection(props); + Statement s = conn.createStatement(); + PreparedStatement stmt = conn.prepareStatement( + "insert into test_batch_input select id, name, value from input('id Int32, name Nullable(String), desc Nullable(String), value AggregateFunction(groupBitmap, UInt32)')")) { + s.execute("drop table if exists test_batch_input;" + + "create table test_batch_input(id Int32, name Nullable(String), value AggregateFunction(groupBitmap, UInt32))engine=Memory"); + Object[][] objs = new Object[][] { + new Object[] { 1, "a", "aaaaa", ClickHouseBitmap.wrap(1, 2, 3, 4, 5) }, + new Object[] { 2, "b", null, ClickHouseBitmap.wrap(6, 7, 8, 9, 10) }, + new Object[] { 3, null, "33333", ClickHouseBitmap.wrap(11, 12, 13) } + }; + for (Object[] v : objs) { + stmt.setInt(1, (int) v[0]); + stmt.setString(2, (String) v[1]); + stmt.setString(3, (String) v[2]); + stmt.setObject(4, v[3]); + stmt.addBatch(); + } + int[] results = stmt.executeBatch(); + ... +} + +// クエリパラメータとして bitmap を使用 +try (PreparedStatement stmt = conn.prepareStatement( + "SELECT bitmapContains(my_bitmap, toUInt32(1)) as v1, bitmapContains(my_bitmap, toUInt32(2)) as v2 from {tt 'ext_table'}")) { + stmt.setObject(1, ClickHouseExternalTable.builder().name("ext_table") + .columns("my_bitmap AggregateFunction(groupBitmap,UInt32)").format(ClickHouseFormat.RowBinary) + .content(new ByteArrayInputStream(ClickHouseBitmap.wrap(1, 3, 5).toBytes())) + .asTempTable() + .build()); + ResultSet rs = stmt.executeQuery(); + Assert.assertTrue(rs.next()); + Assert.assertEquals(rs.getInt(1), 1); + Assert.assertEquals(rs.getInt(2), 0); + Assert.assertFalse(rs.next()); +} +``` + +
    + +## HTTP ライブラリの設定 + +ClickHouse JDBC コネクターは、[HttpClient](https://docs.oracle.com/en/java/javase/11/docs/api/java.net.http/java/net/http/HttpClient.html)、[HttpURLConnection](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/HttpURLConnection.html)、[Apache HttpClient](https://hc.apache.org/httpcomponents-client-5.2.x/) の3つの HTTP ライブラリをサポートしています。 + +:::note +HttpClient は JDK 11 以上でのみサポートされています。 +::: + +JDBC ドライバーは、デフォルトで `HttpClient` を使用します。ClickHouse JDBC コネクターで使用する HTTP ライブラリを変更するには、次のプロパティを設定します。 + +```java +properties.setProperty("http_connection_provider", "APACHE_HTTP_CLIENT"); +``` + +対応する値の完全なリストは次の通りです: + +| プロパティ値 | HTTP ライブラリ | +| ------------------- | ----------------- | +| HTTP_CLIENT | HTTPClient | +| HTTP_URL_CONNECTION | HttpURLConnection | +| APACHE_HTTP_CLIENT | Apache HttpClient | + +
    + +## SSL を使用して ClickHouse に接続する + +SSL を用いて ClickHouse にセキュアに JDBC で接続するには、SSL パラメータを含むように JDBC プロパティを設定する必要があります。これは通常、JDBC URL またはプロパティオブジェクトに `sslmode` や `sslrootcert` などの SSL プロパティを指定することを含みます。 + +## SSL プロパティ + +| 名称 | デフォルト値 | オプション値 | 説明 | +| ------------------ | ------------- | --------------- | ---------------------------------------------------------------------------- | +| ssl | false | true, false | 接続で SSL/TLS を有効にするかどうか | +| sslmode | strict | strict, none | SSL/TLS 証明書を確認するかどうか | +| sslrootcert | | | SSL/TLS ルート証明書のパス | +| sslcert | | | SSL/TLS 証明書のパス | +| sslkey | | | PKCS#8 フォーマットの RSA キー | +| key_store_type | | JKS, PKCS12 | キーストア/トラストストアファイルのタイプまたはフォーマットを指定 | +| trust_store | | | トラストストアファイルのパス | +| key_store_password | | | キーストア設定で指定されたファイルにアクセスするためのパスワード | + +これらのプロパティは、Java アプリケーションが ClickHouse サーバーと暗号化された接続で通信し、データ転送中のセキュリティを強化します。 + +```java showLineNumbers + String url = "jdbc:ch://your-server:8443/system"; + + Properties properties = new Properties(); + properties.setProperty("ssl", "true"); + properties.setProperty("sslmode", "strict"); // NONE はすべてのサーバーを信用し、STRICT は信頼できるもののみ + properties.setProperty("sslrootcert", "/mine.crt"); + try (Connection con = DriverManager + .getConnection(url, properties)) { + + try (PreparedStatement stmt = con.prepareStatement( + + // ここにコードを記述 + + } + } +``` + +## 大規模挿入時の JDBC タイムアウトの解決 + +ClickHouse で実行時間の長い大規模挿入を行う場合、以下のような JDBC タイムアウトエラーに遭遇することがあります: + +```plaintext +Caused by: java.sql.SQLException: Read timed out, server myHostname [uri=https://hostname.aws.clickhouse.cloud:8443] +``` + +これらのエラーはデータ挿入プロセスを妨げ、システムの安定性に影響を与える可能性があります。この問題を解決するには、クライアントの OS のいくつかのタイムアウト設定を調整する必要があります。 + +### Mac OS + +Mac OS では、次の設定を調整して問題を解決できます: + +- `net.inet.tcp.keepidle`: 60000 +- `net.inet.tcp.keepintvl`: 45000 +- `net.inet.tcp.keepinit`: 45000 +- `net.inet.tcp.keepcnt`: 8 +- `net.inet.tcp.always_keepalive`: 1 + +### Linux + +Linux では、同等の設定だけでは問題が解決しない場合があります。ソケットのキープアライブ設定を扱う方法が異なるため、追加の手順が必要です。次の手順に従ってください: + +1. `/etc/sysctl.conf` や関連する設定ファイルで次の Linux カーネルパラメータを調整します: + + - `net.inet.tcp.keepidle`: 60000 + - `net.inet.tcp.keepintvl`: 45000 + - `net.inet.tcp.keepinit`: 45000 + - `net.inet.tcp.keepcnt`: 8 + - `net.inet.tcp.always_keepalive`: 1 + - `net.ipv4.tcp_keepalive_intvl`: 75 + - `net.ipv4.tcp_keepalive_probes`: 9 + - `net.ipv4.tcp_keepalive_time`: 60 (デフォルトの300秒からこの値を下げることを検討してください) + +2. カーネルパラメータを変更した後、次のコマンドを実行して変更を適用します: + + ```shell + sudo sysctl -p + ``` + +これらの設定を行った後、クライアントがソケットのキープアライブオプションを有効にしていることを確認する必要があります: + +```java +properties.setProperty("socket_keepalive", "true"); +``` + +:::note +現在、`clickhouse-java` によってサポートされている他の 2 つの HTTP クライアントライブラリでは、ソケットオプションの設定が許可されていないため、ソケットのキープアライブを設定する際は Apache HTTP クライアントライブラリを使用する必要があります。詳しくは [HTTP ライブラリの設定](/docs/ja/integrations/java#configuring-http-library) を参照してください。 +::: + +また、JDBC URL に同等のパラメータを追加することもできます。 + +JDBC ドライバーのデフォルトのソケットおよび接続タイムアウトは 30 秒です。このタイムアウトを大規模データ挿入操作をサポートするために拡大することができます。`ClickHouseClient` で `options` メソッドを使用し、`ClickHouseClientOption` によって定義された `SOCKET_TIMEOUT` および `CONNECTION_TIMEOUT` オプションと共に使用します: + +```java showLineNumbers +final int MS_12H = 12 * 60 * 60 * 1000; // 12 時間(ミリ秒) +final String sql = "insert into table_a (c1, c2, c3) select c1, c2, c3 from table_b;"; + +try (ClickHouseClient client = ClickHouseClient.newInstance(ClickHouseProtocol.HTTP)) { + client.read(servers).write() + .option(ClickHouseClientOption.SOCKET_TIMEOUT, MS_12H) + .option(ClickHouseClientOption.CONNECTION_TIMEOUT, MS_12H) + .query(sql) + .executeAndWait(); +} +``` + diff --git a/docs/ja/integrations/language-clients/java/r2dbc.md b/docs/ja/integrations/language-clients/java/r2dbc.md new file mode 100644 index 00000000000..043ed26ab06 --- /dev/null +++ b/docs/ja/integrations/language-clients/java/r2dbc.md @@ -0,0 +1,77 @@ +--- +sidebar_label: R2DBC Driver +sidebar_position: 5 +keywords: [clickhouse, java, driver, integrate, r2dbc] +description: ClickHouse R2DBC Driver +slug: /ja/integrations/java/r2dbc +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +## R2DBC ドライバー + +[R2DBC](https://r2dbc.io/) は、ClickHouse 向けの非同期 Java クライアントのラッパーです。 + +### 環境要件 + +- [OpenJDK](https://openjdk.java.net) バージョン >= 8 + +### セットアップ + +```xml + + com.clickhouse + + clickhouse-r2dbc + 0.6.5 + + all + + + * + * + + + +``` + +### ClickHouse に接続 + +```java showLineNumbers +ConnectionFactory connectionFactory = ConnectionFactories + .get("r2dbc:clickhouse:http://{username}:{password}@{host}:{port}/{database}"); + + Mono.from(connectionFactory.create()) + .flatMapMany(connection -> connection +``` + +### クエリ + +```java showLineNumbers +connection + .createStatement("select domain, path, toDate(cdate) as d, count(1) as count from clickdb.clicks where domain = :domain group by domain, path, d") + .bind("domain", domain) + .execute() + .flatMap(result -> result + .map((row, rowMetadata) -> String.format("%s%s[%s]:%d", row.get("domain", String.class), + row.get("path", String.class), + row.get("d", LocalDate.class), + row.get("count", Long.class))) + ) + .doOnNext(System.out::println) + .subscribe(); +``` + +### インサート + +```java showLineNumbers +connection + .createStatement("insert into clickdb.clicks values (:domain, :path, :cdate, :count)") + .bind("domain", click.getDomain()) + .bind("path", click.getPath()) + .bind("cdate", LocalDateTime.now()) + .bind("count", 1) + .execute(); +``` diff --git a/docs/ja/integrations/language-clients/js.md b/docs/ja/integrations/language-clients/js.md new file mode 100644 index 00000000000..8d407a244d2 --- /dev/null +++ b/docs/ja/integrations/language-clients/js.md @@ -0,0 +1,1273 @@ +--- +sidebar_label: JavaScript +sidebar_position: 4 +keywords: [clickhouse, js, javascript, nodejs, web, browser, cloudflare, workers, client, connect, integrate] +slug: /ja/integrations/javascript +description: The official JS client for connecting to ClickHouse. +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ClickHouse JS + +ClickHouseに接続するための公式JSクライアントです。 +クライアントはTypeScriptで書かれており、クライアントの公開APIにタイピングを提供します。 + +依存関係ゼロで、最大限のパフォーマンスを発揮するよう最適化されており、様々なClickHouseのバージョンや構成(オンプレミスのシングルノード、オンプレミスクラスター、ClickHouse Cloud)でテストされています。 + +異なる環境に対応する二つのバージョンのクライアントが提供されています: +- `@clickhouse/client` - Node.js専用 +- `@clickhouse/client-web` - ブラウザ(Chrome/Firefox)、Cloudflare workers対応 + +TypeScriptを使用する際は、[インラインインポートとエクスポート構文](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-5.html#type-modifiers-on-import-names)を有効にするために、少なくとも[バージョン4.5](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-5.html)であることを確認してください。 + +クライアントのソースコードは[ClickHouse-JS GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-js)で確認できます。 + +## 環境要件(Node.js) + +クライアントを実行するためには、Node.jsが環境で利用可能である必要があります。 +クライアントは、すべての[維持されている](https://github.com/nodejs/release#readme)Node.jsリリースと互換性があります。 + +Node.jsのバージョンがEnd-Of-Lifeに近づいた場合、そのバージョンのサポートはクライアントから削除されます。これは古くなり、安全ではないと考えられるためです。 + +現在のNode.jsバージョンのサポート: + +| Node.js version | Supported? | +|-----------------|-------------| +| 22.x | ✔ | +| 20.x | ✔ | +| 18.x | ✔ | +| 16.x | Best effort | + +## 環境要件(Web) + +クライアントのWebバージョンは、最新のChrome/Firefoxブラウザで公式にテストされており、たとえばReact/Vue/AngularアプリケーションやCloudflare workersに依存関係として使用できます。 + +## インストール + +最新の安定版Node.jsクライアントバージョンをインストールするには、次のコマンドを実行します: + +```sh +npm i @clickhouse/client +``` + +Web版のインストール: + +```sh +npm i @clickhouse/client-web +``` + +## ClickHouseとの互換性 + +| Client version | ClickHouse | +|----------------|------------| +| 1.5.0 | 23.3+ | + +クライアントはおそらく古いバージョンでも動作するでしょう。ただし、これはベストエフォートのサポートであり、保証はできません。ClickHouseのバージョンが23.3よりも古い場合、[ClickHouseのセキュリティポリシー](https://github.com/ClickHouse/ClickHouse/blob/master/SECURITY.md)を参照し、アップグレードを検討してください。 + +## 例 + +クライアントリポジトリ内の[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples)でクライアント使用の様々なシナリオをカバーすることを目指しています。 + +概観は[例のREADME](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/README.md#overview)で確認できます。 + +例や以下のドキュメントで不明な点や不足している情報があれば、[お問い合わせ](./js.md#contact-us)ください。 + +# クライアントAPI + +特に明示されていない限り、ほとんどの例はNode.jsとWeb版のクライアントの両方に互換性があります。 + +#### クライアントインスタンスの作成 + +必要に応じて多くのクライアントインスタンスを`createClient`ファクトリで作成できます。 + +```ts +import { createClient } from '@clickhouse/client' // または '@clickhouse/client-web' + +const client = createClient({ + /* configuration */ +}) +``` + +ESMモジュールがサポートされていない環境では、CJS構文を使うこともできます: + +```ts +const { createClient } = require('@clickhouse/client'); + +const client = createClient({ + /* configuration */ +}) +``` + +クライアントインスタンスは、インスタンス化時に[事前設定](./js.md#configuration)することができます。 + +#### 設定 + +クライアントインスタンスを作成する際、以下の接続設定を調整できます: + +- **url?: string** - ClickHouseインスタンスURL。デフォルト値: `http://localhost:8123`。参考: [URL設定ドキュメント](./js.md#url-configuration)。 +- **pathname?: string** - ClickHouse URLに追加するオプションのパス名。デフォルト値: `''`。参考: [パス名付きプロキシドキュメント](./js.md#proxy-with-a-pathname)。 +- **request_timeout?: number** - リクエストタイムアウト(ミリ秒)。デフォルト値: `30_000`。 +- **compression?: { response?: boolean; request?: boolean }** - 圧縮を有効にする。[圧縮ドキュメント](./js.md#compression) +- **username?: string** - リクエストを行うユーザーの名前。デフォルト値: `default`。 +- **password?: string** - ユーザーパスワード。デフォルト: `''`。 +- **application?: string** - Node.jsクライアントを使用するアプリケーションの名前。デフォルト値: `clickhouse-js`。 +- **database?: string** - 使用するデータベース名。デフォルト値: `default` +- **clickhouse_settings?: ClickHouseSettings** - すべてのリクエストに適用されるClickHouse設定。デフォルト値: `{}`。 +- **log?: { LoggerClass?: Logger, level?: ClickHouseLogLevel }** - 内部クライアントログの設定。[ログドキュメント](./js.md#logging-nodejs-only) +- **session_id?: string** - 各リクエストに送信されるオプションのClickHouseセッションID。 +- **keep_alive?: { enabled?: boolean }** - Node.jsおよびWebバージョンでデフォルトで有効。 +- **http_headers?: Record** - ClickHouseリクエストのための追加のHTTPヘッダ。参考: [認証付きリバースプロキシドキュメント](./js.md#reverse-proxy-with-authentication) + +#### Node.js特有の設定パラメータ + +- **max_open_connections?: number** - ホストごとに許可される最大接続ソケット数。デフォルト値: `10`。 +- **tls?: { ca_cert: Buffer, cert?: Buffer, key?: Buffer }** - TLS証明書を設定する。[TLSドキュメント](./js.md#tls-certificates-nodejs-only) +- **keep_alive?: { enabled?: boolean, idle_socket_ttl?: number }** - [Keep Aliveドキュメント](./js.md#keep-alive-configuration-nodejs-only)参照 +- **http_agent?: http.Agent | https.Agent** - (エクスペリメンタル) クライアント用のカスタムHTTPエージェント。[HTTPエージェントドキュメント](./js.md#custom-httphttps-agent-experimental-nodejs-only) +- **set_basic_auth_header?: boolean** - (エクスペリメンタル) ベーシック認証資格情報で`Authorization`ヘッダを設定する。デフォルト値: `true`。参考: [この設定のHTTPエージェントドキュメントでの使用法](./js.md#custom-httphttps-agent-experimental-nodejs-only) + +### URLの設定 + +:::important +URL設定は常にハードコーディングされた値を上書きし、その場合には警告がログに記録されます。 +::: + +クライアントインスタンスパラメータの多くをURLで設定することが可能です。URLのフォーマットは`http[s]://[username:password@]hostname:port[/database][?param1=value1¶m2=value2]`です。ほとんどの場合、特定のパラメータの名前は、設定オプションインターフェース内のそのパスを反映していますが、いくつかの例外があります。サポートされているパラメータは次のとおりです: + +| Parameter | Type | +| ------------------------------------------- | ----------------------------------------------------------------- | +| `pathname` | 任意の文字列。 | +| `application_id` | 任意の文字列。 | +| `session_id` | 任意の文字列。 | +| `request_timeout` | 0以上の数値。 | +| `max_open_connections` | 0より大きい0以上の数値。 | +| `compression_request` | boolean。 詳細は下記参照 [1]。 | +| `compression_response` | boolean。 | +| `log_level` | 許可される値: `OFF`, `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`。 | +| `keep_alive_enabled` | boolean。 | +| `clickhouse_setting_*` や `ch_*` | 以下参照 [2]。 | +| `http_header_*` | 以下参照 [3]。 | +| (Node.jsのみ) `keep_alive_idle_socket_ttl` | 0以上の数値。 | + +[1] boolean の場合、有効な値は `true`/`1` および `false`/`0` になります。 + +[2] `clickhouse_setting_` または `ch_` で始まるパラメータは、この接頭辞が削除され、残りがクライアントの `clickhouse_settings` に追加されます。たとえば、 `?ch_async_insert=1&ch_wait_for_async_insert=1` は次のとおりです: + +```ts +createClient({ + clickhouse_settings: { + async_insert: 1, + wait_for_async_insert: 1, + }, +}) +``` + +注意: `clickhouse_settings` に対するboolean 値はURL内で `1`/`0` として渡されるべきです。 + +[3] [2]と同様ですが、 `http_header` 設定用です。たとえば、 `?http_header_x-clickhouse-auth=foobar` は次のように等価です: + +```ts +createClient({ + http_headers: { + 'x-clickhouse-auth': 'foobar', + }, +}) +``` + +### 接続 + +#### 接続詳細を収集 + + + +#### 接続概観 + +クライアントはHTTP(s)プロトコル経由で接続を実装しています。RowBinaryのサポートは進行中です。[関連issue](https://github.com/ClickHouse/clickhouse-js/issues/216)を参照してください。 + +以下の例は、ClickHouse Cloudに対する接続を設定する方法を示しています。`host`(プロトコルとポートを含む)と`password`の値が環境変数で指定され、`default`ユーザーが使用されているものとします。 + +**例:** 環境変数を使用してNode.jsクライアントインスタンスを作成する。 + +```ts +import { createClient } from '@clickhouse/client' + +const client = createClient({ + host: process.env.CLICKHOUSE_HOST ?? 'http://localhost:8123', + username: process.env.CLICKHOUSE_USER ?? 'default', + password: process.env.CLICKHOUSE_PASSWORD ?? '', +}) +``` + +クライアントリポジトリには、環境変数を使用する複数の例が含まれています。たとえば、[ClickHouse Cloudでテーブルを作成する](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/create_table_cloud.ts)、[非同期インサートを使う](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/async_insert.ts)など、他にも多くの例があります。 + +#### コネクションプール(Node.jsのみ) + +リクエストごとに接続を確立するオーバーヘッドを避けるために、クライアントはClickHouseへの接続プールを作成し、Keep-Aliveメカニズムを利用して再利用します。デフォルトでKeep-Aliveが有効で、接続プールのサイズは `10` に設定されていますが、`max_open_connections` [設定オプション](./js.md#configuration)で変更することができます。 + +ユーザーが `max_open_connections: 1` を設定しない限り、プール内の同じ接続が後続のクエリに使用される保証はありません。これはまれにしか必要とされませんが、一時的なテーブルを使用するユーザーにとって必要な場合があります。 + +また、[Keep-Alive設定](./js.md#keep-alive-configuration-nodejs-only)も参照してください。 + +### Query ID + +`query`や文を送信するすべてのメソッド(`command`、`exec`、`insert`、`select`)は、結果においてユニークな`query_id`を提供します。この識別子はクライアントがクエリごとに割り当て、`system.query_log`からデータを取得したり、長時間実行されるクエリをキャンセルするために役立ちます([例参照](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/cancel_query.ts))。必要に応じて、`query_id`は`command`/`query`/`exec`/`insert`メソッドのパラメータでユーザーによって上書きできます。 + +:::tip +もし`query_id`パラメータを上書きする場合、各呼び出しに対してそのユニーク性を保証する必要があります。ランダムなUUIDがおすすめです。 +::: + +### すべてのクライアントメソッドの基本パラメータ + +いくつかのパラメータはすべてのクライアントメソッド([query](./js.md#query-method)/[command](./js.md#command-method)/[insert](./js.md#insert-method)/[exec](./js.md#exec-method))に適用できます。 + +```ts +interface BaseQueryParams { + // Queryレベルで適用できるClickHouse設定。 + clickhouse_settings?: ClickHouseSettings + // クエリバインディング用のパラメータ。 + query_params?: Record + // 進行中のクエリをキャンセルするためのAbortSignalインスタンス。 + abort_signal?: AbortSignal + // query_idの上書き;指定されていない場合、ランダムな識別子が自動的に生成されます。 + query_id?: string + // session_idの上書き;指定されていない場合、クライアント設定からセッションIDが取得されます。 + session_id?: string + // 認証情報の上書き;指定されていない場合、クライアントの認証情報が使用されます。 + auth?: { username: string, password: string } +} +``` + +### クエリメソッド + +`SELECT`のような応答を持つ大部分の文、または`CREATE TABLE`のようなDDLを送信するために使用されます。これはアプリケーション内で消費されることを意図した戻り結果セットを伴います。 + +:::note +データ挿入には専用の[insert](./js.md#insert-method)メソッドがあり、DDL用には[command](./js.md#command-method)があります。 +::: + +```ts +interface QueryParams extends BaseQueryParams { + // 実行するクエリで、何らかのデータを返す可能性があります。 + query: string + // 結果データセットのフォーマット。デフォルト: JSON。 + format?: DataFormat +} + +interface ClickHouseClient { + query(params: QueryParams): Promise +} +``` + +「すべてのクライアントメソッドの基本パラメータ」を参照してください。(./js.md#base-parameters-for-all-client-methods)。 + +:::tip +クエリ内にFORMAT句を指定せず、`format`パラメータを使用してください。 +::: + +#### ResultSetとRowの抽象化 + +ResultSetはアプリケーションでのデータ処理に便利なメソッドをいくつか提供します。 + +Node.jsのResultSet実装は内部で`Stream.Readable`を使用し、Web版はWeb APIの`ReadableStream`を使用します。 + +ResultSetを消費するには、`text`または`json`メソッドを呼び出してクエリが返すすべての行をメモリにロードします。 + +同時に、多すぎて一度にメモリに収まらない場合は、`stream`メソッドを呼び出してストリーミングモードでデータを処理出来ます。受け取った各応答チャンクは、特定のチャンクがサーバーからクライアントに送信されるサイズ(これにより個々の行のサイズが決まる)と同程度の比較的小さな配列の行に変換されます。 + +ストリーミング時に最適なフォーマットを決めるための[サポートされているデータフォーマット](./js.md#supported-data-formats)のリストを参照してください。JSONオブジェクトをストリーミングしたい場合は、[JSONEachRow](https://clickhouse.com/docs/ja/sql-reference/formats#jsoneachrow) を選択し、各行がJSオブジェクトとしてパースされます。あるいは、よりコンパクトな[JSONCompactColumns](https://clickhouse.com/docs/ja/sql-reference/formats#jsoncompactcolumns)フォーマットを選択して、各行をコンパクトな値の配列として受け取ることもできます。次に、[ファイルのストリーミング](./js.md#streaming-files-nodejs-only)を参照してください。 + +:::important +ResultSet またはそのストリームが完全に消費されない場合、`request_timeout` の非アクティブ期間の後、破棄されます。 +::: + +```ts +interface BaseResultSet { + // 前述の "Query ID" 部分を参照 + query_id: string + + // ストリーム全体を消費してその内容を文字列として取得 + // どの DataFormat でも使用可能 + // 1回だけ呼び出し + text(): Promise + + // ストリーム全体を消費し、JSオブジェクトとして内容を解析 + // JSON フォーマットのみで使用可能 + // 1回だけ呼び出し + json(): Promise + + // ストリーミングできる応答用にリーダブルストリームを返す + // ストリームの各反復処理では、選択した DataFormat のRow[]の配列を提供 + // 1回だけ呼び出し + stream(): Stream +} + +interface Row { + // 行の内容をプレーン文字列として取得 + text: string + + // 行の内容をJSオブジェクトとして解析する + json(): T +} +``` + +**例:** (Node.js/Web) `JSONEachRow`形式の結果データセットを伴うクエリを実行し、ストリーム全体を消費して内容をJSオブジェクトとして解析します。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/array_json_each_row.ts)。 + +```ts +const resultSet = await client.query({ + query: 'SELECT * FROM my_table', + format: 'JSONEachRow', +}) +const dataset = await resultSet.json() // JSONの解析を避けるために`row.text`を使用することもできます +``` + +**例:** (Node.jsのみ) `on('data')` アプローチを使用した `JSONEachRow` フォーマットによるストリーミングクエリ結果。この方法は `for await const` 構文と交換可能です。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_streaming_json_each_row.ts)。 + +```ts +const rows = await client.query({ + query: 'SELECT number FROM system.numbers_mt LIMIT 5', + format: 'JSONEachRow', // または、JSONCompactEachRow, JSONStringsEachRow など +}) +const stream = rows.stream() +stream.on('data', (rows: Row[]) => { + rows.forEach((row: Row) => { + console.log(row.json()) // JSONの解析を避けるために `row.text`を使用 + }) +}) +await new Promise((resolve, reject) => { + stream.on('end', () => { + console.log('Completed!') + resolve(0) + }) + stream.on('error', reject) +}) +``` + +**例:** (Node.jsのみ) `CSV`フォーマットでストリーミングクエリ結果を取得し、それを `on('data')` アプローチを使用してストリーム送りする。この方法は `for await const` 構文と交換可能です。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_streaming_text_line_by_line.ts) + +```ts +const resultSet = await client.query({ + query: 'SELECT number FROM system.numbers_mt LIMIT 5', + format: 'CSV', // または、TabSeparated, CustomSeparated など +}) +const stream = resultSet.stream() +stream.on('data', (rows: Row[]) => { + rows.forEach((row: Row) => { + console.log(row.text) + }) +}) +await new Promise((resolve, reject) => { + stream.on('end', () => { + console.log('Completed!') + resolve(0) + }) + stream.on('error', reject) +}) +``` + +**例:** (Node.jsのみ) `for await const` 構文を使用して取得した `JSONEachRow` フォーマットのJSオブジェクトとしてストリーミングクエリ結果。 この方法は `on('data')` アプローチと交換可能です。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_streaming_json_each_row_for_await.ts)。 + +```ts +const resultSet = await client.query({ + query: 'SELECT number FROM system.numbers LIMIT 10', + format: 'JSONEachRow', // または、JSONCompactEachRow, JSONStringsEachRow など +}) +for await (const rows of resultSet.stream()) { + rows.forEach(row => { + console.log(row.json()) + }) +} +``` + +:::note +`for await const` 構文は、`on('data')` アプローチに比べてコードが少ないですが、パフォーマンスに負の影響を与える可能性があります。詳細は[Node.jsリポジトリ内のこのissue](https://github.com/nodejs/node/issues/31979)を参照してください。 +::: + +**例:** (Webのみ) `ReadableStream`でのオブジェクトの反復処理。 + +```ts +const resultSet = await client.query({ + query: 'SELECT * FROM system.numbers LIMIT 10', + format: 'JSONEachRow' +}) + +const reader = resultSet.stream().getReader() +while (true) { + const { done, value: rows } = await reader.read() + if (done) { break } + rows.forEach(row => { + console.log(row.json()) + }) +} +``` + +### Insertメソッド + +これはデータ挿入の主要な方法です。 + +```ts +export interface InsertResult { + query_id: string + executed: boolean +} + +interface ClickHouseClient { + insert(params: InsertParams): Promise +} +``` + +戻り値の型は最小限であり、サーバーからのデータを返さないことを前提としており、応答ストリームを直ちにドレインします。 + +空の配列が Insert メソッドに提供された場合、インサート文はサーバーに送信されません。代わりに、`{ query_id: '...', executed: false }`で即座に解決されます。この場合、メソッドパラメータで `query_id` が指定されていない場合、結果は空文字列になります。これは、クエリログテーブルにそのような`query_id`を持つクエリが存在しないため、クライアントが生成したランダムUUIDが混乱を招く可能性があるためです。 + +インサート文がサーバーに送信された場合、`executed` フラグは `true` になります。 + +#### InsertメソッドとNode.jsでのストリーミング + +これは、指定されたデータフォーマットに応じて `Stream.Readable` または単純な `Array` のいずれかで動作します。[サポートされているデータフォーマット](./js.md#supported-data-formats)も参照してください。このセクションについては[ファイルストリーミング](./js.md#streaming-files-nodejs-only)にも関連します。 + +Insertメソッドはawaitされることを前提としています。ただし、入力ストリームを指定し、ストリームが完了した後にのみ`insert`操作をawaitすることが可能です(これにより`insert`プロミスが解決されます)。これは潜在的にイベントリスナーや類似のシナリオで有用ですが、エラーハンドリングはクライアント側で多くのエッジケースに対応するため簡単ではないかもしれません。それよりも、例えばこの[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/async_insert_without_waiting.ts)のように[非同期インサート](https://clickhouse.com/docs/ja/optimize/asynchronous-inserts)を使用することを検討してください。 + +:::tip +カスタムのINSERTステートメントを持っていて、これをこのメソッドでモデル化するのが困難な場合、[command](./js.md#command-method)を使用することを検討してください。[INSERT INTO ... VALUES](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_values_and_functions.ts)や[INSERT INTO ... SELECT](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_from_select.ts)での使用方法を参照してください。 +::: + +```ts +interface InsertParams extends BaseQueryParams { + // データを挿入するテーブル名 + table: string + // 挿入するデータセット。 + values: ReadonlyArray | Stream.Readable + // 挿入するデータセットのフォーマット。 + format?: DataFormat + // データを挿入するカラムを指定できます。 + // - `['a', 'b']` のような配列は: `INSERT INTO table (a, b) FORMAT DataFormat` を生成 + // - `{ except: ['a', 'b']}` のようなオブジェクトは: `INSERT INTO table (* EXCEPT (a, b)) FORMAT DataFormat` を生成 + // デフォルトでは、データはテーブルのすべてのカラムに挿入されます。 + // 生成される文は: `INSERT INTO table FORMAT DataFormat` となります。 + columns?: NonEmptyArray | { except: NonEmptyArray } +} +``` + +また、参照: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +:::important +`abort_signal` でリクエストをキャンセルしても、データ挿入が行われなかったことを保証するものではありません。サーバーはキャンセル前にストリーミングされたデータの一部を受信している可能性があります。 +::: + +**例:** (Node.js/Web) 配列の値を挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/array_json_each_row.ts)。 + +```ts +await client.insert({ + table: 'my_table', + // 構造は望むフォーマットと一致している必要があります。この例では JSONEachRow + values: [ + { id: 42, name: 'foo' }, + { id: 42, name: 'bar' }, + ], + format: 'JSONEachRow', +}) +``` + +**例:** (Node.jsのみ) CSVファイルからストリームを挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_csv.ts)。次に参照: [ファイルストリーミング](./js.md#streaming-files-nodejs-only)。 + +```ts +await client.insert({ + table: 'my_table', + values: fs.createReadStream('./path/to/a/file.csv'), + format: 'CSV', +}) +``` + +**例**: インサート文から特定のカラムを除外する。 + +テーブル定義を仮定して: + +```sql +CREATE OR REPLACE TABLE mytable +(id UInt32, message String) +ENGINE MergeTree() +ORDER BY (id) +``` + +特定のカラムのみを挿入します。 + +```ts +// 生成された文: INSERT INTO mytable (message) FORMAT JSONEachRow +await client.insert({ + table: 'mytable', + values: [{ message: 'foo' }], + format: 'JSONEachRow', + // この行の`id`カラム値はゼロになります(UInt32のデフォルト) + columns: ['message'], +}) +``` + +特定のカラムを除外: + +```ts +// 生成された文: INSERT INTO mytable (* EXCEPT (message)) FORMAT JSONEachRow +await client.insert({ + table: tableName, + values: [{ id: 144 }], + format: 'JSONEachRow', + // この行の`message`カラム値は空の文字列になります + columns: { + except: ['message'], + }, +}) +``` + +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_exclude_columns.ts) を参照して追加の詳細を確認してください。 + +**例**: クライアントインスタンスに提供されたものとは異なるデータベースに挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_into_different_db.ts)。 + +```ts +await client.insert({ + table: 'mydb.mytable', // データベースを含む完全な名前 + values: [{ id: 42, message: 'foo' }], + format: 'JSONEachRow', +}) +``` + +#### Web版の制限事項 + +現在、`@clickhouse/client-web` での挿入は `Array` および `JSON*` フォーマットでのみ機能します。 +ストリームの挿入はまだWeb版でサポートされていないため、ブラウザの互換性が低いです。 + +その結果、Web版の`InsertParams`インターフェースはNode.js版とは少し異なり、 +`values`は`ReadonlyArray`型に制限されています: + +```ts +interface InsertParams extends BaseQueryParams { + // データを挿入するテーブル名 + table: string + // 挿入するデータセット。 + values: ReadonlyArray + // 挿入するデータセットのフォーマット。 + format?: DataFormat + // データを挿入するカラムを指定することができます。 + // - `['a', 'b']` のような配列は: `INSERT INTO table (a, b) FORMAT DataFormat` を生成します + // - `{ except: ['a', 'b']}` のようなオブジェクトは: `INSERT INTO table (* EXCEPT (a, b)) FORMAT DataFormat` を生成します + // デフォルトでは、すべてのカラムにデータを挿入し、 + // 生成された文は: `INSERT INTO table FORMAT DataFormat` になります。 + columns?: NonEmptyArray | { except: NonEmptyArray } +} +``` + +これは将来的に変更される可能性があります。次も参照してください: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +### Commandメソッド + +Commandメソッドは、FORMAT句が適用できない文や、応答を特に必要としない状況で使用します。 +例としては、`CREATE TABLE` や `ALTER TABLE` があります。 + +このメソッドはawaitすべきです。 + +応答ストリームは即座に破棄され、その結果、基盤となるソケットも解放されます。 + +```ts +interface CommandParams extends BaseQueryParams { + // 実行する文。 + query: string +} + +interface CommandResult { + query_id: string +} + +interface ClickHouseClient { + command(params: CommandParams): Promise +} +``` + +また、参照: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +**例:** (Node.js/Web) ClickHouse Cloudでテーブルを作成する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/create_table_cloud.ts)。 + +```ts +await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS my_cloud_table + (id UInt64, name String) + ORDER BY (id) + `, + // クラスター使用時に、HTTPヘッダーが既にクライアントに送られた後にクエリ処理エラーが発生した状況を避けるために推奨されます。 + // https://clickhouse.com/docs/ja/interfaces/http/#response-bufferingを参照 + clickhouse_settings: { + wait_end_of_query: 1, + }, +}) +``` + +**例:** (Node.js/Web) セルフマネージドのClickHouseインスタンスでテーブルを作成する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/create_table_single_node.ts)。 + +```ts +await client.command({ + query: ` + CREATE TABLE IF NOT EXISTS my_table + (id UInt64, name String) + ENGINE MergeTree() + ORDER BY (id) + `, +}) +``` + +**例:** (Node.js/Web) INSERT FROM SELECT + +```ts +await client.command({ + query: `INSERT INTO my_table SELECT '42'`, +}) +``` + +:::important +`abort_signal` でリクエストをキャンセルしても、サーバーがステートメントを実行していないことを保証するものではありません。 +::: + +### Execメソッド + +カスタムクエリがあって、`query`/`insert`に適合せず、結果に関心がある場合、`exec`を`command`の代替として使用できます。 + +`exec`はリーダブルストリームを返し、アプリケーション側で消費または破棄しなければなりません。 + +```ts +interface ExecParams extends BaseQueryParams { + // 実行する文。 + query: string +} + +interface ClickHouseClient { + exec(params: ExecParams): Promise +} +``` + +また、参照: [すべてのクライアントメソッドの基本パラメータ](./js.md#base-parameters-for-all-client-methods)。 + +ストリームの戻り型は、Node.js版とWeb版で異なります。 + +Node.js: + +```ts +export interface QueryResult { + stream: Stream.Readable + query_id: string +} +``` + +Web: + +```ts +export interface QueryResult { + stream: ReadableStream + query_id: string +} +``` + +### Ping + +`ping`メソッドはサーバに到達可能かチェックするために提供されており、サーバが到達可能であると `true` を返します。 + +サーバに到達できない場合、基盤となるエラーが結果に含まれます。 + +```ts +type PingResult = + | { success: true } + | { success: false; error: Error } + +interface ClickHouseClient { + ping(): Promise +} +``` + +Pingはアプリケーション開始時にサーバが使用可能か確認するための便利なツールであり、とりわけClickHouse Cloudでは、インスタンスがアイドル状態からPingで目覚めます。 + +**例:** (Node.js/Web) ClickHouseサーバインスタンスにPingする。注意:Web版では、捕捉されたエラーが異なります。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/ping.ts)。 + +```ts +const result = await client.ping(); +if (!result.success) { + // result.errorを処理する +} +``` + +注意: `/ping` エンドポイントがCORSを実装していないため、Web版では、簡単な `SELECT 1` を使用して類似した結果を達成します。 + +### クローズ (Node.jsのみ) + +すべてのオープンな接続を閉じてリソースを解放します。Web版ではNo-opです。 + +```ts +await client.close() +``` + +## ファイルのストリーミング (Node.jsのみ) + +クライアントリポジトリには、人気のあるデータフォーマット(NDJSON、CSV、Parquet)でのファイルストリーミングのいくつかの例があります。 + +- [NDJSONファイルからのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_ndjson.ts) +- [CSVファイルからのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_csv.ts) +- [Parquetファイルからのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/insert_file_stream_parquet.ts) +- [ファイルとしてのParquetへのストリーミング](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_parquet_as_file.ts) + +別の形式をファイルにストリーミングすることはParquetの場合と同様です。 +`query`呼び出しに使用するフォーマット(`JSONEachRow`、`CSV`など)と出力ファイル名が異なるだけです。 + +## サポートされているデータフォーマット + +クライアントはデータフォーマットとしてJSONまたはテキストを処理します。 + +もし`format`としてJSONファミリーのいずれかを指定した場合(`JSONEachRow`、`JSONCompactEachRow` など)、クライアントは通信中にデータをシリアル化およびデシリアル化します。 + +「生」のテキストフォーマットで提供されたデータ(`CSV`、`TabSeparated`および`CustomSeparated`ファミリー)は、追加の変換なしで通信線上を送信されます。 + +:::tip +JSON一般形式と[ClickHouse JSON形式](https://clickhouse.com/docs/ja/sql-reference/formats#json)の間で混乱する可能性があります。 + +クライアントは`JSONEachRow`などの形式でJSONオブジェクトをストリーミングすることをサポートしています(ストリーミングに適した他の形式の概要についてはこの表を参照してください;クライアントリポジトリの`select_streaming_`[例を参照してください](https://github.com/ClickHouse/clickhouse-js/tree/main/examples/node))。 + +ただし、[ClickHouse JSON](https://clickhouse.com/docs/ja/sql-reference/formats#json)のような形式やいくつかの他の形式は、応答で単一オブジェクトとして表現され、クライアントによってストリーミングすることはできません。 +::: + +| Format | Input (array) | Input (object) | Input/Output (Stream) | Output (JSON) | Output (text) | +|--------------------------------------------|---------------|----------------|-----------------------|---------------|----------------| +| JSON | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONCompact | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONObjectEachRow | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONColumnsWithMetadata | ❌ | ✔️ | ❌ | ✔️ | ✔️ | +| JSONStrings | ❌ | ❌️ | ❌ | ✔️ | ✔️ | +| JSONCompactStrings | ❌ | ❌ | ❌ | ✔️ | ✔️ | +| JSONEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONStringsEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactStringsEachRow | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactEachRowWithNames | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactEachRowWithNamesAndTypes | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactStringsEachRowWithNames | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| JSONCompactStringsEachRowWithNamesAndTypes | ✔️ | ❌ | ✔️ | ✔️ | ✔️ | +| CSV | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CSVWithNames | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CSVWithNamesAndTypes | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparated | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparatedRaw | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparatedWithNames | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| TabSeparatedWithNamesAndTypes | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CustomSeparated | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CustomSeparatedWithNames | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| CustomSeparatedWithNamesAndTypes | ❌ | ❌ | ✔️ | ❌ | ✔️ | +| Parquet | ❌ | ❌ | ✔️ | ❌ | ✔️❗- 次を参照 | + +Parquetの場合、selectの主なユースケースは結果ストリームをファイルに書き込むことです。[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/select_parquet_as_file.ts)をクライアントリポジトリで参照してください。 + +ClickHouseの入力および出力形式の完全なリストは[ここ](https://clickhouse.com/docs/ja/interfaces/formats)で確認できます。 + +## サポートされているClickHouseデータ型 + +| Type | Status | JS type | +|----------------|----------------|-----------------------| +| UInt8/16/32 | ✔️ | number | +| UInt64/128/256 | ✔️❗- 次参照 | string | +| Int8/16/32 | ✔️ | number | +| Int64/128/256 | ✔️❗- 次参照 | string | +| Float32/64 | ✔️ | number | +| Decimal | ✔️❗- 次参照 | number | +| Boolean | ✔️ | boolean | +| String | ✔️ | string | +| FixedString | ✔️ | string | +| UUID | ✔️ | string | +| Date32/64 | ✔️ | string | +| DateTime32/64 | ✔️❗- 次参照 | string | +| Enum | ✔️ | string | +| LowCardinality | ✔️ | string | +| Array(T) | ✔️ | T[] | +| JSON | ✔️ | object | +| Nested | ✔️ | T[] | +| Tuple | ✔️ | Tuple | +| Nullable(T) | ✔️ | JS type for T or null | +| IPv4 | ✔️ | string | +| IPv6 | ✔️ | string | +| Point | ✔️ | [ number, number ] | +| Ring | ✔️ | Array | +| Polygon | ✔️ | Array | +| MultiPolygon | ✔️ | Array | +| Map(K, V) | ✔️ | Record | + +サポートされているClickHouse形式の完全なリストは、 +[こちら](https://clickhouse.com/docs/ja/sql-reference/data-types/)で確認できます。 + +### Date/Date32型についての注意点 + +クライアントは追加の型変換をせずに値を挿入するため、`Date`/`Date32`型のカラムは文字列としてのみ挿入できます。 + +**例:** `Date`型の値を挿入する。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/ba387d7f4ce375a60982ac2d99cb47391cf76cec/__tests__/integration/date_time.test.ts)。 + +```ts +await client.insert({ + table: 'my_table', + values: [ { date: '2022-09-05' } ], + format: 'JSONEachRow', +}) +``` + +ただし、`DateTime`または`DateTime64`カラムを使用している場合、文字列とJS Dateオブジェクトの両方を使用できます。JS Dateオブジェクトは`date_time_input_format`を`best_effort`として`insert`にそのまま渡すことができます。この[例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_js_dates.ts)を参照して詳細を確認してください。 + +### Decimal\* 型についての注意点 + +`JSON*`ファミリーフォーマットを用いてDecimalを挿入することが可能です。たとえば、以下のようなテーブルが定義されているとします: + +```sql +CREATE TABLE my_table +( + id UInt32, + dec32 Decimal(9, 2), + dec64 Decimal(18, 3), + dec128 Decimal(38, 10), + dec256 Decimal(76, 20) +) +ENGINE MergeTree() +ORDER BY (id) +``` + +次のように、精度を失うことなくString表現を用いて値を挿入できます: + +```ts +await client.insert({ + table: 'my_table', + values: [{ + id: 1, + dec32: '1234567.89', + dec64: '123456789123456.789', + dec128: '1234567891234567891234567891.1234567891', + dec256: '12345678912345678912345678911234567891234567891234567891.12345678911234567891', + }], + format: 'JSONEachRow', +}) +``` + +ただし、`JSON*`形式でデータをクエリする場合、ClickHouseはデフォルトでDecimalを数値として返すため、精度が失われる可能性があります。これを避けるには、クエリ内でDecimalを文字列にキャストします: + +```ts +await client.query({ + query: ` + SELECT toString(dec32) AS decimal32, + toString(dec64) AS decimal64, + toString(dec128) AS decimal128, + toString(dec256) AS decimal256 + FROM my_table + `, + format: 'JSONEachRow', +}) +``` + +詳細については[この例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/insert_decimals.ts)を参照してください。 + +### 整数型:Int64、Int128、Int256、UInt64、UInt128、UInt256 + +サーバーは数値として受け入れることができますが、クライアントでは整数オーバーフローを避けるため、これらの型は`JSON*`ファミリー出力フォーマットで文字列として返されます。これらの型の最大値は `Number.MAX_SAFE_INTEGER` よりも大きいです。 + +ただし、この動作は +[`output_format_json_quote_64bit_integers` 設定](https://clickhouse.com/docs/ja/operations/settings/formats#output_format_json_quote_64bit_integers)を使用して変更できます。 + +**例:** 64ビット数値のためにJSON出力フォーマットを調整する。 + +```ts +const resultSet = await client.query({ + query: 'SELECT * from system.numbers LIMIT 1', + format: 'JSONEachRow', +}) + +expect(await resultSet.json()).toEqual([ { number: '0' } ]) +``` + +```ts +const resultSet = await client.query({ + query: 'SELECT * from system.numbers LIMIT 1', + format: 'JSONEachRow', + clickhouse_settings: { output_format_json_quote_64bit_integers: 0 }, +}) + +expect(await resultSet.json()).toEqual([ { number: 0 } ]) +``` + +## ClickHouse設定 + +クライアントは、[設定](https://clickhouse.com/docs/ja/operations/settings/settings/)メカニズムを介してClickHouseの動作を調整することができます。 +これらの設定は、クライアントインスタンスレベルで設定でき、ClickHouseへのすべての要求に適用されます: + +```ts +const client = createClient({ + clickhouse_settings: {} +}) +``` + +または、リクエストレベルで設定を構成することもできます: + +```ts +client.query({ + clickhouse_settings: {} +}) +``` + +すべてのサポートされているClickHouse設定を含む型宣言ファイルは +[こちら](https://github.com/ClickHouse/clickhouse-js/blob/main/packages/client-common/src/settings.ts)で見つけることができます。 + +:::important +クエリが行われるユーザーが、設定を変更するための十分な権限を持っていることを確認してください。 +::: + +## 高度なトピック + +### パラメータ付きクエリ + +クエリにパラメータを作成し、クライアントアプリケーションからそれらに値を渡すことができます。これにより、クライアント側で特定の動的値でクエリをフォーマットする必要がなくなります。 + +通常のフォーマットでクエリを作成し、クエリのアプリパラメータから値を渡したい場所に次のフォーマットで中括弧に入れてください: + +``` +{: } +``` + +ここで: + +- `name` — プレースホルダー識別子。 +- `data_type` - アプリケーションパラメータ値の[データ型](https://clickhouse.com/docs/ja/sql-reference/data-types/)。 + +**例:**: パラメータ付きクエリ。 +[ソースコード](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/query_with_parameter_binding.ts)。 + +```ts +await client.query({ + query: 'SELECT plus({val1: Int32}, {val2: Int32})', + format: 'CSV', + query_params: { + val1: 10, + val2: 20, + }, +}) +``` + +さらに詳しい情報は、https://clickhouse.com/docs/ja/interfaces/cli#cli-queries-with-parameters-syntax を確認してください。 + +### 圧縮 + +注意: リクエスト圧縮は現在Web版では利用できません。レスポンス圧縮は通常どおり機能します。Node.js版は両方をサポートしています。 + +大きなデータセットを通信するアプリケーションは、圧縮を有効にすることで利益を得ることができます。現在、[zlib](https://nodejs.org/docs/latest-v14.x/api/zlib.html)を使用した`GZIP`のみがサポートされています。 + +```typescript +createClient({ + compression: { + response: true, + request: true + } +}) +``` + +設定パラメータは次のとおりです: + +- `response: true` はClickHouseサーバに圧縮されたレスポンスボディを返すよう指示します。デフォルト値: `response: false` +- `request: true` クライアントリクエストボディの圧縮を有効にします。デフォルト値: `request: false` + +### ロギング (Node.jsのみ) + +:::important +ロギングはエクスペリメンタルな機能であり、将来的に変更される可能性があります。 +::: + +デフォルトのロガー実装は、 `console.debug/info/warn/error` メソッドを介して`stdout`にログレコードを出力します。 +`LoggerClass`を提供してログロジックをカスタマイズし、 `level`パラメータで希望するログレベルを選ぶことができます(デフォルトは`OFF`です): + +```typescript +import type { Logger } from '@clickhouse/client' + +// クライアントによってエクスポートされる3つのすべてのLogParams型 +interface LogParams { + module: string + message: string + args?: Record +} +type ErrorLogParams = LogParams & { err: Error } +type WarnLogParams = LogParams & { err?: Error } + +class MyLogger implements Logger { + trace({ module, message, args }: LogParams) { + // ... + } + debug({ module, message, args }: LogParams) { + // ... + } + info({ module, message, args }: LogParams) { + // ... + } + warn({ module, message, args }: WarnLogParams) { + // ... + } + error({ module, message, args, err }: ErrorLogParams) { + // ... + } +} + +const client = createClient({ + log: { + LoggerClass: MyLogger, + level: ClickHouseLogLevel + } +}) +``` + +現在、クライアントは以下のイベントをログに記録します: + +- `TRACE` - Keep-Aliveソケットのライフサイクルに関する低レベルの情報 +- `DEBUG` - 応答情報(認証ヘッダーやホスト情報を除く) +- `INFO` - 主に使用されない、クライアントが初期化される時に現在のログレベルを表示する +- `WARN` - 致命的でないエラー;失敗した`ping`リクエストは警告としてログに記録され、基盤となるエラーは結果に含まれる +- `ERROR` - `query`/`insert`/`exec`/`command`メソッドからの致命的なエラー、例えば失敗したリクエスト + +デフォルトのロガー実装は[ここ](https://github.com/ClickHouse/clickhouse-js/blob/main/packages/client-common/src/logger.ts)で確認できます。 + +### TLS証明書 (Node.jsのみ) + +Node.jsクライアントはオプションで基本的な(認証局のみ)および相互(認証局とクライアント証明書)TLSをサポートしています。 + +`certs`フォルダ内に証明書を持ち、CAファイル名が`CA.pem`であることを前提とした基本的なTLS設定例: + +```ts +const client = createClient({ + host: 'https://:', + username: '', + password: '', // 必要な場合 + tls: { + ca_cert: fs.readFileSync('certs/CA.pem'), + }, +}) +``` + +クライアント証明書を使った相互TLS設定例: + +```ts +const client = createClient({ + host: 'https://:', + username: '', + tls: { + ca_cert: fs.readFileSync('certs/CA.pem'), + cert: fs.readFileSync(`certs/client.crt`), + key: fs.readFileSync(`certs/client.key`), + }, +}) +``` + +クライアントリポジトリの[基本TLS例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/basic_tls.ts)および[相互TLS例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/node/mutual_tls.ts)を参照してください。 + +### Keep-Alive設定 (Node.jsのみ) + +クライアントは基盤となるHTTPエージェントでKeep-Aliveをデフォルトで有効にします。つまり、接続されたソケットは後続のリクエストで再利用され、`Connection: keep-alive` ヘッダが送信されます。アイドル状態のソケットはデフォルトで2500ミリ秒間接続プールに残ります([このオプションの調整についてのメモ](./js.md#adjusting-idle_socket_ttl)を参照してください)。 + +`keep_alive.idle_socket_ttl`はその値がサーバー/LB設定を大幅に下回る必要があります。主な理由は、HTTP/1.1がクライアントに通知せずにサーバーがソケットを閉じることを許可するため、サーバーやロードバランサーがクライアントより先にコネクションを閉じると、クライアントが閉じたソケットを再利用しようとして`socket hang up`エラーが発生する可能性があるからです。 + +`keep_alive.idle_socket_ttl`を変更する場合、常にサーバー/LBのKeep-Alive設定と同期している必要があり、常にそれより低くなければなりません。これにより、サーバーがクライアントより先にオープンな接続を閉じることはないことが保証されます。 + +#### `idle_socket_ttl`の調整 + +クライアントは `keep_alive.idle_socket_ttl` を 2500ミリ秒に設定しています。これは最も安全なデフォルトとみなされ、その間に`keep_alive_timeout`が[23.11より前のバージョンのClickHouseで設定なしで3秒ほどに設定されるかもしれない](https://github.com/ClickHouse/ClickHouse/commit/1685cdcb89fe110b45497c7ff27ce73cc03e82d1)ためです。 + +:::warning +パフォーマンスに満足していて、問題が発生していない場合、`keep_alive.idle_socket_ttl`設定の値を増やさないことをお勧めします。そうしないと"Socket hang-up"エラーが発生する可能性があるからです。また、アプリケーションが多くのクエリを送信し、それらの間に多くのダウンタイムがない場合、そのデフォルト値で十分であるはずです。ソケットは長時間アイドルすることなく、クライアントがそれらをプールに保持するからです。 +::: + +次のコマンドを実行することでサーバー応答ヘッダの中で正しいKeep-Aliveタイムアウト値を見つけることができます: + +```sh +curl -v --data-binary "SELECT 1" +``` + +応答の中の`Connection`と`Keep-Alive`ヘッダの値を確認してください。たとえば: + +``` +< Connection: Keep-Alive +< Keep-Alive: timeout=10 +``` + +この場合、`keep_alive_timeout`は10秒です。アイドルソケットをデフォルトよりも少し長く開いておくために、`keep_alive.idle_socket_ttl`を9000または9500ミリ秒に増やしてみることができます。"Socket hang-up"エラーが発生しないか確認してください。これらが発生する場合、サーバーがクライアントより先に接続を閉じていることを示し、エラーが消えるまで値を下げます。 + +#### Keep-Aliveのトラブルシューティング + +Keep-Aliveを使用中に`socket hang up`エラーが発生する場合、次のオプションでこの問題を解決できます: + +* ClickHouseサーバー設定で `keep_alive.idle_socket_ttl` 設定をわずかに減少させる。特定の状況、たとえばクライアントとサーバーの間の高いネットワーク遅延がある場合、送信中のリクエストがサーバーが閉じる予定のソケットを取得する状況を避けるために、`keep_alive.idle_socket_ttl`を200〜500ミリ秒ほどさらに減少させることが有益かもしれません。 +* このエラーがデータの入出力なしで長時間実行されるクエリ中に発生している場合(たとえば、長時間実行される `INSERT FROM SELECT`)、ロードバランサがアイドル状態の接続を閉じるためかもしれません。このような長時間実行されるクエリ中に一部のデータの入出力を強制することを試みるためには、以下のClickHouse設定を組み合わせて使用できます。 + + ```ts + const client = createClient({ + // ここでは、実行時間が5分以上かかるクエリがあると想定しています + request_timeout: 400_000, + /** これらの設定を組み合わせることで、データの入出力がない長時間実行されるクエリを実行する際のLBのタイムアウトの問題を回避できます。 + * 例えば、 `INSERT FROM SELECT` などのように。LBが接続をアイドル状態と見なして突然切断する可能性があります。 + * この場合、LBのアイドル接続タイムアウトが120秒であると想定し、安全な値として110秒に設定します。 */ + clickhouse_settings: { + send_progress_in_http_headers: 1, + http_headers_progress_interval_ms: '110000', // UInt64、文字列として渡す必要があります + }, + }) + ``` + しかしながら、受信ヘッダーの総サイズには最近のNode.jsバージョンで16KBの制限があることを覚えておいてください。テストでは約70〜80の進捗ヘッダーを受信すると例外が発生しました。 + + また、完全に異なる方法を使用することも可能です。これは、HTTPインターフェイスの「機能」を利用することで、接続が失われてもミューテーションがキャンセルされないため、待機時間を完全に回避できます。[この例(パート2)](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/long_running_queries_timeouts.ts)を参照してください。 + +* Keep-Alive機能を完全に無効にすることができます。この場合、クライアントはすべてのリクエストに `Connection: close` ヘッダーを追加し、基盤のHTTPエージェントは接続を再利用しないようにします。`keep_alive.idle_socket_ttl` 設定は無視されます。これは、アイドル状態のソケットがないためです。これにより、すべてのリクエストに対して新しい接続が確立されるため、追加のオーバーヘッドが発生します。 + + ```ts + const client = createClient({ + keep_alive: { + enabled: false, + }, + }) + ``` + +### 読み取り専用ユーザー + +クライアントを[readonly=1のユーザー](https://clickhouse.com/docs/ja/operations/settings/permissions-for-queries#readonly)で使用する場合、`enable_http_compression`設定が必要なため、レスポンス圧縮を有効にすることはできません。以下の設定はエラーを引き起こします: + +```ts +const client = createClient({ + compression: { + response: true, // readonly=1のユーザーでは機能しません + }, +}) +``` + +readonly=1のユーザーの制限についての詳細は[こちらの例](https://github.com/ClickHouse/clickhouse-js/blob/main/examples/read_only_user.ts)を参照してください。 + +### パスネームを持つプロキシ + +ClickHouseインスタンスがプロキシの背後にあり、URLにパスネームがある場合(たとえば、http://proxy:8123/clickhouse_server)、`clickhouse_server` を `pathname` 設定オプションとして指定してください(先頭にスラッシュがあってもなくても構いません)。さもなければ、`url` に直接指定されている場合、それが `database` オプションとして考慮されます。複数のセグメントがサポートされています。例:`/my_proxy/db`。 + +```ts +const client = createClient({ + url: 'http://proxy:8123', + pathname: '/clickhouse_server', +}) +``` + +### 認証付きのリバースプロキシ + +ClickHouse配置の前に認証付きのリバースプロキシがある場合、必要なヘッダーを提供するために `http_headers` 設定を使用できます: + +```ts +const client = createClient({ + http_headers: { + 'My-Auth-Header': '...', + }, +}) +``` + +### カスタムHTTP/HTTPSエージェント(エクスペリメンタル、Node.jsのみ) + +:::warning +これは将来的なリリースでの後方互換性のない方法で変更される可能性のあるエクスペリメンタルな機能です。クライアントが提供するデフォルトの実装と設定は、ほとんどのユースケースで十分です。この機能は、必要があることを確信している場合にのみ使用してください。 +::: + +デフォルトでは、クライアントはクライアント設定で提供された設定(`max_open_connections`、`keep_alive.enabled`、`tls`など)を使用して基盤のHTTP(s)エージェントを構成し、ClickHouseサーバーへの接続を管理します。さらに、TLS証明書が使用される場合、基盤のエージェントは必要な証明書で構成され、正しいTLS認証ヘッダーが強制されます。 + +バージョン1.2.0以降、デフォルトの基盤エージェントを置き換えるカスタムHTTP(s)エージェントをクライアントに提供することが可能です。これは、ネットワーク構成が複雑な場合に役立ちます。カスタムエージェントが提供される場合、次の条件が適用されます: +- `max_open_connections`と`tls`オプションはクライアントによって無視され、効果はありません。これらは基盤エージェントの設定の一部です。 +- `keep_alive.enabled`はデフォルトの`Connection`ヘッダーの値のみを規制します(`true` -> `Connection: keep-alive`、`false` -> `Connection: close`)。 +- アイドル状態のキープアライブソケット管理は引き続き動作します(これはエージェントではなく特定のソケット自体に関連付けられています)が、`keep_alive.idle_socket_ttl`値を`0`に設定して完全に無効にすることもできます。 + +#### カスタムエージェント使用例 + +証明書なしのカスタムHTTP(s)エージェントを使用: + +```ts +const agent = new http.Agent({ // または https.Agent + keepAlive: true, + keepAliveMsecs: 2500, + maxSockets: 10, + maxFreeSockets: 10, +}) +const client = createClient({ + http_agent: agent, +}) +``` + +基本的なTLSとCA証明書を使用したカスタムHTTPSエージェント: + +```ts +const agent = new https.Agent({ + keepAlive: true, + keepAliveMsecs: 2500, + maxSockets: 10, + maxFreeSockets: 10, + ca: fs.readFileSync('./ca.crt'), +}) +const client = createClient({ + url: 'https://myserver:8443', + http_agent: agent, + // カスタムHTTPSエージェントを使用する場合、クライアントはデフォルトのHTTPS接続実装を使用しません。ヘッダーは手動で提供する必要があります + http_headers: { + 'X-ClickHouse-User': 'username', + 'X-ClickHouse-Key': 'password', + }, + // 重要:認可ヘッダーがTLSヘッダーと衝突します。これを無効にします。 + set_basic_auth_header: false, +}) +``` + +相互TLSを使用したカスタムHTTPSエージェント: + +```ts +const agent = new https.Agent({ + keepAlive: true, + keepAliveMsecs: 2500, + maxSockets: 10, + maxFreeSockets: 10, + ca: fs.readFileSync('./ca.crt'), + cert: fs.readFileSync('./client.crt'), + key: fs.readFileSync('./client.key'), +}) +const client = createClient({ + url: 'https://myserver:8443', + http_agent: agent, + // カスタムHTTPSエージェントを使用する場合、クライアントはデフォルトのHTTPS接続実装を使用しません。ヘッダーは手動で提供する必要があります + http_headers: { + 'X-ClickHouse-User': 'username', + 'X-ClickHouse-Key': 'password', + 'X-ClickHouse-SSL-Certificate-Auth': 'on', + }, + // 重要:認可ヘッダーがTLSヘッダーと衝突します。これを無効にします。 + set_basic_auth_header: false, +}) +``` + +証明書およびカスタムHTTPSエージェントを使用する場合、TLSヘッダーと衝突するため、`set_basic_auth_header`設定(バージョン1.2.0で導入)を使用してデフォルトの認証ヘッダーを無効にする必要がある可能性があります。すべてのTLSヘッダーは手動で提供する必要があります。 + +## 既知の制限事項(Node.js/ウェブ) + +- 結果セットのデータマッパーがなく、言語のプリミティブのみが使用されます。特定のデータタイプマッパーは[RowBinary形式サポート](https://github.com/ClickHouse/clickhouse-js/issues/216)が予定されています。 +- [Decimal*とDate\* / DateTime\*データ型の制限事項](./js.md#datedate32-types-caveats)があります。 +- JSON*ファミリ形式を使用する場合、Int32より大きな数値は文字列として表示されます。これは、Int64+型の最大値が`Number.MAX_SAFE_INTEGER`よりも大きいためです。[Integral types](./js.md#integral-types-int64-int128-int256-uint64-uint128-uint256)セクションを参照してください。 + +## 既知の制限事項(ウェブ) + +- セレクトクエリのストリーミングは動作しますが、インサートでは無効になっています(型レベルでも)。 +- リクエスト圧縮は無効化され、設定は無視されます。レスポンス圧縮は機能します。 +- ロギングサポートはまだありません。 + +## パフォーマンス最適化のためのヒント + +- アプリケーションのメモリ消費を削減するために、(ファイルからの)大規模なインサートやセレクトでストリームを使用することを検討してください。イベントリスナーや同様のユースケースでは、[非同期インサート](https://clickhouse.com/docs/ja/optimize/asynchronous-inserts)が良い選択肢になる可能性があります。これにより、クライアント側でのバッチ処理を最小化、または完全に回避できます。非同期インサートの例は、[クライアントリポジトリ](https://github.com/ClickHouse/clickhouse-js/tree/main/examples)のファイル名プレフィックス`async_insert_`で提供されています。 +- クライアントはデフォルトでリクエストやレスポンスの圧縮を有効にしません。しかし、大規模なデータセットを選択または挿入する場合、`ClickHouseClientConfigOptions.compression`で圧縮を有効にすることができます(`request`または`response`のどちらか、または両方で)。 +- 圧縮は重要なパフォーマンスのペナルティを伴います。`request`または`response`に対して有効にすると、それぞれ選択または挿入の速度に悪影響を及ぼしますが、アプリケーションによって転送されるネットワークトラフィックの量は減少します。 + +## ご相談・お問い合わせ + +質問やサポートが必要な場合は、[Community Slack](https://clickhouse.com/slack)(`#clickhouse-js`チャンネル)または[GitHub issues](https://github.com/ClickHouse/clickhouse-js/issues)を通じてお気軽にご連絡ください。 diff --git a/docs/ja/integrations/language-clients/python/index.md b/docs/ja/integrations/language-clients/python/index.md new file mode 100644 index 00000000000..c706353b989 --- /dev/null +++ b/docs/ja/integrations/language-clients/python/index.md @@ -0,0 +1,926 @@ +--- +sidebar_label: Python +sidebar_position: 10 +keywords: [clickhouse, python, client, connect, integrate] +slug: /ja/integrations/python +description: ClickHouseにPythonを接続するためのClickHouse Connectプロジェクトスイート +--- + +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# ClickHouse Connectを使用したPythonの統合 + +## イントロダクション + +ClickHouse Connectは、非常に多くのPythonアプリケーションとの相互運用性を提供するコアデータベースドライバです。 + +- 主なインターフェイスはパッケージ`clickhouse_connect.driver`内の`Client`オブジェクトです。このコアパッケージには、ClickHouseサーバーとの通信や挿入と選択クエリの高度な管理のための"コンテクスト"実装に使用されるさまざまなヘルパークラスとユーティリティ関数も含まれています。 +- `clickhouse_connect.datatypes`パッケージは、エクスペリメンタルでないすべてのClickHouseデータタイプの基本実装とサブクラスを提供します。その主な機能は、ClickHouseとクライアントアプリケーション間で最も効率的な転送を達成するために使用されるClickHouseの"ネイティブ"バイナリ列形式へのデータのシリアライズとデシリアライズです。 +- `clickhouse_connect.cdriver`パッケージ内のCython/Cクラスは、最も一般的なシリアル化とデシリアル化のいくつかを最適化し、純粋なPythonのパフォーマンスを大幅に向上させます。 +- パッケージ`clickhouse_connect.cc_sqlalchemy`には、[SQLAlchemy](https://www.sqlalchemy.org/)方言が限られています。この制限された実装は、クエリ/カーソル機能に焦点を当て、通常SQLAlchemy DDLおよびORM操作はサポートしません(SQLAlchemyはOLTPデータベース向けであり、ClickHouse OLAP指向のデータベースを管理するためにより専門的なツールやフレームワークをお勧めします)。 +- コアドライバおよびClickHouse Connect SQLAlchemy実装は、ClickHouseをApache Supersetに接続するための推奨方法です。`ClickHouse Connect`データベース接続または`clickhousedb` SQLAlchemy方言接続文字列を使用してください。 + +このドキュメントは、ベータリリース0.8.2の時点で有効です。 + +:::note +公式のClickHouse Connect Pythonドライバは、ClickHouseサーバーとの通信にHTTPプロトコルを使用します。 +これは、柔軟性の向上、HTTPバランサのサポート、JDBCベースのツールとの互換性の向上などの利点がありますが、圧縮率やパフォーマンスのやや低下、ネイティブTCPベースのプロトコルの一部の複雑な機能のサポートの欠如などのデメリットもあります。 +一部のユースケースでは、ネイティブTCPベースのプロトコルを使用する[コミュニティPythonドライバ](/docs/ja/interfaces/third-party/client-libraries.md)の使用を検討することもできます。 +::: + +### 要件と互換性 + +| Python | | Platform¹ | | ClickHouse | | SQLAlchemy² | | Apache Superset | | +|----------:|:--|----------------:|:--|-----------:|:---|------------:|:--|----------------:|:--| +| 2.x, <3.8 | ❌ | Linux (x86) | ✅ | <24.3³ | 🟡 | <1.3 | ❌ | <1.4 | ❌ | +| 3.8.x | ✅ | Linux (Aarch64) | ✅ | 24.3.x | ✅ | 1.3.x | ✅ | 1.4.x | ✅ | +| 3.9.x | ✅ | macOS (x86) | ✅ | 24.4-24.6³ | 🟡 | 1.4.x | ✅ | 1.5.x | ✅ | +| 3.10.x | ✅ | macOS (ARM) | ✅ | 24.7.x | ✅ | >=2.x | ❌ | 2.0.x | ✅ | +| 3.11.x | ✅ | Windows | ✅ | 24.8.x | ✅ | | | 2.1.x | ✅ | +| 3.12.x | ✅ | | | 24.9.x | ✅ | | | 3.0.x | ✅ | + +¹ClickHouse Connectは、リストされたプラットフォームに対して明示的にテストされています。さらに、未テストのバイナリホイール(Cの最適化を含む)は、優れた[cibuildwheel](https://cibuildwheel.readthedocs.io/en/stable/)プロジェクトがサポートするすべてのアーキテクチャ用にビルドされます。 +最後に、ClickHouse Connectは純粋なPythonとしても実行できるため、ソースインストールは最近のPythonインストールで動作するはずです。 + +²再度、SQLAlchemyサポートは主にクエリ機能に制限されています。SQLAlchemy API全体はサポートされていません。 + +³ClickHouse Connectは、現在サポートされているすべてのClickHouseバージョンに対してテストされています。HTTPプロトコルを使用しているため、他のバージョンのClickHouseでも正しく動作するはずですが、一部の高度なデータ型との非互換性が存在する可能性があります。 + +### インストール + +PyPIからpipを通じてClickHouse Connectをインストールします: + +`pip install clickhouse-connect` + +ClickHouse Connectをソースからインストールすることもできます: +* `git clone`で[GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-connect)をクローンします。 +* (オプション)`pip install cython`を実行してC/Cythonの最適化をビルドおよび有効化 +* プロジェクトのルートディレクトリに移動して`pip install .`を実行 + +### サポートポリシー + +ClickHouse Connectは現在ベータですので、現在のベータリリースのみが積極的にサポートされています。問題を報告する前に最新バージョンに更新してください。問題は[GitHubプロジェクト](https://github.com/ClickHouse/clickhouse-connect/issues)に報告してください。ClickHouse Connectの将来のリリースは、リリース時点でアクティブにサポートされているClickHouseバージョンと互換性を持つことが保証されています(一般に、最新の`stable` 3つと`lts`の最近の2つのリリース)。 + +### 基本的な使用法 + +### 接続の詳細を集める + + + +#### 接続を確立する + +ClickHouseに接続するための2つの例を示します: +- ローカルホストのClickHouseサーバーに接続する。 +- ClickHouse Cloudサービスに接続する。 + +##### ローカルホストのClickHouseサーバーに接続するためにClickHouse Connectクライアントインスタンスを使用: + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='localhost', username='default', password='password') +``` + +##### ClickHouse Cloudサービスに接続するためにClickHouse Connectクライアントインスタンスを使用: + +:::tip +接続の詳細を前もって集めてください。ClickHouse CloudサービスはTLSを必要とするため、ポート8443を使用します。 +::: + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='HOSTNAME.clickhouse.cloud', port=8443, username='default', password='your password') +``` + +#### データベースと対話する + +ClickHouse SQLコマンドを実行するには、クライアントの`command`メソッドを使用します: + +```python +client.command('CREATE TABLE new_table (key UInt32, value String, metric Float64) ENGINE MergeTree ORDER BY key') +``` + +バッチデータを挿入するには、クライアントの`insert`メソッドを使用し、行と値の2次元配列を指定します: + +```python +row1 = [1000, 'String Value 1000', 5.233] +row2 = [2000, 'String Value 2000', -107.04] +data = [row1, row2] +client.insert('new_table', data, column_names=['key', 'value', 'metric']) +``` + +ClickHouse SQLを使用してデータを取得するには、クライアントの`query`メソッドを使用します: + +```python +result = client.query('SELECT max(key), avg(metric) FROM new_table') +result.result_rows +Out[13]: [(2000, -50.9035)] +``` + +## ClickHouse Connect ドライバAPI + +***注:*** ほとんどのAPIメソッドには多くの引数があり、その多くはオプションであるため、キーワード引数を渡すことをお勧めします。 + +*ここに文書化されていないメソッドはAPIの一部と見なされず、削除または変更される可能性があります。* + +### クライアントの初期化 + +`clickhouse_connect.driver.client`クラスは、PythonアプリケーションとClickHouseデータベースサーバー間の主要なインターフェイスを提供します。`clickhouse_connect.get_client`関数を使用してClientインスタンスを取得します。この関数は以下の引数を受け取ります: + +#### 接続引数 + +| パラメータ | タイプ | デフォルト | 説明 | +|-----------------------|-------------|-------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| interface | str | http | httpまたはhttpsである必要があります。 | +| host | str | localhost | ClickHouseサーバーのホスト名またはIPアドレス。設定しない場合、`localhost`が使用されます。 | +| port | int | 8123または8443 | ClickHouse HTTPまたはHTTPSポート。設定しない場合はデフォルトで8123、*secure*=*True*または*interface*=*https*が指定されている場合は8443が使用されます。 | +| username | str | default | ClickHouseのユーザー名。設定しない場合は、`default` ClickHouseユーザーが使用されます。 | +| password | str | *<空の文字列>* | *username*のパスワード。 | +| database | str | *None* | 接続のデフォルトデータベース。設定しない場合、ClickHouse Connectは*username*のデフォルトデータベースを使用します。 | +| secure | bool | False | https/TLSを使用します。これは、インターフェイスまたはポート引数から派生した値を上書きします。 | +| dsn | str | *None* | 標準DSN(データソース名)形式の文字列。この文字列から、設定されていない他の接続値(ホストやユーザーなど)が抽出されます。 | +| compress | bool or str | True | ClickHouse HTTPの挿入とクエリ結果の圧縮を有効にする。 [追加オプション(圧縮)](#compression) を参照 | +| query_limit | int | 0(無制限) | `query`応答の行数の最大数。0に設定すると無制限の行が返されます。大きなクエリ制限は、結果がストリーミングされないときに一度にすべての結果がメモリにロードされるため、メモリ不足の例外を引き起こす可能性があります。 | +| query_retries | int | 2 | `query`リクエストの最大リトライ回数。リトライ可能なHTTPレスポンスのみがリトライされます。`command`または`insert`リクエストは、意図しない重複リクエストを防ぐため、ドライバによって自動的にリトライされません。 | +| connect_timeout | int | 10 | HTTP接続タイムアウト(秒)。 | +| send_receive_timeout | int | 300 | HTTP接続の送受信タイムアウト(秒)。 | +| client_name | str | *None* | HTTPのUser Agentヘッダーに先行するclient_nameあります。ClickHouseのsystem.query_logでクライアントクエリを追跡するためにこれを設定します。 | +| pool_mgr | obj | *<デフォルトのPoolManager>* | `urllib3`ライブラリのPoolManagerを使用します。異なるホストへの複数の接続プールを必要とする高度な使い方が必要な場合に使用します。 | +| http_proxy | str | *None* | HTTPプロキシアドレス(HTTP_PROXY環境変数を設定するのと同様)。 | +| https_proxy | str | *None* | HTTPSプロキシアドレス(HTTPS_PROXY環境変数を設定するのと同様)。 | +| apply_server_timezone | bool | True | タイムゾーン対応のクエリ結果にサーバーのタイムゾーンを使用します。 [Timezone Precedence](#time-zones) を参照 | + +#### HTTPS/TLS 引数 + +| パラメータ | タイプ | デフォルト | 説明 | +|------------------|------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| verify | bool | True | HTTPS/TLSを使用する場合、ClickHouseサーバーTLS/SSL証明書(ホスト名、有効期限など)を検証します。 | +| ca_cert | str | *None* | *verify*=*True*の場合、ClickHouseサーバー証明書を検証するための認証局ルートのファイルパス(.pem形式)。verifyがFalseの場合は無視されます。ClickHouseサーバー証明書がグローバルに信頼されているルートである場合、認証が不要です。 | +| client_cert | str | *None* | TLSクライアント証明書のファイルパス(.pem形式)。(双方向TLS認証用)。ファイルには中間証明書を含む完全な証明書チェーンが含まれている必要があります。 | +| client_cert_key | str | *None* | クライアント証明書の秘密鍵のファイルパス。秘密鍵がクライアント証明書ファイルに含まれていない場合に必要です。 | +| server_host_name | str | *None* | プロキシまたは異なるホスト名のトンネルを介して接続する際にSSLエラーを回避するために設定するTLS証明書のCNまたはSNIとして識別されるClickHouseサーバーのホスト名 | +| tls_mode | str | *None* | 高度なTLS 動作を制御します。`proxy` および `strict` は ClickHouse の双方向 TLS 接続を呼び出しませんが、クライアント証明書とキーを送信します。 `mutual` はクライアント証明書による ClickHouse 双方向TLS認証を想定しています。*None*/デフォルトの動作は `mutual` です。 | + +#### 設定引数 + +最後に、`get_client`の`settings`引数は、クライアントリクエストごとにサーバーに追加のClickHouse設定を渡すために使用されます。ほとんどのクエリで*readonly*=*1*アクセスを持つユーザーは設定を変更できないので注意してください。そのため、ClickHouse Connectはそのような設定を最終リクエストでドロップし、警告をログに記録します。以下の設定は、ClickHouse Connectによって使用されるHTTPクエリ/セッションにのみ適用され、一般的なClickHouse設定としては文書化されていません。 + +| 設定 | 説明 | +|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| buffer_size | ClickHouseサーバーがHTTPチャネルに書き込む前に使用するバッファサイズ(バイト単位)。 | +| session_id | サーバー上の関連クエリを関連付けるための一意のセッションID。仮のテーブルに必要。 | +| compress | ClickHouseサーバーがPOST応答データを圧縮する必要があるかどうか。この設定は、"raw"クエリにのみ使用する必要があります。 | +| decompress | ClickHouseサーバーに送信されたデータを解凍する必要があるかどうか。この設定は、"raw"挿入にのみ使用する必要があります。 | +| quota_key | このリクエストに関連付けられたクォータキー。ClickHouseサーバーのドキュメント内のクォータを参照してください。 | +| session_check | セッションステータスをチェックするために使用されます。 | +| session_timeout | セッションIDで識別されるセッションがタイムアウトし、有効でなくなったとみなされるまでの非アクティブ状態の秒数。デフォルトは60秒です。 | +| wait_end_of_query | ClickHouseサーバーで応答全体をバッファリングします。この設定は、サマリー情報を返すために必要で、ストリーミングされないクエリで自動的に設定されます。 | + +クエリとともに送信できる他のClickHouse設定については、[ClickHouseのドキュメント](/docs/ja/operations/settings/settings.md)を参照してください。 + +#### クライアント作成例 + +- すべてのパラメータを指定しない場合、ClickHouse Connect クライアントは、デフォルトのHTTPポートで`localhost`にデフォルトのユーザーで接続します: + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client() +client.server_version +Out[2]: '22.10.1.98' +``` + +- セキュアな(https)外部ClickHouseサーバーへの接続 + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='play.clickhouse.com', secure=True, port=443, user='play', password='clickhouse') +client.command('SELECT timezone()') +Out[2]: 'Etc/UTC' +``` + +- セッションIDやその他のカスタム接続パラメータ、ClickHouse設定を使用した接続。 + +```python +import clickhouse_connect + +client = clickhouse_connect.get_client(host='play.clickhouse.com', + user='play', + password='clickhouse', + port=443, + session_id='example_session_1', + connect_timeout=15, + database='github', + settings={'distributed_ddl_task_timeout':300}) +client.database +Out[2]: 'github' +``` + +### 共通メソッド引数 + +いくつかのクライアントメソッドは、共通の`parameters`および`settings`引数を使用します。これらのキーワード引数は以下のように説明されています。 + +#### パラメータ引数 + +ClickHouse Connect Clientの`query*`および`command`メソッドは、ClickHouse値式にPython表現をバインドするために使用されるオプションの`parameters`キーワード引数を受け取ります。二つのバインド方法があります。 + +##### サーバーサイドバインディング + +ClickHouseはほとんどのクエリ値に対して[サーバーサイドバインディング](/docs/ja/interfaces/cli.md#cli-queries-with-parameters)をサポートしており、バインドされた値はクエリとは別にHTTPクエリパラメータとして送信されます。ClickHouse Connectは、バインド式が{<name>:<datatype>}の形式であることを検出した場合、適切なクエリパラメータを追加します。サーバーサイドバインディングの場合、`parameters`引数はPythonのDictionaryであるべきです。 + +- PythonDictionaryを使用したサーバーサイドバインディング、DateTime値、および文字列値 + +```python +import datetime + +my_date = datetime.datetime(2022, 10, 1, 15, 20, 5) + +parameters = {'table': 'my_table', 'v1': my_date, 'v2': "a string with a single quote'"} +client.query('SELECT * FROM {table:Identifier} WHERE date >= {v1:DateTime} AND string ILIKE {v2:String}', parameters=parameters) + +# サーバーで生成されるクエリは次のとおりです。 +# SELECT * FROM my_table WHERE date >= '2022-10-01 15:20:05' AND string ILIKE 'a string with a single quote\'' +``` + +**重要** -- サーバーサイドバインディングは、ClickHouseサーバーによって`SELECT`クエリのみにサポートされています。他のクエリタイプ(`ALTER`、`DELETE`、`INSERT`など)には対応していません。この点は将来的に変更される可能性があります:https://github.com/ClickHouse/ClickHouse/issues/42092 を参照。 + +##### クライアントサイドバインディング + +ClickHouse Connectはクライアントサイドのパラメータバインディングもサポートしており、テンプレート化されたSQLクエリを生成する際の柔軟性を向上させます。クライアントサイドバインディングの場合、`parameters`引数はDictionaryまたはシーケンスであるべきです。クライアントサイドバインディングは、Pythonの[「printf」スタイル](https://docs.python.org/3/library/stdtypes.html#old-string-formatting)文字列フォーマットを使用してパラメータを置換します。 + +サーバーサイドバインディングとは異なり、データベース識別子(データベース、テーブル、カラム名など)にはクライアントサイドバインディングが機能しないため注意が必要です。Pythonスタイルのフォーマットは異なるタイプの文字列を区別できないため、これらは異なる方法でフォーマットする必要があります(データベース識別子には逆アクセントまたはダブルクォート、データ値にはシングルクォートが使用されます)。 + +- PythonDictionary、DateTime値、文字列エスケープを用いた例 + +```python +import datetime + +my_date = datetime.datetime(2022, 10, 1, 15, 20, 5) + +parameters = {'v1': my_date, 'v2': "a string with a single quote'"} +client.query('SELECT * FROM some_table WHERE date >= %(v1)s AND string ILIKE %(v2)s', parameters=parameters) + +# 以下のクエリを生成: +# SELECT * FROM some_table WHERE date >= '2022-10-01 15:20:05' AND string ILIKE 'a string with a single quote\'' +``` + +- Pythonシーケンス(タプル)、Float64、およびIPv4Addressを用いた例 + +```python +import ipaddress + +parameters = (35200.44, ipaddress.IPv4Address(0x443d04fe)) +client.query('SELECT * FROM some_table WHERE metric >= %s AND ip_address = %s', parameters=parameters) + +# 以下のクエリを生成: +# SELECT * FROM some_table WHERE metric >= 35200.44 AND ip_address = '68.61.4.254'' +``` + +:::note +DateTime64引数(サブ秒精度を含むClickHouseタイプ)をバインドするには、次のいずれかのカスタムアプローチが必要です: +- Pythonの`datetime.datetime`値を新しいDT64Paramクラスでラップします。例 + ```python + query = 'SELECT {p1:DateTime64(3)}' # Dictionaryを使ったサーバーサイドバインディング + parameters={'p1': DT64Param(dt_value)} + + query = 'SELECT %s as string, toDateTime64(%s,6) as dateTime' # リストを使ったクライアントサイドバインディング + parameters=['a string', DT64Param(datetime.now())] + ``` + - パラメータ値のDictionaryを使う場合、パラメータ名に文字列 `_64` を付加します + ```python + query = 'SELECT {p1:DateTime64(3)}, {a1:Array(DateTime(3))}' # Dictionaryを使ったサーバーサイドバインディング + + parameters={'p1_64': dt_value, 'a1_64': [dt_value1, dt_value2]} + ``` +::: + +#### 設定引数 + +すべての主要なClickHouse Connectクライアントの「挿入」と「選択」メソッドは、渡されたSQL文に対するClickHouseサーバーの[ユーザー設定](/docs/ja/operations/settings/settings.md)を渡すためのオプションの`settings`キーワード引数を受け取ります。`settings`引数はDictionaryであるべきです。各アイテムは、ClickHouse設定名とその関連する値であるべきです。設定がサーバーにクエリパラメータとして送信される際に、値は文字列に変換されます。 + +クライアントレベル設定と同様に、ClickHouse Connectは、サーバーによって*readonly*=*1*とマークされた設定をドロップし、関連するログメッセージを出力します。HTTPインターフェースを介したクエリにのみ適用される設定は常に有効です。それらの設定については`get_client` [API](#settings-argument)を参照してください。 + +ClickHouse設定を使用した例: + +```python +settings = {'merge_tree_min_rows_for_concurrent_read': 65535, + 'session_id': 'session_1234', + 'use_skip_indexes': False} +client.query("SELECT event_type, sum(timeout) FROM event_errors WHERE event_time > '2022-08-01'", settings=settings) +``` + +### クライアント_command_ メソッド + +`Client.command`メソッドを使用して、通常データを返さないまたは単一のプリミティブまたは配列値を返すSQLクエリをClickHouseサーバーに送信します。このメソッドは以下のパラメータを取ります: + +| パラメータ | タイプ | デフォルト | 説明 | +|---------------|------------------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------| +| cmd | str | *必須* | 単一の値または単一行の値を返すClickHouse SQLステートメント。 | | +| parameters | dictまたはiterable | *None* | [parameters description](#parameters-argument)を参照してください。 | +| data | strまたはbytes | *None* | コマンドとともにPOST本文として含めるオプションのデータ。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | +| use_database | bool | True | クライアントデータベース(クライアントを作成する際に指定された)を使用します。Falseの場合、コマンドは接続されたユーザーのデフォルトClickHouseサーバーデータベースを使用します。 | +| external_data | ExternalData | *None* | クエリで使用するファイルまたはバイナリデータを含むExternalDataオブジェクト。[Advanced Queries (External Data)](#external-data)を参照してください。 | + +- _command_は、DDLステートメントに使用できます。SQL "コマンド"がデータを返さない場合、ClickHouse X-ClickHouse-SummaryおよびX-ClickHouse-Query-Idヘッダーのキー/値ペア`written_rows`、`written_bytes`、および`query_id`を含む"クエリサマリー"Dictionaryが代わりに返されます。 + +```python +client.command('CREATE TABLE test_command (col_1 String, col_2 DateTime) Engine MergeTree ORDER BY tuple()') +client.command('SHOW CREATE TABLE test_command') +Out[6]: 'CREATE TABLE default.test_command\\n(\\n `col_1` String,\\n `col_2` DateTime\\n)\\nENGINE = MergeTree\\nORDER BY tuple()\\nSETTINGS index_granularity = 8192' +``` + +- _command_は、単一行のみを返す単純なクエリにも使用できます。 + +```python +result = client.command('SELECT count() FROM system.tables') +result +Out[7]: 110 +``` + +### クライアント_query_ メソッド + +`Client.query`メソッドは、ClickHouseサーバーから単一の"バッチ"データセットを取得するための主要な方法です。 +これは、ClickHouseのネイティブ形式をHTTP経由で使用して、大規模なデータセット(最大約100万行)を効率的に転送します。このメソッドは以下のパラメータを取ります。 + +| パラメータ | タイプ | デフォルト | 説明 | +|-----------------------|------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| query | str | *必須* | ClickHouse SQLのSELECTまたはDESCRIBEクエリ。 | +| parameters | dictまたはiterable | *None* | [parameters description](#parameters-argument)を参照してください。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | | +| query_formats | dict | *None* | 結果値のデータ型フォーマット指定。Advanced Usage (Read Formats)を参照。 | +| column_formats | dict | *None* | カラムごとのデータ型フォーマット。Advanced Usage (Read Formats)を参照。 | +| encoding | str | *None* | ClickHouse StringカラムをPython文字列にエンコードするためのエンコーディング。Pythonは設定していない場合、`UTF-8`を使用します。 | +| use_none | bool | True | ClickHouseのNULLに対してPythonの*None*タイプを使用します。Falseの場合、ClickHouseのNULLに対してデータ型のデフォルト(たとえば0)を使用します。注:パフォーマンス上の理由からnumpy/PandasではデフォルトはFalseです。 | +| column_oriented | bool | False | 結果を列のシーケンスとして返します。Pythonデータを他の列指向データ形式に変換する際に便利です。 | +| query_tz | str | *None* | zoneinfoデータベースからのタイムゾーン名。このタイムゾーンはクエリによって返されるすべてのdatetimeまたはPandas Timestampオブジェクトに適用されます。 | +| column_tzs | dict | *None* | カラム名とタイムゾーン名のDictionary。`query_tz`に似ていますが、異なるカラムに異なるタイムゾーンを指定できます。 | +| use_extended_dtypes | bool | True | Pandasの拡張データ型(StringArrayなど)およびClickHouseのNULL値に対するpandas.NAおよびpandas.NaTを使用します。主に`query_df`および`query_df_stream`メソッドに適用されます。 | +| external_data | ExternalData | *None* | クエリに使用するファイルまたはバイナリデータを含むExternalDataオブジェクト。[Advanced Queries (External Data)](#external-data)を参照してください。 | +| context | QueryContext | *None* | 上記のメソッド引数をカプセル化する再利用可能なQueryContextオブジェクトを使用できます。 [Advanced Queries (QueryContexts)](#querycontexts)を参照してください。 | + +#### QueryResult オブジェクト + +基本的な`query`メソッドは、以下の公開プロパティを持つQueryResultオブジェクトを返します: + +- `result_rows` -- シーケンスとしてデータを返します。各行要素が列値のシーケンスである行のシーケンス。 +- `result_columns` -- シーケンスとしてデータを返します。各列要素がそのカラムに対する行値のシーケンスである列のシーケンス。 +- `column_names` -- `result_set`内の列名を表す文字列のタプル +- `column_types` -- `result_columns`内の各列に対するClickHouseデータ型を表すClickHouseTypeインスタンスのタプル +- `query_id` -- ClickHouseのquery_id(`system.query_log`テーブルでのクエリ表示に便利です) +- `summary` -- `X-ClickHouse-Summary` HTTPレスポンスヘッダーによって返されたデータ +- `first_item` -- 応答の最初の行をDictionaryとして取得するための便利なプロパティ(キーはカラム名です) +- `first_row` -- 結果の最初の行を返すための便利なプロパティ +- `column_block_stream` -- 列指向フォーマットでクエリ結果を返すジェネレータ。このプロパティは直接参照すべきではありません(以下を参照)。 +- `row_block_stream` -- 行指向フォーマットでクエリ結果を返すジェネレータ。このプロパティは直接参照すべきではありません(以下を参照)。 +- `rows_stream` -- クエリ結果を1回の呼び出しで1行ずつ生成するジェネレータ。このプロパティは直接参照すべきではありません(以下を参照)。 +- `summary` -- `command`メソッドで説明されている通り、ClickHouseから返されるサマリー情報のDictionary + +`*_stream`プロパティは、返されたデータのイテレータとして使用できるPython Contextを返します。それらはクライアント`*_stream`メソッドを使用して間接的にのみアクセスする必要があります。 + +ストリーミングクエリ結果(StreamContextオブジェクトを使用)を完全に理解するには、[Advanced Queries (Streaming Queries)](#streaming-queries)を参照してください。 + +### Numpy、Pandas、またはArrowを使用したクエリ結果の消費 + +主要な`query`メソッドの派生バージョンが3つあります: + +- `query_np` -- このバージョンは、ClickHouse Connect QueryResultの代わりにNumpy配列を返します。 +- `query_df` -- このバージョンは、ClickHouse Connect QueryResultの代わりにPandasデータフレームを返します。 +- `query_arrow` -- このバージョンはPyArrowのテーブルを返します。ClickHouseの`Arrow`フォーマットを直接使用し、主要な`query`メソッドと共通の3つの引数のみを受け取ります:`query`、`parameters`、および`settings`。また、`use_strings`という追加の引数があり、ArrowテーブルがClickHouseの文字列型を文字列(Trueの場合)またはバイト(Falseの場合)として表現するかどうかを決定します。 + +### クライアントストリーミングクエリメソッド + +ClickHouse Connect クライアントはストリームとしてデータを取得する(Pythonのジェネレータとして実装された)ための複数のメソッドを提供します: + +- `query_column_block_stream` -- ネイティブPythonオブジェクトを使用して、列のシーケンスとしてクエリデータをブロックで返します。 +- `query_row_block_stream` -- ネイティブPythonオブジェクトを使用して、行のブロックとしてクエリデータを返します。 +- `query_rows_stream` -- ネイティブPythonオブジェクトを使用して、行のシーケンスとしてクエリデータを返します。 +- `query_np_stream` -- 各ClickHouseクエリデータブロックをNumpy配列として返します。 +- `query_df_stream` -- 各ClickHouseブロックのクエリデータをPandasデータフレームとして返します。 +- `query_arrow_stream` -- PyArrow RecordBlocksとしてクエリデータを返します。 + +これらのメソッドの各々は、消費を開始するために`with`ステートメントを通して開く必要がある`ContextStream`オブジェクトを返します。詳細と例は[Advanced Queries (Streaming Queries)](#streaming-queries)を参照してください。 + +### クライアント_insert_ メソッド + +ClickHouseに複数のレコードを挿入する一般的なユースケースのために、`Client.insert`メソッドがあります。このメソッドは以下のパラメータを受け取ります: + +| パラメータ | タイプ | デフォルト | 説明 | +|-------------------|-----------------------------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| table | str | *必須* | 挿入するClickHouseテーブル。データベースを含む完全なテーブル名が許可されます。 | +| data | シーケンスのシーケンス | *必須* | データを挿入する行のシーケンスまたは列のシーケンス。各行は列値のシーケンス、または列は行値のシーケンスで構成されます。 | +| column_names | strまたはstrのシーケンス | '*' | データマトリックスの列名のリスト。'*'が使用されている場合、ClickHouse Connectはすべての列名をテーブルから取得するための"pre-query"を実行します。 | +| database | str | '' | 挿入先のデータベース。指定されていない場合、クライアントのデータベースが使用されます。 | +| column_types | ClickHouseTypeのシーケンス | *None* | ClickHouseTypeインスタンスのリスト。column_typesまたはcolumn_type_namesのどちらも指定されていない場合、ClickHouse Connectはテーブルのすべての列型を取得するための"pre-query"を実行します。 | +| column_type_names | ClickHouse型名のシーケンス | *None* | ClickHouseデータタイプ名のリスト。column_typesまたはcolumn_type_namesのどちらも指定されていない場合、ClickHouse Connectはテーブルのすべての列型を取得するための"pre-query"を実行します。 | +| column_oriented | bool | False | Trueの場合、`data`引数は列のシーケンスとして仮定され(折り返しは必要ない)、そうでない場合は`data`は行のシーケンスとして解釈されます。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | +| insert_context | InsertContext | *None* | 上記のメソッド引数をカプセル化する再利用可能なInsertContextオブジェクト。 [Advanced Inserts (InsertContexts)](#insertcontexts)を参照してください。 | + +このメソッドは"クエリサマリー"Dictionaryを返します。"command"メソッドで説明された通りです。挿入が何らかの理由で失敗した場合、例外が発生します。 + +主要な`insert`メソッドの派生バージョンが2つあります: + +- `insert_df` -- Pythonのシーケンスの代わりに、このメソッドの2番目のパラメータは`df`引数を要求し、それはPandas Dataframeインスタンスである必要があります。ClickHouse Connectは、Dataframeを列指向のデータソースとして自動的に処理するため、`column_oriented`パラメータは不要です。 +- `insert_arrow` -- Pythonのシーケンスの代わりに、このメソッドは`arrow_table`を要求します。ClickHouse ConnectはArrowテーブルを未変更のままClickHouseサーバーに渡し、`table`と`arrow_table`の他に`database`および`settings`引数のみが利用可能です。 + +*注意:* Numpy 配列は有効なシーケンスのシーケンスであり、主要な`insert`メソッドの`data`引数として使用できます。そのため、特化されたメソッドは不要です。 + +### ファイル挿入 + +`clickhouse_connect.driver.tools`には、既存のClickHouseテーブルに直接ファイルシステムからデータを挿入するための`insert_file`メソッドが含まれています。解析はClickHouseサーバーに委ねられます。`insert_file`は次のパラメータを受け取ります: + +| パラメータ | タイプ | デフォルト | 説明 | +|--------------|-----------------|-------------------|------------------------------------------------------------------------------------------------------------------------| +| client | Client | *必須* | 挿入を行う`driver.Client ` | +| table | str | *必須* | 挿入するClickHouseテーブル。データベースを含む完全なテーブル名が許可されます。 | +| file_path | str | *必須* | データファイルのネイティブなファイルパス | +| fmt | str | CSV, CSVWithNames | ファイルのClickHouse入力フォーマット。 `column_names`が提供されていない場合はCSVWithNamesが想定されます。 | +| column_names | strのシーケンス | *None* | データファイル内の列名リスト。列名を含むフォーマットには必須ではありません。 | +| database | str | *None* | テーブルのデータベース。 テーブルが完全に資格化されている場合は無視されます。指定されていない場合、挿入はクライアントデータベースを使用します。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | +| compression | str | *None* | Content-Encoding HTTPヘッダーに使用される、認識されたClickHouse圧縮タイプ(zstd, lz4, gzip) | + +データが不整合であるか、日付/時刻の形式が異常な形式であるファイルの場合、設定(`input_format_allow_errors_num`または`input_format_allow_errors_ratio`など)はこのメソッドで認識されます。 + +```python +import clickhouse_connect +from clickhouse_connect.driver.tools import insert_file + +client = clickhouse_connect.get_client() +insert_file(client, 'example_table', 'my_data.csv', + settings={'input_format_allow_errors_ratio': .2, + 'input_format_allow_errors_num': 5}) +``` + +### クエリ結果のファイルとして保存する + +ClickHouseからローカルファイルシステムに直接ファイルをストリーミングすることができます。このために`raw_stream`メソッドを使用します。例として、クエリ結果をCSVファイルに保存したい場合、以下のコードスニペットを使用できます: + +```python +import clickhouse_connect + +if __name__ == '__main__': + client = clickhouse_connect.get_client() + query = 'SELECT number, toString(number) AS number_as_str FROM system.numbers LIMIT 5' + fmt = 'CSVWithNames' # または、CSV, CSVWithNamesAndTypes, TabSeparated, etc. + stream = client.raw_stream(query=query, fmt=fmt) + with open("output.csv", "wb") as f: + for chunk in stream: + f.write(chunk) +``` + +上記のコードは、以下の内容を持つ`output.csv`ファイルを生成します: + +```csv +"number","number_as_str" +0,"0" +1,"1" +2,"2" +3,"3" +4,"4" +``` + +これと同様に、[TabSeparated](https://clickhouse.com/docs/ja/interfaces/formats#tabseparated)やその他のフォーマットでデータを保存することができます。[データの入力と出力フォーマット](https://clickhouse.com/docs/ja/interfaces/formats)で利用可能なすべてのフォーマットオプションの概要を参照してください。 + +### 生のAPI + +ClickHouseデータとネイティブまたはサードパーティーデータタイプおよび構造間の変換を必要としないユースケースに対して、ClickHouse Connectクライアントは ClickHouse接続の直接使用のための2つのメソッドを提供します。 + +#### クライアント_raw_query_ メソッド + +`Client.raw_query`メソッドは、クライアント接続を使用してClickHouse HTTPクエリインターフェースを直接使用できるようにします。戻り値は未処理の`bytes`オブジェクトです。パラメータバインディング、エラー処理、リトライおよび設定管理を最小限のインターフェースで提供する便利なラッパーです: + +| パラメータ | タイプ | デフォルト | 説明 | +|---------------|------------------|------------|----------------------------------------------------------------------------------------------------------| +| query | str | *必須* | 有効なClickHouseクエリ | +| parameters | dictまたはiterable | *None* | [parameters description](#parameters-argument)を参照してください。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | | +| fmt | str | *None* | 結果のbytesのClickHouse出力フォーマット。 (指定されない場合、ClickHouseはTSVを使用します) | +| use_database | bool | True | クエリコンテキストのためにclickhouse-connectクライアントが割り当てたデータベースを使用 | +| external_data | ExternalData | *None* | クエリで使用するファイルまたはバイナリデータを含むExternalDataオブジェクト。[Advanced Queries (External Data)](#external-data)を参照してください。| + +結果の`bytes`オブジェクトを処理するのは呼び出し側の責任です。`Client.query_arrow`はClickHouseの`Arrow`出力フォーマットを使用して、このメソッドの薄いラッパーにすぎないことに注意してください。 + +#### クライアント_raw_stream_ メソッド + +`Client.raw_stream`メソッドは、`raw_query`メソッドと同じAPIを持ちますが、`bytes`オブジェクトのジェネレータ/ストリームソースとして使用できる`io.IOBase`オブジェクトを返します。現在では`query_arrow_stream`メソッドによって利用されています。 + +#### クライアント_raw_insert_ メソッド + +`Client.raw_insert`メソッドはクライアント接続を使用して`bytes`オブジェクトまたは`bytes`オブジェクトジェネレータの直接挿入を可能にします。挿入ペイロードを処理しないため、非常に高性能です。このメソッドは設定および挿入フォーマットの指定にオプションを提供します: + +| パラメータ | タイプ | デフォルト | 説明 | +|--------------|----------------------------------------|------------|-------------------------------------------------------------------------------------------| +| table | str | *必須* | 単一のテーブル名またはデータベース修飾されたテーブル名 | +| column_names | Sequence[str] | *None* | 挿入ブロックの列名。`fmt`から名前が含まれていない場合は必須 | +| insert_block | str, bytes, Generator[bytes], BinaryIO | *必須* | 挿入するデータ。文字列はクライアントのエンコーディングでエンコードされます。 | +| settings | dict | *None* | [settings description](#settings-argument)を参照してください。 | | +| fmt | str | *None* | `insert_block` bytesのClickHouse入力フォーマット。(指定されない場合、ClickHouseはTSVを使用します) | + +の呼び出し側の責任は、`insert_block`が指定されたフォーマットであることと指定された圧縮方法を使用していることです。ClickHouse ConnectはファイルのアップロードやPyArrowテーブルにこれらのraw insertsを使用し、解析をClickHouseサーバーに委ねます。 + +### ユーティリティクラスと機能 + +以下のクラスと関数も"パブリック"の`clickhouse-connect` APIの一部と見なされ、上記のクラスとメソッドと同様に、マイナリリース間で安定しています。これらのクラスと関数の重大な変更は、マイナ(ではなくパッチ)リリースでのみ発生し、少なくとも1つのマイナリリースで廃止ステータスのままで使用可能です。 + +#### 例外 + +すべてのカスタム例外(DB API 2.0仕様で定義されているものを含む)は、`clickhouse_connect.driver.exceptions`モジュールに定義されています。 +ドライバが実際に検出した例外はこれらのタイプを使用します。 + +#### Clickhouse SQLユーティリティ + +`clickhouse_connect.driver.binding`モジュールの関数およびDT64Paramクラスは、ClickHouse SQLクエリを適切に構築し、エスケープするために使用できます。同様に、`clickhouse_connect.driver.parser`モジュールの関数は、ClickHouseデータ型の名前を解析するために使用できます。 + +### マルチスレッド、マルチプロセス、および非同期/イベント駆動型の使用例 + +ClickHouse Connectは、マルチスレッド、マルチプロセス、およびイベントループ駆動/非同期アプリケーションでうまく機能します。すべてのクエリおよび挿入処理は単一スレッド内で行われるため、これらの操作は一般にスレッドセーフです。 +(いくつかの操作を低レベルで並列処理することは、単一スレッドのパフォーマンスペナルティを克服するための今後の改良可能性ですが、それでもスレッドセーフは維持されます。) + +各クエリまたは挿入が、それぞれ独自のQueryContextまたはInsertContextオブジェクト内で状態を維持するため、これらのヘルパーオブジェクトはスレッドセーフではなく、複数の処理ストリーム間で共有してはなりません。 +以下のセクションでは、コンテキストオブジェクトについての追加の議論が続きます。 + +さらに、同時に複数のクエリやインサートが「飛行中」になるアプリケーションの場合、考慮すべき2つの要素があります。1つ目は、クエリ/インサートに関連するClickHouseの「セッション」であり、2つ目はClickHouse Connect Clientインスタンスによって使用されるHTTP接続プールです。 + +### AsyncClientラッパー + +バージョン0.7.16以降、ClickHouse Connectは通常の`Client`の上に非同期ラッパーを提供しており、これにより`asyncio`環境でクライアントを使用することが可能です。 + +`AsyncClient`のインスタンスを取得するには、標準の`get_client`と同じパラメータを受け取る`get_async_client`ファクトリ関数を使用できます: + +```python +import asyncio + +import clickhouse_connect + + +async def main(): + client = await clickhouse_connect.get_async_client() + result = await client.query("SELECT name FROM system.databases LIMIT 1") + print(result.result_rows) + + +asyncio.run(main()) +``` + +`AsyncClient`は、標準の`Client`と同じメソッドを同じパラメータで持っていますが、適用可能な場合はコルーチンとして動作します。内部的には、I/O操作を行う`Client`のこれらのメソッドは、[run_in_executor](https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor)呼び出しでラップされています。 + +`AsyncClient`ラッパーを使用すると、I/O操作の完了を待つ間、実行スレッドとGILが解放されるため、マルチスレッドの性能が向上します。 + +注意:通常の`Client`と異なり、`AsyncClient`はデフォルトで`autogenerate_session_id`を`False`に強制します。 + +関連リンク:[run_async example](https://github.com/ClickHouse/clickhouse-connect/blob/main/examples/run_async.py). + +### ClickHouseセッションIDの管理 + +各ClickHouseクエリは、ClickHouseの「セッション」のコンテキスト内で実行されます。セッションは現在2つの目的で使用されます: +- 複数のクエリに特定のClickHouse設定を関連付けるため([ユーザー設定](/docs/ja/operations/settings/settings.md)を参照)。ClickHouseの`SET`コマンドを使用してユーザーセッションのスコープにおける設定を変更します。 +- [一時テーブル](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#temporary-tables)を追跡するため。 + +デフォルトでは、ClickHouse Connect Clientインスタンスを使用して実行される各クエリは、このセッション機能を有効にするために同じセッションIDを使用します。つまり、`SET`ステートメントと一時テーブルは、単一のClickHouseクライアントを使用する際に期待通りに機能します。しかし、設計上、ClickHouseサーバーは同じセッション内での同時クエリを許可しません。その結果、同時クエリを実行するClickHouse Connectアプリケーションには2つのオプションがあります。 + +- 実行の各スレッド(スレッド、プロセス、またはイベントハンドラ)に対して個別の`Client`インスタンスを作成し、自身のセッションIDを持たせます。これが最良のアプローチであり、各クライアントのセッション状態を保持します。 +- 各クエリにユニークなセッションIDを使用します。この方法は、一時テーブルや共有セッション設定が不要な状況で同時セッション問題を回避します。(共有設定はクライアント作成時にも提供できますが、これらは各リクエストで送信され、セッションに関連付けられません)。ユニークなsession_idは各リクエストの`settings`ディクショナリに追加するか、`autogenerate_session_id`共通設定を無効にすることができます: + +```python +from clickhouse_connect import common + +common.set_setting('autogenerate_session_id', False) # これはクライアントを作成する前に常に設定する必要があります。 +client = clickhouse_connect.get_client(host='somehost.com', user='dbuser', password=1234) +``` + +この場合、ClickHouse ConnectはセッションIDを送信せず、ClickHouseサーバーによってランダムなセッションIDが生成されます。再度、一時テーブルとセッションレベルの設定は利用できません。 + +### HTTP接続プールのカスタマイズ + +ClickHouse Connectは、`urllib3`接続プールを使用してサーバーへの基礎的なHTTP接続を処理します。デフォルトでは、すべてのクライアントインスタンスは同じ接続プールを共有しており、これはほとんどの使用例で十分です。このデフォルトプールは、アプリケーションで使用される各ClickHouseサーバーに最大8つのHTTP Keep Alive接続を維持します。 + +大規模なマルチスレッドアプリケーションでは、個別の接続プールが適切である場合があります。カスタマイズされた接続プールは、メインの`clickhouse_connect.get_client`関数への`pool_mgr`キーワード引数として提供できます: + +```python +import clickhouse_connect +from clickhouse_connect.driver import httputil + +big_pool_mgr = httputil.get_pool_manager(maxsize=16, num_pools=12) + +client1 = clickhouse_connect.get_client(pool_mgr=big_pool_mgr) +client2 = clickhouse_connect.get_client(pool_mgr=big_pool_mgr) +``` + +上記の例が示すように、クライアントはプールマネージャを共有することができ、各クライアント用に別々のプールマネージャを作成することもできます。PoolManagerを作成する際のオプションについて詳細を知りたい場合は、[urllib3 ドキュメンテーション](https://urllib3.readthedocs.io/en/stable/advanced-usage.html#customizing-pool-behavior)を参照してください。 + +## ClickHouse Connectを使ったデータのクエリ:上級利用法 + +### QueryContexts + +ClickHouse Connectは標準のクエリをQueryContext内で実行します。QueryContextには、ClickHouseデータベースに対するクエリを構築するために使用される主要な構造と、QueryResultや他の応答データ構造に結果を処理するために使用される設定が含まれています。これには、クエリそのもの、パラメータ、設定、読み取りフォーマット、その他のプロパティが含まれます。 + +QueryContextは、クライアントの`create_query_context`メソッドを使用して取得できます。このメソッドはコアクエリメソッドと同じパラメータを取ります。このクエリコンテキストは、`query`、`query_df`、または`query_np`メソッドに`context`キーワード引数として渡すことができ、これらのメソッドへの他の引数をすべてもしくは一部の代わりとして渡すことができます。メソッド呼び出しのために指定された追加の引数は、QueryContextのプロパティを上書きします。 + +最も明確なQueryContextの使用例は、異なるバインディングパラメータ値で同じクエリを送信することです。すべてのパラメータ値はディクショナリを使用して`QueryContext.set_parameters`メソッドを呼び出すことによって更新でき、`QueryContext.set_parameter`を使用して好きな`key`、`value`ペアを更新することもできます。 + +```python +client.create_query_context(query='SELECT value1, value2 FROM data_table WHERE key = {k:Int32}', + parameters={'k': 2}, + column_oriented=True) +result = client.query(context=qc) +assert result.result_set[1][0] == 'second_value2' +qc.set_parameter('k', 1) +result = test_client.query(context=qc) +assert result.result_set[1][0] == 'first_value2' +``` + +QueryContextsはスレッドセーフではないことに注意してくださいが、`QueryContext.updated_copy`メソッドを呼び出すことによってマルチスレッド環境でコピーを取得することができます。 + +### ストリーミングクエリ + +#### データブロック +ClickHouse Connectは、主要な`query`メソッドから取得するすべてのデータを、ClickHouseサーバーから受信したブロックのストリームとして処理します。これらのブロックは、ClickHouse独自の「ネイティブ」フォーマットで送受信されます。「ブロック」とは、単にバイナリデータのカラム列のシーケンスであり、各カラムは指定されたデータ型のデータ値を等しく含みます。(列指向データベースであるClickHouseは、このデータを同様の形式で保存します。)クエリから返されるブロックのサイズは、いくつかのレベル(ユーザープロファイル、ユーザー、セッション、またはクエリ)で設定できる2つのユーザー設定によって決まります。それらは次の通りです: + +- [max_block_size](/docs/ja/operations/settings/settings.md/#setting-max_block_size) -- ブロックの行数の制限。デフォルトは65536です。 +- [preferred_block_size_bytes](/docs/ja/operations/settings/settings.md/#preferred-block-size-bytes) -- ブロックのサイズのバイト数のソフト制限。デフォルトは1,000,000です。 + +`preferred_block_size_setting`に関わらず、各ブロックは`max_block_size`行を超えることはありません。クエリの種類によっては、返される実際のブロックのサイズは任意です。たとえば、多くのシャードをカバーする分散テーブルへのクエリは、各シャードから直接取得される小さなブロックを含むことがあります。 + +クライアントの`query_*_stream`メソッドの1つを使用する場合、結果はブロックごとに返されます。ClickHouse Connectは常に1つのブロックのみを読み込みます。これにより、大量のデータをメモリにすべて読み込むことなく処理することができます。アプリケーションは任意の数のブロックを処理する準備ができているはずで、各ブロックの正確なサイズは制御できません。 + +#### 遅延処理のためのHTTPデータバッファ + +HTTPプロトコルの制約により、ブロックがClickHouseサーバーがデータをストリーミングする速度よりも著しく遅い速度で処理されると、ClickHouseサーバーは接続を閉じ、処理スレッドで例外がスローされます。これをある程度緩和するためには、HTTPストリーミングバッファのバッファサイズを増やすことができます(デフォルトは10メガバイト)`http_buffer_size`設定を使用します。この状況で十分なメモリがアプリケーション利用可能であれば、大きな`http_buffer_size`値は問題ありません。バッファ内のデータは`lz4`や`zstd`圧縮を使用している場合は圧縮されて保存されるため、これらの圧縮タイプを使用すると利用可能なバッファ全体が増えます。 + +#### StreamContexts + +各`query_*_stream`メソッド(例えば`query_row_block_stream`)は、ClickHouseの`StreamContext`オブジェクトを返します。これはPythonのコンテキスト/ジェネレータを組み合わせたものです。基本的な使用法は以下の通りです: + +```python +with client.query_row_block_stream('SELECT pickup, dropoff, pickup_longitude, pickup_latitude FROM taxi_trips') as stream: + for block in stream: + for row in block: + +``` + +この例では、`StreamContext`を`with`文なしで使用しようとするとエラーが発生します。Pythonコンテキストを使用することで、すべてのデータが消費されなかった場合や、処理中に例外が発生した場合でもストリーム(この場合はストリーミングHTTPレスポンス)が適切に閉じられることが保証されます。さらに、`StreamContext`はストリームを消費するために一度だけ使用できます。`StreamContext`が終了した後に使用しようとすると、`StreamClosedError`が発生します。 + +StreamContextの`source`プロパティを使用して、親`QueryResult`オブジェクトにアクセスすることができ、そこにはカラム名やタイプが含まれています。 + +#### ストリームタイプ + +`query_column_block_stream`メソッドは、ネイティブのPythonデータタイプとして保存されたカラムデータのシーケンスとしてブロックを返します。上記の`taxi_trips`クエリを使用すると、返されるデータはリストで、リストの各要素は関連するカラムのすべてのデータを含む別のリスト(またはタプル)になります。したがって、`block[0]`は文字列だけを含むタプルとなります。列指向フォーマットは、カラム中のすべての値を集計操作する際に最も多く使用されます。 + +`query_row_block_stream`メソッドは、従来のリレーショナルデータベースのように行ごとのシーケンスとしてブロックを返します。タクシートリップの場合、返されるデータはリストで、リストの各要素はデータ行を表す別のリストです。したがって、`block[0]`は最初のタクシートリップのすべてのフィールド(順番に)を含み、`block[1]`は2番目のタクシートリップのすべてのフィールドを含む行となります。行指向の結果は通常、表示や変換プロセスに使用されます。 + +`query_row_stream`は便利なメソッドで、ストリームを通してiteratingする際に自動的に次のブロックに移動します。それ以外は`query_row_block_stream`と同じです。 + +`query_np_stream`メソッドは、各ブロックを2次元Numpy配列として返します。内部的にNumpy配列は(通常)カラムとして保存されているため、特定の行またはカラムメソッドは必要ありません。Numpy配列の「形状」は(columns, rows)として表現されます。NumpyライブラリはNumpy配列を操作するための多くのメソッドを提供します。なお、クエリ中のすべてのカラムが同じNumpy dtypeを共有している場合、返されるNumpy配列も1つのdtypeだけを持ち、内部構造を変更することなくreshape/rotateできることができます。 + +`query_df_stream`メソッドは、各ClickHouseブロックを2次元のPandas Dataframeとして返します。この例では、StreamContextオブジェクトが延期された形式でコンテキストとして使用できることを示していますが(ただし一度だけ) + +最後に、`query_arrow_stream`メソッドはClickHouse`ArrowStream`形式の結果をpyarrow.ipc.RecordBatchStreamReaderとして返し、StreamContextでラップします。各ストリームの反復はPyArrow RecordBlockを返します。 + +```python +df_stream = client.query_df_stream('SELECT * FROM hits') +column_names = df_stream.source.column_names +with df_stream: + for df in df_stream: + +``` + +### 読取りフォーマット + +読み取りフォーマットは、クライアントの`query`、`query_np`、および`query_df`メソッドから返される値のデータタイプを制御します。(`raw_query`および`query_arrow`はClickHouseからのデータを変更しないため、フォーマット制御は適用されません。)たとえば、UUIDを`native`フォーマットから`string`フォーマットに変更すると、ClickHouseの`UUID`カラムのクエリは標準の8-4-4-4-12RFC1422形式で文字列値として返されます。 + +データタイプのフォーマットとしては、ワイルドカードを含むことができます。フォーマットは1つの小文字の文字列です。 + +読み取りフォーマットは、複数のレベルで設定できます: + +- グローバルに、`clickhouse_connect.datatypes.format`パッケージ内で定義されているメソッドを使用して。これにより、構成されたデータタイプのフォーマットがすべてのクエリで制御されます。 +```python +from clickhouse_connect.datatypes.format import set_read_format + +# IPv6およびIPv4の両方の値を文字列として返します +set_read_format('IPv*', 'string') + +# すべてのDateタイプを基礎的なエポック秒またはエポック日として返します +set_read_format('Date*', 'int') +``` +- クエリ全体、オプションの`query_formats`ディクショナリアーギュメントを使用して。この場合、特定のデータタイプ(またはサブカラム)のカラムごとに設定されたフォーマットが使用されます。 +```python +# 任意のUUIDカラムを文字列として返します +client.query('SELECT user_id, user_uuid, device_uuid from users', query_formats={'UUID': 'string'}) +``` +- 特定のカラムに含まれる値の場合、オプションの`column_formats`ディクショナリアーギュメントを使用して。キーはClickHouseによって返されるカラム名で、フォーマットはデータカラムに対してのものであり、またはClickHouseのタイプ名とクエリフォーマットの値である2次レベルの「フォーマット」ディクショナリです。この2次ディクショナリは、タプルやマップなどのネストされたカラムタイプに使用できます。 +```python +# dev_addressカラムのIPv6値を文字列として返します +client.query('SELECT device_id, dev_address, gw_address from devices', column_formats={'dev_address':'string'}) +``` + +#### 読み取りフォーマットオプション(Pythonタイプ) + +| ClickHouse Type | Native Python Type | Read Formats | Comments | +|-----------------------|-----------------------|--------------|-------------------------------------------------------------------------------------------------------------------| +| Int[8-64], UInt[8-32] | int | - | | +| UInt64 | int | signed | Supersetは現在大きな符号なしUInt64値を処理できません | +| [U]Int[128,256] | int | string | PandasとNumpyのint値は最大64ビットであるため、これらは文字列として返すことができます | +| Float32 | float | - | すべてのPythonのfloatは内部で64ビットです | +| Float64 | float | - | | +| Decimal | decimal.Decimal | - | | +| String | string | bytes | ClickHouseのStringカラムは固有のエンコーディングを持っていないため、可変長のバイナリデータにも使用されます | +| FixedString | bytes | string | FixedStringは固定サイズのバイト配列ですが、時にはPythonの文字列として扱われることもあります | +| Enum[8,16] | string | string, int | Pythonのenumは空の文字列を許容しないため、すべてのenumは文字列か基本のint値としてレンダリングされます | +| Date | datetime.date | int | ClickHouseはDateを1970年1月1日からの日数として保存します。この値はintとして提供されます | +| Date32 | datetime.date | int | Dateと同じですが、より広い日付の範囲を持ちます | +| DateTime | datetime.datetime | int | ClickHouseはDateTimeをエポック秒で保存します。この値はintとして提供されます | +| DateTime64 | datetime.datetime | int | Pythonのdatetime.datetimeはマイクロ秒精度に制限されています。生の64ビットのint値が利用可能です | +| IPv4 | ipaddress.IPv4Address | string | IPアドレスは文字列として読み込まれ、適切にフォーマットされた文字列がIPアドレスとして挿入されることができます | +| IPv6 | ipaddress.IPv6Address | string | IPアドレスは文字列として読み込まれ、適切にフォーマットされた文字列がIPアドレスとして挿入されることができます | +| Tuple | dict or tuple | tuple, json | 名前付きタプルはデフォルトでDictionaryとして返されます。また、名前付きタプルはJSON文字列としても返されます | +| Map | dict | - | | +| Nested | Sequence[dict] | - | | +| UUID | uuid.UUID | string | UUIDはRFC 4122の標準形式を使用して文字列として読み込まれることができます | +| JSON | dict | string | デフォルトではPythonのDictionaryが返されます。`string`フォーマットではJSON文字列が返されます | +| Variant | object | - | 保存されている値のClickHouseデータタイプに一致するPythonタイプが返されます | +| Dynamic | object | - | 保存されている値のClickHouseデータタイプに一致するPythonタイプが返されます | + + +### 外部データ + +ClickHouseのクエリは、任意のClickHouseフォーマットで外部データを受け入れることができます。このバイナリデータはクエリ文字列と共に送信され、データを処理するために使用されます。外部データ機能の詳細は[こちら](/docs/ja/engines/table-engines/special/external-data.md)です。クライアントの`query*`メソッドは、この機能を利用するためにオプションの`external_data`パラメータを受け入れます。`external_data`パラメータの値は`clickhouse_connect.driver.external.ExternalData`オブジェクトである必要があります。このオブジェクトのコンストラクタは、以下の引数を受け入れます: + +| Name | Type | Description | +|-----------|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------| +| file_path | str | 外部データを読み込むためのローカルシステムパスのファイルパス。`file_path`または`data`のいずれかが必要です | +| file_name | str | 外部データ「ファイル」の名前。提供されない場合は、(拡張子なしの)`file_path`から決定されます | +| data | bytes | バイナリ形式の外部データ(ファイルから読み込む代わりに)。`data`または`file_path`のいずれかが必要です | +| fmt | str | データのClickHouse [入力フォーマット](/docs/ja/sql-reference/formats.mdx)。デフォルトは`TSV` | +| types | str or seq of str | 外部データのカラムデータタイプのリスト。文字列の場合、型はコンマで区切られるべきです。`types`または`structure`のいずれかが必要です | +| structure | str or seq of str | データのカラム名+データタイプのリスト(例を参照)。`structure`または`types`のいずれかが必要です | +| mime_type | str | ファイルデータのオプションのMIMEタイプ。現在、ClickHouseはこのHTTPサブヘッダを無視します | + + +外部CSVファイルを含む「映画」データをクエリに送信し、ClickHouseサーバー上に既に存在する`directors`テーブルとそのデータを結合する: + +```python +import clickhouse_connect +from clickhouse_connect.driver.external import ExternalData + +client = clickhouse_connect.get_client() +ext_data = ExternalData(file_path='/data/movies.csv', + fmt='CSV', + structure=['movie String', 'year UInt16', 'rating Decimal32(3)', 'director String']) +result = client.query('SELECT name, avg(rating) FROM directors INNER JOIN movies ON directors.name = movies.director GROUP BY directors.name', + external_data=ext_data).result_rows +``` + +追加の外部データファイルは、コンストラクタと同じパラメータを取る`add_file`メソッドを使用して初期ExternalDataオブジェクトに追加できます。HTTPの場合、すべての外部データは`multi-part/form-data`ファイルアップロードの一部として送信されます。 + +### タイムゾーン +ClickHouse DateTimeおよびDateTime64の値には複数の方法でタイムゾーンを適用できます。内部的に、ClickHouseサーバーは常に任意のDateTimeまたはDateTime64オブジェクトをタイムゾーンナイーブな数値、つまり1970-01-01 00:00:00 UTC時間からの秒数として保存します。DateTime64値の場合、表現は精度に依存してエポックからのミリ秒、マイクロ秒、またはナノ秒です。その結果、いかなるタイムゾーン情報の適用も常にクライアント側で行われます。これには有意義な追加計算が伴うため、パフォーマンスが重要なアプリケーションでは、DateTimeタイプをエポックタイムスタンプとして扱うことをお勧めします。ユーザー表示や変換を除き、Pandas TimestampなどのPandasデータ型はパフォーマンスを向上させるために常にエポックナノ秒を表す64ビット整数となるためです。 + +クエリでタイムゾーンアウェアなデータタイプ、特にPythonの`datetime.datetime`オブジェクトを使用する際、`clickhouse-connect`はクライアント側タイムゾーンを以下の優先順位ルールに従って適用します: + +1. クエリメソッドパラメータ`client_tzs`がクエリに指定されている場合、その特定のカラムタイムゾーンが適用されます。 +2. ClickHouseカラムにタイムゾーンメタデータが含まれている場合(例えば、DateTime64(3, 'America/Denver')のようなタイプ)、ClickHouseカラムタイムゾーンが適用されます。(このタイムゾーンメタデータはClickHouseバージョン23.2以前のDateTimeカラムには利用できません) +3. クエリメソッドパラメータ`query_tz`がクエリに指定されている場合、「クエリタイムゾーン」が適用されます。 +4. クエリまたはセッションにタイムゾーン設定が適用されている場合、そのタイムゾーンが適用されます。(この機能はClickHouseサーバーでまだリリースされていません) +5. 最後に、クライアントの`apply_server_timezone`パラメータがTrue(デフォルトの設定)に設定されている場合、ClickHouseサーバータイムゾーンが適用されます。 + +これらのルールに基づいて適用されたタイムゾーンがUTCである場合、`clickhouse-connect`は常にタイムゾーンナイーブなPython`datetime.datetime`オブジェクトを返します。このタイムゾーンナイーブなオブジェクトには、必要に応じてアプリケーションコードで追加のタイムゾーン情報を加えることができます。 + +## ClickHouse Connectを使ったデータのインサート:上級利用法 + +### InsertContexts + +ClickHouse ConnectはすべてのインサートをInsertContext内で実行します。InsertContextには、クライアントの`insert`メソッドに引数として渡されたすべての値が含まれています。さらに、InsertContextが最初に構築されたとき、ClickHouse Connectはネイティブフォーマットの効率的なインサートのために必要なインサートカラムのデータタイプを取得します。このInsertContextを複数のインサートで再使用することにより、この「事前クエリ」を回避し、インサートをより迅速かつ効率的に実行します。 + +InsertContextは、クライアントの`create_insert_context`メソッドを使用して取得できます。このメソッドは、`insert`関数と同じ引数を受け取ります。再利用のために修正すべきはInsertContextsの`data`プロパティのみであることに注意してください。これによって、同じテーブルに新しいデータを繰り返しインサートするための再利用可能なオブジェクトが提供されることと一致しています。 + +```python +test_data = [[1, 'v1', 'v2'], [2, 'v3', 'v4']] +ic = test_client.create_insert_context(table='test_table', data='test_data') +client.insert(context=ic) +assert client.command('SELECT count() FROM test_table') == 2 +new_data = [[3, 'v5', 'v6'], [4, 'v7', 'v8']] +ic.data = new_data +client.insert(context=ic) +qr = test_client.query('SELECT * FROM test_table ORDER BY key DESC') +assert qr.row_count == 4 +assert qr[0][0] == 4 +``` + +InsertContextsはインサートプロセス中に更新される可変の状態を持つため、スレッドセーフではありません。 + +### 書き込みフォーマット + +書き込みフォーマットは、現在限られた数のタイプに対して実装されています。ほとんどの場合、ClickHouse Connectは最初の(nullでない)データ値の型をチェックすることによって、カラムに対して適切な書き込みフォーマットを自動的に判断しようとします。たとえば、DateTimeカラムに挿入する場合、カラムの最初のインサート値がPython整数である場合、ClickHouse Connectはそれが実際にはエポック秒であると仮定して整数値を直接挿入します。 + +ほとんどのケースで、データタイプの書き込みフォーマットを上書きする必要はありませんが、`clickhouse_connect.datatypes.format`パッケージの関連メソッドを使用してグローバルレベルで行うことができます。 + +#### 書き込みフォーマットオプション + +| ClickHouse Type | Native Python Type | Write Formats | Comments | +|-----------------------|-----------------------|---------------|-------------------------------------------------------------------------------------------------------------| +| Int[8-64], UInt[8-32] | int | - | | +| UInt64 | int | | | +| [U]Int[128,256] | int | | | +| Float32 | float | | | +| Float64 | float | | | +| Decimal | decimal.Decimal | | | +| String | string | | | +| FixedString | bytes | string | 文字列として挿入された場合、追加のバイトはゼロに設定されます | +| Enum[8,16] | string | | | +| Date | datetime.date | int | ClickHouseは日付を1970年1月1日からの「エポック日」値として保存します。整数型はこれを仮定します | +| Date32 | datetime.date | int | 日付と同じですが、より広い日付の範囲を持ちます | +| DateTime | datetime.datetime | int | ClickHouseはDateTimeをエポック秒で保存します。int型はこの「エポック秒」値と仮定されます | +| DateTime64 | datetime.datetime | int | Pythonのdatetime.datetimeはマイクロ秒の精度に制限されています。生の64ビットint値が利用可能です | +| IPv4 | ipaddress.IPv4Address | string | 正しくフォーマットされた文字列はIPv4アドレスとして挿入されることができます | +| IPv6 | ipaddress.IPv6Address | string | 正しくフォーマットされた文字列はIPv6アドレスとして挿入されることができます | +| Tuple | dict or tuple | | | +| Map | dict | | | +| Nested | Sequence[dict] | | | +| UUID | uuid.UUID | string | 正しくフォーマットされた文字列はClickHouse UUIDとして挿入されることができます | +| JSON/Object('json') | dict | string | DictionaryまたはJSON文字列をJSONカラムに挿入することができます(注意: `Object('json')` は非推奨です) | +| Variant | object | | 現時点ではすべてのバリアントが文字列として挿入され、ClickHouseサーバーによって解析されます | +| Dynamic | object | | 警告 - 現時点では、Dynamicカラムへの挿入はClickHouse文字列として永続化されます | + + +## 追加オプション + +ClickHouse Connectは、上級のユースケースのためにいくつかの追加オプションを提供します + +### グローバル設定 + +ClickHouse Connectの動作をグローバルに制御する設定が少数あります。それらはトップレベルの`common`パッケージからアクセス可能です: + +```python +from clickhouse_connect import common + +common.set_setting('autogenerate_session_id', False) +common.get_setting('invalid_setting_action') +'drop' +``` + +:::note +これらの共通設定 `autogenerate_session_id`, `product_name`, および `readonly` は、常にクライアントを作成する前に +`clickhouse_connect.get_client` メソッドを使用して変更する必要があります。クライアント作成後にこれらの設定を変更しても +既存のクライアントの動作に影響を及ぼしません。 +::: + +現在定義されているグローバル設定は10個です: + +| Setting Name | Default | Options | Description | +|-------------------------|---------|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| autogenerate_session_id | True | True, False | 各クライアントセッションのために新しいUUID(1)セッションIDを自動生成(指定されていない場合)。クライアントまたはクエリレベルでセッションIDが提供されない場合(ClickHouseは内部ランダムIDを各クエリに生成します) | +| invalid_setting_action | 'error' | 'drop', 'send', 'error' | 無効または読み取り専用の設定が提供された場合のアクション(クライアントセッションまたはクエリのいずれか)。`drop`の場合は設定が無視され、`send`の場合は設定がClickHouseへ送信され、`error`の場合はクライアント側でProgrammingErrorが発生します | +| dict_parameter_format | 'json' | 'json', 'map' | これはパラメータ化を行ったクエリがPythonのDictionaryをJSONまたはClickHouseのMap構文に変換するかどうかを制御します。JSONカラムへの挿入には`json`、ClickHouseのMapカラム用には`map`を使用します | +| product_name | | | クエリと共にClickHouseに渡される文字列で、ClickHouse Connectを使用しているアプリをトラッキングするために使用されます。形式&gl/;product name;≷<product version>であるべきです | +| max_connection_age | 600 | | HTTP Keep Alive接続がオープン/再利用され続ける最大の秒数。ロードバランサ/プロキシの背後の単一のClickHouseノードへの接続の集まりを防ぎます(デフォルト10分です)。 | +| readonly | 0 | 0, 1 | ClickHouseバージョン19.17以前の操作を許可するために"read_only"設定と一致するよう設定可能。非常に古いClickHouseバージョンでの操作を許可するために使用。 | +| use_protocol_version | True | True, False | クライアントプロトコルバージョンを使用します。 これはDateTimeタイムゾーンカラムに必要ですが、chproxyの現在のバージョンでは動作しません。 | +| max_error_size | 1024 | | クライアントエラーメッセージに返される最大文字数。ClickHouseのエラーメッセージ全体を取得する設定としては0を使用します。デフォルトは1024文字。 | +| send_os_user | True | True, False | クライアント情報でClickHouseに送信されるオペレーティングシステムユーザー(HTTP User-Agent文字列)を含める。 | +| http_buffer_size | 10MB | | HTTPストリーミングクエリに使用される「インメモリ」バッファのサイズ(バイト単位) | + +### 圧縮 + +ClickHouse Connectは、クエリ結果とインサートの両方に対してlz4、zstd、brotli、およびgzip圧縮をサポートしています。圧縮を使用することは、多くの場合、ネットワーク帯域幅/転送速度とCPU使用量(クライアントとサーバーの両方)の間のトレードオフがあることを常に覚えておいてください。 + +圧縮データを受信するには、ClickHouseサーバーの`enable_http_compression`を1に設定するか、ユーザーが「クエリごと」に設定を変更する権限を持っている必要があります。 + +圧縮は、`clickhouse_connect.get_client`ファクトリメソッドを呼び出す場合の`compress`パラメータで制御されます。デフォルトでは`compress`は `True` に設定されており、これによりデフォルトの圧縮設定がトリガーされます。`query`、`query_np`、および`query_df`クライアントメソッドを使用して実行されるクエリでは、ClickHouse Connectは`query`クライアントメソッドを使用して実行されるクエリに対して、`Accept-Encoding`ヘッダーを`lz4`、 `zstd`、`br`(brotliライブラリがインストールされている場合)、`gzip` および`deflate`エンコーディングとともにクエリを実行します。(クリックハウスサーバーの大多数のリクエストでは、`zstd`圧縮ペイロードが返されます。)インサートの場合、デフォルトでClickHouse Connectはlz4圧縮を使ってインサートブロックを圧縮し、`Content-Encoding: lz4` HTTP ヘッダーを送信します。 + +`get_client`の`compress`パラメータは、特定の圧縮メソッド、`lz4`、`zstd`、`br` または`gzip`のいずれかに設定することもできます。そのメソッドは、インサートとクエリ結果(クライアントサーバーによってサポートされている場合)の両方で使用されます。`zstd`および`lz4`圧縮ライブラリは、現在ClickHouse Connectとともにデフォルトでインストールされています。`br`/brotliが指定されている場合、brotliライブラリは別途インストールする必要があります。 + +`raw*`クライアントメソッドは、クライアント設定によって指定された圧縮を使用しないことに注意してください。 + +また、`gzip`圧縮の使用を推奨しません。データの圧縮と解凍の両方で代替手段と比較してかなり遅いためです。 + +### HTTPプロキシサポート + +ClickHouse Connect では、urllib3ライブラリを使用した基本的なHTTPプロキシサポートが追加されています。標準的な`HTTP_PROXY`と`HTTPS_PROXY`環境変数を認識します。これらの環境変数を使用することで、`clickhouse_connect.get_client`メソッドを使用して作成されるすべてのクライアントになります。または、クライアントごとに設定するために、get_clientメソッドの`http_proxy`や`https_proxy`引数を使用することができます。詳細なHTTPプロキシサポートの実装については、[urllib3](https://urllib3.readthedocs.io/en/stable/advanced-usage.html#http-and-https-proxies) +のドキュメントを参照してください。 + +Socksプロキシを使用するには、urllib3 SOCKSProxyManagerを`pool_mgr`引数として`get_client`に送ることができます。これにはPySocksライブラリを直接インストールするか、urllib3の依存関係として`[socks]`オプションを使用する必要があります。 + +### 古いJSONデータタイプ + +エクスペリメンタルな`Object`(または`Object('json')`)データタイプは非推奨とされており、製品化環境には避けるべきです。ClickHouse Connectはこのデータタイプに対する限定的なサポートを引き続き提供しており、過去との互換性のためのものです。このサポートには、ディクショナリまたはそれに相当する「トップレベル」または「親」JSON値を返すと想定されるクエリは含まれておらず、そのようなクエリは例外を発生させます。 + +### 新しい Variant/Dynamic/JSON データタイプ(エクスペリメンタル機能) + +バージョン0.8.0のリリースから、クリックハウスコネクトは新しい(まだエクスペリメンタルな)ClickHouseタイプVariant、Dynamic、およびJSONに対するエクスペリメンタルサポートを提供しています。 + +#### 使用上の注意事項 +- JSONデータは、PythonDictionaryまたはJSON文字列(例えば`{}`)として挿入できます。他の形式のJSONデータはサポートされていません。 +- これらのタイプのサブカラム/パスを使用したクエリは、サブカラムの型を返します。 +- 他の使用上の注意については、メインのClickHouseドキュメントを参照してください。 + +#### 既知の制限: +- これらのタイプを使用する前に、ClickHouseの設定で有効化する必要があります。 +- 新しいJSONタイプはClickHouse 24.8リリースから利用可能です。 +- 内部フォーマットの変更のため、クリックハウスコネクトはClickHouse 24.7リリース以降のVariantタイプとしか互換性がありません。 +- 返されるJSONオブジェクトは最大で`max_dynamic_paths`の要素数しか返されません(デフォルトで1024)。これは将来のリリースで修正されます。 +- `Dynamic`カラムへの挿入は常にPython値の文字列表現となります。これについては、https://github.com/ClickHouse/ClickHouse/issues/70395の修正後、将来のリリースで修正される予定です。 +- 新しいタイプの実装はCコードでの最適化がされていないため、シンプルで確立されたデータタイプと比べて若干パフォーマンスが遅い可能性があります。 diff --git a/docs/ja/integrations/language-clients/rust.md b/docs/ja/integrations/language-clients/rust.md new file mode 100644 index 00000000000..20024dbce1d --- /dev/null +++ b/docs/ja/integrations/language-clients/rust.md @@ -0,0 +1,550 @@ +--- +sidebar_label: Rust +sidebar_position: 4 +keywords: [clickhouse, rs, rust, cargo, crate, http, client, connect, integrate] +slug: /ja/integrations/rust +description: ClickHouseに接続するための公式Rustクライアント。 +--- + +# ClickHouse Rust クライアント + +ClickHouseに接続するための公式Rustクライアントは、もともと[Paul Loyd](https://github.com/loyd)によって開発されました。クライアントのソースコードは[GitHubリポジトリ](https://github.com/ClickHouse/clickhouse-rs)で利用可能です。 + +## 概要 + +* 行をエンコード/デコードするために`serde`を使用します。 +* `serde`属性をサポート:`skip_serializing`, `skip_deserializing`, `rename`。 +* HTTPトランスポート上で[`RowBinary`](https://clickhouse.com/docs/ja/interfaces/formats#rowbinary)フォーマットを使用します。 + * TCP上で[`Native`](https://clickhouse.com/docs/ja/interfaces/formats#native)に切り替える計画があります。 +* TLSをサポートします(`native-tls`および`rustls-tls`機能を通じて)。 +* 圧縮と解凍(LZ4)をサポートします。 +* データの選択や挿入、DDLの実行、クライアント側でのバッチ処理のためのAPIを提供します。 +* 単体テスト用の便利なモックを提供します。 + +## インストール + +クレートを使用するには、`Cargo.toml`に次のように追加してください: + +```toml +[dependencies] +clickhouse = "0.12.2" + +[dev-dependencies] +clickhouse = { version = "0.12.2", features = ["test-util"] } +``` + +参考: [crates.ioページ](https://crates.io/crates/clickhouse)。 + +## Cargo機能 + +* `lz4`(デフォルトで有効) — `Compression::Lz4`と`Compression::Lz4Hc(_)`のバリアントを有効にします。有効にすると、`Compression::Lz4`が`WATCH`を除くすべてのクエリに対してデフォルトで使用されます。 +* `native-tls` — `HTTPS`スキーマを持つURLを`hyper-tls`を通じてサポートし、OpenSSLにリンクします。 +* `rustls-tls` — `HTTPS`スキーマを持つURLを`hyper-rustls`を通じてサポートし、OpenSSLにリンクしません。 +* `inserter` — `client.inserter()`を有効にします。 +* `test-util` — モックを追加します。詳しくは[例](https://github.com/ClickHouse/clickhouse-rs/tree/main/examples/mock.rs)を参照してください。`dev-dependencies`のみに使用してください。 +* `watch` — `client.watch`機能を有効にします。詳細については該当セクションを参照してください。 +* `uuid` — `serde::uuid`を追加し、[uuid](https://docs.rs/uuid)クレートと連携します。 +* `time` — `serde::time`を追加し、[time](https://docs.rs/time)クレートと連携します。 + +:::important +`HTTPS` URL経由でClickHouseに接続する場合は、`native-tls`または`rustls-tls`機能を有効にする必要があります。 +両方を有効にした場合、`rustls-tls`機能が優先されます。 +::: + +## ClickHouseバージョンの互換性 + +クライアントはClickHouseのLTSまたはそれ以降のバージョン、およびClickHouse Cloudと互換性があります。 + +ClickHouseサーバーv22.6より前のバージョンは、[いくつかの稀なケースでRowBinaryを正しく処理しません](https://github.com/ClickHouse/ClickHouse/issues/37420)。 +この問題を解決するには、v0.11+を使用し、`wa-37420`機能を有効にできます。この機能は新しいClickHouseバージョンでは使用しないでください。 + +## 例 + +クライアントリポジトリの[例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples)でクライアント利用のさまざまなシナリオをカバーすることを目指しています。概要は[examples README](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/README.md#overview)で利用可能です。 + +例や以下のドキュメントで不明な点や不足がある場合は、[お問い合わせください](./rust.md#contact-us)。 + +## 使用方法 + +:::note +`ch2rs` crateは、ClickHouseから行タイプを生成するのに便利です。 +::: + +### クライアントインスタンスの作成 + +:::tip +作成されたクライアントを再利用するか、基礎のhyper接続プールを再利用するためにクローンしてください。 +::: + +```rust +use clickhouse::Client; + +let client = Client::default() + // プロトコルとポートの両方を含める必要があります + .with_url("http://localhost:8123") + .with_user("name") + .with_password("123") + .with_database("test"); +``` + +### HTTPSまたはClickHouse Cloud接続 + +HTTPSは`rustls-tls`または`native-tls`のcargo機能で動作します。 + +その後、通常の方法でクライアントを作成します。この例では、環境変数を使用して接続の詳細を保存しています: + +:::important +URLはプロトコルとポートの両方を含める必要があります。例:`https://instance.clickhouse.cloud:8443`。 +::: + +```rust +fn read_env_var(key: &str) -> String { + env::var(key).unwrap_or_else(|_| panic!("{key} env variable should be set")) +} + +let client = Client::default() + .with_url(read_env_var("CLICKHOUSE_URL")) + .with_user(read_env_var("CLICKHOUSE_USER")) + .with_password(read_env_var("CLICKHOUSE_PASSWORD")); +``` + +参考: +- クライアントリポジトリの[ClickHouse CloudのHTTPS使用例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/clickhouse_cloud.rs)。これはオンプレミスのHTTPS接続でも適用可能です。 + +### 行の選択 + +```rust +use serde::Deserialize; +use clickhouse::Row; +use clickhouse::sql::Identifier; + +#[derive(Row, Deserialize)] +struct MyRow<'a> { + no: u32, + name: &'a str, +} + +let table_name = "some"; +let mut cursor = client + .query("SELECT ?fields FROM ? WHERE no BETWEEN ? AND ?") + .bind(Identifier(table_name)) + .bind(500) + .bind(504) + .fetch::>()?; + +while let Some(row) = cursor.next().await? { .. } +``` + +* プレースホルダー`?fields`は、`Row`のフィールド`no, name`に置き換えられます。 +* プレースホルダー`?`は、以下の`bind()`呼び出しで値に置き換えられます。 +* 便利な`fetch_one::()`と`fetch_all::()`メソッドは、それぞれ最初の行またはすべての行を取得するために使用できます。 +* `sql::Identifier`はテーブル名をバインドするために使用できます。 + +注意:応答全体がストリーミングされるため、カーソルは一部の行を生成した後でもエラーを返す場合があります。この場合、サーバー側の応答バッファリングを有効にするために`query(...).with_option("wait_end_of_query", "1")`を試すことができます。[詳細はこちら](https://clickhouse.com/docs/ja/interfaces/http/#response-buffering)。`buffer_size`オプションも役立ちます。 + +:::warning +行を選択するときに`wait_end_of_query`を慎重に使用してください。サーバー側でのメモリ消費が増加し、パフォーマンス全体が低下する可能性があります。 +::: + +### 行の挿入 + +```rust +use serde::Serialize; +use clickhouse::Row; + +#[derive(Row, Serialize)] +struct MyRow { + no: u32, + name: String, +} + +let mut insert = client.insert("some")?; +insert.write(&MyRow { no: 0, name: "foo".into() }).await?; +insert.write(&MyRow { no: 1, name: "bar".into() }).await?; +insert.end().await?; +``` + +* `end()`が呼び出されないと、`INSERT`は中止されます。 +* 行はネットワーク負荷を分配するストリームとして順次送信されます。 +* ClickHouseは、すべての行が同じパーティションに適合し、その数が[`max_insert_block_size`](https://clickhouse.tech/docs/en/operations/settings/settings/#settings-max_insert_block_size)以下である場合にのみバッチをアトミックに挿入します。 + +### 非同期挿入(サーバー側バッチ処理) + +クライアント側でデータのバッチ処理を避けるために[ClickHouse非同期挿入](https://clickhouse.com/docs/ja/optimize/asynchronous-inserts)を利用できます。これは、`async_insert`オプションを`insert`メソッドに(またはクライアントインスタンス自体に)提供することで実現できます。これにより、すべての`insert`呼び出しに影響します。 + +```rust +let client = Client::default() + .with_url("http://localhost:8123") + .with_option("async_insert", "1") + .with_option("wait_for_async_insert", "0"); +``` + +参考: +- クライアントリポジトリの[非同期挿入の例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/async_insert.rs)。 + +### インサータ機能(クライアント側バッチ処理) + +`inserter` cargo機能が必要です。 + +```rust +let mut inserter = client.inserter("some")? + .with_timeouts(Some(Duration::from_secs(5)), Some(Duration::from_secs(20))) + .with_max_bytes(50_000_000) + .with_max_rows(750_000) + .with_period(Some(Duration::from_secs(15))); + +inserter.write(&MyRow { no: 0, name: "foo".into() })?; +inserter.write(&MyRow { no: 1, name: "bar".into() })?; +let stats = inserter.commit().await?; +if stats.rows > 0 { + println!( + "{} bytes, {} rows, {} transactions have been inserted", + stats.bytes, stats.rows, stats.transactions, + ); +} + +// アプリケーション終了時にinserterを最終化し、残りの行をコミットすることを忘れないでください。. `end()`は統計も提供します。 +inserter.end().await?; +``` + +* `Inserter`は、いずれかのしきい値(`max_bytes`、`max_rows`、`period`)に達した場合に`commit()`でアクティブな挿入を終了します。 +* パラレルインサータによる負荷スパイクを避けるために、`with_period_bias`を使用してアクティブな`INSERT`間の間隔がバイアスされます。 +* `Inserter::time_left()`を使用して、現在の期間が終了した時を検出できます。項目がまれに生成される場合は、再び`Inserter::commit()`を呼び出して制限をチェックしてください。 +* 時間しきい値は、インサータを高速にするために[quanta](https://docs.rs/quanta)クレートを使用して実装されています。`test-util`が有効な場合、使用されません(したがって、カスタムテストで`tokio::time::advance()`によって時間を管理できます)。 +* `commit()`呼び出し間のすべての行は、同じ`INSERT`ステートメントで挿入されます。 + +:::warning +挿入を終了/最終化する場合にフラッシュすることを忘れないでください: +```rust +inserter.end().await?; +``` +::: + +### DDLの実行 + +単一ノードの展開では、次のようにDDLを実行するだけで十分です: + +```rust +client.query("DROP TABLE IF EXISTS some").execute().await?; +``` + +しかし、負荷分散装置やClickHouse Cloudを使用している場合、すべてのレプリカでDDLが適用されるのを待つことが推奨されます。これは`wait_end_of_query`オプションを使用して行うことができます: + +```rust +client + .query("DROP TABLE IF EXISTS some") + .with_option("wait_end_of_query", "1") + .execute() + .await?; +``` + +### ClickHouse設定 + +`with_option`メソッドを使用して、さまざまな[ClickHouse設定](https://clickhouse.com/docs/ja/operations/settings/settings)を適用できます。例えば: + +```rust +let numbers = client + .query("SELECT number FROM system.numbers") + // この設定はこの特定のクエリにのみ適用されます。グローバルなクライアント設定を上書きします。 + .with_option("limit", "3") + .fetch_all::() + .await?; +``` + +`query`と同様に、`insert`および`inserter` メソッドでも同様に機能します。さらに、`Client`インスタンスでこのメソッドを呼び出して、すべてのクエリに対するグローバル設定を行うことができます。 + +### クエリID + +`with_option`を使用して、ClickHouseのクエリログでクエリを識別するために`query_id`オプションを設定できます。 + +```rust +let numbers = client + .query("SELECT number FROM system.numbers LIMIT 1") + .with_option("query_id", "some-query-id") + .fetch_all::() + .await?; +``` + +`query`と同様に、`insert`および`inserter` メソッドでも同様に機能します。 + +:::danger +`query_id`を手動で設定する場合は、それが一意であることを確認してください。UUIDはそのための良い選択肢です。 +::: + +参考:クライアントリポジトリの[query_idの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/query_id.rs)。 + +### セッションID + +`query_id`と同様に、同じセッションでステートメントを実行するために`session_id`を設定できます。`session_id`は、クライアントレベルでグローバルに、または`query`、`insert`、`inserter`呼び出しごとに設定することができます。 + +```rust +let client = Client::default() + .with_url("http://localhost:8123") + .with_option("session_id", "my-session"); +``` + +:::danger +クラスター化されたデプロイメントでは、「スティッキーセッション」がないため、この機能を適切に利用するには特定のクラスター ノードに接続する必要があります。たとえば、ラウンドロビンの負荷分散装置は、後続のリクエストが同じ ClickHouse ノードによって処理されることを保証しません。 +::: + +参考:クライアントリポジトリの[session_idの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/session_id.rs)。 + +### カスタムHTTPヘッダー + +プロキシ認証を使用している場合やカスタムヘッダーを渡す必要がある場合、次のように行うことができます: + +```rust +let client = Client::default() + .with_url("http://localhost:8123") + .with_header("X-My-Header", "hello"); +``` + +参考:クライアントリポジトリの[カスタムHTTPヘッダーの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/custom_http_headers.rs)。 + +### カスタムHTTPクライアント + +基礎となるHTTP接続プールの設定を微調整するのに役立ちます。 + +```rust +use hyper_util::client::legacy::connect::HttpConnector; +use hyper_util::client::legacy::Client as HyperClient; +use hyper_util::rt::TokioExecutor; + +let connector = HttpConnector::new(); // またはHttpsConnectorBuilder +let hyper_client = HyperClient::builder(TokioExecutor::new()) + // クライアント側で特定のアイドルソケットを生かす時間(ミリ秒単位)。 + // これはClickHouseサーバーのKeepAliveタイムアウトよりもかなり短いことが想定されています。 + // これは、デフォルトで23.11バージョン以前の3秒、以降のバージョンの後10秒でした。 + .pool_idle_timeout(Duration::from_millis(2_500)) + // プール内で許可される最大のアイドルKeep-Alive接続。 + .pool_max_idle_per_host(4) + .build(connector); + +let client = Client::with_http_client(hyper_client).with_url("http://localhost:8123"); +``` + +:::warning +この例はレガシーなHyper APIに依存しており、将来変更される可能性があります。 +::: + +参考:クライアントリポジトリの[カスタムHTTPクライアントの例](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/custom_http_client.rs)。 + +## データ型 + +:::info +追加の例も参照してください: +* [シンプルなClickHouseデータ型](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/data_types_derive_simple.rs) +* [コンテナ型のClickHouseデータ型](https://github.com/ClickHouse/clickhouse-rs/blob/main/examples/data_types_derive_containers.rs) +::: + +* `(U)Int(8|16|32|64|128)`は対応する`(u|i)(8|16|32|64|128)`型またはその周りの新しい型にマッピングします。 +* `(U)Int256`は直接サポートされていませんが、[回避策があります](https://github.com/ClickHouse/clickhouse-rs/issues/48)。 +* `Float(32|64)`は対応する`f(32|64)`またはその周りの新しい型にマッピングします。 +* `Decimal(32|64|128)`は対応する`i(32|64|128)`またはその周りの新しい型にマッピングします。[fixnum](https://github.com/loyd/fixnum)や他の実装のサイン付き固定小数点数を使用することがより便利です。 +* `Boolean`は`bool`またはその周りの新しい型にマッピングします。 +* `String`は任意の文字列またはバイト型にマッピングします。例:`&str`, `&[u8]`, `String`, `Vec`または[`SmartString`](https://docs.rs/smartstring/latest/smartstring/struct.SmartString.html)。新しい型もサポートされます。バイトを保存するには、[serde_bytes](https://docs.rs/serde_bytes/latest/serde_bytes/)を使用することを考慮してください。これはより効率的です。 + +```rust +#[derive(Row, Debug, Serialize, Deserialize)] +struct MyRow<'a> { + str: &'a str, + string: String, + #[serde(with = "serde_bytes")] + bytes: Vec, + #[serde(with = "serde_bytes")] + byte_slice: &'a [u8], +} +``` + +* `FixedString(N)`はバイトの配列としてサポートされます。例:`[u8; N]`。 + +```rust +#[derive(Row, Debug, Serialize, Deserialize)] +struct MyRow { + fixed_str: [u8; 16], // FixedString(16) +} +``` +* `Enum(8|16)`は[serde_repr](https://docs.rs/serde_repr/latest/serde_repr/)を使用してサポートされています。 + +```rust +use serde_repr::{Deserialize_repr, Serialize_repr}; + +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + level: Level, +} + +#[derive(Debug, Serialize_repr, Deserialize_repr)] +#[repr(u8)] +enum Level { + Debug = 1, + Info = 2, + Warn = 3, + Error = 4, +} +``` +* `UUID`は`serde::uuid`を使用して[`uuid::Uuid`](https://docs.rs/uuid/latest/uuid/struct.Uuid.html)にマッピングされます。`uuid`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(with = "clickhouse::serde::uuid")] + uuid: uuid::Uuid, +} +``` +* `IPv6`は[`std::net::Ipv6Addr`](https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html)にマッピングされます。 +* `IPv4`は`serde::ipv4`を使用して[`std::net::Ipv4Addr`](https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html)にマッピングされます。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(with = "clickhouse::serde::ipv4")] + ipv4: std::net::Ipv4Addr, +} +``` +* `Date`は`u16`またはその周りの新しい型にマッピングされ、 `1970-01-01`から経過した日数を表します。また、`serde::time::date`を使用して、[`time::Date`](https://docs.rs/time/latest/time/struct.Date.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + days: u16, + #[serde(with = "clickhouse::serde::time::date")] + date: Date, +} +``` +* `Date32`は`i32`またはその周りの新しい型にマッピングされ、`1970-01-01`から経過した日数を表します。また、`serde::time::date32`を使用して、[`time::Date`](https://docs.rs/time/latest/time/struct.Date.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + days: i32, + #[serde(with = "clickhouse::serde::time::date32")] + date: Date, +} +``` +* `DateTime`は`u32`またはその周りの新しい型にマッピングされ、UNIX時代から経過した秒数を表します。また、`serde::time::datetime`を使用して、[`time::OffsetDateTime`](https://docs.rs/time/latest/time/struct.OffsetDateTime.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + ts: u32, + #[serde(with = "clickhouse::serde::time::datetime")] + dt: OffsetDateTime, +} +``` + +* `DateTime64(_)`は`i32`またはその周りの新しい型にマッピングされ、UNIX時代から経過した時間を表します。また、`serde::time::datetime64::*`を使用して、[`time::OffsetDateTime`](https://docs.rs/time/latest/time/struct.OffsetDateTime.html)にマッピングされます。`time`機能が必要です。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + ts: i64, // `DateTime64(X)`に応じた経過秒/μs/ms/ns + #[serde(with = "clickhouse::serde::time::datetime64::secs")] + dt64s: OffsetDateTime, // `DateTime64(0)` + #[serde(with = "clickhouse::serde::time::datetime64::millis")] + dt64ms: OffsetDateTime, // `DateTime64(3)` + #[serde(with = "clickhouse::serde::time::datetime64::micros")] + dt64us: OffsetDateTime, // `DateTime64(6)` + #[serde(with = "clickhouse::serde::time::datetime64::nanos")] + dt64ns: OffsetDateTime, // `DateTime64(9)` +} +``` + +* `Tuple(A, B, ...)`は`(A, B, ...)`またはその周りの新しい型にマッピングされます。 +* `Array(_)`は任意のスライス、例:`Vec<_>`, `&[_]`にマッピングされます。新しい型もサポートされます。 +* `Map(K, V)`は`Array((K, V))`のように動作します。 +* `LowCardinality(_)`はシームレスにサポートされます。 +* `Nullable(_)`は`Option<_>`にマッピングされます。`clickhouse::serde::*`ヘルパーに対しては`::option`を追加します。 + +```rust +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(with = "clickhouse::serde::ipv4::option")] + ipv4_opt: Option, +} +``` +* `Nested`はリネーミングを使用して複数の配列を提供することでサポートされます。 +```rust +// CREATE TABLE test(items Nested(name String, count UInt32)) +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + #[serde(rename = "items.name")] + items_name: Vec, + #[serde(rename = "items.count")] + items_count: Vec, +} +``` +* `Geo`型はサポートされています。 `Point`はタプル`(f64, f64)`として動作し、その他の型は単に点のスライスです。 +```rust +type Point = (f64, f64); +type Ring = Vec; +type Polygon = Vec; +type MultiPolygon = Vec; +type LineString = Vec; +type MultiLineString = Vec; + +#[derive(Row, Serialize, Deserialize)] +struct MyRow { + point: Point, + ring: Ring, + polygon: Polygon, + multi_polygon: MultiPolygon, + line_string: LineString, + multi_line_string: MultiLineString, +} +``` + +* `Variant`、`Dynamic`、(新しい)`JSON`データ型はまだサポートされていません。 + +## モック + +このクレートは、CHサーバーをモックし、DDL、`SELECT`、`INSERT`、`WATCH`クエリをテストするためのユーティリティを提供します。この機能は`test-util`機能で有効になります。**dev-dependency**としてのみ使用してください。 + +参考:[例](https://github.com/ClickHouse/clickhouse-rs/tree/main/examples/mock.rs)。 + +## トラブルシューティング + +### CANNOT_READ_ALL_DATA + +`CANNOT_READ_ALL_DATA`エラーの最も一般的な原因は、アプリケーション側の行定義がClickHouseのものと一致していないことです。 + +次のようなテーブルを考えてみます: + +``` +CREATE OR REPLACE TABLE event_log (id UInt32) +ENGINE = MergeTree +ORDER BY timestamp +``` + +そして、アプリケーション側で`EventLog`が次のように定義されている場合、型が一致していません: + +```rust +#[derive(Debug, Serialize, Deserialize, Row)] +struct EventLog { + id: String, // <- 本来はu32であるべき! +} +``` + +データを挿入すると、次のエラーが発生する可能性があります: + +``` +Error: BadResponse("Code: 33. DB::Exception: Cannot read all data. Bytes read: 5. Bytes expected: 23.: (at row 1)\n: While executing BinaryRowInputFormat. (CANNOT_READ_ALL_DATA)") +``` + +この例を正確にするためには、`EventLog`構造体を次のように正しく定義します: + +```rust +#[derive(Debug, Serialize, Deserialize, Row)] +struct EventLog { + id: u32 +} +``` + +## 既知の制限 + +* `Variant`、`Dynamic`、(新しい)`JSON`データ型はまだサポートされていません。 +* サーバー側のパラメータバインディングはまだサポートされていません。追跡するために[この問題](https://github.com/ClickHouse/clickhouse-rs/issues/142)を参照してください。 + +## お問い合わせ + +質問がある場合や手助けが必要な場合は、[Community Slack](https://clickhouse.com/slack)や[GitHub issues](https://github.com/ClickHouse/clickhouse-rs/issues)を通じてお気軽にお問い合わせください。 diff --git a/docs/ja/integrations/migration/_category_.yml b/docs/ja/integrations/migration/_category_.yml new file mode 100644 index 00000000000..da1d794d41b --- /dev/null +++ b/docs/ja/integrations/migration/_category_.yml @@ -0,0 +1,8 @@ +position: 500 +label: 'Migration' +collapsible: true +collapsed: true +link: + type: generated-index + title: Migration + slug: /ja/cloud/migration diff --git a/docs/ja/integrations/migration/clickhouse-local-etl.md b/docs/ja/integrations/migration/clickhouse-local-etl.md new file mode 100644 index 00000000000..bf377ac5e8e --- /dev/null +++ b/docs/ja/integrations/migration/clickhouse-local-etl.md @@ -0,0 +1,165 @@ +--- +sidebar_label: clickhouse-localの使用 +sidebar_position: 20 +keywords: [clickhouse, 移行, マイグレーション, データ, etl, elt, clickhouse-local, clickhouse-client] +slug: '/ja/cloud/migration/clickhouse-local' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +import AddARemoteSystem from '@site/docs/ja/_snippets/_add_remote_ip_access_list_detail.md'; + + +# clickhouse-localを使用したClickHouseへの移行 + +セルフマネージド ClickHouse の移行 + + +ClickHouse、より具体的には[`clickhouse-local`](/docs/ja/operations/utilities/clickhouse-local.md)をETLツールとして使用し、現在のデータベースシステムからClickHouse Cloudにデータを移行することができます。これは、現在のデータベースシステムにClickHouseが提供する[インテグレーションエンジン](/docs/ja/engines/table-engines/#integration-engines)または[テーブル関数](/docs/ja/sql-reference/table-functions/)があるか、またはベンダーが提供するJDBCドライバまたはODBCドライバが利用可能である限りです。 + +この移行方法を「ピボット」方式と呼ぶこともあります。中間のピボットポイントまたはハブを使用して、ソースデータベースから宛先データベースにデータを移動するためです。たとえば、この方法は、セキュリティ要件のためにプライベートまたは内部ネットワークからの外向き接続のみが許可されている場合に必要になるかもしれません。そのため、clickhouse-localを使用してソースデータベースからデータを取得し、clickhouse-localがピボットポイントとして機能することで、データを宛先のClickHouseデータベースへプッシュする必要があります。 + +ClickHouseは、[MySQL](/docs/ja/engines/table-engines/integrations/mysql/)、[PostgreSQL](/docs/ja/engines/table-engines/integrations/postgresql)、[MongoDB](/docs/ja/engines/table-engines/integrations/mongodb)、そして[SQLite](/docs/ja/engines/table-engines/integrations/sqlite)のインテグレーションエンジンとテーブル関数(即座にインテグレーションエンジンを作成する)を提供しています。他のすべての一般的なデータベースシステムには、ベンダーから利用可能なJDBCドライバまたはODBCドライバがあります。 + +## clickhouse-localとは? + +セルフマネージド ClickHouse の移行 + +通常、ClickHouseはクラスタ形式で実行され、いくつかのClickHouseデータベースエンジンのインスタンスが異なるサーバで分散的に実行されます。 + +シングルサーバでは、ClickHouseデータベースエンジンは`clickhouse-server`プログラムの一部として実行されます。データベースアクセス(パス、ユーザー、セキュリティなど)はサーバー構成ファイルで設定されます。 + +`clickhouse-local`ツールは、ClickHouseサーバーを設定したり起動したりすることなく、多くの入力と出力に対して超高速SQLデータ処理が可能な、コマンドラインユーティリティの形式でClickHouseデータベースエンジンを使用できるようにします。 + +## clickhouse-localのインストール + +`clickhouse-local`を使用するには、現在のソースデータベースシステムとClickHouse Cloudターゲットサービスの両方にネットワークアクセスできるホストマシンが必要です。 + +そのホストマシンで、コンピュータのオペレーティングシステムに基づいて`clickhouse-local`の適切なビルドをダウンロードします: + + + + +1. `clickhouse-local`をローカルにダウンロードする最も簡単な方法は、次のコマンドを実行することです: + ```bash + curl https://clickhouse.com/ | sh + ``` + +1. `clickhouse-local`を実行します(バージョンが表示されるだけです): + ```bash + ./clickhouse-local + ``` + + + + +1. `clickhouse-local`をローカルにダウンロードする最も簡単な方法は、次のコマンドを実行することです: + ```bash + curl https://clickhouse.com/ | sh + ``` + +1. `clickhouse-local`を実行します(バージョンが表示されるだけです): + ```bash + ./clickhouse local + ``` + + + + +:::info 重要 +このガイド全体での例は、`clickhouse-local`を実行するためにLinuxコマンド(`./clickhouse-local`)を使用しています。Macで`clickhouse-local`を実行する場合は、`./clickhouse local`を使用してください。 +::: + + +:::tip リモートシステムをClickHouse CloudサービスのIPアクセスリストに追加する +`remoteSecure`関数がClickHouse Cloudサービスに接続するためには、リモートシステムのIPアドレスがIPアクセスリストで許可されている必要があります。このヒントの下にある**Manage your IP Access List**を展開して詳細を確認してください。 +::: + + + +## 例1: MySQLからClickHouse Cloudへのインテグレーションエンジンによる移行 + +ソースのMySQLデータベースからデータを読み取るために[インテグレーションテーブルエンジン](/docs/ja/engines/table-engines/integrations/mysql/)([mysqlテーブル関数](/docs/ja/sql-reference/table-functions/mysql/)によって即座に作成)を使用し、ClickHouseクラウドサービス上の宛先テーブルにデータを書き込むために[remoteSecureテーブル関数](/docs/ja/sql-reference/table-functions/remote/)を使用します。 + +セルフマネージド ClickHouse の移行 + + +### 宛先ClickHouse Cloudサービス上で: + +#### 宛先データベースを作成する: + + ```sql + CREATE DATABASE db + ``` + +#### MySQLテーブルと等価なスキーマを持つ宛先テーブルを作成する: + + ```sql + CREATE TABLE db.table ... + ``` + +:::note +ClickHouse Cloud宛先テーブルのスキーマとソースMySQLテーブルのスキーマは一致している必要があります(カラム名と順序が同じであり、カラムのデータ型が互換性がある必要があります)。 +::: + +### clickhouse-localホストマシンで: + +#### マイグレーションクエリでclickhouse-localを実行する: + + ```sql + ./clickhouse-local --query " +INSERT INTO FUNCTION +remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') +SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');" + ``` + +:::note +データは`clickhouse-local`ホストマシンにローカルで保存されません。代わりに、データはソースMySQLテーブルから読み取られ、即座にClickHouse Cloudサービス上の宛先テーブルに書き込まれます。 +::: + + +## 例2: MySQLからClickHouse CloudへのJDBCブリッジによる移行 + +ソースMySQLデータベースからデータを読み取るために[ClickHouse JDBC Bridge](https://github.com/ClickHouse/clickhouse-jdbc-bridge)およびMySQL JDBCドライバとともに[JDBCインテグレーションテーブルエンジン](/docs/ja/engines/table-engines/integrations/jdbc.md)([jdbcテーブル関数](/docs/ja/sql-reference/table-functions/jdbc.md)によって即座に作成)を使用し、ClickHouseクラウドサービス上の宛先テーブルにデータを書き込むために[remoteSecureテーブル関数](/docs/ja/sql-reference/table-functions/remote.md)を使用します。 + +セルフマネージド ClickHouse の移行 + +### 宛先ClickHouse Cloudサービスで: + +#### 宛先データベースを作成する: + ```sql + CREATE DATABASE db + ``` + +#### MySQLテーブルと等価なスキーマを持つ宛先テーブルを作成する: + + ```sql + CREATE TABLE db.table ... + ``` + +:::note +ClickHouse Cloud宛先テーブルのスキーマとソースMySQLテーブルのスキーマは一致している必要があります。例えば、カラム名と順序が同じである必要があり、カラムのデータ型は互換性がある必要があります。 +::: + +### clickhouse-localホストマシンで: + +#### ClickHouse JDBC Bridgeをローカルにインストール、設定、開始する: + +[ガイド](/docs/ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse.md#install-the-clickhouse-jdbc-bridge-locally)での手順に従ってください。このガイドにはMySQLからのデータソースを設定するための手順も含まれています。 + +#### マイグレーションクエリでclickhouse-localを実行する: + + ```sql + ./clickhouse-local --query " +INSERT INTO FUNCTION +remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', 'default', 'PASS') +SELECT * FROM jdbc('datasource', 'database', 'table');" + ``` + +:::note +データは`clickhouse-local`ホストマシンにローカルで保存されません。代わりに、データはMySQLソーステーブルから読み取られ、即座にClickHouse Cloudサービス上の宛先テーブルに書き込まれます。 +::: + + diff --git a/docs/ja/integrations/migration/clickhouse-to-cloud.md b/docs/ja/integrations/migration/clickhouse-to-cloud.md new file mode 100644 index 00000000000..f29aba8b556 --- /dev/null +++ b/docs/ja/integrations/migration/clickhouse-to-cloud.md @@ -0,0 +1,194 @@ +--- +sidebar_position: 10 +sidebar_label: ClickHouseからClickHouse Cloudへの移行 +slug: /ja/cloud/migration/clickhouse-to-cloud +--- +import AddARemoteSystem from '@site/docs/ja/_snippets/_add_remote_ip_access_list_detail.md'; + +# セルフマネージドのClickHouseからClickHouse Cloudへの移行 + +セルフマネージドのClickHouseの移行 + +このガイドでは、セルフマネージドのClickHouseサーバーからClickHouse Cloudへの移行方法、およびClickHouse Cloudサービス間の移行方法を示します。`SELECT`および`INSERT`クエリで[`remoteSecure`](../../sql-reference/table-functions/remote.md)関数を使用すると、リモートのClickHouseサーバーへのアクセスが可能となり、テーブルの移行が`INSERT INTO`クエリに`SELECT`を埋め込むだけで簡単になります。 + +## セルフマネージドのClickHouseからClickHouse Cloudへの移行 + +セルフマネージドのClickHouseの移行 + +:::note +ソーステーブルがシャードされているかレプリケートされているかに関係なく、ClickHouse Cloudでは宛先テーブルを作成するだけです(このテーブルに対するエンジンパラメータは省略可能で、自動的にReplicatedMergeTreeテーブルになります)。ClickHouse Cloudは垂直および水平スケーリングを自動的に処理します。レプリケーションやシャードの管理について考える必要はありません。 +::: + +この例では、セルフマネージドのClickHouseサーバーが*ソース*であり、ClickHouse Cloudサービスが*宛先*です。 + +### 概要 + +プロセスは以下の通りです: + +1. ソースサービスに読み取り専用ユーザーを追加 +2. 宛先サービスにソーステーブル構造を複製 +3. ソースから宛先にデータを取り込むか、ネットワークの可用性に応じてソースからデータをプッシュ +4. 宛先のIPアクセスリストからソースサーバーを削除 (該当する場合) +5. ソースサービスから読み取り専用ユーザーを削除 + +### システム間でのテーブル移行: +この例では、セルフマネージドのClickHouseサーバーからClickHouse Cloudに1つのテーブルを移行します。 + +### ソースClickHouseシステムの場合 (現在データがホストされているシステム) + +- ソーステーブル (`db.table` という例) を読み取る権限を持つ読み取り専用ユーザーを追加 +```sql +CREATE USER exporter +IDENTIFIED WITH SHA256_PASSWORD BY 'password-here' +SETTINGS readonly = 1; +``` + +```sql +GRANT SELECT ON db.table TO exporter; +``` + +- テーブル定義をコピー +```sql +select create_table_query +from system.tables +where database = 'db' and table = 'table' +``` + +### 宛先ClickHouse Cloudシステムで: + +- 宛先データベースを作成: +```sql +CREATE DATABASE db +``` + +- ソースからのCREATE TABLE文を使用して宛先を作成。 + +:::tip +CREATE文を実行するとき、ENGINEをパラメータなしのReplicatedMergeTreeに変更します。ClickHouse Cloudは常にテーブルをレプリケートし、正しいパラメータを提供します。ただし、`ORDER BY`、`PRIMARY KEY`、`PARTITION BY`、`SAMPLE BY`、`TTL`、`SETTINGS`句は保持してください。 +::: + +```sql +CREATE TABLE db.table ... +``` + +- `remoteSecure` 関数を使用して、セルフマネージドのソースからデータを取得 + +セルフマネージドのClickHouseの移行 + +```sql +INSERT INTO db.table SELECT * FROM +remoteSecure('source-hostname', db, table, 'exporter', 'password-here') +``` + +:::note +ソースシステムが外部ネットワークから利用できない場合は、データをプルするのではなくプッシュすることができます。`remoteSecure` 関数はSELECTとINSERTの両方で機能します。次のオプションをご覧ください。 +::: + +- `remoteSecure` 関数を使用して、データをClickHouse Cloudサービスにプッシュ + +セルフマネージドのClickHouseの移行 + +:::tip リモートシステムをClickHouse CloudサービスのIPアクセスリストに追加する +`remoteSecure` 関数がClickHouse Cloudサービスに接続できるように、リモートシステムのIPアドレスをIPアクセスリストで許可する必要があります。このチップの下の**IPアクセスリストの管理**を展開して詳細を確認してください。 +::: + + + +```sql +INSERT INTO FUNCTION +remoteSecure('HOSTNAME.clickhouse.cloud:9440', 'db.table', +'default', 'PASS') SELECT * FROM db.table +``` + +## ClickHouse Cloudサービス間の移行 + +セルフマネージドのClickHouseの移行 + +ClickHouse Cloudサービス間でデータを移行する際の例: +- 復元したバックアップからデータを移行 +- 開発サービスからステージングサービスへのデータのコピー (またはステージングから本番へ) + +この例では、二つのClickHouse Cloudサービスがあり、それらは*ソース*と*宛先*と呼ばれます。データはソースから宛先にプルされます。プッシュすることもできますが、ここでは読み取り専用ユーザーを使用するプルを示します。 + +セルフマネージドのClickHouseの移行 + +移行にはいくつかのステップがあります: +1. 一つのClickHouse Cloudサービスを*ソース*として識別し、他方を*宛先*として識別 +1. ソースサービスに読み取り専用ユーザーを追加 +1. 宛先サービスにソーステーブル構造を複製 +1. 一時的にソースサービスのIPアクセスを許可 +1. ソースから宛先にデータをコピー +1. 宛先でIPアクセスリストを再設定 +1. ソースサービスから読み取り専用ユーザーを削除 + +#### ソースサービスに読み取り専用ユーザーを追加 + +- ソーステーブル (`db.table` という例) を読み取る権限を持つ読み取り専用ユーザーを追加 + ```sql + CREATE USER exporter + IDENTIFIED WITH SHA256_PASSWORD BY 'password-here' + SETTINGS readonly = 1; + ``` + + ```sql + GRANT SELECT ON db.table TO exporter; + ``` + +- テーブル定義をコピー + ```sql + select create_table_query + from system.tables + where database = 'db' and table = 'table' + ``` + +#### 宛先サービスでテーブル構造を複製 + +宛先にデータベースが存在しない場合は、作成します: + +- 宛先データベースを作成: + ```sql + CREATE DATABASE db + ``` + +- ソースからのCREATE TABLE文を使用して宛先を作成。 + + 宛先でソースからの`select create_table_query...` の出力を使用してテーブルを作成します: + + ```sql + CREATE TABLE db.table ... + ``` + +#### ソースサービスへのリモートアクセスを許可 + +ソースから宛先へデータをプルするには、ソースサービスが接続を許可する必要があります。一時的にソースサービスの「IPアクセスリスト」機能を無効にします。 + +:::tip +ソースClickHouse Cloudサービスを引き続き使用する場合、データを移行する前に既存のIPアクセスリストをJSONファイルにエクスポートすると、移行後にアクセスリストをインポートできます。 +::: + +許可リストを変更し、一時的に**Anywhere**からのアクセスを許可します。[IPアクセスリスト](/docs/ja/cloud/security/setting-ip-filters)のドキュメントで詳細を確認してください。 + +#### ソースから宛先へのデータコピー + +- `remoteSecure` 関数を使用して、ソースClickHouse Cloudサービスからデータをプルします + 宛先に接続します。このコマンドを宛先ClickHouse Cloudサービスで実行してください: + + ```sql + INSERT INTO db.table SELECT * FROM + remoteSecure('source-hostname', db, table, 'exporter', 'password-here') + ``` + +- 宛先サービスでデータを確認 + +#### ソースでIPアクセスリストを再設定 + + 以前にアクセスリストをエクスポートしておいた場合は、**Share**を使用して再インポートできます。そうでない場合は、アクセスリストにエントリを再追加します。 + +#### 読み取り専用の`exporter`ユーザーを削除 + +```sql +DROP USER exporter +``` + +- サービスIPアクセスリストをスイッチしてアクセスを制限 + diff --git a/docs/ja/integrations/migration/etl-tool-to-clickhouse.md b/docs/ja/integrations/migration/etl-tool-to-clickhouse.md new file mode 100644 index 00000000000..945593e038c --- /dev/null +++ b/docs/ja/integrations/migration/etl-tool-to-clickhouse.md @@ -0,0 +1,18 @@ +--- +sidebar_label: サードパーティETLツールの使用 +sidebar_position: 20 +keywords: [clickhouse, 移行, データ, etl, elt, clickhouse-local, clickhouse-client] +slug: '/ja/cloud/migration/etl-tool-to-clickhouse' +--- + +# サードパーティETLツールの使用 + +セルフマネージドClickHouseの移行 + +外部データソースからClickHouseにデータを移動するには、多くの人気のあるETLおよびELTツールの1つを使用するのが最適な選択です。以下のツールに関するドキュメントを用意しています: + +- [Airbyte](/docs/ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse.md) +- [dbt](/docs/ja/integrations/data-ingestion/etl-tools/dbt/index.md) +- [Vector](/docs/ja/integrations/data-ingestion/etl-tools/vector-to-clickhouse.md) + +しかし、ClickHouseと統合する多くの他のETL/ELTツールも存在するため、お気に入りのツールのドキュメントで詳細を確認してください。 diff --git a/docs/ja/integrations/migration/images/Migrations.excalidraw b/docs/ja/integrations/migration/images/Migrations.excalidraw new file mode 100644 index 00000000000..096af376c09 --- /dev/null +++ b/docs/ja/integrations/migration/images/Migrations.excalidraw @@ -0,0 +1,18373 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://app.excalidraw.com", + "elements": [ + { + "type": "rectangle", + "version": 5186, + "versionNonce": 1551391109, + "isDeleted": false, + "id": "eocVgawgE_cK_xyDcJv0W", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2842.709746204976, + "y": -274.4604295479421, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1763430219, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "zbuG_G2z3ThbiIoyaxsn8", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5105, + "versionNonce": 150449483, + "isDeleted": false, + "id": "sTZiJekZz3cYz0HSNumAX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2757.533239606998, + "y": -398.61601543652614, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 583261925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5507, + "versionNonce": 1704780005, + "isDeleted": false, + "id": "GyPY_fHYVk-JJoS-CJBXo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2893.2381823224323, + "y": -307.6648304251157, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1125756395, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Ia_We5W4appXeHh8tUHML", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5436, + "versionNonce": 2009713643, + "isDeleted": false, + "id": "JdoN_xAxm5QVElBgTICsV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2815.280023741235, + "y": -363.9679449559899, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1460714053, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5218, + "versionNonce": 460946501, + "isDeleted": false, + "id": "JBfYHzpGaD-BRmURVWyye", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2618.9409576848384, + "y": -280.23510796135633, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1797437579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4484, + "versionNonce": 270472843, + "isDeleted": false, + "id": "ijf3lbGjrEa38HDrGEUaD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2874.88135150373, + "y": -289.9208719248545, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 1475029413, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4184, + "versionNonce": 1441508261, + "isDeleted": false, + "id": "2-_WUjfO_mVgZHDNNpYT4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2703.458111081255, + "y": -337.601508333757, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1324445483, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4383, + "versionNonce": 280104235, + "isDeleted": false, + "id": "QHMoWc59857j-vkBXHbUi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2650.3358601947557, + "y": -279.56542918561354, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1719708933, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4276, + "versionNonce": 354479877, + "isDeleted": false, + "id": "uF0nkkqh1ak24hajhXNfQ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2778.384825438113, + "y": -359.17132004254927, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1089491403, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4255, + "versionNonce": 2095919051, + "isDeleted": false, + "id": "CRELD-37FidPGtMVIrm3F", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2830.8724634921937, + "y": -327.65021775716195, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1112458341, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186130, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7338, + "versionNonce": 2006369893, + "isDeleted": false, + "id": "AB6imHeOWWcp-MfhCKiHI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2806.4435724536715, + "y": -269.48501592462526, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1647960171, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186130, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7155, + "versionNonce": 116063851, + "isDeleted": false, + "id": "3Ouuh95Kcw0u-fPjBrk7W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2737.9568731650625, + "y": -288.2714401303292, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1596125125, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 681, + "versionNonce": 1880797637, + "isDeleted": false, + "id": "zbuG_G2z3ThbiIoyaxsn8", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2695.5133568786378, + "y": 31.82104502994298, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 1285069579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155349, + "gap": 23.15195627043795, + "elementId": "eocVgawgE_cK_xyDcJv0W" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7565, + "versionNonce": 964032779, + "isDeleted": false, + "id": "udUxQz16RLyBPUa0j18RV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2677.281267769821, + "y": -72.82190872671163, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 1528475429, + "groupIds": [ + "w2iuN8CTMVUY9BjPJRX8u" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "line", + "version": 6624, + "versionNonce": 1003106597, + "isDeleted": false, + "id": "El4-N3Ym3m9sIeV9AGvEO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2773.0104719014153, + "y": 70.28378667186553, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 2089222571, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4414, + "versionNonce": 1644732331, + "isDeleted": false, + "id": "gDp4XjcF_Xd0Q9h5hyO-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2774.2247959700353, + "y": 127.78800947936907, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 883131013, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7420, + "versionNonce": 403883141, + "isDeleted": false, + "id": "1gOaZ_nGpKcOwWSpadN6y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2776.944777815187, + "y": 56.294857446613605, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 2066715723, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4513, + "versionNonce": 986542667, + "isDeleted": false, + "id": "M35kZCSgO9fZjHLn4yCEC", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2773.778389975453, + "y": 184.60078512451946, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 1081797093, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8065, + "versionNonce": 951184357, + "isDeleted": false, + "id": "WK9ynhswSkPGfIyLfT4b0", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2710.341212876384, + "y": 102.73601224218874, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 1215091435, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8118, + "versionNonce": 1419702507, + "isDeleted": false, + "id": "MSirq4VMsqUkQnwOfAPBY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2761.8606995699693, + "y": 155.20284832872676, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 1605264709, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5154, + "versionNonce": 2109024069, + "isDeleted": false, + "id": "Rl4NqisZYihc_o2Hk139d", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1757.3637013374182, + "y": -261.9365779856453, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 80297355, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "WhT5JlYLdzlyd9Pi3bUto", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5076, + "versionNonce": 1091017611, + "isDeleted": false, + "id": "FhjjWIjuQGmHe4su5k2Xz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1673.0257465779605, + "y": -386.0921638742293, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1973122213, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5472, + "versionNonce": 1769600677, + "isDeleted": false, + "id": "icSPEVTd0G4t84Cwf0bC-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1807.8921374548745, + "y": -295.1409788628189, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1535071275, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5405, + "versionNonce": 2084696619, + "isDeleted": false, + "id": "LaB84OqavriGXtx-shONK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1729.933978873677, + "y": -351.44409339369304, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 502241285, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5187, + "versionNonce": 1454234117, + "isDeleted": false, + "id": "x3B7uQvD162Iwb0kqwlJb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1533.5949128172806, + "y": -267.7112563990595, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 746165963, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4453, + "versionNonce": 389575883, + "isDeleted": false, + "id": "j6uIEGeWZsUqlBoW8dB0b", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1789.5353066361722, + "y": -277.39702036255767, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 581455717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4154, + "versionNonce": 1850626405, + "isDeleted": false, + "id": "i0FZzUR07Iiy9zPcP5jL5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1618.1120662136973, + "y": -325.07765677146017, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1985119595, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4352, + "versionNonce": 562406251, + "isDeleted": false, + "id": "1xtlEvx9E5nqa3-paE4h9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1564.9898153271943, + "y": -267.0415776233167, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 840112837, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4245, + "versionNonce": 1571347653, + "isDeleted": false, + "id": "9w-kLgt59DSi5zp2Ch9De", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1693.038780570555, + "y": -346.6474684802524, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 5545995, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4224, + "versionNonce": 1400110603, + "isDeleted": false, + "id": "ISaEXrsMC_ePrLeAywQjz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1745.5264186246359, + "y": -315.1263661948651, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1422752293, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7308, + "versionNonce": 1281031205, + "isDeleted": false, + "id": "Q_otGc_AL1WdWBY571rsI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1721.0975275861138, + "y": -256.9611643623284, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1148872363, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7125, + "versionNonce": 2013136043, + "isDeleted": false, + "id": "mUdjt5JX1AzOmUxfCOeGS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1652.6108282975047, + "y": -275.74758856803237, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 600108421, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 616, + "versionNonce": 307376005, + "isDeleted": false, + "id": "WhT5JlYLdzlyd9Pi3bUto", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1610.16731201108, + "y": 44.34489659223982, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 426662219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155349, + "gap": 23.15195627043795, + "elementId": "Rl4NqisZYihc_o2Hk139d" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7682, + "versionNonce": 382613323, + "isDeleted": false, + "id": "T_BVRKbMs0CxFyatCwNDo", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1584.0047749786709, + "y": -132.42288696904507, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 75, + "seed": 1043789029, + "groupIds": [ + "Z_jvRKw_9nTn-fN3zJ6jR" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "pull data with\nremoteSecure\n", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pull data with\nremoteSecure\n" + }, + { + "type": "line", + "version": 6593, + "versionNonce": 768341733, + "isDeleted": false, + "id": "9x1I_AbIM-1bYyNyxe0Up", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1687.6644270338556, + "y": 82.80763823416419, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 478869483, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4383, + "versionNonce": 1581192683, + "isDeleted": false, + "id": "ln1F2DhOgCovBFTa3Frmc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1688.8787511024757, + "y": 140.31186104166773, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 2142310469, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7390, + "versionNonce": 2035667525, + "isDeleted": false, + "id": "G5Sp4Zc0Bs8Y0rXgm5Es1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1691.5987329476275, + "y": 68.81870900891226, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 1541063307, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4482, + "versionNonce": 1297817739, + "isDeleted": false, + "id": "Sr7DK7mCEjE6OERpLkQa-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1688.4323451078935, + "y": 197.12463668681812, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 1980809125, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8035, + "versionNonce": 567099813, + "isDeleted": false, + "id": "3WZkbAKG-wCOldcaclPZZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1624.9951680088243, + "y": 115.2598638044874, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 1075329323, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8088, + "versionNonce": 501012267, + "isDeleted": false, + "id": "3DzCSsBHphljQROyKj5Qm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1676.5146547024096, + "y": 167.72669989102542, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 394494725, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5189, + "versionNonce": 1549780229, + "isDeleted": false, + "id": "u_-uiKhnzobkX8T9ukZmq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1145.2510040923016, + "y": -252.7058343503686, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 917363659, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "Qzp2LNJVkLt1RJnx6nWoY", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5110, + "versionNonce": 1848555979, + "isDeleted": false, + "id": "tSapz3XOF_PQIRt5yJxbN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1060.0744974943236, + "y": -376.86142023895263, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 948361829, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5506, + "versionNonce": 1552604261, + "isDeleted": false, + "id": "NxwoJzgeWmSj09AEdK2Mf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1195.779440209758, + "y": -285.9102352275422, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 464923243, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5439, + "versionNonce": 728451179, + "isDeleted": false, + "id": "_O7ylbKjzJpy7H68b0hEM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1117.8212816285604, + "y": -342.21334975841637, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1105741253, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5221, + "versionNonce": 169609157, + "isDeleted": false, + "id": "_-xAWwWHtGgybNXX4g82Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -921.482215572164, + "y": -258.4805127637828, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1677436171, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4487, + "versionNonce": 995951371, + "isDeleted": false, + "id": "suC9KO1YfMU2mqA6jR2k2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1177.4226093910556, + "y": -268.166276727281, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 650462501, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4189, + "versionNonce": 1999685413, + "isDeleted": false, + "id": "TVFyNDR1jkMdLunKsAILq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1005.9993689685807, + "y": -315.8469131361835, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 116968363, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4386, + "versionNonce": 1719560619, + "isDeleted": false, + "id": "x8pysprjdXw4LXOaRj-yK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -952.8771180820777, + "y": -257.81083398804003, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 445339781, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4279, + "versionNonce": 372677253, + "isDeleted": false, + "id": "Scw7oQwCDZCupck6Ohjze", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1080.9260833254384, + "y": -337.41672484497576, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 685252171, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4258, + "versionNonce": 33160267, + "isDeleted": false, + "id": "XW86ilQOOHjHpIXKfagrJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1133.4137213795193, + "y": -305.89562255958845, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 116916197, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186131, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7343, + "versionNonce": 803930597, + "isDeleted": false, + "id": "ei-HgI1Ngrq16it8ioscm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1108.9848303409972, + "y": -247.73042072705175, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 74718443, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7160, + "versionNonce": 1504328427, + "isDeleted": false, + "id": "mLI03EMP_MlhZ9xVv8Ebn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1040.498131052388, + "y": -266.5168449327557, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1108917061, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186131, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 686, + "versionNonce": 425426245, + "isDeleted": false, + "id": "Qzp2LNJVkLt1RJnx6nWoY", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -998.0546147659634, + "y": 53.57564022751467, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 358041483, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155348, + "gap": 23.15195627043613, + "elementId": "u_-uiKhnzobkX8T9ukZmq" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7741, + "versionNonce": 1511630219, + "isDeleted": false, + "id": "F0P9ewab_cGXeVa_S24JB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -976.8352852052221, + "y": 8.516873875832971, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149, + "height": 75, + "seed": 72026789, + "groupIds": [ + "poP2XKPcypx4veilY02Nq" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "push data with\nremoteSecure\n", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "push data with\nremoteSecure\n" + }, + { + "type": "line", + "version": 6627, + "versionNonce": 702909605, + "isDeleted": false, + "id": "kF504rmjDJYjNm1dxF6Sp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1075.5517297887354, + "y": 92.03838186943904, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 29105707, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4417, + "versionNonce": 2055388203, + "isDeleted": false, + "id": "ZH7P7PZtdtIfH6qJZyyNm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1076.7660538573555, + "y": 149.54260467694257, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 507276805, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7425, + "versionNonce": 1899409413, + "isDeleted": false, + "id": "oozdvqxDuu2ORxX7UeIA3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1079.486035702511, + "y": 78.04945264418711, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 1150099659, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4516, + "versionNonce": 1724907211, + "isDeleted": false, + "id": "tOm4XoP6DuVVQK2K56LOE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1076.3196478627733, + "y": 206.35538032209297, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 1860855141, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8070, + "versionNonce": 759981925, + "isDeleted": false, + "id": "q89ljFsdB2yUYTrPK8XAd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1012.8824707637041, + "y": 124.49060743976224, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 392482667, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8123, + "versionNonce": 1771826539, + "isDeleted": false, + "id": "vmd-fNJzjeCXPn6ynHcjy", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1064.4019574572894, + "y": 176.9574435263021, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 430076101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5340, + "versionNonce": 7615173, + "isDeleted": false, + "id": "bnpnAwTJnvGRDpq-8H6T-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1472.8303859983316, + "y": -292.15458962978846, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 479046155, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5263, + "versionNonce": 372312075, + "isDeleted": false, + "id": "HHJx4DC7seOBEmq6s6fB0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1558.0068925963096, + "y": -416.3101755183725, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 2080509989, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5660, + "versionNonce": 1733005861, + "isDeleted": false, + "id": "GSa1VYpyUjmVoVOwxwJN8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1422.3019498808753, + "y": -325.3589905069621, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1224880299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5593, + "versionNonce": 847892139, + "isDeleted": false, + "id": "C6CpZKvDq0iL-6dRTAHoM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1500.2601084620728, + "y": -381.6621050378362, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1677116293, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5375, + "versionNonce": 1858078085, + "isDeleted": false, + "id": "UGXmM8ucVPa0kyo3UCyJq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1696.5991745184692, + "y": -297.9292680432063, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 242017099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4641, + "versionNonce": 1632682315, + "isDeleted": false, + "id": "ETMfS6RcMoYiZdlNRXeAo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1440.6587806995703, + "y": -307.6150320067045, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 96340709, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4343, + "versionNonce": 705629413, + "isDeleted": false, + "id": "hfvCtJ700vnry5KILpb-5", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.0820211220525, + "y": -355.295668415607, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1160266219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "V88bOY9ZubeXG4qX1OI5_", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4542, + "versionNonce": 199253995, + "isDeleted": false, + "id": "RCxiSv0zMo3ndKzZsBAih", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1665.4389237700925, + "y": -297.39775277623085, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 837117509, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "V88bOY9ZubeXG4qX1OI5_", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4433, + "versionNonce": 1757816901, + "isDeleted": false, + "id": "1JzKblajkQOfcg5CHbIY8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1537.1553067651948, + "y": -376.86548012439926, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1446956171, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4415, + "versionNonce": 205728395, + "isDeleted": false, + "id": "9Vlq7mUBfahl8YSdJIOxR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1484.667668711114, + "y": -345.34437783901194, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1263162789, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7496, + "versionNonce": 750966693, + "isDeleted": false, + "id": "3uA3h2WT8qCj-gW9xmOWJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1509.096559749636, + "y": -287.1791760064716, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 627770155, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7312, + "versionNonce": 389259563, + "isDeleted": false, + "id": "ob6WnA_AmpL_lsbkEtUNu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1577.5832590382452, + "y": -305.78515545770097, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 2098878725, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6313, + "versionNonce": 1613929221, + "isDeleted": false, + "id": "Igw1HfRPwlhyp17tCUbPI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.7692621506467, + "y": 278.4652444342846, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 991389131, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4105, + "versionNonce": 1713128395, + "isDeleted": false, + "id": "s2OyvZ10eSEAL0vmsshSB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.3851770212677, + "y": 299.760970549376, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 819130469, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7112, + "versionNonce": 1267921509, + "isDeleted": false, + "id": "KrDr7i37_0Kxs03RvEl15", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1612.5851766978558, + "y": 273.07196242930695, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 777942123, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4205, + "versionNonce": 555192939, + "isDeleted": false, + "id": "jThqKMmpWCJnOGfX0PEOS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1613.4839813555045, + "y": 320.80254944088847, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1145150405, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7141, + "versionNonce": 1269915077, + "isDeleted": false, + "id": "S1jOdSJMTbq9wgWpy9fwM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1493.0954385670557, + "y": 365.0270381715054, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 326, + "height": 91, + "seed": 1326100235, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "Your current \ndatabase system ", + "baseline": 78, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Your current \ndatabase system " + }, + { + "type": "text", + "version": 8746, + "versionNonce": 149949707, + "isDeleted": false, + "id": "S-sZwKi50-fROp5QFyjP7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1677.0535132131336, + "y": 82.01172657008647, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 2139347749, + "groupIds": [ + "0s7_yes783KRQ5j50YqxQ" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "integration \ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "integration \ntable function" + }, + { + "type": "arrow", + "version": 849, + "versionNonce": 1202412837, + "isDeleted": false, + "id": "5tRpfhGO8OWl6LGOfw5wn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1641.2572484387238, + "y": 245.87294916599603, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.5211604095256916, + "height": 168.25096705689975, + "seed": 261526955, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.5211604095256916, + -168.25096705689975 + ] + ] + }, + { + "type": "arrow", + "version": 1034, + "versionNonce": 1629500331, + "isDeleted": false, + "id": "V88bOY9ZubeXG4qX1OI5_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1640.58312300724, + "y": -19.02142211849423, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.6661732726533955, + "height": 152.55026546497993, + "seed": 1258761861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.6642194234658855, + "gap": 31.83950144560427, + "elementId": "hfvCtJ700vnry5KILpb-5" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.6661732726533955, + -152.55026546497993 + ] + ] + }, + { + "type": "rectangle", + "version": 9182, + "versionNonce": 1726902405, + "isDeleted": false, + "id": "_3nfG2YPKVAhsRCxBr43E", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1505.3776948841005, + "y": 4.141482113112943, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 791455819, + "groupIds": [ + "4I0L8FmtpVsxnNC_Fy2mw", + "veL8ggdzzKtJ7oWiaquYo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "5tRpfhGO8OWl6LGOfw5wn", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7538, + "versionNonce": 433227339, + "isDeleted": false, + "id": "gpKHumwb4BuS1AygU0vL2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1519.521153854581, + "y": 14.599447256006897, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 264, + "height": 34, + "seed": 629741029, + "groupIds": [ + "veL8ggdzzKtJ7oWiaquYo" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 7799, + "versionNonce": 121116645, + "isDeleted": false, + "id": "CDx2eRTNYvC2evLn9UA9Y", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1666.8904060179666, + "y": -67.1317816833689, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 598173419, + "groupIds": [ + "QlLkMVTnyWZ9AaG1CZkul" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5360, + "versionNonce": 971080939, + "isDeleted": false, + "id": "Y9Xqr6Hy5XTR71BUgQgtI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2038.3863150015131, + "y": -266.15304282011493, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1511461189, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5284, + "versionNonce": 1922421573, + "isDeleted": false, + "id": "89UPmv7lFKYI3Dfcrz9PT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2123.562821599491, + "y": -390.30862870869896, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1133597067, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5680, + "versionNonce": 148352907, + "isDeleted": false, + "id": "XC6beEp1xJkgCVgVYEuBd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 1987.8578788840568, + "y": -299.3574436972849, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1980670117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5613, + "versionNonce": 1432691365, + "isDeleted": false, + "id": "3lVFjqbVZDDRNRgWp43yq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2065.8160374652543, + "y": -355.6605582281627, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 807725099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5395, + "versionNonce": 2028963371, + "isDeleted": false, + "id": "U9hirGwh1u7iI66-g7-3N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2262.1551035216507, + "y": -271.92772123352916, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 2132624389, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4661, + "versionNonce": 1951630853, + "isDeleted": false, + "id": "UaM69jwZZ6lRQlZOYy7cP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2006.2147097027519, + "y": -281.61348519702733, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2135730891, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4364, + "versionNonce": 1360234699, + "isDeleted": false, + "id": "Uxld2hRW7kAuMwWQ4lVbD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2177.637950125234, + "y": -329.29412160593347, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1765833573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "DTAqZ4bq8VfVjpy0_jKkX", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4563, + "versionNonce": 576617829, + "isDeleted": false, + "id": "whBDXrKjTQ3QWHPQJZAgT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2230.994852773274, + "y": -271.3962059665573, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 631445867, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "DTAqZ4bq8VfVjpy0_jKkX", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4453, + "versionNonce": 383661931, + "isDeleted": false, + "id": "k783u8fAZ_mgwtupTn84w", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2102.7112357683764, + "y": -350.8639333147221, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1288029893, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4435, + "versionNonce": 1993574597, + "isDeleted": false, + "id": "w-pb3wv9qjcYWq0jmnUrP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2050.2235977142955, + "y": -319.3428310293384, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 544388107, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186132, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7517, + "versionNonce": 949621259, + "isDeleted": false, + "id": "VpBlYoCVWDmjl-YigSE1z", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2074.6524887528176, + "y": -261.1776291967981, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1548396069, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7333, + "versionNonce": 1129326629, + "isDeleted": false, + "id": "CD67JjmSWvTnG5NIzlLt2", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2143.1391880414267, + "y": -279.7836086480238, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1605761707, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186132, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6333, + "versionNonce": 2000787627, + "isDeleted": false, + "id": "RXPCvzbV9dqKVVmm-1iJq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2179.325191153828, + "y": 304.4667912439618, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 448567685, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4125, + "versionNonce": 1237441413, + "isDeleted": false, + "id": "zjFANKNYkK2BOd3X8Dnph", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2178.9411060244493, + "y": 325.7625173590495, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1880583499, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7133, + "versionNonce": 276777803, + "isDeleted": false, + "id": "cX9egqgHLeCp8W9PSgELZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2178.1411057010373, + "y": 299.0735092389805, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1364795621, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4225, + "versionNonce": 845554405, + "isDeleted": false, + "id": "TYS5fmiO2X1phq2TnRClT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2179.039910358686, + "y": 346.804096250562, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1693551595, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7211, + "versionNonce": 682469867, + "isDeleted": false, + "id": "d48czVWIK1q_na8G8Qtiz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2155.187992491814, + "y": 393.7710367462041, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 114, + "height": 46, + "seed": 1169013829, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "MySQL", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "MySQL" + }, + { + "type": "arrow", + "version": 869, + "versionNonce": 1103789637, + "isDeleted": false, + "id": "Ti6G6VOeKpQE33Ru5yLlo", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2206.8131774419053, + "y": 271.8744959756732, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.5211604095256916, + "height": 168.25096705689975, + "seed": 38721163, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.5211604095256916, + -168.25096705689975 + ] + ] + }, + { + "type": "arrow", + "version": 1075, + "versionNonce": 1960260747, + "isDeleted": false, + "id": "DTAqZ4bq8VfVjpy0_jKkX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2206.1390520104214, + "y": 6.980124691181118, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.6661732726533955, + "height": 152.55026546497993, + "seed": 798485413, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.6642194234658858, + "gap": 31.839501445607468, + "elementId": "Uxld2hRW7kAuMwWQ4lVbD" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.6661732726533955, + -152.55026546497993 + ] + ] + }, + { + "type": "rectangle", + "version": 9203, + "versionNonce": 1322020261, + "isDeleted": false, + "id": "Q7DMddDx1R1RM3Cwr97KG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2070.933623887282, + "y": 30.14302892278647, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 652856619, + "groupIds": [ + "X12ICvFt26Q_43ALKdjMs", + "uZ7ohDSs6TS9Y-UYFGOs6" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "Ti6G6VOeKpQE33Ru5yLlo", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7559, + "versionNonce": 615934763, + "isDeleted": false, + "id": "9xrFHPBViBJps8xzsbYw_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2085.0770828577624, + "y": 40.600994065680425, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 264, + "height": 34, + "seed": 1866804997, + "groupIds": [ + "uZ7ohDSs6TS9Y-UYFGOs6" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 7838, + "versionNonce": 2023321861, + "isDeleted": false, + "id": "RLoWdGCEB3nVJ-UXuqLXB", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2232.446335021148, + "y": -35.40711569906671, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 1982656459, + "groupIds": [ + "DOzl9sP535w5t2EIYZN9Y" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5453, + "versionNonce": 213241291, + "isDeleted": false, + "id": "QLRQNqM0DekkRV72VDElL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2710.962700345579, + "y": -307.19632612158784, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 53675621, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5378, + "versionNonce": 481232997, + "isDeleted": false, + "id": "JskpHRhct7wBEOBorxYoV", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2796.139206943557, + "y": -431.3519120101719, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1110621803, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5773, + "versionNonce": 267377771, + "isDeleted": false, + "id": "9b3mEEiZk47sVt5Wr9F5t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2660.4342642281226, + "y": -340.4007269987578, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1043263941, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5706, + "versionNonce": 215659461, + "isDeleted": false, + "id": "zqUP79CRucvginaHyPgC3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2738.39242280932, + "y": -396.7038415296356, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 902150411, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5488, + "versionNonce": 1244600075, + "isDeleted": false, + "id": "H-uyNDWn1T1Pa1der-m1c", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2934.7314888657165, + "y": -312.97100453500207, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1029075237, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4754, + "versionNonce": 87683877, + "isDeleted": false, + "id": "-A3yB5iFEO21LAiMEYdWE", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2678.7910950468176, + "y": -322.65676849850024, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 1046503339, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4458, + "versionNonce": 2045640107, + "isDeleted": false, + "id": "k41TkBJzazUTgviBbyZxh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2850.2143354693, + "y": -370.3374049074064, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 504824965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "XlVVR4ZgJFBe8WD-KcSP3", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4657, + "versionNonce": 1647986309, + "isDeleted": false, + "id": "lPNF9B7qRFiDLbPpPVwnn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2903.57123811734, + "y": -312.43948926803023, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 908931659, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "XlVVR4ZgJFBe8WD-KcSP3", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4546, + "versionNonce": 710348875, + "isDeleted": false, + "id": "vDJ3KEtLjVJPfAp6yFBtg", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2775.287621112442, + "y": -391.907216616195, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1949182949, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4528, + "versionNonce": 379137509, + "isDeleted": false, + "id": "EKa41LuMplksaAk8BpXDo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2722.7999830583612, + "y": -360.3861143308113, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1309061355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7611, + "versionNonce": 491048683, + "isDeleted": false, + "id": "EhaoZGhA3P_mIUh2FUSZv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2747.2288740968834, + "y": -302.220912498271, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 2141808453, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7427, + "versionNonce": 1633954117, + "isDeleted": false, + "id": "-vRDnb_uQe56L_f9fi3-R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2815.7155733854925, + "y": -320.8268919494967, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 930569099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6574, + "versionNonce": 1967241611, + "isDeleted": false, + "id": "9MMeH5E8djM0p03TcIQ0n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2849.783341449118, + "y": 321.1264044694417, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 585512613, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4366, + "versionNonce": 1140373669, + "isDeleted": false, + "id": "sWDXZfkaJyPY2d6aTcBke", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2849.399256319739, + "y": 342.42213058452944, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 247050795, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7375, + "versionNonce": 529027115, + "isDeleted": false, + "id": "c4HBnBmcMOU0sHu8O5mkA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2848.599255996327, + "y": 315.7331224644604, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 412228101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4466, + "versionNonce": 939809797, + "isDeleted": false, + "id": "BjQvC8uOs8L7_2OFfRaSo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2849.4980606539757, + "y": 363.4637094760419, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 79181003, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7461, + "versionNonce": 2114130635, + "isDeleted": false, + "id": "uZ57dMk6euTNZSrBOdeYj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2826.266764169861, + "y": 410.4567813983231, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 114, + "height": 46, + "seed": 1772786021, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "MySQL", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "MySQL" + }, + { + "type": "text", + "version": 9094, + "versionNonce": 629445477, + "isDeleted": false, + "id": "RLLvzclZKk2Y7wCoZXt7W", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2913.2424719004193, + "y": 54.49551966997387, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 187, + "height": 25, + "seed": 1225614187, + "groupIds": [ + "G9KYceRCtj8BCf9udXOjc" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "jdbc table function", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "jdbc table function" + }, + { + "type": "arrow", + "version": 1216, + "versionNonce": 1363968363, + "isDeleted": false, + "id": "RXRWX_I5avcBD3syyLpzW", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2875.213477889116, + "y": 294.4659430489519, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.0821727133607055, + "height": 120.69869142340576, + "seed": 595401925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.10198627796379695, + "gap": 13.013592838166915, + "elementId": "AQ7Eq4Z-ixVZgP25gx4qf" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.0821727133607055, + -120.69869142340576 + ] + ] + }, + { + "type": "arrow", + "version": 1264, + "versionNonce": 415686341, + "isDeleted": false, + "id": "XlVVR4ZgJFBe8WD-KcSP3", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2878.715437354487, + "y": -34.063158610291794, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.6661732726533955, + "height": 152.55026546497993, + "seed": 872660491, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.6642194234658853, + "gap": 31.83950144560427, + "elementId": "k41TkBJzazUTgviBbyZxh" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.6661732726533955, + -152.55026546497993 + ] + ] + }, + { + "type": "rectangle", + "version": 9298, + "versionNonce": 1655643147, + "isDeleted": false, + "id": "XIU7OgxZhON1vg7mGWK4K", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2743.510009231348, + "y": -10.90025437868644, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 1302805541, + "groupIds": [ + "rItIqxNjuNH8uQjDDwqEh", + "z8lSyLtuUq2RjhK3vt_ki" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "RXRWX_I5avcBD3syyLpzW", + "type": "arrow" + }, + { + "id": "5IsHfjXfIvUwAj6Rzg-1G", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7653, + "versionNonce": 946388517, + "isDeleted": false, + "id": "glOJivpvcygQ5DiFZO_Bx", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2757.653468201828, + "y": -0.4422892357924866, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 264, + "height": 34, + "seed": 815121579, + "groupIds": [ + "z8lSyLtuUq2RjhK3vt_ki" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 7914, + "versionNonce": 1847943851, + "isDeleted": false, + "id": "1pZvoCk_Fpp8xhXPSb4w1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2905.022720365214, + "y": -82.17351817516646, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 538341253, + "groupIds": [ + "SgAZ3oMeBmqZk2Rjv2wES" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 9476, + "versionNonce": 2069344645, + "isDeleted": false, + "id": "AQ7Eq4Z-ixVZgP25gx4qf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2744.4668338726988, + "y": 105.9007050823675, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 294.46426921113283, + "height": 54.852953705010954, + "seed": 1718482763, + "groupIds": [ + "Mrsd76BfO04f1N4VjwGb_", + "C4NNTepDJg6S_j-UE6oOv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "in4OQZmiC0mSNkoK8FiXY", + "type": "arrow" + }, + { + "id": "RXRWX_I5avcBD3syyLpzW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7846, + "versionNonce": 1280955723, + "isDeleted": false, + "id": "i8HTBNgjAKi9zonBo2CCS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2800.285848004449, + "y": 116.17779521062039, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 181, + "height": 34, + "seed": 2030581477, + "groupIds": [ + "C4NNTepDJg6S_j-UE6oOv" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "5IsHfjXfIvUwAj6Rzg-1G", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 3, + "text": "JDBC Bridge", + "baseline": 27, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "JDBC Bridge" + }, + { + "type": "text", + "version": 9263, + "versionNonce": 517028069, + "isDeleted": false, + "id": "XkvZi9TJUONQJEKIa5q7M", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2911.32246934891, + "y": 171.4618948866555, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 194, + "height": 25, + "seed": 602330603, + "groupIds": [ + "wec4QXViWCf2eUO2oJME9" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "MySQL JDBC driver", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "MySQL JDBC driver" + }, + { + "type": "arrow", + "version": 1453, + "versionNonce": 1554445291, + "isDeleted": false, + "id": "5IsHfjXfIvUwAj6Rzg-1G", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2878.6953643592533, + "y": 104.42438689604387, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.2500900222476048, + "height": 52.22630397311332, + "seed": 319427141, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.13195639242293994, + "gap": 11.753408314576518, + "elementId": "i8HTBNgjAKi9zonBo2CCS" + }, + "endBinding": { + "focus": 0.08460500628444809, + "gap": 8.245383596607098, + "elementId": "XIU7OgxZhON1vg7mGWK4K" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.2500900222476048, + -52.22630397311332 + ] + ] + }, + { + "type": "text", + "version": 7887, + "versionNonce": 1549980741, + "isDeleted": false, + "id": "dksJxnPJX1FBxQP0ApYfr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 2237.965571990844, + "y": 105.16392976127827, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 134930571, + "groupIds": [ + "7yOV8wGEwhUqtHYeGO88h" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "mysql\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "mysql\ntable function" + }, + { + "type": "rectangle", + "version": 5586, + "versionNonce": 790052491, + "isDeleted": false, + "id": "7VdIZrL59PIsP71N1QzeJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3411.669643334031, + "y": -271.35471878549833, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 2063172005, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5508, + "versionNonce": 1609171877, + "isDeleted": false, + "id": "nSgv45NFeLQ-bqcIzf0hj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3326.493136736053, + "y": -395.51030467408236, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1821677355, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5902, + "versionNonce": 1852126507, + "isDeleted": false, + "id": "iiPkjs4Cho1bcLMTDnnuf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3462.1980794514875, + "y": -304.5591196626756, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1174668549, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186133, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5835, + "versionNonce": 2106869509, + "isDeleted": false, + "id": "XM_rwAZojOUqEn-QL-LTR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3384.23992087029, + "y": -360.8622341935461, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 267286987, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5617, + "versionNonce": 167466955, + "isDeleted": false, + "id": "l1k49jq0YF3UgAAAkY4Yw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3187.9008548138936, + "y": -277.12939719891256, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 128392293, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4883, + "versionNonce": 668933733, + "isDeleted": false, + "id": "hc2CNF7LyvvFjKUOBTDOe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3443.841248632785, + "y": -286.81516116241073, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2134050923, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4586, + "versionNonce": 536094315, + "isDeleted": false, + "id": "AHCGqMCshju3TA4qrVVu8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3272.4180082103103, + "y": -334.49579757131687, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 128993221, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4786, + "versionNonce": 630720965, + "isDeleted": false, + "id": "8UfeXjyv1bn1axxHip1Dq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3219.2957573238073, + "y": -276.4597184231734, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1076675339, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Ia_We5W4appXeHh8tUHML", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4675, + "versionNonce": 656023819, + "isDeleted": false, + "id": "6tFsdZeQfqqJ69y4vuJ1Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3347.344722567168, + "y": -356.0656092801055, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 943523621, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4654, + "versionNonce": 131893541, + "isDeleted": false, + "id": "CzE3x9ZyOtv3cmjUXKtQU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3399.832360621249, + "y": -324.5445069947218, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 995502507, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7740, + "versionNonce": 1491584939, + "isDeleted": false, + "id": "Gq3mlAQK143s3dN97AB6t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3375.4034695827268, + "y": -266.3793051621815, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1807407749, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7558, + "versionNonce": 1612323973, + "isDeleted": false, + "id": "Rt6mXmiq9xOLhnVdvSimd", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3307.733963257864, + "y": -284.7681760341711, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1708768331, + "groupIds": [ + "m44l2OPH0SKVUNVNjo82v" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 988, + "versionNonce": 1535613515, + "isDeleted": false, + "id": "Ia_We5W4appXeHh8tUHML", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3052.171869192357, + "y": -230.066113271605, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 145.7814330403453, + "height": 2.387487505808167, + "seed": 1256669669, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.1470189008902115, + "gap": 21.42349255452723, + "elementId": "8UfeXjyv1bn1axxHip1Dq" + }, + "endBinding": { + "focus": -0.054202581905544625, + "gap": 13.318412802223108, + "elementId": "GyPY_fHYVk-JJoS-CJBXo" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 145.7814330403453, + -2.387487505808167 + ] + ] + }, + { + "type": "text", + "version": 7677, + "versionNonce": 906904549, + "isDeleted": false, + "id": "sj3g87N1YYUr9L-hK7w8X", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -3054.5375325110317, + "y": -302.35859420909765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 730987243, + "groupIds": [ + "HZcAgq3ZliGzaHNhBeld1" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5251, + "versionNonce": 735320299, + "isDeleted": false, + "id": "hdWykLSX5pm3Kznfr37KP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2316.457289635463, + "y": -258.6342258254499, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 181386565, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "l1yPE0_hFtqgj_iTE6pr_", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5170, + "versionNonce": 1036418885, + "isDeleted": false, + "id": "JkHi4SEll_ZZFKZyTV_Gf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2231.280783037485, + "y": -382.78981171403393, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 420046219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5572, + "versionNonce": 1196934027, + "isDeleted": false, + "id": "p8hfQELunDW-RcloGPmxy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2366.9857257529193, + "y": -291.8386267026235, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1657916581, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "Ia_We5W4appXeHh8tUHML", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5500, + "versionNonce": 1302351525, + "isDeleted": false, + "id": "Z9Y6Mioy1b4frkR1g28RN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2289.027567171722, + "y": -348.14174123349767, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1165655083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5282, + "versionNonce": 374151723, + "isDeleted": false, + "id": "I5b1HaGcAJbW8nqBVfHmi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2092.6885011153254, + "y": -264.4089042388641, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1117450245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4548, + "versionNonce": 340341253, + "isDeleted": false, + "id": "fl1UhNgfYttf_53GO_Nj6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2348.628894934217, + "y": -274.0946682023623, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2093989579, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4249, + "versionNonce": 362716363, + "isDeleted": false, + "id": "pIE95rc6PqwKYNe_Ayn9B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2177.205654511742, + "y": -321.7753046112648, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1210623845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4447, + "versionNonce": 247376229, + "isDeleted": false, + "id": "Hj1PTYHrR1mDh_mdYrFUP", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2124.0834036252427, + "y": -263.73922546312133, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 698592619, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4340, + "versionNonce": 1088867179, + "isDeleted": false, + "id": "4OK0yV1DXeHrnrhOEJwVK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2252.1323688685998, + "y": -343.34511632005706, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1976070853, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4319, + "versionNonce": 1045312709, + "isDeleted": false, + "id": "rSyo9MG4Stvbpis0T7IAj", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2304.6200069226807, + "y": -311.82401403466974, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 2134951947, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7403, + "versionNonce": 1013982731, + "isDeleted": false, + "id": "bHBtQPU29vbCRgFR7A3bI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2280.1911158841585, + "y": -253.65881220213305, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 672649765, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7220, + "versionNonce": 513102885, + "isDeleted": false, + "id": "KKZBzGEThhkzasd3WFrcp", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2211.7044165955494, + "y": -272.445236407837, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1671532203, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 811, + "versionNonce": 1060449451, + "isDeleted": false, + "id": "l1yPE0_hFtqgj_iTE6pr_", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2169.2609003091247, + "y": 47.64724875243519, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.1789299121555814, + "height": 173.41062845241322, + "seed": 1275348357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.04430116411155349, + "gap": 23.15195627043795, + "elementId": "hdWykLSX5pm3Kznfr37KP" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -0.1789299121555814, + -173.41062845241322 + ] + ] + }, + { + "type": "text", + "version": 7630, + "versionNonce": 1535215493, + "isDeleted": false, + "id": "ikrVYnuIfskkjAEtLC8ts", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2151.028811200308, + "y": -56.99570500421942, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 426803531, + "groupIds": [ + "BbvhFtoTdHDywZsEGoFIC" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "line", + "version": 6688, + "versionNonce": 1021337419, + "isDeleted": false, + "id": "4rWThdkE9NcLOVotrJ6mz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2246.758015331904, + "y": 86.10999039435592, + "strokeColor": "#31303d", + "backgroundColor": "#31303d", + "width": 156.91960211347427, + "height": 202.52965871184844, + "seed": 1422609637, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.5174402625558941, + 153.07081832845213 + ], + [ + 0.024214989577192328, + 170.49726629104168 + ], + [ + 8.081706559553382, + 178.02701896603557 + ], + [ + 36.14151890922964, + 184.3996278642901 + ], + [ + 83.57055021187553, + 186.38396307887345 + ], + [ + 128.88585322586226, + 183.21568123649243 + ], + [ + 152.96220736647672, + 175.63879251308563 + ], + [ + 156.35785132473478, + 169.2513958349361 + ], + [ + 156.83475722633008, + 155.2214896600979 + ], + [ + 156.46044154775237, + 12.841787280570305 + ], + [ + 155.6166138575266, + -0.6104712421417235 + ], + [ + 145.54079235081196, + -8.129027022318041 + ], + [ + 124.32326252611965, + -12.483376690432408 + ], + [ + 75.97137880920118, + -16.145695632974988 + ], + [ + 37.20543098622435, + -13.961846601127224 + ], + [ + 6.716276296944874, + -6.55449714796462 + ], + [ + -0.08484488714419755, + -0.09197470959336009 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4478, + "versionNonce": 1196445413, + "isDeleted": false, + "id": "geZkKJOZdhyrggQ7qazU8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2247.972339400524, + "y": 143.61421320185946, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 705175531, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "ellipse", + "version": 7485, + "versionNonce": 1338785259, + "isDeleted": false, + "id": "ehbDxEiRf_uFTOq1oLka9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2250.6923212456722, + "y": 72.12106116910763, + "strokeColor": "#000000", + "backgroundColor": "#ffc029", + "width": 155.9130940868504, + "height": 31.532250296696027, + "seed": 1912236101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4577, + "versionNonce": 277817925, + "isDeleted": false, + "id": "IUWTUS2AQPGLoJUpWh2rm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2247.525933405942, + "y": 200.42698884700985, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 157.08237038522887, + "height": 17.4285282276581, + "seed": 259189387, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 4.138445982244127, + 6.947302618857926 + ], + [ + 21.98585257323534, + 12.776025671289773 + ], + [ + 45.73462235278188, + 16.3058651076338 + ], + [ + 82.94003624662689, + 16.627523483376613 + ], + [ + 126.35747752200551, + 14.380233996405693 + ], + [ + 151.7137538814974, + 6.204645573105942 + ], + [ + 157.08237038522887, + -0.8010047442814846 + ] + ] + }, + { + "type": "image", + "version": 8130, + "versionNonce": 1661159563, + "isDeleted": false, + "id": "SOGsF7zsparRJTeljGmJc", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2184.0887563068727, + "y": 118.56221596468276, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 35.27218506101576, + "height": 31.349918082230808, + "seed": 91166629, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 8183, + "versionNonce": 941332901, + "isDeleted": false, + "id": "w__t4vd79SSk8wNtXWgm8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2235.608243000458, + "y": 171.02905205121897, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 135.77817410382812, + "height": 27.30734227786485, + "seed": 510353707, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 21.23904399389489, + "fontFamily": 1, + "text": "Self-managed", + "baseline": 19.30734227786485, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Self-managed" + }, + { + "type": "rectangle", + "version": 5245, + "versionNonce": 473956139, + "isDeleted": false, + "id": "wZWqwlbGVmv_3REfU_-V8", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 72.53530425621375, + "y": -78.33831423580341, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1498864389, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "zbuG_G2z3ThbiIoyaxsn8", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5164, + "versionNonce": 1193483525, + "isDeleted": false, + "id": "jrqM_ilDD8rJ2VVBqrBO3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 157.71181085419175, + "y": -202.49390012438744, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 811336651, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5566, + "versionNonce": 99410379, + "isDeleted": false, + "id": "vPToa6FdwoLyJdILu5COt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 22.006868138757454, + "y": -111.54271511297338, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 372191845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "7_HcUZOHbIY1UTDIRXGOr", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5494, + "versionNonce": 1159935077, + "isDeleted": false, + "id": "Vfuy5whpmukORwoxPV_ZK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 99.96502671995495, + "y": -167.84582964385118, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 224350827, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5276, + "versionNonce": 2032431211, + "isDeleted": false, + "id": "H216n5THNRqzZzfGZOCEp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 296.30409277635135, + "y": -84.11299264921763, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 2026216901, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4542, + "versionNonce": 1844010949, + "isDeleted": false, + "id": "JWL80PaYAkMuTLBIFT13A", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 40.36369895745975, + "y": -93.7987566127158, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 373280011, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4243, + "versionNonce": 1202793227, + "isDeleted": false, + "id": "OJQZgw4mHPpyoq4K3Jmyo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 211.78693937993467, + "y": -141.47939302161467, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1211604261, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4441, + "versionNonce": 663953189, + "isDeleted": false, + "id": "VTcOWqSYHjLKC2Db2hVMR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 264.90919026643405, + "y": -83.4433138734712, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 779613099, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4334, + "versionNonce": 638423467, + "isDeleted": false, + "id": "Od7MzAHJWoVlupwHzHs4P", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 136.86022502307696, + "y": -163.04920473041057, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 200454277, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4313, + "versionNonce": 948826757, + "isDeleted": false, + "id": "S_zvmjmRGJRN--_X-781R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 84.37258696899607, + "y": -131.5281024450196, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1714570827, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7397, + "versionNonce": 1432626251, + "isDeleted": false, + "id": "HynFmorjXHuDafQLe1vz7", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 108.8014780075182, + "y": -73.36290061248656, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 28596197, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7214, + "versionNonce": 1033329125, + "isDeleted": false, + "id": "qSbLMG7pnZ2tt6nKAULY4", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 177.2881772961273, + "y": -92.14932481819051, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1682523371, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "rectangle", + "version": 5645, + "versionNonce": 227500779, + "isDeleted": false, + "id": "c5LxUAmYxjw7NIjMdvp-3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -496.42459287284055, + "y": -75.23260347335963, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1401557829, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5567, + "versionNonce": 1606210885, + "isDeleted": false, + "id": "_pE1fcw_qvGHy7u58Wps9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -411.24808627486254, + "y": -199.38818936194366, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 273117067, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186134, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5960, + "versionNonce": 656002443, + "isDeleted": false, + "id": "M3A6eayRqfci6_fQLGuCc", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -546.9530289902968, + "y": -108.43700435053688, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 231826085, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5893, + "versionNonce": 1247536293, + "isDeleted": false, + "id": "qYH-NnUq0Yn-aPb4P-42Z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -468.99487040909935, + "y": -164.7401188814074, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 2087142955, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5675, + "versionNonce": 87942187, + "isDeleted": false, + "id": "fpjGYlmtPWgk2EMHT6R62", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -272.65580435270294, + "y": -81.00728188677385, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1429718533, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4941, + "versionNonce": 1629620229, + "isDeleted": false, + "id": "fVOX95mu6E9-WYP1Z22Mz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -528.5961981715946, + "y": -90.69304585027203, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 261310667, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4645, + "versionNonce": 1072047819, + "isDeleted": false, + "id": "NtNAz-pNECma9x2G_pxFz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -357.17295774911963, + "y": -138.37368225917817, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 1555742053, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4845, + "versionNonce": 906805093, + "isDeleted": false, + "id": "ATmXuvYlXL4i4rBFJnn-Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -304.0507068626166, + "y": -80.3376031110347, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1868953451, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "7_HcUZOHbIY1UTDIRXGOr", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4733, + "versionNonce": 229447019, + "isDeleted": false, + "id": "U8JCs_X1xzl2DrXkdsPkp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -432.09967210597733, + "y": -159.9434939679668, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 463980741, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4712, + "versionNonce": 1063881413, + "isDeleted": false, + "id": "XywoMS8apBgAgb-bHXyTz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -484.5873101600582, + "y": -128.4223916825831, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 707383819, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7799, + "versionNonce": 1843212299, + "isDeleted": false, + "id": "jYjk1VVjSGIyX_3NYhu-M", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -460.1584191215361, + "y": -70.25718985004278, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1134323749, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7617, + "versionNonce": 1305864741, + "isDeleted": false, + "id": "YMMr7CQZ_Q_5iQnC25Fyz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -392.4889127966735, + "y": -88.64606072203242, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 551114923, + "groupIds": [ + "Gh5QFUevEkL35kHqkRuvk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "arrow", + "version": 1165, + "versionNonce": 309393067, + "isDeleted": false, + "id": "7_HcUZOHbIY1UTDIRXGOr", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -136.92681873116726, + "y": -33.94399795946447, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 145.7814330403453, + "height": 2.387487505808167, + "seed": 1988500357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.14701890089017966, + "gap": 21.423492554524714, + "elementId": "ATmXuvYlXL4i4rBFJnn-Y" + }, + "endBinding": { + "focus": -0.05420258190551906, + "gap": 13.318412802221175, + "elementId": "vPToa6FdwoLyJdILu5COt" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 145.7814330403453, + -2.387487505808167 + ] + ] + }, + { + "type": "text", + "version": 7736, + "versionNonce": 1111448965, + "isDeleted": false, + "id": "plfMnxwGm3mHl6DrB2XOY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -139.29248204984015, + "y": -106.23647889695712, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 139, + "height": 50, + "seed": 824118091, + "groupIds": [ + "Kd-Ab3YPuapFFMQHjjeRy" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "remoteSecure\ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "remoteSecure\ntable function" + }, + { + "type": "rectangle", + "version": 5326, + "versionNonce": 169011531, + "isDeleted": false, + "id": "rjmTXa-owLXE_vN03orWW", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 106.1187098426808, + "y": 360.7418043474863, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1017275109, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "zbuG_G2z3ThbiIoyaxsn8", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5245, + "versionNonce": 65234149, + "isDeleted": false, + "id": "EKW3dDelTCBlbIGW3kf4k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 191.2952164406588, + "y": 236.5862184589023, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 525691371, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5647, + "versionNonce": 706578411, + "isDeleted": false, + "id": "HiiD5S4sPVdQsG7tv7JS-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 55.590273725224506, + "y": 327.53740347031635, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 981384773, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "wB2S7HvWGXAfhfyzZJliu", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5574, + "versionNonce": 911179845, + "isDeleted": false, + "id": "9wr_SoYrP8LZqONOlKro-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 133.548432306422, + "y": 271.23428893943856, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1082586251, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5356, + "versionNonce": 949703307, + "isDeleted": false, + "id": "wYb1u3p7YLkDfBkdUiaf2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 329.8874983628184, + "y": 354.9671259340721, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 653831589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4622, + "versionNonce": 794898341, + "isDeleted": false, + "id": "GgRBfq3WjFGuXfTM9Lyoe", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 73.9471045439268, + "y": 345.2813619705739, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 1684941611, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4324, + "versionNonce": 1447479595, + "isDeleted": false, + "id": "kL-CDc6-O0jV_X0sLwuUy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 245.37034496640172, + "y": 297.60072556167506, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 20820229, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4521, + "versionNonce": 759558917, + "isDeleted": false, + "id": "y5-Ck5mrLP6GRmzFcfhun", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 298.49259585289747, + "y": 355.63680470981853, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 2138410443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4414, + "versionNonce": 680160203, + "isDeleted": false, + "id": "LU9Jda4q6oLTkQYv8-fF1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 170.44363060954402, + "y": 276.03091385287917, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 113985637, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4393, + "versionNonce": 1283148389, + "isDeleted": false, + "id": "qVMnQcxHBQv8cli8AGnuw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 117.95599255546313, + "y": 307.5520161382701, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 347577451, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7478, + "versionNonce": 1132509803, + "isDeleted": false, + "id": "3sCda1Ba7vwDKQwgiNx1m", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 142.38488359398525, + "y": 365.7172179708032, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1768879045, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7365, + "versionNonce": 1036957125, + "isDeleted": false, + "id": "YlPWZi87SXRGq0XIaUtQY", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 210.66548600575425, + "y": 370.70641225843974, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 158, + "height": 36, + "seed": 1610536715, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Destination", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Destination" + }, + { + "type": "rectangle", + "version": 5851, + "versionNonce": 1408513291, + "isDeleted": false, + "id": "PZZfU07Fz7658lCtDAuJM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -530.2659176429997, + "y": 364.3299894533011, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1162228517, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5773, + "versionNonce": 1012774181, + "isDeleted": false, + "id": "5O92161RK_hfDtw0g_hI7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -445.08941104502173, + "y": 240.17440356471707, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1069923755, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "566IgwGGurzir3uYye-06", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6123, + "versionNonce": 157244331, + "isDeleted": false, + "id": "6Gvy8J4igkVq6yLtsC19k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -580.794353760456, + "y": 331.12558857612385, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1455326853, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6098, + "versionNonce": 1133889669, + "isDeleted": false, + "id": "35zIwykMdV-ua1HGxDB6V", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -502.83619517925854, + "y": 274.82247404525333, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1597427787, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5880, + "versionNonce": 1072475723, + "isDeleted": false, + "id": "KcnXprTx4G3RFbGh45cUN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -306.49712912286213, + "y": 358.5553110398869, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1888841189, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5104, + "versionNonce": 87322597, + "isDeleted": false, + "id": "nrsLdUIac10vyqx2LAERL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -562.4375229417537, + "y": 348.8695470763887, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 539791083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4851, + "versionNonce": 1786162411, + "isDeleted": false, + "id": "2mcALtn_Jpe8oU0fVg742", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -391.0142825192788, + "y": 301.18891066748256, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 836266309, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5051, + "versionNonce": 524757829, + "isDeleted": false, + "id": "OdoEJPUUjjpm3wkZyaUby", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -337.8920316327758, + "y": 359.22498981562603, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1160870283, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "wB2S7HvWGXAfhfyzZJliu", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4938, + "versionNonce": 1015535499, + "isDeleted": false, + "id": "K_Mb-Ei7K-MMMB6K0UW7t", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -465.9409968761365, + "y": 279.61909895869394, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 2078603429, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4917, + "versionNonce": 304839333, + "isDeleted": false, + "id": "t6lbfCFxQlbVuZhDofbE_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -518.4286349302174, + "y": 311.1402012440776, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1535119403, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 8005, + "versionNonce": 341487147, + "isDeleted": false, + "id": "R06ERP8NpJTYVwIrec4eJ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -493.9997438916953, + "y": 369.30540307661795, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 677944325, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7884, + "versionNonce": 1989074437, + "isDeleted": false, + "id": "THA16tSc-D1o3XgBExhNZ", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -409.3998157948654, + "y": 369.1646870977329, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 91, + "height": 36, + "seed": 1694683851, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Source", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Source" + }, + { + "type": "arrow", + "version": 1658, + "versionNonce": 618246347, + "isDeleted": false, + "id": "wB2S7HvWGXAfhfyzZJliu", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -170.7543140350963, + "y": 405.7758149384408, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 213.1839646328135, + "height": 3.1598516889071107, + "seed": 2137052005, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.14682192295464302, + "gap": 21.413555760747784, + "elementId": "OdoEJPUUjjpm3wkZyaUby" + }, + "endBinding": { + "focus": -0.05420258190550621, + "gap": 13.318393240498267, + "elementId": "HiiD5S4sPVdQsG7tv7JS-" + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 213.1839646328135, + -3.1598516889071107 + ] + ] + }, + { + "type": "text", + "version": 7965, + "versionNonce": 1936643429, + "isDeleted": false, + "id": "sJTx0Ba2ovrRNuR2HeFUm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -79.37936725138297, + "y": 286.59799742132054, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 130, + "height": 125, + "seed": 1112818027, + "groupIds": [ + "1HFR7Ei8MXpm-rFjcELuN" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + }, + { + "id": "6FaXKDfsyAvl8vl6CIWfb", + "type": "arrow" + }, + { + "id": "Y7ghgh9VxQ6d7g6RwVuco", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "pull data \nfrom Source\nwith \nremoteSecure\n", + "baseline": 118, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "pull data \nfrom Source\nwith \nremoteSecure\n" + }, + { + "type": "rectangle", + "version": 8137, + "versionNonce": 1604280171, + "isDeleted": false, + "id": "8o5d6LTypxQ8rCasaSBD_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -626.5480510568605, + "y": -2211.1328222176408, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 149.93149863847913, + "seed": 855330981, + "groupIds": [ + "L-ntX2Ybuoz63aPG94gYe" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7989, + "versionNonce": 1947787461, + "isDeleted": false, + "id": "IfhDKrrSyh5x4Z9wePwZD", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -1314.2783841270584, + "y": -2477.641544159903, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 161167403, + "groupIds": [ + "uHpShOIDYE8Fdg4MD0AyX" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8604, + "versionNonce": 519453195, + "isDeleted": false, + "id": "lOlHuzp_Bro1f80c_5cNq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2434.008438051972, + "y": -2839.48752327043, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 1525937157, + "groupIds": [ + "XDrUJY93osCRJu9SnBsUk" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "DLLu8qJxF24-v8VR3aTuM", + "type": "arrow" + }, + { + "id": "to7w8wQvUflVpas8AZ72I", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8425, + "versionNonce": 506101797, + "isDeleted": false, + "id": "owHDN4M6MPDZVxWkmlr31", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2315.1169344429827, + "y": -2540.8198024434214, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 1970862795, + "groupIds": [ + "TzVb1rYGyv6CoPeU5WaTR" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "DLLu8qJxF24-v8VR3aTuM", + "type": "arrow" + }, + { + "id": "zgSfFJcjgXYvLLCAvnkV6", + "type": "arrow" + }, + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 6156, + "versionNonce": 265863339, + "isDeleted": false, + "id": "fCZ78dlKsWB3LHYeTjsV-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1999.1278443875717, + "y": -2783.5686647175507, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1992371045, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3948, + "versionNonce": 126956421, + "isDeleted": false, + "id": "7JOyMXo41znrPsMV0493B", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1999.5119295169434, + "y": -2762.2729386024557, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 835021163, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6954, + "versionNonce": 1542550347, + "isDeleted": false, + "id": "CggrI2uulJ9_pAZkMKg3i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2000.3119298403626, + "y": -2788.9619467225248, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1185969861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4048, + "versionNonce": 747272933, + "isDeleted": false, + "id": "-Pi5MqguOGFoJ1g3XDKED", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1999.4131251827066, + "y": -2741.231359710947, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 332071947, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 6107, + "versionNonce": 328913387, + "isDeleted": false, + "id": "du9sSXuxvj6INm7ctNc0z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2030.6655592523284, + "y": -2747.1359239737985, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 627004965, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3899, + "versionNonce": 631494213, + "isDeleted": false, + "id": "F_ZxA64nXfaCQz11e3ttr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2031.0496443817037, + "y": -2725.8401978587035, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1669614251, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6904, + "versionNonce": 1474256011, + "isDeleted": false, + "id": "ubrEXPq51KMZnVZr5nJOt", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2031.8496447051193, + "y": -2752.5292059787726, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1035684229, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186135, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3999, + "versionNonce": 498779557, + "isDeleted": false, + "id": "3KmShGA8VpZg3r1L_nxcu", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2030.950840047467, + "y": -2704.798618967191, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 94092619, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5968, + "versionNonce": 1148818219, + "isDeleted": false, + "id": "vo2FuZyVXE4kxU5zDafW6", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2068.3237015834484, + "y": -2718.7109320403843, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 16896229, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186135, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3760, + "versionNonce": 134007045, + "isDeleted": false, + "id": "VA3YXVsEbA12Ce-gjYuoM", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2068.7077867128237, + "y": -2697.415205925293, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1701567467, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6764, + "versionNonce": 433321419, + "isDeleted": false, + "id": "90ol4Dx2NQLv4dbdfaUat", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2069.5077870362393, + "y": -2724.104214045362, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1556114501, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3860, + "versionNonce": 367485029, + "isDeleted": false, + "id": "cWerttJv5C9YhfOQDo6B7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2068.608982378587, + "y": -2676.3736270337804, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 520038027, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 6470, + "versionNonce": 654902379, + "isDeleted": false, + "id": "thD28xk-4mxO0w_Gul7mP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2125.130287433395, + "y": -2641.427641902789, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 226, + "height": 36, + "seed": 819239845, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "local databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "local databases" + }, + { + "type": "image", + "version": 7108, + "versionNonce": 1833438149, + "isDeleted": false, + "id": "lJNyMtyhWww3bsnkrDxvf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2274.392192420676, + "y": -2524.7127932699814, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1762663723, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 3336, + "versionNonce": 1944272651, + "isDeleted": false, + "id": "4g0WqdIPD6miHNNmQIkbK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2254.2810782844635, + "y": -2775.069802607545, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 90955525, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1400, + "versionNonce": 507267877, + "isDeleted": false, + "id": "Ebtrlwu6f6s_oTpUl4skk", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2254.3213866165743, + "y": -2775.013669603247, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 1057570763, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 1456, + "versionNonce": 719136171, + "isDeleted": false, + "id": "fOcFgdbU5tM8S6CFAhn6x", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2335.7610500894907, + "y": -2775.0129332344522, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 17020517, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 1411, + "versionNonce": 1496424069, + "isDeleted": false, + "id": "41TQ0eTXw8jeobeYFfQdg", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2335.9078927799374, + "y": -2617.397442653256, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1258622571, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 1414, + "versionNonce": 1126250571, + "isDeleted": false, + "id": "wUvsqNUUs95IZc_6RrtKP", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2225.739013846326, + "y": -2616.8406136278836, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 510239173, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 1369, + "versionNonce": 1692763621, + "isDeleted": false, + "id": "R6W--oEOcjCTl9C43tEFT", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2255.01231520493, + "y": -2775.24723089887, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 265160971, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2691, + "versionNonce": 1787426539, + "isDeleted": false, + "id": "Fdcn78xbgeOSnj7CoQbbk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2363.4190810240425, + "y": -2685.0483800056472, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 582689061, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 1533, + "versionNonce": 1415938373, + "isDeleted": false, + "id": "dMHJjXGe9guXMXrK-EYFJ", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2358.1173754919027, + "y": -2681.4355958478964, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 1390325675, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 1226, + "versionNonce": 799138187, + "isDeleted": false, + "id": "g87gFrurQUavEi63bWE9Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.2634283468024, + "y": -2747.3133525753483, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 1399174277, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 1471, + "versionNonce": 2098139301, + "isDeleted": false, + "id": "ElBPOU2qrPpFter7yuhWl", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.1874112357864, + "y": -2736.2068479769196, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1180795467, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1485, + "versionNonce": 1805875243, + "isDeleted": false, + "id": "skOtVgeZIfPXuV9pJF6Dd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.1600029541178, + "y": -2724.879259809947, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1814485989, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1530, + "versionNonce": 747615237, + "isDeleted": false, + "id": "8APrtNgnN5V9YNdGuY9KU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.153860521051, + "y": -2713.5416287968264, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1932591339, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1547, + "versionNonce": 1819884235, + "isDeleted": false, + "id": "e1iSkYCjVO1Z7oGY9xLs_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2324.2481182261063, + "y": -2700.8752080621643, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1426855749, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6716, + "versionNonce": 518318949, + "isDeleted": false, + "id": "p95-LgGntL-KQaYF7hN_n", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2207.349379832528, + "y": -2519.883290156843, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1658301323, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 1783, + "versionNonce": 1589487979, + "isDeleted": false, + "id": "DLLu8qJxF24-v8VR3aTuM", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2278.6531810373754, + "y": -2614.1771529124717, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 31.295754211033, + "height": 69.40972855836844, + "seed": 410183333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": -0.6882118099130294, + "gap": 11.151214588133826, + "elementId": "2IJ0D70LQc4E7GBchXo4Y" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 31.295754211033, + 69.40972855836844 + ] + ] + }, + { + "type": "arrow", + "version": 1878, + "versionNonce": 878458565, + "isDeleted": false, + "id": "zgSfFJcjgXYvLLCAvnkV6", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2054.711098371644, + "y": -2605.4727323626003, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 21.171898020946173, + "height": 60.90873194937376, + "seed": 160432683, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.17799632636425824, + "gap": 3.7441979698051, + "elementId": "owHDN4M6MPDZVxWkmlr31" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -21.171898020946173, + 60.90873194937376 + ] + ] + }, + { + "type": "rectangle", + "version": 7810, + "versionNonce": 2008761355, + "isDeleted": false, + "id": "9xGjafV3vr3k4QjWOoZl7", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -1195.6070062758836, + "y": -2178.973823332891, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 420006405, + "groupIds": [ + "q8BAAGEs7VgjlP3TlbgV5" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + }, + { + "id": "MsQOvDI0B0vHVxpY1itjF", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 5550, + "versionNonce": 1737692709, + "isDeleted": false, + "id": "C_ff__dpNEYjPWzj8x7qf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -879.3977904626563, + "y": -2421.722685607024, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1883538635, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3342, + "versionNonce": 1600948907, + "isDeleted": false, + "id": "z1x4uq2iKYVksIjr67LFm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -879.7818755920316, + "y": -2400.4269594919324, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 130761061, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6345, + "versionNonce": 58132869, + "isDeleted": false, + "id": "-IRYwunN3-LHQeU_Mqiuq", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -880.5818759154472, + "y": -2427.1159676120014, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 512734059, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3442, + "versionNonce": 1518075211, + "isDeleted": false, + "id": "LPgKzYud4xjEI3SrfTIww", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -879.6830712577948, + "y": -2379.38538060042, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 436718789, + "groupIds": [ + "t44jaMA2cANIgv7wU62tb" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5501, + "versionNonce": 423989477, + "isDeleted": false, + "id": "-nlSvDoxV24uIt8EvhvJb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -910.9355053274166, + "y": -2385.289944863268, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1153175051, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3293, + "versionNonce": 876878827, + "isDeleted": false, + "id": "Lrl2c88T-b0-CzfgcQjC0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -911.319590456792, + "y": -2363.9942187481765, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 2136730661, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6295, + "versionNonce": 915156037, + "isDeleted": false, + "id": "Pq1a2mHMny48WxACyoviR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -912.1195907802075, + "y": -2390.6832268682456, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 633607339, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3393, + "versionNonce": 1758422667, + "isDeleted": false, + "id": "kox69SzM1UYi2K90cG-Rw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -911.2207861225552, + "y": -2342.9526398566677, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 397746053, + "groupIds": [ + "p1M8ePJl3IsnIgMnz_coa" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5362, + "versionNonce": 1529371557, + "isDeleted": false, + "id": "WTYe4F3Uwv12Mg1UKU6EK", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -948.5936476585348, + "y": -2356.8649529298573, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1095911243, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3154, + "versionNonce": 249060651, + "isDeleted": false, + "id": "AF25pl3vV8MpUK1w4GQef", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -948.9777327879101, + "y": -2335.5692268147623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1766909669, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6155, + "versionNonce": 793222917, + "isDeleted": false, + "id": "m6-9zYuql8_uOvmQ677Xk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -949.7777331113257, + "y": -2362.2582349348313, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1036068331, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3254, + "versionNonce": 29982667, + "isDeleted": false, + "id": "KGPZOq2fKhP8g-iXm5gKO", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -948.8789284536733, + "y": -2314.5276479232534, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1455211077, + "groupIds": [ + "V7h5dcjt_e-bILChTDhlJ" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 5864, + "versionNonce": 2036823653, + "isDeleted": false, + "id": "7u8QGBy2yXZZHlgiJxYq8", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -967.0651813436962, + "y": -2279.5816627922623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149, + "height": 36, + "seed": 303771787, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "databases" + }, + { + "type": "image", + "version": 6500, + "versionNonce": 1270697579, + "isDeleted": false, + "id": "UE-lXJ75LD3ut7MQ8LB0t", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1154.6621384957625, + "y": -2162.8668141594544, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 349581733, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186136, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 2731, + "versionNonce": 1414881733, + "isDeleted": false, + "id": "eni9frbYUCh26lLp9P91N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1134.55102435955, + "y": -2413.223823497018, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 1880811307, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 794, + "versionNonce": 1333676299, + "isDeleted": false, + "id": "qo52KSrQz2Kp_NMVFvAJy", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1134.5913326916607, + "y": -2413.1676904927162, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 1623897349, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 850, + "versionNonce": 623829285, + "isDeleted": false, + "id": "q65ecq1UCsaaRRT5xFQU6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1216.0309961645735, + "y": -2413.1669541239253, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 1848297931, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 805, + "versionNonce": 847703979, + "isDeleted": false, + "id": "ot3cmlGfx6olNKg7B_EPM", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1216.1778388550238, + "y": -2255.551463542729, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1981271141, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 808, + "versionNonce": 1365341317, + "isDeleted": false, + "id": "i4aG1wwhE1qIMqB79RSKq", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1106.0089599214089, + "y": -2254.9946345173566, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 1902467179, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 763, + "versionNonce": 117555787, + "isDeleted": false, + "id": "-48LMYLMQKlmphs3CsegD", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1135.2822612800164, + "y": -2413.4012517883393, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 1149958085, + "groupIds": [ + "Nrj5jBY5GXFtj9YeXiFl4" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2086, + "versionNonce": 883596261, + "isDeleted": false, + "id": "leoRf9zelCB40OVcpDG3i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1243.689027099129, + "y": -2323.2024008951203, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 1469387531, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 925, + "versionNonce": 902381803, + "isDeleted": false, + "id": "kT6GiFMZmJAHGfQ8r00_N", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1238.3873215669892, + "y": -2319.5896167373694, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 1715582757, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 620, + "versionNonce": 1461180229, + "isDeleted": false, + "id": "l2NCpRyjNaEBL_tyLF61N", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.5333744218851, + "y": -2385.4673734648177, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 1630828971, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 865, + "versionNonce": 677899147, + "isDeleted": false, + "id": "ZaCZ8v6BqbBfjT2w95s6z", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.4573573108728, + "y": -2374.360868866389, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1437174405, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 879, + "versionNonce": 1661380261, + "isDeleted": false, + "id": "wxOmkWcSJPBx1-K3oL3mG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.4299490292042, + "y": -2363.03328069942, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1533938763, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186136, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 924, + "versionNonce": 857227819, + "isDeleted": false, + "id": "o9HHNCuZXX7qEny2rQo-r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.4238065961372, + "y": -2351.6956496862995, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1669329381, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 941, + "versionNonce": 1529121285, + "isDeleted": false, + "id": "6UIQWH7tXvdBD-vWnmKyU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1204.518064301189, + "y": -2339.0292289516374, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 169626347, + "groupIds": [ + "RTfMpmxNGvaxlvYzr-7hS" + ], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6109, + "versionNonce": 1053082827, + "isDeleted": false, + "id": "Zw3Q4k7LAawCjJpC01mGn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1087.6193259076144, + "y": -2158.0373110463124, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1825729861, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 391, + "versionNonce": 275710309, + "isDeleted": false, + "id": "1WQ2iSmfSDsYi77fBC6D1", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1157.9424821553775, + "y": -2251.670750881972, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 30.543190647570555, + "height": 68.97537186588124, + "seed": 1372173707, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": -0.4742441762028566, + "gap": 3.7215556831997674, + "elementId": "9xGjafV3vr3k4QjWOoZl7" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 30.543190647570555, + 68.97537186588124 + ] + ] + }, + { + "type": "arrow", + "version": 711, + "versionNonce": 856159083, + "isDeleted": false, + "id": "MsQOvDI0B0vHVxpY1itjF", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -929.1710124087094, + "y": -2244.199945035819, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 27.00154789127282, + "height": 61.48192373312122, + "seed": 1358855333, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.15452720968572006, + "gap": 3.744197969806919, + "elementId": "9xGjafV3vr3k4QjWOoZl7" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -27.00154789127282, + 61.48192373312122 + ] + ] + }, + { + "type": "rectangle", + "version": 7944, + "versionNonce": 1479773381, + "isDeleted": false, + "id": "PX9bdLR5yM01mzEzgVkkY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -498.52377385314594, + "y": -2175.897587804234, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 565234731, + "groupIds": [ + "nMjbdAw5na12mCX8CXtL_" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1WQ2iSmfSDsYi77fBC6D1", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 6635, + "versionNonce": 539774475, + "isDeleted": false, + "id": "bsVBCXA748FSATArbCkum", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -458.0167475576445, + "y": -2159.5662654577254, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 665952261, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 6244, + "versionNonce": 34581541, + "isDeleted": false, + "id": "UUEqDhCh-gcse_FwzByhj", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -390.8107114416007, + "y": -2154.9610755176554, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 498863819, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "text", + "version": 6229, + "versionNonce": 690771115, + "isDeleted": false, + "id": "Ew02QnfdHLCLjdtzreHXt", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1181.9094389344873, + "y": -2040.4462005822033, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 360, + "height": 44, + "seed": 921261925, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "clickhouse-server", + "baseline": 35, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-server" + }, + { + "type": "text", + "version": 6344, + "versionNonce": 233889669, + "isDeleted": false, + "id": "tof5mYrfcrFk1yW2Kkf7C", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -493.7546811131933, + "y": -2040.4462005822033, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 339, + "height": 44, + "seed": 142998891, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 3, + "text": "clickhouse-local", + "baseline": 35, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "clickhouse-local" + }, + { + "type": "text", + "version": 6283, + "versionNonce": 766674763, + "isDeleted": false, + "id": "gwshLyWLuynSAj1I4DGMa", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1898.7704829782697, + "y": -2040.4462005822033, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 359, + "height": 46, + "seed": 687022789, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "A ClickHouse cluster", + "baseline": 32, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "A ClickHouse cluster" + }, + { + "type": "rectangle", + "version": 8771, + "versionNonce": 571778789, + "isDeleted": false, + "id": "2IJ0D70LQc4E7GBchXo4Y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2236.2062122382094, + "y": -2657.4604490531865, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 1834555403, + "groupIds": [ + "U0h2rmvhxA2gwH1s-q5xK" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + }, + { + "id": "to7w8wQvUflVpas8AZ72I", + "type": "arrow" + }, + { + "id": "DLLu8qJxF24-v8VR3aTuM", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 8588, + "versionNonce": 874079723, + "isDeleted": false, + "id": "w6lV85637T8vrQnLtQo0h", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2117.31470862922, + "y": -2358.792728226178, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 40665637, + "groupIds": [ + "rufko5ZiQVhaQIYHNmSaH" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + }, + { + "id": "sKcHbfBhkzgjKfvYE_7GJ", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 6321, + "versionNonce": 1091076677, + "isDeleted": false, + "id": "vMqGIVkP_P4qA4lq7uZVX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1801.3256185738092, + "y": -2601.5415905003074, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 170909355, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4113, + "versionNonce": 325808267, + "isDeleted": false, + "id": "xz2OkFtyOky0242nkEq-R", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1801.7097037031808, + "y": -2580.2458643852124, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1480783237, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7120, + "versionNonce": 1068102053, + "isDeleted": false, + "id": "oPYEfDHa3usT3Yh_9hbNG", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1802.5097040266, + "y": -2606.9348725052814, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 2041893195, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4213, + "versionNonce": 1566779179, + "isDeleted": false, + "id": "uPueOipKG6P9QxFSZ74Ck", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1801.610899368944, + "y": -2559.2042854937035, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1169423589, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 6272, + "versionNonce": 2066117893, + "isDeleted": false, + "id": "hMsiCnXNSIotMym_Ltblx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1832.8633334385677, + "y": -2565.108849756555, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 490893291, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4064, + "versionNonce": 141232587, + "isDeleted": false, + "id": "NbKOwIRa0uNLPX4qQM-uz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1833.247418567943, + "y": -2543.81312364146, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 575477829, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7070, + "versionNonce": 1325108325, + "isDeleted": false, + "id": "wCX7A_I4NX1TASBumw2zS", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1834.0474188913586, + "y": -2570.502131761529, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1189296779, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4164, + "versionNonce": 1503500395, + "isDeleted": false, + "id": "Z87gu7b7LzxDOuq9g9FAw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1833.1486142337062, + "y": -2522.7715447499477, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 2011940773, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 6133, + "versionNonce": 1257682885, + "isDeleted": false, + "id": "VFDI5b6VToCAXDifZJdln", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1870.5214757696858, + "y": -2536.683857823141, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 592556331, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3925, + "versionNonce": 247812875, + "isDeleted": false, + "id": "52kKBUaqBC5sVlQeaSGJA", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1870.9055608990611, + "y": -2515.3881317080495, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 951945989, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6930, + "versionNonce": 691369765, + "isDeleted": false, + "id": "4s-741RvQPWHUR05TYqNz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1871.7055612224767, + "y": -2542.0771398281186, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1677218763, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4025, + "versionNonce": 1214036395, + "isDeleted": false, + "id": "wSBgiro_O9_eVryQts-TX", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1870.8067565648244, + "y": -2494.346552816537, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 893379173, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 6636, + "versionNonce": 69552773, + "isDeleted": false, + "id": "KLYPzHaY43-bmD0sAtqPz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1927.3280616196325, + "y": -2459.400567685546, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 226, + "height": 36, + "seed": 686924395, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "local databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "local databases" + }, + { + "type": "image", + "version": 7274, + "versionNonce": 864963659, + "isDeleted": false, + "id": "x4jX_Ey9XsbLNZZvPTMwl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2076.5899666069135, + "y": -2342.685719052738, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1379945925, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 3501, + "versionNonce": 1283699173, + "isDeleted": false, + "id": "PmkLIhEEA4XbCS_C3J0o_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2056.478852470701, + "y": -2593.042728390302, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 721952011, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 1565, + "versionNonce": 1949600491, + "isDeleted": false, + "id": "CQtmCNBpcJmZJI-m5QZCb", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2056.5191608028117, + "y": -2592.9865953860035, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 2128366885, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 1621, + "versionNonce": 2136878405, + "isDeleted": false, + "id": "mvM9Pu5Qhb2jut2eEYBXi", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2137.958824275728, + "y": -2592.985859017209, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 632701867, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 1576, + "versionNonce": 1322907019, + "isDeleted": false, + "id": "HhOfE7St0DWqnMwsY0ZCH", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2138.105666966175, + "y": -2435.3703684360125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1786863749, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 1579, + "versionNonce": 470957221, + "isDeleted": false, + "id": "VosRxAhvb_iTjI81IL--5", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2027.9367880325635, + "y": -2434.8135394106403, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 19306059, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 1534, + "versionNonce": 314117163, + "isDeleted": false, + "id": "VNO0Nktk4AygV_4FDIMsP", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2057.2100893911675, + "y": -2593.2201566816266, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 2062354405, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2856, + "versionNonce": 1515020293, + "isDeleted": false, + "id": "Pu9qPDHkRhNtvX0s-tNvR", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2165.61685521028, + "y": -2503.021305788404, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 1010013419, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 1698, + "versionNonce": 1136414411, + "isDeleted": false, + "id": "8A95rXiMD0Ja17NcrANJI", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2160.31514967814, + "y": -2499.408521630653, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 36488005, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 1391, + "versionNonce": 537728869, + "isDeleted": false, + "id": "FhyDVuTQ36snnXtmO3L6k", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.46120253304, + "y": -2565.286278358105, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 375897995, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 1636, + "versionNonce": 75382123, + "isDeleted": false, + "id": "wPCKhup0thT5yVa4ZfzHw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.385185422024, + "y": -2554.179773759676, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 882774693, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1650, + "versionNonce": 933159621, + "isDeleted": false, + "id": "Ffko5vqrQfbbzaIZ9-yxH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.357777140355, + "y": -2542.852185592704, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 2046662187, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1695, + "versionNonce": 1078548491, + "isDeleted": false, + "id": "wXOkeFLKsR6ZbcUYToiX4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.351634707288, + "y": -2531.514554579583, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 1592686085, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1712, + "versionNonce": 1168130597, + "isDeleted": false, + "id": "iKZaxGY-1-uDuIbHPu5P3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2126.4458924123437, + "y": -2518.848133844921, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 635410635, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6882, + "versionNonce": 353902251, + "isDeleted": false, + "id": "jR9YUhC2QGrb_Sj_ZC5Fu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2009.5471540187655, + "y": -2337.8562159395997, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1545301349, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 2195, + "versionNonce": 2130621829, + "isDeleted": false, + "id": "oQUHRqs2QGzG4h5w2xgHi", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -2080.850955223613, + "y": -2432.1500786952283, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 31.295754211033454, + "height": 69.3604978411513, + "seed": 396904299, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": { + "focus": -0.08713030619764997, + "gap": 21.694499958552115, + "elementId": "owHDN4M6MPDZVxWkmlr31" + }, + "endBinding": { + "focus": -0.6956229250733946, + "gap": 14.324279522642883, + "elementId": "Hv-bEvtN4bPONYgD1cW4_" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 31.295754211033454, + 69.3604978411513 + ] + ] + }, + { + "type": "arrow", + "version": 2210, + "versionNonce": 2106921291, + "isDeleted": false, + "id": "sKcHbfBhkzgjKfvYE_7GJ", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1856.9088725578831, + "y": -2423.445658145357, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 21.171898020946173, + "height": 60.90873194937376, + "seed": 1265793221, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.1779963263642492, + "gap": 3.7441979698051, + "elementId": "w6lV85637T8vrQnLtQo0h" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -21.171898020946173, + 60.90873194937376 + ] + ] + }, + { + "type": "rectangle", + "version": 8107, + "versionNonce": 519552229, + "isDeleted": false, + "id": "Hv-bEvtN4bPONYgD1cW4_", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -2035.230921489937, + "y": -2475.253020304618, + "strokeColor": "#15223c", + "backgroundColor": "#ffffff", + "width": 619.7113194723053, + "height": 416.6435439165702, + "seed": 899817995, + "groupIds": [ + "0dpL5qfWTpkqvPyKpGsyG" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mz5ZDQIxBn0lpiSDqW9Gn", + "type": "arrow" + }, + { + "id": "oQUHRqs2QGzG4h5w2xgHi", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "rectangle", + "version": 7926, + "versionNonce": 991604715, + "isDeleted": false, + "id": "e4D-rDmMszcmdTLp_xpUJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": -1916.3394178809476, + "y": -2176.585299477606, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 373.7286622373204, + "height": 86.97522378964102, + "seed": 110172197, + "groupIds": [ + "RWYJMjak8rzA1Wrw0oc9P" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "mz5ZDQIxBn0lpiSDqW9Gn", + "type": "arrow" + }, + { + "id": "to7w8wQvUflVpas8AZ72I", + "type": "arrow" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 5665, + "versionNonce": 488167493, + "isDeleted": false, + "id": "MDVsilsQYlVZ8plmoFD6a", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1600.3503278255384, + "y": -2419.3341617517353, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 952608939, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3457, + "versionNonce": 2142468747, + "isDeleted": false, + "id": "SiXpZm_zmcRTc7JdoX_y4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1600.73441295491, + "y": -2398.038435636644, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1466223493, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186137, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6461, + "versionNonce": 591366053, + "isDeleted": false, + "id": "Jn4c1-g771eXf3stxzTL3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1601.5344132783293, + "y": -2424.727443756713, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1455643467, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186137, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3557, + "versionNonce": 1478095147, + "isDeleted": false, + "id": "horI9wNnxozy4FQxWry7r", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1600.6356086206733, + "y": -2376.996856745135, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1848316645, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5616, + "versionNonce": 1134119685, + "isDeleted": false, + "id": "9hW_e28QUxAnAVHXoQixp", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1631.8880426902952, + "y": -2382.901421007983, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 737130987, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3408, + "versionNonce": 1438159819, + "isDeleted": false, + "id": "VrrLyxIFQHqfZvyRNSOFo", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1632.2721278196705, + "y": -2361.605694892888, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 393309765, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6411, + "versionNonce": 1856217701, + "isDeleted": false, + "id": "aD8FHkoO8tj4Mw1By8ekB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1633.072128143086, + "y": -2388.294703012957, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1700217995, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3508, + "versionNonce": 2024399467, + "isDeleted": false, + "id": "Auk6Fine-mzeYXs45fr8g", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1632.1733234854337, + "y": -2340.5641160013793, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 840261029, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "line", + "version": 5477, + "versionNonce": 690752965, + "isDeleted": false, + "id": "OoB5Lf23xkJ5HXPUyrQPZ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1669.5461850214133, + "y": -2354.4764290745725, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 716471083, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 3269, + "versionNonce": 1505254667, + "isDeleted": false, + "id": "F7fqeBv3BXgUBHewMqG3n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1669.9302701507886, + "y": -2333.1807029594775, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1698980101, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 6271, + "versionNonce": 38800677, + "isDeleted": false, + "id": "vMSCqHqG8CNqJtRXuxuDI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1670.7302704742042, + "y": -2359.8697110795465, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 1215421899, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 3369, + "versionNonce": 341738411, + "isDeleted": false, + "id": "tmZF-8nwfo9xmcmy1QXXr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1669.8314658165518, + "y": -2312.139124067965, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 377223269, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 5978, + "versionNonce": 1232937093, + "isDeleted": false, + "id": "12__p2EERUjpFQKzOHo91", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1687.85277087136, + "y": -2277.1931389369774, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 149, + "height": 36, + "seed": 430566507, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "databases", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "databases" + }, + { + "type": "image", + "version": 6615, + "versionNonce": 1892079179, + "isDeleted": false, + "id": "UyJgmTtraYE64GA2UeWLn", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1875.614675858641, + "y": -2160.4782903041696, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 529114053, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "line", + "version": 2845, + "versionNonce": 74500069, + "isDeleted": false, + "id": "HADzMX9ibWYhgnGgWbNvd", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1855.5035617224285, + "y": -2410.8352996417298, + "strokeColor": "#000000", + "backgroundColor": "#000000", + "width": 28.141120546780353, + "height": 26.4694644712729, + "seed": 841426699, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.4202789324840898, + 12.662423142687857 + ], + [ + 3.6081824750241807, + 23.68156917315497 + ], + [ + 15.369235688558051, + 26.4694644712729 + ], + [ + 28.141120546780353, + 25.568094542118917 + ], + [ + 19.331773949639178, + 16.303687984597477 + ], + [ + 8.855346337312973, + 6.759908312836984 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 909, + "versionNonce": 1305203947, + "isDeleted": false, + "id": "6u9bCIBr_auHuJMQJJpoj", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1855.5438700545392, + "y": -2410.7791666374314, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81.63006082540662, + "height": 0, + "seed": 1149952805, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -81.63006082540662, + 0 + ] + ] + }, + { + "type": "line", + "version": 965, + "versionNonce": 624460613, + "isDeleted": false, + "id": "1tRqjMTwFhmN4iC2sjzyK", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1936.9835335274556, + "y": -2410.7784302686405, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0, + "height": 157.64424675756638, + "seed": 1214516651, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 157.64424675756638 + ] + ] + }, + { + "type": "line", + "version": 920, + "versionNonce": 1257766795, + "isDeleted": false, + "id": "3fFdtOziIgPP2jXLo5faW", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1937.1303762179023, + "y": -2253.162939687444, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 110.30903029543029, + "height": 0, + "seed": 1777153669, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 110.30903029543029, + 0 + ] + ] + }, + { + "type": "line", + "version": 923, + "versionNonce": 3265189, + "isDeleted": false, + "id": "GFAoCsgsvjYoQAkFT4op6", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1826.961497284291, + "y": -2252.606110662068, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 0.08908533300960872, + "height": 132.91524135430075, + "seed": 1602953291, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.08908533300960872, + -132.91524135430075 + ] + ] + }, + { + "type": "line", + "version": 878, + "versionNonce": 847631915, + "isDeleted": false, + "id": "wgVw9ld8GCwduJkcOpmVc", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1856.234798642895, + "y": -2411.0127279330545, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 29.188478790539616, + "height": 26.489656438216134, + "seed": 174988773, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 29.188478790539616, + 26.489656438216134 + ] + ] + }, + { + "type": "line", + "version": 2200, + "versionNonce": 34223621, + "isDeleted": false, + "id": "VSwI2ddlHozaITCXQGMGr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1964.6415644620074, + "y": -2320.8138770398355, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 222.82788035249055, + "height": 42.93306688912038, + "seed": 829873899, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 82.73777835873057, + 0 + ], + [ + 176.75798103910643, + 0.386784386388482 + ], + [ + 191.8012134679665, + 2.90088289791351 + ], + [ + 197.7558263043905, + 12.183708171236837 + ], + [ + 198.06922697999158, + 29.008828979135387 + ], + [ + 193.3682168459725, + 39.64539960481836 + ], + [ + 176.75798103910634, + 42.54628250273184 + ], + [ + 83.67798038553447, + 42.93306688912038 + ], + [ + -1.2536027024050451, + 42.546282502731934 + ], + [ + -17.863838509271364, + 39.25861521842982 + ], + [ + -24.758653372498994, + 29.782397751912292 + ], + [ + -24.131852021296485, + 12.377100364431039 + ], + [ + -16.610235806866456, + 2.7074907047192958 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "text", + "version": 1042, + "versionNonce": 593483979, + "isDeleted": false, + "id": "wpsc6PgLwwnTlEPBUR1NH", + "fillStyle": "cross-hatch", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1959.3398589298677, + "y": -2317.2010928820846, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 173, + "height": 36, + "seed": 1830492485, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "server-config", + "baseline": 25, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "server-config" + }, + { + "type": "line", + "version": 735, + "versionNonce": 633285989, + "isDeleted": false, + "id": "fh2ZhrDeu23hyYMpxBhBT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.4859117847673, + "y": -2383.078849609533, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 60.21375194139211, + "height": 0, + "seed": 1488046475, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 60.21375194139211, + 0 + ] + ] + }, + { + "type": "line", + "version": 980, + "versionNonce": 2065729387, + "isDeleted": false, + "id": "wRexc-gyHIaWTd2pRtHU9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.4098946737513, + "y": -2371.972345011104, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 458336421, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 994, + "versionNonce": 715012293, + "isDeleted": false, + "id": "p7mnZ1VDsNTL0Lc2U7sHk", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.3824863920827, + "y": -2360.6447568441354, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 980836395, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1039, + "versionNonce": 1204747, + "isDeleted": false, + "id": "P22_gMUKA8RbPs9b-rEzb", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.3763439590157, + "y": -2349.3071258310147, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 381635589, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "line", + "version": 1056, + "versionNonce": 172283941, + "isDeleted": false, + "id": "6B5AcruXgH-nCyLD3MVJ0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1925.4706016640712, + "y": -2336.6407050963526, + "strokeColor": "#000000", + "backgroundColor": "#ffffff", + "width": 78.07920298436403, + "height": 0, + "seed": 816784075, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 78.07920298436403, + 0 + ] + ] + }, + { + "type": "text", + "version": 6225, + "versionNonce": 1261430955, + "isDeleted": false, + "id": "ykhBGUSVx8_gAhJjltiHL", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1808.571863270493, + "y": -2155.6487871910276, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 224, + "height": 36, + "seed": 1331790693, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "database engine", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "database engine" + }, + { + "type": "arrow", + "version": 1004, + "versionNonce": 782273413, + "isDeleted": false, + "id": "mz5ZDQIxBn0lpiSDqW9Gn", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1879.8756644753403, + "y": -2249.9426499466563, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 31.295754211033, + "height": 69.63579478585052, + "seed": 1945538923, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": -0.47424417620283493, + "gap": 3.7215556831997674, + "elementId": "e4D-rDmMszcmdTLp_xpUJ" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 31.295754211033, + 69.63579478585052 + ] + ] + }, + { + "type": "arrow", + "version": 972, + "versionNonce": 1914936139, + "isDeleted": false, + "id": "to7w8wQvUflVpas8AZ72I", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": -1648.8446611065237, + "y": -2241.950183904267, + "strokeColor": "#000000", + "backgroundColor": "#868e96", + "width": 28.505962040905615, + "height": 61.62068645685258, + "seed": 1501941445, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "focus": 0.1462681295898969, + "gap": 3.744197969808738, + "elementId": "e4D-rDmMszcmdTLp_xpUJ" + }, + "lastCommittedPoint": null, + "startArrowhead": "arrow", + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + -28.505962040905615, + 61.62068645685258 + ] + ] + }, + { + "type": "text", + "version": 656, + "versionNonce": 1743704805, + "isDeleted": false, + "id": "gbadPz-4zj3IDJdO5qfsX", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -2029.567502425948, + "y": -1948.406668685543, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 622, + "height": 140, + "seed": 1167535115, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 27.892801669284363, + "fontFamily": 1, + "text": "Typically, ClickHouse is run in the form \nof a cluster, where several instances of \nthe ClickHouse database engine are running \nin a distributed fashion on different servers.", + "baseline": 130, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Typically, ClickHouse is run in the form \nof a cluster, where several instances of \nthe ClickHouse database engine are running \nin a distributed fashion on different servers." + }, + { + "type": "text", + "version": 1313, + "versionNonce": 1900542443, + "isDeleted": false, + "id": "Z5vcHpNlFJ6NtIedQaSF5", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -1332.568992691742, + "y": -1943.9070466637686, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 665, + "height": 140, + "seed": 1674161701, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 27.892801669284363, + "fontFamily": 1, + "text": "On a single server, the database engine is \nrun as part of the clickhouse-server program.\nDatabase access (paths, users, security, ...) \nis configured with a server-configuration file.", + "baseline": 130, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "On a single server, the database engine is \nrun as part of the clickhouse-server program.\nDatabase access (paths, users, security, ...) \nis configured with a server-configuration file." + }, + { + "type": "text", + "version": 2097, + "versionNonce": 582823493, + "isDeleted": false, + "id": "udp3EAZO5LoiAoBsvIk50", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dotted", + "roughness": 1, + "opacity": 50, + "angle": 0, + "x": -623.3794925498278, + "y": -1962.1812713616519, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 583, + "height": 210, + "seed": 1502311083, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664549186138, + "link": null, + "locked": false, + "fontSize": 27.892801669284363, + "fontFamily": 1, + "text": "The database engine can also be used \nisolated in a command line utility fashion.\nEnabling blazing fast SQL data processing\non an ample amount of input and output \nformats without having to configure, and\n start a ClickHouse server program. ", + "baseline": 200, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "The database engine can also be used \nisolated in a command line utility fashion.\nEnabling blazing fast SQL data processing\non an ample amount of input and output \nformats without having to configure, and\n start a ClickHouse server program. " + }, + { + "type": "text", + "version": 8616, + "versionNonce": 323754245, + "isDeleted": false, + "id": "aj8v9PRA-2I7IADOUYim9", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5595.347266367396, + "y": -136.89640861599423, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 148, + "height": 50, + "seed": 598984005, + "groupIds": [ + "XQ3S1IL0Opx7UqJFzxHpY" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "objectStorage \ntable function", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "objectStorage \ntable function" + }, + { + "type": "rectangle", + "version": 5436, + "versionNonce": 702653899, + "isDeleted": false, + "id": "Zux-4PqGRMyYJPQ6Z-4qU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5795.523769562579, + "y": -120.55567942307403, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1984552331, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5358, + "versionNonce": 449622117, + "isDeleted": false, + "id": "rcS2ZPTKNchUYBD_6zgEF", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5880.700276160557, + "y": -244.71126531165805, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 1374999717, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5756, + "versionNonce": 1239463019, + "isDeleted": false, + "id": "zLHrPiNtSWD_QDGM6H8Dx", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5744.995333445123, + "y": -153.76008030024764, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 334230571, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5689, + "versionNonce": 1224956869, + "isDeleted": false, + "id": "aAaf6PBrwP7ezaIQWZRzz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5822.95349202632, + "y": -210.0631948311218, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 1746728965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5471, + "versionNonce": 1078259467, + "isDeleted": false, + "id": "xS5nrW3VhvMgaR9QgGRZ-", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 6019.292558082717, + "y": -126.33035783649007, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1850881739, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4738, + "versionNonce": 101554981, + "isDeleted": false, + "id": "VdZechBBkrOZ_441x_Cr4", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5763.352164263818, + "y": -136.01612179998824, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 2731877, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4437, + "versionNonce": 1515777669, + "isDeleted": false, + "id": "W3UGSeNjOjNhQvHhldFSL", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5934.7754046863, + "y": -183.69675820889074, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 873932139, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4637, + "versionNonce": 1188489291, + "isDeleted": false, + "id": "OBd58xqxFN65d0dtexpk1", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5988.13230733434, + "y": -125.79884256951641, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 409500357, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4529, + "versionNonce": 1688393189, + "isDeleted": false, + "id": "2BwfV9PQtMuRudSOPiRVi", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5859.848690329442, + "y": -205.266569917683, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1552236555, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4514, + "versionNonce": 1275700971, + "isDeleted": false, + "id": "aHt9_XQM55rCi5aVzRXwB", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5807.495713518243, + "y": -173.74546763229569, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 158784037, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7591, + "versionNonce": 267964741, + "isDeleted": false, + "id": "knCf-ZQD0ALgd2Z-cqphV", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5831.789943313884, + "y": -115.58026579975717, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 295110315, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7408, + "versionNonce": 632000907, + "isDeleted": false, + "id": "AIDIOXhlfP_7oo3S-8gbI", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5899.974674966939, + "y": -134.1862452509847, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 1010978181, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "rectangle", + "version": 5855, + "versionNonce": 163078309, + "isDeleted": false, + "id": "vFGv81WkxKtPQ5X38ZadY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5189.821570528773, + "y": -95.6046773766202, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 323.289754704958, + "height": 115.3522129463697, + "seed": 537416933, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "SUB74Pc_Jt6aHbUsXNbl0", + "type": "arrow" + }, + { + "id": "B4Y35dz_jcqbVyYWUHWzl", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5777, + "versionNonce": 2005861381, + "isDeleted": false, + "id": "VD36wqiRE-ThZwm-eFVkh", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5279.371314789765, + "y": -226.13481307908205, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 218.56208768785902, + "height": 210.97312630980835, + "seed": 50305003, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + }, + { + "id": "6jIP_lvnGFudlMlYzXDPE", + "type": "arrow" + }, + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6177, + "versionNonce": 1339484875, + "isDeleted": false, + "id": "1ZwXxjyr1uyZbcIqrBnT3", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5136.698840882411, + "y": -130.5138997156455, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 151.77922756101336, + "height": 147.22585073418284, + "seed": 1616277573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "qyS2BP83H-q9I6nU1KncI", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 6105, + "versionNonce": 1836727141, + "isDeleted": false, + "id": "wO8PyKOrN8hKcDTvbqAOI", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5218.65962376535, + "y": -189.7077984644411, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 104.19060205803729, + "height": 93.65945873034212, + "seed": 1253794443, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5888, + "versionNonce": 1793415531, + "isDeleted": false, + "id": "JwCDP4TqU6pqh2QXY9vsN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5425.079373248344, + "y": -101.67584647905369, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 129.01234342686138, + "height": 121.42338204881058, + "seed": 1527390117, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5187, + "versionNonce": 600278725, + "isDeleted": false, + "id": "zzH_FfUftotnQAMXSaMCr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5155.998170837505, + "y": -111.85890892838779, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 133.6765724777816, + "height": 130.09595000069802, + "seed": 1239734571, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4855, + "versionNonce": 57472011, + "isDeleted": false, + "id": "68MJ3v5kD6_DzvOEBWiWz", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5336.222835517365, + "y": -161.987623607557, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 161.12801146875478, + "height": 173.06341972569936, + "seed": 1448141573, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + }, + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5052, + "versionNonce": 1830053413, + "isDeleted": false, + "id": "stHr2fYbdhqfgKynO3zjw", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5392.319254324998, + "y": -101.11704149714478, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 153.96676651458776, + "height": 118.16054174375324, + "seed": 501644235, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "1dwqI7QoSbvZbReXTfO5n", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4945, + "versionNonce": 1817074053, + "isDeleted": false, + "id": "pmztsjTvb2BWm2UKNG3ZY", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5257.44914102152, + "y": -184.66489929575891, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 128.90240917500367, + "height": 130.0959500006982, + "seed": 1990736485, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4962, + "versionNonce": 159493451, + "isDeleted": false, + "id": "CddnCjgoRgdtBpZqH7699", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5202.266617666923, + "y": -151.52540154899452, + "strokeColor": "transparent", + "backgroundColor": "#ced4da", + "width": 177.83758302847713, + "height": 162.32155229444905, + "seed": 1390070379, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "arrow", + "version": 2155, + "versionNonce": 1249900811, + "isDeleted": false, + "id": "1dwqI7QoSbvZbReXTfO5n", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5561.095621174024, + "y": -65.96652494199247, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 179.0962977170202, + "height": 2.485330077484832, + "seed": 336504101, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781482, + "link": null, + "locked": false, + "startBinding": { + "elementId": "stHr2fYbdhqfgKynO3zjw", + "focus": -0.3834145353939106, + "gap": 19.34860912005938 + }, + "endBinding": { + "elementId": "VdZechBBkrOZ_441x_Cr4", + "focus": -0.07255204687762361, + "gap": 23.354374344341224 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 179.0962977170202, + -2.485330077484832 + ] + ] + }, + { + "type": "text", + "version": 7817, + "versionNonce": 1460915179, + "isDeleted": false, + "id": "32jlX2gHh3ER_kGBZf5aS", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 5196.863567453697, + "y": -83.3887370971446, + "strokeColor": "#31303d", + "backgroundColor": "transparent", + "width": 299, + "height": 36, + "seed": 1951083813, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Cloud Object Storage", + "baseline": 25, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Cloud Object Storage" + }, + { + "type": "arrow", + "version": 2488, + "versionNonce": 1104322475, + "isDeleted": false, + "id": "B4Y35dz_jcqbVyYWUHWzl", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5342.075955953225, + "y": 180.57591323724202, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 1.7522594107804252, + "height": 142.2152528531183, + "seed": 227296523, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551781482, + "link": null, + "locked": false, + "startBinding": { + "elementId": "KFgM-xHaTKSm1297aN4H0", + "focus": -0.11551418679492209, + "gap": 14.436652669988725 + }, + "endBinding": { + "elementId": "vFGv81WkxKtPQ5X38ZadY", + "focus": 0.041256740436980056, + "gap": 18.61312481437421 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 1.7522594107804252, + -142.2152528531183 + ] + ] + }, + { + "type": "text", + "version": 9029, + "versionNonce": 1982404235, + "isDeleted": false, + "id": "D7fz6J2ac4Owm7PnpkrSf", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5360.141669976354, + "y": 111.9664732674006, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 217, + "height": 75, + "seed": 1970629547, + "groupIds": [ + "3S7SevEcncXcvETkqB3ds" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 20, + "fontFamily": 1, + "text": "write directly or use\nThird-Party ETL/ELT\nor clickhouse-local", + "baseline": 68, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "write directly or use\nThird-Party ETL/ELT\nor clickhouse-local" + }, + { + "type": "line", + "version": 6947, + "versionNonce": 763472805, + "isDeleted": false, + "id": "y1BRz0qKn4DJ340_LsN6I", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5317.394985932922, + "y": 200.3753845145077, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 1470675077, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4770, + "versionNonce": 628886827, + "isDeleted": false, + "id": "AVBMRUJIRARqCHeLtnNYJ", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5317.010900803543, + "y": 221.67111062959907, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1589689931, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7746, + "versionNonce": 167177989, + "isDeleted": false, + "id": "KFgM-xHaTKSm1297aN4H0", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5316.210900480131, + "y": 194.98210250953002, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 2036948965, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + }, + { + "id": "B4Y35dz_jcqbVyYWUHWzl", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4839, + "versionNonce": 1638712933, + "isDeleted": false, + "id": "JZHSpLi6wEbEXBbjM_ePr", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5317.10970513778, + "y": 242.71268952111154, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 877182187, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551781458, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "text", + "version": 7830, + "versionNonce": 1899298411, + "isDeleted": false, + "id": "sesYiqxQJUxTK33hzHVHW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 40, + "angle": 0, + "x": 5230.178682355667, + "y": 283.06071990086707, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 254, + "height": 71, + "seed": 1440459589, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551781458, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Your current \ndatabase system ", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Your current \ndatabase system " + }, + { + "type": "rectangle", + "version": 5299, + "versionNonce": 2125111915, + "isDeleted": false, + "id": "aV3RfkC3wKVHUp5tEuK4y", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3914.6656124197557, + "y": -213.78282066465408, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 307.50162551476666, + "height": 109.71888985503384, + "seed": 1870277611, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5221, + "versionNonce": 278351301, + "isDeleted": false, + "id": "ESggzWW8hpId86StwqGIy", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3999.8421190177332, + "y": -337.9384065532381, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 207.88842288322263, + "height": 200.67007486644405, + "seed": 2105482309, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "lKCfnT3UEtLEOfa3RAEeC", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5619, + "versionNonce": 1637948683, + "isDeleted": false, + "id": "SuFibC9OVLAF-qoNFbdnT", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3864.137176302292, + "y": -246.9872215418277, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 144.36696033557143, + "height": 140.03595152550415, + "seed": 1925412491, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5552, + "versionNonce": 1515408677, + "isDeleted": false, + "id": "rPMbhTwIX5HmCsQGwDR4i", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3942.095334883497, + "y": -303.29033607270185, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 99.10236569497235, + "height": 89.0855196778425, + "seed": 641551269, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 5334, + "versionNonce": 556745643, + "isDeleted": false, + "id": "Fr-byLWoClrS2ys5fV0mN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4138.434400939896, + "y": -219.55749907807194, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.71191628523573, + "height": 115.49356826845703, + "seed": 1607101739, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4600, + "versionNonce": 1058562181, + "isDeleted": false, + "id": "xZe_s-joyqzf-mVky8ssf", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3882.4940071209944, + "y": -229.24326304157012, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 127.14836375707134, + "height": 123.7426040135782, + "seed": 708742917, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4300, + "versionNonce": 629118539, + "isDeleted": false, + "id": "mbRnZVRIVh6yjdsIToG0n", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4053.9172475434752, + "y": -276.9238994504726, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 153.25918845718437, + "height": 164.6117209354941, + "seed": 167350219, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "8l0PIWzB2WbCUSnksZIYy", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4500, + "versionNonce": 614729701, + "isDeleted": false, + "id": "75o7ItMDxgLNIXgFRKss9", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4107.274150191517, + "y": -219.02598381109647, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 146.44766897019824, + "height": 112.39007153526828, + "seed": 1476421221, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4392, + "versionNonce": 1835832555, + "isDeleted": false, + "id": "iZ2Y3qLn6kDnzoRUghExn", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3978.990533186611, + "y": -298.4937111592649, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 122.60735076574734, + "height": 123.74260401357837, + "seed": 1936416363, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "ellipse", + "version": 4374, + "versionNonce": 1560527685, + "isDeleted": false, + "id": "QZ0PTcljG3MhNtupabSrN", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3926.502895132538, + "y": -266.97260887387756, + "strokeColor": "transparent", + "backgroundColor": "#31303d", + "width": 169.15273392681794, + "height": 154.39444170501514, + "seed": 1380995525, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "zOVxC4o7_ZtF7vcg4x5Xq", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "image", + "version": 7454, + "versionNonce": 479531685, + "isDeleted": false, + "id": "ZGzwzOZ3SZXkwq9n4VqSm", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3950.931786171053, + "y": -208.80740704133723, + "strokeColor": "transparent", + "backgroundColor": "transparent", + "width": 43.683412004092766, + "height": 38.82581658923765, + "seed": 1995069707, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [ + { + "id": "cnPNcesK_y0kbtZpFeFIZ", + "type": "arrow" + }, + { + "id": "Og9qOL9oXZodHht5DIc4b", + "type": "arrow" + }, + { + "id": "T5mH0DyTz2rUpHq7St2Hq", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "status": "saved", + "fileId": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "scale": [ + 1, + 1 + ] + }, + { + "type": "text", + "version": 7270, + "versionNonce": 1895208491, + "isDeleted": false, + "id": "N_-kZOPZyIGUXg5-gQuTs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4019.4184854596683, + "y": -227.4133864925666, + "strokeColor": "#ffc029", + "backgroundColor": "transparent", + "width": 151, + "height": 71, + "seed": 105632037, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "ClickHouse \nCloud", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "ClickHouse \nCloud" + }, + { + "type": "line", + "version": 6303, + "versionNonce": 805664261, + "isDeleted": false, + "id": "bXXuSkoYNNOnn7HcPY7NH", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4047.254178949017, + "y": 354.44827728594237, + "strokeColor": "#000000", + "backgroundColor": "#ced4da", + "width": 58.29547497037776, + "height": 75.23956530082171, + "seed": 837877675, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.19222853912591387, + 56.86565565026561 + ], + [ + 0.008995844367387427, + 63.33956360913941 + ], + [ + 3.002345889965314, + 66.136859183983 + ], + [ + 13.426538065275391, + 68.50427700508838 + ], + [ + 31.046375675959993, + 69.24145554923822 + ], + [ + 47.88096534511206, + 68.06444201903525 + ], + [ + 56.82530678670703, + 65.24963544943097 + ], + [ + 58.086785115168524, + 62.87672398291019 + ], + [ + 58.263955179808185, + 57.66462789525514 + ], + [ + 58.12489728023635, + 4.770711108788363 + ], + [ + 57.81141613873247, + -0.22678945483607263 + ], + [ + 54.068258543762745, + -3.0199253944729088 + ], + [ + 46.18596747133091, + -4.637561933636917 + ], + [ + 28.2232911133324, + -5.998109751583486 + ], + [ + 13.821780335965565, + -5.186812024209034 + ], + [ + 2.495089915404978, + -2.434989123642279 + ], + [ + -0.03151979056958358, + -0.03416851246621335 + ], + [ + 0, + 0 + ] + ] + }, + { + "type": "line", + "version": 4095, + "versionNonce": 1438161099, + "isDeleted": false, + "id": "VH8Xejonbm_38fYTwDxqm", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4046.870093819638, + "y": 375.7440034010342, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1633707141, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "ellipse", + "version": 7101, + "versionNonce": 1918004581, + "isDeleted": false, + "id": "dLk_CBZv2f3yKNsSsqAR2", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4046.070093496226, + "y": 349.0549952809647, + "strokeColor": "#000000", + "backgroundColor": "#fff", + "width": 57.92155824688832, + "height": 11.714199393658093, + "seed": 782881355, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "type": "arrow", + "id": "bxuMGTzXLn7H-uBCptINx" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "line", + "version": 4195, + "versionNonce": 1684096875, + "isDeleted": false, + "id": "WqP7iPI7ioVNPWL5WG2Ks", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4046.9688981538748, + "y": 396.7855822925467, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 58.35594322026013, + "height": 6.474680775262577, + "seed": 1196133349, + "groupIds": [], + "strokeSharpness": "round", + "boundElements": [], + "updated": 1664551778847, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": null, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": null, + "points": [ + [ + 0, + 0 + ], + [ + 1.5374285361730287, + 2.5809159625347795 + ], + [ + 8.167722203747559, + 4.746280736825956 + ], + [ + 16.990366383406357, + 6.0576125509484715 + ], + [ + 30.812140369570116, + 6.177108315273491 + ], + [ + 46.941676304261016, + 5.342242522380577 + ], + [ + 56.36150756783912, + 2.3050196140919486 + ], + [ + 58.35594322026013, + -0.29757245998908605 + ] + ] + }, + { + "type": "arrow", + "version": 1207, + "versionNonce": 1799908933, + "isDeleted": false, + "id": "zOVxC4o7_ZtF7vcg4x5Xq", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4079.3577135319933, + "y": 43.97406724185157, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 2.203425141327898, + "height": 144.25589993564154, + "seed": 1209714501, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778930, + "link": null, + "locked": false, + "startBinding": { + "elementId": "UBUv4y9VmqvaUUjtShHGU", + "focus": 0.003982939178254775, + "gap": 18.36147820106453 + }, + "endBinding": { + "elementId": "QZ0PTcljG3MhNtupabSrN", + "focus": -0.7650101167593557, + "gap": 31.585170739477093 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -2.203425141327898, + -144.25589993564154 + ] + ] + }, + { + "type": "rectangle", + "version": 9426, + "versionNonce": 54206987, + "isDeleted": false, + "id": "UBUv4y9VmqvaUUjtShHGU", + "fillStyle": "solid", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 3977.893746935334, + "y": 62.3355454429161, + "strokeColor": "#15223c", + "backgroundColor": "#31303d", + "width": 204.09321695970974, + "height": 93.15707154311905, + "seed": 371955365, + "groupIds": [ + "qtKMV9h0lOMGFiAtutCDp", + "_TdSGw-5yrTILOnABrer3" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "_Fx0M6HC7YwaB-SPomer4", + "type": "arrow" + }, + { + "id": "ZsjkxeMfY7suqvLayroRm", + "type": "arrow" + }, + { + "id": "iuYv_lMtKD64ophwryuXG", + "type": "arrow" + }, + { + "id": "KK-tLtm7eSZaQRA0Z0wWk", + "type": "arrow" + }, + { + "id": "zOVxC4o7_ZtF7vcg4x5Xq", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false + }, + { + "type": "text", + "version": 7725, + "versionNonce": 1694223237, + "isDeleted": false, + "id": "q96ejHCXzB3TmAz1pvi2B", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4000.2958985848754, + "y": 72.58167909483882, + "strokeColor": "#ffffff", + "backgroundColor": "transparent", + "width": 174, + "height": 71, + "seed": 1694126635, + "groupIds": [ + "_TdSGw-5yrTILOnABrer3" + ], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "fontSize": 28, + "fontFamily": 1, + "text": "Third-Party \nETL/ELT", + "baseline": 61, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Third-Party \nETL/ELT" + }, + { + "type": "arrow", + "version": 1135, + "versionNonce": 510674059, + "isDeleted": false, + "id": "KK-tLtm7eSZaQRA0Z0wWk", + "fillStyle": "solid", + "strokeWidth": 4, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 4080.1237631640865, + "y": 327.4391234447171, + "strokeColor": "#495057", + "backgroundColor": "#31303d", + "width": 0.8930321127918432, + "height": 154.77472373480487, + "seed": 1009482245, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [], + "updated": 1664551778931, + "link": null, + "locked": false, + "startBinding": null, + "endBinding": { + "elementId": "UBUv4y9VmqvaUUjtShHGU", + "focus": -0.014115883975155083, + "gap": 17.171782723877072 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + 0.8930321127918432, + -154.77472373480487 + ] + ] + }, + { + "type": "text", + "version": 7303, + "versionNonce": 820122341, + "isDeleted": false, + "id": "AwGOiLT64Jrk_aQlWn83w", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "angle": 0, + "x": 3929.561885157685, + "y": 434.9120378208687, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 326, + "height": 91, + "seed": 1646045131, + "groupIds": [], + "strokeSharpness": "sharp", + "boundElements": [ + { + "id": "bY79_nx3hsOCGZr6hWPOs", + "type": "arrow" + }, + { + "id": "o-a13AjXcSuBj2pAGkCmU", + "type": "arrow" + }, + { + "id": "Oz-z3HIdXjxFTvbZu9lck", + "type": "arrow" + }, + { + "id": "3rItUtwE3JgCJKAgt7peW", + "type": "arrow" + } + ], + "updated": 1664551778847, + "link": null, + "locked": false, + "fontSize": 36, + "fontFamily": 1, + "text": "Your current \ndatabase system ", + "baseline": 78, + "textAlign": "center", + "verticalAlign": "top", + "containerId": null, + "originalText": "Your current \ndatabase system " + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": { + "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947": { + "mimeType": "image/svg+xml", + "id": "bfbc0263131b7f70f07896400491d8349bb00593a9d18fa66180000a7f5de05fd54541d7309b760a05fd3dcbce0fc947", + "dataURL": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjIyMiIgdmlld0JveD0iMCAwIDkgOCIgd2lkdGg9IjI1MDAiPjxwYXRoIGQ9Im0wIDdoMXYxaC0xeiIgZmlsbD0iI2YwMCIvPjxwYXRoIGQ9Im0wIDBoMXY3aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDBoMXY4aC0xem0yIDMuMjVoMXYxLjVoLTF6IiBmaWxsPSIjZmMwIi8+PC9zdmc+", + "created": 1648232988228 + } + } +} \ No newline at end of file diff --git a/docs/ja/integrations/migration/images/ch-local-01.png b/docs/ja/integrations/migration/images/ch-local-01.png new file mode 100644 index 00000000000..cec2d481dee Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-01.png differ diff --git a/docs/ja/integrations/migration/images/ch-local-02.png b/docs/ja/integrations/migration/images/ch-local-02.png new file mode 100644 index 00000000000..e95cae0916d Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-02.png differ diff --git a/docs/ja/integrations/migration/images/ch-local-03.png b/docs/ja/integrations/migration/images/ch-local-03.png new file mode 100644 index 00000000000..6525eccd67b Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-03.png differ diff --git a/docs/ja/integrations/migration/images/ch-local-04.png b/docs/ja/integrations/migration/images/ch-local-04.png new file mode 100644 index 00000000000..bab1739aee7 Binary files /dev/null and b/docs/ja/integrations/migration/images/ch-local-04.png differ diff --git a/docs/ja/integrations/migration/images/object-storage-01.png b/docs/ja/integrations/migration/images/object-storage-01.png new file mode 100644 index 00000000000..6f6108ac334 Binary files /dev/null and b/docs/ja/integrations/migration/images/object-storage-01.png differ diff --git a/docs/ja/integrations/migration/images/rockset_0.png b/docs/ja/integrations/migration/images/rockset_0.png new file mode 100644 index 00000000000..63f23d18fae Binary files /dev/null and b/docs/ja/integrations/migration/images/rockset_0.png differ diff --git a/docs/ja/integrations/migration/images/rockset_1.png b/docs/ja/integrations/migration/images/rockset_1.png new file mode 100644 index 00000000000..928cee91af7 Binary files /dev/null and b/docs/ja/integrations/migration/images/rockset_1.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-01.png b/docs/ja/integrations/migration/images/self-managed-01.png new file mode 100644 index 00000000000..8c3d1253fad Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-01.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-02.png b/docs/ja/integrations/migration/images/self-managed-02.png new file mode 100644 index 00000000000..473d131bc3a Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-02.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-03.png b/docs/ja/integrations/migration/images/self-managed-03.png new file mode 100644 index 00000000000..8dd838958c4 Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-03.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-04.png b/docs/ja/integrations/migration/images/self-managed-04.png new file mode 100644 index 00000000000..8e0e740a280 Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-04.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-05.png b/docs/ja/integrations/migration/images/self-managed-05.png new file mode 100644 index 00000000000..651bc5993da Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-05.png differ diff --git a/docs/ja/integrations/migration/images/self-managed-06.png b/docs/ja/integrations/migration/images/self-managed-06.png new file mode 100644 index 00000000000..b0c718157d1 Binary files /dev/null and b/docs/ja/integrations/migration/images/self-managed-06.png differ diff --git a/docs/ja/integrations/migration/images/third-party-01.png b/docs/ja/integrations/migration/images/third-party-01.png new file mode 100644 index 00000000000..420c980c9f8 Binary files /dev/null and b/docs/ja/integrations/migration/images/third-party-01.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv1.png b/docs/ja/integrations/migration/images/uploadcsv1.png new file mode 100644 index 00000000000..b73de7ed3ca Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv1.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv2.png b/docs/ja/integrations/migration/images/uploadcsv2.png new file mode 100644 index 00000000000..76bf0de8a87 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv2.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv3.png b/docs/ja/integrations/migration/images/uploadcsv3.png new file mode 100644 index 00000000000..b138c33b426 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv3.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv4.png b/docs/ja/integrations/migration/images/uploadcsv4.png new file mode 100644 index 00000000000..a8b8c811be9 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv4.png differ diff --git a/docs/ja/integrations/migration/images/uploadcsv5.png b/docs/ja/integrations/migration/images/uploadcsv5.png new file mode 100644 index 00000000000..b3eeea8fc64 Binary files /dev/null and b/docs/ja/integrations/migration/images/uploadcsv5.png differ diff --git a/docs/ja/integrations/migration/index.md b/docs/ja/integrations/migration/index.md new file mode 100644 index 00000000000..cd7bfff418f --- /dev/null +++ b/docs/ja/integrations/migration/index.md @@ -0,0 +1,30 @@ +--- +sidebar_label: 概要 +sidebar_position: 1 +keywords: [clickhouse, 移行, マイグレーション, データ] +--- + +# ClickHouse へのデータ移行 + +
    + +
    + +
    + +現在のデータの場所に応じて、ClickHouse Cloud にデータを移行するためのいくつかのオプションがあります。 + +- [セルフマネージドからクラウドへ](./clickhouse-to-cloud.md): `remoteSecure` 関数を使用してデータを転送 +- [他のDBMS](./clickhouse-local-etl.md): [clickhouse-local] ETL ツールと現在のDBMS用の適切なClickHouseテーブル関数を使用 +- [どこからでも!](./etl-tool-to-clickhouse.md): 様々なデータソースに接続できる人気のETL/ELTツールの一つを使用 +- [オブジェクトストレージ](./object-storage-to-clickhouse.md): S3からClickHouseにデータを簡単に挿入 + +例として、[Redshiftからの移行](/docs/ja/integrations/data-ingestion/redshift/index.md)において、ClickHouseへのデータ移行の3つの方法を紹介しています。 diff --git a/docs/ja/integrations/migration/object-storage-to-clickhouse.md b/docs/ja/integrations/migration/object-storage-to-clickhouse.md new file mode 100644 index 00000000000..5215502c3ba --- /dev/null +++ b/docs/ja/integrations/migration/object-storage-to-clickhouse.md @@ -0,0 +1,21 @@ +--- +title: オブジェクトストレージからClickHouse Cloudへ +description: オブジェクトストレージからClickHouse Cloudへのデータ移行 +keywords: [オブジェクトストレージ, s3, azure blob, gcs, マイグレーション] +--- + +# クラウドオブジェクトストレージからClickHouse Cloudにデータを移動する + +セルフマネージドのClickHouseのマイグレーション + +クラウドオブジェクトストレージをデータレイクとして使用し、このデータをClickHouse Cloudにインポートしたい場合や、現在のデータベースシステムがデータをクラウドオブジェクトストレージに直接オフロードできる場合、Cloud Object Storageに格納されたデータをClickHouse Cloudのテーブルに移行するために、以下のテーブル関数を使用できます: + +- [s3](/docs/ja/sql-reference/table-functions/s3.md) または [s3Cluster](/docs/ja/sql-reference/table-functions/s3Cluster.md) +- [gcs](/docs/ja/sql-reference/table-functions/gcs) +- [azureBlobStorage](/docs/ja/sql-reference/table-functions/azureBlobStorage) + +現在のデータベースシステムがクラウドオブジェクトストレージにデータを直接オフロードできない場合は、[サードパーティのETL/ELTツール](./etl-tool-to-clickhouse.md) や [clickhouse-local](./clickhouse-local-etl.md) を使用して、現在のデータベースシステムからクラウドオブジェクトストレージにデータを移動し、その後、第二段階でClickHouse Cloudのテーブルにデータを移行することができます。 + +これは、データをクラウドオブジェクトストレージにオフロードし、その後ClickHouseにロードするという2段階のプロセスですが、この方法の利点は、クラウドオブジェクトストレージからの高度に並列化された読み込みをサポートする[堅牢なClickHouse Cloud](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3) により、ペタバイト規模までスケールできることです。また、[Parquet](https://clickhouse.com/docs/ja/interfaces/formats/#data-format-parquet) のような高度な圧縮フォーマットを活用することもできます。 + +S3を使用してClickHouse Cloudにデータを取り込む方法を具体的なコード例で示した[ブログ記事](https://clickhouse.com/blog/getting-data-into-clickhouse-part-3-s3)があります。 diff --git a/docs/ja/integrations/migration/rockset.md b/docs/ja/integrations/migration/rockset.md new file mode 100644 index 00000000000..39229aeb9b6 --- /dev/null +++ b/docs/ja/integrations/migration/rockset.md @@ -0,0 +1,145 @@ +--- +title: Rocksetからの移行 +slug: /ja/migrations/rockset +description: RocksetからClickHouseへの移行 +keywords: [migrate, migration, migrating, data, etl, elt, rockset] +--- + +# Rocksetからの移行 + +Rocksetはリアルタイム分析データベースであり、[2024年6月にOpenAIに買収されました](https://rockset.com/blog/openai-acquires-rockset/)。 +ユーザーは2024年9月30日午後5時PDTまでに[サービスからオフボードする](https://docs.rockset.com/documentation/docs/faq)必要があります。 + +私たちは、ClickHouse CloudがRocksetユーザーにとって素晴らしい選択肢となると考えています。このガイドでは、RocksetからClickHouseに移行する際に考慮すべきポイントについて説明します。 + +では、始めましょう! + +## 即時のサポート + +即時のサポートが必要な場合は、[このフォーム](https://clickhouse.com/company/contact?loc=docs-rockest-migrations)にご記入いただき、人間の担当者が対応いたします! + + +## ClickHouseとRocksetの比較 - 概要 + +まず、ClickHouseの強みと、Rocksetとの比較で期待される利点について簡単に説明します。 + +ClickHouseは、スキーマファーストアプローチを通じてリアルタイムパフォーマンスとコスト効率に焦点を当てています。 +半構造化データもサポートしていますが、ユーザーはデータの構造をどのように設定するかを決定することで、性能とリソースの効率を最大化するという哲学を持っています。 +上記のスキーマファーストアプローチの結果として、ベンチマークでは、ClickHouseはRocksetを上回るスケーラビリティ、インジェスショントラフプット、クエリパフォーマンス、およびコスト効率を実現しています。 + +他のデータシステムとの統合に関しては、ClickHouseにはRocksetを超える[広範な機能](/ja/integrations)があります。 + +RocksetとClickHouseの両方は、クラウドベースの製品と関連するサポートサービスを提供しています。 +Rocksetとは異なり、ClickHouseにはオープンソース製品とコミュニティがあります。 +ClickHouseのソースコードは[github.com/clickhouse/clickhouse](https://github.com/clickhouse/clickhouse)で見つけることができ、執筆時点で1,500人を超える貢献者がいます。 +[ClickHouse Community Slack](https://clickhouse.com/slack)には、7,000人以上のメンバーが経験やベストプラクティスを共有し、問題に対する支援をしています。 + +この移行ガイドはRocksetからClickHouse Cloudへの移行に焦点を当てていますが、ユーザーはオープンソース機能に関する[その他のドキュメント](/)も参照できます。 + +## Rocksetのキーポイント + +まず、[Rocksetのキーポイント](https://docs.rockset.com/documentation/docs/key-concepts)を見て、ClickHouse Cloudでの同等の機能(存在する場合)を説明します。 + +### データソース + +RocksetとClickHouseの両方が様々なソースからデータのロードをサポートしています。 + +Rocksetでは、データソースを作成し、そのデータソースに基づいて_コレクション_を作成します。 +イベントストリーミングプラットフォーム、OLTPデータベース、クラウドバケットストレージに対する完全管理された統合があります。 + +ClickHouse Cloudでは、完全管理された統合の同等物は[ClickPipes](/ja/integrations/ClickPipes)です。 +ClickPipesはイベントストリーミングプラットフォームとクラウドバケットストレージから継続的にデータをロードすることをサポートしています。 +ClickPipesはデータを_テーブル_にロードします。 + +### インジェスト変換 + +Rocksetのインジェスト変換は、Rocksetに入ってくる生データをコレクションに保存する前に変換することができます。 +ClickHouse CloudでもClickPipesを通じて同様のことができ、ClickHouseの[Materialized View機能](/ja/guides/developer/cascading-materialized-views)を使用してデータを変換します。 + +### コレクション + +Rocksetでは、クエリをコレクションに対して実行します。ClickHouse Cloudでは、クエリをテーブルに対して実行します。 +どちらのサービスでも、クエリはSQLを使用して実行されます。 +ClickHouseは、データを操作および変換するためのSQL標準の関数に加えて、さらなる関数を追加しています。 + +### クエリ ラムダ + +Rocksetは、専用のRESTエンドポイントから実行できる名前付きのパラメータ化されたクエリであるクエリ ラムダをサポートしています。 +ClickHouse Cloudの[クエリAPIエンドポイント](/ja/get-started/query-endpoints)は同様の機能を提供しています。 + +### ビュー + +Rocksetでは、SQLクエリで定義された仮想的なコレクションであるビューを作成できます。 +ClickHouse Cloudはさまざまな[ビュー](/ja/sql-reference/statements/create/view)をサポートしています: + +* _通常のビュー_ はデータを保持しません。クエリ時に別のテーブルからの読み取りを行います。 +* _パラメータ化されたビュー_ は通常のビューと似ていますが、クエリ時に解決されるパラメータと共に作成できます。 +* _Materialized View_ は対応する`SELECT`クエリによって変換されたデータを格納します。関連するソースデータに新しいデータが追加されたときにトリガーとして機能します。 + +### エイリアス + +Rocksetのエイリアスは、複数の名前をコレクションに関連付けるために使用されます。 +ClickHouse Cloudでは、同等の機能はサポートされていません。 + +### ワークスペース + +Rocksetのワークスペースは、リソース(例:コレクション、クエリラムダ、ビュー、およびエイリアス)および他のワークスペースを保持するコンテナです。 + +ClickHouse Cloudでは、完全な分離を実現するために異なるサービスを利用できます。 +また、異なるテーブル/ビューへのRBACアクセスを簡素化するためにデータベースを作成することもできます。 + +## 設計上の考慮事項 + +このセクションでは、Rocksetのキーフィーチャーをいくつか確認し、ClickHouse Cloudを使用する際の対応方法を学びます。 + +### JSONサポート + +Rocksetは、Rockset固有の型をサポートする拡張版JSON形式をサポートしています。 + +ClickHouseでJSONを操作するための方法はいくつかあります: + +* JSON推論 +* クエリ時のJSON抽出 +* インサート時のJSON抽出 + +ユーザーケースに最適なアプローチを理解するには、[JSONに関するドキュメント](/docs/ja/integrations/data-formats/json)をご覧ください。 + +さらに、ClickHouseにはまもなく[半構造化カラムデータ型](https://github.com/ClickHouse/ClickHouse/issues/54864)が追加されます。 +この新しい型は、RocksetのJSON型が提供する柔軟性をユーザーに提供するはずです。 + +### フルテキスト検索 + +Rocksetは`SEARCH`関数でフルテキスト検索をサポートしています。 +ClickHouseは検索エンジンではありませんが、[文字列検索用のさまざまな関数](/ja/sql-reference/functions/string-search-functions)を持っています。 +ClickHouseはまた、多くのシナリオで役立つ[ブルームフィルター](/ja/optimize/skipping-indexes)をサポートしています。 + +### ベクトル検索 + +Rocksetには類似度インデックスがあり、ベクトル検索アプリケーションで使用される埋め込みをインデックスするために使用できます。 + +ClickHouseも線形スキャンを使用してベクトル検索を実行できます: +- [ClickHouseでのベクトル検索 - パート1](https://clickhouse.com/blog/vector-search-clickhouse-p1?loc=docs-rockest-migrations) +- [ClickHouseでのベクトル検索 - パート2](https://clickhouse.com/blog/vector-search-clickhouse-p2?loc=docs-rockest-migrations) + +ClickHouseには[ベクトル検索類似度インデックス](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/annindexes)もありますが、このアプローチは現在実験中であり、[新しいクエリアナライザー](https://clickhouse.com/docs/ja/guides/developer/understanding-query-execution-with-the-analyzer)とはまだ互換性がありません。 + +### OLTPデータベースからのデータのインジェスト + +Rocksetの管理された統合は、MongoDBやDynamoDBなどのOLTPデータベースからのデータのインジェストをサポートしています。 + +DynamoDBからデータをインジェストする場合は、[こちらのDynamoDB統合ガイド](/docs/ja/integrations/data-ingestion/dbms/dynamodb/index.md)を参照してください。 + +### コンピュート・コンピュート分離 + +コンピュート・コンピュート分離は、リアルタイム分析システムにおけるアーキテクチャデザインパターンで、突然のデータ流入やクエリに対応できるようにするものです。 +単一のコンポーネントがインジェストとクエリの両方を処理する場合、クエリの急増があるとインジェスト待機時間が増加し、データ流入が急増するとクエリ待機時間が増加します。 + +コンピュート・コンピュート分離は、この問題を回避するためにデータインジェストとクエリ処理のコードパスを分離します。この機能は2023年3月にRocksetで実装されました。 + +この機能は現在ClickHouse Cloudで実装中であり、プライベートプレビューに近づいています。サポートに連絡して有効化してください。 + +## 無料移行サービス + +Rocksetユーザーにとってストレスの多い時期であることを私たちは理解しています - 誰も短期間で本番データベースを移行したいとは思わないでしょう! + +ClickHouseがあなたに適しているかもしれない場合、移行をスムーズに行うために[無料移行サービス](https://clickhouse.com/comparison/rockset?loc=docs-rockest-migrations)を提供しています。 diff --git a/docs/ja/integrations/migration/upload-a-csv-file.md b/docs/ja/integrations/migration/upload-a-csv-file.md new file mode 100644 index 00000000000..98882ec3d91 --- /dev/null +++ b/docs/ja/integrations/migration/upload-a-csv-file.md @@ -0,0 +1,29 @@ +--- +title: "CSVファイルのアップロード" +--- + +# CSVファイルのアップロード + +ヘッダー行にカラム名を含むCSVまたはTSVファイルをアップロードすると、ClickHouseはカラムのデータ型を推測するために一連の行を事前処理し、その後新しいテーブルに行を挿入します。 + +1. **ClickHouse Cloud**サービスの**詳細**ページに移動します。 + + ![詳細ページ](./images/uploadcsv1.png) + +2. **アクション**ドロップダウンメニューから**データの読み込み**を選択します。 + + ![データの追加](./images/uploadcsv2.png) + +3. **データソース**ページで**ファイルアップロード**ボタンをクリックし、表示されるダイアログウィンドウでアップロードしたいファイルを選択します。**開く**をクリックして続行します(以下の例はmacOSですが、他のオペレーティングシステムでは異なる場合があります)。 + + ![アップロードするファイルを選択](./images/uploadcsv3.png) + +4. ClickHouseが推測したデータ型が表示されます。 + + ![推測されたデータ型](./images/uploadcsv4.png) + +5. ***新しいテーブル名を入力***して、データを挿入する準備ができたら、**ClickHouseにインポート**ボタンをクリックします。 + + ![アップロードするファイルを選択](./images/uploadcsv5.png) + +6. ClickHouseサービスに接続し、テーブルが正常に作成されたことを確認してください。データが準備完了です! データを可視化したい場合は、簡単にClickHouseに接続できるいくつかの[BIツール](../data-visualization.md)をチェックしてください。 diff --git a/docs/ja/integrations/no-code/_category_.yml b/docs/ja/integrations/no-code/_category_.yml new file mode 100644 index 00000000000..95665c8dc01 --- /dev/null +++ b/docs/ja/integrations/no-code/_category_.yml @@ -0,0 +1,8 @@ +position: 300 +label: 'No-Code platforms' +collapsible: true +collapsed: true +link: + type: generated-index + title: No-Code platforms + slug: /ja/integrations/no-code diff --git a/docs/ja/integrations/no-code/images/retool_01.png b/docs/ja/integrations/no-code/images/retool_01.png new file mode 100644 index 00000000000..89219697453 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_01.png differ diff --git a/docs/ja/integrations/no-code/images/retool_02.png b/docs/ja/integrations/no-code/images/retool_02.png new file mode 100644 index 00000000000..e6d02e41ba6 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_02.png differ diff --git a/docs/ja/integrations/no-code/images/retool_03.png b/docs/ja/integrations/no-code/images/retool_03.png new file mode 100644 index 00000000000..1ed2cfa91c8 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_03.png differ diff --git a/docs/ja/integrations/no-code/images/retool_04.png b/docs/ja/integrations/no-code/images/retool_04.png new file mode 100644 index 00000000000..959103a7b83 Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_04.png differ diff --git a/docs/ja/integrations/no-code/images/retool_05.png b/docs/ja/integrations/no-code/images/retool_05.png new file mode 100644 index 00000000000..3726cfd40fd Binary files /dev/null and b/docs/ja/integrations/no-code/images/retool_05.png differ diff --git a/docs/ja/integrations/no-code/retool.md b/docs/ja/integrations/no-code/retool.md new file mode 100644 index 00000000000..65b8de193d0 --- /dev/null +++ b/docs/ja/integrations/no-code/retool.md @@ -0,0 +1,41 @@ +--- +sidebar_label: Retool +slug: /ja/integrations/retool +keywords: [clickhouse, retool, connect, integrate, ui, admin, panel, dashboard, nocode, no-code] +description: 豊富なユーザーインターフェースを備えたウェブやモバイルアプリをすばやく構築し、複雑なタスクを自動化し、AIを統合する—すべてデータによって支えられています。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# RetoolをClickHouseに接続する + +## 1. 接続情報を収集する + + +## 2. ClickHouseリソースを作成する + +Retoolアカウントにログインし、_Resources_ タブに移動します。「Create New」 -> 「Resource」を選択してください: + +新しいリソースを作成 +
    + +利用可能なコネクタのリストから「JDBC」を選択します: + +JDBCコネクタを選択 +
    + +セットアップウィザードで、「Driver name」として `com.clickhouse.jdbc.ClickHouseDriver` を必ず選択してください: + +正しいドライバを選択 +
    + +ClickHouseの認証情報を次の形式で入力します: `jdbc:clickhouse://HOST:PORT/DATABASE?user=USERNAME&password=PASSWORD`。インスタンスがSSLを必要とする場合やClickHouse Cloudを使用している場合は、接続文字列に `&ssl=true` を追加してください。このようになります: `jdbc:clickhouse://HOST:PORT/DATABASE?user=USERNAME&password=PASSWORD&ssl=true` + +認証情報を指定 +
    + +その後、接続をテストしてください: + +接続をテスト +
    + +これで、あなたのアプリでClickHouseリソースを使用して進めることができます。 diff --git a/docs/ja/integrations/prometheus.md b/docs/ja/integrations/prometheus.md new file mode 100644 index 00000000000..793c29427f2 --- /dev/null +++ b/docs/ja/integrations/prometheus.md @@ -0,0 +1,263 @@ +--- +slug: /ja/integrations/prometheus +sidebar_label: Prometheus +title: Prometheus +description: ClickHouseのメトリクスをPrometheusにエクスポートします +keywords: [prometheus, grafana, 監視, メトリクス, エクスポーター] +--- + +# Prometheus統合 + +この機能は、[Prometheus](https://prometheus.io/)を統合してClickHouse Cloudサービスを監視することをサポートします。Prometheusメトリクスへのアクセスは、[ClickHouse Cloud API](/ja/cloud/manage/api/api-overview) エンドポイントを介して公開され、ユーザーが安全に接続し、メトリクスをPrometheusメトリクスコレクターにエクスポートすることを可能にします。これらのメトリクスは、GrafanaやDatadogなどのダッシュボードに統合して可視化することができます。 + +開始するには、[APIキーを生成](/ja/cloud/manage/openapi)してください。 + +## PrometheusエンドポイントAPIでClickHouse Cloudメトリクスを取得する + +### APIリファレンス + +|Method|Path| +|---|---| +|GET|https://api.clickhouse.cloud/v1/organizations/:organizationId/services/:serviceId/prometheus| + +**リクエストパラメータ** + +|Name|Type| +|---|---| +|Organization ID|uuid| +|Service ID|uuid| + +### 認証 + +基本認証にはClickHouse Cloud APIキーを使用します: + +```bash +Username: +Password: + +例: +export KEY_SECRET= +export KEY_ID= +export ORG_ID= +export SERVICE_ID= +curl --silent --user $KEY_ID:$KEY_SECRET https://api.clickhouse.cloud/v1/organizations/$ORG_ID/services/$SERVICE_ID/prometheus +``` + +### サンプルレスポンス + +``` +# HELP ClickHouse_ServiceInfo サービスに関する情報、クラスタステータスおよびClickHouseバージョンを含む +# TYPE ClickHouse_ServiceInfo untyped +ClickHouse_ServiceInfo{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",clickhouse_cluster_status="running",clickhouse_version="24.5",scrape="full"} 1 + +# HELP ClickHouseProfileEvents_Query 解釈されるクエリ数および潜在的に実行されるクエリ数。解析に失敗したクエリや、ASTサイズ制限、クォータ制限、または同時実行クエリ数の制限により拒否されたクエリは含まれません。ClickHouseによって内部的に開始されたクエリを含むことがあります。サブクエリはカウントしません。 +# TYPE ClickHouseProfileEvents_Query counter +ClickHouseProfileEvents_Query{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 6 + +# HELP ClickHouseProfileEvents_QueriesWithSubqueries すべてのサブクエリを含むクエリの数 +# TYPE ClickHouseProfileEvents_QueriesWithSubqueries counter +ClickHouseProfileEvents_QueriesWithSubqueries{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 230 + +# HELP ClickHouseProfileEvents_SelectQueriesWithSubqueries すべてのサブクエリを含むSELECTクエリの数 +# TYPE ClickHouseProfileEvents_SelectQueriesWithSubqueries counter +ClickHouseProfileEvents_SelectQueriesWithSubqueries{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 224 + +# HELP ClickHouseProfileEvents_FileOpen 開かれたファイルの数。 +# TYPE ClickHouseProfileEvents_FileOpen counter +ClickHouseProfileEvents_FileOpen{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 4157 + +# HELP ClickHouseProfileEvents_Seek 'lseek' 関数が呼び出された回数。 +# TYPE ClickHouseProfileEvents_Seek counter +ClickHouseProfileEvents_Seek{clickhouse_org="c2ba4799-a76e-456f-a71a-b021b1fafe60",clickhouse_service="12f4a114-9746-4a75-9ce5-161ec3a73c4c",clickhouse_service_name="test service",hostname="c-cream-ma-20-server-3vd2ehh-0",instance="c-cream-ma-20-server-3vd2ehh-0",table="system.events"} 1840 +``` + +### メトリクスラベル + +すべてのメトリクスには以下のラベルがあります: + +|Label|Description| +|---|---| +|clickhouse_org|組織ID| +|clickhouse_service|サービスID| +|clickhouse_service_name|サービス名| + +### 情報メトリクス + +ClickHouse Cloudは特別なメトリクス`ClickHouse_ServiceInfo`を提供しています。これは常に値`1`を持つ`gauge`です。このメトリクスにはすべての**メトリクスラベル**と以下のラベルが含まれます: + +|Label|Description| +|---|---| +|clickhouse_cluster_status|サービスのステータス。以下のいずれかになります:[`awaking` \| `running` \| `degraded` \| `idle` \| `stopped`]| +|clickhouse_version|サービスが実行しているClickHouseサーバーのバージョン| +|scrape|最後のスクレイプのステータスを示します。`full`または`partial`のいずれかになります| +|full|最後のメトリクススクレイプ中にエラーがなかったことを示します| +|partial|最後のメトリクススクレイプ中にいくつかのエラーがあり、`ClickHouse_ServiceInfo`メトリクスのみが返されたことを示します| + +メトリクスを取得するリクエストは、アイドル状態のサービスを再開させません。サービスが`idle`状態の場合、`ClickHouse_ServiceInfo`メトリクスのみが返されます。 + +### Prometheusの設定 + +Prometheusサーバーは、指定された間隔で設定されたターゲットからメトリクスを収集します。以下は、ClickHouse Cloud Prometheusエンドポイントを使用するためのPrometheusサーバーの設定例です: + +```yaml +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "clickhouse" + static_configs: + - targets: ["api.clickhouse.cloud"] + scheme: https + metrics_path: "/v1/organizations//services//prometheus" + basic_auth: + username: + password: + honor_labels: true +``` + +`honor_labels`の設定パラメーターは`true`に設定する必要があり、インスタンスラベルが適切に設定されます。 + +## Grafanaとの統合 + +ユーザーは、Grafanaと統合するための主な方法が2つあります: + +- **Metrics Endpoint** – この方法は、追加のコンポーネントやインフラを必要としない利点があります。この提供はGrafana Cloudに限定されており、ClickHouse Cloud PrometheusエンドポイントURLと認証情報のみが必要です。 +- **Grafana Alloy** - Grafana Alloyは、Grafana Agentに代わるOpenTelemetry (OTel) Collectorのベンダー中立なディストリビューションです。これはスクレーパーとして使用可能で、独自のインフラストラクチャにデプロイ可能で、どのPrometheusエンドポイントとも互換性があります。 + +これらのオプションを使用する方法についての指示を以下に示します。ClickHouse Cloud Prometheusエンドポイントに特化した詳細に焦点を当てています。 + +### Grafana CloudとMetrics Endpoint + +- Grafana Cloudアカウントにログイン +- **Metrics Endpoint**を選択して新しい接続を追加 +- Prometheusエンドポイントを指すようにScrape URLを設定し、基本認証を使用してAPIキー/シークレットで接続を設定 +- 接続ができることを確認するためにテスト + +Grafana Metrics Endpointを設定 + +
    + +設定後、ダッシュボードを設定するメトリクスを選択するためのドロップダウンが表示されるはずです: + +Grafana Metrics Explorerドロップダウン + +
    + +Grafana Metrics Explorerチャート + +### Grafana CloudとAlloy + +Grafana Cloudを使用している場合、AlloyをGrafanaのAlloyメニューに移動して画面の指示に従うことでインストールできます: + +Grafana Alloy + +
    + +これにより、認証トークンを用いてGrafana Cloudエンドポイントにデータを送信するための`prometheus.remote_write`コンポーネントを持つようにAlloyが設定されます。ユーザーはAlloyの設定(Linuxでは`/etc/alloy/config.alloy`にあります)を変更して、ClickHouse Cloud Prometheusエンドポイント用のスクレーパーを含める必要があります。 + +以下は、ClickHouse Cloudエンドポイントからメトリクスをスクレイプするための`prometheus.scrape`コンポーネントを含むAlloyの設定例です。また自動的に設定された`prometheus.remote_write`コンポーネントも含まれています。`basic_auth`設定コンポーネントには私たちのCloud APIキーIDおよびシークレットがそれぞれユーザー名とパスワードとして含まれていることに注意してください。 + +```yaml +prometheus.scrape "clickhouse_cloud" { + // 通常のリッスンアドレスからメトリクスを収集します。 + targets = [{ + __address__ = "https://api.clickhouse.cloud/v1/organizations/:organizationId/services/:serviceId/prometheus", +// 例: https://api.clickhouse.cloud/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus + }] + + honor_labels = true + + basic_auth { + username = "KEY_ID" + password = "KEY_SECRET" + } + + forward_to = [prometheus.remote_write.metrics_service.receiver] + // follows to metrics_service below +} + +prometheus.remote_write "metrics_service" { + endpoint { + url = "https://prometheus-prod-10-prod-us-central-0.grafana.net/api/prom/push" + basic_auth { + username = "" + password = "" + } + } +} +``` + +`honor_labels`の設定パラメーターは`true`に設定する必要があり、インスタンスラベルが適切に設定されます。 + +### セルフマネージドのGrafanaとAlloy + +セルフマネージドのGrafanaユーザーは、[こちら](https://grafana.com/docs/alloy/latest/get-started/install/)でAlloyエージェントをインストールするための手順を見つけることができます。ユーザーがPrometheusメトリクスを送りたい目的の場所にAlloyを設定していることを前提としています。以下の`prometheus.scrape`コンポーネントは、AlloyがClickHouse Cloudエンドポイントをスクレイプする原因となります。`prometheus.remote_write`がスクレイプされたメトリクスを受け取ると想定しています。この設定が存在しない場合は、フォワード先を希望のデスティネーションに調整してください。 + +```yaml +prometheus.scrape "clickhouse_cloud" { + // 通常のリッスンアドレスからメトリクスを収集します。 + targets = [{ + __address__ = "https://api.clickhouse.cloud/v1/organizations/:organizationId/services/:serviceId/prometheus", +// 例: https://api.clickhouse.cloud/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus + }] + + honor_labels = true + + basic_auth { + username = "KEY_ID" + password = "KEY_SECRET" + } + + forward_to = [prometheus.remote_write.metrics_service.receiver] + // preferred receiverに転送。修正してください。 +} +``` + +設定すると、メトリクスエクスプローラーにClickHouse関連のメトリクスが表示されるはずです: + +Grafana Metrics Explorer + +
    + +`honor_labels`の設定パラメーターは`true`に設定する必要があり、インスタンスラベルが適切に設定されます。 + +## Datadogとの統合 + +Datadog [Agent](https://docs.datadoghq.com/agent/?tab=Linux)および[OpenMetrics統合](https://docs.datadoghq.com/integrations/openmetrics/)を使用して、ClickHouse Cloudエンドポイントからメトリクスを収集することができます。以下は、このエージェントと統合のための簡単な設定例です。ただし、最も関心があるメトリクスのみを選択したいかもしれませんことに注意してください。以下のキャッチオールの例は、多くのメトリクスインスタンスの組み合わせをエクスポートし、Datadogはそれをカスタムメトリクスとして扱います。 + +```yaml +init_config: + +instances: + - openmetrics_endpoint: 'https://api.clickhouse.cloud/v1/organizations/97a33bdb-4db3-4067-b14f-ce40f621aae1/services/f7fefb6e-41a5-48fa-9f5f-deaaa442d5d8/prometheus' + namespace: 'clickhouse' + metrics: + - '^ClickHouse.*' + username: username + password: password +``` + +
    + +Prometheus Datadog Integration diff --git a/docs/ja/integrations/sql-clients/_category_.yml b/docs/ja/integrations/sql-clients/_category_.yml new file mode 100644 index 00000000000..e69789ad1c0 --- /dev/null +++ b/docs/ja/integrations/sql-clients/_category_.yml @@ -0,0 +1,8 @@ +position: 300 +label: 'SQL clients' +collapsible: true +collapsed: true +link: + type: generated-index + title: SQL clients + slug: /ja/integrations/sql-clients diff --git a/docs/ja/integrations/sql-clients/datagrip.md b/docs/ja/integrations/sql-clients/datagrip.md new file mode 100644 index 00000000000..19cc22fd876 --- /dev/null +++ b/docs/ja/integrations/sql-clients/datagrip.md @@ -0,0 +1,53 @@ +--- +sidebar_label: DataGrip +slug: /ja/integrations/datagrip +description: DataGrip は、ClickHouse を標準でサポートするデータベース IDE です。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# DataGrip を ClickHouse に接続する + +## DataGrip を開始またはダウンロード + +DataGrip は https://www.jetbrains.com/datagrip/ で入手できます。 + +## 1. 接続情報を集める + + +## 2. ClickHouse ドライバーをロードする + +1. DataGrip を起動し、**Data Sources and Drivers** ダイアログの **Data Sources** タブで **+** アイコンをクリックします。 + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-5.png) + + **ClickHouse** を選択します。 + + :::tip + 接続を確立するにつれて順序が変わるため、ClickHouse がリストの一番上にまだ表示されていない場合があります。 + ::: + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-6.png) + +- **Drivers** タブに切り替えて ClickHouse ドライバーをロードします。 + + DataGrip には、ダウンロードサイズを最小限に抑えるためにドライバーが付属していません。**Drivers** タブで **Complete Support** リストから **ClickHouse** を選択し、**+** 記号を展開します。**Provided Driver** オプションから **Latest stable** ドライバーを選択します。 + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-1.png) + +## 3. ClickHouse に接続する + +- データベースの接続情報を指定し、**Test Connection** をクリックします: + + 手順1で接続情報を集めました。ホストの URL、ポート、ユーザー名、パスワード、データベース名を入力し、接続をテストします。 + + :::tip + DataGrip ダイアログの **HOST** エントリーは実際には URL です。以下の画像を参照してください。 + + JDBC URL 設定の詳細については、[ClickHouse JDBC ドライバー](https://github.com/ClickHouse/clickhouse-java) リポジトリを参照してください。 + ::: + + ![](@site/docs/ja/integrations/sql-clients/images/datagrip-7.png) + +## 詳細情報 + +DataGrip の詳細については、DataGrip ドキュメントを参照してください。 diff --git a/docs/ja/integrations/sql-clients/dbeaver.md b/docs/ja/integrations/sql-clients/dbeaver.md new file mode 100644 index 00000000000..2d5966b6d00 --- /dev/null +++ b/docs/ja/integrations/sql-clients/dbeaver.md @@ -0,0 +1,70 @@ +--- +slug: /ja/integrations/dbeaver +sidebar_label: DBeaver +description: DBeaverはマルチプラットフォームデータベースツールです。 +--- + +# DBeaverをClickHouseに接続する + +DBeaverには複数の提供形態があります。このガイドでは、[DBeaver Community](https://dbeaver.io/)を使用します。さまざまな提供形態と機能については[こちら](https://dbeaver.com/edition/)をご覧ください。DBeaverはJDBCを使用してClickHouseに接続します。 + +:::note +ClickHouseの`Nullable`カラムのサポートを改善するため、DBeaverバージョン23.1.0以上を使用してください。 +::: + +## 1. ClickHouseの詳細を収集する + +DBeaverはJDBCをHTTP(S)経由で使用してClickHouseに接続します。以下の情報が必要です: + +- エンドポイント +- ポート番号 +- ユーザー名 +- パスワード + +## 2. DBeaverをダウンロードする + +DBeaverはhttps://dbeaver.io/download/ から入手できます。 + +## 3. データベースを追加する + +- **Database > New Database Connection** メニューまたは **Database Navigator** 内の **New Database Connection** アイコンを使用して、**Connect to a database** ダイアログを表示します: + +![Add a new database](./images/dbeaver-add-database.png) + +- **Analytical**を選択し、続けて**ClickHouse**を選択します: + +- JDBC URLを構築します。**Main**タブでホスト、ポート、ユーザー名、パスワード、データベースを設定します: + +![Set the hostname, port, user, password, and database name](./images/dbeaver-host-port.png) + +- デフォルトでは、**SSL > Use SSL**プロパティは未設定になっています。ClickHouse CloudやHTTPポートでSSLを要求するサーバーに接続する場合は、**SSL > Use SSL**をオンにします: + +![Enable SSL if required](./images/dbeaver-use-ssl.png) + +- 接続をテストします: + +![Test the connection](./images/dbeaver-test-connection.png) + +もしDBeaverがClickHouseドライバがインストールされていないと検出した場合、ダウンロードを案内します: + +![Download the ClickHouse driver](./images/dbeaver-download-driver.png) + +- ドライバをダウンロードした後、再度**Test**接続を行います: + +![Test the connection](./images/dbeaver-test-connection.png) + +## 4. ClickHouseにクエリを実行する + +クエリエディタを開いてクエリを実行します。 + +- 接続を右クリックして**SQL Editor > Open SQL Script**を選び、クエリエディタを開きます: + +![Open the SQL editor](./images/dbeaver-sql-editor.png) + +- `system.query_log`に対する例のクエリ: + + ![A sample query](./images/dbeaver-query-log-select.png) + +## 次のステップ + +DBeaverの機能について学ぶには[DBeaver wiki](https://github.com/dbeaver/dbeaver/wiki)を、ClickHouseの機能について学ぶには[ClickHouseのドキュメント](https://clickhouse.com/docs)をご覧ください。 diff --git a/docs/ja/integrations/sql-clients/dbvisualizer.md b/docs/ja/integrations/sql-clients/dbvisualizer.md new file mode 100644 index 00000000000..2890db8f59a --- /dev/null +++ b/docs/ja/integrations/sql-clients/dbvisualizer.md @@ -0,0 +1,49 @@ +--- +sidebar_label: DbVisualizer +slug: /ja/integrations/dbvisualizer +description: DbVisualizerはClickHouseに対する拡張サポートを備えたデータベースツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +# DbVisualizerをClickHouseに接続 + +## DbVisualizerの開始またはダウンロード + +DbVisualizerは https://www.dbvis.com/download/ で入手可能です。 + +## 1. 接続詳細を集める + + + +## 2. 組み込みJDBCドライバ管理 + +DbVisualizerには、ClickHouse用の最新のJDBCドライバが含まれています。最新のリリースや過去のバージョンへの完全なJDBCドライバ管理が組み込まれています。 + +![](@site/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png) + +## 3. ClickHouseに接続 + +DbVisualizerでデータベースに接続するには、まずデータベース接続を作成し設定する必要があります。 + +1. **Database->Create Database Connection**から新しい接続を作成し、ポップアップメニューからデータベースのドライバを選びます。 + +2. 新しい接続のための**Object View**タブが開かれます。 + +3. **Name**フィールドに接続の名前を入力し、オプションで**Notes**フィールドに接続の説明を入力します。 + +4. **Database Type**は**Auto Detect**のままにしておきます。 + +5. **Driver Type**内で選択したドライバに緑のチェックマークが付いている場合、それは使用可能です。緑のチェックマークが付いていない場合は、**Driver Manager**でドライバを構成する必要があるかもしれません。 + +6. 残りのフィールドにデータベースサーバーの情報を入力します。 + +7. **Ping Server**ボタンをクリックして、指定されたアドレスとポートにネットワーク接続を確立できることを確認します。 + +8. Ping Serverの結果がサーバーに到達できることを示している場合は、**Connect**をクリックしてデータベースサーバーに接続します。 + +:::tip +データベースへの接続に問題がある場合は、[Fixing Connection Issues](https://confluence.dbvis.com/display/UG231/Fixing+Connection+Issues)を参照してください。 + +## 詳細情報 + +DbVisualizerの詳細については、[DbVisualizer のドキュメント](https://confluence.dbvis.com/display/UG231/Users+Guide)を参照してください。 diff --git a/docs/ja/integrations/sql-clients/images/credentials-and-endpoint.png b/docs/ja/integrations/sql-clients/images/credentials-and-endpoint.png new file mode 100644 index 00000000000..6e34d348505 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/credentials-and-endpoint.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-1.png b/docs/ja/integrations/sql-clients/images/datagrip-1.png new file mode 100644 index 00000000000..db671163a5a Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-1.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-2.png b/docs/ja/integrations/sql-clients/images/datagrip-2.png new file mode 100644 index 00000000000..e46de6f229f Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-2.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-3.png b/docs/ja/integrations/sql-clients/images/datagrip-3.png new file mode 100644 index 00000000000..c99fa6ed34e Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-3.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-4.png b/docs/ja/integrations/sql-clients/images/datagrip-4.png new file mode 100644 index 00000000000..0ce6be5f35a Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-4.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-5.png b/docs/ja/integrations/sql-clients/images/datagrip-5.png new file mode 100644 index 00000000000..dd8edfb7afb Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-5.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-6.png b/docs/ja/integrations/sql-clients/images/datagrip-6.png new file mode 100644 index 00000000000..a51e34f6f0b Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-6.png differ diff --git a/docs/ja/integrations/sql-clients/images/datagrip-7.png b/docs/ja/integrations/sql-clients/images/datagrip-7.png new file mode 100644 index 00000000000..f30d7414d08 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/datagrip-7.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-add-database.png b/docs/ja/integrations/sql-clients/images/dbeaver-add-database.png new file mode 100644 index 00000000000..629bc272b76 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-add-database.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-connect-to-a-database.png b/docs/ja/integrations/sql-clients/images/dbeaver-connect-to-a-database.png new file mode 100644 index 00000000000..5268926e997 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-connect-to-a-database.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-connection-details-blank.png b/docs/ja/integrations/sql-clients/images/dbeaver-connection-details-blank.png new file mode 100644 index 00000000000..d3df12a39e9 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-connection-details-blank.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-download-driver.png b/docs/ja/integrations/sql-clients/images/dbeaver-download-driver.png new file mode 100644 index 00000000000..217e7c1dbcc Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-download-driver.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-endpoint-details-test.png b/docs/ja/integrations/sql-clients/images/dbeaver-endpoint-details-test.png new file mode 100644 index 00000000000..01f6e70286c Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-endpoint-details-test.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-host-port.png b/docs/ja/integrations/sql-clients/images/dbeaver-host-port.png new file mode 100644 index 00000000000..94d84f0ff94 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-host-port.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-query-log-select.png b/docs/ja/integrations/sql-clients/images/dbeaver-query-log-select.png new file mode 100644 index 00000000000..5143fcc1127 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-query-log-select.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-set-ssl-true.png b/docs/ja/integrations/sql-clients/images/dbeaver-set-ssl-true.png new file mode 100644 index 00000000000..97f850f0a82 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-set-ssl-true.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-sql-editor.png b/docs/ja/integrations/sql-clients/images/dbeaver-sql-editor.png new file mode 100644 index 00000000000..8963183f498 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-sql-editor.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-test-connection.png b/docs/ja/integrations/sql-clients/images/dbeaver-test-connection.png new file mode 100644 index 00000000000..208ea5cf26c Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-test-connection.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbeaver-use-ssl.png b/docs/ja/integrations/sql-clients/images/dbeaver-use-ssl.png new file mode 100644 index 00000000000..a3ab9a9b192 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbeaver-use-ssl.png differ diff --git a/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png b/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png new file mode 100644 index 00000000000..03c5df28acb Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/dbvisualizer-driver-manager.png differ diff --git a/docs/ja/integrations/sql-clients/images/jupysql-plot-1.png b/docs/ja/integrations/sql-clients/images/jupysql-plot-1.png new file mode 100644 index 00000000000..477b7c2834a Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/jupysql-plot-1.png differ diff --git a/docs/ja/integrations/sql-clients/images/jupysql-plot-2.png b/docs/ja/integrations/sql-clients/images/jupysql-plot-2.png new file mode 100644 index 00000000000..f850c67a4a5 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/jupysql-plot-2.png differ diff --git a/docs/ja/integrations/sql-clients/images/qstudio-add-connection.png b/docs/ja/integrations/sql-clients/images/qstudio-add-connection.png new file mode 100644 index 00000000000..71f01e97f35 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/qstudio-add-connection.png differ diff --git a/docs/ja/integrations/sql-clients/images/qstudio-running-query.png b/docs/ja/integrations/sql-clients/images/qstudio-running-query.png new file mode 100644 index 00000000000..ea35291a640 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/qstudio-running-query.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-0.png b/docs/ja/integrations/sql-clients/images/tablum-ch-0.png new file mode 100644 index 00000000000..e813098736f Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-0.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-1.png b/docs/ja/integrations/sql-clients/images/tablum-ch-1.png new file mode 100644 index 00000000000..bae9f90579b Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-1.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-2.png b/docs/ja/integrations/sql-clients/images/tablum-ch-2.png new file mode 100644 index 00000000000..e09ea11d3e5 Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-2.png differ diff --git a/docs/ja/integrations/sql-clients/images/tablum-ch-3.png b/docs/ja/integrations/sql-clients/images/tablum-ch-3.png new file mode 100644 index 00000000000..d165d77837e Binary files /dev/null and b/docs/ja/integrations/sql-clients/images/tablum-ch-3.png differ diff --git a/docs/ja/integrations/sql-clients/jupysql.md b/docs/ja/integrations/sql-clients/jupysql.md new file mode 100644 index 00000000000..38702438008 --- /dev/null +++ b/docs/ja/integrations/sql-clients/jupysql.md @@ -0,0 +1,430 @@ +--- +slug: /ja/integrations/jupysql +sidebar_label: Jupyter notebooks +description: JupysqlはJupyter向けのマルチプラットフォームデータベースツールです。 +--- + +# ClickHouseでJupySQLを使用する +このガイドでは、ClickHouseとの統合について説明します。 + +Jupysqlを使ってClickHouse上でクエリを実行します。データがロードされた後、SQLプロットでデータを可視化します。 + +JupysqlとClickHouseの統合は、clickhouse_sqlalchemyライブラリを使用することで可能になります。このライブラリは、両システム間のコミュニケーションを容易にし、ClickHouseに接続してSQL方言を渡すことを可能にします。接続されたら、ClickhouseのネイティブUIまたはJupyterノートブックから直接SQLクエリを実行できます。 + +```python +# 必要なパッケージをインストール +%pip install --quiet jupysql clickhouse_sqlalchemy +``` + + 注: 更新されたパッケージを使用するにはカーネルを再起動する必要があるかもしれません。 + + + +```python +import pandas as pd +from sklearn_evaluation import plot + +# jupysql Jupyter拡張機能をインポートしてSQLセルを作成 +%load_ext sql +%config SqlMagic.autocommit=False +``` + +**次の段階に進むには、Clickhouseが起動してアクセス可能であることを確認してください。ローカル版またはクラウド版のどちらでも利用できます。** + +**注:** 接続文字列は、接続しようとしているインスタンスタイプ(URL、ユーザー、パスワード)に応じて調整する必要があります。以下の例ではローカルインスタンスを使用しています。詳しくは、[こちらのガイド](https://clickhouse.com/docs/ja/getting-started/quick-start)をご覧ください。 + +```python +%sql clickhouse://default:@localhost:8123/default +``` + +```sql +%%sql +CREATE TABLE trips +( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 +) +ENGINE = MergeTree +PARTITION BY toYYYYMM(pickup_date) +ORDER BY pickup_datetime; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + +
    + + +
    + + + + +```sql +%%sql +INSERT INTO trips +SELECT * FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{1..2}.gz', + 'TabSeparatedWithNames', " + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 +") SETTINGS input_format_try_infer_datetimes = 0 +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + +
    + + + + +```python +%sql SELECT count() FROM trips limit 5; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + +
    count()
    1999657
    + + + + +```python +%sql SELECT DISTINCT(pickup_ntaname) FROM trips limit 5; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + + + + + + + + + + + + + +
    pickup_ntaname
    Morningside Heights
    Hudson Yards-Chelsea-Flatiron-Union Square
    Midtown-Midtown South
    SoHo-TriBeCa-Civic Center-Little Italy
    Murray Hill-Kips Bay
    + + + + +```python +%sql SELECT round(avg(tip_amount), 2) FROM trips +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + +
    round(avg(tip_amount), 2)
    1.68
    + + + + +```sql +%%sql +SELECT + passenger_count, + ceil(avg(total_amount),2) AS average_total_amount +FROM trips +GROUP BY passenger_count +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    passenger_countaverage_total_amount
    022.69
    115.97
    217.15
    316.76
    417.33
    516.35
    616.04
    759.8
    836.41
    99.81
    + + + + +```sql +%%sql +SELECT + pickup_date, + pickup_ntaname, + SUM(1) AS number_of_trips +FROM trips +GROUP BY pickup_date, pickup_ntaname +ORDER BY pickup_date ASC +limit 5; +``` + + * clickhouse://default:***@localhost:8123/default + Done. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    pickup_datepickup_ntanamenumber_of_trips
    2015-07-01Bushwick North2
    2015-07-01Brighton Beach1
    2015-07-01Briarwood-Jamaica Hills3
    2015-07-01Williamsburg1
    2015-07-01Queensbridge-Ravenswood-Long Island City9
    + + + + +```python +# %sql DESCRIBE trips; +``` + + +```python +# %sql SELECT DISTINCT(trip_distance) FROM trips limit 50; +``` + + +```sql +%%sql --save short-trips --no-execute +SELECT * +FROM trips +WHERE trip_distance < 6.3 +``` + + * clickhouse://default:***@localhost:8123/default + Skipping execution... + + + +```python +%sqlplot histogram --table short-trips --column trip_distance --bins 10 --with short-trips +``` + + + + + + + + + + +![histogram example](images/jupysql-plot-1.png) + + + + +```python +ax = %sqlplot histogram --table short-trips --column trip_distance --bins 50 --with short-trips +ax.grid() +ax.set_title("Trip distance from trips < 6.3") +_ = ax.set_xlabel("Trip distance") +``` + + + +![histogram second example](images/jupysql-plot-1.png) diff --git a/docs/ja/integrations/sql-clients/qstudio.md b/docs/ja/integrations/sql-clients/qstudio.md new file mode 100644 index 00000000000..e67232e24e1 --- /dev/null +++ b/docs/ja/integrations/sql-clients/qstudio.md @@ -0,0 +1,58 @@ +--- +slug: /ja/integrations/qstudio +sidebar_label: qStudio +description: qStudioは無料のSQLツールです。 +--- +import ConnectionDetails from '@site/docs/ja/_snippets/_gather_your_details_http.mdx'; + +qStudioは無料のSQL GUIで、SQLスクリプトの実行、テーブルの簡単なブラウジング、結果のグラフ化やエクスポートが可能です。すべてのオペレーティングシステムで、すべてのデータベースで動作します。 + +# qStudioをClickHouseに接続する + +qStudioはJDBCを使用してClickHouseに接続します。 + +## 1. ClickHouseの詳細情報を収集する + +qStudioはJDBC over HTTP(S)を使ってClickHouseに接続します。必要な情報は次の通りです: + +- エンドポイント +- ポート番号 +- ユーザー名 +- パスワード + + + +## 2. qStudioをダウンロードする + +qStudioはhttps://www.timestored.com/qstudio/download/ で入手可能です。 + +## 3. データベースを追加する + +- qStudioを初めて開くとき、メニューオプションの**Server->Add Server**やツールバーのサーバー追加ボタンをクリックしてください。 +- 次に詳細を設定します: + +![新しいデータベースを設定する](./images/qstudio-add-connection.png) + +1. サーバータイプ: Clickhouse.com +2. ホストには**https://**を必ず含めてください。 + ホスト: https://abc.def.clickhouse.cloud + ポート: 8443 +3. ユーザー名: default + パスワード: XXXXXXXXXXX +4. 「追加」をクリック + +qStudioがClickHouse JDBCドライバーがインストールされていないと判断した場合は、ダウンロードを促します: + +## 4. ClickHouseにクエリを実行する + +- クエリエディタを開いてクエリを実行します。クエリは次の方法で実行できます: +- Ctrl + e - ハイライトされたテキストを実行 +- Ctrl + Enter - 現在の行を実行 + +- クエリの例: + + ![サンプルクエリ](./images/qstudio-running-query.png) + +## 次のステップ + +QStudioの機能については[QStudio](https://www.timestored.com/qstudio)を参照し、ClickHouseの機能については[ClickHouseのドキュメント](https://clickhouse.com/docs)を参照してください。 diff --git a/docs/ja/integrations/sql-clients/sql-console.md b/docs/ja/integrations/sql-clients/sql-console.md new file mode 100644 index 00000000000..4a3ac421631 --- /dev/null +++ b/docs/ja/integrations/sql-clients/sql-console.md @@ -0,0 +1,365 @@ +--- +sidebar_label: SQLコンソール +sidebar_position: 1 +--- + +# SQLコンソール + +SQLコンソールは、ClickHouse Cloudでデータベースを探索しクエリを実行する最速かつ最も簡単な方法です。SQLコンソールでは以下のことができます: +- ClickHouse Cloudサービスへの接続 +- テーブルデータの表示、フィルタリング、並び替え +- クエリの実行と結果データの数クリックでの視覚化 +- クエリをチームメンバーと共有し、より効果的にコラボレーション + +## コントロールプレーンからSQLコンソールを開く + +SQLコンソールは、サービスの概要画面から直接開くことができます。「接続」ボタンをクリックし、「SQLコンソールを開く」を選択してください。 + + ![サービスからSQLコンソールを開く](@site/docs/ja/cloud/images/sqlconsole/open-sql-console-from-service.png) + +SQLコンソールは新しいタブで開き、サービスの認証情報を入力するよう促されます: + + ![認証情報を入力](@site/docs/ja/cloud/images/sqlconsole/enter-credentials.png) + +認証情報を入力した後、「接続」をクリックすると、SQLコンソールは接続と認証を試みます。成功すると、SQLコンソールのインターフェースが表示されます: + + ![認証成功](@site/docs/ja/cloud/images/sqlconsole/authentication-success.png) + +### SQLコンソールを直接読み込む + +SQLコンソールは、https://console.clickhouse.cloud にアクセスして直接読み込むことも可能です。ClickHouse Cloudアカウントにログインした後、サービスの一覧が表示されます。1つ選択し、サービス認証画面で認証情報を入力してください: + + ![サービスを選択](@site/docs/ja/cloud/images/sqlconsole/select-a-service.png) + +:::note +組織にサービスが1つしか存在しない場合、SQLコンソールは直ちにサービス認証画面に移動します。 +::: + +### サービススイッチャーを使用する + +SQLコンソールから直接サービスを簡単に切り替えることができます。コンソールの右上隅にあるサービススイッチャーを開き、別のサービスを選択してください: + + ![サービスを切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-services.png) + +## テーブルの探索 + +### テーブルリストとスキーマ情報の表示 +ClickHouseインスタンス内のテーブルの概要は、左のサイドバーエリアに表示されます。左上のデータベースセレクターを使用して、特定のデータベース内のテーブルを表示します + + ![テーブルリストとスキーマ](@site/docs/ja/cloud/images/sqlconsole/table-list-and-schema.png) + +リスト内のテーブルは展開して、カラムとタイプを確認することもできます + + ![カラムの表示](@site/docs/ja/cloud/images/sqlconsole/view-columns.png) + +### テーブルデータの探索 + +リスト内のテーブルをクリックすると、新しいタブで開きます。テーブルビューでは、データを簡単に表示、選択、コピーできます。Microsoft ExcelやGoogle Sheetsのようなスプレッドシートアプリケーションにコピー&ペーストする際も、構造とフォーマットは維持されます。テーブルデータのページをフリップする(30行単位でページネーションされています)際は、フッタのナビゲーションを使用してください。 + + ![abc](@site/docs/ja/cloud/images/sqlconsole/abc.png) + +### セルデータの検査 +セルインスペクターツールを使用して、1つのセルに含まれる大量のデータを表示できます。セルを右クリックして「セルを検査」を選択することで開けます。セルインスペクタの内容は、上部右隅のコピーアイコンをクリックすることでコピーできます。 + + ![セルコンテンツの検査](@site/docs/ja/cloud/images/sqlconsole/inspecting-cell-content.png) + +## テーブルのフィルタリングとソート + +### テーブルのソート +SQLコンソールでテーブルをソートするには、テーブルを開き、ツールバーで「ソート」ボタンを選択します。このボタンをクリックすると、ソートを構成するメニューが開きます。ソートするカラムを選択し、ソート順(昇順または降順)を構成できます。「適用」を選択するかEnterキーを押してテーブルをソートします + + ![カラムで降順にソート](@site/docs/ja/cloud/images/sqlconsole/sort-descending-on-column.png) + +SQLコンソールでは、テーブルに複数のソートを追加することもできます。再度「ソート」ボタンをクリックして別のソートを追加します。注意:ソートは、ソートペインに表示される順(上から下)に適用されます。ソートを削除するには、ソートの横にある「x」ボタンをクリックします。 + +### テーブルのフィルタリング + +SQLコンソールでテーブルをフィルタリングするには、テーブルを開き「フィルタ」ボタンを選択します。このボタンをクリックすると、フィルタを構成するメニューが開きます。フィルタリングするカラムと必要な条件を選択します。SQLコンソールはカラムに含まれるデータのタイプに応じたフィルタオプションをインテリジェントに表示します。 + + ![ラジオカラムがGSMと等しいフィルタ](@site/docs/ja/cloud/images/sqlconsole/filter-on-radio-column-equal-gsm.png) + +フィルタに満足したら、「適用」を選択してデータをフィルタリングします。以下のように追加のフィルタを追加することもできます。 + + ![2000より大きい範囲でフィルタを追加する](@site/docs/ja/cloud/images/sqlconsole/add-more-filters.png) + +ソート機能と同様に、フィルタの横にある「x」ボタンをクリックして削除します。 + +### 一緒にフィルタリングとソート + +SQLコンソールでは、同時にテーブルのフィルタリングとソートが可能です。上記の手順を使用してすべてのフィルタとソートを追加し、「適用」ボタンをクリックしてください。 + + ![一緒にフィルタリングとソート](@site/docs/ja/cloud/images/sqlconsole/filtering-and-sorting-together.png) + +### フィルタとソートからクエリを作成 + +SQLコンソールは、一度のクリックでソートとフィルタをクエリに直接変換できます。ツールバーからお好みのソートとフィルタパラメータを使用して「クエリを作成」ボタンを選択するだけです。「クエリを作成」をクリックした後、テーブルビューに含まれるデータに対応するSQLコマンドが事前に入力された新しいクエリタブが開きます。 + + ![ソートとフィルタからクエリを作成する](@site/docs/ja/cloud/images/sqlconsole/create-a-query-from-sorts-and-filters.png) + +:::note +「クエリを作成」機能の使用時にフィルタとソートは必須ではありません。 +::: + +SQLコンソールでのクエリに関する詳細は、(リンク)クエリドキュメントをご覧ください。 + +## クエリの作成と実行 + +### クエリの作成 +SQLコンソールで新しいクエリを作成する方法は2つあります。 +* タブバーの「+」ボタンをクリック +* 左サイドバーのクエリリストから「新しいクエリ」ボタンを選択 + + ![クエリの作成](@site/docs/ja/cloud/images/sqlconsole/creating-a-query.png) + +### クエリの実行 +クエリを実行するには、SQLエディタにSQLコマンドを入力し、「実行」ボタンをクリックするか、ショートカット `cmd / ctrl + enter` を使用してください。複数のコマンドを順次記述して実行するには、各コマンドの後にセミコロンを追加してください。 + +クエリ実行オプション +デフォルトでは、「実行」ボタンをクリックするとSQLエディタに含まれるすべてのコマンドが実行されます。SQLコンソールは他の2つのクエリ実行オプションをサポートしています: +* 選択したコマンドを実行 +* カーソルのある位置のコマンドを実行 + +選択したコマンドを実行するには、目的のコマンドまたはシーケンスを選択し、「実行」ボタンをクリックする(または `cmd / ctrl + enter` ショートカットを使用)。選択がある場合、SQLエディタのコンテキストメニュー(エディタ内の任意の場所を右クリックして開く)から「選択したものを実行」を選択することもできます。 + + ![選択したクエリを実行](@site/docs/ja/cloud/images/sqlconsole/run-selected-query.png) + +カーソルの現在位置にあるコマンドを実行するには、2つの方法があります: +* 拡張実行オプションメニューから「カーソル位置で実行」を選択する(または対応する `cmd / ctrl + shift + enter` キーボードショートカットを使用) + + ![カーソル位置で実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor-2.png) + + * SQLエディタのコンテキストメニューから「カーソル位置で実行」を選択 + + ![カーソル位置で実行](@site/docs/ja/cloud/images/sqlconsole/run-at-cursor.png) + +:::note +カーソル位置にあるコマンドは、実行時に黄色で点滅します。 +::: + +### クエリのキャンセル + +クエリが実行中の場合、クエリエディタのツールバーの「実行」ボタンは「キャンセル」ボタンに置き換えられます。このボタンをクリックするか `Esc` を押してクエリをキャンセルするだけです。注意:キャンセル後も既に返されている結果は持続します。 + + ![クエリをキャンセル](@site/docs/ja/cloud/images/sqlconsole/cancel-a-query.png) + +### クエリの保存 + +クエリに名前が付けられていない場合、クエリは「無題クエリ」と呼ばれるべきです。クエリ名をクリックして変更してください。クエリの名前を変更すると、クエリが保存されます。 + + ![クエリに名前を付ける](@site/docs/ja/cloud/images/sqlconsole/give-a-query-a-name.png) + +また、保存ボタンまたは `cmd / ctrl + s` キーボードショートカットを使用してクエリを保存することもできます。 + + ![クエリを保存する](@site/docs/ja/cloud/images/sqlconsole/save-the-query.png) + +## GenAIを使用したクエリの管理 + +この機能を使用すると、ユーザーはクエリを自然言語の質問形式で作成し、そのコンテキストに基づいてSQLクエリを生成できます。GenAIはクエリのデバッグも支援します。 + +GenAIに関する詳細は、[ClickHouse CloudのGenAI対応クエリ提案の発表ブログ記事](https://clickhouse.com/blog/announcing-genai-powered-query-suggestions-clickhouse-cloud)をご覧ください。 + +### テーブルセットアップ + +UK Price Paidの例のデータセットをインポートし、それを使用してGenAIクエリを作成しましょう。 + +1. ClickHouse Cloudサービスを開く。 +2. *+* アイコンをクリックして新しいクエリを作成。 +3. 次のコードを貼り付けて実行: + + ```sql + CREATE TABLE uk_price_paid + ( + price UInt32, + date Date, + postcode1 LowCardinality(String), + postcode2 LowCardinality(String), + type Enum8('terraced' = 1, 'semi-detached' = 2, 'detached' = 3, 'flat' = 4, 'other' = 0), + is_new UInt8, + duration Enum8('freehold' = 1, 'leasehold' = 2, 'unknown' = 0), + addr1 String, + addr2 String, + street LowCardinality(String), + locality LowCardinality(String), + town LowCardinality(String), + district LowCardinality(String), + county LowCardinality(String) + ) + ENGINE = MergeTree + ORDER BY (postcode1, postcode2, addr1, addr2); + ``` + + このクエリは約1秒で完了するはずです。完了したら、`uk_price_paid`という空のテーブルができているはずです。 + +4. 新しいクエリを作成して、次のクエリを貼り付けてください: + + ```sql + INSERT INTO uk_price_paid + WITH + splitByChar(' ', postcode) AS p + SELECT + toUInt32(price_string) AS price, + parseDateTimeBestEffortUS(time) AS date, + p[1] AS postcode1, + p[2] AS postcode2, + transform(a, ['T', 'S', 'D', 'F', 'O'], ['terraced', 'semi-detached', 'detached', 'flat', 'other']) AS type, + b = 'Y' AS is_new, + transform(c, ['F', 'L', 'U'], ['freehold', 'leasehold', 'unknown']) AS duration, + addr1, + addr2, + street, + locality, + town, + district, + county + FROM url( + 'http://prod.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv', + 'CSV', + 'uuid_string String, + price_string String, + time String, + postcode String, + a String, + b String, + c String, + addr1 String, + addr2 String, + street String, + locality String, + town String, + district String, + county String, + d String, + e String' + ) SETTINGS max_http_get_redirects=10; + ``` + +このクエリは、`gov.uk` ウェブサイトからデータセットを取得します。このファイルは約4GBの大きさがあるため、クエリの完了には数分かかります。クエリが処理されると、`uk_price_paid`テーブル内にデータセット全体が含まれているはずです。 + +#### クエリ作成 + +自然言語を使用してクエリを生成しましょう。 + +1. **uk_price_paid** テーブルを選択し、**クエリを作成** をクリックします。 +2. **SQLを生成** をクリックします。Chat-GPTにクエリを送信することに同意を求められる場合があります。この場合は **同意する** と選択してください。 +3. このプロンプトを使用して自然言語のクエリを入力し、ChatGPTにSQLクエリに変換させることができます。今回の例では次のように入力します: + + > Show me the total price and total number of all uk_price_paid transactions by year. + +4. コンソールは求めているクエリを生成し、新しいタブに表示します。今回の例では、GenAIが以下のクエリを作成しました: + + ```sql + -- Show me the total price and total number of all uk_price_paid transactions by year. + SELECT year(date), sum(price) as total_price, Count(*) as total_transactions + FROM uk_price_paid + GROUP BY year(date) + ``` + +5. 作成されたクエリが正しいことを確認したら、**実行** をクリックして実行します。 + +GenAIはエクスペリメンタルな機能であることに注意してください。GenAIによって生成されたクエリを任何のデータセットで実行する際は注意してください。 + +### デバッグ + +次に、GenAIのクエリデバッグ機能をテストしましょう。 + +1. *+* アイコンをクリックして新しいクエリを作成し、次のコードを貼り付けます: + + ```sql + -- Show me the total price and total number of all uk_price_paid transactions by year. + SELECT year(date), sum(pricee) as total_price, Count(*) as total_transactions + FROM uk_price_paid + GROUP BY year(date) + ``` + +2. **実行** をクリックします。このクエリは`pricee`を参照しようとしているため失敗します。 +3. **クエリを修正** をクリックします。 +4. GenAIはクエリを修正しようとします。この場合、`pricee`を`price`に変更しました。また、このシナリオでは`toYear`がより適していると認識しました。 +5. **適用** を選択して、提案された変更をクエリに反映し、**実行** をクリックします。 + +GenAIはエクスペリメンタルな機能であることに注意してください。GenAIによって生成されたクエリを任何のデータセットで実行する際は注意してください。 + +## 高度なクエリ機能 + +### クエリ結果の検索 + +クエリを実行した後、結果ペインの検索入力を使用して、返された結果セットを迅速に検索することができます。この機能は、追加の`WHERE`句の結果をプレビューしたり、特定のデータが結果セットに含まれていることを確認したりするのに便利です。検索入力に値を入力すると、結果ペインが更新され、その値と一致するエントリを含むレコードが返されます。この例では、ClickHouseリポジトリの`github_events`テーブル内の`alexey-milovidov`の全インスタンスを探してみましょう: + + ![GitHubデータを検索](@site/docs/ja/cloud/images/sqlconsole/search-github.png) + +注:入力された値と一致するフィールドが返されます。たとえば、上記のスクリーンショットの3つ目のレコードは`actor_login`フィールドで`alexey-milovidov`と一致していませんが、`body`フィールドで一致しています: + + ![本文で一致](@site/docs/ja/cloud/images/sqlconsole/match-in-body.png) + +### ページネーション設定の調整 + +デフォルトでは、クエリ結果ペインはすべての結果レコードを1つのページに表示します。より大きな結果セットでは、結果をページネーションして表示する方が見やすい場合があります。これは、結果ペインの右下隅にあるページネーションセレクターを使用して実現できます: + ![ページネーションオプション](@site/docs/ja/cloud/images/sqlconsole/pagination.png) + +ページサイズを選択すると、すぐに結果セットにページネーションが適用され、結果ペインフッタの中央にナビゲーションオプションが表示されます + + ![ページネーションナビゲーション](@site/docs/ja/cloud/images/sqlconsole/pagination-nav.png) + +### クエリ結果データのエクスポート + +クエリ結果セットは、SQLコンソールから直接CSV形式で簡単にエクスポートできます。右側の結果ペインツールバーの`•••`メニューを開き、「CSVとしてダウンロード」を選択してください。 + + ![CSVとしてダウンロード](@site/docs/ja/cloud/images/sqlconsole/download-as-csv.png) + +## クエリデータの視覚化 + +データの一部はチャート形式でより簡単に解釈できます。クエリ結果データからSQLコンソールで数クリックで視覚化を迅速に作成できます。例として、NYCタクシートリップの週次統計を計算するクエリを使用します: + +```sql +select + toStartOfWeek(pickup_datetime) as week, + sum(total_amount) as fare_total, + sum(trip_distance) as distance_total, + count(*) as trip_total +from + nyc_taxi +group by + 1 +order by + 1 asc +``` + + ![表形式のクエリ結果](@site/docs/ja/cloud/images/sqlconsole/tabular-query-results.png) + +視覚化がないと、これらの結果は解釈が困難です。これをチャートに変換しましょう。 + +### チャートの作成 + +視覚化の作成を開始するには、クエリ結果ペインツールバーから「チャート」オプションを選択します。チャート構成ペインが表示されます: + + ![クエリからチャートへ切り替える](@site/docs/ja/cloud/images/sqlconsole/switch-from-query-to-chart.png) + +`week`ごとの`trip_total`を追跡する単純な棒グラフを作成してみましょう。これを実現するには、`week`フィールドをx軸に、`trip_total`フィールドをy軸にドラッグします: + + ![週ごとのトリップ合計](@site/docs/ja/cloud/images/sqlconsole/trip-total-by-week.png) + +ほとんどのチャートタイプは、数値軸に複数のフィールドを持つことをサポートしています。例として、`fare_total`フィールドをy軸にドラッグしてみましょう: + + ![棒グラフ](@site/docs/ja/cloud/images/sqlconsole/bar-chart.png) + +### チャートのカスタマイズ + +SQLコンソールは10種類のチャートタイプをサポートしており、チャート構成ペインにあるチャートタイプセレクターから選択できます。たとえば、前述のチャートタイプを棒チャートからエリアチャートに簡単に変更できます: + + ![棒グラフからエリアに変更](@site/docs/ja/cloud/images/sqlconsole/change-from-bar-to-area.png) + +チャートタイトルは、データを供給しているクエリの名前に一致します。クエリ名を更新すると、チャートタイトルも更新されます: + + ![クエリ名を更新](@site/docs/ja/cloud/images/sqlconsole/update-query-name.png) + +「詳細」セクションのチャート構成ペインで、より高度なチャート特性を調整することもできます。以下の設定を調整してみましょう: +- サブタイトル +- 軸タイトル +- x軸のラベルの向き + +チャートはそれに応じて更新されます: + + ![サブタイトルなどを更新](@site/docs/ja/cloud/images/sqlconsole/update-subtitle-etc.png) + +一部のシナリオでは、各フィールドの軸スケールを個別に調整する必要がある場合があります。これもチャート構成ペインの「詳細」セクションで、軸範囲の最小値と最大値を指定することで実現できます。上記のチャートは良好に見えますが、`trip_total`と`fare_total`フィールドの相関を示すためには、軸範囲にいくつかの調整が必要です: + + ![軸スケールの調整](@site/docs/ja/cloud/images/sqlconsole/adjust-axis-scale.png) diff --git a/docs/ja/integrations/sql-clients/tablum.md b/docs/ja/integrations/sql-clients/tablum.md new file mode 100644 index 00000000000..3a9da5422d3 --- /dev/null +++ b/docs/ja/integrations/sql-clients/tablum.md @@ -0,0 +1,62 @@ +--- +sidebar_label: TABLUM.IO +slug: /ja/integrations/tablumio +description: TABLUM.IOは、ClickHouseをすぐにサポートするデータ管理SaaSです。 +--- + +# TABLUM.IOをClickHouseに接続する + +## TABLUM.IOのスタートアップページを開く + +TABLUM.IOのクラウド版は[https://go.tablum.io/](https://go.tablum.io/)で利用可能です。 + +:::note + TABLUM.IOの自己ホスト版をLinuxサーバーにDockerでインストールすることもできます。 +::: + +## 1. サービスにサインアップまたはサインインする + + 最初に、メールを使用してTABLUM.IOにサインアップするか、GoogleまたはFacebookのアカウントを使用してクイックログインを行ってください。 + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-0.png) + +## 2. ClickHouseコネクタを追加する + +ClickHouseの接続情報を準備し、**Connector**タブに移動して、ホストのURL、ポート、ユーザー名、パスワード、データベース名、コネクタの名前を入力します。これらのフィールドを入力後、**Test connection**ボタンをクリックして情報を検証し、その後、**Save connector for me**をクリックして永続化します。 + +:::tip +正しい**HTTP**ポートを指定し、接続情報に応じて**SSL**モードを切り替えることを確認してください。 +::: + +:::tip +通常、TLSを使用する場合はポートが8443で、使用しない場合は8123です。 +::: + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-1.png) + +## 3. コネクタを選択する + +**Dataset**タブに移動します。ドロップダウンで最近作成したClickHouseコネクタを選択します。右側のパネルには利用可能なテーブルとスキーマのリストが表示されます。 + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-2.png) + +## 4. SQLクエリを入力して実行する + +SQLコンソールにクエリを入力し、**Run Query**を押します。結果はスプレッドシートとして表示されます。 + +:::tip +カラム名を右クリックすると、ソート、フィルタ、その他のアクションを含むドロップダウンメニューが開きます。 +::: + + ![](@site/docs/ja/integrations/sql-clients/images/tablum-ch-3.png) + +:::note +TABLUM.IOを使用すると、 +* あなたのTABLUM.IOアカウント内で複数のClickHouseコネクタを作成および利用でき、 +* データソースに関係なくロードされたデータでクエリを実行でき、 +* 結果を新しいClickHouseデータベースとして共有することができます。 +::: + +## 詳しく学ぶ + +TABLUM.IOに関する詳細情報はhttps://tablum.ioで見つけることができます。 diff --git a/docs/ja/intro.md b/docs/ja/intro.md new file mode 100644 index 00000000000..8837dfd48ad --- /dev/null +++ b/docs/ja/intro.md @@ -0,0 +1,69 @@ +--- +slug: /ja +sidebar_label: ClickHouseとは? +description: "ClickHouse®は、オンライン分析処理(OLAP)向けの列指向SQLデータベース管理システム(DBMS)です。オープンソースソフトウェアとしても、クラウド提供としても利用可能です。" +title: ClickHouseとは? +--- + +ClickHouse®は、オンライン分析処理(OLAP)向けの高性能な列指向SQLデータベース管理システム(DBMS)です。これには、[オープンソースソフトウェア](https://github.com/ClickHouse/ClickHouse)としての提供と、[クラウド提供](https://clickhouse.com/cloud)の両方があります。 + +## 分析とは? + +分析、またはOLAP(オンライン分析処理)は、大規模なデータセットに対して複雑な計算(例:集計、文字列処理、算術演算)を行うSQLクエリを指します。 + +トランザクションクエリ(またはOLTP、オンライン・トランザクション処理)は、1クエリあたり数行のみを読み書きし、ミリ秒で完了するのに対し、分析クエリは通常、数十億、数兆の行を処理します。 + +多くのユースケースでは、[分析クエリは「リアルタイム」でなければならない](https://clickhouse.com/engineering-resources/what-is-real-time-analytics)、つまり1秒未満で結果を返す必要があります。 + +## 行指向ストレージと列指向ストレージ + +そのようなパフォーマンスレベルは、適切なデータの「指向」でのみ達成できます。 + +データベースはデータを行指向または列指向で格納します。 + +行指向データベースでは、連続するテーブル行が順次に格納されます。このレイアウトにより、行のカラム値が一緒に格納されているため、行を迅速に取得することができます。 + +ClickHouseは列指向データベースです。こうしたシステムでは、テーブルはカラムのコレクションとして格納されます。つまり、各カラムの値が順次に格納されます。このレイアウトは、単一の行を復元するのが困難(行の値の間にギャップがあるため)ですが、フィルタリングや集計といったカラム操作が行指向データベースよりもはるかに速くなります。 + +この違いは、3つのカラムでフィルタリングを行う例のクエリで最もよく説明できます: + +```sql +SELECT * +FROM table +WHERE time > ‘2024-09-01 13:14:15’ +AND location = ‘Berlin’ +AND `Mobile Phone` LIKE ‘%61010%` +``` + +**行指向DBMS** + +![Row-oriented](@site/docs/ja/images/row-oriented.gif#) + +**列指向DBMS** + +![Column-oriented](@site/docs/ja/images/column-oriented.gif#) + +## データのレプリケーションと整合性 + +ClickHouseは、非同期のマルチマスターレプリケーション方式を使用して、データが複数のノードに冗長的に格納されることを保証します。任意の利用可能なレプリカに書き込まれた後、残りのレプリカがバックグラウンドでコピーを取得します。システムは異なるレプリカ間で同一のデータを維持します。ほとんどの障害からの復旧は自動的に、あるいは複雑なケースでは半自動的に行われます。 + +## ロールベースのアクセス制御 + +ClickHouseは、SQLクエリを使用したユーザーアカウント管理を実装し、ANSI SQL標準や一般的なリレーショナルデータベース管理システムで見られるようなロールベースのアクセス制御設定を可能にします。 + +## SQLサポート + +ClickHouseは、ANSI SQL標準と多くの場合同一である[SQLに基づく宣言的クエリ言語](/docs/ja/sql-reference)をサポートします。サポートされているクエリ句には、[GROUP BY](/docs/ja/sql-reference/statements/select/group-by)、[ORDER BY](/docs/ja/sql-reference/statements/select/order-by)、[FROM](/docs/ja/sql-reference/statements/select/from)でのサブクエリ、[JOIN](/docs/ja/sql-reference/statements/select/join)句、[IN](/docs/ja/sql-reference/operators/in)演算子、[ウィンドウ関数](/docs/ja/sql-reference/window-functions)、スカラーサブクエリが含まれます。 + +## 近似計算 + +ClickHouseはパフォーマンスを向上させるために正確さを犠牲にする方法を提供します。例えば、一部の集計関数は、異なる値のカウント、中央値、分位点を近似的に計算します。また、クエリはデータのサンプルに対して実行され、迅速に近似結果を計算できます。最後に、すべてのキーではなく、限られた数のキーで集計を実行できます。キーの分布の偏りによっては、正確な計算よりもはるかに少ないリソースを使用しつつ、合理的に正確な結果を提供できます。 + +## アダプティブ結合アルゴリズム + +ClickHouseは結合アルゴリズムを適応的に選択し、最初に高速なハッシュ結合を使用し、大きなテーブルが複数ある場合にマージ結合にフォールバックします。 + +## 優れたクエリパフォーマンス + +ClickHouseは極めて高速なクエリパフォーマンスで知られています。 +ClickHouseがなぜこれほど速いのかを知るには、[ClickHouseはなぜ速いのか?](/docs/ja/concepts/why-clickhouse-is-so-fast.md)ガイドを参照してください。 diff --git a/docs/ja/managing-data/deletes.md b/docs/ja/managing-data/deletes.md new file mode 100644 index 00000000000..19a4d04f577 --- /dev/null +++ b/docs/ja/managing-data/deletes.md @@ -0,0 +1,71 @@ +--- +slug: /ja/deletes +title: データの削除 +description: ClickHouseでデータを削除する方法 +keywords: [削除, トランケート, ドロップ, 論理削除] +--- + +ClickHouseではデータを削除するためのいくつかの方法があり、それぞれに利点とパフォーマンス特性があります。データモデルと削除する予定のデータ量に基づいて適切な方法を選択する必要があります。 + +| 方法 | 構文 | 使用のタイミング | +| --- | --- | --- | +| [論理削除](/ja/guides/developer/lightweight-delete) | `DELETE FROM [table]` | 小規模なデータを削除する場合に使用します。`SELECT`クエリからすぐにフィルタリングされますが、最初は内部的に削除済みとしてマークされるだけで、ディスクからは削除されません。 | +| [物理削除](/ja/sql-reference/statements/alter/delete) | `ALTER TABLE [table] DELETE` | ディスクからすぐにデータを削除する必要がある場合に使用します(例:コンプライアンス目的)。`SELECT`のパフォーマンスに悪影響を及ぼします。 | +| [テーブルをトランケート](/ja/sql-reference/statements/truncate) | `TRUNCATE TABLE [db.table]` | テーブルからすべてのデータを効率的に削除します。 | +| [パーティションをドロップ](/ja/sql-reference/statements/alter/partition#drop-partitionpart) | `DROP PARTITION` | パーティションからすべてのデータを効率的に削除します。 | + +ClickHouseでデータを削除するさまざまな方法の概要は以下の通りです。 + +## 論理削除 + +論理削除により、行は削除済みとしてマークされ、すべての後続の`SELECT`クエリから自動的にフィルタリングされます。削除された行のその後の削除は自然なマージサイクル中に行われるため、I/Oが少なくなります。そのため、未指定の期間、データは実際にはストレージから削除されず、削除としてマークされるのみです。データが確実に削除されることを保証する必要がある場合は、上記のミューテーションコマンドを検討してください。 + +```sql +-- ミューテーションで2018年のすべてのデータを削除します。推奨されません。 +DELETE FROM posts WHERE toYear(CreationDate) = 2018 +``` + +論理削除ステートメントを使用して大量のデータを削除すると、`SELECT`クエリのパフォーマンスに悪影響を及ぼす可能性もあります。このコマンドは、プロジェクションを持つテーブルには互換性がありません。 + +操作には削除された行を[マークするためのミューテーション](/ja/sql-reference/statements/delete#how-lightweight-deletes-work-internally-in-clickhouse)(`_row_exists`カラムを追加)に関連したI/Oが生じます。 + +一般に、削除されたデータがディスク上に存在することが許容される場合(非コンプライアンスケースなど)、論理削除を物理削除よりも優先するべきです。すべてのデータを削除する必要がある場合は、このアプローチは避けるべきです。 + +[論理削除](/ja/guides/developer/lightweight-delete)について詳しく読む。 + +## 物理削除 + +論理削除は`ALTER TABLE … DELETE`コマンドを通じて発行できます。例: + +```sql +-- ミューテーションで2018年のすべてのデータを削除します。推奨されません。 +ALTER TABLE posts DELETE WHERE toYear(CreationDate) = 2018 +``` + +これらは同期的に(非レプリケートのデフォルト)、または非同期的に([mutations_sync](/ja/operations/settings/settings#mutations_sync)設定により決定)実行できます。`WHERE`式に一致するすべての部分を再書き込みするため、非常にI/Oが多くなります。このプロセスにはアトミック性がなく、部分が準備ができ次第、ミューテーションされた部分に置き換えられます。ミューテーション中に実行される`SELECT`クエリは、すでにミューテーションされた部分のデータとまだミューテーションされていない部分のデータの両方を観察します。進行状況の状態は[systems.mutations](/ja/operations/system-tables/mutations#system_tables-mutations)テーブルを通して確認できます。これらはI/Oが多い操作であり、クラスタの`SELECT`パフォーマンスに影響を与える可能性があるため、慎重に使用するべきです。 + +[論理削除](/ja/sql-reference/statements/alter/delete)について詳しく読む。 + +## テーブルをトランケート + +テーブル内のすべてのデータを削除する必要がある場合は、以下の`TRUNCATE TABLE`コマンドを使用してください。これは論理な操作です。 + +```sql +TRUNCATE TABLE posts +``` + +[TRUNCATE TABLE](/ja/sql-reference/statements/truncate)について詳しく読む。 + +## パーティションをドロップ + +データにカスタムパーティションキーを指定している場合、パーティションを効率的にドロップできます。高カーディナリティのパーティショニングは避けてください。 + +```sql +ALTER TABLE posts (DROP PARTITION '2008') +``` + +[DROP PARTITION](/ja/sql-reference/statements/alter/partition)について詳しく読む。 + +## その他のリソース + +- [ClickHouseでのアップデートと削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/managing-data/updates.md b/docs/ja/managing-data/updates.md new file mode 100644 index 00000000000..56571504cc4 --- /dev/null +++ b/docs/ja/managing-data/updates.md @@ -0,0 +1,81 @@ +--- +slug: /ja/updating-data +title: データの更新 +description: ClickHouseでデータを更新する方法 +keywords: [更新, データ更新] +--- + +## ClickHouseとOLTPデータベースにおけるデータ更新の違い + +更新を処理する際、ClickHouseとOLTPデータベースは、その基礎となる設計理念とターゲットユースケースの違いにより大きく分かれます。例えば、PostgreSQLは行指向でACID準拠のリレーショナルデータベースであり、マルチバージョン同時実行制御(MVCC)などのメカニズムを通じて、堅牢かつトランザクション性のある更新および削除操作をサポートし、データの整合性を確保します。これにより、高い同時実行環境でも安全かつ信頼性のある修正が可能です。 + +一方、ClickHouseは読み込みが多い分析と高スループットの追加のみの操作に最適化された列指向のデータベースです。インプレース更新と削除をネイティブでサポートしていますが、高いI/Oを避けるため注意して使用する必要があります。別の方法として、削除や更新を非同期的または読み取り時に処理される追加操作に変換するようにテーブルを再構築することができ、リアルタイムのデータ操作よりも高スループットのデータ取り込みと効率的なクエリパフォーマンスに重点を置いています。 + +## ClickHouseでデータを更新する方法 + +ClickHouseでは、データを更新する方法がいくつかあり、それぞれに利点とパフォーマンスの特徴があります。使用するデータモデルと更新予定量に基づいて適切な方法を選択する必要があります。 + +どちらの操作においても、一定の時間内に処理される追加操作よりも送信された追加操作の数が絶えず上回る場合、適用されなければならない非マテリアライズされた追加操作のキューが成長し続けます。これにより、最終的に`SELECT`クエリのパフォーマンスが低下する可能性があります。 + +まとめると、更新操作は慎重に発行する必要があり、`system.mutations`テーブルを使用して追加操作のキューを注意深く追跡する必要があります。OLTPデータベースのように頻繁に更新を行わないでください。頻繁に更新する必要がある場合は、[ReplacingMergeTree](/ja/engines/table-engines/mergetree-family/replacingmergetree)を参照してください。 + +| 方法 | 構文 | 使用時期 | +| --- | --- | --- | +| [物理更新](/ja/sql-reference/statements/alter/update) | `ALTER TABLE [table] UPDATE` | データをディスクに即時更新する必要がある場合(例:コンプライアンスのため)。`SELECT`パフォーマンスに悪影響を与えます。 | +| [論理更新](/ja/guides/developer/lightweight-update) | `ALTER TABLE [table] UPDATE` | `SET apply_mutations_on_fly = 1;`を使用して有効化。少量のデータを更新する場合に使用します。更新されたデータが即座に次のすべての`SELECT`クエリで返されますが、最初はディスク上で内部的に更新済みとしてマークされるだけです。 | +| [ReplacingMergeTree](/ja/engines/table-engines/mergetree-family/replacingmergetree) | `ENGINE = ReplacingMergeTree` | 大量のデータを更新する場合に使用します。このテーブルエンジンはマージ時のデータ重複削除に最適化されています。 | + +以下は、ClickHouseでデータを更新するさまざまな方法の概要です: + +## 物理更新 + +物理更新は、例えば`ALTER TABLE … UPDATE`コマンドを通じて発行できます。 + +```sql +ALTER TABLE posts_temp + (UPDATE AnswerCount = AnswerCount + 1 WHERE AnswerCount = 0) +``` +これらは非常にI/Oヘビーであり、`WHERE`式に一致するすべてのパーツを再書き込みします。このプロセスには原子性がなく、準備が整い次第、変更されたパーツが置き換えられ、追加操作中に実行される`SELECT`クエリは既に変更されたパーツとまだ変更されていないパーツの両方からデータを表示します。ユーザーは[systems.mutations](/ja/operations/system-tables/mutations#system_tables-mutations)テーブルを通じて進捗状況を追跡することができます。これらはI/Oを多く消費する操作であり、クラスタの`SELECT`パフォーマンスに影響を与える可能性があるため、節度を持って使用すべきです。 + +[物理更新](/ja/sql-reference/statements/alter/update)について詳しく読む。 + +## 論理更新 (ClickHouseクラウドでのみ利用可能) + +論理更新は、行を即座に更新し、その後の`SELECT`クエリで自動的に変更された値を返すメカニズムを提供します(これはオーバーヘッドを伴い、クエリを遅くします)。これにより、通常の追加操作の原子性制限が効果的に解決されます。以下に例を示します: + +```sql +SET apply_mutations_on_fly = 1; + +SELECT ViewCount +FROM posts +WHERE Id = 404346 + +┌─ViewCount─┐ +│ 26762 │ +└───────────┘ + +1 row in set. Elapsed: 0.115 sec. Processed 59.55 million rows, 238.25 MB (517.83 million rows/s., 2.07 GB/s.) +Peak memory usage: 113.65 MiB. + +-increment count +ALTER TABLE posts + (UPDATE ViewCount = ViewCount + 1 WHERE Id = 404346) + +SELECT ViewCount +FROM posts +WHERE Id = 404346 + +┌─ViewCount─┐ +│ 26763 │ +└───────────┘ + +1 row in set. Elapsed: 0.149 sec. Processed 59.55 million rows, 259.91 MB (399.99 million rows/s., 1.75 GB/s.) +``` + +論理更新では、データを更新するために追加操作が使用されることに注意してください。これは即座にマテリアライズされず、`SELECT`クエリの際に適用されます。バックグラウンドで非同期的に適用されるため、通常の追加操作と同様に重いオーバーヘッドがかかり、I/Oを多く消費する操作であり、節度を持って使用すべきです。この操作で使用できる式にも制限があります([詳細](/ja/guides/developer/lightweight-update#support-for-subqueries-and-non-deterministic-functions)を参照)。 + +[論理更新](/ja/guides/developer/lightweight-update)について詳しく読む。 + +## 追加資料 + +- [ClickHouseにおける更新と削除の処理](https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse) diff --git a/docs/ja/materialized-view/images/materialized-view-diagram.png b/docs/ja/materialized-view/images/materialized-view-diagram.png new file mode 100644 index 00000000000..4836b0d8ec5 Binary files /dev/null and b/docs/ja/materialized-view/images/materialized-view-diagram.png differ diff --git a/docs/ja/materialized-view/images/refreshable-materialized-view-diagram.png b/docs/ja/materialized-view/images/refreshable-materialized-view-diagram.png new file mode 100644 index 00000000000..f64760e9b94 Binary files /dev/null and b/docs/ja/materialized-view/images/refreshable-materialized-view-diagram.png differ diff --git a/docs/ja/materialized-view/index.md b/docs/ja/materialized-view/index.md new file mode 100644 index 00000000000..7d70214e9ed --- /dev/null +++ b/docs/ja/materialized-view/index.md @@ -0,0 +1,348 @@ +--- +slug: /ja/materialized-view +title: Materialized View +description: Materialized Viewを使用してクエリを高速化する方法 +keywords: [materialized views, クエリを高速化, クエリ最適化] +--- + +# Materialized View + +Materialized Viewを使用すると、計算のコストをクエリ時から挿入時に移行し、`SELECT`クエリを高速化できます。 + +Postgresなどのトランザクショナルデータベースとは異なり、ClickHouseのMaterialized Viewは、データがテーブルに挿入される際にクエリを実行するトリガーに過ぎません。このクエリの結果は、2つ目の「ターゲット」テーブルに挿入されます。さらに多くの行が挿入されると、その結果がターゲットテーブルに送られ、中間結果が更新およびマージされます。このマージされた結果は、元のデータ全体に対してクエリを実行したときと同等です。 + +Materialized Viewの主な動機は、ターゲットテーブルに挿入される結果が、行に対する集計、フィルタリング、または変換の結果を表していることです。これらの結果は、しばしば元のデータの小さな表現(集計の場合は部分的なスケッチ)になります。これにより、ターゲットテーブルから結果を読み取るためのクエリが単純であるため、元のデータに対して同じ計算を行った場合よりもクエリ時間が短くなることが保証され、計算(したがってクエリの遅延)がクエリ時から挿入時に移行されます。 + +ClickHouseのMaterialized Viewは、ベースにしたテーブルにデータが流入するとリアルタイムで更新され、継続的に更新され続けるインデックスのように機能します。これは、多くのデータベースにおいてMaterialized Viewがクエリの静的なスナップショットであり、新しくリフレッシュする必要があること(ClickHouseの[リフレッシャブルMaterialized View](/ja/sql-reference/statements/create/view#refreshable-materialized-view)と似ています)とは対照的です。 + +Materialized view diagram + +## 例 + +1日の投稿に対するアップ投票とダウン投票の数を取得したいとします。 + +ClickHouseの[`toStartOfDay`](/ja/sql-reference/functions/date-time-functions#tostartofday)関数のおかげで、これはかなり簡単なクエリです: + +```sql +SELECT toStartOfDay(CreationDate) AS day, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes +FROM votes +GROUP BY day +ORDER BY day ASC +LIMIT 10 + +┌─────────────────day─┬─UpVotes─┬─DownVotes─┐ +│ 2008-07-31 00:00:00 │ 6 │ 0 │ +│ 2008-08-01 00:00:00 │ 182 │ 50 │ +│ 2008-08-02 00:00:00 │ 436 │ 107 │ +│ 2008-08-03 00:00:00 │ 564 │ 100 │ +│ 2008-08-04 00:00:00 │ 1306 │ 259 │ +│ 2008-08-05 00:00:00 │ 1368 │ 269 │ +│ 2008-08-06 00:00:00 │ 1701 │ 211 │ +│ 2008-08-07 00:00:00 │ 1544 │ 211 │ +│ 2008-08-08 00:00:00 │ 1241 │ 212 │ +│ 2008-08-09 00:00:00 │ 576 │ 46 │ +└─────────────────────┴─────────┴───────────┘ + +10 rows in set. Elapsed: 0.133 sec. Processed 238.98 million rows, 2.15 GB (1.79 billion rows/s., 16.14 GB/s.) +Peak memory usage: 363.22 MiB. +``` + +このクエリは、すでにClickHouseのおかげで高速ですが、さらに改善できるでしょうか? + +Materialized Viewを使用してこれを挿入時に計算したい場合、結果を受け取るテーブルが必要です。このテーブルは、1日につき1行だけを保持する必要があります。既存の日のデータが更新される場合、他のカラムは既存の日の行にマージされるべきです。このインクリメンタルな状態のマージを行うためには、他のカラムの部分的な状態を保持する必要があります。 + +これは、ClickHouseにおける特別なエンジンタイプを必要とします: [SummingMergeTree](/ja/engines/table-engines/mergetree-family/summingmergetree)。これは、全ての数値カラムの合計値を含む1つの行に置き換えます。以下のテーブルは、同じ日付を持つ行をマージし、数値カラムを合計します: + +``` +CREATE TABLE up_down_votes_per_day +( + `Day` Date, + `UpVotes` UInt32, + `DownVotes` UInt32 +) +ENGINE = SummingMergeTree +ORDER BY Day +``` + +Materialized Viewを示すために、votesテーブルが空であり、まだデータを受け取っていないと仮定します。我々のMaterialized Viewは、`votes`に挿入されたデータに対して上記の`SELECT`を実行し、その結果を`up_down_votes_per_day`に送ります: + +```sql +CREATE MATERIALIZED VIEW up_down_votes_per_day_mv TO up_down_votes_per_day AS +SELECT toStartOfDay(CreationDate)::Date AS Day, + countIf(VoteTypeId = 2) AS UpVotes, + countIf(VoteTypeId = 3) AS DownVotes +FROM votes +GROUP BY Day +``` + +ここでの`TO`句は重要で、結果が送られる場所、すなわち`up_down_votes_per_day`を示しています。 + +以前の挿入からvotesテーブルを再度ポピュレートできます: + +```sql +INSERT INTO votes SELECT toUInt32(Id) AS Id, toInt32(PostId) AS PostId, VoteTypeId, CreationDate, UserId, BountyAmount +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/votes.parquet') + +0 rows in set. Elapsed: 111.964 sec. Processed 477.97 million rows, 3.89 GB (4.27 million rows/s., 34.71 MB/s.) +Peak memory usage: 283.49 MiB. +``` + +完了後、`up_down_votes_per_day`のサイズを確認できます - 1日につき1行になるはずです: + +``` +SELECT count() +FROM up_down_votes_per_day +FINAL + +┌─count()─┐ +│ 5723 │ +└─────────┘ +``` + +ここで、`votes`における238百万行から、このクエリの結果を保存することによって5000に行数を効果的に減少させました。ここでの鍵は、`votes`テーブルに新しい投票が挿入されるたびに、新しい値がその日に対して`up_down_votes_per_day`に送られ、それらはバックグラウンドで自動的に非同期でマージされることです - 1日につき1行のみを保持します。`up_down_votes_per_day`は常に小さく、最新の状態に保たれます。 + +行のマージが非同期で行われるため、ユーザーがクエリする際に1日あたり複数の投票が存在する可能性があります。クエリ時に未結合の行を確実にマージするために、以下の2つのオプションがあります: + +- テーブル名に`FINAL`修飾子を使用する。これは上記のカウントクエリで行いました。 +- 最終テーブルで使用した並び替えキー(例: `CreationDate`)で集約し、メトリックを合計します。これは通常、より効率的で柔軟ですが(テーブルが他のことにも使用できます)、前者は一部のクエリにとっては単純かもしれません。以下で両方を示します: + +```sql +SELECT + Day, + UpVotes, + DownVotes +FROM up_down_votes_per_day +FINAL +ORDER BY Day ASC +LIMIT 10 + +10 rows in set. Elapsed: 0.004 sec. Processed 8.97 thousand rows, 89.68 KB (2.09 million rows/s., 20.89 MB/s.) +Peak memory usage: 289.75 KiB. + +SELECT Day, sum(UpVotes) AS UpVotes, sum(DownVotes) AS DownVotes +FROM up_down_votes_per_day +GROUP BY Day +ORDER BY Day ASC +LIMIT 10 +┌────────Day─┬─UpVotes─┬─DownVotes─┐ +│ 2008-07-31 │ 6 │ 0 │ +│ 2008-08-01 │ 182 │ 50 │ +│ 2008-08-02 │ 436 │ 107 │ +│ 2008-08-03 │ 564 │ 100 │ +│ 2008-08-04 │ 1306 │ 259 │ +│ 2008-08-05 │ 1368 │ 269 │ +│ 2008-08-06 │ 1701 │ 211 │ +│ 2008-08-07 │ 1544 │ 211 │ +│ 2008-08-08 │ 1241 │ 212 │ +│ 2008-08-09 │ 576 │ 46 │ +└────────────┴─────────┴───────────┘ + +10 rows in set. Elapsed: 0.010 sec. Processed 8.97 thousand rows, 89.68 KB (907.32 thousand rows/s., 9.07 MB/s.) +Peak memory usage: 567.61 KiB. +``` + +これにより、クエリ時間を0.133秒から0.004秒 - 25倍以上の改善になりました! + +### より複雑な例 + +上記の例では、Dailyの合計値を2つ取り扱うためにMaterialized Viewを使用しています。合計は、部分的な状態を維持するための最も簡単な集計形式です - 新しい値が到着したときに既存の値に追加するだけで済みます。しかし、ClickHouseのMaterialized Viewは、あらゆるタイプの集計に使用することができます。 + +たとえば、投稿の統計を各日数に対して計算したいとしましょう: `Score`の99.9パーセンタイルと`CommentCount`の平均です。この計算のためのクエリは以下のようになるかもしれません: + +```sql +SELECT + toStartOfDay(CreationDate) AS Day, + quantile(0.999)(Score) AS Score_99th, + avg(CommentCount) AS AvgCommentCount +FROM posts +GROUP BY Day +ORDER BY Day DESC +LIMIT 10 + + ┌─────────────────Day─┬────────Score_99th─┬────AvgCommentCount─┐ + 1. │ 2024-03-31 00:00:00 │ 5.23700000000008 │ 1.3429811866859624 │ + 2. │ 2024-03-30 00:00:00 │ 5 │ 1.3097158891616976 │ + 3. │ 2024-03-29 00:00:00 │ 5.78899999999976 │ 1.2827635327635327 │ + 4. │ 2024-03-28 00:00:00 │ 7 │ 1.277746158224246 │ + 5. │ 2024-03-27 00:00:00 │ 5.738999999999578 │ 1.2113264918282023 │ + 6. │ 2024-03-26 00:00:00 │ 6 │ 1.3097536945812809 │ + 7. │ 2024-03-25 00:00:00 │ 6 │ 1.2836721018539201 │ + 8. │ 2024-03-24 00:00:00 │ 5.278999999999996 │ 1.2931667891256429 │ + 9. │ 2024-03-23 00:00:00 │ 6.253000000000156 │ 1.334061135371179 │ +10. │ 2024-03-22 00:00:00 │ 9.310999999999694 │ 1.2388059701492538 │ + └─────────────────────┴───────────────────┴────────────────────┘ + +10 rows in set. Elapsed: 0.113 sec. Processed 59.82 million rows, 777.65 MB (528.48 million rows/s., 6.87 GB/s.) +Peak memory usage: 658.84 MiB. +``` + +前述のように、postsテーブルに新しい投稿が挿入されるとき、上記のクエリを実行するMaterialized Viewを作成できます。 + +例の目的で、S3からの投稿データのロードを避けるために、`posts`と同じスキーマを持つ重複テーブル`posts_null`を作成します。ただし、このテーブルはデータを保存せず、Materialized Viewが行を挿入する際に使用されます。データの保存を防ぐために、[`Null`テーブルエンジンタイプ](/ja/engines/table-engines/special/null)を使用できます。 + +```sql +CREATE TABLE posts_null AS posts ENGINE = Null +``` + +Nullテーブルエンジンは強力な最適化です - `/dev/null`のようなものです。我々のMaterialized Viewは、挿入時に`posts_null`テーブルが行を受け取ると統計を計算して格納します - ただのトリガーに過ぎません。ただし、生データは保存されません。実際には、元の投稿を保存する必要があるかもしれませんが、このアプローチは集計を計算しながら生データのストレージオーバーヘッドを回避するために使用できます。 + +それゆえ、Materialized Viewは以下のようになります: + +```sql +CREATE MATERIALIZED VIEW post_stats_mv TO post_stats_per_day AS + SELECT toStartOfDay(CreationDate) AS Day, + quantileState(0.999)(Score) AS Score_quantiles, + avgState(CommentCount) AS AvgCommentCount +FROM posts_null +GROUP BY Day +``` + +注: ここでは、集約関数の末尾に`State`サフィックスを付けています。これにより、関数の集約状態が返され、最終的な結果ではなく、他の状態とマージするための追加情報を持つ部分状態が含まれます。たとえば平均の場合、これはカウントとカラムの合計を含みます。 + +> 部分的な集計状態は正しい結果を計算するために必要です。たとえば、平均を計算する場合、サブレンジの平均を単純に平均化することは誤った結果をもたらします。 + +次に、このビューのターゲットテーブル`post_stats_per_day`を作成し、これらの部分的集計状態を保存します: + +```sql +CREATE TABLE post_stats_per_day +( + `Day` Date, + `Score_quantiles` AggregateFunction(quantile(0.999), Int32), + `AvgCommentCount` AggregateFunction(avg, UInt8) +) +ENGINE = AggregatingMergeTree +ORDER BY Day +``` + +以前は、カウントを保存するための`SummingMergeTree`が十分でしたが、他の関数にはより高度なエンジンタイプが必要です: [`AggregatingMergeTree`](/ja/engines/table-engines/mergetree-family/aggregatingmergetree)。 +ClickHouseに集約状態が保存されることを確実に知らせるために、`Score_quantiles`と`AvgCommentCount`を`AggregateFunction`タイプとして定義し、部分的状態とソースカラムのタイプの関数ソースを指定します。`SummingMergeTree`のように、同じ`ORDER BY`キー値を持つ行がマージされます(この例の`Day`) + +Materialized Viewを経由して`post_stats_per_day`をポピュレートするには、`posts`から`posts_null`にすべての行を挿入するだけです: + +```sql +INSERT INTO posts_null SELECT * FROM posts + +0 rows in set. Elapsed: 13.329 sec. Processed 119.64 million rows, 76.99 GB (8.98 million rows/s., 5.78 GB/s.) +``` + +> プロダクションでは、おそらくMaterialized Viewを`posts`テーブルにアタッチすることになります。ここでは、nullテーブルを示すために`posts_null`を使用しました。 + +最終クエリは、関数に`Merge`サフィックスを使用する必要があります(カラムが部分的な集計状態を格納しているため): + +```sql +SELECT + Day, + quantileMerge(0.999)(Score_quantiles), + avgMerge(AvgCommentCount) +FROM post_stats_per_day +GROUP BY Day +ORDER BY Day DESC +LIMIT 10 +``` + +ここでは、`FINAL`を使用する代わりに`GROUP BY`を使用します。 + +## 他の用途 + +上記では主に、データの部分集計をインクリメンタルに更新する目的でMaterialized Viewを使用し、クエリ時間から挿入時間へと計算を移行することに焦点を当てています。この一般的な使用ケースを超え、Materialized Viewには他の多くの用途があります。 + +### フィルタリングと変換 + +場合によっては、挿入時に行とカラムのサブセットのみを挿入したい場合があります。この場合、`posts_null`テーブルは挿入を受け、`posts`テーブルへの挿入前に`SELECT` クエリで行をフィルタリングできます。たとえば、`posts`テーブルの`Tags`カラムを変換したいとします。これはタグ名のパイプ区切りリストを含んでいます。これらを配列に変換することで、個々のタグ値による集計がより簡単になります。 + +> この変換は、`INSERT INTO SELECT` を実行するときにも実行できます。Materialized ViewはこのロジックをClickHouse DDLにカプセル化し、`INSERT`をシンプルに保ちながら、新しい行に変換を適用できます。 + +この変換のためのMaterialized Viewは以下のようになります: + +```sql +CREATE MATERIALIZED VIEW posts_mv TO posts AS + SELECT * EXCEPT Tags, arrayFilter(t -> (t != ''), splitByChar('|', Tags)) as Tags FROM posts_null +``` + +### 参照テーブル + +ユーザーはClickHouseの順序付けキーを選択する際に、そのフィルタリングや集計句で頻繁に使用されるカラムを選択する必要があります。しかし、これは単一のカラムセットでカプセル化できない、より多様なアクセスパターンを持つシナリオにおいて制約を与える可能性があります。たとえば、次の`comments`テーブルを考えてみましょう: + +```sql +CREATE TABLE comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String) +) +ENGINE = MergeTree +ORDER BY PostId + +0 rows in set. Elapsed: 46.357 sec. Processed 90.38 million rows, 11.14 GB (1.95 million rows/s., 240.22 MB/s.) +``` + +ここでの順序付けキーは、`PostId` でフィルタリングするクエリに対してテーブルを最適化しています。 + +特定の`UserId`でフィルタリングし、平均`Score`を計算したい状況を考えてみましょう: + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.778 sec. Processed 90.38 million rows, 361.59 MB (116.16 million rows/s., 464.74 MB/s.) +Peak memory usage: 217.08 MiB. +``` + +高速です(データはClickHouseにとって小さい)が、プロセスされた行数 - 90.38百万からフルテーブルスキャンを必要とすることがわかります。より大きなデータセットに対して、フィルタリングカラム`UserId`のための順序付けキー値`PostId`を参照するMaterialized Viewを使用して、このクエリを効率的に加速することができます。これらの値は効率的な参照に使用できます。 + +この例では、Materialized Viewはとてもシンプルで、挿入時に`comments`から`PostId`と`UserId`のみを選択します。これらの結果は、`UserId`で並び替えられた`comments_posts_users`テーブルに送られます。以下で`comments`テーブルのnullバージョンを作成し、このビューと`comments_posts_users`テーブルをポピュレートするために使用します: + +```sql +CREATE TABLE comments_posts_users ( + PostId UInt32, + UserId Int32 +) ENGINE = MergeTree ORDER BY UserId + + +CREATE TABLE comments_null AS comments +ENGINE = Null + +CREATE MATERIALIZED VIEW comments_posts_users_mv TO comments_posts_users AS +SELECT PostId, UserId FROM comments_null + +INSERT INTO comments_null SELECT * FROM comments + +0 rows in set. Elapsed: 5.163 sec. Processed 90.38 million rows, 17.25 GB (17.51 million rows/s., 3.34 GB/s.) +``` + +このビューをサブクエリで使用して前のクエリを加速できます: + +```sql +SELECT avg(Score) +FROM comments +WHERE PostId IN ( + SELECT PostId + FROM comments_posts_users + WHERE UserId = 8592047 +) AND UserId = 8592047 + + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.012 sec. Processed 88.61 thousand rows, 771.37 KB (7.09 million rows/s., 61.73 MB/s.) +``` + +### チェイン化 + +Materialized Viewはチェイン化可能で、複雑なワークフローを確立できます。実際の例については、この[ブログ投稿](https://clickhouse.com/blog/chaining-materialized-views)をお勧めします。 diff --git a/docs/ja/materialized-view/refreshable-materialized-view.md b/docs/ja/materialized-view/refreshable-materialized-view.md new file mode 100644 index 00000000000..9d51e717565 --- /dev/null +++ b/docs/ja/materialized-view/refreshable-materialized-view.md @@ -0,0 +1,70 @@ +--- +slug: /ja/materialized-view/refreshable-materialized-view +title: リフレッシュ可能なMaterialized View(エクスペリメンタル機能) +description: クエリを高速化するためのMaterialized Viewの使い方 +keywords: [refreshable materialized view, refresh, materialized views, speed up queries, query optimization] +--- + +import ExperimentalBadge from '@theme/badges/ExperimentalBadge'; + + + +リフレッシュ可能なMaterialized Viewは、伝統的なOLTPデータベースにおけるMaterialized Viewと概念的に類似しており、指定されたクエリの結果を保存して迅速に取得することで、リソース集約的なクエリを繰り返し実行する必要を減らします。ClickHouseの[インクリメンタルMaterialized View](/ja/materialized-view)とは異なり、完全なデータセットに対して定期的にクエリを実行する必要があり、その結果がクエリ用のターゲットテーブルに保存されます。この結果セットは、理論的には元のデータセットより小さくなり、後続のクエリの実行を高速化します。 + +リフレッシュ可能なMaterialized Viewの図 + +## リフレッシュ可能なMaterialized Viewを使用するべき場合 + +ClickHouseのインクリメンタルMaterialized Viewは非常に強力で、特に単一テーブルに対する集計を行う場合、リフレッシュ可能なMaterialized Viewの手法よりも通常、大規模にスケールします。データが挿入される各ブロックごとに集計を計算し、最終テーブルでインクリメンタルな状態をマージすることにより、クエリは常にデータの一部に対してのみ実行されます。この方法はペタバイト単位のデータにまでスケールする可能性があり、通常は好まれる方法です。 + +しかし、このインクリメンタルなプロセスが必要でない場合や適用できない場合もあります。いくつかの問題はインクリメンタルアプローチと互換性がなかったり、リアルタイムでの更新を必要としなかったりし、定期的な再構築の方が適切である場合があります。たとえば、複雑なジョインを使用するためインクリメンタルアプローチと互換性がないケースでは、データセット全体に対してビューの完全な再計算を定期的に実行したい場合があります。 + +> リフレッシュ可能なMaterialized Viewは、非正規化といったタスクを行うバッチプロセスを実行するために使用されます。リフレッシュ可能なMaterialized Viewの間に依存関係を作成することで、あるビューが別のビューの結果に依存し、そのビューが完了すると実行されるようにすることができます。これを使用して、スケジュールされたワークフローや[dbt](https://www.getdbt.com/)ジョブのような単純なDAGを置き換えることができます。 + +## 例 + +例として、StackOverflowデータセットの`postlinks`データセットを`posts`テーブルに非正規化する以下のクエリを考えます。なぜユーザーがこれを行いたがるかについては、[非正規化データガイド](/ja/data-modeling/denormalization)で探っています。 + +```sql +SELECT + posts.*, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Linked' AND p.2 != 0, Related)) AS LinkedPosts, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Duplicate' AND p.2 != 0, Related)) AS DuplicatePosts +FROM posts +LEFT JOIN ( + SELECT + PostId, + groupArray((CreationDate, RelatedPostId, LinkTypeId)) AS Related + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts_types_codecs_ordered.Id = postlinks.PostId +``` + +`posts`と`postlinks`の両方のテーブルは更新される可能性があります。このジョインをインクリメンタルMaterialized Viewで実装する代わりに、このクエリを1時間ごとに実行し、その結果を`post_with_links`テーブルに保存するスケジュールを設定することで十分かもしれません。 + +ここでの構文はインクリメンタルMaterialized Viewと同一ですが、[`REFRESH`](/ja/sql-reference/statements/create/view#refreshable-materialized-view)句を含めています: + +```sql +-- エクスペリメンタル機能を有効化 +SET allow_experimental_refreshable_materialized_view = 1 + +CREATE MATERIALIZED VIEW posts_with_links_mv +REFRESH EVERY 1 HOUR TO posts_with_links AS +SELECT + posts.*, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Linked' AND p.2 != 0, Related)) AS LinkedPosts, + arrayMap(p -> (p.1, p.2), arrayFilter(p -> p.3 = 'Duplicate' AND p.2 != 0, Related)) AS DuplicatePosts +FROM posts +LEFT JOIN ( + SELECT + PostId, + groupArray((CreationDate, RelatedPostId, LinkTypeId)) AS Related + FROM postlinks + GROUP BY PostId +) AS postlinks ON posts_types_codecs_ordered.Id = postlinks.PostId +``` + +このビューは、ソーステーブルへの更新が反映されるように設定されており、即時に実行され、その後も毎時間実行されます。特に、クエリが再実行されるとき、結果セットは原子かつ透過的に更新されます。 diff --git a/docs/ja/migrations/bigquery/equivalent-concepts.md b/docs/ja/migrations/bigquery/equivalent-concepts.md new file mode 100644 index 00000000000..86909ff402f --- /dev/null +++ b/docs/ja/migrations/bigquery/equivalent-concepts.md @@ -0,0 +1,478 @@ +--- +title: BigQuery と ClickHouse Cloud の比較 +slug: /ja/migrations/bigquery +description: BigQuery と ClickHouse Cloud の違い +keywords: [移行, データ, etl, elt, bigquery] +--- + +# BigQuery と ClickHouse Cloud: 同等概念と異なる概念 + +## リソースの組織化 + +ClickHouse Cloud 内のリソースの組織化は、[BigQuery のリソース階層](https://cloud.google.com/bigquery/docs/resource-hierarchy) に似ています。以下の ClickHouse Cloud のリソース階層を示す図を基にした特定の違いを説明します。 + +NEEDS ALT + +
    + +### 組織 + +BigQuery と同様に、組織は ClickHouse Cloud リソース階層のルートノードです。ClickHouse Cloud アカウントで最初に設定したユーザーは、ユーザーが所有する組織に自動的に割り当てられます。ユーザーは他のユーザーをその組織に招待することができます。 + +### BigQuery プロジェクト vs ClickHouse Cloud サービス + +組織内では、ClickHouse Cloud でのデータがサービスに関連付けられるため、BigQuery プロジェクトに緩やかに相当するサービスを作成できます。ClickHouse Cloud では[いくつかのサービスタイプが利用可能](/ja/cloud/manage/service-types)です。各 ClickHouse Cloud サービスは特定の地域にデプロイされ、以下を含みます: + +1. コンピュートノードのグループ(現在、開発ティアサービスには 2 ノード、運用ティアサービスには 3 ノード)。これらのノードに対して、ClickHouse Cloud は[垂直および水平スケーリング](/ja/manage/scaling#vertical-and-horizontal-scaling)の両方を手動および自動でサポートしています。 +2. サービスがすべてのデータを保存するオブジェクトストレージフォルダ。 +3. エンドポイント(または ClickHouse Cloud UI コンソールを通じて作成される複数のエンドポイント)- サービスに接続するためのサービス URL(例:`https://dv2fzne24g.us-east-1.aws.clickhouse.cloud:8443`)。 + +### BigQuery データセット vs ClickHouse Cloud データベース + +ClickHouse はテーブルをデータベースに論理的にグループ化します。BigQuery データセットと同様に、ClickHouse データベースはテーブルデータへのアクセスを組織し制御する論理コンテナです。 + +### BigQuery フォルダ + +ClickHouse Cloud には現在、BigQuery フォルダに相当する概念はありません。 + +### BigQuery スロット予約とクォータ + +BigQuery スロット予約と同様に、ClickHouse Cloud では[垂直および水平のオートスケーリングを設定](/ja/manage/scaling#configuring-vertical-auto-scaling)できます。垂直オートスケーリングでは、サービスのコンピュートノードのメモリと CPU コアの最小および最大サイズを設定することができます。この設定は、初期のサービス作成のフローでも利用可能です。各コンピュートノードは同じサイズを持っています。[水平スケーリング](/ja/manage/scaling#self-serve-horizontal-scaling)を使用して、サービス内のコンピュートノードの数を変更できます。 + +さらに、BigQuery クォータに類似して、ClickHouse Cloud は並行制御、メモリ使用量制限、および I/O スケジューリングを提供し、クエリをワークロードクラスに隔離することを可能にします。特定のワークロードクラスに対する共有リソース(CPU コア、DRAM、ディスクおよびネットワーク I/O)の制限を設定することで、これらのクエリが他の重要なビジネスクエリに影響を与えないようにします。並行制御は、多数の同時クエリがある状況でのスレッドの過剰なサブスクリプションを防ぎます。 + +ClickHouse は、サーバ、ユーザー、およびクエリレベルでメモリアロケーションのバイトサイズを追跡し、柔軟なメモリ使用量制限を設定できます。メモリオーバーコミットにより、クエリは保証されたメモリを超える追加の空きメモリを使用できる一方で、他のクエリのメモリ制限を保証します。加えて、集約、ソート、および結合句のためのメモリ使用量を制限し、メモリ制限が超えられた場合には外部アルゴリズムにフォールバックすることができます。 + +最後に、I/O スケジューリングによりユーザーは、最大帯域幅、インフライトリクエスト、およびポリシーに基づいて、ワークロードクラスのローカルおよびリモートディスクアクセスを制限することができます。 + +### 権限 + +ClickHouse Cloud は[クラウドコンソール](/ja/get-started/sql-console)およびデータベースを通じて[ユーザーアクセスを管理](/ja/cloud/security/cloud-access-management)します。コンソールアクセスは [clickhouse.cloud](https://clickhouse.cloud) のユーザーインターフェイスを通じて管理されます。データベースアクセスは、データベースのユーザーアカウントとロールを通じて管理されます。さらに、コンソールのユーザーには、SQL コンソールを通じてデータベースと対話することを可能にするデータベース内の役割を付与することができます。 + +## データ型 + +ClickHouse は数値に関してより詳細な精度を提供します。たとえば、BigQuery は[INT64, NUMERIC, BIGNUMERIC および FLOAT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)の数値型を提供しています。これに対して ClickHouse は、デシマル、フロート、整数に対して複数の精度を提供しています。これらのデータ型により、ClickHouse ユーザーはストレージおよびメモリのオーバーヘッドを最適化し、より高速なクエリとリソース消費を低減します。以下に、各 BigQuery 型に対する ClickHouse の同等型を示します: + +| BigQuery | ClickHouse | +|----------|------------| +| [ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#array_type) | [Array(t)](/ja/sql-reference/data-types/array) | +| [NUMERIC](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#decimal_types) | [Decimal(P, S), Decimal32(S), Decimal64(S), Decimal128(S)](/ja/sql-reference/data-types/decimal) | +| [BIG NUMERIC](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#decimal_types) | [Decimal256(S)](/ja/sql-reference/data-types/decimal) | +| [BOOL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#boolean_type) | [Bool](/ja/sql-reference/data-types/boolean) | +| [BYTES](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#bytes_type) | [FixedString](/ja/sql-reference/data-types/fixedstring) | +| [DATE](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#date_type) | [Date32](/ja/sql-reference/data-types/date32) (より狭い範囲) | +| [DATETIME](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#datetime_type) | [DateTime](/ja/sql-reference/data-types/datetime), [DateTime64](/ja/sql-reference/data-types/datetime64) (狭い範囲で高精度) | +| [FLOAT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#floating_point_types) | [Float64](/ja/sql-reference/data-types/float) | +| [GEOGRAPHY](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#geography_type) | [Geo Data Types](/ja/sql-reference/data-types/float) | +| [INT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#integer_types) | [UInt8, UInt16, UInt32, UInt64, UInt128, UInt256, Int8, Int16, Int32, Int64, Int128, Int256](/ja/sql-reference/data-types/int-uint) | +| [INTERVAL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#integer_types) | 該当なし - [式としてサポート](/ja/sql-reference/data-types/special-data-types/interval#usage-remarks)または[関数を通じて](/ja/sql-reference/functions/date-time-functions#addyears-addmonths-addweeks-adddays-addhours-addminutes-addseconds-addquarters) | +| [JSON](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#json_type) | [JSON](/ja/integrations/data-formats/json/overview#relying-on-schema-inference) | +| [STRING](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#string_type) | [String (bytes)](/ja/sql-reference/data-types/string) | +| [STRUCT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#constructing_a_struct) | [Tuple](/ja/sql-reference/data-types/tuple), [Nested](/ja/sql-reference/data-types/nested-data-structures/nested) | +| [TIME](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#time_type) | [DateTime64](/ja/sql-reference/data-types/datetime64) | +| [TIMESTAMP](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#timestamp_type) | [DateTime64](/ja/sql-reference/data-types/datetime64) | + +ClickHouse 型が複数のオプションで提示された場合、データの実際の範囲を考慮し、必要最低限のものを選択してください。また、さらなる圧縮のために[適切なコーデック](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)の利用を検討してください。 + +## クエリ高速化技術 + +### 主キーおよび外部キーと主インデックス + +BigQuery では、テーブルに[主キーおよび外部キーの制約](https://cloud.google.com/bigquery/docs/information-schema-table-constraints)を持たせることができます。通常、主キーおよび外部キーは、リレーショナルデータベースでデータの整合性を確保するために使用されます。主キーの値は通常、各行のユニークな値であり `NULL` ではありません。外部キー値は、主キー表の主キー列で存在するか `NULL` でなければなりません。BigQuery では、これらの制約は強制されませんが、クエリオプティマイザはこの情報を用いてクエリの最適化を行うことができます。 + +ClickHouse でもテーブルに主キーが設定可能です。BigQuery と同様に、ClickHouse はテーブルの主キーカラムの値の一意性を強制しません。BigQuery とは異なり、テーブルのデータは主キーカラムによって[ディスクに順序付けされて](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)保存されます。クエリオプティマイザはこの並び順を用いてリゾートを防ぎ、結合時のメモリ使用量を最小化し、リミット句に対してショートサーキットを可能にします。BigQuery と異なり、ClickHouse は自動的に[(スパースな)プライマリインデックス](/ja/optimize/sparse-primary-indexes#an-index-design-for-massive-data-scales)を主キーのカラムの値に基づいて作成します。このインデックスは、主キーカラムのフィルタを含むすべてのクエリを高速化するために使用されます。ClickHouse は現在、外部キーの制約をサポートしていません。 + +## セカンダリインデックス(ClickHouse のみに存在) + +テーブルの主キーカラムとは異なるカラムにセカンダリインデックスを作成することが ClickHouse ではできます。ClickHouse はクエリの種類に応じたさまざまなセカンダリインデックスを提供しています: + +- **ブルームフィルターインデックス**: + - 等価条件(例:=、IN)でクエリを高速化するために使用されます。 + - 値がデータブロックに存在するかどうかを決定するための確率的なデータ構造を使用します。 +- **トークンブルームフィルターインデックス**: + - トークン化された文字列、およびフルテキスト検索クエリに適したブルームフィルターインデックス。 +- **Min-Max インデックス**: + - 各データ部分のカラムの最小値と最大値を維持します。指定された範囲に入らないデータ部分の読み取りをスキップするのに役立ちます。 + +## 検索インデックス + +BigQuery の[検索インデックス](https://cloud.google.com/bigquery/docs/search-index)と同様に、ClickHouse のテーブルには文字列値を有するカラムに対して[全文検索インデックス](/ja/engines/table-engines/mergetree-family/invertedindexes)を作成することができます。 + +## ベクトルインデックス + +BigQuery は最近、[ベクトルインデックス](https://cloud.google.com/bigquery/docs/vector-index)をプリ GA 機能として導入しました。同様に、ClickHouse にはベクトル検索の使用ケースを高速化するエクスペリメンタルな[インデックスのサポート](/ja/engines/table-engines/mergetree-family/annindexes)があります。 + +## パーティショニング +   +BigQuery と同様に、ClickHouse は大規模テーブルのパフォーマンスと管理性を向上させるために、テーブルをパーティションと呼ばれる小さく管理しやすい部分に分割するためのテーブルパーティショニングを使用します。ClickHouse のパーティショニングについての詳細は[こちら](/ja/engines/table-engines/mergetree-family/custom-partitioning-key)で説明しています。 + +## クラスタリング + +BigQuery のクラスタリングは、指定されたカラムの値に基づいてテーブルデータを自動的にソートし、適切なサイズのブロックに配置します。クラスタリングはクエリのパフォーマンスを向上させ、BigQuery がクエリの実行コストをより良く見積もることを可能にします。クラスタリングされたカラムにより、クエリは不要なデータのスキャンを排除します。 + +ClickHouse では、データはテーブルの主キーカラムに基づいてディスク上に自動的に[クラスタリング](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)され、クエリが主インデックスデータ構造を利用するために迅速に検索またはプルーニングされ得るブロックに論理的に整理されます。 + +## マテリアライズドビュー + +BigQuery と ClickHouse の両方がマテリアライズドビューをサポートしています。これは、パフォーマンスと効率を向上させるために、ベーステーブルに対しての変換クエリの結果に基づいた事前計算された結果です。 + +## マテリアライズドビューのクエリ + +BigQuery マテリアライズドビューは直接クエリされるか、オプティマイザによってベーステーブルをクエリする際に使用されます。ベーステーブルへの変更がマテリアライズドビューを無効にする可能性がある場合、データはベーステーブルから直接読み取られます。ベーステーブルへの変更がマテリアライズドビューを無効にしない場合、残りのデータはマテリアライズドビューから読み取られ、変更のみがベーステーブルから読み取られます。 + +ClickHouse では、マテリアライズドビューは直接クエリのみ可能です。しかし、BigQuery とは異なり(マテリアライズドビューは通常 5 分以内に自動的に更新され、[30 分おき](https://cloud.google.com/bigquery/docs/materialized-views-manage#refresh)より頻繁には更新されません)、ClickHouse のマテリアライズドビューは常にベーステーブルと同期しています。 + +**マテリアライズドビューの更新** + +BigQuery は定期的にベーステーブルに対するビューの変換クエリを実行することでマテリアライズドビューを完全に更新します。更新間隔には、マテリアライズドビューのデータをベーステーブルの新しいデータと組み合わせて一貫性のあるクエリ結果を提供しながら依然としてマテリアライズドビューを使用します。 + +ClickHouse では、マテリアライズドビューは増分で更新されます。この増分更新機構は高いスケーラビリティと低い計算コストを提供します。特にベーステーブルに数十億または数兆の行が含まれるシナリオに対して設計されています。マテリアライズドビューをベーステーブル全体から繰り返し更新する代わりに、ClickHouse は(新たに挿入されたベーステーブルの行の)値のみから部分結果を計算します。この部分結果は、バックグラウンドで以前に計算された部分結果とインクリメンタルにつながります。これにより、完全なベーステーブルから繰り返しマテリアライズドビューを更新する場合に比べて計算コストが劇的に低下します。 + +## トランザクション + +ClickHouse とは対照的に、BigQuery はセッションを使用する際、単一のクエリ内または複数のクエリにまたがるマルチステートメントトランザクションをサポートしています。マルチステートメントトランザクションにより、1 つまたは複数のテーブルで行の挿入または削除などの変異操作を実行し、変更を原子的にコミットまたはロールバックすることができます。マルチステートメントトランザクションは[ClickHouse のロードマップに2024年の予定](https://github.com/ClickHouse/ClickHouse/issues/58392)としてあります。 + +## 集約関数 + +BigQuery と比較して、ClickHouse はかなり多くの組み込み集約関数を提供しています: + +- BigQuery は [18 の集約関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_functions) と、[4 つの近似集約関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions) を持っています。 +- ClickHouse は [150 以上の組み込み集計関数](https://clickhouse.com/docs/ja/sql-reference/aggregate-functions/reference)を備えており、組み込み集計関数の挙動を[拡張](/ja/sql-reference/aggregate-functions/combinators)する強力な[集約コンビネータ](/ja/sql-reference/aggregate-functions/combinators)も備えています。たとえば、150 以上の組み込み集計関数をテーブルの行ではなく配列に適用することができ、[-Array サフィックス](/ja/sql-reference/aggregate-functions/combinators#-array)を使用するだけで済みます。[-Map サフィックス](/ja/sql-reference/aggregate-functions/combinators#-map)を使用すれば、マップに対して任意の集約関数を適用できます。[-ForEach サフィックス](/ja/sql-reference/aggregate-functions/combinators#-foreach)を使用して配列に対して任意の集約関数を適用することが可能です。 + +## データソースとファイルフォーマット + +BigQuery と比較して、ClickHouse は圧倒的に多くのファイルフォーマットとデータソースをサポートしています: + +- ClickHouse には、あらゆるデータソースから 90 以上のファイルフォーマットでデータをロードするネイティブサポートがあります。 +- BigQuery は 5 つのファイルフォーマットと 19 のデータソースをサポートしています。 + +## SQL 言語の特徴 + +ClickHouse は標準 SQL を提供しており、分析タスクに対してよりフレンドリーな多くの拡張機能と改善点を備えています。例えば、ClickHouse SQL では [ラムダ関数](/ja/sql-reference/functions#higher-order-functions---operator-and-lambdaparams-expr-function) および高次関数をサポートしており、配列に変換を適用する際にアンネス化/爆発処理を行う必要がありません。これはBigQueryのような他のシステムに対する大きな利点です。 + +## 配列 + +BigQuery の 8 つの配列関数と比較して、ClickHouse には幅広い問題をエレガントかつシンプルにモデリングおよび解決するための 80 以上の[組み込み配列関数](/ja/sql-reference/functions/array-functions)があります。 + +ClickHouse における典型的なデザインパターンは、特定のテーブルの行の値を(暫定的に)配列に変換するために[`groupArray`](/ja/sql-reference/aggregate-functions/reference/grouparray)集計関数を使用することです。これにより、配列関数を通じて便利に処理し、[`arrayJoin`](/ja/sql-reference/functions/array-join)集計関数を通じてその結果を個別のテーブル行に戻すことができます。 + +ClickHouse SQL は[高次ラムダ関数](/ja/sql-reference/functions#higher-order-functions---operator-and-lambdaparams-expr-function)をサポートしているため、多くの高度な配列操作がビルトイン配列関数の一つを単に呼び出すことで実現可能です。多くの場合、BigQuery ではそれが必要です。BigQuery では、配列の[フィルタリング](https://cloud.google.com/bigquery/docs/arrays#filtering_arrays)や[ジッピング](https://cloud.google.com/bigquery/docs/arrays#zipping_arrays)を行う際に、配列表を一時的に元に戻すことが必要でしたが、ClickHouse ではこれらの操作は高次関数[`arrayFilter`](/ja/sql-reference/functions/array-functions#arrayfilterfunc-arr1-)および[`arrayZip`](/ja/sql-reference/functions/array-functions#arrayzip)の単なる関数呼び出しです。 + +以下に、BigQuery から ClickHouse への配列操作のマッピングを示します: + +| BigQuery | ClickHouse | +|----------|------------| +| [ARRAY_CONCAT](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_concat) | [arrayConcat](/ja/sql-reference/functions/array-functions#arrayconcat) | +| [ARRAY_LENGTH](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_length) | [length](/ja/sql-reference/functions/array-functions#length) | +| [ARRAY_REVERSE](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_reverse) | [arrayReverse](/ja/sql-reference/functions/array-functions#arrayreverse) | +| [ARRAY_TO_STRING](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array_to_string) | [arrayStringConcat](/ja/sql-reference/functions/splitting-merging-functions#arraystringconcat) | +| [GENERATE_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#generate_array) | [range](/ja/sql-reference/functions/array-functions#rangeend-rangestart--end--step) | + +**サブクエリの各行に1つの要素が含まれる配列を作成** + +_BigQuery_ + +[ARRAY 関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#array) + +```sql +SELECT ARRAY + (SELECT 1 UNION ALL + SELECT 2 UNION ALL + SELECT 3) AS new_array; + +/*-----------* + | new_array | + +-----------+ + | [1, 2, 3] | + *-----------*/ +``` + +_ClickHouse_ + +[groupArray](/ja/sql-reference/aggregate-functions/reference/grouparray) 集計関数 + +```sql +SELECT groupArray(*) AS new_array +FROM +( + SELECT 1 + UNION ALL + SELECT 2 + UNION ALL + SELECT 3 +) + ┌─new_array─┐ +1. │ [1,2,3] │ + └───────────┘ +``` + +**配列をセットに変換** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーター + +```sql +SELECT * +FROM UNNEST(['foo', 'bar', 'baz', 'qux', 'corge', 'garply', 'waldo', 'fred']) + AS element +WITH OFFSET AS offset +ORDER BY offset; + +/*----------+--------* + | element | offset | + +----------+--------+ + | foo | 0 | + | bar | 1 | + | baz | 2 | + | qux | 3 | + | corge | 4 | + | garply | 5 | + | waldo | 6 | + | fred | 7 | + *----------+--------*/ +``` + +_ClickHouse_ + +[ARRAY JOIN](/ja/sql-reference/statements/select/array-join) 節 + +```sql +WITH ['foo', 'bar', 'baz', 'qux', 'corge', 'garply', 'waldo', 'fred'] AS values +SELECT element, num-1 AS offset +FROM (SELECT values AS element) AS subquery +ARRAY JOIN element, arrayEnumerate(element) AS num; + +/*----------+--------* + | element | offset | + +----------+--------+ + | foo | 0 | + | bar | 1 | + | baz | 2 | + | qux | 3 | + | corge | 4 | + | garply | 5 | + | waldo | 6 | + | fred | 7 | + *----------+--------*/ +``` + +**日付を返す配列** + +_BigQuery_ + +[GENERATE_DATE_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#generate_date_array) 関数 + +```sql +SELECT GENERATE_DATE_ARRAY('2016-10-05', '2016-10-08') AS example; + +/*--------------------------------------------------* + | example | + +--------------------------------------------------+ + | [2016-10-05, 2016-10-06, 2016-10-07, 2016-10-08] | + *--------------------------------------------------*/ +``` + +[range](https://clickhouse.com/docs/ja/sql-reference/functions/array-functions#rangeend-rangestart--end--step) + [arrayMap](/ja/sql-reference/functions/array-functions#arraymapfunc-arr1-) 関数 + +_ClickHouse_ + +```sql +SELECT arrayMap(x -> (toDate('2016-10-05') + x), range(toUInt32((toDate('2016-10-08') - toDate('2016-10-05')) + 1))) AS example + + ┌─example───────────────────────────────────────────────┐ +1. │ ['2016-10-05','2016-10-06','2016-10-07','2016-10-08'] │ + └───────────────────────────────────────────────────────┘ +``` + +**タイムスタンプを返す配列** + +_BigQuery_ + +[GENERATE_TIMESTAMP_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions#generate_timestamp_array) 関数 + +```sql +SELECT GENERATE_TIMESTAMP_ARRAY('2016-10-05 00:00:00', '2016-10-07 00:00:00', + INTERVAL 1 DAY) AS timestamp_array; + +/*--------------------------------------------------------------------------* + | timestamp_array | + +--------------------------------------------------------------------------+ + | [2016-10-05 00:00:00+00, 2016-10-06 00:00:00+00, 2016-10-07 00:00:00+00] | + *--------------------------------------------------------------------------*/ +``` + +_ClickHouse_ + +[range](https://clickhouse.com/docs/ja/sql-reference/functions/array-functions#rangeend-rangestart--end--step) + [arrayMap](/ja/sql-reference/functions/array-functions#arraymapfunc-arr1-) 関数 + +```sql +SELECT arrayMap(x -> (toDateTime('2016-10-05 00:00:00') + toIntervalDay(x)), range(dateDiff('day', toDateTime('2016-10-05 00:00:00'), toDateTime('2016-10-07 00:00:00')) + 1)) AS timestamp_array + +Query id: b324c11f-655b-479f-9337-f4d34fd02190 + + ┌─timestamp_array─────────────────────────────────────────────────────┐ +1. │ ['2016-10-05 00:00:00','2016-10-06 00:00:00','2016-10-07 00:00:00'] │ + └─────────────────────────────────────────────────────────────────────┘ +``` + +**配列のフィルタリング** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーターを通じた一時的な配列をテーブルに戻すことが必要 + +```sql +WITH Sequences AS + (SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL SELECT [5, 10] AS some_numbers) +SELECT + ARRAY(SELECT x * 2 + FROM UNNEST(some_numbers) AS x + WHERE x < 5) AS doubled_less_than_five +FROM Sequences; + +/*------------------------* + | doubled_less_than_five | + +------------------------+ + | [0, 2, 2, 4, 6] | + | [4, 8] | + | [] | + *------------------------*/ +``` + +_ClickHouse_ + +[arrayFilter](/ja/sql-reference/functions/array-functions#arrayfilterfunc-arr1-) 関数 + +```sql +WITH Sequences AS + ( + SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL + SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL + SELECT [5, 10] AS some_numbers + ) +SELECT arrayMap(x -> (x * 2), arrayFilter(x -> (x < 5), some_numbers)) AS doubled_less_than_five +FROM Sequences; + ┌─doubled_less_than_five─┐ +1. │ [0,2,2,4,6] │ + └────────────────────────┘ + ┌─doubled_less_than_five─┐ +2. │ [] │ + └────────────────────────┘ + ┌─doubled_less_than_five─┐ +3. │ [4,8] │ + └────────────────────────┘ +``` + +**配列のジッピング** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーターを通じた配列をテーブルすることが必要 + +```sql +WITH + Combinations AS ( + SELECT + ['a', 'b'] AS letters, + [1, 2, 3] AS numbers + ) +SELECT + ARRAY( + SELECT AS STRUCT + letters[SAFE_OFFSET(index)] AS letter, + numbers[SAFE_OFFSET(index)] AS number + FROM Combinations + CROSS JOIN + UNNEST( + GENERATE_ARRAY( + 0, + LEAST(ARRAY_LENGTH(letters), ARRAY_LENGTH(numbers)) - 1)) AS index + ORDER BY index + ); + +/*------------------------------* + | pairs | + +------------------------------+ + | [{ letter: "a", number: 1 }, | + | { letter: "b", number: 2 }] | + *------------------------------*/ +``` + +_ClickHouse_ + +[arrayZip](/ja/sql-reference/functions/array-functions#arrayzip) 関数 + +```sql +WITH Combinations AS + ( + SELECT + ['a', 'b'] AS letters, + [1, 2, 3] AS numbers + ) +SELECT arrayZip(letters, arrayResize(numbers, length(letters))) AS pairs +FROM Combinations; + ┌─pairs─────────────┐ +1. │ [('a',1),('b',2)] │ + └───────────────────┘ +``` + +**配列の集計** + +_BigQuery_ + +[UNNEST](https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#unnest_operator) オペレーターを通じた配列テーブルへの変換が必要 + +```sql +WITH Sequences AS + (SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL SELECT [5, 10] AS some_numbers) +SELECT some_numbers, + (SELECT SUM(x) + FROM UNNEST(s.some_numbers) AS x) AS sums +FROM Sequences AS s; + +/*--------------------+------* + | some_numbers | sums | + +--------------------+------+ + | [0, 1, 1, 2, 3, 5] | 12 | + | [2, 4, 8, 16, 32] | 62 | + | [5, 10] | 15 | + *--------------------+------*/ +``` + +_ClickHouse_ + +[arraySum](/ja/sql-reference/functions/array-functions#arraysum), [arrayAvg](/ja/sql-reference/functions/array-functions#arrayavg), … 関数、または任意の 90 以上の集約関数名を[arrayReduce](/ja/sql-reference/functions/array-functions#arrayreduce)関数の引数として使用 + +```sql +WITH Sequences AS + ( + SELECT [0, 1, 1, 2, 3, 5] AS some_numbers + UNION ALL + SELECT [2, 4, 8, 16, 32] AS some_numbers + UNION ALL + SELECT [5, 10] AS some_numbers + ) +SELECT + some_numbers, + arraySum(some_numbers) AS sums +FROM Sequences; + ┌─some_numbers──┬─sums─┐ +1. │ [0,1,1,2,3,5] │ 12 │ + └───────────────┴──────┘ + ┌─some_numbers──┬─sums─┐ +2. │ [2,4,8,16,32] │ 62 │ + └───────────────┴──────┘ + ┌─some_numbers─┬─sums─┐ +3. │ [5,10] │ 15 │ + └──────────────┴──────┘ +``` diff --git a/docs/ja/migrations/bigquery/loading-data.md b/docs/ja/migrations/bigquery/loading-data.md new file mode 100644 index 00000000000..3aa9b9e8f8a --- /dev/null +++ b/docs/ja/migrations/bigquery/loading-data.md @@ -0,0 +1,128 @@ +--- +sidebar_label: データのロード +title: BigQuery から ClickHouse へのデータのロード +slug: /ja/migrations/bigquery/loading-data +description: BigQuery から ClickHouse へのデータのロード方法 +keywords: [移行, データ, etl, elt, bigquery] +--- + +_このガイドは、ClickHouse Cloud およびセルフマネージドの場合は ClickHouse v23.5+ に対応しています。_ + +このガイドでは、[BigQuery](https://cloud.google.com/bigquery) から ClickHouse へのデータ移行の方法を説明します。 + +まず、テーブルを [Google のオブジェクトストア(GCS)](https://cloud.google.com/storage) にエクスポートし、そのデータを [ClickHouse Cloud](https://clickhouse.com/cloud) にインポートします。この手順は、BigQuery から ClickHouse にエクスポートしたい各テーブルに対して繰り返す必要があります。 + +## ClickHouseへのデータエクスポートにはどのくらい時間がかかりますか? + +BigQuery から ClickHouse へのデータエクスポートは、データセットのサイズに依存します。参考までに、このガイドを使用して [4TB の公開 Ethereum データセット](https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics) を BigQuery から ClickHouse にエクスポートするのに約1時間かかります。 + +| テーブル | 行数 | エクスポートファイル数 | データサイズ | BigQuery エクスポート | スロット時間 | ClickHouse インポート | +| --------------------------------------------------------------------------------------------------- | ------------- | ----------------- | --------- | --------------- | --------------- | ----------------- | +| [blocks](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/blocks.md) | 16,569,489 | 73 | 14.53GB | 23 秒 | 37 分 | 15.4 秒 | +| [transactions](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/transactions.md) | 1,864,514,414 | 5169 | 957GB | 1 分 38 秒 | 1 日 8 時間 | 18 分 5 秒 | +| [traces](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/traces.md) | 6,325,819,306 | 17,985 | 2.896TB | 5 分 46 秒 | 5 日 19 時間 | 34 分 55 秒 | +| [contracts](https://github.com/ClickHouse/examples/blob/main/ethereum/schemas/contracts.md) | 57,225,837 | 350 | 45.35GB | 16 秒 | 1 時間 51 分 | 39.4 秒 | +| 合計 | 8.26 billion | 23,577 | 3.982TB | 8 分 3 秒 | \> 6 日 5 時間 | 53 分 45 秒 | + +## 1. GCS へのテーブルデータのエクスポート + +このステップでは、[BigQuery SQL ワークスペース](https://cloud.google.com/bigquery/docs/bigquery-web-ui) を利用して SQL コマンドを実行します。以下では、`EXPORT DATA` ステートメントを使用して、`mytable` という BigQuery テーブルを GCS バケットにエクスポートします。 + +```sql +DECLARE export_path STRING; +DECLARE n INT64; +DECLARE i INT64; +SET i = 0; + +-- n を x billion 行に設定することを推奨します。例えば、5 billion 行なら n = 5 +SET n = 100; + +WHILE i < n DO + SET export_path = CONCAT('gs://mybucket/mytable/', i,'-*.parquet'); + EXPORT DATA + OPTIONS ( + uri = export_path, + format = 'PARQUET', + overwrite = true + ) + AS ( + SELECT * FROM mytable WHERE export_id = i + ); + SET i = i + 1; +END WHILE; +``` + +上記のクエリでは、BigQuery テーブルを [Parquet データフォーマット](https://parquet.apache.org/) にエクスポートしています。また、`uri` パラメータに `*` 文字を使用しています。これにより、エクスポートが 1GB を超える場合、出力が複数のファイルに分散され、数値が増加するサフィックスが付与されます。 + +このアプローチには以下の利点があります: + +- Google は 1 日あたり最大 50TB を無料で GCS にエクスポートできます。ユーザは GCS ストレージの料金のみを支払います。 +- エクスポートは複数のファイルを自動的に生成し、それぞれ最大 1GB のテーブルデータに制限されます。これにより、Import 時に並列化が可能になるので ClickHouse にとって有益です。 +- Parquet は列指向フォーマットのため、圧縮されており、BigQuery がより速くエクスポートし、ClickHouse がより速くクエリ できるため、より良い交換フォーマットになります。 + +## 2. GCS から ClickHouse へのデータインポート + +エクスポートが完了したら、このデータを ClickHouse テーブルにインポートすることができます。以下のコマンドを実行するには、[ClickHouse SQL コンソール](/docs/ja/integrations/sql-clients/sql-console) または [`clickhouse-client`](/docs/ja/integrations/sql-clients/cli) を使用してください。 + +最初に、ClickHouse にテーブルを[作成](/docs/ja/sql-reference/statements/create/table)する必要があります: + +```sql +-- BigQuery テーブルに STRUCT 型のカラムが含まれている場合、 +-- そのカラムを ClickHouse の Nested 型のカラムにマップする設定を有効にする必要があります。 +SET input_format_parquet_import_nested = 1; + +CREATE TABLE default.mytable +( + `timestamp` DateTime64(6), + `some_text` String +) +ENGINE = MergeTree +ORDER BY (timestamp); +``` + +テーブルを作成したら、エクスポートを加速するために、クラスター内に複数の ClickHouse レプリカがある場合は、設定 `parallel_distributed_insert_select` を有効にします。ClickHouse ノードが1つしかない場合は、この手順をスキップできます: + +```sql +SET parallel_distributed_insert_select = 1; +``` + +最後に、`SELECT` クエリの結果に基づいてテーブルにデータを挿入する [`INSERT INTO SELECT` コマンド](/docs/ja/sql-reference/statements/insert-into#inserting-the-results-of-select) を使用して、GCS から ClickHouse テーブルにデータを挿入できます。 + +データを `INSERT` するためには、[s3Cluster 関数](/docs/ja/sql-reference/table-functions/s3Cluster) を使用して GCS バケットからデータを取得します。GCS は [Amazon S3](https://aws.amazon.com/s3/) と互換性があります。ClickHouse ノードが1つしかない場合は、`s3Cluster` 関数の代わりに [s3 テーブル関数](/ja/sql-reference/table-functions/s3) を使うことができます。 + +```sql +INSERT INTO mytable +SELECT + timestamp, + ifNull(some_text, '') as some_text +FROM s3Cluster( + 'default', + 'https://storage.googleapis.com/mybucket/mytable/*.parquet.gz', + '', + '' +); +``` + +上記のクエリで使用されている `ACCESS_ID` と `SECRET` は、GCS バケットに関連付けられた [HMAC キー](https://cloud.google.com/storage/docs/authentication/hmackeys) です。 + +:::note NULL 可能なカラムをエクスポートする場合は `ifNull` を使用 +上記のクエリでは、[`ifNull` 関数](/docs/ja/sql-reference/functions/functions-for-nulls#ifnull) を使用して `some_text` カラムのデフォルト値を指定して ClickHouse テーブルにデータを挿入しています。ClickHouse のカラムを [`Nullable`](/docs/ja/sql-reference/data-types/nullable) にすることもできますが、パフォーマンスに悪影響を及ぼす可能性があるため推奨されません。 + +別の方法として、`SET input_format_null_as_default=1` を設定すると、欠落している値や NULL 値がそれぞれのカラムのデフォルト値に置き換えられます(そのデフォルトが指定されている場合)。 +::: + +## 3. データエクスポートの成功確認 + +データが正しく挿入されたかどうかを確認するには、新しいテーブルで `SELECT` クエリを実行してください: + +```sql +SELECT * FROM mytable limit 10; +``` + +他の BigQuery テーブルをエクスポートするには、上記の手順を追加の各テーブルに対して繰り返してください。 + +## さらに詳しい情報とサポート + +このガイドに加えて、[ClickHouse を使用して BigQuery を高速化し増分インポートを扱う方法](https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries)を示すブログ記事もお勧めです。 + +BigQuery から ClickHouse へのデータ転送に問題がある場合は、support@clickhouse.com までお問い合わせください。 diff --git a/docs/ja/migrations/bigquery/migrating-to-clickhouse-cloud.md b/docs/ja/migrations/bigquery/migrating-to-clickhouse-cloud.md new file mode 100644 index 00000000000..71132f2a95d --- /dev/null +++ b/docs/ja/migrations/bigquery/migrating-to-clickhouse-cloud.md @@ -0,0 +1,593 @@ +--- +title: BigQueryからClickHouse Cloudへの移行 +slug: /ja/migrations/bigquery/migrating-to-clickhouse-cloud +description: BigQueryからClickHouse Cloudへのデータ移行方法 +keywords: [migrate, migration, migrating, data, etl, elt, bigquery] +--- + +## なぜBigQueryよりもClickHouse Cloudを選ぶのか? + +TL;DR: ClickHouseは、現代のデータ分析においてBigQueryよりも高速で、安価で、強力です。 + +
    + +NEEDS ALT + +
    + +## BigQueryからClickHouse Cloudへのデータロード + +### データセット + +BigQueryからClickHouse Cloudへの典型的な移行を示すためのサンプルデータセットとして、[こちら](/ja/getting-started/example-datasets/stackoverflow)で説明されているStack Overflowデータセットを使用します。これは、2008年から2024年4月までのStack Overflow上のすべての`post`、`vote`、`user`、`comment`、および`badge`を含んでいます。このデータのBigQueryスキーマは以下の通りです: + +
    + +NEEDS ALT + +
    + +移行手順をテストするために、このデータセットをBigQueryインスタンスで構築したいユーザーのために、GCSバケットでParquet形式のデータを提供しており、BigQueryでのテーブル作成およびロード用のDDLコマンドは[こちら](https://pastila.nl/?003fd86b/2b93b1a2302cfee5ef79fd374e73f431#hVPC52YDsUfXg2eTLrBdbA==)にあります。 + +### データ移行 + +BigQueryとClickHouse Cloud間のデータ移行には、主に2つのワークロードタイプがあります: + +- **初回の一括ロードと定期的な更新** - 初回データセットの移行が必要で、その後は一定間隔での定期更新(例えば、毎日)が必要です。ここでの更新は、変更された行を再送信することで処理され、比較に使用できるカラム(例えば、日付)またはXMIN値によって識別されます。削除は、データセットの完全な定期的なリロードによって処理されます。 +- **リアルタイムレプリケーションまたはCDC** - 初回データセットの移行が必要です。このデータセットへの変更は、数秒の遅延のみが許容される状態で、ClickHouseにほぼリアルタイムで反映される必要があります。これは実質的に[Change Data Capture (CDC)プロセス](https://en.wikipedia.org/wiki/Change_data_capture)であり、BigQueryのテーブルはClickHouseと同期される必要があります、すなわちBigQueryテーブルでの挿入、更新および削除は、ClickHouse内の同等のテーブルに適用されます。 + +#### Google Cloud Storage (GCS)による一括ロード + +BigQueryはGoogleのオブジェクトストア(GCS)へのデータエクスポートをサポートしています。我々のサンプルデータセットの場合: + +1. 7つのテーブルをGCSにエクスポートします。そのためのコマンドは[こちら](https://pastila.nl/?014e1ae9/cb9b07d89e9bb2c56954102fd0c37abd#0Pzj52uPYeu1jG35nmMqRQ==)にあります。 + +2. データをClickHouse Cloudにインポートします。ここで、[gcsテーブル関数](/ja/sql-reference/table-functions/gcs)を使用します。DDLとインポートクエリは[こちら](https://pastila.nl/?00531abf/f055a61cc96b1ba1383d618721059976#Wf4Tn43D3VCU5Hx7tbf1Qw==)にあります。ClickHouse Cloudインスタンスが複数のコンピュートノードから構成されているため、`gcs`テーブル関数の代わりに、gcsバケットでも動作しデータを並列でロードする[すべてのノードを利用するs3Clusterテーブル関数](/ja/sql-reference/table-functions/s3Cluster)を使用しています。 + +
    + +NEEDS ALT + +
    + +このアプローチには以下の利点があります: + +- BigQueryエクスポート機能は、データサブセットのエクスポートをフィルタリングするためのサポートが付いています。 +- BigQueryは[Parquet, Avro, JSON, CSV](https://cloud.google.com/bigquery/docs/exporting-data)形式およびいくつかの[圧縮タイプ](https://cloud.google.com/bigquery/docs/exporting-data)へのエクスポートをサポートしており、ClickHouseはこれらすべてをサポートしています。 +- GCSは[オブジェクトライフサイクル管理](https://cloud.google.com/storage/docs/lifecycle)をサポートしており、指定した期間後にClickHouseにエクスポートおよびインポートされたデータを削除できます。 +- [Googleは1日50TBまでGCSへのエクスポートを無料で許可しています](https://cloud.google.com/bigquery/quotas#export_jobs)。ユーザーはGCSストレージのみに支払いを行います。 +- エクスポートは自動的に複数のファイルを生成し、テーブルデータを最大1GBに制限します。これにより、Importを並列化することができます。 + +以下の例を試す前に、ユーザーは[エクスポートに必要な権限](https://cloud.google.com/bigquery/docs/exporting-data#required_permissions)およびエクスポートとインポートのパフォーマンスを最大化するための[地域推薦](https://cloud.google.com/bigquery/docs/exporting-data#data-locations)をレビューすることをお勧めします。 + +### スケジュールされたクエリによるリアルタイムレプリケーションまたはCDC + +Change Data Capture (CDC) は、2つのデータベース間でテーブルを同期させておくプロセスです。更新や削除をほぼリアルタイムで処理する場合、これは非常に複雑です。1つのアプローチは、BigQueryの[スケジュールされクエリ機能](https://cloud.google.com/bigquery/docs/scheduling-queries)を使って単純に定期的なエクスポートをスケジュールすることです。ClickHouseへのデータ挿入に若干の遅延を許容できるなら、このアプローチは実装が容易で維持が簡単です。[このブログ投稿](https://clickhouse.com/blog/clickhouse-bigquery-migrating-data-for-realtime-queries#using-scheduled-queries)では、一例が示されています。 + +## スキーマの設計 + +Stack Overflowデータセットには多数の関連テーブルが含まれています。まず主となるテーブルの移行に集中することをお勧めします。これが必ずしも最大のテーブルではなく、最も分析クエリを受けると予想されるテーブルかもしれません。これはClickHouseの主要な概念に精通するための手段となるでしょう。このテーブルは、ClickHouseの特性を最大限利用し、最適なパフォーマンスを得るためにさらなるテーブルを追加する際に再モデリングが必要になるかもしれません。このモデリングプロセスは[データモデリングドキュメント](/ja/data-modeling/schema-design#next-data-modelling-techniques)で探求しています。 + +この原則に従い、主な`posts`テーブルに焦点を当てます。このためのBigQueryスキーマは以下の通りです: + +```sql +CREATE TABLE stackoverflow.posts ( + id INTEGER, + posttypeid INTEGER, + acceptedanswerid STRING, + creationdate TIMESTAMP, + score INTEGER, + viewcount INTEGER, + body STRING, + owneruserid INTEGER, + ownerdisplayname STRING, + lasteditoruserid STRING, + lasteditordisplayname STRING, + lasteditdate TIMESTAMP, + lastactivitydate TIMESTAMP, + title STRING, + tags STRING, + answercount INTEGER, + commentcount INTEGER, + favoritecount INTEGER, + conentlicense STRING, + parentid STRING, + communityowneddate TIMESTAMP, + closeddate TIMESTAMP +); +``` + +### 型の最適化 + +このプロセスを適用すると、以下のスキーマが得られます: + +```sql +CREATE TABLE stackoverflow.posts +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY tuple() +COMMENT 'Optimized types' +``` + +このテーブルには、GCSからエクスポートされたデータを[`INSERT INTO SELECT`](/ja/sql-reference/statements/insert-into)を使って簡単に投入できます。ClickHouse Cloud上では、`gcs`互換の[s3Clusterテーブル関数](/ja/sql-reference/table-functions/s3Cluster)を使って、複数ノード経由でのロードを並列化することも可能です: + +```sql +INSERT INTO stackoverflow.posts SELECT * FROM gcs( 'gs://clickhouse-public-datasets/stackoverflow/parquet/posts/*.parquet', NOSIGN); +``` + +新しいスキーマにnullは保持されていません。上記のインサートは、これらをそれぞれのタイプに対するデフォルト値に自動的に変換します- 整数の場合は0、文字列の場合は空の値です。ClickHouseは、数値を自動的に対象精度に変換します。 + +## ClickHouseの主キーはどのように異なるのか? + +[こちら](/ja/migrations/bigquery)で説明されているように、BigQueryと同様に、ClickHouseはテーブルの主キーのカラム値の一意性を強制しません。 + +BigQueryのクラスタリングと似ていて、ClickHouseテーブルのデータは主キーのカラムによりディスク上で並べ替えられて保存されます。このソート順序は、クエリオプティマイザによってソートを回避し、結合のメモリ使用を最小化し、リミット句のショートカットを可能にします。 +BigQueryとは対照的に、ClickHouseは主キーのカラム値に基づいて[(スパースな)主インデックス](/ja/optimize/sparse-primary-indexes)を自動的に作成します。このインデックスは主キーのカラム上でフィルタがあるすべてのクエリを高速化するために利用されます。具体的には: + +- メモリとディスクの効率性は、ClickHouseがしばしば使用されるスケールの重要な要素です。データは部分と呼ばれるチャンクに分かれてClickHouseテーブルに書き込まれ、バックグラウンドで結合のルールが適用されます。ClickHouseでは、各部分は自分自身の主インデックスを持ちます。部分が結合されるとき、結合した部分の主インデックスも結合されます。これらのインデックスは各行ごとに構築されていません。代わりに、部分の主インデックスは行のグループごとに1つのインデックスエントリを持ちます- これはスパースインデキシングと呼ばれる技術です。 +- スパースインデキシングは、ClickHouseが指定されたキーによってディスク上の部分を並べて保存するため可能です。単一行を直接特定する(B-Treeベースのインデックスのように)のではなく、スパース主インデックスはクエリに一致する可能性のある行のグループをすばやくバイナリ検索によって特定します。一致する可能性のある行のグループは並列でClickHouseエンジンにストリームされ、マッチを見つけます。このインデックス設計により、主インデックスが小さく(主メモリに完全に収まる)なりつつ、特にデータ分析の使用例で典型的な範囲クエリの実行時間を大幅に短縮します。詳しい情報については、[この詳細ガイド](/ja/optimize/sparse-primary-indexes)をお勧めします。 + +
    + +NEEDS ALT + +
    + +選択されたClickHouseの主キーは、インデックスだけでなく、データのディスクへの書き込み順序も決定します。このため、これは圧縮レベルに大きな影響を与える可能性があります。そして、それはクエリパフォーマンスに影響を与えることができます。すべてのカラムは指定された順序キーの値に基づいてソートされます。例えば`CreationDate`がキーとして使われる場合、すべての他のカラムの値の順序は`CreationDate`カラムの値の順序に対応します。複数の順序キーを指定することができます - これは`SELECT`クエリの`ORDER BY`句と同じセマンティクスで順序付けされます。 + +### 順序キーの選択 + +順序キーの選択における考慮事項とステップについて、例としてpostsテーブルを使用した場合は[こちら](/ja/data-modeling/schema-design#choosing-an-ordering-key)を参照してください。 + +## データモデリング技術 + +BigQueryから移行するユーザーには、[ClickHouseでのデータモデリングガイド](/ja/data-modeling/schema-design)を読むことをお勧めします。このガイドは同じStack Overflowデータセットを使用し、ClickHouseの機能を使用した複数のアプローチを探ります。 + +### パーティション + +BigQueryのユーザーは、テーブルを小さく管理しやすいパーツ(パーティション)に分割することで、大規模なデータベースのパフォーマンスと管理を向上させる方法であるテーブルパーティションの概念に親しんでいるでしょう。このパーティションは、指定されたカラムの範囲(例:日付)、定義されたリスト、またはキーに基づくハッシュによって達成されます。これにより、管理者は特定の基準(例:日付範囲や地理的な位置)に基づいてデータを整理できます。 + +パーティション化は、パーティションプルーニングを通じて迅速なデータアクセスと効率的なインデックス作成を実現し、クエリ性能を向上させます。また、バックアップやデータ削除などの保守タスクを個別のパーティション上で実行できるようにし、テーブル全体に対して操作せずに済むようにします。それにより、パーティション化は複数のパーティション間で負荷を分散することで、BigQueryデータベースのスケーラビリティを大幅に向上させます。 + +ClickHouseでは、パーティション化は最初に表を定義する際に[`PARTITION BY`](/ja/engines/table-engines/mergetree-family/custom-partitioning-key)句によって指定されます。この句は、任意のカラムのSQL式を含むことができ、この結果によって行がどのパーティションに送られるかが定義されます。 + +
    + +NEEDS ALT + +
    + +データパーツはディスク上で各パーティションに論理的に関連付き、単独でクエリを実行できます。以下の例では、[`toYear(CreationDate)`](/ja/sql-reference/functions/date-time-functions#toyear)を使用して年ごとに投稿テーブルをパーティション化しています。行がClickHouseに挿入されるとき、この式は各行に対して評価され、クエリ中に結果パーティションにルーティングされます。 + +```sql +CREATE TABLE posts +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), +... + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) +PARTITION BY toYear(CreationDate) +``` + +#### アプリケーション + +ClickHouseのパーティション化は、BigQueryにおける同様のアプリケーションを持っていますが、いくつかの微妙な違いがあります。具体的には: + +- **データ管理** - ClickHouseでは、ユーザーは主にパーティションをデータ管理機能と見なすべきです。データを特定のキーに基づいて論理的に分割することで、各パーティションに個別に操作を加えられるようになります。これにより、ユーザーはパーティションを権利により迅速に移動したり、[ストレージティアにデータを動かしたり](/ja/integrations/s3#storage-tiers)するなどの効率的な操作が可能になります。例として、古いポストを削除する場合: + +```sql +SELECT DISTINCT partition +FROM system.parts +WHERE `table` = 'posts' + +┌─partition─┐ +│ 2008 │ +│ 2009 │ +│ 2010 │ +│ 2011 │ +│ 2012 │ +│ 2013 │ +│ 2014 │ +│ 2015 │ +│ 2016 │ +│ 2017 │ +│ 2018 │ +│ 2019 │ +│ 2020 │ +│ 2021 │ +│ 2022 │ +│ 2023 │ +│ 2024 │ +└───────────┘ + +17 rows in set. Elapsed: 0.002 sec. + + ALTER TABLE posts + (DROP PARTITION '2008') + +Ok. + +0 rows in set. Elapsed: 0.103 sec. +``` + +- **クエリ最適化** - パーティションはクエリ性能に役立つ可能性がありますが、これがどの程度の利点をもたらすかはアクセスパターンに大きく依存します。クエリが少数のパーティション(理想的にはひとつ)に限定されている場合、パフォーマンスが向上する可能性があります。これは、通常、主キーにないパーティションキーでフィルタリングする場合に役立ちます。しかし、多くのパーティションをカバーするクエリは、パーティションが使用されない場合よりもクエリ性能が低下する可能性があります(パーティションによって可能な部分が増加するため)。パーティションを利用して`GROUP BY`クエリを最適化することができますが、これは各パーティション内の値がユニークである場合のみ効果的です。しかし、一般的には主キーが最適化されていることを確認し、アクセスパターンが特定の予測可能なサブセットに絞られている特別な場合にのみクエリ最適化技法としてパーティション化を検討すべきです、例えば日付でパーティション化し、最近の日付のクエリが多い場合に有用です。 + +#### 推奨事項 + +パーティション化はデータ管理技術であると考えるべきです。これは、時系列データの操作時、例えば最も古いパーティションを[単に削除する](/ja/sql-reference/statements/alter/partition#alter_drop-partition)といった方法でクラスタからデータを削除する必要がある場合に理想的です。 + +重要:パーティションキーの式が高いカーディナリティのセットを生成しないようにしてください、すなわち100以上のパーティションの作成は避けるべきです。例えば、クライアント識別子や名前といった高カーディナリティカラムでデータをパーティション化しないでください。代わりに、クライアント識別子や名前を`ORDER BY`式の最初のカラムにします。 + +> 内部的に、ClickHouseは挿入されたデータの[部分を作成](/ja/optimize/sparse-primary-indexes#clickhouse-index-design)します。より多くのデータが挿入されると、部分の数が増加します。部分の数が指定された制限を超えた場合、ClickHouseは["too many parts"エラー](/docs/knowledgebase/exception-too-many-parts)として設定されたルールに従って挿入時に例外を投げます。これは通常の操作下では発生しません。ClickHouseが不適切に設定されている場合や間違って使用されている場合(例:多くの小さい挿入)だけです。部分はパーティションごとに分離して作成されるため、パーティション数を増やすことは部分の数も増加させます。高カーディナリティのパーティションキーはこのエラーを引き起こす可能性があるので避けるべきです。 + +## Materialized ViewとProjectionの違い + +ClickHouseのプロジェクションの概念により、ユーザーはテーブルの複数の`ORDER BY`句を指定できます。 + +[ClickHouseのデータモデリング](/ja/data-modeling/schema-design)では、ClickHouseにおいて集計を事前計算するためにMaterialized Viewを使用し、行を変換し、異なるアクセスパターンのクエリを最適化する方法について探ります。後者については、Materialized Viewが行を異なる順序のターゲットテーブルに送信する場合の[例を提供しました](/ja/materialized-view#lookup-table)。 + +例えば、次のクエリを考えてみてください: + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ + │ 0.18181818181818182 │ + └────────────────────┘ + +1 row in set. Elapsed: 0.040 sec. Processed 90.38 million rows, 361.59 MB (2.25 billion rows/s., 9.01 GB/s.) +Peak memory usage: 201.93 MiB. +``` + +このクエリは`UserId`が順序キーではないため、すべての90m行をスキャンする必要があります。以前は、リッチアップ用のMaterialized Viewを使って`PostId`のLOOKUPを提供しました。プロジェクションを用いても同じ問題を解決できます。以下のコマンドは`ORDER BY user_id`のプロジェクションを追加します。 + +```sql +ALTER TABLE comments ADD PROJECTION comments_user_id ( +SELECT * ORDER BY UserId +) + +ALTER TABLE comments MATERIALIZE PROJECTION comments_user_id +``` + +最初にプロジェクションを作成し、その後にマテリアライズしなければなりません。この後者のコマンドはデータを2回異なる順序でディスクに保存させます。プロジェクションは、以下に示すようにデータが作成されるときに定義することもでき、挿入されるデータに応じて自動的に保守されます。 + +```sql +CREATE TABLE comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String), + PROJECTION comments_user_id + ( + SELECT * + ORDER BY UserId + ) +) +ENGINE = MergeTree +ORDER BY PostId +``` + +プロジェクションが`ALTER`コマンドを介して作成される場合、`MATERIALIZE PROJECTION`コマンドが発行されたときに作成は非同期です。ユーザーは次のクエリを使ってこの操作の進捗を確認し、`is_done=1`を待つことができます。 + +```sql +SELECT + parts_to_do, + is_done, + latest_fail_reason +FROM system.mutations +WHERE (`table` = 'comments') AND (command LIKE '%MATERIALIZE%') + + ┌─parts_to_do─┬─is_done─┬─latest_fail_reason─┐ +1. │ 1 │ 0 │ │ + └─────────────┴─────────┴────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +このクエリを繰り返すと、追加のストレージを使用する代わりにパフォーマンスが大幅に向上していることが確認できます。 + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. Processed 16.36 thousand rows, 98.17 KB (2.15 million rows/s., 12.92 MB/s.) +Peak memory usage: 4.06 MiB. +``` + +[`EXPLAIN`コマンド](/ja/sql-reference/statements/explain)を使用して、このクエリにプロジェクションが使用されたことを確認することもできます: + +```sql +EXPLAIN indexes = 1 +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌─explain─────────────────────────────────────────────┐ + 1. │ Expression ((Projection + Before ORDER BY)) │ + 2. │ Aggregating │ + 3. │ Filter │ + 4. │ ReadFromMergeTree (comments_user_id) │ + 5. │ Indexes: │ + 6. │ PrimaryKey │ + 7. │ Keys: │ + 8. │ UserId │ + 9. │ Condition: (UserId in [8592047, 8592047]) │ +10. │ Parts: 2/2 │ +11. │ Granules: 2/11360 │ + └─────────────────────────────────────────────────────┘ + +11 rows in set. Elapsed: 0.004 sec. +``` + +### プロジェクションの使用時期 + +プロジェクションは自動的に保守されるため、新しいユーザーには魅力的です。さらに、一つのテーブルに単にクエリを送信し、プロジェクションによって可能な場合に応じて応答時間を短縮できます。 + +
    + +NEEDS ALT + +
    + +これは、ユーザーが適切な最適化済ターゲットテーブルを選ぶか、フィルタに応じてクエリを書き換える必要があるMaterialized Viewとは対照的です。これにより、ユーザーアプリケーションにより大きな重点が置かれ、クライアント側の複雑さが増します。 + +これらの利点にもかかわらず、プロジェクションにはいくつかの制約があり、ユーザーはこれを認識し、慎重に展開するべきです: + +- プロジェクションは、元のテーブルと異なる有効期限(TTL)を使用することはできません。Materialized viewで異なるTTLを使用することができます。 +- プロジェクションは、(サードテーブル)において現在[`optimize_read_in_order`](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes)をサポートしていません。 +- プロジェクションを持つテーブルには論理更新や削除がサポートされていません。 +- Materialized viewはチェーン可能:あるMaterialized viewのターゲットテーブルが別のMaterialized viewのソーステーブルになることができ、さらに続けることができます。プロジェクションではこれは不可能です。 +- プロジェクションはジョインをサポートしていませんが、Materialized viewはサポートしています。 +- プロジェクションはフィルタ(`WHERE`句)をサポートしていませんが、Materialized viewはサポートしています。 + +プロジェクションを使うことをお勧めする場合: + +- データの完全な並べ替えが必要です。プロジェクション内の式は理論的には`GROUP BY`を用いることができますが、Materialized viewの方が集計を保守するにはより効果的です。クエリオプティマイザも単純な並べ替えを使用するプロジェクションの方が`SELECT * ORDER BY x`によるものとして利用しやすくなっています。ユーザーはストレージフットプリントを削減するために、この式で一部のカラムを選択することができます。 +- データを2回書き込むことによるストレージフットプリントの拡大、およびオーバーヘッドに慣れている。挿入速度への影響をテストし、[ストレージオーバーヘッドを評価](/ja/data-compression/compression-in-clickhouse)します。 + +## BigQueryクエリのClickHouseへの書き換え + +以下は、BigQueryとClickHouseを比較するクエリの例を提供します。このリストは、ClickHouseの機能を利用してクエリを大幅に簡素化する方法を示しています。以下の例は、Stack Overflowデータセット(2024年4月まで)を使用しています。 + +**10個以上の質問を持つユーザーで最も多くビューを得たもの:** + +_BigQuery_ + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +SELECT + OwnerDisplayName, + sum(ViewCount) AS total_views +FROM stackoverflow.posts +WHERE (PostTypeId = 'Question') AND (OwnerDisplayName != '') +GROUP BY OwnerDisplayName +HAVING count() > 10 +ORDER BY total_views DESC +LIMIT 5 + + ┌─OwnerDisplayName─┬─total_views─┐ +1. │ Joan Venge │ 25520387 │ +2. │ Ray Vega │ 21576470 │ +3. │ anon │ 19814224 │ +4. │ Tim │ 19028260 │ +5. │ John │ 17638812 │ + └──────────────────┴─────────────┘ + +5 rows in set. Elapsed: 0.076 sec. Processed 24.35 million rows, 140.21 MB (320.82 million rows/s., 1.85 GB/s.) +Peak memory usage: 323.37 MiB. +``` + +**最も多くのビューを受けたタグ:** + +_BigQuery_ + +
    + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +-- ClickHouse +SELECT + arrayJoin(arrayFilter(t -> (t != ''), splitByChar('|', Tags))) AS tags, + sum(ViewCount) AS views +FROM stackoverflow.posts +GROUP BY tags +ORDER BY views DESC +LIMIT 5 + + + ┌─tags───────┬──────views─┐ +1. │ javascript │ 8190916894 │ +2. │ python │ 8175132834 │ +3. │ java │ 7258379211 │ +4. │ c# │ 5476932513 │ +5. │ android │ 4258320338 │ + └────────────┴────────────┘ + +5 rows in set. Elapsed: 0.318 sec. Processed 59.82 million rows, 1.45 GB (188.01 million rows/s., 4.54 GB/s.) +Peak memory usage: 567.41 MiB. +``` + +## 集計関数 + +可能な限り、ユーザーはClickHouseの集計関数を利用すべきです。以下では、各年で最もビューの多い質問を計算するために[`argMax`関数](/ja/sql-reference/aggregate-functions/reference/argmax)を使用する例を示しています。 + +_BigQuery_ + +
    + +NEEDS ALT + +
    + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +-- ClickHouse +SELECT + toYear(CreationDate) AS Year, + argMax(Title, ViewCount) AS MostViewedQuestionTitle, + max(ViewCount) AS MaxViewCount +FROM stackoverflow.posts +WHERE PostTypeId = 'Question' +GROUP BY Year +ORDER BY Year ASC +FORMAT Vertical + + +Row 1: +────── +Year: 2008 +MostViewedQuestionTitle: How to find the index for a given item in a list? +MaxViewCount: 6316987 + +Row 2: +────── +Year: 2009 +MostViewedQuestionTitle: How do I undo the most recent local commits in Git? +MaxViewCount: 13962748 + +… + +Row 16: +─────── +Year: 2023 +MostViewedQuestionTitle: How do I solve "error: externally-managed-environment" every time I use pip 3? +MaxViewCount: 506822 + +Row 17: +─────── +Year: 2024 +MostViewedQuestionTitle: Warning "Third-party cookie will be blocked. Learn more in the Issues tab" +MaxViewCount: 66975 + +17 rows in set. Elapsed: 0.225 sec. Processed 24.35 million rows, 1.86 GB (107.99 million rows/s., 8.26 GB/s.) +Peak memory usage: 377.26 MiB. +``` + +## 条件式と配列 + +条件式と配列関数はクエリを大幅に簡素化します。次のクエリは、2022年から2023年にかけて最も割合増加したタグ(10000件以上の出現数があるもの)を計算します。次のClickHouseクエリは、条件式、配列関数、および`HAVING`や`SELECT`句でのエイリアス再利用の能力により簡潔です。 + +_BigQuery_ + +
    + +NEEDS ALT + +
    + +_ClickHouse_ + +```sql +SELECT + arrayJoin(arrayFilter(t -> (t != ''), splitByChar('|', Tags))) AS tag, + countIf(toYear(CreationDate) = 2023) AS count_2023, + countIf(toYear(CreationDate) = 2022) AS count_2022, + ((count_2023 - count_2022) / count_2022) * 100 AS percent_change +FROM stackoverflow.posts +WHERE toYear(CreationDate) IN (2022, 2023) +GROUP BY tag +HAVING (count_2022 > 10000) AND (count_2023 > 10000) +ORDER BY percent_change DESC +LIMIT 5 + +┌─tag─────────┬─count_2023─┬─count_2022─┬──────percent_change─┐ +│ next.js │ 13788 │ 10520 │ 31.06463878326996 │ +│ spring-boot │ 16573 │ 17721 │ -6.478189718413183 │ +│ .net │ 11458 │ 12968 │ -11.644046884639112 │ +│ azure │ 11996 │ 14049 │ -14.613139725247349 │ +│ docker │ 13885 │ 16877 │ -17.72826924216389 │ +└─────────────┴────────────┴────────────┴─────────────────────┘ + +5 rows in set. Elapsed: 0.096 sec. Processed 5.08 million rows, 155.73 MB (53.10 million rows/s., 1.63 GB/s.) +Peak memory usage: 410.37 MiB. +``` + +これで、BigQueryからClickHouseへのユーザー移行用の基本ガイドが終了します。BigQueryからの移行を行うユーザーには、[ClickHouseでのデータモデリングガイド](/ja/data-modeling/schema-design)を読み、高度なClickHouseの機能を学ぶことをお勧めします。 +``` diff --git a/docs/ja/migrations/images/bigquery-1.png b/docs/ja/migrations/images/bigquery-1.png new file mode 100644 index 00000000000..413f5edfce5 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-1.png differ diff --git a/docs/ja/migrations/images/bigquery-10.png b/docs/ja/migrations/images/bigquery-10.png new file mode 100644 index 00000000000..250ba4635f6 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-10.png differ diff --git a/docs/ja/migrations/images/bigquery-11.png b/docs/ja/migrations/images/bigquery-11.png new file mode 100644 index 00000000000..aa09b54513e Binary files /dev/null and b/docs/ja/migrations/images/bigquery-11.png differ diff --git a/docs/ja/migrations/images/bigquery-12.png b/docs/ja/migrations/images/bigquery-12.png new file mode 100644 index 00000000000..c57f50b6413 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-12.png differ diff --git a/docs/ja/migrations/images/bigquery-2.png b/docs/ja/migrations/images/bigquery-2.png new file mode 100644 index 00000000000..a1613c3268f Binary files /dev/null and b/docs/ja/migrations/images/bigquery-2.png differ diff --git a/docs/ja/migrations/images/bigquery-3.png b/docs/ja/migrations/images/bigquery-3.png new file mode 100644 index 00000000000..6547a43d4cc Binary files /dev/null and b/docs/ja/migrations/images/bigquery-3.png differ diff --git a/docs/ja/migrations/images/bigquery-4.png b/docs/ja/migrations/images/bigquery-4.png new file mode 100644 index 00000000000..53d05579c52 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-4.png differ diff --git a/docs/ja/migrations/images/bigquery-5.png b/docs/ja/migrations/images/bigquery-5.png new file mode 100644 index 00000000000..381771653df Binary files /dev/null and b/docs/ja/migrations/images/bigquery-5.png differ diff --git a/docs/ja/migrations/images/bigquery-6.png b/docs/ja/migrations/images/bigquery-6.png new file mode 100644 index 00000000000..4af18b8994e Binary files /dev/null and b/docs/ja/migrations/images/bigquery-6.png differ diff --git a/docs/ja/migrations/images/bigquery-7.png b/docs/ja/migrations/images/bigquery-7.png new file mode 100644 index 00000000000..b7b710beb24 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-7.png differ diff --git a/docs/ja/migrations/images/bigquery-8.png b/docs/ja/migrations/images/bigquery-8.png new file mode 100644 index 00000000000..1411c2f771a Binary files /dev/null and b/docs/ja/migrations/images/bigquery-8.png differ diff --git a/docs/ja/migrations/images/bigquery-9.png b/docs/ja/migrations/images/bigquery-9.png new file mode 100644 index 00000000000..4d3a686bb58 Binary files /dev/null and b/docs/ja/migrations/images/bigquery-9.png differ diff --git a/docs/ja/migrations/images/migrate_snowflake_clickhouse.png b/docs/ja/migrations/images/migrate_snowflake_clickhouse.png new file mode 100644 index 00000000000..9367121610a Binary files /dev/null and b/docs/ja/migrations/images/migrate_snowflake_clickhouse.png differ diff --git a/docs/ja/migrations/images/postgres-b-tree.png b/docs/ja/migrations/images/postgres-b-tree.png new file mode 100644 index 00000000000..9198fc18489 Binary files /dev/null and b/docs/ja/migrations/images/postgres-b-tree.png differ diff --git a/docs/ja/migrations/images/postgres-partitions.png b/docs/ja/migrations/images/postgres-partitions.png new file mode 100644 index 00000000000..4af18b8994e Binary files /dev/null and b/docs/ja/migrations/images/postgres-partitions.png differ diff --git a/docs/ja/migrations/images/postgres-projections.png b/docs/ja/migrations/images/postgres-projections.png new file mode 100644 index 00000000000..b7b710beb24 Binary files /dev/null and b/docs/ja/migrations/images/postgres-projections.png differ diff --git a/docs/ja/migrations/images/postgres-replacingmergetree.png b/docs/ja/migrations/images/postgres-replacingmergetree.png new file mode 100644 index 00000000000..4c72c61a71d Binary files /dev/null and b/docs/ja/migrations/images/postgres-replacingmergetree.png differ diff --git a/docs/ja/migrations/images/postgres-sparse-index.png b/docs/ja/migrations/images/postgres-sparse-index.png new file mode 100644 index 00000000000..381771653df Binary files /dev/null and b/docs/ja/migrations/images/postgres-sparse-index.png differ diff --git a/docs/ja/migrations/images/postgres-stackoverflow-schema.png b/docs/ja/migrations/images/postgres-stackoverflow-schema.png new file mode 100644 index 00000000000..6e3f7595a93 Binary files /dev/null and b/docs/ja/migrations/images/postgres-stackoverflow-schema.png differ diff --git a/docs/ja/migrations/postgres/data-modeling-techniques.md b/docs/ja/migrations/postgres/data-modeling-techniques.md new file mode 100644 index 00000000000..22743c4be38 --- /dev/null +++ b/docs/ja/migrations/postgres/data-modeling-techniques.md @@ -0,0 +1,238 @@ +--- +slug: /ja/migrations/postgresql/data-modeling-techniques +title: データモデリング手法 +description: PostgreSQLからClickHouseへの移行のためのデータモデリング +keywords: [postgres, postgresql, migrate, migration, data modeling] +--- + +> これは、PostgreSQLからClickHouseへの移行に関するガイドの**パート3**です。このコンテンツは入門的なものであり、ユーザーがClickHouseのベストプラクティスに準拠した初期の機能的なシステムを展開するのを助けることを目的としています。複雑なトピックを避け、完全に最適化されたスキーマにはなりませんが、本番システムを構築し、学習をベースにするための堅実な基盤を提供します。 + +Postgresから移行するユーザーには、[ClickHouseでのデータモデリングに関するガイド](/ja/data-modeling/schema-design)を読むことをお勧めします。このガイドでは、同じStack Overflowデータセットを使用し、ClickHouseの機能を使用した複数のアプローチを探求します。 + +## パーティション + +Postgresユーザーは、大規模なデータベースのパフォーマンスと管理性を向上させるために、テーブルをより小さく管理しやすい部分に分割するテーブルパーティショニングの概念に慣れています。パーティショニングは、指定されたカラム(例:日付)の範囲、定義されたリスト、またはキーのハッシュを使用して達成されます。これにより、管理者は日付範囲や地理的な位置などの特定の基準に基づいてデータを整理することができます。パーティショニングは、パーティションプルーニングによるより高速なデータアクセスとより効率的なインデックス化を可能にすることでクエリのパフォーマンスを向上させます。また、バックアップやデータのパージのような保守作業を個々のパーティションで実行できるようにすることで効率を高めます。さらに、複数のパーティションに負荷を分散することで、PostgreSQLデータベースのスケーラビリティを大幅に向上させることができます。 + +ClickHouseでは、パーティショニングはテーブルが最初に定義される際に`PARTITION BY`句を通じて指定されます。この句には、任意のカラムに対するSQL式を含むことができ、その結果がどのパーティションに行を送るかを決定します。 + +
    + +NEEDS ALT + +
    + +データパーツはディスク上で各パーティションに論理的に関連付けられ、個別にクエリを実行することができます。以下の例では、`posts`テーブルを`toYear(CreationDate)`という式を使用して年ごとにパーティション分割します。行がClickHouseに挿入されると、この式が各行に対して評価され、該当するパーティションが存在する場合にルーティングされます(もし行がその年の最初のものであれば、パーティションが作成されます)。 + +```sql +CREATE TABLE posts +( + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), +... + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = MergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate) +PARTITION BY toYear(CreationDate) +``` + +## パーティションの利用法 + +ClickHouseにおけるパーティショニングには、Postgresと同様の利用法がありますが、いくつか微妙な違いがあります。具体的には以下の通りです: + +- **データ管理** - ClickHouseでは、ユーザーは主にパーティショニングをデータ管理の機能と考えるべきであり、クエリの最適化技術とは考えないでください。キーに基づいてデータを論理的に分離することで、それぞれのパーティションを独立して操作することができます(例:削除)。これにより、パーティションを移動させることができるため、時間に応じて効率的に[ストレージ階層間で](/ja/integrations/s3#storage-tiers)サブネットを移動させたり、[データを期限切れにする/効率的にクラスターから削除する](/ja/sql-reference/statements/alter/partition)ことができます。例えば、以下では2008年の投稿を削除します。 + +```sql +SELECT DISTINCT partition +FROM system.parts +WHERE `table` = 'posts' + +┌─partition─┐ +│ 2008 │ +│ 2009 │ +│ 2010 │ +│ 2011 │ +│ 2012 │ +│ 2013 │ +│ 2014 │ +│ 2015 │ +│ 2016 │ +│ 2017 │ +│ 2018 │ +│ 2019 │ +│ 2020 │ +│ 2021 │ +│ 2022 │ +│ 2023 │ +│ 2024 │ +└───────────┘ + +17 rows in set. Elapsed: 0.002 sec. + + ALTER TABLE posts + (DROP PARTITION '2008') + +Ok. + +0 rows in set. Elapsed: 0.103 sec. +``` + +- **クエリの最適化** - パーティションはクエリのパフォーマンスに役立つことがありますが、これはアクセスパターンに大きく依存します。クエリが数個(理想的には1つ)のパーティションのみをターゲットとする場合、性能が向上する可能性があります。これは通常、パーティショニングキーが主キーに含まれておらず、それでフィルタリングを行う場合に有用です。しかし、多くのパーティションをカバーする必要があるクエリは、パーティショニングを使用しない場合よりも性能が悪化する可能性があります(その結果、より多くのパーツが発生する可能性があるため)。特定のパーティションをターゲットとするメリットは、既に主キーの初期エントリとしてパーティショニングキーがある場合、存在しないかのように低下します。パーティショニングはまた、各パーティションの値がユニークである場合に[GROUP BYクエリを最適化](/ja/engines/table-engines/mergetree-family/custom-partitioning-key#group-by-optimisation-using-partition-key)するためにも使用できます。しかし一般的に、ユーザーは主キーが最適化されていることを確認し、特定の予測可能なサブセットへのアクセスパターンがある例外的な場合にのみ、クエリ最適化技術としてパーティショニングを検討すべきです。例:日ごとにパーティショニングし、ほとんどのクエリが過去1日以内に行われる場合。 + +## パーティションに関する推奨事項 + +ユーザーはパーティショニングをデータ管理の技術として考慮すべきです。これは、タイムシリーズデータを扱う際にクラスタからデータを期限切れにする必要がある場合に理想的です。例:最古のパーティションを[単に削除](/ja/sql-reference/statements/alter/partition#alter_drop-partition)することができます。 + +**重要:** パーティショニングキーの式が高カーディナリティのセットつまり100を超えるパーティションを生成しないことを確認してください。例えば、クライアント識別子や名前のような高カーディナリティのカラムでデータをパーティショニングしないでください。代わりに、クライアント識別子や名前をORDER BY式の最初のカラムにしてください。 + +> 内部的には、ClickHouseは挿入されたデータに対して[パーツを生成します](/ja/optimize/sparse-primary-indexes#clickhouse-index-design)。データが多く挿入されるにつれて、パーツの数が増加します。クエリの性能を低下させる非常に多くのパーツを防ぐために、パーツはバックグラウンドの非同期プロセスで統合されます。パーツの数が設定された制限を超えると、ClickHouseは挿入時に例外をスローします。この問題は通常の操作下で発生せず、ClickHouseが誤って設定されているか誤って使用されている場合にのみ発生します。例:多くの小さな挿入。 + +> パーツはパーティションごとに個別に作成されるため、パーティションの数が増えるとパーツの数も増えます。これはパーティション数の倍数です。したがって、高カーディナリティのパーティショニングキーはこのエラーを引き起こす可能性があるため、避けるべきです。 + +## マテリアライズドビューとプロジェクション + +Postgresでは、単一のテーブルに複数のインデックスを作成することで、さまざまなアクセスパターンを最適化できます。この柔軟性により、管理者と開発者は特定のクエリと運用ニーズに合わせてデータベースのパフォーマンスを調整することができます。ClickHouseのプロジェクションの概念はそれと完全に同一ではありませんが、テーブルに対して複数の`ORDER BY`句を指定することができます。 + +ClickHouse [データモデリングドキュメント](/ja/data-modeling/schema-design)では、ClickHouseにおいてマテリアライズドビューがどのようにして集計を事前計算したり、行を変換したり、さまざまなアクセスパターンに基づいてクエリを最適化するために使用できるかを探求しています。 + +これに関連して、[前述の例](/ja/materialized-view#lookup-table)では、マテリアライズドビューが挿入を受ける元のテーブルとは別の順序キーで行をターゲットテーブルに送信する使い方を示しました。 + +例えば、次のクエリを考えてみてください: + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.040 sec. Processed 90.38 million rows, 361.59 MB (2.25 billion rows/s., 9.01 GB/s.) +Peak memory usage: 201.93 MiB. +``` + +このクエリは`UserId`がオーダリングキーではないため、全90m行を(比較的高速に)スキャンする必要があります。以前は、PostIdのルックアップとして機能するマテリアライズドビューを使用してこの問題を解決しました。同じ問題はプロジェクションを使用して解決することができます。以下のコマンドは`ORDER BY user_id`のプロジェクションを追加します。 + +```sql +ALTER TABLE comments ADD PROJECTION comments_user_id ( +SELECT * ORDER BY UserId +) + +ALTER TABLE comments MATERIALIZE PROJECTION comments_user_id +``` + +プロジェクションを最初に作成し、それをマテリアライズする必要があることに注意してください。この後者のコマンドは、データをディスク上に2回異なる順序で保持します。以下に示すように、データが作成される際にプロジェクションを定義することも可能であり、データが挿入されると自動的に維持されます。 + +```sql +CREATE TABLE comments +( + `Id` UInt32, + `PostId` UInt32, + `Score` UInt16, + `Text` String, + `CreationDate` DateTime64(3, 'UTC'), + `UserId` Int32, + `UserDisplayName` LowCardinality(String), + PROJECTION comments_user_id + ( + SELECT * + ORDER BY UserId + ) +) +ENGINE = MergeTree +ORDER BY PostId +``` + +`ALTER`でプロジェクションが作成される場合、`MATERIALIZE PROJECTION`コマンドが発行されると、作成は非同期になります。ユーザーは以下のクエリを使用してこの操作の進行状況を確認し、`is_done=1`を待ちます。 + +```sql +SELECT + parts_to_do, + is_done, + latest_fail_reason +FROM system.mutations +WHERE (`table` = 'comments') AND (command LIKE '%MATERIALIZE%') + + ┌─parts_to_do─┬─is_done─┬─latest_fail_reason─┐ +1. │ 1 │ 0 │ │ + └─────────────┴─────────┴────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +上記のクエリを再実行すると、追加のストレージが必要となる代わりにパフォーマンスが大幅に改善されたことがわかります。 + +```sql +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌──────────avg(Score)─┐ +1. │ 0.18181818181818182 │ + └─────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. Processed 16.36 thousand rows, 98.17 KB (2.15 million rows/s., 12.92 MB/s.) +Peak memory usage: 4.06 MiB. +``` + +`EXPLAIN`コマンドを使用して、このクエリを供給するためにプロジェクションが使用されたことも確認できます: + +```sql +EXPLAIN indexes = 1 +SELECT avg(Score) +FROM comments +WHERE UserId = 8592047 + + ┌─explain─────────────────────────────────────────────┐ + 1. │ Expression ((Projection + Before ORDER BY)) │ + 2. │ Aggregating │ + 3. │ Filter │ + 4. │ ReadFromMergeTree (comments_user_id) │ + 5. │ Indexes: │ + 6. │ PrimaryKey │ + 7. │ Keys: │ + 8. │ UserId │ + 9. │ Condition: (UserId in [8592047, 8592047]) │ +10. │ Parts: 2/2 │ +11. │ Granules: 2/11360 │ + └─────────────────────────────────────────────────────┘ + +11 rows in set. Elapsed: 0.004 sec. +``` + +## プロジェクションを使用するタイミング + +プロジェクションは自動的にデータが挿入されると維持されるため、新しいユーザーには魅力的な機能です。さらに、クエリを単一のテーブルに送るだけで、それに応じてプロジェクションが活用され、応答時間が高速化されます。 + +
    + +NEEDS ALT + +
    + +これはマテリアライズドビューと対照的であり、その場合、ユーザーはフィルタに応じて適切な最適化されたターゲットテーブルを選ぶか、クエリを書き換える必要があります。これはユーザーアプリケーションにより大きな重みを置き、クライアント側の複雑さを増します。 + +これらの利点にもかかわらず、プロジェクションには内部的な制限があり、ユーザーはそれを認識した上で、慎重に配備すべきです。 + +- プロジェクションは、ソーステーブルと(非表示の)ターゲットテーブルで異なるTTLを使用することはできませんが、マテリアライズドビューでは可能です。 +- プロジェクションは、`optimize_read_in_order`を(非表示の)ターゲットテーブルで[現時点ではサポートしていません](https://clickhouse.com/blog/clickhouse-faster-queries-with-projections-and-primary-indexes)。 +- プロジェクションを持つテーブルでは軽量な更新や削除はサポートされていません。 +- マテリアライズドビューは連鎖可能であり、あるマテリアライズドビューのターゲットテーブルを別のマテリアライズドビューのソーステーブルにすることができますが、プロジェクションではそれができません。 +- プロジェクションはジョインをサポートしていませんが、マテリアライズドビューはサポートします。 +- プロジェクションはフィルタ(WHERE句)をサポートしていませんが、マテリアライズドビューはサポートします。 + +プロジェクションを使用することをお勧めする状況は以下の場合です: + +- データの完全な再順序が必要である場合。プロジェクションの中の式は理論的には`GROUP BY`を使用できますが、集計を維持するにはマテリアライズドビューの方が効果的です。クエリオプティマイザーは、単純な再順序付け、すなわち`SELECT * ORDER BY x`を使用するプロジェクションをより多く利用しやすいです。これにより、ユーザーはこの式の中でカラムのサブセットを選んでストレージのフットプリントを減らすことができます。 +- データを二重に書き込むことによるストレージフットプリントの増加に慣れています。挿入速度への影響をテストし、[ストレージのオーバーヘッドを評価](/ja/data-compression/compression-in-clickhouse)してください。 + +[パート4はこちらをクリック](/ja/migrations/postgresql/rewriting-queries)。 diff --git a/docs/ja/migrations/postgres/dataset.md b/docs/ja/migrations/postgres/dataset.md new file mode 100644 index 00000000000..3668ad99df2 --- /dev/null +++ b/docs/ja/migrations/postgres/dataset.md @@ -0,0 +1,113 @@ +--- +slug: /ja/migrations/postgresql/dataset +title: PostgreSQLからClickHouseへのデータロード +description: PostgreSQLからClickHouseへ移行するためのデータセット例 +keywords: [postgres, postgresql, 移行, マイグレーション] +--- + +> これは、PostgreSQLからClickHouseへの移行に関するガイドの**パート1**です。この内容は入門編と見なされ、ユーザーがClickHouseのベストプラクティスに従った初期の機能的なシステムをデプロイするのを支援することを目的としています。複雑なトピックを避け、完全に最適化されたスキーマにはなりませんが、ユーザーが本番環境のシステムを構築し、学習の基盤を築くための堅実な基礎を提供します。 + +## データセット + +PostgresからClickHouseへの典型的な移行を示す例として、[こちら](/ja/getting-started/example-datasets/stackoverflow)で文書化されているStack Overflowのデータセットを使用します。これには、2008年から2024年4月までにStack Overflowで行われたすべての`post`、`vote`、`user`、`comment`、および`badge`が含まれています。このデータのPostgreSQLスキーマは以下の通りです: + +
    + +NEEDS ALT + +
    + +*PostgreSQLでテーブルを作成するためのDDLコマンドは[こちら](https://pastila.nl/?001c0102/eef2d1e4c82aab78c4670346acb74d83#TeGvJWX9WTA1V/5dVVZQjg==)にあります。* + +このスキーマは必ずしも最も最適ではありませんが、主キー、外部キー、パーティショニング、およびインデックスを含むいくつかの人気のあるPostgreSQLの機能を活用しています。 + +これらの概念を、それぞれClickHouseの同等のものに移行します。 + +移行手順をテストするためにこのデータセットをPostgreSQLインスタンスに投入したいユーザーには、`pg_dump`形式でデータを提供しており、DDLおよびその後のデータロードコマンドは以下に示されています: + +```bash +# users +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/users.sql.gz +gzip -d users.sql.gz +psql < users.sql + +# posts +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/posts.sql.gz +gzip -d posts.sql.gz +psql < posts.sql + +# posthistory +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/posthistory.sql.gz +gzip -d posthistory.sql.gz +psql < posthistory.sql + +# comments +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/comments.sql.gz +gzip -d comments.sql.gz +psql < comments.sql + +# votes +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/votes.sql.gz +gzip -d votes.sql.gz +psql < votes.sql + +# badges +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/badges.sql.gz +gzip -d badges.sql.gz +psql < badges.sql + +# postlinks +wget https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/pdump/2024/postlinks.sql.gz +gzip -d postlinks.sql.gz +psql < postlinks.sql +``` + +このデータセットはClickHouseにとっては小規模ですが、Postgresにとっては大規模です。上記は2024年の最初の3か月をカバーするサブセットを表しています。 + +> 我々の例では、PostgresとClickHouseのパフォーマンス差を示すために完全なデータセットを使用していますが、以下に記載されているすべての手順は、小さなサブセットでも機能的に同一です。Postgresに完全なデータセットをロードしたいユーザーは[こちら](https://pastila.nl/?00d47a08/1c5224c0b61beb480539f15ac375619d#XNj5vX3a7ZjkdiX7In8wqA==)を参照してください。上記のスキーマによって課される外部制約のため、PostgreSQLの完全なデータセットには参照整合性を満たす行のみが含まれます。[Parquetバージョン](/ja/getting-started/example-datasets/stackoverflow)は、そのような制約なしでClickHouseに直接簡単にロードできます。 + +## データの移行 + +ClickHouseとPostgres間のデータ移行は、2つの主要なワークロードタイプに分かれます: + +- **初回の一括ロードと定期更新** - 初期データセットを移行し、毎日などの設定された間隔で定期更新を行います。ここでの更新は、変更された行を再送信することで処理されます。これは、比較に使用できるカラム(例:日付)やXMIN値によって識別できます。削除操作はデータセットの完全な定期リロードで処理されます。 +- **リアルタイムレプリケーションまたはCDC** - 初期データセットを移行する必要があります。このデータセットへの変更は、数秒の遅延が許容される近リアルタイムでClickHouseに反映される必要があります。これは実質的に、PostgresのテーブルをClickHouseと同期させるChange Data Capture (CDC)プロセスです。つまり、Postgresテーブルの挿入、更新、削除がClickHouseの同等のテーブルに適用される必要があります。 + +### 初回の一括ロードと定期更新 + +このワークロードは、上記のワークロードの中でも簡単な方です。変更は定期的に適用できます。データセットの初回の一括ロードは以下で達成できます: + +- **テーブル関数** - ClickHouseで[Postgresテーブル関数](/ja/sql-reference/table-functions/postgresql)を使用してPostgresからデータを`SELECT`し、ClickHouseテーブルに`INSERT`します。数百GBのデータセットまでの一括ロードに関連しています。 +- **エクスポート** - CSVやSQLスクリプトファイルなどの中間形式にエクスポートします。これらのファイルは、クライアントからの`INSERT FROM INFILE`句を使用して、またはオブジェクトストレージとその関連機能(例:s3, gcs)を使用してClickHouseにロードできます。 + +増分ロードは、スケジュールして行うことができます。Postgresテーブルが挿入のみを受け取り、増加するIDまたはタイムスタンプが存在する場合、上記のテーブル関数アプローチを使用してインクリメントをロードできます。つまり、`SELECT`に`WHERE`句を適用できます。このアプローチは、同じカラムが更新されることが保証されている場合に更新をサポートするためにも使用できます。ただし、削除をサポートするためには完全なリロードが必要になり、テーブルが成長するにつれて困難になる可能性があります。 + +`CreationDate`を使用して初回ロードと増分ロードを示します(行が更新された場合、これが更新されると仮定します)。 + +```sql +-- 初回ロード +INSERT INTO stackoverflow.posts SELECT * FROM postgresql('', 'postgres', 'posts', 'postgres', '', 'postgres', 'posts', 'postgres', ' ( SELECT (max(CreationDate) FROM stackoverflow.posts) +``` + +> ClickHouseは、`=`, `!=`, `>`, `>=`, `<`, `<=`, `IN`のような単純な`WHERE`句をPostgreSQLサーバーにプッシュダウンします。したがって、インクリメンタルロードは、変更セットを識別するために使用されるカラムにインデックスが存在することを確認することで、より効率的に行えます。 + +> クエリレプリケーションを使用してUPDATE操作を検出する可能な方法は、[XMINシステムカラム](https://www.postgresql.org/docs/9.1/ddl-system-columns.html)(トランザクションID)をウォーターマークとして使用することです。このカラムの変更は変化を示し、したがって宛先テーブルに適用することができます。このアプローチを使用するユーザーは、XMIN値がラップアラウンドする可能性があり、全表スキャンが必要であるため、変更を追跡することがより複雑になることを認識している必要があります。このアプローチの詳細については、「Change Data Capture (CDC)」を参照してください。 + +### リアルタイムレプリケーションまたはCDC + +Change Data Capture (CDC)は、表が2つのデータベース間で同期されるプロセスです。これは、更新および削除をリアルタイムで処理する場合、かなり複雑になります。 + +いくつかのソリューションがあります: +1. **[ClickHouseによるPeerDB](https://docs.peerdb.io/connect/clickhouse/clickhouse-cloud)** - PeerDBはユーザーがセルフマネージドまたはSaaSソリューションとして実行できるオープンコード専門Postgres CDCソリューションを提供し、PostgresおよびClickHouseでスケールでの優れたパフォーマンスを示しています。このソリューションは、PostgresとClickHouse間の高性能なデータ転送および信頼性保証を実現するために低レベルの最適化に焦点を当てています。オンラインおよびオフラインの両方のロードをサポートします。 + +2. **独自に構築** - これは**Debezium + Kafka**で実現できます。DebeziumはPostgresテーブルのすべての変更をキャプチャし、これらをイベントとしてKafkaキューにフォワードできます。これらのイベントはその後、ClickHouse Kafkaコネクタまたは[Clickpipes in ClickHouse Cloud](https://clickhouse.com/cloud/clickpipes)によって消費され、ClickHouseへの挿入が行われます。これはChange Data Capture (CDC)を表しており、Debeziumは表の初回コピーを行うだけでなく、後続のすべての更新、削除、および挿入がPostgresで検出され、下流のイベントが発生することを保証します。これは、Postgres、Debezium、およびClickHouseの注意深い設定を必要とします。例は[こちら](https://clickhouse.com/blog/clickhouse-postgresql-change-data-capture-cdc-part-2)にあります。 + +このガイドの例では、データ探索と他のアプローチで使用可能な本番スキーマへの簡単な反復に焦点を当て、初回の一括ロードのみを前提としています。 + +[パート2はこちら](/ja/migrations/postgresql/designing-schemas). + diff --git a/docs/ja/migrations/postgres/designing-schemas.md b/docs/ja/migrations/postgres/designing-schemas.md new file mode 100644 index 00000000000..e39a8cf0065 --- /dev/null +++ b/docs/ja/migrations/postgres/designing-schemas.md @@ -0,0 +1,249 @@ +--- +slug: /ja/migrations/postgresql/designing-schemas +title: スキーマの設計 +description: PostgreSQLからClickHouseへの移行時のスキーマ設計 +keywords: [postgres, postgresql, 移行, マイグレーション, スキーマ] +--- + +> これは、PostgreSQLからClickHouseへの移行ガイドの**パート2**です。このコンテンツは入門的なものであり、ClickHouseのベストプラクティスに従った初期の機能的なシステムを展開するのに役立ちます。複雑なトピックは避け、完全に最適化されたスキーマにはなりませんが、ユーザーが本番システムを構築し、その学習の基礎を築くのに役立つ堅実な基盤を提供します。 + +Stack Overflowデータセットには、関連する複数のテーブルが含まれています。移行では、主要なテーブルを最初に移行することをお勧めします。これは必ずしも最大のテーブルではなく、むしろ最も多くの分析クエリを受けると期待されるテーブルです。これにより、特にOLTP中心のバックグラウンドを持つ場合、ClickHouseの主要な概念に慣れることができます。このテーブルは、ClickHouseの機能を最大限に活用し、最適なパフォーマンスを得るために、追加のテーブルが追加されるたびにリモデリングを必要とするかもしれません。このモデリングプロセスについては、[データモデリングのドキュメント](/ja/data-modeling/schema-design#next-data-modelling-techniques)で探ります。 + +## 初期スキーマの設定 + +この原則に従い、主要な`posts`テーブルに焦点を当てます。Postgresスキーマは以下のように示されています: + +```sql +CREATE TABLE posts ( + Id int, + PostTypeId int, + AcceptedAnswerId text, + CreationDate timestamp, + Score int, + ViewCount int, + Body text, + OwnerUserId int, + OwnerDisplayName text, + LastEditorUserId text, + LastEditorDisplayName text, + LastEditDate timestamp, + LastActivityDate timestamp, + Title text, + Tags text, + AnswerCount int, + CommentCount int, + FavoriteCount int, + ContentLicense text, + ParentId text, + CommunityOwnedDate timestamp, + ClosedDate timestamp, + PRIMARY KEY (Id), + FOREIGN KEY (OwnerUserId) REFERENCES users(Id) +) +``` + +上記の各カラムに対応するTypeを確立するには、[Postgresテーブル関数](/ja/sql-reference/table-functions/postgresql)と共に`DESCRIBE`コマンドを使用できます。次のコマンドをPostgresインスタンスに合わせて変更してください: + +```sql +DESCRIBE TABLE postgresql(':', 'postgres', 'posts', '', '') +SETTINGS describe_compact_output = 1 + +┌─name──────────────────┬─type────────────────────┐ +│ id │ Int32 │ +│ posttypeid │ Nullable(Int32) │ +│ acceptedanswerid │ Nullable(String) │ +│ creationdate │ Nullable(DateTime64(6)) │ +│ score │ Nullable(Int32) │ +│ viewcount │ Nullable(Int32) │ +│ body │ Nullable(String) │ +│ owneruserid │ Nullable(Int32) │ +│ ownerdisplayname │ Nullable(String) │ +│ lasteditoruserid │ Nullable(String) │ +│ lasteditordisplayname │ Nullable(String) │ +│ lasteditdate │ Nullable(DateTime64(6)) │ +│ lastactivitydate │ Nullable(DateTime64(6)) │ +│ title │ Nullable(String) │ +│ tags │ Nullable(String) │ +│ answercount │ Nullable(Int32) │ +│ commentcount │ Nullable(Int32) │ +│ favoritecount │ Nullable(Int32) │ +│ contentlicense │ Nullable(String) │ +│ parentid │ Nullable(String) │ +│ communityowneddate │ Nullable(DateTime64(6)) │ +│ closeddate │ Nullable(DateTime64(6)) │ +└───────────────────────┴─────────────────────────┘ + +22 rows in set. Elapsed: 0.478 sec. +``` + +これにより、初期の非最適化スキーマが提供されます。 + +> `NOT NULL 制約`がなければ、PostgresのカラムにはNull値が含まれる可能性があります。行の値を調べずに、ClickHouseはこれらを同等のNullable型にマッピングします。Postgresでは、主キーはNullでないことが要求事項です。 + +これらの型を使用して、ClickHouseでテーブルを作成するには、`CREATE AS EMPTY SELECT`コマンドをシンプルに使用できます。 + +```sql +CREATE TABLE posts +ENGINE = MergeTree +ORDER BY () EMPTY AS +SELECT * FROM postgresql(':', 'postgres', 'posts', '', '') +``` + +このアプローチは、他のフォーマットでs3からデータをロードするためにも使用できます。同等の例として、このデータをParquetフォーマットからロードする例を参照してください。 + +## 初期ロード + +作成されたテーブルを使用して、PostgresからClickHouseに行を挿入します。[Postgresテーブル関数](/ja/sql-reference/table-functions/postgresql)を使用します。 + +```sql +INSERT INTO posts SELECT * +FROM postgresql(':', 'postgres', 'posts', '', '') + +0 rows in set. Elapsed: 1136.841 sec. Processed 58.89 million rows, 80.85 GB (51.80 thousand rows/s., 71.12 MB/s.) +Peak memory usage: 2.51 GiB. +``` + +> この操作はPostgresにかなりの負荷をかける可能性があります。ユーザーは、運用ワークロードに影響を与えないように、SQLスクリプトをエクスポートするような代替操作でバックフィルすることを検討するかもしれません。この操作のパフォーマンスは、PostgresとClickHouseのクラスターサイズ、およびそのネットワークインターコネクトに依存します。 + +> ClickHouseからPostgresへの各`SELECT`は、単一の接続を使用します。この接続は、設定`postgresql_connection_pool_size`(デフォルト16)でサイズ指定されたサーバー側の接続プールから取られます。 + +フルデータセットを使用している場合、例では59mの投稿がロードされるはずです。ClickHouseでの簡単なカウントで確認します: + +```sql +SELECT count() +FROM posts + +┌──count()─┐ +│ 58889566 │ +└──────────┘ +``` + +## 型の最適化 + +このスキーマの型を最適化する手順は、他のソースからデータがロードされた場合と同じです(例: S3のParquet)。[Parquetを使用した代替ガイド](/ja/data-modeling/schema-design)で説明されているプロセスを適用すると、以下のスキーマが生成されます: + +```sql +CREATE TABLE posts_v2 +( + `Id` Int32, + `PostTypeId` Enum('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime, + `Score` Int32, + `ViewCount` UInt32, + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime, + `LastActivityDate` DateTime, + `Title` String, + `Tags` String, + `AnswerCount` UInt16, + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime, + `ClosedDate` DateTime +) +ENGINE = MergeTree +ORDER BY tuple() +COMMENT '最適化されたタイプ' +``` + +このテーブルを埋めるには、以前のテーブルからデータを読み取り、このテーブルに挿入するシンプルな`INSERT INTO SELECT`を使用できます: + +```sql +INSERT INTO posts_v2 SELECT * FROM posts + +0 rows in set. Elapsed: 146.471 sec. Processed 59.82 million rows, 83.82 GB (408.40 thousand rows/s., 572.25 MB/s.) +``` + +新しいスキーマでは、nullは保持されません。上記の挿入では、これらをそれぞれのタイプのデフォルト値に暗黙的に変換します。整数は0、文字列は空の値となります。ClickHouseはまた、任意の数値をその目標精度に自動的に変換します。 + +## ClickHouseにおける主(順序)キー + +OLTPデータベースから来たユーザーは、多くの場合、ClickHouseでの同等の概念を探します。ClickHouseが`PRIMARY KEY`構文をサポートしていることに気付くと、ユーザーはOLTPデータベースのソースと同じキーを使用してテーブルスキーマを定義しようとするかもしれませんが、これは適切ではありません。 + +### ClickHouseの主キーはどのように異なるか? + +OLTP主キーをClickHouseで使用するのが不適切である理由を理解するには、ClickHouseのインデックス付けの基本を理解する必要があります。ここではPostgresを例として比較しますが、これらの一般的な概念は他のOLTPデータベースにも適用されます。 + +- Postgresの主キーは、定義上、行ごとに一意です。[B-tree構造](/ja/optimize/sparse-primary-indexes#an-index-design-for-massive-data-scales)を使用することで、このキーによる単一行の効率的な検索を可能にします。ClickHouseは単一行の値の検索に最適化できますが、分析ワークロードでは通常、多くの行に対して一部のカラムを読み取ることが求められます。フィルターは、集計が行われる行のサブセットを特定する必要があります。 +- メモリとディスクの効率は、ClickHouseが頻繁に使用されるスケールでは非常に重要です。データは、ClickHouseテーブルにパーツとして知られるチャンクに書き込まれ、バックグラウンドでパーツをマージするルールが適用されます。ClickHouseでは、各パーツに独自の主インデックスがあります。パーツがマージされると、マージされたパーツの主インデックスもマージされます。Postgresとは異なり、これらのインデックスは各行に対して構築されません。代わりに、パーツの主インデックスは、行のグループごとに1つのインデックスエントリを持ち、この技術は**スパースインデックス**と呼ばれます。 +- **スパースインデックス**は、ClickHouseがゆえに可能です。ClickHouseは、指定されたキーによってディスク上に並べられたデータを記憶します。その結果、スパース主インデックスは、インデックスエントリに対してバイナリサーチを介してクエリと一致する可能性のある行のグループを迅速に特定できます。特定された可能性のあるマッチング行のグループは、その後、ClickHouseエンジンに並行してストリーミングされ、マッチを見つけます。このインデックス設計により、主インデックスが小さく(完全にメインメモリに収まる)状態を保ちながら、特にデータ分析のユースケースに典型的な範囲クエリの実行時間を大幅に高速化します。詳細については、この[詳細なガイド](/ja/optimize/sparse-primary-indexes)をお勧めします。 + +
    + +NEEDS ALT + +
    + +NEEDS ALT + +
    + +ClickHouseで選択されたキーは、インデックスだけでなく、ディスクに書き込まれるデータの順序も決定します。したがって、圧縮レベルに大きな影響を与える可能性があり、それが結果的にクエリのパフォーマンスに影響を与える可能性があります。大部分のカラムの値が連続して書き込まれるような順序キーは、選択された圧縮アルゴリズム(およびコーデック)がデータをより効果的に圧縮するのを可能にします。 + +> テーブル内の全てのカラムは、指定された順序キーの値に基づいてソートされます。たとえそれがキー自体には含まれていなくてもです。例えば、`CreationDate`がキーとして使用されている場合、他の全てのカラムの値の順序は、`CreationDate`カラムの値の順序と一致します。複数の順序キーを指定することができ、これは`SELECT`クエリの`ORDER BY`句と同じセマンティクスで順序付けされます。 + +### 順序キーの選択 + +順序キーの選択における考慮事項とステップについては、postsテーブルを例に[こちら](/ja/data-modeling/schema-design#choosing-an-ordering-key)を参照してください。 + +## 圧縮 + +ClickHouseの列指向ストレージは、Postgresと比較して圧縮が大幅に向上することがあります。以下は、両方のデータベースでStack Overflowテーブル全体のストレージ要件を比較したものです: + +```sql +--Postgres +SELECT + schemaname, + tablename, + pg_total_relation_size(schemaname || '.' || tablename) AS total_size_bytes, + pg_total_relation_size(schemaname || '.' || tablename) / (1024 * 1024 * 1024) AS total_size_gb +FROM + pg_tables s +WHERE + schemaname = 'public'; + schemaname | tablename | total_size_bytes | total_size_gb | +------------+-----------------+------------------+---------------+ + public | users | 4288405504 | 3 | + public | posts | 68606214144 | 63 | + public | votes | 20525654016 | 19 | + public | comments | 22888538112 | 21 | + public | posthistory | 125899735040 | 117 | + public | postlinks | 579387392 | 0 | + public | badges | 4989747200 | 4 | +(7 rows) + +--ClickHouse +SELECT + `table`, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size +FROM system.parts +WHERE (database = 'stackoverflow') AND active +GROUP BY `table` + +┌─table───────┬─compressed_size─┐ +│ posts │ 25.17 GiB │ +│ users │ 846.57 MiB │ +│ badges │ 513.13 MiB │ +│ comments │ 7.11 GiB │ +│ votes │ 1.28 GiB │ +│ posthistory │ 40.44 GiB │ +│ postlinks │ 79.22 MiB │ +└─────────────┴─────────────────┘ +``` + +圧縮を最適化し、測定する方法についての詳細は[こちら](/ja/data-compression/compression-in-clickhouse)にて確認できます。 + +[Part 3はこちら](/ja/migrations/postgresql/data-modeling-techniques). diff --git a/docs/ja/migrations/postgres/overview.md b/docs/ja/migrations/postgres/overview.md new file mode 100644 index 00000000000..ba5a5c9f128 --- /dev/null +++ b/docs/ja/migrations/postgres/overview.md @@ -0,0 +1,22 @@ +--- +slug: /ja/migrations/postgresql/overview +title: PostgreSQLからClickHouseへの移行 +description: PostgreSQLからClickHouseへの移行ガイド +keywords: [postgres, postgresql, 移行, マイグレーション] +--- + +## なぜPostgresよりClickHouseを使用するのか? + +TLDR: ClickHouseはOLAPデータベースとして、特に`GROUP BY`クエリを用いた高速分析用に設計されており、Postgresはトランザクションワークロード向けのOLTPデータベースとして設計されています。 + +OLTP、すなわちオンライン・トランザクション処理データベースは、トランザクション情報を管理するように設計されています。Postgresが典型的な例であるこれらのデータベースの主な目的は、エンジニアがデータベースに対して更新ブロックを送り込み、それが全体として成功するか失敗するかを保証することです。これらのタイプのトランザクション保証は、ACID特性を持つOLTPデータベースの主な焦点であり、Postgresの大きな強みです。これらの要件を考慮すると、OLTPデータベースは通常、大規模なデータセットに対する分析クエリの実行時に性能の限界に達します。 + +OLAP、すなわちオンライン分析処理データベースは、分析ワークロードを管理するために設計されています。これらのデータベースの主な目的は、エンジニアが膨大なデータセットに対して効率的にクエリを実行し、集計できるようにすることです。ClickHouseのようなリアルタイムOLAPシステムは、データがリアルタイムで取り込まれる際にこの分析を可能にします。 + +より詳細な比較については、[こちらのブログ投稿](https://clickhouse.com/blog/adding-real-time-analytics-to-a-supabase-application)をご覧ください。 + +ClickHouseとPostgresの分析クエリにおける性能の違いを確認するには、[PostgreSQLクエリをClickHouseで書き換える](/ja/migrations/postgresql/rewriting-queries)を参照してください。 + +--- + +**[PostgreSQL移行ガイドをここから始める](/ja/migrations/postgresql/dataset)。** diff --git a/docs/ja/migrations/postgres/replacing-merge-tree.md b/docs/ja/migrations/postgres/replacing-merge-tree.md new file mode 100644 index 00000000000..50809f8fcab --- /dev/null +++ b/docs/ja/migrations/postgres/replacing-merge-tree.md @@ -0,0 +1,324 @@ +--- +slug: /ja/guides/replacing-merge-tree +title: ReplacingMergeTree +description: ClickHouseでのReplacingMergeTreeエンジンの使用 +keywords: [replacingmergetree, 挿入, 重複排除] +--- + +トランザクションデータベースはトランザクションの更新や削除のワークロードに最適化されていますが、OLAPデータベースはそのような操作の保証を減少させ、高速な分析クエリを実現するために不変データをバッチで挿入することに最適化されています。ClickHouseは、突然変異を通じて更新操作を提供し、行を軽量に削除する手段も提供していますが、その列指向の構造により、これらの操作は注意深くスケジュールされるべきです。これらの操作は非同期で処理され、単一のスレッドで行われ、(更新の場合は)データがディスクに書き直される必要があります。そのため、少数の小規模な変更には使用すべきではありません。 + +上記の使用パターンを避けつつ更新と削除の行を処理するために、ClickHouseのテーブルエンジンReplaceingMergeTreeを使用できます。 + +## 挿入された行の自動アップサート + +[ReplacingMergeTreeテーブルエンジン](/ja/engines/table-engines/mergetree-family/replacingmergetree)は、非効率的な`ALTER`や`DELETE`文を使用せずに行に対して更新操作を適用することを可能にし、ユーザーが同じ行の複数のコピーを挿入し、最新バージョンを指定できるようにします。このプロセスはバックグラウンドで非同期に古いバージョンの行を削除し、不変の挿入を使用して効率的に更新操作を模倣します。 +これは、テーブルエンジンが重複行を識別する能力に依存しています。これは、`ORDER BY`句を使用して一意性を決定することによって達成されます。つまり、`ORDER BY`で指定されたカラムの値が同じである場合、2行は重複と見なされます。テーブルを定義する際に指定される`バージョン`カラムは、重複として識別された2行の場合、より高いバージョンの値を持つ行が保持されることを可能にします。 + +以下の例でこのプロセスを示します。ここでは、行はAカラム(テーブルの`ORDER BY`)によって一意に識別されます。これらの行は2つのバッチとして挿入されたと仮定し、ディスク上に2つのデータパーツを形成しています。後で、非同期のバックグラウンドプロセス中に、これらのパーツは一緒にマージされます。 + +ReplacingMergeTreeはさらに、削除されたカラムを指定することができます。これは0または1を含み、値が1である場合、行(およびその重複)が削除されたことを示し、それ以外はゼロとして使用されます。**注:削除された行はマージ時に削除されません。** + +このプロセス中に、パーツのマージ中に次のことが行われます: + +- カラムAの値1で識別された行は、バージョン2の更新行と、バージョン3の削除行(および削除カラムの値1)を持っています。削除された最新の行が保持されます。 +- カラムAの値2で識別された行は2つの更新行を持っており、後者の行が価格カラムの値6で保持されます。 +- カラムAの値3で識別された行は、バージョン1の行とバージョン2の削除行があります。この削除行が保持されます。 + +このマージプロセスの結果として、最終状態を表す4行が得られます。 + +
    + +NEEDS ALT + +
    + +削除された行は決して削除されないことに注意してください。これらは`OPTIMIZE table FINAL CLEANUP`で強制的に削除することができます。これにはエクスペリメンタルな設定`allow_experimental_replacing_merge_with_cleanup=1`が必要です。これは次の条件下でのみ発行されるべきです: + +1. クリーンアップで削除された行に対して古いバージョンの行が操作発行後に挿入されないことを確認できる場合。これらが挿入された場合、削除された行がもはや存在しないため、誤って保持されます。 +2. クリーンアップを発行する前にすべてのレプリカが同期されていることを確認します。これは次のコマンドで達成できます: + +
    + +```sql +SYSTEM SYNC REPLICA table +``` + +このコマンドと後続のクリーンアップが完了するまで、挿入を一時停止することをお勧めします。 + +> ReplacingMergeTreeで削除を扱うことは、クリーンアップを上記の条件でスケジュールできる期間を除き、削除数が少から中程度(10%未満)のテーブルにのみ推奨されます。 + +> ヒント: ユーザーは、変更がない選択的なパーティションに対して`OPTIMIZE FINAL CLEANUP`を発行することもできます。 + +## 主キー/重複排除キーの選択 + +上記で説明したように、ReplacingMergeTreeの場合には満たされるべき重要な追加の制約があります:`ORDER BY`カラムの値が変更をまたいで行を一意に識別しなければならないことです。Postgresのようなトランザクションデータベースから移行する場合、オリジナルのPostgres主キーはClickHouseの`ORDER BY`句に含める必要があります。 + +ClickHouseのユーザーは、自分のテーブルの`ORDER BY`句でカラムを選択することに[クエリパフォーマンスを最適化する](/ja/data-modeling/schema-design#choosing-an-ordering-key)ことに慣れています。一般的に、これらのカラムは、[頻繁なクエリに基づいて選択され、増加するカーディナリティに応じてリストされるべきです](/ja/optimize/sparse-primary-indexes)。重要なポイントとして、ReplacingMergeTreeは追加の制約を課します - これらのカラムは不変でなければならず、つまりPostgresからのレプリケーションの場合、基になるPostgresデータで変更されないカラムのみをこの句に追加する必要があります。他のカラムは変更できるが、これらは一意の行識別のために一貫している必要があります。 + +分析ワークロードではポストグレスの主キーは一般的にあまり役立たないことがあります、なぜならユーザーはまれにポイント行のルックアップを行うからです。カラムは増加するカーディナリティの順に並べられるべきと述べた通り、および[ORDER BYでリストされているカラムのマッチングが通常より高速である](/ja/optimize/sparse-primary-indexes#secondary-key-columns-can-not-be-inefficient)ため、Postgres主キーは`ORDER BY`の最後に追加されるべきです(分析的価値がある場合を除きます)。Postgresで複数のカラムが主キーを形成する場合は、カーディナリティとクエリ値の可能性を考慮して、`ORDER BY`に追加されるべきです。また、ユーザーは`MATERIALIZED`カラムを通じて値の連結を使用して一意の主キーを生成することを考慮するかもしれません。 + +Stack Overflowデータセットからのポストテーブルを考えてみましょう。 + +```sql +CREATE TABLE stackoverflow.posts_updateable +( + `Version` UInt32, + `Deleted` UInt8, + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + `PostTypeId` Enum8('Question' = 1, 'Answer' = 2, 'Wiki' = 3, 'TagWikiExcerpt' = 4, 'TagWiki' = 5, 'ModeratorNomination' = 6, 'WikiPlaceholder' = 7, 'PrivilegeWiki' = 8), + `AcceptedAnswerId` UInt32, + `CreationDate` DateTime64(3, 'UTC'), + `Score` Int32, + `ViewCount` UInt32 CODEC(Delta(4), ZSTD(1)), + `Body` String, + `OwnerUserId` Int32, + `OwnerDisplayName` String, + `LastEditorUserId` Int32, + `LastEditorDisplayName` String, + `LastEditDate` DateTime64(3, 'UTC') CODEC(Delta(8), ZSTD(1)), + `LastActivityDate` DateTime64(3, 'UTC'), + `Title` String, + `Tags` String, + `AnswerCount` UInt16 CODEC(Delta(2), ZSTD(1)), + `CommentCount` UInt8, + `FavoriteCount` UInt8, + `ContentLicense` LowCardinality(String), + `ParentId` String, + `CommunityOwnedDate` DateTime64(3, 'UTC'), + `ClosedDate` DateTime64(3, 'UTC') +) +ENGINE = ReplacingMergeTree(Version, Deleted) +PARTITION BY toYear(CreationDate) +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, Id) +``` + +`ORDER BY`キーとして`(PostTypeId, toDate(CreationDate), CreationDate, Id)`を使用しています。各投稿に一意の`Id`カラムは、行が重複排除されることを保証します。スキーマに必要に応じて`Version`および`Deleted`カラムを追加します。 + +## ReplacingMergeTreeのクエリ + +マージ時に、ReplacingMergeTreeは`ORDER BY`カラムの値を一意の識別子として使用して重複行を識別し、最高のバージョンを保持するか、最新バージョンが削除を示す場合はすべての重複を削除します。ただし、これは最終的な正確性のみを提供し、行が重複排除される保証はありません。また、それに依存するべきではありません。そのため、クエリは更新および削除行がクエリで考慮されるため、誤った回答を生成する可能性があります。 + +正確な回答を得るためには、ユーザーはクエリタイムでの重複排除および削除削除とバックグラウンドのマージを補完する必要があります。これは`FINAL`オペレーターを使用して実現できます。 + +上記の投稿テーブルを考えてみましょう。このデータセットをロードする通常の方法を使用できますが、削除されたカラムとバージョンカラムを指定し、値を0に加えます。例として、10000行のみをロードします。 + +```sql +INSERT INTO stackoverflow.posts_updateable SELECT 0 AS Version, 0 AS Deleted, * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') WHERE AnswerCount > 0 LIMIT 10000 + +0 rows in set. Elapsed: 1.980 sec. Processed 8.19 thousand rows, 3.52 MB (4.14 thousand rows/s., 1.78 MB/s.) +``` + +行数を確認しましょう: + +```sql +SELECT count() FROM stackoverflow.posts_updateable + +┌─count()─┐ +│ 10000 │ +└─────────┘ + +1 row in set. Elapsed: 0.002 sec. +``` + +投稿回答の統計を更新します。これらの値を更新するのではなく、5000行の新しいコピーを挿入し、そのバージョン番号を1つ追加します(これにより、テーブル内に150行の行が存在します)。 `INSERT INTO SELECT`を使用してこれをシミュレートできます: + +```sql +INSERT INTO posts_updateable SELECT + Version + 1 AS Version, + Deleted, + Id, + PostTypeId, + AcceptedAnswerId, + CreationDate, + Score, + ViewCount, + Body, + OwnerUserId, + OwnerDisplayName, + LastEditorUserId, + LastEditorDisplayName, + LastEditDate, + LastActivityDate, + Title, + Tags, + AnswerCount, + CommentCount, + FavoriteCount, + ContentLicense, + ParentId, + CommunityOwnedDate, + ClosedDate +FROM posts_updateable --select 100 random rows +WHERE (Id % toInt32(floor(randUniform(1, 11)))) = 0 +LIMIT 5000 + +0 rows in set. Elapsed: 4.056 sec. Processed 1.42 million rows, 2.20 GB (349.63 thousand rows/s., 543.39 MB/s.) +``` + +さらに、削除カラムの値1で行を再挿入することにより、1000個のランダムな投稿を削除します。これもシンプルな`INSERT INTO SELECT`でシミュレートできます。 + +```sql +INSERT INTO posts_updateable SELECT + Version + 1 AS Version, + 1 AS Deleted, + Id, + PostTypeId, + AcceptedAnswerId, + CreationDate, + Score, + ViewCount, + Body, + OwnerUserId, + OwnerDisplayName, + LastEditorUserId, + LastEditorDisplayName, + LastEditDate, + LastActivityDate, + Title, + Tags, + AnswerCount + 1 AS AnswerCount, + CommentCount, + FavoriteCount, + ContentLicense, + ParentId, + CommunityOwnedDate, + ClosedDate +FROM posts_updateable --select 100 random rows +WHERE (Id % toInt32(floor(randUniform(1, 11)))) = 0 AND AnswerCount > 0 +LIMIT 1000 + +0 rows in set. Elapsed: 0.166 sec. Processed 135.53 thousand rows, 212.65 MB (816.30 thousand rows/s., 1.28 GB/s.) +``` + +上記の操作の結果として16,000行を持つことになります。つまり、10,000 + 5000 + 1000です。ここでの正しい合計は、実際には元の合計から1000行少ないはずです。つまり、10,000 - 1000 = 9000です。 + +```sql +SELECT count() +FROM posts_updateable + +┌─count()─┐ +│ 10000 │ +└─────────┘ +1 row in set. Elapsed: 0.002 sec. +``` + +ここでの結果は、発生したマージによって異なる場合があります。テーブルに`FINAL`を適用すると、正しい結果が得られます。 + +```sql +SELECT count() +FROM posts_updateable +FINAL + +┌─count()─┐ +│ 9000 │ +└─────────┘ + +1 row in set. Elapsed: 0.006 sec. Processed 11.81 thousand rows, 212.54 KB (2.14 million rows/s., 38.61 MB/s.) +Peak memory usage: 8.14 MiB. +``` + +## FINALのパフォーマンス + +`FINAL`オペレーターはクエリにパフォーマンスのオーバーヘッドを生じます。これに対する進行中の改善にもかかわらず、特にプライマリキーのカラムにフィルタリングしないクエリの場合に顕著です。これにより、より多くのデータが読み込まれ、重複排除のオーバーヘッドが増加します。ユーザーが`WHERE`条件でキーのカラムをフィルタリングする場合、読み込まれるデータが減少し、重複排除の対象となる部分も減少します。 + +`WHERE`条件にキーのカラムが使用されていない場合、ClickHouseは現在のところ`FINAL`を使用して`PREWHERE`最適化を活用していません。この最適化は、フィルタリングされていないカラムの読み取る行を減少させることを目的としています。`PREWHERE`を模倣し、潜在的にパフォーマンスを向上させる方法の例は、[こちら](https://clickhouse.com/blog/clickhouse-postgresql-change-data-capture-cdc-part-1#final-performance)をご覧ください。 + +## ReplacingMergeTreeでのパーティションの活用 + +ClickHouseでのデータのマージは、パーティションレベルで行われます。ReplacingMergeTreeを使用する場合、ユーザーは最善のパーティションの実践に従ってテーブルを分散させることをお勧めします。ただし、特に**行に対してこのパーティショニングキーが変更されないことを確認できる場合に限ります**。これにより、同じ行に関連する更新が同じClickHouseのパーティションに送信されることが保証されます。Postgresの同じパーティションキーを再利用してもよいが、ここで概説されたベストプラクティスに従うことを条件とします。 + +この場合、ユーザーは`do_not_merge_across_partitions_select_final=1`設定を使用して`FINAL`クエリのパフォーマンスを向上させることができます。この設定により、`FINAL`を使用しているときにパーティションが個別にマージされて処理されるようになります。 + +パーティショニングを使用しない投稿テーブルを考えてみましょう: + +```sql +CREATE TABLE stackoverflow.posts_no_part +( + `Version` UInt32, + `Deleted` UInt8, + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + … +) +ENGINE = ReplacingMergeTree +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, Id) + +INSERT INTO stackoverflow.posts_no_part SELECT 0 AS Version, 0 AS Deleted, * +FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/stackoverflow/parquet/posts/*.parquet') + +0 rows in set. Elapsed: 182.895 sec. Processed 59.82 million rows, 38.07 GB (327.07 thousand rows/s., 208.17 MB/s.) +``` + +`FINAL`がいくつかの作業を行うことを必要とするために、1mの行を更新し、その`AnswerCount`を重複行を挿入してインクリメントします。 + +```sql +INSERT INTO posts_no_part SELECT Version + 1 AS Version, Deleted, Id, PostTypeId, AcceptedAnswerId, CreationDate, Score, ViewCount, Body, OwnerUserId, OwnerDisplayName, LastEditorUserId, LastEditorDisplayName, LastEditDate, LastActivityDate, Title, Tags, AnswerCount + 1 AS AnswerCount, CommentCount, FavoriteCount, ContentLicense, ParentId, CommunityOwnedDate, ClosedDate +FROM posts_no_part +LIMIT 1000000 +``` + +`FINAL`で年ごとの回答の合計を計算する: + +```sql +SELECT toYear(CreationDate) AS year, sum(AnswerCount) AS total_answers +FROM posts_no_part +FINAL +GROUP BY year +ORDER BY year ASC + +┌─year─┬─total_answers─┐ +│ 2008 │ 371480 │ +… +│ 2024 │ 127765 │ +└──────┴───────────────┘ + +17 rows in set. Elapsed: 2.338 sec. Processed 122.94 million rows, 1.84 GB (52.57 million rows/s., 788.58 MB/s.) +Peak memory usage: 2.09 GiB. +``` + +パーティションを年ごとに区切るテーブルに対して同じ手順を繰り返し、`do_not_merge_across_partitions_select_final=1`を使用して上記のクエリを再度実行します。 + +```sql +CREATE TABLE stackoverflow.posts_with_part +( + `Version` UInt32, + `Deleted` UInt8, + `Id` Int32 CODEC(Delta(4), ZSTD(1)), + ... +) +ENGINE = ReplacingMergeTree +PARTITION BY toYear(CreationDate) +ORDER BY (PostTypeId, toDate(CreationDate), CreationDate, Id) + +// populate & update omitted + +SELECT toYear(CreationDate) AS year, sum(AnswerCount) AS total_answers +FROM posts_with_part +FINAL +GROUP BY year +ORDER BY year ASC + +┌─year─┬─total_answers─┐ +│ 2008 │ 387832 │ +│ 2009 │ 1165506 │ +│ 2010 │ 1755437 │ +... +│ 2023 │ 787032 │ +│ 2024 │ 127765 │ +└──────┴───────────────┘ + +17 rows in set. Elapsed: 0.994 sec. Processed 64.65 million rows, 983.64 MB (65.02 million rows/s., 989.23 MB/s.) +``` + +示されているように、パーティショニングにより、この場合、重複排除プロセスがパーティションレベルで並行して行われることが可能になり、クエリパフォーマンスが大幅に向上しました。 + +## 大きなパートのマージ動作 + +ClickHouseのReplacingMergeTreeエンジンは、データパーツをマージして重複行を管理し、指定された一意のキーに基づいて各行の最新バージョンのみを保持するように最適化されています。しかし、マージされたパートが[`max_bytes_to_merge_at_max_space_in_pool`](/docs/ja/operations/settings/merge-tree-settings#max-bytes-to-merge-at-max-space-in-pool)のしきい値に達すると、さらにマージされる対象として選択されなくなります。たとえ[`min_age_to_force_merge_seconds`](/docs/ja/operations/settings/merge-tree-settings#min_age_to_force_merge_seconds)が設定されていたとしてもです。その結果、自動マージに頼って進行中のデータ挿入で累積する重複を削除することができなくなります。 + +この問題に対処するために、ユーザーは`OPTIMIZE FINAL`を呼び出して手動でパーツをマージし、重複を削除することができます。自動的なマージとは異なり、`OPTIMIZE FINAL`は`max_bytes_to_merge_at_max_space_in_pool`しきい値を無視し、利用可能なリソース、特にディスクスペースに基づいて、各パーティションに単一のパートが残るまでパーツをマージします。ただし、このアプローチは大きなテーブルでメモリを集中的に使用し、新しいデータが追加されると再度実行する必要があるかもしれません。 + +パフォーマンスを維持しつつ、より持続可能な解決策として、テーブルをパーティショニングすることをお勧めします。これにより、データパーツが最大マージサイズに達するのを防ぎ、継続的な手動の最適化の必要性が減少します。 diff --git a/docs/ja/migrations/snowflake.md b/docs/ja/migrations/snowflake.md new file mode 100644 index 00000000000..9fc6bc8ab76 --- /dev/null +++ b/docs/ja/migrations/snowflake.md @@ -0,0 +1,110 @@ +--- +sidebar_label: Snowflake +sidebar_position: 20 +slug: /ja/migrations/snowflake +description: SnowflakeからClickHouseへの移行 +keywords: [migrate, migration, migrating, data, etl, elt, snowflake] +--- + +# SnowflakeからClickHouseへの移行 + +このガイドでは、SnowflakeからClickHouseへのデータ移行方法を紹介します。 + +SnowflakeとClickHouse間でのデータ移行には、転送用の中間ストレージとしてS3などのオブジェクトストアを使用する必要があります。この移行プロセスでは、Snowflakeの`COPY INTO`コマンドとClickHouseの`INSERT INTO SELECT`コマンドを使用します。 + +## 1. Snowflakeからのデータエクスポート + +Migrating from Snowflake to ClickHouse + +上記の図に示されているように、Snowflakeからデータをエクスポートするには外部ステージを使用する必要があります。 + +次のようなスキーマを持つSnowflakeテーブルをエクスポートする場合を考えてみましょう。 + +```sql +CREATE TABLE MYDATASET ( + timestamp TIMESTAMP, + some_text varchar, + some_file OBJECT, + complex_data VARIANT, +) DATA_RETENTION_TIME_IN_DAYS = 0; +``` + +このテーブルのデータをClickHouseデータベースに移動するには、まずこのデータを外部ステージにコピーする必要があります。データのコピー時には、タイプ情報の共有、精度の保持、効率的な圧縮、分析で一般的なネスト構造のネイティブサポートが可能なParquet形式を推奨します。 + +以下の例では、Parquetと希望するファイルオプションを表す名前付きファイルフォーマットをSnowflakeで作成します。そしてどのバケットにデータセットをコピーするかを指定し、最後にデータセットをバケットにコピーします。 + +```sql +CREATE FILE FORMAT my_parquet_format TYPE = parquet; + +-- S3バケットへのコピーを指定する外部ステージを作成します +CREATE OR REPLACE STAGE external_stage +URL='s3://mybucket/mydataset' +CREDENTIALS=(AWS_KEY_ID='' AWS_SECRET_KEY='') +FILE_FORMAT = my_parquet_format; + +-- すべてのファイルに"mydataset"プレフィックスを付け、ファイルの最大サイズを150MBに指定します。 +-- `header=true`パラメータはカラム名を取得するために必要です +COPY INTO @external_stage/mydataset from mydataset max_file_size=157286400 header=true; +``` + +約5TBのデータセットで最大ファイルサイズ150MB、同じAWS `us-east-1`地域にある2X-Large Snowflake warehouseを使用した場合、S3バケットへのデータコピーは約30分かかります。 + +## 2. ClickHouseへのインポート + +データが中間のオブジェクトストレージにステージングされたら、ClickHouseの[s3 テーブル関数](/docs/ja/sql-reference/table-functions/s3)などの機能を使用して、データをテーブルに挿入できます。 + +以下の例では、AWS S3用の[s3 テーブル関数](/docs/ja/sql-reference/table-functions/s3)を使用していますが、Google Cloud Storageには[gcs テーブル関数](/docs/ja/sql-reference/table-functions/gcs)、Azure Blob Storageには[azureBlobStorage テーブル関数](/docs/ja/sql-reference/table-functions/azureBlobStorage)を使用できます。 + +次のテーブルのターゲットスキーマを想定しています: + +```sql +CREATE TABLE default.mydataset +( + `timestamp` DateTime64(6), + `some_text` String, + `some_file` Tuple(filename String, version String), + `complex_data` Tuple(name String, description String), +) +ENGINE = MergeTree +ORDER BY (timestamp) +``` + +この場合、S3からClickHouseテーブルにデータを挿入するために`INSERT INTO SELECT`コマンドを使用できます: + +```sql +INSERT INTO mydataset +SELECT + timestamp, + some_text, + JSONExtract( + ifNull(some_file, '{}'), + 'Tuple(filename String, version String)' + ) AS some_file, + JSONExtract( + ifNull(complex_data, '{}'), + 'Tuple(filename String, description String)' + ) AS complex_data, +FROM s3('https://mybucket.s3.amazonaws.com/mydataset/mydataset*.parquet') +SETTINGS input_format_null_as_default = 1, -- 値がnullの場合にデフォルトとしてカラムを挿入する +input_format_parquet_case_insensitive_column_matching = 1 -- ソースデータとターゲットテーブル間のカラムマッチングが大文字小文字を区別しない +``` + +:::note ネスト構造のカラムについての注意 +オリジナルのSnowflakeテーブルスキーマにおける`VARIANT`および`OBJECT`カラムは、デフォルトでJSON文字列として出力され、ClickHouseに挿入する際にキャストする必要があります。 + +`some_file`のようなネスト構造は、Snowflakeによるコピー時にJSON文字列に変換されます。ClickHouseにインポートする際には、これらの構造を[JSONExtract関数](/docs/ja/sql-reference/functions/json-functions#jsonextractjson-indices_or_keys-return_type)を使用してClickHouse挿入時にTuplesに変換する必要があります。 +::: + +## 3. 正しいデータエクスポートのテスト + +データが正しく挿入されたかどうかをテストするには、単に新しいテーブルに対して`SELECT`クエリを実行します: + +```sql +SELECT * FROM mydataset limit 10; +``` + +## さらなる読み物とサポート + +このガイドに加えて、[SnowflakeとClickHouseの比較](https://clickhouse.com/blog/clickhouse-vs-snowflake-for-real-time-analytics-comparison-migration-guide)に関するブログ記事を読むことをお勧めします。 + +SnowflakeからClickHouseへのデータ転送に問題がある場合は、support@clickhouse.comまでお気軽にお問い合わせください。 diff --git a/docs/ja/native-protocol/_category_.yml b/docs/ja/native-protocol/_category_.yml new file mode 100644 index 00000000000..f4032af5727 --- /dev/null +++ b/docs/ja/native-protocol/_category_.yml @@ -0,0 +1,3 @@ +label: 'Native Protocol' +collapsible: true +collapsed: true diff --git a/docs/ja/native-protocol/basics.md b/docs/ja/native-protocol/basics.md new file mode 100644 index 00000000000..dea61d7166b --- /dev/null +++ b/docs/ja/native-protocol/basics.md @@ -0,0 +1,150 @@ +--- +slug: /ja/native-protocol/basics +sidebar_position: 1 +--- + +# 基本 + +:::note +クライアントプロトコルのリファレンスは作成中です。 + +ほとんどの例はGoでのみです。 +::: + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +このドキュメントは、ClickHouse TCPクライアントのバイナリプロトコルについて説明します。 + +## Varint + +長さ、パケットコード、その他の場合には*unsigned varint*エンコーディングが使用されます。 [binary.PutUvarint](https://pkg.go.dev/encoding/binary#PutUvarint) と [binary.ReadUvarint](https://pkg.go.dev/encoding/binary#ReadUvarint) を使用します。 + +:::note +*Signed* varintは使用されません。 +::: + +## 文字列 + +可変長文字列は *(length, value)* としてエンコードされ、*length* は [varint](#varint) で、*value* はutf8文字列です。 + +:::important +OOMを防ぐために長さを検証してください: + +`0 ≤ len < MAX` +::: + + + + +```go +s := "Hello, world!" + +// 文字列の長さをuvarintとして書き込む。 +buf := make([]byte, binary.MaxVarintLen64) +n := binary.PutUvarint(buf, uint64(len(s))) +buf = buf[:n] + +// 文字列の値を書き込む。 +buf = append(buf, s...) +``` + + + + +```go +r := bytes.NewReader([]byte{ + 0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, + 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, +}) + +// 長さを読み込む。 +n, err := binary.ReadUvarint(r) +if err != nil { + panic(err) +} + +// OOMやmake()でのランタイム例外を防ぐためにnをチェックする。 +const maxSize = 1024 * 1024 * 10 // 10 MB +if n > maxSize || n < 0 { + panic("invalid n") +} + +buf := make([]byte, n) +if _, err := io.ReadFull(r, buf); err != nil { + panic(err) +} + +fmt.Println(string(buf)) +// Hello, world! +``` + + + + + + + +```hexdump +00000000 0d 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 |.Hello, world!| +``` + + + + +```text +DUhlbGxvLCB3b3JsZCE +``` + + + + +```go +data := []byte{ + 0xd, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, + 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, +} +``` + + + + +## 整数 + +:::tip +ClickHouseは固定サイズの整数に対して**リトルエンディアン**を使用します。 +::: + +### Int32 +```go +v := int32(1000) + +// エンコード。 +buf := make([]byte, 8) +binary.LittleEndian.PutUint32(buf, uint32(v)) + +// デコード。 +d := int32(binary.LittleEndian.Uint32(buf)) +fmt.Println(d) // 1000 +``` + + + + +```hexdump +00000000 e8 03 00 00 00 00 00 00 |........| +``` + + + + +```text +6AMAAAAAAAA +``` + + + + +## ブール値 + +ブール値は単一バイトで表され、`1` は `true`、`0` は `false` です。 diff --git a/docs/ja/native-protocol/client.md b/docs/ja/native-protocol/client.md new file mode 100644 index 00000000000..5f6b8b93878 --- /dev/null +++ b/docs/ja/native-protocol/client.md @@ -0,0 +1,121 @@ +--- +slug: /ja/native-protocol/client +sidebar_position: 2 +--- + +# クライアントパケット + +| 値 | 名前 | 説明 | +|-------|---------------------|---------------------------| +| 0 | [Hello](#hello) | クライアントハンドシェイク開始 | +| 1 | [Query](#query) | クエリリクエスト | +| 2 | [Data](#data) | データを含むブロック | +| 3 | [Cancel](#cancel) | クエリをキャンセル | +| 4 | [Ping](#ping) | Pingリクエスト | +| 5 | TableStatus | テーブルステータスリクエスト | + +`Data`は圧縮可能です。 + +## Hello + +たとえば、`Go Client` v1.10で`54451`プロトコルバージョンをサポートし、`default`データベースに`default`ユーザーで`secret`パスワードを使って接続したい場合です。 + +| フィールド | タイプ | 値 | 説明 | +|----------------------|------------|----------------|----------------------------| +| client_name | String | `"Go Client"` | クライアント実装名 | +| version_major | UVarInt | `1` | クライアントメジャーバージョン | +| version_minor | UVarInt | `10` | クライアントマイナーバージョン | +| protocol_version | UVarInt | `54451` | TCPプロトコルバージョン | +| database | String | `"default"` | データベース名 | +| username | String | `"default"` | ユーザー名 | +| password | String | `"secret"` | パスワード | + +### プロトコルバージョン + +プロトコルバージョンはクライアント側のTCPプロトコルバージョンです。 + +通常は最新の互換性のあるサーバーリビジョンと同じですが、これと混同しないでください。 + +### デフォルト + +すべての値は**明示的に設定**する必要があります。サーバー側にデフォルト値はありません。クライアント側では、デフォルトとして`"default"`データベース、`"default"`ユーザー名、および`""`(空の文字列)パスワードを使用します。 + +## クエリ + +| フィールド | タイプ | 値 | 説明 | +|---------------------|-------------------------------|------------|------------------------------| +| query_id | String | `1ff-a123` | クエリID, UUIDv4可能 | +| client_info | [ClientInfo](#client-info) | タイプを参照| クライアントに関するデータ | +| settings | [Settings](#settings) | タイプを参照| 設定のリスト | +| secret | String | `secret` | サーバー間の秘密 | +| [stage](#stage) | UVarInt | `2` | クエリステージまで実行 | +| compression | UVarInt | `0` | 無効=0、有効=1 | +| body | String | `SELECT 1` | クエリテキスト | + +### クライアント情報 + +| フィールド | タイプ | 説明 | +|-----------------------|-------------------|---------------------------------| +| query_kind | byte | None=0, Initial=1, Secondary=2 | +| initial_user | String | 初期ユーザー | +| initial_query_id | String | 初期クエリID | +| initial_address | String | 初期アドレス | +| initial_time | Int64 | 初期時間 | +| interface | byte | TCP=1, HTTP=2 | +| os_user | String | OSユーザー | +| client_hostname | String | クライアントホスト名 | +| client_name | String | クライアント名 | +| version_major | UVarInt | クライアントメジャーバージョン | +| version_minor | UVarInt | クライアントマイナーバージョン | +| protocol_version | UVarInt | クライアントプロトコルバージョン | +| quota_key | String | クオータキー | +| distributed_depth | UVarInt | 分散深度 | +| version_patch | UVarInt | クライアントパッチバージョン | +| otel | Bool | トレースフィールドの有無 | +| trace_id | FixedString(16) | トレースID | +| span_id | FixedString(8) | スパンID | +| trace_state | String | トレース状態 | +| trace_flags | Byte | トレースフラグ | + +### 設定 + +| フィールド | タイプ | 値 | 説明 | +|---------------|---------|------------------|----------------------| +| key | String | `send_logs_level`| 設定のキー | +| value | String | `trace` | 設定の値 | +| important | Bool | `true` | 無視可能かどうか | + +リストとしてエンコードされ、キーと値が空の場合はリストの終わりを示します。 + +### ステージ + +| 値 | 名前 | 説明 | +|-------|---------------------|-----------------------------------------------| +| 0 | FetchColumns | カラムタイプのみ取得 | +| 1 | WithMergeableState | マージ可能な状態まで | +| 2 | Complete | 完全な完了まで(デフォルトが推奨) | + +## データ + +| フィールド | タイプ | 説明 | +|-----------|--------------------|------------------------| +| info | BlockInfo | エンコードされたブロック情報 | +| columns | UVarInt | カラム数 | +| rows | UVarInt | 行数 | +| columns | [[]Column](#column)| データを含むカラム | + +### カラム + +| フィールド | タイプ | 値 | 説明 | +|-----------|---------|-----------------|-------------------| +| name | String | `foo` | カラム名 | +| type | String | `DateTime64(9)` | カラムタイプ | +| data | bytes | ~ | カラムデータ | + +## キャンセル + +パケットボディなし。サーバーはクエリをキャンセルする必要があります。 + +## ピング + +パケットボディなし。サーバーは[pongで応答する](./server.md#pong)必要があります。 diff --git a/docs/ja/native-protocol/columns.md b/docs/ja/native-protocol/columns.md new file mode 100644 index 00000000000..f80834c344e --- /dev/null +++ b/docs/ja/native-protocol/columns.md @@ -0,0 +1,96 @@ +--- +slug: /ja/native-protocol/columns +sidebar_position: 4 +--- + +# カラムタイプ + +一般的な情報については、[データタイプ](https://clickhouse.com/docs/ja/sql-reference/data-types/)を参照してください。 + +## 数値タイプ + +:::tip + +数値タイプのエンコーディングは、AMD64やARM64のようなリトルエンディアンCPUのメモリレイアウトと一致しています。 + +これにより、非常に効率的なエンコーディングとデコーディングを実現できます。 + +::: + +### 整数 + +IntとUIntの8, 16, 32, 64, 128または256ビットの文字列で、リトルエンディアン形式です。 + +### 浮動小数点数 + +IEEE 754のバイナリ表現でのFloat32とFloat64です。 + +## 文字列 + +単なる文字列の配列です。つまり、(len, value)。 + +## FixedString(N) + +Nバイトシーケンスの配列です。 + +## IP + +IPv4は`UInt32`数値型のエイリアスで、UInt32として表現されます。 + +IPv6は`FixedString(16)`のエイリアスで、バイナリで直接表現されます。 + +## Tuple + +Tupleは単にカラムの配列です。例えば、Tuple(String, UInt8)は2つのカラムが連続してエンコードされたものです。 + +## Map + +`Map(K, V)`は3つのカラムから成ります: `Offsets ColUInt64, Keys K, Values V`。 + +`Keys`と`Values`カラムの行数は`Offsets`の最後の値です。 + +## 配列 + +`Array(T)`は2つのカラムから成ります: `Offsets ColUInt64, Data T`。 + +`Data`の行数は`Offsets`の最後の値です。 + +## Nullable + +`Nullable(T)`は`Nulls ColUInt8, Values T`という同じ行数を持つ内容で構成されています。 + +```go +// NullsはValuesカラムに対するnullableの「マスク」です。 +// 例えば、[null, "", "hello", null, "world"]をエンコードする場合 +// Values: ["", "", "hello", "", "world"] (len: 5) +// Nulls: [ 1, 0, 0, 1, 0] (len: 5) +``` + +## UUID + +`FixedString(16)`のエイリアスで、UUID値はバイナリで表現されます。 + +## Enum + +`Int8`または`Int16`のエイリアスですが、それぞれの整数がいくつかの`String`値にマッピングされています。 + +## Low Cardinality + +`LowCardinality(T)`は`Index T, Keys K`から成り、`K`は`Index`のサイズに応じて(UInt8, UInt16, UInt32, UInt64)のいずれかです。 + +```go +// インデックス(すなわち、Dictionary)カラムはユニークな値を含み、Keysカラムは +// インデックスカラムのインデックスのシーケンスを含み、それが実際の値を表します。 +// +// 例えば、["Eko", "Eko", "Amadela", "Amadela", "Amadela", "Amadela"]は +// 以下のようにエンコードできます: +// Index: ["Eko", "Amadela"] (String) +// Keys: [0, 0, 1, 1, 1, 1] (UInt8) +// +// CardinalityKeyはIndexサイズに応じて選択されます。選択されたタイプの最大値は、 +// Index要素のインデックスを表現できる必要があります。 +``` + +## Bool + +`UInt8`のエイリアスであり、`0`はfalse、`1`はtrueを表します。 diff --git a/docs/ja/native-protocol/hash.md b/docs/ja/native-protocol/hash.md new file mode 100644 index 00000000000..506cc6ff270 --- /dev/null +++ b/docs/ja/native-protocol/hash.md @@ -0,0 +1,39 @@ +--- +slug: /ja/native-protocol/hash +sidebar_position: 5 +--- + +# CityHash + +ClickHouseは、**古いバージョンの** [GoogleのCityHash](https://github.com/google/cityhash) を使用しています。 + +:::info +CityHashは、ClickHouseに追加された後にアルゴリズムが変更されました。 + +CityHashのドキュメントでは、特定のハッシュ値に依存せず、保存やシャーディングキーとしての使用を控えるべきであると特に注意されています。 + +しかし、この関数をユーザーに公開したため、CityHashのバージョン(1.0.2)を固定する必要がありました。現在、SQLで使用可能なCityHash関数の動作は変わらないことを保証しています。 + +— Alexey Milovidov +::: + +:::note 注意 + +Googleの現在のCityHashのバージョンは、ClickHouseの`cityHash64`バリアントと[異なります](https://github.com/ClickHouse/ClickHouse/issues/8354)。 + +GoogleのCityHashの値を取得する目的で`farmHash64`を使用しないでください![FarmHash](https://opensource.googleblog.com/2014/03/introducing-farmhash.html)はCityHashの後継ですが、完全に互換性があるわけではありません。 + +| 文字列 | ClickHouse64 | CityHash64 | FarmHash64 | +|------------------------------------------------------------|----------------------|---------------------|----------------------| +| `Moscow` | 12507901496292878638 | 5992710078453357409 | 5992710078453357409 | +| `How can you write a big system without C++? -Paul Glick` | 6237945311650045625 | 749291162957442504 | 11716470977470720228 | + +::: + +また、作成理由や説明については[Introducing CityHash](https://opensource.googleblog.com/2011/04/introducing-cityhash.html)も参照してください。要約すると、**非暗号学的な**ハッシュで、[MurmurHash](http://en.wikipedia.org/wiki/MurmurHash)よりも高速ですが、より複雑です。 + +## 実装 + +### Go + +両方のバリアントを実装しているGoパッケージ[go-faster/city](https://github.com/go-faster/city)を使用できます。 diff --git a/docs/ja/native-protocol/images/ch_compression_block.drawio.svg b/docs/ja/native-protocol/images/ch_compression_block.drawio.svg new file mode 100644 index 00000000000..a5ebbe5e368 --- /dev/null +++ b/docs/ja/native-protocol/images/ch_compression_block.drawio.svg @@ -0,0 +1,4 @@ + + + +
    Checksum
    (16 bytes)
    Checksum...
    Data size
    (uint32, 4 bytes)
    Data size...
    Raw size
    (uint32, 4 bytes)
    Raw size...
    Mode
    (1 byte)
    Mode...
    Compressed 
    Data
    Compressed...
    Raw size length
    Raw size length
    Header, 9 bytes
    Header, 9 bytes
    Checksum input
    Checksum input
    0
    0
    15
    15
    16
    16
    20
    20
    21
    21
    25
    25
    26
    26
    ~
    ~
    Text is not SVG - cannot display
    \ No newline at end of file diff --git a/docs/ja/native-protocol/server.md b/docs/ja/native-protocol/server.md new file mode 100644 index 00000000000..eb53c72a89e --- /dev/null +++ b/docs/ja/native-protocol/server.md @@ -0,0 +1,131 @@ +--- +slug: /ja/native-protocol/server +sidebar_position: 3 +--- + +# サーバーパケット + +| 値 | 名前 | 説明 | +|-------|--------------------------------|----------------------------------------------------------------| +| 0 | [Hello](#hello) | サーバーのハンドシェイク応答 | +| 1 | Data | [クライアントデータ](./client.md#data) と同様 | +| 2 | [Exception](#exception) | クエリ処理の例外 | +| 3 | [Progress](#progress) | クエリの進捗 | +| 4 | [Pong](#pong) | ピン応答 | +| 5 | [EndOfStream](#end-of-stream) | すべてのパケットが転送された | +| 6 | [ProfileInfo](#profile-info) | プロファイリングデータ | +| 7 | Totals | 合計値 | +| 8 | Extremes | 極値 (最小, 最大) | +| 9 | TablesStatusResponse | TableStatus リクエストへの応答 | +| 10 | [Log](#log) | クエリシステムログ | +| 11 | TableColumns | カラムの詳細 | +| 12 | UUIDs | 一意なパーツIDのリスト | +| 13 | ReadTaskRequest | 次に必要なタスクを記述するためのリクエストを説明する文字列(UUID)| +| 14 | [ProfileEvents](#profile-events) | サーバーからのプロファイルイベントを含むパケット | + +`Data`、`Totals`、および `Extremes` は圧縮可能です。 + +## Hello + +[クライアントの hello](./client.md#hello) に対する応答。 + +| フィールド | タイプ | 値 | 説明 | +|----------------|----------|----------------|-----------------------| +| name | String | `Clickhouse` | サーバー名 | +| version_major | UVarInt | `21` | サーバーメジャーバージョン | +| version_minor | UVarInt | `12` | サーバーマイナーバージョン | +| revision | UVarInt | `54452` | サーバーリビジョン | +| tz | String | `Europe/Moscow`| サーバータイムゾーン | +| display_name | String | `Clickhouse` | UI用サーバー名 | +| version_patch | UVarInt | `3` | サーバーパッチバージョン | + +## Exception + +クエリ処理中のサーバー例外。 + +| フィールド | タイプ | 値 | 説明 | +|---------------|----------|----------------------------------------|------------------------------| +| code | Int32 | `60` | [ErrorCodes.cpp][codes] を参照してください。| +| name | String | `DB::Exception` | サーバーメジャーバージョン | +| message | String | `DB::Exception: Table X doesn't exist` | サーバーマイナーバージョン | +| stack_trace | String | ~ | C++ スタックトレース | +| nested | Bool | `true` | 追加のエラー | + +`nested` が `false` になるまで、例外の連続リストになることがあります。 + +[codes]: https://clickhouse.com/codebrowser/ClickHouse/src/Common/ErrorCodes.cpp.html "エラーコードのリスト" + +## Progress + +サーバーが定期的に報告するクエリ実行の進捗。 + +:::tip +**デルタ**で報告されます。合計はクライアント側で蓄積してください。 +::: + +| フィールド | タイプ | 値 | 説明 | +|---------------|----------|--------|---------------------| +| rows | UVarInt | `65535`| 行数 | +| bytes | UVarInt | `871799`| バイト数 | +| total_rows | UVarInt | `0` | 合計行数 | +| wrote_rows | UVarInt | `0` | クライアントからの行数| +| wrote_bytes | UVarInt | `0` | クライアントからのバイト数 | + +## Pong + +[クライアントの ping](./client.md#ping) に対する応答、パケットボディなし。 + +## End of stream + +**Data** パケットはもう送信されなくなり、クエリ結果が完全にサーバーからクライアントへストリームされました。 + +パケットボディなし。 + +## Profile info + +| フィールド | タイプ | +|---------------------------|----------| +| rows | UVarInt | +| blocks | UVarInt | +| bytes | UVarInt | +| applied_limit | Bool | +| rows_before_limit | UVarInt | +| calculated_rows_before_limit | Bool | + +## Log + +サーバーログを含む **Data block**。 + +:::tip +カラムの **data block** としてエンコードされますが、圧縮されません。 +::: + +| カラム | タイプ | +|--------------|-----------| +| time | DateTime | +| time_micro | UInt32 | +| host_name | String | +| query_id | String | +| thread_id | UInt64 | +| priority | Int8 | +| source | String | +| text | String | + +## Profile events + +プロファイルイベントを含む **Data block**。 + +:::tip +カラムの **data block** としてエンコードされますが、圧縮されません。 + +`value` のタイプはサーバーリビジョンによって `UInt64` または `Int64` です。 +::: + +| カラム | タイプ | +|--------------|------------------| +| host_name | String | +| current_time | DateTime | +| thread_id | UInt64 | +| type | Int8 | +| name | String | +| value | UInt64 または Int64 | diff --git a/docs/ja/quick-start.mdx b/docs/ja/quick-start.mdx new file mode 100644 index 00000000000..2d9cfe49879 --- /dev/null +++ b/docs/ja/quick-start.mdx @@ -0,0 +1,299 @@ +--- +slug: /ja/getting-started/quick-start +sidebar_label: クイックスタート +sidebar_position: 1 +keywords: [clickhouse, インストール, スタートガイド, クイックスタート] +pagination_next: 'en/getting-started/index' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; + +# ClickHouse クイックスタート + +:::tip +このページでは、オープンソースのClickHouseを自分のマシンにセットアップする方法を説明します。最速でClickHouseをデプロイし、専用のSQLコンソールにアクセスする方法は、ClickHouse Cloudを使用することです。 + +新しいユーザーは、$300の無料トライアルクレジットを受け取ることができます。サインアップは[こちら](https://clickhouse.cloud/signUp?loc=docs-quick-start)からどうぞ。 +::: + +## 1. バイナリのダウンロード + +ClickHouseは、Linux、FreeBSD、macOSでネイティブに動作し、Windowsでは[WSL](https://learn.microsoft.com/en-us/windows/wsl/about)を通じて動作します。ClickHouseをローカルにダウンロードする最も簡単な方法は、以下の`curl`コマンドを実行することです。このコマンドは、オペレーティングシステムがサポートされているかどうかを確認し、適切なClickHouseバイナリをダウンロードします。 + + ```bash + curl https://clickhouse.com/ | sh + ``` + +## 2. サーバーの起動 + +ClickHouseサーバーを開始するには、次のコマンドを実行します。 + + ```bash + ./clickhouse server + ``` + +## 3. クライアントの起動 + +`clickhouse-client`を使用して、ClickHouseサービスに接続します。新しいターミナルを開き、`clickhouse`バイナリが保存されているディレクトリに移動し、次のコマンドを実行してください。 + +```bash +./clickhouse client +``` + +ローカルホストで実行中のサービスに接続されると、笑顔の顔文字が表示されます。 + + ```response + my-host :) + ``` + +## 4. テーブルの作成 + +`CREATE TABLE`を使用して新しいテーブルを定義します。一般的なSQLのDDLコマンドがClickHouseでも機能しますが、ClickHouseのテーブルには`ENGINE`句が必要です。ClickHouseのパフォーマンス向上効果を活用するために、`MergeTree`を使用します。 + +```sql +CREATE TABLE my_first_table +( + user_id UInt32, + message String, + timestamp DateTime, + metric Float32 +) +ENGINE = MergeTree +PRIMARY KEY (user_id, timestamp) +``` + +## 5. データの挿入 + +ClickHouseでは、`INSERT INTO TABLE`コマンドを使うことができます。ただし、`MergeTree`テーブルにデータを挿入するたびに**パーツ**(フォルダ)がストレージに作成されることを理解しておくことが重要です。パーツを最小限にするために、大量の行を一度にバルクインサートすることをお勧めします(数万行以上、または数百万行)。 + +```sql +INSERT INTO my_first_table (user_id, message, timestamp, metric) VALUES + (101, 'Hello, ClickHouse!', now(), -1.0 ), + (102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ), + (102, 'Sort your data based on your commonly-used queries', today(), 2.718 ), + (101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 ) +``` + +## 6. 新しいテーブルにクエリを実行 + +他のSQLデータベースと同様に、`SELECT`クエリを書くことができます。 + + ```sql + SELECT * + FROM my_first_table + ORDER BY timestamp + ``` + 結果はすっきりしたテーブル形式で返されます。 + ```response + ┌─user_id─┬─message────────────────────────────────────────────┬───────────timestamp─┬──metric─┐ + │ 102 │ Insert a lot of rows per batch │ 2022-03-21 00:00:00 │ 1.41421 │ + │ 102 │ Sort your data based on your commonly-used queries │ 2022-03-22 00:00:00 │ 2.718 │ + │ 101 │ Hello, ClickHouse! │ 2022-03-22 14:04:09 │ -1 │ + │ 101 │ Granules are the smallest chunks of data read │ 2022-03-22 14:04:14 │ 3.14159 │ + └─────────┴────────────────────────────────────────────────────┴─────────────────────┴─────────┘ + + 4 rows in set. Elapsed: 0.008 sec. + ``` + +## 7. 独自のデータを挿入 + +次のステップは、現在のデータをClickHouseに取り込むことです。データを取り込むための[テーブル関数](/docs/ja/sql-reference/table-functions/index.md)や[統合](/docs/ja/integrations)が多数あります。以下のタブにいくつかの例を示しますが、ClickHouseとの統合の長いリストを[統合ガイド](/docs/ja/integrations)で確認できます。 + + + + +[`s3`テーブル関数](/docs/ja/sql-reference/table-functions/s3.md)を使用して、S3からファイルを読み取ります。これはテーブル関数です。このため、結果は以下のようにテーブルとして使用できます。 + +1. `SELECT`クエリのソースとして使用できます(これによりアドホッククエリを実行し、データをS3に残したままにできます)。 +2. 結果のテーブルを`MergeTree`テーブルに挿入する(データをClickHouseに移行する準備ができたとき)。 + +アドホッククエリの例は以下の通りです。 + +```sql +SELECT + passenger_count, + avg(toFloat32(total_amount)) +FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', + 'TabSeparatedWithNames' +) +GROUP BY passenger_count +ORDER BY passenger_count; +``` + +ClickHouseテーブルにデータを移行するには、次のようにします。`nyc_taxi`が`MergeTree`テーブルの場合: + +```sql +INSERT INTO nyc_taxi + SELECT * FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', + 'TabSeparatedWithNames' +) +SETTINGS input_format_allow_errors_num=25000; +``` + +S3をClickHouseと一緒に使用する例と詳細については、[AWS S3ドキュメントページのコレクション](/docs/ja/integrations/data-ingestion/s3/index.md)を参照してください。 + + + + +AWS S3でのデータ読み取りに使用される[`s3`テーブル関数](/docs/ja/sql-reference/table-functions/s3.md)は、Google Cloud Storageのファイルでも動作します。例えば: + +```sql +SELECT + * +FROM s3( + 'https://storage.googleapis.com/my-bucket/trips.parquet', + 'MY_GCS_HMAC_KEY', + 'MY_GCS_HMAC_SECRET_KEY', + 'Parquet' +) +LIMIT 1000 +``` + +詳細は[`s3`テーブル関数ページ](/docs/ja/sql-reference/table-functions/s3.md)を参照してください。 + + + + +[`url`テーブル関数](/docs/ja/sql-reference/table-functions/url)は、Webからアクセス可能なファイルを読み取ります。 + +```sql +--デフォルトでは、ClickHouseはSSRF攻撃から保護するためにリダイレクトを防止します。 +--以下のURLはリダイレクトを必要とするため、max_http_get_redirects > 0に設定する必要があります。 +SET max_http_get_redirects=10; + +SELECT * +FROM url( + 'http://prod2.publicdata.landregistry.gov.uk.s3-website-eu-west-1.amazonaws.com/pp-complete.csv', + 'CSV' + ); +``` + +[`url`テーブル関数ページ](/docs/ja/sql-reference/table-functions/url)を参照して詳細をご覧ください。 + + + + +[`file`テーブルエンジン](/docs/ja/sql-reference/table-functions/file)を使用してローカルファイルを読み取ります。簡単のため、ファイルを`user_files`ディレクトリにコピーします(ClickHouseバイナリをダウンロードしたディレクトリにあります)。 + +```sql +DESCRIBE TABLE file('comments.tsv') + +Query id: 8ca9b2f9-65a2-4982-954a-890de710a336 + +┌─name──────┬─type────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐ +│ id │ Nullable(Int64) │ │ │ │ │ │ +│ type │ Nullable(String) │ │ │ │ │ │ +│ author │ Nullable(String) │ │ │ │ │ │ +│ timestamp │ Nullable(DateTime64(9)) │ │ │ │ │ │ +│ comment │ Nullable(String) │ │ │ │ │ │ +│ children │ Array(Nullable(Int64)) │ │ │ │ │ │ +└───────────┴─────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘ +``` + +ClickHouseは、大量の行を分析してカラムの名前とデータ型を推測することに注意してください。 +ClickHouseがファイル名からストレージタイプを決定できない場合、第2引数として指定できます。 + +```sql +SELECT count() +FROM file( + 'comments.tsv', + 'TabSeparatedWithNames' +) +``` + +詳細は[`file`テーブル関数ページ](/docs/ja/sql-reference/table-functions/file)を確認してください。 + + + + +[`postgresql`テーブル関数](/ja/sql-reference/table-functions/postgresql)を使用して、PostgreSQLのテーブルからデータを読み取ります。 + +```sql +SELECT * +FROM + postgresql( + 'localhost:5432', + 'my_database', + 'my_table', + 'postgresql_user', + 'password') +; +``` + +詳細は[`postgresql`テーブル関数ページ](/docs/ja/sql-reference/table-functions/postgresql)を参照してください。 + + + + +[`mysql`テーブル関数](/docs/ja/sql-reference/table-functions/mysql)を使用して、MySQLのテーブルからデータを読み取ります。 + +```sql +SELECT * +FROM + mysql( + 'localhost:3306', + 'my_database', + 'my_table', + 'postgresql_user', + 'password') +; +``` + +詳細は[`mysql`テーブル関数ページ](/docs/ja/sql-reference/table-functions/mysql)を参照してください。 + + + + +ClickHouseは、任意のODBCまたはJDBCデータソースからデータを読み取ることができます。 + +```sql +SELECT * +FROM + odbc( + 'DSN=mysqlconn', + 'my_database', + 'my_table' + ); +``` + +詳細は[`odbc`テーブル関数ページ](/docs/ja/sql-reference/table-functions/odbc)および[`jdbc`テーブル関数ページ](/docs/ja/sql-reference/table-functions/jdbc)を参照してください。 + + + + +メッセージキューは、対応するテーブルエンジンを使用して、ClickHouseにデータをストリーミングできます。 + +- **Kafka**: [`Kafka`テーブルエンジン](/docs/ja/engines/table-engines/integrations/kafka)を使用してKafkaと統合 +- **Amazon MSK**: [Amazon Managed Streaming for Apache Kafka (MSK)](/docs/ja/integrations/kafka/cloud/amazon-msk/)と統合 +- **RabbitMQ**: [`RabbitMQ`テーブルエンジン](/docs/ja/engines/table-engines/integrations/rabbitmq)を使用してRabbitMQと統合 + + + + +ClickHouseは、以下のソースからデータを読み取るためのテーブル関数を備えています。 + +- **Hadoop**: [`hdfs`テーブル関数](/docs/ja/sql-reference/table-functions/hdfs)を使用してApache Hadoopと統合 +- **Hudi**: [`hudi`テーブル関数](/docs/ja/sql-reference/table-functions/hudi)を使用してS3の既存のApache Hudiテーブルを読み取り +- **Iceberg**: [`iceberg`テーブル関数](/docs/ja/sql-reference/table-functions/iceberg)を使用してS3の既存のApache Icebergテーブルを読み取り +- **DeltaLake**: [`deltaLake`テーブル関数](/docs/ja/sql-reference/table-functions/deltalake)を使用してS3の既存のDelta Lakeテーブルを読み取り + + + + +ClickHouseとの既存のフレームワークやデータソースを接続する方法については、[ClickHouse統合リスト](/docs/ja/integrations)を確認してください。 + + + + +## 次のステップは? + +- ClickHouseの主要な概念と機能をさらに詳しく探求する[上級者向けチュートリアル](tutorial.md)をご覧ください +- [ClickHouseアカデミー](https://learn.clickhouse.com/visitor_class_catalog)で無料のオンデマンドトレーニングコースを受講して学習を続けましょう +- [サンプルデータセット](/docs/ja/getting-started/example-datasets/)と、それらを挿入する方法に関する説明があります +- データが外部ソースから来る場合、メッセージキュー、データベース、パイプラインなどへの接続方法について[統合ガイドのコレクション](/docs/ja/integrations/)を参照してください +- UI/BIビジュアライゼーションツールを使用している場合、[ClickHouseにUIを接続するためのユーザーガイド](/docs/ja/integrations/data-visualization/)を参照してください +- [主キー](/docs/ja/guides/best-practices/sparse-primary-indexes.md)に関するユーザーガイドで、主キーについて知っておくべきすべての情報を確認し、定義方法を理解しましょう diff --git a/docs/ja/settings/beta-and-experimental-features.md b/docs/ja/settings/beta-and-experimental-features.md new file mode 100644 index 00000000000..d494983244d --- /dev/null +++ b/docs/ja/settings/beta-and-experimental-features.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 1 +sidebar_label: ベータ機能とエクスペリメンタル機能 +title: ベータおよびエクスペリメンタル機能 +description: "ClickHouseにはベータ版およびエクスペリメンタル機能があります。このドキュメントページではその定義を説明します。" +slug: /ja/beta-and-experimental-features +--- + +ClickHouseはオープンソースであるため、ClickHouseの社員だけでなくコミュニティからも多くの貢献を受けています。これらの貢献はしばしば異なるスピードで開発され、ある機能は一般提供 (GA) と見なされるまでに、長い試作段階やコミュニティからの十分なフィードバックと反復が必要です。 + +機能が一般提供として分類される時期の不確実性のために、機能を2つのカテゴリに分類しています: **ベータ**と**エクスペリメンタル**。 + +**ベータ**機能はClickHouseチームにより公式にサポートされています。**エクスペリメンタル**機能はClickHouseチームまたはコミュニティによる初期のプロトタイプで、公式にはサポートされていません。 + +以下のセクションでは、**ベータ**および**エクスペリメンタル**機能の特性を明確に説明しています。 + +## ベータ機能 + +- 一般提供 (GA) に向けて活発に開発中 +- 主な既知の問題はGitHubで追跡可能 +- 機能は将来的に変更される可能性あり +- ClickHouse Cloudで有効化される可能性あり +- ClickHouseチームがベータ機能をサポート + +以下の機能は、ClickHouse Cloudでベータとみなされ、まだClickHouseのSETTINGで```allow_experimental_*```と名付けられているものでも、ClickHouse Cloud Servicesで使用可能です。 + +注意: 最近導入された機能を使用するには、ClickHouse [互換性](https://clickhouse.com/docs/ja/operations/settings/settings#compatibility)設定の最新バージョンを使用していることを確認してください。 + +## エクスペリメンタル機能 + +- GAになることがないかもしれない +- 削除される可能性がある +- 破壊的変更を導入することがある +- 機能は将来的に変更される可能性がある +- 意図的に有効化する必要がある +- ClickHouseチームはエクスペリメンタル機能を**サポートしない** +- 重要な機能やドキュメントが欠如しているかもしれない +- クラウドで有効化することはできない + +注意: 上記でベータとしてリストされているもの以外のエクスペリメンタルな機能は、ClickHouse Cloudで有効化することはできません。 diff --git a/docs/ja/tools-and-utilities/static-files-disk-uploader.md b/docs/ja/tools-and-utilities/static-files-disk-uploader.md new file mode 100644 index 00000000000..1ee43da9ff3 --- /dev/null +++ b/docs/ja/tools-and-utilities/static-files-disk-uploader.md @@ -0,0 +1,82 @@ +--- +slug: /ja/operations/utilities/static-files-disk-uploader +title: clickhouse-static-files-disk-uploader +keywords: [clickhouse-static-files-disk-uploader, ユーティリティ, ディスク, アップローダー] +--- + +# clickhouse-static-files-disk-uploader + +指定された ClickHouse テーブル用のメタデータを含むデータディレクトリを出力します。このメタデータは、`web` ディスクによってバックアップされた読み取り専用データセットを含む ClickHouse テーブルを異なるサーバーで作成するために使用できます。 + +データの移行にはこのツールを使用しないでください。代わりに、[`BACKUP` と `RESTORE` コマンド](/docs/ja/operations/backup)を使用してください。 + +## 使用法 + +``` +$ clickhouse static-files-disk-uploader [args] +``` + +## コマンド + +|コマンド|説明| +|---|---| +|`-h`, `--help`|ヘルプ情報を表示| +|`--metadata-path [path]`|指定されたテーブルのメタデータを含むパス| +|`--test-mode`|`test` モードを有効にし、テーブルメタデータを指定された URL に PUT リクエストとして送信| +|`--link`|ファイルをコピーする代わりに symlink を作成| +|`--url [url]`|`test` モード用のウェブサーバー URL| +|`--output-dir [dir]`|`non-test` モードでファイルを出力するディレクトリ| + +## 指定されたテーブルのメタデータパスを取得する + +`clickhouse-static-files-disk-uploader` を使用する際には、目的のテーブルのメタデータパスを取得する必要があります。 + +1. 目的のテーブルとデータベースを指定して、次のクエリを実行します: + +
    + +```sql +SELECT data_paths + FROM system.tables + WHERE name = 'mytable' AND database = 'default'; +``` + +2. これにより、指定されたテーブルのデータディレクトリへのパスが返されます: + +
    + +``` +┌─data_paths────────────────────────────────────────────┐ +│ ['./store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee/'] │ +└───────────────────────────────────────────────────────┘ +``` + +## ローカルファイルシステムにテーブルメタデータディレクトリを出力する + +ターゲット出力ディレクトリ `output` と指定されたメタデータパスを使用して、次のコマンドを実行します: + +``` +$ clickhouse static-files-disk-uploader --output-dir output --metadata-path ./store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee/ +``` + +成功した場合、次のメッセージが表示され、`output` ディレクトリに指定されたテーブルのメタデータが含まれているはずです: + +``` +Data path: "/Users/john/store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee", destination path: "output" +``` + +## 外部 URL にテーブルメタデータディレクトリを出力する + +このステップは、データディレクトリをローカルファイルシステムに出力する場合と似ていますが、 追加で `--test-mode` フラグを使用します。出力ディレクトリを指定する代わりに、`--url` フラグを介してターゲット URL を指定する必要があります。 + +`test` モードが有効になっている場合、テーブルメタデータディレクトリが指定された URL に PUT リクエストとしてアップロードされます。 + +``` +$ clickhouse static-files-disk-uploader --test-mode --url http://nginx:80/test1 --metadata-path ./store/bcc/bccc1cfd-d43d-43cf-a5b6-1cda8178f1ee/ +``` + +## テーブルメタデータディレクトリを使用して ClickHouse テーブルを作成する + +テーブルメタデータディレクトリを手に入れたら、それを使用して異なるサーバーで ClickHouse テーブルを作成できます。 + +デモを示す [この GitHub リポジトリ](https://github.com/ClickHouse/web-tables-demo)をご覧ください。例では、`web` ディスクを使用してテーブルを作成し、異なるサーバー上のデータセットにテーブルをアタッチします。 diff --git a/docs/ja/tutorial.md b/docs/ja/tutorial.md new file mode 100644 index 00000000000..d957de8ea21 --- /dev/null +++ b/docs/ja/tutorial.md @@ -0,0 +1,495 @@ +--- +slug: /ja/tutorial +sidebar_label: 高度なチュートリアル +sidebar_position: 0.5 +keywords: [clickhouse, install, tutorial, dictionary, dictionaries] +--- +import SQLConsoleDetail from '@site/docs/ja/_snippets/_launch_sql_console.md'; + +# 高度なチュートリアル + +## このチュートリアルから何を期待できますか? + +このチュートリアルでは、テーブルを作成し、大規模なデータセット(二百万行の[ニューヨークのタクシーデータ](/docs/ja/getting-started/example-datasets/nyc-taxi.md))を挿入します。その後、データセットに対してクエリを実行し、Dictionaryを作成してJOINを実行する例を含めます。 + +:::note +このチュートリアルは、稼働中のClickHouseサービスにアクセスできることを前提としています。もしない場合は、[クイックスタート](./quick-start.mdx)をご覧ください。 +::: + +## 1. 新しいテーブルを作成する + +ニューヨーク市のタクシーデータには、数百万のタクシー乗車の詳細が含まれており、乗車と降車の時間と場所、料金、チップの金額、通行料、支払い方法などがカラムとして含まれています。このデータを保存するテーブルを作成しましょう... + +1. SQLコンソールに接続する + + + + セルフマネージドのClickHouseを使用している場合は、https://_hostname_:8443/playでSQLコンソールに接続できます(詳細はClickHouse管理者にお問い合わせください)。 + +1. `default` データベースに次の `trips` テーブルを作成します: + ```sql + CREATE TABLE trips + ( + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 + ) + ENGINE = MergeTree + PARTITION BY toYYYYMM(pickup_date) + ORDER BY pickup_datetime; + ``` + +## 2. データセットを挿入する + +テーブルを作成したので、NYCタクシーデータを追加しましょう。このデータはS3内のCSVファイルにあり、そこからデータをロードできます。 + +1. 次のコマンドにより、2つの異なるS3ファイル `trips_1.tsv.gz` と `trips_2.tsv.gz` から `trips` テーブルに約2,000,000行を挿入します: + ```sql + INSERT INTO trips + SELECT * FROM s3( + 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{1..2}.gz', + 'TabSeparatedWithNames', " + `trip_id` UInt32, + `vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15), + `pickup_date` Date, + `pickup_datetime` DateTime, + `dropoff_date` Date, + `dropoff_datetime` DateTime, + `store_and_fwd_flag` UInt8, + `rate_code_id` UInt8, + `pickup_longitude` Float64, + `pickup_latitude` Float64, + `dropoff_longitude` Float64, + `dropoff_latitude` Float64, + `passenger_count` UInt8, + `trip_distance` Float64, + `fare_amount` Float32, + `extra` Float32, + `mta_tax` Float32, + `tip_amount` Float32, + `tolls_amount` Float32, + `ehail_fee` Float32, + `improvement_surcharge` Float32, + `total_amount` Float32, + `payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4), + `trip_type` UInt8, + `pickup` FixedString(25), + `dropoff` FixedString(25), + `cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3), + `pickup_nyct2010_gid` Int8, + `pickup_ctlabel` Float32, + `pickup_borocode` Int8, + `pickup_ct2010` String, + `pickup_boroct2010` String, + `pickup_cdeligibil` String, + `pickup_ntacode` FixedString(4), + `pickup_ntaname` String, + `pickup_puma` UInt16, + `dropoff_nyct2010_gid` UInt8, + `dropoff_ctlabel` Float32, + `dropoff_borocode` UInt8, + `dropoff_ct2010` String, + `dropoff_boroct2010` String, + `dropoff_cdeligibil` String, + `dropoff_ntacode` FixedString(4), + `dropoff_ntaname` String, + `dropoff_puma` UInt16 + ") SETTINGS input_format_try_infer_datetimes = 0 + ``` + +2. `INSERT` が完了するのを待ちます。150 MBのデータがダウンロードされるのに少し時間がかかるかもしれません。 + + :::note + `s3` 関数はデータを自動的に解凍する方法を知っており、`TabSeparatedWithNames` フォーマットはデータがタブ区切りであり、各ファイルのヘッダー行をスキップするようClickHouseに指示します。 + ::: + +3. 挿入が終了したら、それが正常に動作したか確認してください: + ```sql + SELECT count() FROM trips + ``` + + 約2M行(厳密には1,999,657行)を見ることができるはずです。 + + :::note + ClickHouseがカウントを決定するために処理しなければならなかった行数と、どれほど迅速であるか注意してください。わずか0.001秒で6行だけ処理してカウントを取得できます。(その6は、`trips` テーブルが現在持つ **パーツ** の数であり、パーツは自身の行数を知っています。) + ::: + +4. すべての行をクロールする必要があるクエリを実行すると、処理する行数が大幅に増加することに気付くでしょうが、実行時間は依然として非常に速いままです: + ```sql + SELECT DISTINCT(pickup_ntaname) FROM trips + ``` + + このクエリは2M行を処理し、190の値を返す必要がありますが、約1秒でそれを行います。`pickup_ntaname` カラムは、タクシー乗車が始まったニューヨーク市の地域の名前を表します。 + +## 3. データを分析する + +2M行のデータを分析するクエリをいくつか実行してみましょう... + +1. まず、平均チップ額を計算するような簡単な計算から始めます: + ```sql + SELECT round(avg(tip_amount), 2) FROM trips + ``` + + 応答は以下のとおりです: + ```response + ┌─round(avg(tip_amount), 2)─┐ + │ 1.68 │ + └───────────────────────────┘ + ``` + +2. 次のクエリは、乗客数に基づいた平均費用を計算します: + ```sql + SELECT + passenger_count, + ceil(avg(total_amount),2) AS average_total_amount + FROM trips + GROUP BY passenger_count + ``` + + `passenger_count` の範囲は0から9までです: + ```response + ┌─passenger_count─┬─average_total_amount─┐ + │ 0 │ 22.69 │ + │ 1 │ 15.97 │ + │ 2 │ 17.15 │ + │ 3 │ 16.76 │ + │ 4 │ 17.33 │ + │ 5 │ 16.35 │ + │ 6 │ 16.04 │ + │ 7 │ 59.8 │ + │ 8 │ 36.41 │ + │ 9 │ 9.81 │ + └─────────────────┴──────────────────────┘ + ``` + +3. ここでは、地域ごとの日次乗車数を計算するクエリがあります: + ```sql + SELECT + pickup_date, + pickup_ntaname, + SUM(1) AS number_of_trips + FROM trips + GROUP BY pickup_date, pickup_ntaname + ORDER BY pickup_date ASC + ``` + + 結果は以下のようになります: + ```response + ┌─pickup_date─┬─pickup_ntaname───────────────────────────────────────────┬─number_of_trips─┐ + │ 2015-07-01 │ Brooklyn Heights-Cobble Hill │ 13 │ + │ 2015-07-01 │ Old Astoria │ 5 │ + │ 2015-07-01 │ Flushing │ 1 │ + │ 2015-07-01 │ Yorkville │ 378 │ + │ 2015-07-01 │ Gramercy │ 344 │ + │ 2015-07-01 │ Fordham South │ 2 │ + │ 2015-07-01 │ SoHo-TriBeCa-Civic Center-Little Italy │ 621 │ + │ 2015-07-01 │ Park Slope-Gowanus │ 29 │ + │ 2015-07-01 │ Bushwick South │ 5 │ + ``` + +4. このクエリは、旅行時間を計算し、その値で結果をグループ化します: + ```sql + SELECT + avg(tip_amount) AS avg_tip, + avg(fare_amount) AS avg_fare, + avg(passenger_count) AS avg_passenger, + count() AS count, + truncate(date_diff('second', pickup_datetime, dropoff_datetime)/60) as trip_minutes + FROM trips + WHERE trip_minutes > 0 + GROUP BY trip_minutes + ORDER BY trip_minutes DESC + ``` + + 結果は以下のようになります: + ```response + ┌──────────────avg_tip─┬───────────avg_fare─┬──────avg_passenger─┬──count─┬─trip_minutes─┐ + │ 1.9600000381469727 │ 8 │ 1 │ 1 │ 27511 │ + │ 0 │ 12 │ 2 │ 1 │ 27500 │ + │ 0.542166673981895 │ 19.716666666666665 │ 1.9166666666666667 │ 60 │ 1439 │ + │ 0.902499997522682 │ 11.270625001192093 │ 1.95625 │ 160 │ 1438 │ + │ 0.9715789457909146 │ 13.646616541353383 │ 2.0526315789473686 │ 133 │ 1437 │ + │ 0.9682692398245518 │ 14.134615384615385 │ 2.076923076923077 │ 104 │ 1436 │ + │ 1.1022105210705808 │ 13.778947368421052 │ 2.042105263157895 │ 95 │ 1435 │ + ``` + +5. このクエリは各時間帯の地域ごとの乗車数を表示します: + ```sql + SELECT + pickup_ntaname, + toHour(pickup_datetime) as pickup_hour, + SUM(1) AS pickups + FROM trips + WHERE pickup_ntaname != '' + GROUP BY pickup_ntaname, pickup_hour + ORDER BY pickup_ntaname, pickup_hour + ``` + + 結果は以下のようになります: + ```response + ┌─pickup_ntaname───────────────────────────────────────────┬─pickup_hour─┬─pickups─┐ + │ Airport │ 0 │ 3509 │ + │ Airport │ 1 │ 1184 │ + │ Airport │ 2 │ 401 │ + │ Airport │ 3 │ 152 │ + │ Airport │ 4 │ 213 │ + │ Airport │ 5 │ 955 │ + │ Airport │ 6 │ 2161 │ + │ Airport │ 7 │ 3013 │ + │ Airport │ 8 │ 3601 │ + │ Airport │ 9 │ 3792 │ + │ Airport │ 10 │ 4546 │ + │ Airport │ 11 │ 4659 │ + │ Airport │ 12 │ 4621 │ + │ Airport │ 13 │ 5348 │ + │ Airport │ 14 │ 5889 │ + │ Airport │ 15 │ 6505 │ + │ Airport │ 16 │ 6119 │ + │ Airport │ 17 │ 6341 │ + │ Airport │ 18 │ 6173 │ + │ Airport │ 19 │ 6329 │ + │ Airport │ 20 │ 6271 │ + │ Airport │ 21 │ 6649 │ + │ Airport │ 22 │ 6356 │ + │ Airport │ 23 │ 6016 │ + │ Allerton-Pelham Gardens │ 4 │ 1 │ + │ Allerton-Pelham Gardens │ 6 │ 1 │ + │ Allerton-Pelham Gardens │ 7 │ 1 │ + │ Allerton-Pelham Gardens │ 9 │ 5 │ + │ Allerton-Pelham Gardens │ 10 │ 3 │ + │ Allerton-Pelham Gardens │ 15 │ 1 │ + │ Allerton-Pelham Gardens │ 20 │ 2 │ + │ Allerton-Pelham Gardens │ 23 │ 1 │ + │ Annadale-Huguenot-Prince's Bay-Eltingville │ 23 │ 1 │ + │ Arden Heights │ 11 │ 1 │ + ``` + +6. ラガーディア(LGA)またはJFK空港への移動を見てみましょう: + ```sql + SELECT + pickup_datetime, + dropoff_datetime, + total_amount, + pickup_nyct2010_gid, + dropoff_nyct2010_gid, + CASE + WHEN dropoff_nyct2010_gid = 138 THEN 'LGA' + WHEN dropoff_nyct2010_gid = 132 THEN 'JFK' + END AS airport_code, + EXTRACT(YEAR FROM pickup_datetime) AS year, + EXTRACT(DAY FROM pickup_datetime) AS day, + EXTRACT(HOUR FROM pickup_datetime) AS hour + FROM trips + WHERE dropoff_nyct2010_gid IN (132, 138) + ORDER BY pickup_datetime + ``` + + 応答は以下のとおりです: + ```response + ┌─────pickup_datetime─┬────dropoff_datetime─┬─total_amount─┬─pickup_nyct2010_gid─┬─dropoff_nyct2010_gid─┬─airport_code─┬─year─┬─day─┬─hour─┐ + │ 2015-07-01 00:04:14 │ 2015-07-01 00:15:29 │ 13.3 │ -34 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:09:42 │ 2015-07-01 00:12:55 │ 6.8 │ 50 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:23:04 │ 2015-07-01 00:24:39 │ 4.8 │ -125 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:27:51 │ 2015-07-01 00:39:02 │ 14.72 │ -101 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:32:03 │ 2015-07-01 00:55:39 │ 39.34 │ 48 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:34:12 │ 2015-07-01 00:40:48 │ 9.95 │ -93 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:38:26 │ 2015-07-01 00:49:00 │ 13.3 │ -11 │ 138 │ LGA │ 2015 │ 1 │ 0 │ + │ 2015-07-01 00:41:48 │ 2015-07-01 00:44:45 │ 6.3 │ -94 │ 132 │ JFK │ 2015 │ 1 │ 0 │ + │ 2015-07-01 01:06:18 │ 2015-07-01 01:14:43 │ 11.76 │ 37 │ 132 │ JFK │ 2015 │ 1 │ 1 │ + ``` + +## 4. Dictionaryを作成する + +ClickHouse初心者の方は、***Dictionary***の動作を理解することが重要です。Dictionaryを考えるシンプルな方法は、メモリ内に格納されたキー->値のペアのマッピングです。詳細やDictionaryのすべてのオプションはチュートリアルの最後にリンクされています。 + +1. ClickHouseサービス内のテーブルに関連付けられたDictionaryを作成する方法を見てみましょう。表とそのDictionaryは、NYCの各地域を示す265行のCSVファイルに基づきます。これらの地域はニューヨーク市の各行政区の名前にマッピングされており(ニューヨーク市には5つの行政区があります:ブロンクス、ブルックリン、マンハッタン、クイーンズ、スタテンアイランド)、このファイルはニューアーク空港(EWR)も1つの行政区として数えます。 + + これはCSVファイルの一部です(明確にするために表として表示されています)。ファイル内の`LocationID` カラムは、`trips` テーブル内の`pickup_nyct2010_gid` と `dropoff_nyct2010_gid` カラムにマッピングされます: + + | LocationID | Borough | Zone | service_zone | + | ----------- | -------------- | ------------------------ | ----------- | + | 1 | EWR | Newark Airport | EWR | + | 2 | Queens | Jamaica Bay | Boro Zone | + | 3 | Bronx | Allerton/Pelham Gardens | Boro Zone | + | 4 | Manhattan | Alphabet City | Yellow Zone | + | 5 | Staten Island | Arden Heights | Boro Zone | + +2. ファイルのURLは `https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv` です。次のSQLを実行してください、これは`taxi_zone_dictionary`という名のDictionaryを作成し、S3のCSVファイルからDictionaryを読み込みます: + ```sql + CREATE DICTIONARY taxi_zone_dictionary + ( + `LocationID` UInt16 DEFAULT 0, + `Borough` String, + `Zone` String, + `service_zone` String + ) + PRIMARY KEY LocationID + SOURCE(HTTP(URL 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv' FORMAT 'CSVWithNames')) + LIFETIME(MIN 0 MAX 0) + LAYOUT(HASHED_ARRAY()) + ``` + + :::note + `LIFETIME`を0に設定することで、Dictionaryはソースとともに更新されることはありません。ここでは不要なトラフィックをS3バケットに送らないように使用されていますが、一般的には任意のLifetime値を指定できます。 + + 例えば: + + ```sql + LIFETIME(MIN 1 MAX 10) + ``` + と設定すると、辞書は1秒から10秒の間のランダムな時間後に更新されます。(ランダムな時間は、多数のサーバーでの更新時に辞書ソースへの負荷を分散するために必要です。) + ::: + +3. 正常に動作した事を確認してください - あなたは265行(各地域ごとに1行)を取得します: + ```sql + SELECT * FROM taxi_zone_dictionary + ``` + +4. `dictGet`関数(およびその[バリエーション](./sql-reference/functions/ext-dict-functions.md))を使用してDictionaryから値を取得します。辞書の名前、取得したい値、およびキー(この例では`taxi_zone_dictionary`の`LocationID`カラム)を渡します。 + + 例えば、以下のクエリは、`LocationID`が132である`Borough`を返します(これは上で見たようにJFK空港です): + ```sql + SELECT dictGet('taxi_zone_dictionary', 'Borough', 132) + ``` + + JFKはクイーンズにあり、値を取得する時間は本質的に0であることに注意してください: + ```response + ┌─dictGet('taxi_zone_dictionary', 'Borough', 132)─┐ + │ Queens │ + └─────────────────────────────────────────────────┘ + + 1 rows in set. Elapsed: 0.004 sec. + ``` + +5. `dictHas`関数を使用してDictionaryにキーが存在するかどうかを確認します。たとえば、次のクエリは1を返します(これはClickHouseでの"true"に相当します): + ```sql + SELECT dictHas('taxi_zone_dictionary', 132) + ``` + +6. 次のクエリは、辞書に`LocationID`の値4567がないため、0を返します: + ```sql + SELECT dictHas('taxi_zone_dictionary', 4567) + ``` + +7. クエリで辞書の名称を取得するために`dictGet`関数を使用します。例えば: + ```sql + SELECT + count(1) AS total, + dictGetOrDefault('taxi_zone_dictionary','Borough', toUInt64(pickup_nyct2010_gid), 'Unknown') AS borough_name + FROM trips + WHERE dropoff_nyct2010_gid = 132 OR dropoff_nyct2010_gid = 138 + GROUP BY borough_name + ORDER BY total DESC + ``` + + このクエリは、ラガーディアまたはJFK空港で終わるタクシー乗車の区分を合計します。結果は以下のようになり、出発地域が不明なトリップがかなりあることに注意してください: + ```response + ┌─total─┬─borough_name──┐ + │ 23683 │ Unknown │ + │ 7053 │ Manhattan │ + │ 6828 │ Brooklyn │ + │ 4458 │ Queens │ + │ 2670 │ Bronx │ + │ 554 │ Staten Island │ + │ 53 │ EWR │ + └───────┴───────────────┘ + + 7 rows in set. Elapsed: 0.019 sec. Processed 2.00 million rows, 4.00 MB (105.70 million rows/s., 211.40 MB/s.) + ``` + +## 5. Joinを実行する + +それでは、`taxi_zone_dictionary`と`trips`テーブルを結合するクエリを何本か書いてみましょう。 + +1. 単純な`JOIN`から始めましょう。これは前述の空港クエリと似ています: + ```sql + SELECT + count(1) AS total, + Borough + FROM trips + JOIN taxi_zone_dictionary ON toUInt64(trips.pickup_nyct2010_gid) = taxi_zone_dictionary.LocationID + WHERE dropoff_nyct2010_gid = 132 OR dropoff_nyct2010_gid = 138 + GROUP BY Borough + ORDER BY total DESC + ``` + + 応答はおなじみのものです: + ```response + ┌─total─┬─Borough───────┐ + │ 7053 │ Manhattan │ + │ 6828 │ Brooklyn │ + │ 4458 │ Queens │ + │ 2670 │ Bronx │ + │ 554 │ Staten Island │ + │ 53 │ EWR │ + └───────┴───────────────┘ + + 6 rows in set. Elapsed: 0.034 sec. Processed 2.00 million rows, 4.00 MB (59.14 million rows/s., 118.29 MB/s.) + ``` + + :::note + 上記の`JOIN`クエリの出力は、前述の`dictGetOrDefault`を使用したクエリと同じです(`Unknown`値が含まれていないことを除いて)。裏では、ClickHouseは実際に`taxi_zone_dictionary`辞書に対して`dictGet`関数を呼び出していますが、`JOIN`構文はSQL開発者にとってより親しみやすいものです。 + ::: + +2. ClickHouseでは`SELECT *`をあまり使用しません - 必要なカラムのみを取得すべきです!しかし、長時間実行されるクエリを見つけるのは困難なので、このクエリはすべてのカラムを選択し、すべての行を返す(ただしデフォルトで応答には最大10,000行の制限があります)、さらにすべての行を辞書と右結合することを意図的に行います: + ```sql + SELECT * + FROM trips + JOIN taxi_zone_dictionary + ON trips.dropoff_nyct2010_gid = taxi_zone_dictionary.LocationID + WHERE tip_amount > 0 + ORDER BY tip_amount DESC + LIMIT 1000 + ``` + +#### おめでとうございます! + +お疲れ様でした!チュートリアルを無事に完了し、ClickHouseの使い方についての理解が深まったことを願っています。次に何をするかのオプションはこちらです: + +- [ClickHouseの主キーの動作について](./guides/best-practices/sparse-primary-indexes.md)読む - これはClickHouseのエキスパートになる旅に大いに役立ちます +- ファイル、Kafka、PostgreSQL、データパイプライン、その他多くのデータソースといった[外部データソースを統合する](/docs/ja/integrations/index.mdx) +- [お気に入りのUI/BIツール](./integrations/data-visualization.md)をClickHouseに接続する +- [SQLリファレンス](./sql-reference/index.md)を確認し、さまざまな関数を参照すること。ClickHouseには、データの変換、処理、分析のための素晴らしいコレクションがあります +- [Dictionaries](/docs/ja/sql-reference/dictionaries/index.md)についてさらに学ぶ diff --git a/docs/ja/use-cases/observability/demo-application.md b/docs/ja/use-cases/observability/demo-application.md new file mode 100644 index 00000000000..cf78422da45 --- /dev/null +++ b/docs/ja/use-cases/observability/demo-application.md @@ -0,0 +1,8 @@ +--- +title: デモアプリケーション +description: 観測性のためのデモアプリケーション +slug: /ja/observability/demo-application +keywords: [観測性, ログ, トレース, メトリクス, OpenTelemetry, Grafana, otel] +--- + +Open Telemetry プロジェクトには、[デモアプリケーション](https://opentelemetry.io/docs/demo/)が含まれています。このアプリケーションのフォーク版で、ClickHouse をログとトレースのデータソースとして活用しているものが[こちら](https://github.com/ClickHouse/opentelemetry-demo)にあります。公式の[デモ手順](https://opentelemetry.io/docs/demo/docker-deployment/)に従って、このデモを Docker でデプロイできます。既存の[コンポーネント](https://opentelemetry.io/docs/demo/collector-data-flow-dashboard/)に加えて、ClickHouse のインスタンスがデプロイされ、ログとトレースのストレージとして使用されます。 diff --git a/docs/ja/use-cases/observability/grafana.md b/docs/ja/use-cases/observability/grafana.md new file mode 100644 index 00000000000..3eba84fc232 --- /dev/null +++ b/docs/ja/use-cases/observability/grafana.md @@ -0,0 +1,241 @@ +--- +title: Grafanaの使用 +description: GrafanaとClickHouseを使用したオブザーバビリティ +slug: /ja/observability/grafana +keywords: [observability, logs, traces, metrics, OpenTelemetry, Grafana, otel] +--- + +# GrafanaとClickHouseを使用したオブザーバビリティ + +Grafanaは、ClickHouseにおけるオブザーバビリティデータの視覚化ツールとして推奨されています。これは、Grafana用の公式ClickHouseプラグインを使用して実現します。インストール手順は[こちら](/ja/integrations/grafana)で参照できます。 + +プラグインのバージョン4では、ログとトレースが新しいクエリビルダーエクスペリエンスにおいて第一級の存在となっています。これにより、SREがSQLクエリを書かずに済む環境を提供し、SQLベースのオブザーバビリティを簡素化し、この新しいパラダイムを推進します。この一環として、Open Telemetry (OTel) をプラグインの中核に据え、今後数年間のSQLベースのオブザーバビリティの基盤になると考えています。 + +## Open Telemetry統合 + +GrafanaでClickhouseデータソースを設定する際、ユーザーはログおよびトレース用のデフォルトのデータベースとテーブルを指定し、これらのテーブルがOTelスキーマに準拠しているかどうかを指定できます。これにより、プラグインはGrafanaでログとトレースを正確に表示するためのカラムを返します。デフォルトのOTelスキーマを変更して独自のカラム名を使用する場合は、これらを指定することができます。時刻(Timestamp)、ログレベル(SeverityText)、メッセージ本文(Body)などのカラム名をデフォルトのOTelカラム名のままで使用する場合、変更は不要です。 + +> ユーザーは、HTTPまたはネイティブプロトコルを使用してGrafanaをClickHouseに接続できます。後者は、Grafanaユーザーが発行する集約クエリで顕著な性能向上を提供することはほとんどありませんが、HTTPプロトコルは通常ユーザーにとってプロキシや内省が簡単です。 + +ログ設定には、ログを正しく表示するために、時刻、ログレベル、およびメッセージカラムが必要です。 + +トレース設定はもう少し複雑です(完全なリストは[こちら](/ja/engines/table-engines/mergetree-family/mergetree#mergetree-data-storage))。ここで必要なカラムは、その後にフルトレースプロファイルを構築するためのクエリを抽象化するために必要です。これらのクエリは、データがOTelと類似した構造を持っていることを前提としているため、標準スキーマから大きく逸脱しているユーザーは、この機能の恩恵を受けるためにビューを使用する必要があります。 + +NEEDS ALT + +
    + +設定が完了すると、ユーザーは[Grafana Explore](https://grafana.com/docs/grafana/latest/explore/)に移動してログとトレースの検索を開始できます。 + +## ログ + +Grafanaのログに関する要件に従う場合、クエリビルダーで `Query Type: Log` を選択して `Run Query` をクリックできます。クエリビルダーは、ログをリストして表示するためのクエリを作成します。例えば次のように: + +```sql +SELECT Timestamp as timestamp, Body as body, SeverityText as level, TraceId as traceID FROM "default"."otel_logs" WHERE ( timestamp >= $__fromTime AND timestamp <= $__toTime ) ORDER BY timestamp DESC LIMIT 1000 +``` + +NEEDS ALT + +
    + +クエリビルダーは、ユーザーがSQLを書く必要を避ける簡単な手段を提供します。キーワードを含むログを見つけることを含むフィルタリングは、クエリビルダーで行えます。より複雑なクエリを書くことを望むユーザーは、SQLエディタに切り替えることができます。適切なカラムが返され、`logs` がクエリタイプとして選択されている限り、結果はログとしてレンダリングされます。ログのレンダリングに必要なカラムは[こちら](https://grafana.com/developers/plugin-tools/tutorials/build-a-logs-data-source-plugin#logs-data-frame-format)に記載されています。 + +### トレースへのログ + +ログがトレースIDを含む場合、特定のログ行からトレースを閲覧することができます。 + +NEEDS ALT + +
    + +## トレース + +前述のログ体験と同様に、Grafanaがトレースをレンダリングするために必要なカラムが満たされている場合(例えば、OTelスキーマを使用している場合)、クエリビルダーは必要なクエリを自動的に作成することができます。`Query Type: Traces` を選択し、`Run Query` をクリックすると、以下のようなクエリが生成され実行されます(設定されたカラムに依存しており、以下はOTelを使用することを前提としています): + +```sql +SELECT "TraceId" as traceID, + "ServiceName" as serviceName, + "SpanName" as operationName, + "Timestamp" as startTime, + multiply("Duration", 0.000001) as duration +FROM "default"."otel_traces" +WHERE ( Timestamp >= $__fromTime AND Timestamp <= $__toTime ) + AND ( ParentSpanId = '' ) + AND ( Duration > 0 ) + ORDER BY Timestamp DESC, Duration DESC LIMIT 1000 +``` + +このクエリはGrafanaが期待するカラム名を返し、以下に示すようにトレースのテーブルをレンダリングします。継続時間や他のカラムを基にしたフィルタリングも、SQLを書くことなく実行できます。 + +NEEDS ALT + +
    + +より複雑なクエリを書きたいユーザーは、`SQL Editor`に切り替えることができます。 + +### トレース詳細の表示 + +上に示したように、トレースIDはクリック可能なリンクとして表示されます。トレースIDをクリックすると、リンク`View Trace`を通じて関連するスパンの表示を選択できます。これにより、スパンを必要な構造で取得し、結果をウォーターフォールとしてレンダリングするための以下のクエリ(OTelカラムを想定)が発行されます。 + +```sql +WITH '' as trace_id, + (SELECT min(Start) FROM "default"."otel_traces_trace_id_ts" + WHERE TraceId = trace_id) as trace_start, + (SELECT max(End) + 1 FROM "default"."otel_traces_trace_id_ts" + WHERE TraceId = trace_id) as trace_end +SELECT "TraceId" as traceID, + "SpanId" as spanID, + "ParentSpanId" as parentSpanID, + "ServiceName" as serviceName, + "SpanName" as operationName, + "Timestamp" as startTime, + multiply("Duration", 0.000001) as duration, + arrayMap(key -> map('key', key, 'value',"SpanAttributes"[key]), + mapKeys("SpanAttributes")) as tags, + arrayMap(key -> map('key', key, 'value',"ResourceAttributes"[key]), + mapKeys("ResourceAttributes")) as serviceTags +FROM "default"."otel_traces" +WHERE traceID = trace_id + AND startTime >= trace_start + AND startTime <= trace_end +LIMIT 1000 +``` + +> 上記クエリがトレースIDのルックアップを行うためにMaterialized View `otel_traces_trace_id_ts` を使用する方法に注目してください。詳細は「クエリの高速化 - ルックアップ用のMaterialized Viewsの活用」を参照してください。 + +NEEDS ALT + +
    + +### トレースからログへ + +ログがトレースIDを含む場合、ユーザーはトレースから関連するログへナビゲートできます。ログを表示するにはトレースIDをクリックし、`View Logs`を選択します。この操作は、デフォルトのOTelカラムを想定した以下のクエリを発行します。 + +```sql +SELECT Timestamp as "timestamp", + Body as "body", SeverityText as "level", + TraceId as "traceID" FROM "default"."otel_logs" +WHERE ( traceID = '' ) +ORDER BY timestamp ASC LIMIT 1000 +``` + +NEEDS ALT + +
    + +## ダッシュボード + +GrafanaでClickHouseデータソースを使用してダッシュボードを構築できます。詳細については、GrafanaとClickHouseの[データソースドキュメント](https://github.com/grafana/clickhouse-datasource)を参考にすることをお勧めします。特に[マクロ](https://github.com/grafana/clickhouse-datasource?tab=readme-ov-file#macros)と[変数](https://grafana.com/docs/grafana/latest/dashboards/variables/)の概念に焦点を当ててください。 + +プラグインは、OTelの仕様に準拠したログおよびトレースデータ用の例となるダッシュボード「Simple ClickHouse OTel dashboarding」を含む、いくつかの標準ダッシュボードを提供します。これは、ユーザーがOTelのデフォルトカラム名に準拠することを要求し、データソースの設定からインストールできます。 + +NEEDS ALT + +
    + +以下に、可視化のためのいくつかの簡単なヒントを提供します。 + +### 時系列 + +統計とともに、線グラフはオブザーバビリティの使用シーンで最も一般的な視覚化形式です。Clickhouseプラグインは、`datetime` に名前付けされた `time` と数値カラムを返すクエリの場合、自動的に線グラフをレンダリングします。例えば: + +```sql +SELECT + $__timeInterval(Timestamp) as time, + quantile(0.99)(Duration)/1000000 AS p99 +FROM otel_traces +WHERE + $__timeFilter(Timestamp) + AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime ) +GROUP BY time +ORDER BY time ASC +LIMIT 100000 +``` + +NEEDS ALT + +
    + +### 複数ラインのチャート + +以下の条件が満たされる場合、クエリのために複数ラインのチャートが自動的にレンダリングされます: + +- フィールド1: エイリアス名がtimeのdatetimeフィールド +- フィールド2: グループ化するための値。これはStringでなければなりません。 +- フィールド3以降: メトリック値 + +例えば: + +```sql +SELECT + $__timeInterval(Timestamp) as time, + ServiceName, + quantile(0.99)(Duration)/1000000 AS p99 +FROM otel_traces +WHERE $__timeFilter(Timestamp) +AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime ) +GROUP BY ServiceName, time +ORDER BY time ASC +LIMIT 100000 +``` + +NEEDS ALT + +
    + +### 地理データの可視化 + +以前のセクションでIP Dictionaryを使用して地理座標でオブザーバビリティデータを拡張する方法を探しました。`latitude` と `longitude` のカラムがあると仮定し、オブザーバビリティを `geohashEncode` 関数を使用して可視化できます。これにより、GrafanaのGeo Mapチャートと互換性のあるジオハッシュが生成されます。以下に例のクエリと可視化を示します: + +```sql +WITH coords AS + ( + SELECT + Latitude, + Longitude, + geohashEncode(Longitude, Latitude, 4) AS hash + FROM otel_logs_v2 + WHERE (Longitude != 0) AND (Latitude != 0) + ) +SELECT + hash, + count() AS heat, + round(log10(heat), 2) AS adj_heat +FROM coords +GROUP BY hash +``` + +NEEDS ALT + +
    diff --git a/docs/ja/use-cases/observability/images/observability-1.png b/docs/ja/use-cases/observability/images/observability-1.png new file mode 100644 index 00000000000..cee69d5a181 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-1.png differ diff --git a/docs/ja/use-cases/observability/images/observability-10.png b/docs/ja/use-cases/observability/images/observability-10.png new file mode 100644 index 00000000000..88dfafa2a3b Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-10.png differ diff --git a/docs/ja/use-cases/observability/images/observability-11.png b/docs/ja/use-cases/observability/images/observability-11.png new file mode 100644 index 00000000000..0b16712c0a4 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-11.png differ diff --git a/docs/ja/use-cases/observability/images/observability-12.png b/docs/ja/use-cases/observability/images/observability-12.png new file mode 100644 index 00000000000..a67ef6271cd Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-12.png differ diff --git a/docs/ja/use-cases/observability/images/observability-13.png b/docs/ja/use-cases/observability/images/observability-13.png new file mode 100644 index 00000000000..b7b710beb24 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-13.png differ diff --git a/docs/ja/use-cases/observability/images/observability-14.png b/docs/ja/use-cases/observability/images/observability-14.png new file mode 100644 index 00000000000..4af18b8994e Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-14.png differ diff --git a/docs/ja/use-cases/observability/images/observability-15.png b/docs/ja/use-cases/observability/images/observability-15.png new file mode 100644 index 00000000000..5bd30367f2d Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-15.png differ diff --git a/docs/ja/use-cases/observability/images/observability-16.png b/docs/ja/use-cases/observability/images/observability-16.png new file mode 100644 index 00000000000..e3b4ef7ba8f Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-16.png differ diff --git a/docs/ja/use-cases/observability/images/observability-17.png b/docs/ja/use-cases/observability/images/observability-17.png new file mode 100644 index 00000000000..a355b0fa3f3 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-17.png differ diff --git a/docs/ja/use-cases/observability/images/observability-18.png b/docs/ja/use-cases/observability/images/observability-18.png new file mode 100644 index 00000000000..5658c346fcc Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-18.png differ diff --git a/docs/ja/use-cases/observability/images/observability-19.png b/docs/ja/use-cases/observability/images/observability-19.png new file mode 100644 index 00000000000..936ae8723b6 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-19.png differ diff --git a/docs/ja/use-cases/observability/images/observability-2.png b/docs/ja/use-cases/observability/images/observability-2.png new file mode 100644 index 00000000000..1614ead5f70 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-2.png differ diff --git a/docs/ja/use-cases/observability/images/observability-20.png b/docs/ja/use-cases/observability/images/observability-20.png new file mode 100644 index 00000000000..dbbc5d9069a Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-20.png differ diff --git a/docs/ja/use-cases/observability/images/observability-21.png b/docs/ja/use-cases/observability/images/observability-21.png new file mode 100644 index 00000000000..07b4ba3c89c Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-21.png differ diff --git a/docs/ja/use-cases/observability/images/observability-22.png b/docs/ja/use-cases/observability/images/observability-22.png new file mode 100644 index 00000000000..a41e210c688 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-22.png differ diff --git a/docs/ja/use-cases/observability/images/observability-23.png b/docs/ja/use-cases/observability/images/observability-23.png new file mode 100644 index 00000000000..d31d4324cbb Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-23.png differ diff --git a/docs/ja/use-cases/observability/images/observability-24.png b/docs/ja/use-cases/observability/images/observability-24.png new file mode 100644 index 00000000000..cfb63c68ff4 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-24.png differ diff --git a/docs/ja/use-cases/observability/images/observability-3.png b/docs/ja/use-cases/observability/images/observability-3.png new file mode 100644 index 00000000000..bd65722fc8e Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-3.png differ diff --git a/docs/ja/use-cases/observability/images/observability-4.png b/docs/ja/use-cases/observability/images/observability-4.png new file mode 100644 index 00000000000..68b010e2c46 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-4.png differ diff --git a/docs/ja/use-cases/observability/images/observability-5.png b/docs/ja/use-cases/observability/images/observability-5.png new file mode 100644 index 00000000000..84b310c4a00 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-5.png differ diff --git a/docs/ja/use-cases/observability/images/observability-6.png b/docs/ja/use-cases/observability/images/observability-6.png new file mode 100644 index 00000000000..0b4032adfb9 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-6.png differ diff --git a/docs/ja/use-cases/observability/images/observability-7.png b/docs/ja/use-cases/observability/images/observability-7.png new file mode 100644 index 00000000000..71c7227726b Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-7.png differ diff --git a/docs/ja/use-cases/observability/images/observability-8.png b/docs/ja/use-cases/observability/images/observability-8.png new file mode 100644 index 00000000000..632346c5ff9 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-8.png differ diff --git a/docs/ja/use-cases/observability/images/observability-9.png b/docs/ja/use-cases/observability/images/observability-9.png new file mode 100644 index 00000000000..a3222c82421 Binary files /dev/null and b/docs/ja/use-cases/observability/images/observability-9.png differ diff --git a/docs/ja/use-cases/observability/index.md b/docs/ja/use-cases/observability/index.md new file mode 100644 index 00000000000..693fe1dec12 --- /dev/null +++ b/docs/ja/use-cases/observability/index.md @@ -0,0 +1,96 @@ +--- +title: オブザーバビリティ +description: ClickHouse をオブザーバビリティソリューションとして使用する +slug: /ja/observability +keywords: [オブザーバビリティ, ログ, トレース, メトリクス, OpenTelemetry, Grafana, otel] +--- + +# オブザーバビリティのための ClickHouse の使用 + +## はじめに + +このガイドは、ClickHouse を使用して独自の SQL ベースのオブザーバビリティソリューションを構築したいと考えているユーザー向けに設計されています。ログやトレースに焦点を当てています。 これには、インジェストの考慮事項、アクセスパターンに最適化されたスキーマ、および非構造化ログからの構造の抽出など、ソリューション構築のすべての側面をカバーしています。 + +ClickHouse はオブザーバビリティの即席ソリューションではありません。ただし、オブザーバビリティデータに対して比類のない圧縮率と高速なクエリ応答時間を提供できる非常に効率的なストレージエンジンとして使用できます。ユーザーが ClickHouse をオブザーバビリティソリューションとして使用するためには、ユーザーインターフェースとデータ収集フレームワークの両方が必要です。現在、オブザーバビリティシグナルの可視化には **Grafana** を、データ収集には **OpenTelemetry** を使用することを推奨しています(どちらも公式にサポートされている統合です)。 + +NEEDS ALT + +
    + +> データ収集には OpenTelemetry (OTeL) プロジェクトを使用することをお勧めしますが、同様のアーキテクチャは他のフレームワークやツール(例:Vector や Fluentd)を使用しても構築できます([Fluent Bit を使用した例](https://clickhouse.com/blog/kubernetes-logs-to-clickhouse-fluent-bit)を参照)。また、Superset や Metabase を含む代替の可視化ツールも存在します。 + +## なぜ ClickHouse を使用するのか? + +集中管理されたオブザーバビリティストアの最も重要な特徴は、多様なソースからの膨大な量のログデータを迅速に集約、分析、検索する能力です。この集中化により、トラブルシューティングが簡素化され、サービス中断の根本原因を特定しやすくなります。 + +ユーザーがますます価格に敏感になり、これらの即席ソリューションのコストが提供される価値と比較して高く予測不可能であると感じる中、クエリ性能が許容範囲内である場合のコスト効率の高い予測可能なログストレージの重要性が増しています。 + +その性能とコスト効率のため、ClickHouse はオブザーバビリティ製品におけるロギングおよびトレースのストレージエンジンの事実上の標準となっています。 + +より具体的には、以下の理由で ClickHouse はオブザーバビリティデータの保存に理想的です: + +- **圧縮** - オブザーバビリティデータには通常、HTTP コードやサービス名などの異なるセットからの値が含まれるフィールドがあります。ClickHouse の列指向ストレージでは値がソートされて格納されるため、このデータは非常にうまく圧縮されます。特に、時系列データに特化した様々なコーデックと組み合わせることで、さらに効果が高まります。他のデータストアでは、データの元のサイズ(通常は JSON 形式)と同じだけのストレージが必要ですが、ClickHouse は平均で最大 14 倍にログとトレースを圧縮します。大規模なオブザーバビリティインストールにおいて大幅なストレージ節約をもたらすだけでなく、この圧縮によりディスクからの読み取りデータが少なくなるため、クエリを高速化します。 +- **高速な集計** - オブザーバビリティソリューションは通常、エラーレートを示す線やトラフィックソースを示す棒グラフなどを通じてデータを可視化することに大きく依存しています。集計や GROUP BY はこれらのチャートを機能させるための基本であり、フィルタを適用した際に速く応答性がある必要があります。ClickHouse の列指向フォーマットとベクトル化されたクエリ実行エンジンは、高速な集計に理想的であり、スパースインデックスがユーザーのアクションに応じた迅速なデータフィルタリングを可能にします。 +- **高速な線形スキャン** - 代替技術の多くはログの高速なクエリに転置インデックスを利用していますが、これによりディスク使用量やリソース使用量が高くなる傾向があります。ClickHouse は追加のオプションで反転インデックスを提供していますが、線形スキャンは非常に並列化されており(設定を変更しない限り)、利用可能なすべてのマシンコアを使用します。これにより、毎秒 10 GB/s(圧縮済み)以上のマッチングのためにスキャンが可能です。最適化されたテキストマッチングオペレータを参照してください。 +- **SQL の親しみやすさ** - SQL はすべてのエンジニアにとってよく知られた言語であり、50年以上の開発を通じて、データ分析の事実上の標準言語としての地位を確立し続けています。オブザーバビリティは単なるデータ問題であり、SQL に最適です。 +- **分析機能** - ClickHouse は ANSI SQL を拡張し、SQL クエリを簡単に書きやすくする分析機能を提供します。これらは、データを切り分けて分析する必要がある根本原因分析を行うユーザーにとって不可欠です。 +- **二次インデックス** - ClickHouse はブルームフィルタなどの二次インデックスをサポートしており、特定のクエリプロファイルを高速化します。これらはカラムレベルで任意に有効にすることができ、コストと性能の利益を評価するための細かい制御をユーザーに提供します。 +- **オープンソースとオープンスタンダード** - オープンソースデータベースとして、ClickHouse は OpenTelemetry などのオープンスタンダードを採用しています。プロジェクトに貢献し、積極的に参加する能力を提供する一方で、ベンダーロックインの課題を回避します。 + +## オブザーバビリティに ClickHouse を使用するべき時 + +オブザーバビリティデータに ClickHouse を使用するには、ユーザーが SQL ベースのオブザーバビリティを採用する必要があります。この歴史については [ブログ記事](https://clickhouse.com/blog/the-state-of-sql-based-observability)をお勧めしますが、要約すると: + +SQL ベースのオブザーバビリティは次のようなユーザーに適しています: + +- あなたまたはあなたのチームが SQL に親しんでいる(またはその習得を望んでいる) +- ロックインを回避し、拡張性を達成するために OpenTelemetry などのオープン標準を遵守することを好む +- コレクション、ストレージ、可視化のすべてでオープンソースの革新によって駆動されるエコシステムを運営する準備ができている +- 中規模または大規模(または非常に大規模な)オブザーバビリティデータの管理を視野に入れている +- TCO(総所有コスト)を管理し、オブザーバビリティコストの増加を避けたい +- コストを管理するためにオブザーバビリティデータの短い保持期間に縛られたくない + +SQL ベースのオブザーバビリティが適さない場合: + +- あなたやあなたのチームが SQL を学ぶ(または生成する)ことに興味がない +- パッケージ化されたエンドツーエンドのオブザーバビリティ体験を求めている +- オブザーバビリティデータの量が小さすぎて、何らかの重要な差別化を生み出せない(例:<150 GiB)予測がされていない。 +- モニターの使用例が主にメトリクスに依存しており、PromQL を必要としている。その場合でも、ClickHouse をログやトレースに使用し、Grafana でプレゼンテーションレイヤーを統一することができます。 +- エコシステムが成熟するのを待ち、SQL ベースのオブザーバビリティがもっと簡単になるのを待ちたい + +## ログとトレース + +オブザーバビリティのユースケースには、ロギング、トレース、およびメトリクスの 3 つの明確な柱があります。それぞれが独自のデータタイプとアクセスパターンを持っています。 + +現在、ClickHouse は次の2種類のオブザーバビリティデータの保存を推奨しています: + +- **ログ** - ログは、システム内で発生するイベントの時刻記録であり、ソフトウェア操作のさまざまな側面に関する詳細情報をキャプチャします。ログのデータは通常、非構造化または半構造化されており、エラーメッセージ、ユーザーアクティビティログ、システム変更、他のイベントを含むことができます。ログは、トラブルシューティング、異常検出、およびシステム内部で発生する問題の特定のイベントの理解に不可欠です。 + +``` +54.36.149.41 - - [22/Jan/2019:03:56:14 +0330] "GET +/filter/27|13%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,27|%DA%A9%D9%85%D8%AA%D8%B1%20%D8%A7%D8%B2%205%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,p53 HTTP/1.1" 200 30577 "-" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" "-" +``` + +- **トレース** - トレースは、分散システム内を移動するリクエストの過程をキャプチャし、これらのリクエストのルートとパフォーマンスを詳細に示します。トレースのデータは非常に構造化されており、リクエストが取る各ステップをマッピングするスパンとトレースから成ります。トレースは、システムパフォーマンスの洞察を提供し、ボトルネックや待機時間の問題を特定し、マイクロサービスの効率を最適化するのに役立ちます。 + +> ClickHouse はメトリクスデータの保存にも使用できますが、この柱はまだ成熟段階にあり、Prometheus データ形式および PromQL へのサポートが進行中です。 + +### 分散トレーシング + +分散トレーシングは、オブザーバビリティの重要な機能です。分散トレース、単にトレースと呼ばれるものは、システムを通るリクエストの過程をマッピングします。リクエストはエンドユーザーまたはアプリケーションから起こり、通常はマイクロサービス間のアクションの流れにつながります。このシーケンスを記録し、後続のイベントを相関させることで、オブザーバビリティユーザーまたは SRE は、アプリケーションフローの問題を診断することができます。これにより、サーバーレスやアーキテクチャの複雑さに関わらず、理解が楽になります。 + +各トレースは複数のスパンで構成されており、リクエストに関連付けられた最初のスパンはルートスパンと呼ばれています。このルートスパンはリクエスト全体を最初から最後までキャプチャします。その下にあるスパンは、リクエスト中に発生する各ステップや操作の詳細な洞察を提供します。トレースがなければ、分散システム内のパフォーマンスの問題を診断することは非常に難しい場合があります。トレースは、リクエストがシステムを通過する際のイベントのシーケンスを詳細に示すことで、分散システムのデバッグを容易にし、理解を助けます。 + +ほとんどのオブザーバビリティベンダーは、この情報をウォーターフォールとして視覚化しており、相対的なタイミングを水平棒や比例サイズで示しています。Grafanaの例: + +NEEDS ALT + +
    + +ログとトレースの概念に深く慣れ親しむ必要があるユーザーには、[OpenTelemetry ドキュメント](https://opentelemetry.io/docs/concepts/)を強くお勧めします。 diff --git a/docs/ja/use-cases/observability/integrating-opentelemetry.md b/docs/ja/use-cases/observability/integrating-opentelemetry.md new file mode 100644 index 00000000000..99c3046ac6d --- /dev/null +++ b/docs/ja/use-cases/observability/integrating-opentelemetry.md @@ -0,0 +1,771 @@ +--- +title: OpenTelemetryの統合 +description: オブザーバビリティのためのOpenTelemetryとClickHouseの統合 +slug: /ja/observability/integrating-opentelemetry +keywords: [オブザーバビリティ, ログ, トレース, メトリクス, OpenTelemetry, Grafana, otel] +--- + +# データ収集のためのOpenTelemetryの統合 + +オブザーバビリティソリューションには、ログとトレースを収集およびエクスポートする手段が必要です。この目的のために、ClickHouseは[OpenTelemetry (OTel) プロジェクト](https://opentelemetry.io/)を推奨しています。 + +"OpenTelemetryは、トレース、メトリクス、ログなどのテレメトリデータを作成および管理するために設計されたオブザーバビリティフレームワークおよびツールキットです。" + +ClickHouseやPrometheusとは異なり、OpenTelemetryはオブザーバビリティのバックエンドではなく、テレメトリデータの生成、収集、管理、エクスポートに焦点を当てています。OpenTelemetryの初期の目標は、ユーザーが言語固有のSDKを使用してアプリケーションやシステムを容易に計装できるようにすることでしたが、それはOpenTelemetryコレクターを通じたログの収集も含むように拡張されました。OpenTelemetryコレクターは、テレメトリデータを受信、処理、エクスポートするエージェントまたはプロキシです。 + +## ClickHouseに関連するコンポーネント + +OpenTelemetryは多くのコンポーネントで構成されています。他には、API仕様、標準化されたプロトコル、フィールド/カラムの命名規則を提供するほか、ClickHouseでオブザーバビリティソリューションを構築するために基本的な二つの機能を提供します: + +- [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/)は、テレメトリデータを受信、処理、エクスポートするプロキシです。ClickHouseが駆動するソリューションは、このコンポーネントをログ収集とイベント処理の両方に使用し、バッチ処理および挿入を行います。 +- テレメトリデータの仕様、API、エクスポートを実装する[言語SDK](https://opentelemetry.io/docs/languages/)です。これらのSDKは、アプリケーションのコード内でトレースが正しく記録されていること、関連するスパンが生成され、メタデータを介してサービス間でコンテキストが伝達されることを保証します。これにより、分散トレースが形成され、スパンが相関されることを保証します。これらのSDKは、ユーザーがコードを変更することなく、直ちに計装を得ることを意味する一般的なライブラリとフレームワークを自動的に実装するエコシステムによって補完されています。 + +ClickHouseを駆動するオブザーバビリティソリューションは、これら両方のツールを活用します。 + +## ディストリビューション + +OpenTelemetryコレクターには[多くのディストリビューション](https://github.com/open-telemetry/opentelemetry-collector-releases?tab=readme-ov-file)があります。ClickHouseソリューションに必要なfilelogレシーバーとClickHouseエクスポーターは、[OpenTelemetry Collector Contrib Distro](https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib)にのみ含まれています。 + +このディストリビューションには多くのコンポーネントが含まれており、ユーザーはさまざまな構成で実験することができます。ただし、製品で実行する場合は、環境に必要なコンポーネントのみを含めるようにコレクターを制限することが推奨されます。その理由には以下のようなものがあります: + +- コレクターのサイズを減らし、コレクターのデプロイ時間を短縮する +- 利用可能な攻撃の表面積を減らすことで、コレクターのセキュリティを改善する + +[カスタムコレクター](https://opentelemetry.io/docs/collector/custom-collector/)の構築は、[OpenTelemetry Collector Builder](https://github.com/open-telemetry/opentelemetry-collector/tree/main/cmd/builder)を使用して行うことができます。 + +## OTelによるデータの取り込み + +### コレクターのデプロイ役割 + +ログを収集してClickHouseに挿入するために、OpenTelemetry Collectorの使用を推奨します。OpenTelemetry Collectorは、主に2つの役割でデプロイできます: + +- **エージェント** - エージェントインスタンスは、サーバーやKubernetesノードなどのエッジでデータを収集したり、OpenTelemetry SDKで計装されたアプリケーションから直接イベントを受信したりします。後者の場合、エージェントインスタンスはアプリケーションと共に、またはアプリケーションと同じホストで実行されます(例えばサイドカーやDaemonSetとして)。エージェントはそのデータを直接ClickHouseに送信したり、ゲートウェイインスタンスに送信したりできます。前者の場合、これは[エージェントデプロイメントパターン](https://opentelemetry.io/docs/collector/deployment/agent/)として知られます。 +- **ゲートウェイ** - ゲートウェイインスタンスは、独立したサービスを提供します(例:Kubernetesでのデプロイ)。通常、クラスターごと、データセンターごと、地域ごとに、この役割として動作します。これらはOTLPエンドポイントを介してアプリケーション(または他のコレクターとしてエージェント)からイベントを受信します。通常、一連のゲートウェイインスタンスがデプロイされ、ロードバランサが使用されて負荷を分散します。全エージェントとアプリケーションがこの単一のエンドポイントに信号を送る場合、これは[ゲートウェイデプロイメントパターン](https://opentelemetry.io/docs/collector/deployment/gateway/)としてしばしば言及されます。 + +以下、エージェントコレクターがシンプルにイベントをClickHouseに直接送信することを想定しています。ゲートウェイを使用する場合およびどのような場合に適用できるかについて詳細は「スケーリング with ゲートウェイ」を参照してください。 + +### ログの収集 + +コレクターを使用する主な利点は、サービスがデータを迅速にオフロードし、コレクターが再試行、バッチ処理、暗号化、または機密データのフィルタリングなどの追加処理を負担することを可能にすることです。 + +コレクターは、その3つの主要な処理ステージに対して[レシーバー](https://opentelemetry.io/docs/collector/configuration/#receivers)、[プロセッサー](https://opentelemetry.io/docs/collector/configuration/#processors)、および[エクスポーター](https://opentelemetry.io/docs/collector/configuration/#exporters)という用語を使用します。レシーバーはデータ収集に使用され、プルベースまたはプッシュベースのいずれかです。プロセッサーはメッセージの変換と強化を行う機能を提供します。エクスポーターはデータをダウンストリームサービスに送信する役割を持ちます。このサービスは理論的には別のコレクターでもかまいませんが、基本的なディスカッションのために、すべてのデータがClickHouseに直接送信されると仮定します。 + +NEEDS ALT + +
    + +ユーザーがレシーバー、プロセッサー、エクスポーターの完全なセットに慣れることをお勧めします。 + +コレクターはログを収集するための2つの主要なレシーバーを提供します: + +**OTLPを介して** - この場合、ログはOTLPプロトコルを介してOpenTelemetry SDKからコレクターに直接(プッシュ)送信されます。[OpenTelemetryデモ](https://opentelemetry.io/docs/demo/)ではこのアプローチが採用されており、各言語のOTLPエクスポーターがローカルコレクターのエンドポイントを想定しています。コレクターはこの場合、OTLPレシーバーで設定する必要があります—設定例は上記[デモの設定](https://github.com/ClickHouse/opentelemetry-demo/blob/main/src/otelcollector/otelcol-config.yml#L5-L12)を参照。また、このアプローチの利点は、ログデータが自動的にTrace Idを含むようになり、ユーザーが特定のログ用のトレースを判別できるようになることです。 + +NEEDS ALT + +
    + +このアプローチでは、ユーザーが[適切な言語SDK](https://opentelemetry.io/docs/languages/)を使用してコードを計装することが求められます。 + +- **Filelogレシーバーを介したスクレイピング** - このレシーバーはディスク上のファイルを追跡し、ログメッセージを形成し、これらをClickHouseに送信します。このレシーバーは、多行メッセージの検出、ログのロールオーバー処理、再起動に対するロバスト性のチェックポイント設定、構造の抽出など、複雑なタスクを処理します。このレシーバーはさらに、DockerとKubernetesコンテナのログを追跡し、これらから構造を抽出し、ポッドの詳細で充実させることができます。 + +NEEDS ALT + +
    + +**ほとんどのデプロイメントでは上記の組み合わせを使用します。** ユーザーが[コレクタードキュメント](https://opentelemetry.io/docs/collector/)を読み、基本的な概念や[構成構造](https://opentelemetry.io/docs/collector/configuration/)および[インストール方法](https://opentelemetry.io/docs/collector/installation/)に慣れることをお勧めします。 + +> ヒント: [otelbin.io](https://www.otelbin.io/) は、構成を検証および視覚化するのに役立ちます。 + +## 構造化vs非構造化 + +ログは構造化または非構造化のいずれかです。 + +構造化ログは、JSONなどのデータフォーマットを使用し、httpコードやソースIPアドレスなどのメタデータフィールドを定義します。 + +``` +{ + "remote_addr":"54.36.149.41", + "remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET", + "request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1", + "status":"200", + "size":"30577", + "referer":"-", + "user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)" +} +``` + +一方、非構造化ログは通常、何らかの固有の構造を持っているものの、単なる文字列としてログを表現します。 + +``` +54.36.149.41 - - [22/Jan/2019:03:56:14 +0330] "GET +/filter/27|13%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,27|%DA%A9%D9%85%D8%AA%D8%B1%20%D8%A7%D8%B2%205%20%D9%85%DA%AF%D8%A7%D9%BE%DB%8C%DA%A9%D8%B3%D9%84,p53 HTTP/1.1" 200 30577 "-" "Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)" "-" +``` + +ユーザーが可能な限り構造化ログを使用し、JSON(例:ndjson)でログを記録することを推奨します。これにより、後のログ処理が簡素化され、ClickHouseに送信する前に[Collector Processor](https://opentelemetry.io/docs/collector/configuration/#processors)や挿入時にマテリアライズドビューを使用して簡素化されます。構造化ログは最終的に後に必要な処理リソースを節約し、ClickHouseソリューションに必要なCPUを削減します。 + +### 例 + +例として、構造化された(JSON)および非構造化のロギングデータセット(それぞれ約10m行)が以下のリンクで利用可能です: + +- [非構造化](https://datasets-documentation.s3.eu-west-3.amazonaws.com/http_logs/access-unstructured.log.gz) +- [構造化](https://datasets-documentation.s3.eu-west-3.amazonaws.com/http_logs/access-structured.log.gz) + +以下の例では構造化データセットを使用します。このファイルをダウンロードして展開し、以下の例を再現してください。 + +以下は、ディスク上のこれらのファイルを読み込むOTel Collectorの単純な構成を示しており、filelogレシーバーを使用して、結果のメッセージをstdoutに出力します。ログが構造化されているため、[`json_parser`](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/stanza/docs/operators/json_parser.md)オペレーターを使用します。`access-structured.log`ファイルへのパスを修正してください。 + +> 以下の例では、ログからタイムスタンプを抽出します。これには`json_parser`オペレーターを使用する必要があり、ログ行全体をJSON文字列に変換し、結果を`LogAttributes`に配置します。これは計算が高コストとなることがあり、[ClickHouseでより効率的に実行できます](https://clickhouse.com/blog/worlds-fastest-json-querying-tool-clickhouse-local) - 「SQLによる構造の抽出」を参照してください。JSONを抽出するために使用する`regex_parser`を使用した同等の非構造化例は[ここ](https://pastila.nl/?01da7ee2/2ffd3ba8124a7d6e4ddf39422ad5b863#swBkiAXvGP7mRPgbuzzHFA==)で提供されています。 + +**[config-structured-logs.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-structured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_json*_parser*N_______timestamp%3A*N_________parse*_from%3A_attributes.time*_local*N_________layout%3A_*%22*.Y-*.m-*.d_*.H%3A*.M%3A*.S*%22*N*N*Nprocessors%3A*N__batch%3A*N____timeout%3A_5s*N____send*_batch*_size%3A_1*N*N*Nexporters%3A*N_logging%3A*N___loglevel%3A_debug*N*N*Nservice%3A*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%5D*N_____exporters%3A_%5Blogging%5D%7E)** + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-structured.log + start_at: beginning + operators: + - type: json_parser + timestamp: + parse_from: attributes.time_local + layout: '%Y-%m-%d %H:%M:%S' +processors: + batch: + timeout: 5s + send_batch_size: 1 +exporters: + logging: + loglevel: debug +service: + pipelines: + logs: + receivers: [filelog] + processors: [batch] + exporters: [logging] +``` + +ユーザーは[公式の指示](https://opentelemetry.io/docs/collector/installation/)に従ってローカルにコレクターをインストールすることができます。重要なことは、これらの指示が[contribディストリビューション](https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib)(`filelog`レシーバーが含まれている)を使用するように修正されることです。例として、`otelcol_0.102.1_darwin_arm64.tar.gz`の代わりに`otelcol-contrib_0.102.1_darwin_arm64.tar.gz`をダウンロードします。リリースは[ここ](https://github.com/open-telemetry/opentelemetry-collector-releases/releases)で見つけることができます。 + +インストールが完了すると、以下のコマンドを使用してOTel Collectorを実行できます: + +``` +./otelcol-contrib --config config-logs.yaml +``` + +構造化されたログを使用すると仮定すると、メッセージは以下のような形式で出力されます: + +``` +LogRecord #98 +ObservedTimestamp: 2024-06-19 13:21:16.414259 +0000 UTC +Timestamp: 2019-01-22 01:12:53 +0000 UTC +SeverityText: +SeverityNumber: Unspecified(0) +Body: Str({"remote_addr":"66.249.66.195","remote_user":"-","run_time":"0","time_local":"2019-01-22 01:12:53.000","request_type":"GET","request_path":"\/product\/7564","request_protocol":"HTTP\/1.1","status":"301","size":"178","referer":"-","user_agent":"Mozilla\/5.0 (Linux; Android 6.0.1; Nexus 5X Build\/MMB29P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/41.0.2272.96 Mobile Safari\/537.36 (compatible; Googlebot\/2.1; +http:\/\/www.google.com\/bot.html)"}) +Attributes: + -> remote_user: Str(-) + -> request_protocol: Str(HTTP/1.1) + -> time_local: Str(2019-01-22 01:12:53.000) + -> user_agent: Str(Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)) + -> log.file.name: Str(access.log) + -> status: Str(301) + -> size: Str(178) + -> referer: Str(-) + -> remote_addr: Str(66.249.66.195) + -> request_type: Str(GET) + -> request_path: Str(/product/7564) + -> run_time: Str(0) +Trace ID: +Span ID: +Flags: 0 +``` + +上記は、OTelコレクターによって生成された単一のログメッセージを表しています。これら同じメッセージを後のセクションでClickHouseに投入します。 + +ログメッセージの完全なスキーマは、[こちら](https://opentelemetry.io/docs/specs/otel/logs/data-model/)で維持されています。**ユーザーはこのスキーマに慣れることを強くお勧めします。** + +重要なのは、ログ行自体が`Body`フィールド内に文字列として保持されていることですが、JSONが`json_parser`のおかげでAttributesフィールドに自動抽出されていることです。この同じ[オペレーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/stanza/docs/operators/README.md#what-operators-are-available)を使用して、適切な`Timestamp`カラムにタイムスタンプを抽出しています。OTelでのログ処理の推奨事項については「処理」を参照してください。 + +> オペレーターは、ログ処理の最も基本的な単位です。各オペレーターは、ファイルから行を読み取る、フィールドからJSONを解析するなどの単一の責任を果たします。オペレーターは、その目的を達成するためにパイプラインで鎖でつながれます。 + +> 上記のメッセージにはTraceIDやSpanIDフィールドがありません。[分散トレース](https://opentelemetry.io/docs/concepts/observability-primer/#distributed-traces)を実装している場合など、必要な場合には、上記のようにJSONから抽出できます。 + +ローカルまたはkubernetesのログファイルを収集する必要があるユーザーには、[filelogレシーバー](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/filelogreceiver/README.md#configuration)で利用可能な構成オプションと[オフセットの取り扱い](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver#offset-tracking)および[多行ログの解析方法](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver#example---multiline-logs-parsing)に関して理解を深めることをお勧めします。 + +## Kubernetesログの収集 + +Kubernetesログの収集には、[Open Telemetryドキュメントガイド](https://opentelemetry.io/docs/kubernetes/)の利用をお勧めします。ログやメトリクスをポッドのメタデータで強化するために[Kubernetes Attributes Processor](https://opentelemetry.io/docs/kubernetes/collector/components/#kubernetes-attributes-processor)が推奨されます。これにより、ラベルのような動的なメタデータを生成することができます。このデータはカラム`ResourceAttributes`に保存されます。ClickHouseでは、現時点でこのカラムには型`Map(String, String)`を使用しています。この型の操作と最適化の詳細については「マップの使用」と「マップからの抽出」を参照してください。 + +## トレースの収集 + +コードを計装してトレースを収集したいユーザーには、公式の[OTelドキュメント](https://opentelemetry.io/docs/languages/)に従うことをお勧めします。 + +ClickHouseにイベントを送信するためには、適切なレシーバーを介してOTLPプロトコルでトレースイベントを受信するOTelコレクターをデプロイする必要があります。OpenTelemetryデモでは、[対応する言語を計装し](https://opentelemetry.io/docs/demo/)イベントをコレクターに送信する例を提供しています。stdoutにイベントを出力する適切なコレクターの設定例を以下に示します: + +### 例 + +トレースはOTLPで受信される必要があるため、トレースデータ生成用に[telemetrygen](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen)ツールを使用します。インストールについての指示は[こちら](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen)にあります。 + +以下の設定は、OTLPレシーバーでトレースイベントを受け取り、それをstdoutに送信します。 + +[config-traces.xml](https://www.otelbin.io/#config=receivers%3A*N_otlp%3A*N___protocols%3A*N_____grpc%3A*N_______endpoint%3A_0.0.0.0%3A4317*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_1s*N*Nexporters%3A*N_logging%3A*N___loglevel%3A_debug*N*Nservice%3A*N_pipelines%3A*N__traces%3A*N____receivers%3A_%5Botlp%5D*N____processors%3A_%5Bbatch%5D*N____exporters%3A_%5Blogging%5D%7E) + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 +processors: + batch: + timeout: 1s +exporters: + logging: + loglevel: debug +service: + pipelines: + traces: + receivers: [otlp] + processors: [batch] + exporters: [logging] +``` + +この設定を以下のコマンドで実行します: + +```bash +./otelcol-contrib --config config-traces.yaml +``` + +トレースイベントをコレクターに送信するためには、`telemetrygen`を使用して以下のコマンドを実行します: + +```bash +$GOBIN/telemetrygen traces --otlp-insecure --traces 300 +``` + +これにより、以下に示すようなトレースメッセージがstdoutに出力されます: + +``` +Span #86 + Trace ID : 1bb5cdd2c9df5f0da320ca22045c60d9 + Parent ID : ce129e5c2dd51378 + ID : fbb14077b5e149a0 + Name : okey-dokey-0 + Kind : Server + Start time : 2024-06-19 18:03:41.603868 +0000 UTC + End time : 2024-06-19 18:03:41.603991 +0000 UTC + Status code : Unset + Status message : +Attributes: + -> net.peer.ip: Str(1.2.3.4) + -> peer.service: Str(telemetrygen-client) +``` + +上記は、OTelコレクターによって生成された単一のトレースメッセージを表しています。これら同じメッセージを後のセクションでClickHouseに投入します。 + +トレースメッセージの完全なスキーマは[こちら](https://opentelemetry.io/docs/concepts/signals/traces/)で維持されています。ユーザーはこのスキーマに慣れることを強くお勧めします。 + +## 処理 - フィルタリング、変換、充実化 + +以前の例で示したログイベントのタイムスタンプを設定するように、ユーザーはイベントメッセージをフィルタリング、変換、充実化したいと考えることがよくあります。これは、Open Telemetryでのいくつかの能力を使用して達成できます: + +- **プロセッサー** - プロセッサーは、[レシーバーが収集したデータを変更または変換](https://opentelemetry.io/docs/collector/transforming-telemetry/)し、エクスポーターに送信する前にそのデータを処理します。[推奨されるプロセッサー](https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor#recommended-processors) の最小セットは通常推奨されますが、これらは任意です。OTeLコレクターをClickHouseと共に使用する際には、以下をプロセッサーに制限することをお勧めします: + + - [memory_limiter](https://github.com/open-telemetry/opentelemetry-collector/blob/main/processor/memorylimiterprocessor/README.md) は、コレクターでのメモリ不足を防ぐために使用されます。「リソースの見積もり」を参照してください。 + - コンテキストに基づいて強化を行うプロセッサー。たとえば、[Kubernetes Attributes Processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/k8sattributesprocessor) は、k8sメタデータで指標やログのリソース属性を自動設定して、イベントをそれらのソースポッドIDで強化することを可能にします。 + - トレースが必要な場合の[末尾もしくは先端のサンプリング](https://opentelemetry.io/docs/concepts/sampling/)。 + - [基本的なフィルタリング](https://opentelemetry.io/docs/collector/transforming-telemetry/) - オペレーターでできない場合の削除イベント。 + - [バッチ](https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor) - データがバッチで送信されることを保証するためにClickHouseで作業する際に必須です。ClickHouseへのエクスポートを参照してください。 + +- **オペレーター** - [オペレーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/pkg/stanza/docs/operators/README.md)は、レシーバーで利用可能な処理の最も基本的な単位を提供します。基本的な解析がサポートされており、SeverityとTimestampなどのフィールドを設定することが可能です。JSONと正規表現の解析がここでサポートされており、そのフィルタリングと基本的な変換が可能です。ここでのイベントフィルタリングをお勧めします。 + +オペレーターまたは[トランスフォームプロセッサー](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/transformprocessor/README.md)を使用して過剰なイベント処理を行わないことをお勧めします。これらは相当なメモリおよびCPUオーバーヘッドを引き起こす可能性があります、特にJSON解析。しかし、挿入時にClickHouseでマテリアライズドビューとカラムを使ってすべての処理を行うことも可能です。ただし、コンテキスト認識が必要な強化(例:k8sメタデータの追加)は除きます。「SQLでの構造の抽出」を参照してください。 + +もし、OTelコレクターを使用して処理をする場合、ゲートウェイインスタンスでの変換を推奨し、エージェントインスタンスで行う作業を最小限にすることをお勧めします。これにより、サーバー上で動作するエージェントが必要とするリソースが可能な限り最小化されます。通常、ユーザーがフィルタリング(不要なネットワーク使用を最小化するため)、タイムスタンプ設定(オペレーターを通して)、コンテキストが必要な強化をエージェントで行うのを見ます。たとえば、ゲートウェイインスタンスが異なるKubernetesクラスターに存在する場合、k8sの強化はエージェントで発生します。 + +### 例 + +以下の設定は、非構造化ログファイルの収集を示します。ログ行から構造を抽出するためのオペレーター(`regex_parser`)とイベントをフィルタリングするための使用、及びイベントをバッチ処理しメモリ使用量を制限するためのプロセッサーを利用しています。 + +[config-unstructured-logs-with-processor.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-unstructured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_regex*_parser*N_______regex%3A_*%22%5E*C*QP*Lip*G%5B*Bd.%5D*P*D*Bs*P-*Bs*P-*Bs*P*B%5B*C*QP*Ltimestamp*G%5B%5E*B%5D%5D*P*D*B%5D%5C*%22*C*QP*Lmethod*G%5BA-Z%5D*P*D*Bs*P*C*QP*Lurl*G%5B%5E*Bs%5D*P*D*Bs*PHTTP%2F%5B%5E*Bs%5D*P%22*Bs*P*C*QP*Lstatus*G*Bd*P*D*Bs*P*C*QP*Lsize*G*Bd*P*D*Bs*P%22*C*QP*Lreferrer*G%5B%5E%22%5D***D%22*Bs*P%22*C*QP*Luser*_agent*G%5B%5E%22%5D***D%22*%22*N_______timestamp%3A*N_________parse*_from%3A_attributes.timestamp*N_________layout%3A_*%22*.d%2F*.b%2F*.Y%3A*.H%3A*.M%3A*.S_*.z*%22*N_________*H22%2FJan%2F2019%3A03%3A56%3A14_*P0330*N*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_1s*N___send*_batch*_size%3A_100*N_memory*_limiter%3A*N___check*_interval%3A_1s*N___limit*_mib%3A_2048*N___spike*_limit*_mib%3A_256*N*N*Nexporters%3A*N_logging%3A*N___loglevel%3A_debug*N*N*Nservice%3A*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%2C_memory*_limiter%5D*N_____exporters%3A_%5Blogging%5D%7E) + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-unstructured.log + start_at: beginning + operators: + - type: regex_parser + regex: '^(?P[\d.]+)\s+-\s+-\s+\[(?P[^\]]+)\]\s+"(?P[A-Z]+)\s+(?P[^\s]+)\s+HTTP/[^\s]+"\s+(?P\d+)\s+(?P\d+)\s+"(?P[^"]*)"\s+"(?P[^"]*)"' + timestamp: + parse_from: attributes.timestamp + layout: '%d/%b/%Y:%H:%M:%S %z' + #22/Jan/2019:03:56:14 +0330 +processors: + batch: + timeout: 1s + send_batch_size: 100 + memory_limiter: + check_interval: 1s + limit_mib: 2048 + spike_limit_mib: 256 +exporters: + logging: + loglevel: debug +service: + pipelines: + logs: + receivers: [filelog] + processors: [batch, memory_limiter] + exporters: [logging] +``` + +```bash +./otelcol-contrib --config config-unstructured-logs-with-processor.yaml +``` + +## ClickHouseへのエクスポート + +エクスポーターはデータを1つ以上のバックエンドまたは目的地に送信します。エクスポーターはプルまたはプッシュベースです。ClickHouseにイベントを送信するためには、プッシュベースの[ClickHouseエクスポーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/README.md)を使用する必要があります。 + +> ClickHouseエクスポーターはコアディストリビューションではなく、[OpenTelemetry Collector Contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main)の一部です。ユーザーはContribディストリビューションを使用するか、[独自のコレクターを構築](https://opentelemetry.io/docs/collector/custom-collector/)することができます。 + +完全な構成ファイルは以下に示されています。 + +[clickhouse-config.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-structured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_json*_parser*N_______timestamp%3A*N_________parse*_from%3A_attributes.time*_local*N_________layout%3A_*%22*.Y-*.m-*.d_*.H%3A*.M%3A*.S*%22*N_otlp%3A*N____protocols%3A*N______grpc%3A*N________endpoint%3A_0.0.0.0%3A4317*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_5s*N___send*_batch*_size%3A_5000*N*Nexporters%3A*N_clickhouse%3A*N___endpoint%3A_tcp%3A%2F%2Flocalhost%3A9000*Qdial*_timeout*E10s*Acompress*Elz4*Aasync*_insert*E1*N___*H_ttl%3A_72h*N___traces*_table*_name%3A_otel*_traces*N___logs*_table*_name%3A_otel*_logs*N___create*_schema%3A_true*N___timeout%3A_5s*N___database%3A_default*N___sending*_queue%3A*N_____queue*_size%3A_1000*N___retry*_on*_failure%3A*N_____enabled%3A_true*N_____initial*_interval%3A_5s*N_____max*_interval%3A_30s*N_____max*_elapsed*_time%3A_300s*N*Nservice%3A*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%5D*N_____exporters%3A_%5Bclickhouse%5D*N___traces%3A*N____receivers%3A_%5Botlp%5D*N____processors%3A_%5Bbatch%5D*N____exporters%3A_%5Bclickhouse%5D%7E&distro=otelcol-contrib%7E&distroVersion=v0.103.1%7E) + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-structured.log + start_at: beginning + operators: + - type: json_parser + timestamp: + parse_from: attributes.time_local + layout: '%Y-%m-%d %H:%M:%S' + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 +processors: + batch: + timeout: 5s + send_batch_size: 5000 +exporters: + clickhouse: + endpoint: tcp://localhost:9000?dial_timeout=10s&compress=lz4&async_insert=1 + # ttl: 72h + traces_table_name: otel_traces + logs_table_name: otel_logs + create_schema: true + timeout: 5s + database: default + sending_queue: + queue_size: 1000 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s + + +service: + pipelines: + logs: + receivers: [filelog] + processors: [batch] + exporters: [clickhouse] + traces: + receivers: [otlp] + processors: [batch] + exporters: [clickhouse] +``` + +次に、重要な設定を示しています: + +- **パイプライン** - 上記の設定では、レシーバー、プロセッサー、エクスポーターのセットとして[パイプライン](https://opentelemetry.io/docs/collector/configuration/#pipelines)の使用がハイライトされています。ログとトレースのためのものです。 +- **エンドポイント** - ClickHouseとの通信は`endpoint`パラメータで設定されています。接続文字列`tcp://localhost:9000?dial_timeout=10s&compress=lz4&async_insert=1`により、通信はTCP上で行われます。ユーザーがトラフィックスイッチングの理由でHTTPを好む場合は、[ここ](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/README.md#configuration-options)で記載されているようにこの接続文字列を変更してください。完全な接続詳細、ユーザー名とパスワードをこの接続文字列に指定する能力を持つものは、[ここ](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/clickhouseexporter/README.md#configuration-options)で詳しく説明されています。 + +**重要:** 上記の接続文字列は、圧縮(lz4)と非同期挿入の両方を有効にしています。私たちは、常に両方を有効にすることをお勧めします。非同期挿入に関する詳細は「バッチ処理」を参照してください。圧縮は常に指定されなければならず、以前のエクスポーターの古いバージョンではデフォルトで有効にされていません。 + +- **ttl** - ここでの値はデータが保持される期間を決定します。より詳しい情報は「データの管理」にあります。これは時間単位で時間を指定する必要があります。例:72h。以下の例では無効化しています。データが2019年のもので、挿入後すぐにClickHouseによって削除されるためです。 +- **traces_table_name** と **logs_table_name** - ログとトレーステーブルの名前を決定します。 +- **create_schema** - デフォルトのスキーマでテーブルを起動時に作成するかどうかを決定します。最初は真に設定することを推奨します。ユーザーは、この値を偽に設定し、独自のスキーマを定義するべきです。 +- **database** - 対象データベース。 +- **retry_on_failure** - 失敗したバッチを再試行するかどうかを決定する設定。 +- **batch** - バッチプロセッサーがイベントをバッチとして送信することを保証します。5000ほどの値を推奨し、タイムアウトを5sとしています。これらのいずれかが最初に達した場合、バッチがフラッシュされてエクスポーターに送信されます。これらの値を下げることで、より速いレイテンシーパイプラインになり、データが即座にクエリ可能になる一方で、より多くの接続とバッチがClickHouseに送信されることになります。非同期挿入を使用していない場合は問題を引き起こす可能性があるため、これを推奨しません(ClickHouseでの[過多パーツ](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse#1-too-many-parts)の問題)。逆に、ユーザーが非同期挿入を使用している場合は、これらの設定でデータが依然としてフラッシュされます。詳細については「バッチ処理」を参照してください。 +- **sending_queue** - 送信キューのサイズを制御します。キューにはバッチが含まれており、このキューが超過すると、バッチがドロップされます。詳細については「バックプレッシャーの処理」を参照してください。 + +構造化ログファイルを抽出し、認証されていない[ローカルインスタンスのClickHouse](https://clickhouse.com/docs/ja/install)が実行中であると仮定すると、以下のコマンドを使用してこの設定を実行できます: + +```bash +./otelcol-contrib --config clickhouse-config.yaml +``` + +このコレクターにトレースデータを送信するためには、`telemetrygen`ツールを使用しての以下のコマンドを実行します: + +```bash +$GOBIN/telemetrygen traces --otlp-insecure --traces 300 +``` + +実行中の際には、簡単なクエリでログイベントが存在することを確認してください: + +```sql +SELECT * +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +Timestamp: 2019-01-22 06:46:14.000000000 +TraceId: +SpanId: +TraceFlags: 0 +SeverityText: +SeverityNumber: 0 +ServiceName: +Body: {"remote_addr":"109.230.70.66","remote_user":"-","run_time":"0","time_local":"2019-01-22 06:46:14.000","request_type":"GET","request_path":"\/image\/61884\/productModel\/150x150","request_protocol":"HTTP\/1.1","status":"200","size":"1684","referer":"https:\/\/www.zanbil.ir\/filter\/p3%2Cb2","user_agent":"Mozilla\/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko\/20100101 Firefox\/64.0"} +ResourceSchemaUrl: +ResourceAttributes: {} +ScopeSchemaUrl: +ScopeName: +ScopeVersion: +ScopeAttributes: {} +LogAttributes: {'referer':'https://www.zanbil.ir/filter/p3%2Cb2','log.file.name':'access-structured.log','run_time':'0','remote_user':'-','request_protocol':'HTTP/1.1','size':'1684','user_agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0','remote_addr':'109.230.70.66','request_path':'/image/61884/productModel/150x150','status':'200','time_local':'2019-01-22 06:46:14.000','request_type':'GET'} + +1 row in set. Elapsed: 0.012 sec. Processed 5.04 thousand rows, 4.62 MB (414.14 thousand rows/s., 379.48 MB/s.) +Peak memory usage: 5.41 MiB. + + +同様にトレースイベントの場合、ユーザーは`otel_traces`テーブルを確認できます: + +SELECT * +FROM otel_traces +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +Timestamp: 2024-06-20 11:36:41.181398000 +TraceId: 00bba81fbd38a242ebb0c81a8ab85d8f +SpanId: beef91a2c8685ace +ParentSpanId: +TraceState: +SpanName: lets-go +SpanKind: SPAN_KIND_CLIENT +ServiceName: telemetrygen +ResourceAttributes: {'service.name':'telemetrygen'} +ScopeName: telemetrygen +ScopeVersion: +SpanAttributes: {'peer.service':'telemetrygen-server','net.peer.ip':'1.2.3.4'} +Duration: 123000 +StatusCode: STATUS_CODE_UNSET +StatusMessage: +Events.Timestamp: [] +Events.Name: [] +Events.Attributes: [] +Links.TraceId: [] +Links.SpanId: [] +Links.TraceState: [] +Links.Attributes: [] +``` + +## すぐに使えるスキーマ + +デフォルトでは、ClickHouseエクスポーターはログとトレースのためのターゲットログテーブルを作成します。これは`create_schema`の設定を通じて無効にすることができます。さらに、`otel_logs`および`otel_traces`のデフォルトからログとトレーステーブルの名前を変更することが上記で設定されました。 + +> 以下のスキームは、TTLが72時間として設定された場合を想定しています。 + +ログのデフォルトスキーマは以下の通りです(`otelcol-contrib v0.102.1`): + +```sql +CREATE TABLE default.otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_scope_attr_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) +TTL toDateTime(Timestamp) + toIntervalDay(3) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 +``` + +このカラムは、公式仕様に基づくOTelのログドキュメンテーション[こちら](https://opentelemetry.io/docs/specs/otel/logs/data-model/)に基づくものです。 + +このスキーマの重要なポイント: + +- デフォルトでテーブルは`PARTITION BY toDate(Timestamp)`によって日付でパーティションされています。これにより有過ぎたデータの削除が効率的に行われます。 +- TTL が `TTL toDateTime(Timestamp) + toIntervalDay(3)` を通じて設定されており、コレクター構成で設定されている値に対応しています。[`ttl_only_drop_parts=1`](/ja/operations/settings/settings#ttl_only_drop_parts) とは、保存されたすべての行が期限切れになったときにパーツ全体が削除されることを意味します。クリックハウスにおける、この特性はこ高価な削除を避けることが可能にします。これを常に設定することをお勧めします。詳細については「TTLによるデータ管理」を参照してください。 +- テーブルは古典的な[`MergeTree`エンジン](/ja/engines/table-engines/mergetree-family/mergetree)を使用しています。これはログやトレースに推奨されており、変更する必要はほとんどありません。 +- テーブルは`ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId)` によって整理されています。これにより、クエリはServiceName、SeverityText、Timestamp、TraceIdに対するフィルターに最適化されます - リストの先頭のカラムは後のカラムよりも速くフィルタリングされます。ユーザーは期待されるアクセスパターンに応じてこの順序を変更する必要があります。詳細については「主キーの選択」を参照してください。 +- 上記のスキーマはカラムに`ZSTD(1)`を適用しています。これはログに最適な圧縮を提供します。ユーザーはより良い圧縮を目指してZSTDの圧縮レベル(上記の1)を増やすことができますが、通常あまり利益を得ません。この値を増やすことは、挿入時のCPUオーバーヘッド(圧縮中)を増加させますが、解凍(クエリ)は同等の性能を持ち続けると予想されます。さらなる詳細は[こちら](https://clickhouse.com/blog/optimize-clickhouse-codecs-compression-schema)を参照してください。追加の[デルタエンコーディング](https://clickhouse.com/docs/ja/sql-reference/statements/create/table#delta)がTimestampに対して適用されており、そのディスクサイズを縮小することを目的としています。 +- `ResourceAttributes`や`LogAttributes`、`ScopeAttributes`がマップであることに注意してください。ユーザーはこれらの違いに慣れる必要があります。 このマップへのアクセス方法やキーへの最適化については「マップを使う」を参照してください。 +- その他のタイプも`ServiceName`など最適化されています。Bodyカラムは、JSONであるにもかかわらず、文字列として保存されます。 +- ブルームフィルターはマップキー、値、およびBodyカラムに適用されます。これらはこれらのカラムのクエリ時間を改善することを意図しており、通常は不要です。 "二次/データスキップインデックス"を参照してください。 + +```sql +CREATE TABLE default.otel_traces +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `ParentSpanId` String CODEC(ZSTD(1)), + `TraceState` String CODEC(ZSTD(1)), + `SpanName` LowCardinality(String) CODEC(ZSTD(1)), + `SpanKind` LowCardinality(String) CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `SpanAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `Duration` Int64 CODEC(ZSTD(1)), + `StatusCode` LowCardinality(String) CODEC(ZSTD(1)), + `StatusMessage` String CODEC(ZSTD(1)), + `Events.Timestamp` Array(DateTime64(9)) CODEC(ZSTD(1)), + `Events.Name` Array(LowCardinality(String)) CODEC(ZSTD(1)), + `Events.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + `Links.TraceId` Array(String) CODEC(ZSTD(1)), + `Links.SpanId` Array(String) CODEC(ZSTD(1)), + `Links.TraceState` Array(String) CODEC(ZSTD(1)), + `Links.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_duration Duration TYPE minmax GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +TTL toDateTime(Timestamp) + toIntervalDay(3) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 +``` + +再度、これは公式仕様に基づくOTelのトレースドキュメンテーションは[こちら](https://opentelemetry.io/docs/specs/otel/trace/api/)で記載されています。 こちらのスキーマは、ログスキーマの多くの同じ設定を使用しており、スパン専用の追加リンクカラムが含まれています。 + +ユーザーは自動スキーマの作成を無効にし、手動でテーブルを作成することを推奨します。これにより、主要および二次キーの変更、クエリパフォーマンス最適化のための追加のカラムの導入が可能になります。 詳細は「スキーマ設計」を参照してください。 + +## 挿入の最適化 + +高い挿入性能を達成し、一貫性の強い保証を得るために、コレクターを通じた観測可能なデータをClickHouseに挿入する際にはシンプルなルールに準拠してください。OTelコレクターの正しい設定により、このルールに従うことは簡単でしょう。これにより、ユーザーがClickHouseを最初に使用する際のよくある[問題](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse)を避けることができます。 + +### バッチ処理 + +デフォルトでは、ClickHouseに送信された各挿入はClickHouseが直ちにそのデータと他の保存する必要のあるメタデータを含むパーツをストレージに作成することを意味します。したがって各挿入がより多くのデータを含み、小規模な挿入をより多く送信する場合に最適化されます。1000以上の行を含むかなり大きなバッチでデータを挿入することをお勧めします。詳細は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse#data-needs-to-be-batched-for-optimal-performance)にあります。 + +デフォルトで、ClickHouseへの挿入は同期的であり、同一の場合は冪等です。マージツリーエンジンファミリーのテーブルでは、ClickHouseはデフォルトで自動的に[挿入時に重複を排除](https://clickhouse.com/blog/common-getting-started-issues-with-clickhouse#5-deduplication-at-insert-time)されます。これにより、挿入が以下のような場合に許容されます: + +1. データを受信するノードに問題がある場合、INSERTクエリがタイムアウト(またはより具体的なエラーを返す)し、確認が得られません。 +2. ノードによってデータが書き込まれましたが、ネットワークの中断が原因で送信側に確認を返すことができない場合、送信側はタイムアウトまたはネットワークエラーを体験します。 + +コレクターの観点からは、(1)と(2)は区別が難しい場合があります。しかし、どちらの場合も確認されていない挿入はただちに再試行できます。元の挿入が成功した場合、新しく試行された挿入が無視されます。 + +ユーザーが上記のバッチプロセッサーを使用して、挿入を一貫性のある行のバッチとして送信することをお勧めします。これにより、バッチプロセッサーの`timeout`が達成される前にバッチがフラッシュされることになり、パイプラインのエンドツーエンドのレイテンシーが低くなり、バッチが一貫サイズになります。 + +### 非同期挿入の使用 + +コレクターのスループットが低く、データがClickHouseに到達する最低限のエンドツーエンドの待ち時間を期待する場合、大きなバッチを送信する場合があります。この場合、バッチプロセッサーの`timeout`が期限切れになるときに小さなバッチが送信されます。これにより問題が発生し、非同期挿入が必要となります。この場合は特に**エージェント役としてClickHouseに直接送信するようにコレクターが構成されている場合**に発生します。ゲートウェイは、集約器として機能することにより、この問題を軽減します - 「ゲートウェイを使用したスケーリング」を参照してください。 + +大きなバッチを保証できない場合は、ClickHouseを使用して非同期挿入を[非同期挿入](/ja/cloud/bestpractices/asynchronous-inserts)使用してバッチ処理を委任できます。データはまずバッファに挿入され、その後データベースストレージに書き込まれます。 + +NEEDS ALT + +
    + +[非同期挿入を有効にすると](/ja/optimize/asynchronous-inserts#enabling-asynchronous-inserts)、ClickHouseが①Insertクエリを受け取り、そのクエリのデータが②直ちにメモリ内バッファに書き込まれます。 ③次のバッファフラッシュが行われるとき、バッファ内のデータは[ソートされ](/ja/optimize/sparse-primary-indexes#data-is-stored-on-disk-ordered-by-primary-key-columns)、パートとしてデータベースストレージに書き込まれます。注意点として、データがストレージにフラッシュされる前にはクエリで検索することはできません。バッファフラッシュは[設定可能](/ja/optimize/asynchronous-inserts)です。 + +コレクターに対する非同期挿入を有効にするには、`async_insert=1`を接続文字列に追加します。配送保証を得るために`wait_for_async_insert=1`を使用することをお勧めします。さらに詳細は[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)を参照してください。 + +非同期挿入からのデータは、ClickHouseバッファがフラッシュされると挿入されます。挿入は`async_insert_max_data_size`を超過したとき、または最初のINSERTクエリから`async_insert_busy_timeout_ms`ミリ秒が経過した後に行われます。`async_insert_stale_timeout_ms`がゼロでない値に設定されている場合、データは`async_insert_stale_timeout_ms`ミリ秒が最終クエリから経過した後に挿入されます。ユーザーはこれらの設定を調整して、パイプラインのエンドツーエンドのレイテンシーを制御できます。バッファフラッシュを最適化するために追加の設定は[こちら](/ja/operations/settings/settings#asynchronous-insert-settings)に記載されています。一般に、デフォルトが適切です。 + +> エージェントの数が少なく、スループットが低いが厳格なエンドツーエンドのレイテンシーが求められる場合、[適応非同期挿入](https://clickhouse.com/blog/clickhouse-release-24-02#adaptive-asynchronous-inserts)が有用である可能性があります。一般的に、これらはClickHouseで見られる観測性の高スループットユースケースには適合しません。 + +最後に、非同期挿入を使用する際、ClickHouseへの同期挿入に関連する以前の重複排除の動作はデフォルトでは有効になっていません。必要に応じて、設定[`async_insert_deduplicate`](/ja/operations/settings/settings#async-insert-deduplicate)を参照してください。 + +この機能の詳細な設定については[こちら](/ja/optimize/asynchronous-inserts#enabling-asynchronous-inserts)で詳しく説明されており、深掘りについては[こちら](https://clickhouse.com/blog/asynchronous-data-inserts-in-clickhouse)があります。 + +## デプロイメントアーキテクチャ + +OTelコレクターをClickhouseで使用する際のいくつかのデプロイメントアーキテクチャが可能です。それぞれの概要と適用可能な場合を以下で説明します。 + +### エージェントのみ + +エージェントのみのアーキテクチャでは、OTelコレクターをエッジにエージェントとしてデプロイします。これらはローカルアプリケーション(例:サイドカーコンテナ)からトレースを受信し、サーバーまたはKubernetesノードからログを収集します。このモードでは、エージェントがデータをClickHouseに直接送信します。 + +NEEDS ALT + +
    + +このアーキテクチャは、中小規模のデプロイメントに適しています。その主な利点は、追加のハードウェアを必要とせず、ClickHouse観測可能性ソリューションの全体的なリソースフットプリントを最小限に抑え、アプリケーションとコレクターとの間にシンプルなマッピングを持つことです。 + +エージェントの数が数百を超える場合は、ゲートウェイベースのアーキテクチャへの移行を検討する必要があります。このアーキテクチャにはいくつかの欠点があり、スケールの問題を抱えています: + +- **接続スケーリング** - 各エージェントはClickHouseに接続を確立します。ClickHouseは数百(場合によっては数千)の同時挿入接続を維持可能ですが、最終的にはそれが制限要因となり、挿入が非効率になります。つまり、ClickHouseが接続を維持するためにより多くのリソースを消費することになります。ゲートウェイを使用することで接続数を最小限に抑え、挿入の効率を上げます。 +- **エッジでの処理** - このアーキテクチャでは、変換やイベント処理がエッジまたはClickHouseで行われる必要があります。この制限は、複雑なClickHouseのMaterialized Viewを意味するか、重要なサービスに影響を与え、リソースが乏しいエッジに大量の計算を押し付けることを意味します。 +- **小規模なバッチとレイテンシ** - エージェントコレクターはそれぞれ非常に少ないイベントを収集することがあります。これにより、配信SLAを満たすために一定の間隔でフラッシュするように構成する必要があります。これにより、コレクターがClickHouseに小規模なバッチを送信することがあります。これは不利ですが、「挿入の最適化」を参照して非同期挿入で軽減できます。 + +### ゲートウェイを用いたスケーリング + +OTelコレクターはゲートウェイインスタンスとしてデプロイされ、上記の制限に対処します。これらは単独のサービスを提供し、通常はデータセンターや地域ごとに展開されます。これらは単一のOTLPエンドポイント経由でアプリケーション(またはエージェントロール内の他のコレクター)からイベントを受信します。通常、ゲートウェイインスタンスのセットがデプロイされ、ロードバランサーを使用してそれらの負荷を分散します。 + +NEEDS ALT + +
    + +このアーキテクチャの目的は、エージェントから計算に集中的な処理をオフロードし、それによってリソースの使用を最小限に抑えることです。これらのゲートウェイは、エージェントが行う必要がある変換タスクを実行できます。さらに、多くのエージェントからのイベントを集約することで、ゲートウェイはClickHouseに大規模なバッチを送信でき、効率的な挿入が可能です。エージェントが追加され、イベントのスループットが増加するにつれて、これらのゲートウェイコレクターは簡単にスケールできます。以下に、例としてのゲートウェイ設定と、それに関連するエージェント設定が示されています。エージェントとゲートウェイ間の通信にはOTLPが使用されています。 + +[clickhouse-agent-config.yaml](https://www.otelbin.io/#config=receivers%3A*N_filelog%3A*N___include%3A*N_____-_%2Fopt%2Fdata%2Flogs%2Faccess-structured.log*N___start*_at%3A_beginning*N___operators%3A*N_____-_type%3A_json*_parser*N_______timestamp%3A*N_________parse*_from%3A_attributes.time*_local*N_________layout%3A_*%22*.Y-*.m-*.d_*.H%3A*.M%3A*.S*%22*N*Nprocessors%3A*N_batch%3A*N___timeout%3A_5s*N___send*_batch*_size%3A_1000*N*Nexporters%3A*N_otlp%3A*N___endpoint%3A_localhost%3A4317*N___tls%3A*N_____insecure%3A_true_*H_Set_to_false_if_you_are_using_a_secure_connection*N*Nservice%3A*N_telemetry%3A*N___metrics%3A*N_____address%3A_0.0.0.0%3A9888_*H_Modified_as_2_collectors_running_on_same_host*N_pipelines%3A*N___logs%3A*N_____receivers%3A_%5Bfilelog%5D*N_____processors%3A_%5Bbatch%5D*N_____exporters%3A_%5Botlp%5D%7E&distro=otelcol-contrib%7E&distroVersion=v0.103.1%7E) + +```yaml +receivers: + filelog: + include: + - /opt/data/logs/access-structured.log + start_at: beginning + operators: + - type: json_parser + timestamp: + parse_from: attributes.time_local + layout: '%Y-%m-%d %H:%M:%S' +processors: + batch: + timeout: 5s + send_batch_size: 1000 +exporters: + otlp: + endpoint: localhost:4317 + tls: + insecure: true # セキュアな接続を使用している場合はfalseに設定してください +service: + telemetry: + metrics: + address: 0.0.0.0:9888 # 同一ホストで2つのコレクターが実行されているために修正 + pipelines: + logs: + receivers: [filelog] + processors: [batch] + exporters: [otlp] +``` + +[clickhouse-gateway-config.yaml](https://www.otelbin.io/#config=receivers%3A*N__otlp%3A*N____protocols%3A*N____grpc%3A*N____endpoint%3A_0.0.0.0%3A4317*N*Nprocessors%3A*N__batch%3A*N____timeout%3A_5s*N____send*_batch*_size%3A_10000*N*Nexporters%3A*N__clickhouse%3A*N____endpoint%3A_tcp%3A%2F%2Flocalhost%3A9000*Qdial*_timeout*E10s*Acompress*Elz4*N____ttl%3A_96h*N____traces*_table*_name%3A_otel*_traces*N____logs*_table*_name%3A_otel*_logs*N____create*_schema%3A_true*N____timeout%3A_10s*N____database%3A_default*N____sending*_queue%3A*N____queue*_size%3A_10000*N____retry*_on*_failure%3A*N____enabled%3A_true*N____initial*_interval%3A_5s*N____max*_interval%3A_30s*N____max*_elapsed*_time%3A_300s*N*Nservice%3A*N__pipelines%3A*N____logs%3A*N______receivers%3A_%5Botlp%5D*N______processors%3A_%5Bbatch%5D*N______exporters%3A_%5Bclickhouse%5D%7E&distro=otelcol-contrib%7E&distroVersion=v0.103.1%7E) + +```yaml +receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 +processors: + batch: + timeout: 5s + send_batch_size: 10000 +exporters: + clickhouse: + endpoint: tcp://localhost:9000?dial_timeout=10s&compress=lz4 + ttl: 96h + traces_table_name: otel_traces + logs_table_name: otel_logs + create_schema: true + timeout: 10s + database: default + sending_queue: + queue_size: 10000 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s +service: + pipelines: + logs: + receivers: [otlp] + processors: [batch] + exporters: [clickhouse] +``` + +これらの設定は以下のコマンドで実行できます。 + +```bash +./otelcol-contrib --config clickhouse-gateway-config.yaml +./otelcol-contrib --config clickhouse-agent-config.yaml +``` + +このアーキテクチャの主な欠点は、一連のコレクターを管理するための関連コストとオーバーヘッドです。 + +関連する学習と共に、より大規模なゲートウェイベースのアーキテクチャを管理する例については、[このブログ記事](https://clickhouse.com/blog/building-a-logging-platform-with-clickhouse-and-saving-millions-over-datadog)をお勧めします。 + +### Kafkaの追加 + +読者は、このアーキテクチャがメッセージキューとしてKafkaを使用していないことに気付くかもしれません。 + +Kafkaキューをメッセージバッファーとして使用することは、ログアーキテクチャで一般的なデザインパターンであり、ELKスタックによって普及しました。これにはいくつかの利点があります。主に、より強力なメッセージ配信保証を提供し、バックプレッシャーに対処するのに役立ちます。メッセージは収集エージェントからKafkaに送信され、ディスクに書き込まれます。理論上、クラスター化されたKafkaインスタンスは高スループットのメッセージバッファーを提供するはずです。なぜなら、データをディスクに直線的に書き込む計算オーバーヘッドが少ないからです。Elasticの場合、例えばトークン化とインデックス作成にはかなりのオーバーヘッドがかかります。エージェントからデータを移動することで、ソースでのログローテーションによってメッセージが失われるリスクを減らします。最後に、一部のユースケースで魅力的なメッセージリプレイおよびクロスリージョンレプリケーション機能を提供します。 + +しかしながら、ClickHouseは非常に迅速にデータを挿入することができ、通常のハードウェアで毎秒何百万行も処理できます。ClickHouseによるバックプレッシャーは**稀です**。Kafkaキューを利用することは、しばしばより多くのアーキテクチャの複雑さとコストを招きます。ログが銀行取引や他のミッションクリティカルなデータと同じ配信保証を必要としないという原則を受け入れられるなら、Kafkaの複雑さを避けることをお勧めします。 + +ただし、高い配信保証やデータをリプレイする機能(おそらく複数のソースに)を必要とする場合、Kafkaは有用なアーキテクチャ上の追加機能となることがあります。 + +NEEDS ALT + +
    + +この場合、OTelエージェントは[Kafkaエクスポーター](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/kafkaexporter/README.md)を使用してデータをKafkaに送信するように設定できます。ゲートウェイインスタンスは、[Kafkaレシーバー](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/kafkareceiver/README.md)を使用してメッセージを消費します。詳細については、ConfluentおよびOTelのドキュメントをお勧めします。 + +### リソースの見積もり + +OTelコレクターのリソース要件は、イベントのスループット、メッセージのサイズ、および行われる処理量に依存します。OpenTelemetryプロジェクトはユーザーがリソース要件を見積もるために使用できる[ベンチマーク](https://opentelemetry.io/docs/collector/benchmarks/)を提供しています。 + +[私たちの経験](https://clickhouse.com/blog/building-a-logging-platform-with-clickhouse-and-saving-millions-over-datadog#architectural-overview)では、3コアと12GBのRAMを持つゲートウェイインスタンスは、約60,000イベント/秒を処理できます。これは、フィールドのリネームのみを担当する最小限の処理パイプラインと正規表現を持たないことを前提としています。 + +ゲートウェイにイベントを送信するエージェントインスタンスの場合、イベントのタイムスタンプのみを設定するだけなら、予想される秒あたりのログに基づいてサイズを決定することをお勧めします。以下は、ユーザーが始めるための参考値を示しています: + +| ログレート | コレクターエージェントに必要なリソース | +|--------------|-------------------------------------| +| 1k/秒 | 0.2CPU, 0.2GiB | +| 5k/秒 | 0.5 CPU, 0.5GiB | +| 10k/秒 | 1 CPU, 1GiB | diff --git a/docs/ja/use-cases/observability/managing-data.md b/docs/ja/use-cases/observability/managing-data.md new file mode 100644 index 00000000000..3071ce7c7a9 --- /dev/null +++ b/docs/ja/use-cases/observability/managing-data.md @@ -0,0 +1,432 @@ +--- +title: データ管理 +description: 観測性のためのデータ管理 +slug: /ja/observability/managing-data +keywords: [observability, logs, traces, metrics, OpenTelemetry, Grafana, otel] +--- + +# データ管理 + +観測性のためのClickHouseの導入は常に大規模なデータセットが関与しており、これを管理する必要があります。ClickHouseにはデータ管理を支援するためのさまざまな機能があります。 + +## パーティション + +ClickHouseでのパーティションは、カラムまたはSQL式に従ってディスク上でデータを論理的に分割することを可能にします。データを論理的に分割することで、それぞれのパーティションを独立して操作(例: 削除)することができます。これにより、ユーザーは時間や[クラスタからの効率的なデータ削除](/ja/sql-reference/statements/alter/partition)に基づいてパーティションを移動し、したがってサブセットを効率的にストレージ層間で移動することができます。 + +パーティションは、テーブルが初めて定義される際に`PARTITION BY`句を通じて指定されます。この句には、行をどのパーティションに送信するかを決定するためのSQL式を任意のカラムに対して含めることができます。 + +NEEDS ALT + +
    + +データのパーツはディスク上の各パーティションと論理的に関連付けられており(共通のフォルダ名のプレフィックスを介して)、独立してクエリを実行することができます。以下の例では、デフォルトの`otel_logs`スキーマは`toDate(Timestamp)`式を使用して日ごとにパーティションを分割します。データがClickHouseに挿入される際に、この式が各行に対して評価され、該当するパーティションにルーティングされます(その日の最初の行である場合はパーティションが作成されます)。 + +```sql +CREATE TABLE default.otel_logs +( +... +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) +``` + +[いくつかの操作](/ja/sql-reference/statements/alter/partition)をパーティション上で実行することができます。例えば、[バックアップ](/ja/sql-reference/statements/alter/partition#freeze-partition)、[カラムの操作](/ja/sql-reference/statements/alter/partition#clear-column-in-partition)、[行ごとのデータの更新](/ja/sql-reference/statements/alter/partition#update-in-partition)/[削除](/ja/sql-reference/statements/alter/partition#delete-in-partition)、および[インデックスのクリア(例: 二次インデックス)](/ja/sql-reference/statements/alter/partition#clear-index-in-partition)が含まれます。 + +例えば、`otel_logs`テーブルが日ごとにパーティション分割されていると仮定すると、構造化されたログデータセットであれば、以下のように数日分のデータが含まれることになります。 + +```sql +SELECT Timestamp::Date AS day, + count() AS c +FROM otel_logs +GROUP BY day +ORDER BY c DESC + +┌────────day─┬───────c─┐ +│ 2019-01-22 │ 2333977 │ +│ 2019-01-23 │ 2326694 │ +│ 2019-01-26 │ 1986456 │ +│ 2019-01-24 │ 1896255 │ +│ 2019-01-25 │ 1821770 │ +└────────────┴─────────┘ + +5 rows in set. Elapsed: 0.058 sec. Processed 10.37 million rows, 82.92 MB (177.96 million rows/s., 1.42 GB/s.) +Peak memory usage: 4.41 MiB. +``` + +現在のパーティションは、簡単なシステムテーブルクエリを使用して見つけることができます。 + +```sql +SELECT DISTINCT partition +FROM system.parts +WHERE `table` = 'otel_logs' + +┌─partition──┐ +│ 2019-01-22 │ +│ 2019-01-23 │ +│ 2019-01-24 │ +│ 2019-01-25 │ +│ 2019-01-26 │ +└────────────┘ + +5 rows in set. Elapsed: 0.005 sec. +``` + +別のテーブル、例えば古いデータを保存するための`otel_logs_archive`があるかもしれません。データはパーティションごとにこのテーブルに効率的に移動できます(これは単なるメタデータの変更です)。 + +```sql +CREATE TABLE otel_logs_archive AS otel_logs +--move data to archive table +ALTER TABLE otel_logs + (MOVE PARTITION tuple('2019-01-26') TO TABLE otel_logs_archive +--confirm data has been moved +SELECT + Timestamp::Date AS day, + count() AS c +FROM otel_logs +GROUP BY day +ORDER BY c DESC + +┌────────day─┬───────c─┐ +│ 2019-01-22 │ 2333977 │ +│ 2019-01-23 │ 2326694 │ +│ 2019-01-24 │ 1896255 │ +│ 2019-01-25 │ 1821770 │ +└────────────┴─────────┘ + +4 rows in set. Elapsed: 0.051 sec. Processed 8.38 million rows, 67.03 MB (163.52 million rows/s., 1.31 GB/s.) +Peak memory usage: 4.40 MiB. + +SELECT Timestamp::Date AS day, + count() AS c +FROM otel_logs_archive +GROUP BY day +ORDER BY c DESC + +┌────────day─┬───────c─┐ +│ 2019-01-26 │ 1986456 │ +└────────────┴─────────┘ + +1 row in set. Elapsed: 0.024 sec. Processed 1.99 million rows, 15.89 MB (83.86 million rows/s., 670.87 MB/s.) +Peak memory usage: 4.99 MiB. +``` + +これは、`INSERT INTO SELECT`を使用し、新しいターゲットテーブルにデータを書き換える必要がある他の手法とは対照的です。 + +> [テーブル間のパーティションの移動](/ja/sql-reference/statements/alter/partition#move-partition-to-table)には、いくつかの条件を満たす必要があります。特に、テーブルは同じ構造、パーティションキー、主キー、およびインデックス/プロジェクションを持っている必要があります。`ALTER` DDLでのパーティションの指定方法についての詳細な説明は[こちら](/ja/sql-reference/statements/alter/partition#how-to-set-partition-expression)で確認できます。 + +さらに、データはパーティションごとに効率的に削除することができます。これは代替技法(変異または論理削除)よりもはるかにリソース効率が高く、優先されるべきです。 + +```sql +ALTER TABLE otel_logs + (DROP PARTITION tuple('2019-01-25')) + +SELECT + Timestamp::Date AS day, + count() AS c +FROM otel_logs +GROUP BY day +ORDER BY c DESC +┌────────day─┬───────c─┐ +│ 2019-01-22 │ 4667954 │ +│ 2019-01-23 │ 4653388 │ +│ 2019-01-24 │ 3792510 │ +└────────────┴─────────┘ +``` + +> この機能は`ttl_only_drop_parts=1`が使用されると有効期限 (TTL) によって活用されます。詳細については「有効期限 (TTL) を使用したデータ管理」を参照してください。 + +### アプリケーション + +上記の方法は、データを効率的に移動および操作する方法を示しています。実際にはユーザーはほとんどの場合、以下の2つのシナリオで観測性のユースケースにおいてパーティション操作を頻繁に利用するでしょう。 + +- **階層化アーキテクチャ** - ストレージ層間でデータを移動します(「ストレージティア」を参照)。これにより、ホットコールドアーキテクチャを構築することができます。 +- **効率的な削除** - データが指定された有効期限に達した場合(「有効期限 (TTL) を使用したデータ管理」を参照) + +以下に、これらの2つの詳細について詳しく説明します。 + +### クエリパフォーマンス + +パーティションはクエリのパフォーマンスに助けになりますが、それにはアクセスパターンに非常に依存します。もしクエリが少数のパーティション(理想的には1つ)のみをターゲットとする場合、パフォーマンスが潜在的に改善する可能性があります。これは通常、パーティショニングキーが主キーに含まれておらず、それによってフィルタリングを行う場合に有用です。ただし、多くのパーティションをカバーする必要があるクエリは、場合によってはパーティションを使用しない場合よりもパフォーマンスが悪くなる場合があります(パーツが多いため)。単一パーティションをターゲットとする利点は、パーティショニングキーがすでに主キーの初期エントリーである場合にはほとんど、または全く現れないかもしれません。パーティションは、各パーティション内の値がユニークである場合に[GROUP BYクエリを最適化するために使用](/ja/engines/table-engines/mergetree-family/custom-partitioning-key#group-by-optimisation-using-partition-key)することもできます。ただし、一般的に、ユーザーは主キーが最適化されていることを確認し、特定の予測可能なサブセットのアクセスパターンがある特殊な場合(例えば、日ごとにパーティショニングしており、ほとんどのクエリが前日のもの)にのみパーティショニングをクエリの最適化技術として考慮するべきです。この動作の例は[こちら](https://medium.com/datadenys/using-partitions-in-clickhouse-3ea0decb89c4)で確認できます。 + +## 有効期限 (TTL) を使用したデータ管理 + +Time-to-Live (TTL) は、ClickHouseを利用した観測性ソリューションにおける効率的なデータ保持と管理のための重要な機能です。特に膨大なデータが継続的に生成される場合においてそうです。ClickHouseにおいてTTLを実装することにより、古いデータの自動有効期限切れと削除が可能になり、ストレージが最適に使用され、手動介入なしで性能が維持されます。この機能は、データベースをスリムに保ち、ストレージコストを削減し、最も関連性が高く最新のデータに焦点を当てることでクエリの速度と効率を確保するために不可欠です。また、データ保持ポリシーに準拠し、データライフサイクルをシステマティックに管理することで、観測性ソリューションの全体的な持続可能性と拡張性を向上させます。 + +TTLはClickHouseにおいて、テーブルレベルまたはカラムレベルで指定することができます。 + +### テーブルレベルのTTL + +ログとトレースの両方のデフォルトのスキーマには、指定された期間後にデータの有効期限を設定するためのTTLが含まれています。これはClickHouseエクスポーターで`ttl`キーの下に指定されます。例: + +```yaml +exporters: + clickhouse: + endpoint: tcp://localhost:9000?dial_timeout=10s&compress=lz4&async_insert=1 + ttl: 72h +``` + +この構文は現在[Golang Duration syntax](https://pkg.go.dev/time#ParseDuration)をサポートしています。**ユーザーには`h`を使用し、これがパーティショニング期間に一致することを確認することをお勧めします。例えば、日ごとにパーティショニングする場合、24h, 48h, 72hなどの日数の倍数であることを確認してください。** これにより、自動的にTTL句がテーブルに追加されます。例:`ttl: 96h`の場合。 + +```sql +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +TTL toDateTime(Timestamp) + toIntervalDay(4) +SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1 +``` + +デフォルトでは、期限切れのTTLを持つデータはClickHouseによって[データパーツがマージされる](/ja/engines/table-engines/mergetree-family/mergetree#mergetree-data-storage)時に削除されます。ClickHouseが期限切れのデータを検出すると、スケジュール外のマージを実行します。 + +> TTLはすぐに適用されるわけではなく、前述のようなスケジュールに従って適用されます。MergeTreeテーブル設定の`merge_with_ttl_timeout`は、削除TTLでのマージが繰り返される前の最小遅延を秒単位で設定します。デフォルト値は14400秒(4時間)です。しかし、それは最低限の遅延に過ぎず、TTLマージがトリガーされるまでに時間がかかる場合があります。値が低すぎると、多くのスケジュール外マージが発生し、リソースを多く消費する可能性があります。TTLの期限切れを強制するには、コマンド`ALTER TABLE my_table MATERIALIZE TTL`を使用します。 + +**重要:`ttl_only_drop_parts=1`の設定を使用することをお勧めします。**(デフォルトスキーマで適用されています)この設定が有効な場合、ClickHouseはすべての行が期限切れの状態になると全体のパートを削除します。部分的にTTL期限切れの行をクリーンアップする(`ttl_only_drop_parts=0`の場合にリソース集約的な変異を介して達成される)のではなく、全体のパートを削除することで、より短い`merge_with_ttl_timeout`時間を持ち、システム性能への影響を低くできます。データが、有効期間と同じ単位でパーティション化されている場合(例: 日)、パーツは自然に定義された間隔のデータのみを含むようになります。これにより`ttl_only_drop_parts=1`を効率的に適用することができます。 + +### カラムレベルのTTL + +上記の例では、データがテーブルレベルで期限切れになります。ユーザーはカラムレベルでもデータを期限切れにすることができます。データが古くなるにつれて、調査時にリソースのオーバーヘッドを正当化する価値がないカラムを削除するために使用できます。例えば、`Body`カラムを保持し続けることをお勧めします。これは挿入時に抽出されていない新しい動的メタデータが追加される可能性があるためです(例:新しいKubernetesラベル)。例えば1ヶ月後、追加のメタデータが役に立たないと明らかであれば、その値を保持する価値があることを制限できます。 + +30日後に`Body`カラムが削除される例を以下に示します。 + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String TTL Timestamp + INTERVAL 30 DAY, + `Timestamp` DateTime, + ... +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +> カラムレベルのTTLを指定する場合、ユーザー自身でスキーマを指定する必要があります。これはOTelコレクターでは指定できません。 + +## データの再圧縮 + +通常、観測性のデータセットには`ZSTD(1)`をお勧めしますが、ユーザーは異なる圧縮アルゴリズムや高レベルの圧縮、例えば`ZSTD(3)`を試行することができます。スキーマ作成時に指定することもでき、設定された期間後に変更できるように圧縮を設定することもできます。別のコーデックまたは圧縮アルゴリズムが圧縮を改善するがクエリパフォーマンスが低下する場合、このトレードオフは、調査での利用度が低い古いデータに対して許容できても、調査での利用度が高い新しいデータに対しては許容できません。 + +下記に、データを削除する代わりに4日後に`ZSTD(3)`でデータを圧縮する例を示します。 + +```sql +CREATE TABLE default.otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +TTL Timestamp + INTERVAL 4 DAY RECOMPRESS CODEC(ZSTD(3)) +``` + +> ユーザーは、異なる圧縮レベルやアルゴリズムが挿入およびクエリパフォーマンスに与える影響を評価することを常にお勧めします。例えば、デルタコーデックはタイムスタンプの圧縮に役立ちます。しかし、これが主キーの一部である場合、フィルタリング性能に影響を及ぼす可能性があります。 + +TTLの設定および例に関するさらなる詳細は[こちら](/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes)で確認できます。TTLがテーブルおよびカラムに追加および修正される方法については[こちら](/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-ttl)で確認できます。TTLがホット-ウォーム-コールドアーキテクチャなどのストレージ階層を可能にする方法については、「ストレージティア」を参照してください。 + +## ストレージティア + +ClickHouseでは、SSDによるホット/最近のデータとS3による古いデータを指すストレージティアを、異なるディスク上に作成することができます。このアーキテクチャにより、調査での利用頻度が低いために高いクエリSLAを持つ古いデータに、より低コストのストレージを用いることが可能です。 + +> ClickHouse Cloudは、S3にバックアップされた単一のデータコピーを使用し、SSD-backed ノードキャッシュを使用します。そのため、ClickHouse Cloudでストレージティアは必要ありません。 + +ストレージティアの作成には、ディスクの作成が必要で、その後ストレージポリシーを構築し、テーブル作成時に指定できるボリュームを使用します。データは、使用率、パーツサイズ、ボリュームの優先度に基づいて自動的に異なるディスク間で移動することができます。詳細は[こちら](/ja/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-multiple-volumes)で確認できます。 + +データは`ALTER TABLE MOVE PARTITION`コマンドを使用して手動でディスク間を移動することができますが、TTLを使用してボリューム間のデータの移動を制御することも可能です。完全な例は[こちら](/ja/guides/developer/ttl#implementing-a-hotwarmcold-architecture)で確認できます。 + +## スキーマ変更の管理 + +システムのライフタイム中にログとトレーススキーマは必ず変わるでしょう。例えば、新しいメタデータやポッドラベルを持つ新しいシステムを監視する場合など。OTelスキーマを使用してデータを生成し、構造化された形式でオリジナルのイベントデータをキャプチャすることで、ClickHouseスキーマはこれらの変更に対して適応性を持つようになります。しかし、新しいメタデータが利用可能になり、クエリアクセスパターンが変化するにつれて、ユーザーはこれらの開発に対応するためにスキーマを更新したいと考えるでしょう。 + +スキーマ変更時のダウンタイムを避けるために、ユーザーはいくつかのオプションがあります。以下にそれらを示します。 + +### デフォルト値を使用する + +カラムは[`DEFAULT`値](/ja/sql-reference/statements/create/table#default)を使用してスキーマに追加することができます。INSERT時に指定されていない場合、指定されたデフォルトが使用されます。 + +スキーマ変更は、新しいカラムが送信されるようにするマテリアライズドビューの変換ロジックやOTelコレクターの設定を変更する前に行うことができます。 + +一度スキーマが変更されると、ユーザーはOTeLコレクターを再構成できます。推奨される「SQLでの構造抽出」で概説されているプロセスを使用することを想定した場合、OTeLコレクターがそのデータをNullテーブルエンジンに送信し、その結果を抽出してストレージに送信するためのマテリアライズドビューが担当し、ターゲットスキーマを抽出する場合、ビューは次の[`ALTER TABLE ... MODIFY QUERY`構文](/ja/sql-reference/statements/alter/view)を使用して修正できます。次のように、OTelの構造化ログからターゲットスキーマを抽出するためのビューを持つテーブルを例に示します: + +```sql +CREATE TABLE default.otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8 +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) + +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 AS +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status']::UInt16 AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +`LogAttributes`から新しいカラム`Size`を抽出したいとします。これを`ALTER TABLE`を使用してスキーマに追加し、デフォルト値を指定できます: + +```sql +ALTER TABLE otel_logs_v2 + (ADD COLUMN `Size` UInt64 DEFAULT JSONExtractUInt(Body, 'size')) +``` + +上記の例では、`LogAttributes`の`size`キーをデフォルトとして指定しています(存在しない場合には0になります)。これは、値が挿入されなかった行に対して、このカラムをアクセスするクエリはマップをアクセスする必要があるため、これにより後のクエリのコストが増加します。もちろん、定数で指定することも可能です。例えば、0にすると、値が挿入されなかった行に対するその後のクエリのコストが下がります。このテーブルをクエリすることで、マップから期待通りに値が生成されることがわかります: + +```sql +SELECT Size +FROM otel_logs_v2 +LIMIT 5 +┌──Size─┐ +│ 30577 │ +│ 5667 │ +│ 5379 │ +│ 1696 │ +│ 41483 │ +└───────┘ + +5 rows in set. Elapsed: 0.012 sec. +``` + +この値がすべての将来のデータに対して挿入されることを保証するために、以下に示す`ALTER TABLE`構文を使用してマテリアライズドビューを修正できます: + +```sql +ALTER TABLE otel_logs_mv + MODIFY QUERY +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status']::UInt16 AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +その後の行には、挿入時に`Size`カラムが埋められます。 + +### 新しいテーブルを作成 + +上記のプロセスの代替として、ユーザーは新しいスキーマを持つ新しいターゲットテーブルを単に作成することができます。マテリアライズドビューは、上記の`ALTER TABLE MODIFY QUERY`を使用して新しいテーブルを使用するように修正できます。このアプローチでは、ユーザーは例えば`otel_logs_v3`のようにテーブルをバージョン管理することができます。 + +このアプローチでは、複数のテーブルをクエリする必要があります。テーブル名のワイルドカードパターンを受け入れる[`merge`関数](/ja/sql-reference/table-functions/merge)を使用することができます。v2とv3の`otel_logs`テーブルをクエリする例を以下に示します: + +```sql +SELECT Status, count() AS c +FROM merge('otel_logs_v[2|3]') +GROUP BY Status +ORDER BY c DESC +LIMIT 5 + +┌─Status─┬────────c─┐ +│ 200 │ 38319300 │ +│ 304 │ 1360912 │ +│ 302 │ 799340 │ +│ 404 │ 420044 │ +│ 301 │ 270212 │ +└────────┴──────────┘ + +5 rows in set. Elapsed: 0.137 sec. Processed 41.46 million rows, 82.92 MB (302.43 million rows/s., 604.85 MB/s.) +``` + +ユーザーが`merge`関数を使用することを回避し、複数のテーブルを組み合わせたテーブルをエンドユーザーに公開したい場合、[Mergeテーブルエンジン](/ja/engines/table-engines/special/merge)を使用できます。次にこの例を示します: + +```sql +CREATE TABLE otel_logs_merged +ENGINE = Merge('default', 'otel_logs_v[2|3]') + +SELECT Status, count() AS c +FROM otel_logs_merged +GROUP BY Status +ORDER BY c DESC +LIMIT 5 + +┌─Status─┬────────c─┐ +│ 200 │ 38319300 │ +│ 304 │ 1360912 │ +│ 302 │ 799340 │ +│ 404 │ 420044 │ +│ 301 │ 270212 │ +└────────┴──────────┘ + +5 rows in set. Elapsed: 0.073 sec. Processed 41.46 million rows, 82.92 MB (565.43 million rows/s., 1.13 GB/s.) +``` + +新しいテーブルが追加された場合、このテーブルは`EXCHANGE`テーブル構文を使用して更新できます。例えば、v4テーブルを追加するには、新しいテーブルを作成し、以前のバージョンと原子交換できます。 + +```sql +CREATE TABLE otel_logs_merged_temp +ENGINE = Merge('default', 'otel_logs_v[2|3|4]') + +EXCHANGE TABLE otel_logs_merged_temp AND otel_logs_merged + +SELECT Status, count() AS c +FROM otel_logs_merged +GROUP BY Status +ORDER BY c DESC +LIMIT 5 + +┌─Status─┬────────c─┐ +│ 200 │ 39259996 │ +│ 304 │ 1378564 │ +│ 302 │ 820118 │ +│ 404 │ 429220 │ +│ 301 │ 276960 │ +└────────┴──────────┘ + +5 rows in set. Elapsed: 0.068 sec. Processed 42.46 million rows, 84.92 MB (620.45 million rows/s., 1.24 GB/s.) +``` diff --git a/docs/ja/use-cases/observability/schema-design.md b/docs/ja/use-cases/observability/schema-design.md new file mode 100644 index 00000000000..f963dfa5f69 --- /dev/null +++ b/docs/ja/use-cases/observability/schema-design.md @@ -0,0 +1,1608 @@ +--- +title: スキーマ設計 +description: 観測性のためのスキーマ設計 +slug: /ja/observability/schema-design +keywords: [observability, logs, traces, metrics, OpenTelemetry, Grafana, otel] +--- + +# 観測性のためのスキーマ設計 + +ユーザーには、以下の理由から、ログおよびトレース用の独自のスキーマを常に作成することをお勧めします。 + +- **主キーの選択** - デフォルトのスキーマは特定のアクセスパターンに最適化された `ORDER BY` を使用しています。したがって、あなたのアクセスパターンがこれに一致する可能性は低いです。 +- **構造の抽出** - ユーザーは、既存のカラムから新しいカラムを抽出したい場合があるかもしれません(例えば `Body` カラム)。これは、マテリアライズドカラム(および複雑なケースではマテリアライズドビュー)を使用して実現できます。これにはスキーマの変更が必要です。 +- **マップの最適化** - デフォルトのスキーマは、属性の保存に Map 型を使用しています。これらのカラムは任意のメタデータの保存を可能にします。これは重要な機能ですが、イベントからのメタデータは通常前もって定義されていないため、ClickHouseのような強く型付けられたデータベースに保存できません。そのため、マップキーやその値へのアクセスは通常のカラムに比べて効率が良くありません。これを解決するために、スキーマを変更し、最も一般的にアクセスされるマップキーをトップレベルのカラムとして配置することができます—「SQLでの構造の抽出」を参照してください。これにはスキーマの変更が必要です。 +- **マップキーアクセスの簡略化** - マップ内のキーにアクセスするにはより冗長な構文が必要です。ユーザーはエイリアスを使用することでこれを軽減できます。「エイリアスの使用」を参照してクエリを簡素化してください。 +- **セカンダリインデックス** - デフォルトのスキーマは、Map へのアクセスの高速化やテキストクエリの加速のためにセカンダリインデックスを使用します。これらは通常不要で、追加のディスクスペースを消費しますが、使用することができます。ただし、必要であることをテストする必要があります。「セカンダリ / データスキップインデックス」を参照してください。 +- **コーデックの使用** - ユーザーは、予期されるデータを理解し、圧縮を改善する証拠がある場合、カラムのコーデックをカスタマイズしたいと思うかもしれません。 + +_上記の各使用例について詳細に説明します。_ + +**重要**: ユーザーは最適な圧縮とクエリパフォーマンスを実現するためにスキーマを拡張および変更することが奨励されていますが、主要カラムのOTelスキーマ名付けに従うべきです。ClickHouseのGrafanaプラグインは、クエリビルドを支援するために、いくつかの基本的なOTelカラムの存在を前提としています(例:タイムスタンプやSeverityText)。ログおよびトレースに必要なカラムは、ここに文書化されています [[1]](https://grafana.com/developers/plugin-tools/tutorials/build-a-logs-data-source-plugin#logs-data-frame-format)[[2]](https://grafana.com/docs/grafana/latest/explore/logs-integration/) 及び[こちら](https://grafana.com/docs/grafana/latest/explore/trace-integration/#data-frame-structure)を参照してください。これらのカラム名を変更することができますが、プラグイン設定でデフォルトをオーバーライドしてください。 + +## SQLでの構造の抽出 + +構造化されたログまたは非構造化されたログを取り込む際、ユーザーはしばしば以下を実現する必要があります: + +- **文字列ブロブからのカラムの抽出**。これをクエリする方が、クエリ時の文字列操作よりも速くなります。 +- **マップからのキーの抽出**。デフォルトのスキーマは任意の属性を Map 型のカラムに格納します。この型はスキーマレスな機能を提供し、ユーザーがログやトレースを定義する際に属性のカラムを事前に定義する必要がないという利点があります—特にKubernetesからログを収集し、後でポッドラベルを保持することを保証したい場合、これはしばしば不可能です。マップのキーやその値へのアクセスは、普通のClickHouseカラムに比べて遅くなります。したがって、マップからキーを抽出してルートテーブルのカラムに配置することは、しばしば望ましいです。 + +以下のクエリを考えてみてください: + +特定のURLパスに対して最も多くのPOSTリクエストを受け取るカウントを取りたいとします。JSONブロブは `Body` カラムにStringとして保存されます。また、ユーザーがコレクター内でjson_parserを有効にしている場合、LogAttributesカラムに `Map(String, String)` としても保存される可能性があります。 + +```sql +SELECT LogAttributes +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: {"remote_addr":"54.36.149.41","remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET","request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1","status":"200","size":"30577","referer":"-","user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)"} +LogAttributes: {'status':'200','log.file.name':'access-structured.log','request_protocol':'HTTP/1.1','run_time':'0','time_local':'2019-01-22 00:26:14.000','size':'30577','user_agent':'Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)','referer':'-','remote_user':'-','request_type':'GET','request_path':'/filter/27|13 ,27| 5 ,p53','remote_addr':'54.36.149.41'} +``` + +LogAttributesが利用可能であると想定すると、サイトのどのURLパスが最も多くのPOSTリクエストを受け取っているかをカウントするためのクエリは次のとおりです: + +```sql +SELECT path(LogAttributes['request_path']) AS path, count() AS c +FROM otel_logs +WHERE ((LogAttributes['request_type']) = 'POST') +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productModelImages │ 10866 │ +│ /site/productAdditives │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 0.735 sec. Processed 10.36 million rows, 4.65 GB (14.10 million rows/s., 6.32 GB/s.) +Peak memory usage: 153.71 MiB. +``` + +ここでのマップ構文の使用に注意してください。たとえば `LogAttributes['request_path']`や、URLからクエリパラメータを削除するための [`path` 関数](/ja/sql-reference/functions/url-functions#path)です。 + +ユーザーがコレクター内でJSONパースを有効にしていない場合、`LogAttributes`は空になります。そのため、[JSON関数](/ja/sql-reference/functions/json-functions)を使用して文字列 `Body` からカラムを抽出する必要があります。 + +> 構造化されたログのJSONパースはClickHouseで行うことを一般的にお勧めします。ClickHouseが最速のJSONパース実装であると自信を持っています。ただし、ユーザーはログを他のソースに送信したい場合もあることを認識しています。それにこのロジックを SQL に配置したくない場合もあるでしょう。 + +```sql +SELECT path(JSONExtractString(Body, 'request_path')) AS path, count() AS c +FROM otel_logs +WHERE JSONExtractString(Body, 'request_type') = 'POST' +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productAdditives │ 10866 │ +│ /site/productModelImages │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 0.668 sec. Processed 10.37 million rows, 5.13 GB (15.52 million rows/s., 7.68 GB/s.) +Peak memory usage: 172.30 MiB. +``` + +次に、非構造化されたログを考えてみましょう: + +```sql +SELECT Body, LogAttributes +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: 151.233.185.144 - - [22/Jan/2019:19:08:54 +0330] "GET /image/105/brand HTTP/1.1" 200 2653 "https://www.zanbil.ir/filter/b43,p56" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-" +LogAttributes: {'log.file.name':'access-unstructured.log'} +``` + +非構造化ログの類似のクエリには、[`extractAllGroupsVertical` 関数](/ja/sql-reference/functions/string-search-functions#extractallgroupsvertical)を介した正規表現の使用が必要です。 + +```sql +SELECT + path((groups[1])[2]) AS path, + count() AS c +FROM +( + SELECT extractAllGroupsVertical(Body, '(\\w+)\\s([^\\s]+)\\sHTTP/\\d\\.\\d') AS groups + FROM otel_logs + WHERE ((groups[1])[1]) = 'POST' +) +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productModelImages │ 10866 │ +│ /site/productAdditives │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 1.953 sec. Processed 10.37 million rows, 3.59 GB (5.31 million rows/s., 1.84 GB/s.) +``` + +非構造化ログのパースのためのクエリの複雑さとコストが増加しているのに注意してください(パフォーマンスの違いに注意)。したがって、ユーザーには、可能な限り構造化されたログを使用することを強くお勧めします。 + +> 上記のクエリは、正規表現Dictionaryを利用して最適化できます。「Dictionaryの使用」を参照して詳細を確認してください。 + +これらの両方の使用例は、上記のクエリロジックを挿入時に移動させることにより、ClickHouseで満たすことができます。以下にいくつかのアプローチを示し、どのアプローチが適切かを強調します。 + +> ユーザーはまた、ここに説明されているように OTel Collector のプロセッサやオペレーターを使用して処理を行うこともできます。ほとんどの場合、ユーザーは ClickHouse がコレクターのプロセッサよりもリソース効率が高く、高速であることを見つけるでしょう。SQL で全てのイベント処理を行うことの主な欠点は、ソリューションが ClickHouse に結びつくことです。たとえば、ユーザーは OTel コレクターから他の宛先(例:S3)に処理済みのログを送信したい場合もあります。 + +### マテリアライズドカラム + +マテリアライズドカラムは、他のカラムから構造を抽出する最もシンプルな解決策を提供します。このようなカラムの値は常に挿入時に計算され、INSERTクエリで指定することはできません。 + +> マテリアライズドカラムは、挿入時に新しいカラムに値が抽出されるため、追加のストレージオーバーヘッドが発生します。 + +マテリアライズドカラムは、任意の ClickHouse 表現をサポートしており、[文字列の処理](/ja/sql-reference/functions/string-functions)([正規表現や検索](/ja/sql-reference/functions/string-search-functions)を含む)や [URL](/ja/sql-reference/functions/url-functions)、[型変換](/ja/sql-reference/functions/type-conversion-functions)、[JSON からの値の抽出](/ja/sql-reference/functions/json-functions)、または [数学的操作](/ja/sql-reference/functions/math-functions)など、あらゆる分析関数を活用できます。 + +基本処理にはマテリアライズドカラムを推奨します。これらは特に、マップから値を抽出し、それをルートカラムに昇格させ、型変換を行うのに役立ちます。非常に基本的なスキーマやマテリアライズドビューと組み合わせて使用する場合によく役立ちます。以下は、コレクターによってJSONが `LogAttributes` カラムに抽出されたログのスキーマです: + +```sql +CREATE TABLE otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `RequestPage` String MATERIALIZED path(LogAttributes['request_path']), + `RequestType` LowCardinality(String) MATERIALIZED LogAttributes['request_type'], + `RefererDomain` String MATERIALIZED domain(LogAttributes['referer']) +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SeverityText, toUnixTimestamp(Timestamp), TraceId) +``` + +JSON関数を使用してString `Body` から抽出するための同等のスキーマは[こちら](https://pastila.nl/?005cbb97/513b174a7d6114bf17ecc657428cf829#gqoOOiomEjIiG6zlWhE+Sg==)にあります。 + +私たちの3つのマテリアライズドビューのカラムは、リクエストページ、リクエストタイプ、リファラーのドメインを抽出します。これらはマップのキーにアクセスし、その値に関数を適用します。次のクエリは、著しく速くなります: + +```sql +SELECT RequestPage AS path, count() AS c +FROM otel_logs +WHERE RequestType = 'POST' +GROUP BY path +ORDER BY c DESC +LIMIT 5 + +┌─path─────────────────────┬─────c─┐ +│ /m/updateVariation │ 12182 │ +│ /site/productCard │ 11080 │ +│ /site/productPrice │ 10876 │ +│ /site/productAdditives │ 10866 │ +│ /site/productModelImages │ 10866 │ +└──────────────────────────┴───────┘ + +5 rows in set. Elapsed: 0.173 sec. Processed 10.37 million rows, 418.03 MB (60.07 million rows/s., 2.42 GB/s.) +Peak memory usage: 3.16 MiB. +``` + +> マテリアライズドカラムは、デフォルトで `SELECT *` の場合に返されません。これは、SELECT * の結果が常にINSERTでテーブルに戻されることができるという不変条件を維持するためです。この動作は `asterisk_include_materialized_columns=1` を設定することで無効にでき、Grafanaでも有効にできます(データソース設定の `Additional Settings -> Custom Settings` を参照)。 + +## マテリアライズドビュー + +マテリアライズドビューは、ログやトレースに対してSQLフィルタリングや変換を適用するための、より強力な手段を提供します。 + +マテリアライズドビューは、クエリのコストをクエリ時から挿入時にシフトすることを許可します。ClickHouseのマテリアライズドビューは、テーブルにデータが挿入される際に、データブロック上でクエリを実行するトリガーに過ぎません。このクエリの結果が、第二の「ターゲット」テーブルに挿入されます。 + +NEEDS ALT + +
    + +> ClickHouseのマテリアライズドビューは、基になるテーブルにデータが流入するにつれてリアルタイムで更新され、継続的に更新されるインデックスのように機能します。対照的に、他のデータベースではマテリアライズドビューは通常クエリの静的スナップショットで、リフレッシュが必要です(ClickHouseのリフレッシュ可能なマテリアライズドビューに似ています)。 + +マテリアライズドビューに関連付けられたクエリは、理論的には、集計を含む任意のクエリである可能性がありますが、[JOINに制限があります](https://clickhouse.com/blog/using-materialized-views-in-clickhouse#materialized-views-and-joins)。ログやトレースに必要な変換やフィルターワークロードにおいて、ユーザーは任意のSELECT文を可能と見なすことができます。 + +ユーザーは、クエリが単にテーブル(ソーステーブル)に挿入される行上で実行されるトリガーであり、結果が新しいテーブル(ターゲットテーブル)に送信されることを覚えておく必要があります。 + +ソーステーブルにデータを二重保存しないようにするため、ソーステーブルのテーブルエンジンを[Nullテーブルエンジン](/ja/engines/table-engines/special/null)に変更し、元のスキーマを保持することができます。私たちのOTelコレクターは、このテーブルにデータを送信し続けます。たとえば、ログの場合、otel_logsテーブルは次のようになります。 + +```sql +CREATE TABLE otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)) +) ENGINE = Null +``` + +Nullテーブルエンジンは強力な最適化機能です— `/dev/null` のように考えてください。このテーブルはデータを保存しませんが、関連付けられたマテリアライズドビューは挿入された行に対して実行され続けます。 + +以下のクエリを検討してください。これは、行を私たちが保存したいフォーマットに変換します。LogAttributesからすべてのカラムを抽出し(これはコレクターによって `json_parser` オペレーターを使用して設定されたと仮定)、`SeverityText` と `SeverityNumber` を設定します(これにはいくつかの単純な条件と[これらのカラムに関する定義](https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitytext)に基づいています)。この場合、ポピュレーションされることがわかっているカラムのみを選択します—TraceId、SpanId、TraceFlagsなどのカラムは無視します。 + +```sql +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status'] AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddr, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: {"remote_addr":"54.36.149.41","remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET","request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1","status":"200","size":"30577","referer":"-","user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)"} +Timestamp: 2019-01-22 00:26:14 +ServiceName: +Status: 200 +RequestProtocol: HTTP/1.1 +RunTime: 0 +Size: 30577 +UserAgent: Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/) +Referer: - +RemoteUser: - +RequestType: GET +RequestPath: /filter/27|13 ,27| 5 ,p53 +RemoteAddr: 54.36.149.41 +RefererDomain: +RequestPage: /filter/27|13 ,27| 5 ,p53 +SeverityText: INFO +SeverityNumber: 9 + +1 row in set. Elapsed: 0.027 sec. +``` + +上記のカラムには、将来的に追加される可能性のある追加属性を考慮して、`Body` カラムも抽出されています。このカラムはClickHouseでの圧縮が効き、アクセスされることはほとんどないため、クエリパフォーマンスに影響を与えることはありません。最後に、日時をDateTimeに変換(スペースを節約するため)します(「型の最適化」を参照)。 + +> 上記の `SeverityText` と `SeverityNumber` を抽出するための[条件文](/ja/sql-reference/functions/conditional-functions)の使用に注意してください。これらは複雑な条件を形成し、マップ内の値がセットされているかどうかを確認するのに非常に便利です。ルールに従い、LogAttributesにすべてのキーが存在することを単純に仮定します。ユーザーはそれに慣れることをお勧めします。これは、ログパースの友であり、[NULL値を扱う関数](/ja/sql-reference/functions/functions-for-nulls)の関数の他です! + +これらの結果を受け取るためのテーブルが必要です。以下のターゲットテーブルは、上記のクエリに一致します: + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8 +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +ここで選択された型は、「型の最適化」に関して議論された最適化に基づいています。 + +> スキーマが劇的に変更されたことに注意してください。実際には、ユーザーはTraceカラムを保持したい場合や、`ResourceAttributes`カラムも保持したい場合があるでしょう(これは通常Kubernetesメタデータを含みます)。Grafanaはトレースカラムを利用して、ログとトレース間のリンク機能を提供できます—「Grafanaの使用」を参照してください。 + +以下に、`otel_logs` テーブルに対して上記のセレクトを実行し、結果を `otel_logs_v2` に送信するマテリアライズドビュー `otel_logs_mv` を作成します。 + +```sql +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 AS +SELECT + Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + LogAttributes['status']::UInt16 AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +以下に示すように、上記は視覚化されます。 + +NEEDS ALT + +
    + +「Exporting to ClickHouse」で使用されているコレクター設定を再起動すると、データは期待される形式で `otel_logs_v2` に現れます。型付きJSON抽出関数の使用に注意してください。 + +```sql +SELECT * +FROM otel_logs_v2 +LIMIT 1 +FORMAT Vertical + +行 1: +────── +Body: {"remote_addr":"54.36.149.41","remote_user":"-","run_time":"0","time_local":"2019-01-22 00:26:14.000","request_type":"GET","request_path":"\/filter\/27|13 ,27| 5 ,p53","request_protocol":"HTTP\/1.1","status":"200","size":"30577","referer":"-","user_agent":"Mozilla\/5.0 (compatible; AhrefsBot\/6.1; +http:\/\/ahrefs.com\/robot\/)"} +Timestamp: 2019-01-22 00:26:14 +ServiceName: +Status: 200 +RequestProtocol: HTTP/1.1 +RunTime: 0 +Size: 30577 +UserAgent: Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/) +Referer: - +RemoteUser: - +RequestType: GET +RequestPath: /filter/27|13 ,27| 5 ,p53 +RemoteAddress: 54.36.149.41 +RefererDomain: +RequestPage: /filter/27|13 ,27| 5 ,p53 +SeverityText: INFO +SeverityNumber: 9 + +1 row in set. Elapsed: 0.010 sec. +``` + +JSON関数を使用して `Body` カラムからカラムを抽出する同等のマテリアライズドビューを以下に示します: + +```sql +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 AS +SELECT Body, + Timestamp::DateTime AS Timestamp, + ServiceName, + JSONExtractUInt(Body, 'status') AS Status, + JSONExtractString(Body, 'request_protocol') AS RequestProtocol, + JSONExtractUInt(Body, 'run_time') AS RunTime, + JSONExtractUInt(Body, 'size') AS Size, + JSONExtractString(Body, 'user_agent') AS UserAgent, + JSONExtractString(Body, 'referer') AS Referer, + JSONExtractString(Body, 'remote_user') AS RemoteUser, + JSONExtractString(Body, 'request_type') AS RequestType, + JSONExtractString(Body, 'request_path') AS RequestPath, + JSONExtractString(Body, 'remote_addr') AS remote_addr, + domain(JSONExtractString(Body, 'referer')) AS RefererDomain, + path(JSONExtractString(Body, 'request_path')) AS RequestPage, + multiIf(Status::UInt64 > 500, 'CRITICAL', Status::UInt64 > 400, 'ERROR', Status::UInt64 > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(Status::UInt64 > 500, 20, Status::UInt64 > 400, 17, Status::UInt64 > 300, 13, 9) AS SeverityNumber +FROM otel_logs +``` + +### 型に注意 + +上記のマテリアライズドビューは暗黙の型変換に依存しています—特にLogAttributesマップの使用において。ClickHouseはしばしば、抽出された値を対象テーブルの型に透明にキャストし、必要な構文を減少させます。しかし、ユーザーは、同じスキーマを使用するターゲットテーブルに対して `SELECT` ステートメントを使用してビューを常にテストすることをお勧めします。これにより、型が正しく処理されていることを確認できます。特に以下のケースには注意が必要です: + +- マップ内にキーが存在しない場合、空の文字列が返されます。数値の場合、これは適切な値にマッピングする必要があります。これは、[条件文](/ja/sql-reference/functions/conditional-functions)(例:`if(LogAttributes['status'] = ", 200, LogAttributes['status'])`)または[キャスト関数](/ja/sql-reference/functions/type-conversion-functions#touint8163264256ordefault)を使用してこのように達成できます。デフォルト値が許容される場合(例:`toUInt8OrDefault(LogAttributes['status'] )`)。 +- 一部の型は常にキャストされない場合があります。例えば、数値の文字列表現は、列挙値にキャストされません。 +- JSON抽出関数は、値が見つからない場合、型のデフォルト値を返します。これらの値が意味を持つか確認してください! + +> 観測性データの ClickHouse において Nullable を使用することは避けてください。ログやトレースにおいて、空と NULL の違いを区別する必要はほとんどありません。この機能は追加のストレージオーバーヘッドをもたらし、クエリパフォーマンスに悪影響を与えます。詳細については[こちら](/ja/data-modeling/schema-design#optimizing-types)を参照ください。 + +## 主キー(オーダリングキー)の選択 + +希望するカラムを抽出したら、オーダリング/主キーを最適化することができます。 + +オーダリングキーを選択するためのいくつかの簡単なルールがあります。以下は、時には対立することがあるため、これらを順番に検討してください。このプロセスから多くのキーを特定でき、通常4〜5個で十分です。 + +1. 一般的なフィルタやアクセスパターンに適合するカラムを選択します。ユーザーが通常、特定のカラム(例:ポッド名)でフィルタリングを開始する場合、このカラムは `WHERE` 句で頻繁に使用されます。これらを他の頻繁に使用されないカラムよりも優先してキーに含めます。 +2. フィルタリング時に全体の行数の大部分を除外するのに役立つカラムを優先し、必要に応じて読み取るデータの量を減少させます。サービス名やステータスコードはしばしば良い候補です。後者の場合、ユーザーが200でフィルタリングするとほとんどの行にマッチするのが一般的です。500エラーのように小さなサブセットに関連付けられる場合を除きます。 +3. テーブル内の他のカラムと高い相関がある可能性が高いカラムを優先します。これにより、これらの値が連続して保存され、圧縮が向上します。 +4. オーダリングキーのカラムの `GROUP BY` および `ORDER BY` 操作は、メモリ効率を向上させることができます。 + +
    + +オーダリングキーの一部のカラムを特定すると、それらを特定の順序で宣言する必要があります。この順序は、クエリ内のセカンダリキー列でのフィルタリング効率と、テーブルのデータファイルの圧縮率に大きな影響を与える可能性があります。一般的に、**カーディナリティの昇順でキーを並べることが最良です**。ただし、オーダリングキー内で後に現れるカラムでフィルタリングする際の効率が低くなることにバランスを取る必要があります。これらの動作をバランスさせ、アクセスパターンを考慮してください。最も重要なのは、さまざまなバリエーションをテストすることです。オーダリングキーやオプティマイズの方法について理解を深めるためには、[この記事](/ja/optimize/sparse-primary-indexes)をお勧めします。 + +> ログを整形した後に、オーダリングキーを決定することをお勧めします。属性マップ内のキーやJSON抽出式をオーダリングキーとして使用しないでください。オーダリングキーをテーブル内のルートカラムとして保持してください。 + +## マップの使用 + +以前の例では、`Map(String, String)` カラム内の値にアクセスするためにマップ構文 `map['key']` を使用していることを示しています。ネストされたキーにアクセスするためにマップ記法を使用するだけでなく、ClickHouse専用の[マップ関数](/ja/sql-reference/functions/tuple-map-functions#mapkeys)が利用可能で、これらのカラムをフィルタリングまたは選択することができます。 + +たとえば、次のクエリでは、[`mapKeys` 関数](/ja/sql-reference/functions/tuple-map-functions#mapkeys)を使用して、LogAttributesカラム内で利用可能なすべてのユニークキーを特定し、その後に[groupArrayDistinctArray関数](/ja/sql-reference/aggregate-functions/combinators)(コンビネータ)を続けます。 + +```sql +SELECT groupArrayDistinctArray(mapKeys(LogAttributes)) +FROM otel_logs +FORMAT Vertical + +行 1: +────── +groupArrayDistinctArray(mapKeys(LogAttributes)): ['remote_user','run_time','request_type','log.file.name','referer','request_path','status','user_agent','remote_addr','time_local','size','request_protocol'] + +1 row in set. Elapsed: 1.139 sec. Processed 5.63 million rows, 2.53 GB (4.94 million rows/s., 2.22 GB/s.) +Peak memory usage: 71.90 MiB. +``` + +> マップカラム名にドットを使用することをお勧めせず、将来的にその使用を非推奨にするかもしれません。 `_` を使用してください。 + +## エイリアスの使用 + +マップ型をクエリするのは、通常のカラムをクエリするよりも遅くなります—「クエリの高速化」を参照してください。さらに、構文がより複雑で、ユーザーが書くのが煩わしくなる可能性があります。この後の問題に対処するために、エイリアスカラムを使用することをお勧めします。 + +エイリアス(ALIAS)カラムは、クエリ時に計算され、テーブルに保存されません。したがって、この型のカラムに値をINSERTすることは不可能です。エイリアスを使用することで、マップキーを参照し、構文を簡素化し、マップエントリを通常のカラムとして透過的に露出させることができます。次の例を考えてみてください: + +```sql +CREATE TABLE otel_logs +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `TraceFlags` UInt32 CODEC(ZSTD(1)), + `SeverityText` LowCardinality(String) CODEC(ZSTD(1)), + `SeverityNumber` Int32 CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `Body` String CODEC(ZSTD(1)), + `ResourceSchemaUrl` String CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeSchemaUrl` String CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `LogAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `RequestPath` String MATERIALIZED path(LogAttributes['request_path']), + `RequestType` LowCardinality(String) MATERIALIZED LogAttributes['request_type'], + `RefererDomain` String MATERIALIZED domain(LogAttributes['referer']), + `RemoteAddr` IPv4 ALIAS LogAttributes['remote_addr'] +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, Timestamp) +``` + +いくつかのマテリアライズドカラムと、`ALIAS`カラムである`RemoteAddr`があり、これがマップ`LogAttributes`にアクセスします。これにより、`LogAttributes['remote_addr']`の値をこのカラムを通じてクエリできるため、クエリが簡素化されます。つまり、次のようにします。 + +```sql +SELECT RemoteAddr +FROM default.otel_logs +LIMIT 5 + +┌─RemoteAddr────┐ +│ 54.36.149.41 │ +│ 31.56.96.51 │ +│ 31.56.96.51 │ +│ 40.77.167.129 │ +│ 91.99.72.15 │ +└───────────────┘ + +5 rows in set. Elapsed: 0.011 sec. +``` + +さらに、`ALIAS`の追加は`ALTER TABLE`コマンドを使用して簡単に行えます。これらのカラムは即座に利用可能です。たとえば次のようにします。 + +```sql +ALTER TABLE default.otel_logs + (ADD COLUMN `Size` String ALIAS LogAttributes['size']) + +SELECT Size +FROM default.otel_logs_v3 +LIMIT 5 + +┌─Size──┐ +│ 30577 │ +│ 5667 │ +│ 5379 │ +│ 1696 │ +│ 41483 │ +└───────┘ + +5 rows in set. Elapsed: 0.014 sec. +``` + +> デフォルトでは、`SELECT *`はALIASカラムを除外します。この動作は`asterisk_include_alias_columns=1`を設定することで無効にできます。 + +## 型の最適化 + +型の最適化に関する[一般的な ClickHouse のベストプラクティス](/ja/data-modeling/schema-design#optimizing-types)は、ClickHouseの使用ケースにも適用されます。 + +## コーデックの使用 + +型の最適化に加えて、ユーザーはClickHouseの可視性スキーマの圧縮を最適化しようとする際に、[コーデックに関する一般的なベストプラクティス](/ja/data-compression/compression-in-clickhouse#choosing-the-right-column-compression-codec)に従うことができます。 + +一般に、ユーザーは`ZSTD`コーデックがログとトレースデータセットに非常に適用可能であることを確認できます。圧縮値をデフォルトの1から増加させることで、圧縮が改善される可能性があります。ただし、高い値は挿入時により大きなCPUオーバーヘッドを発生させるため、テストする必要があります。通常、この値を増加させても利益は少ないです。 + +さらに、タイムスタンプは圧縮に関してデルタエンコーディングから恩恵を受けますが、このカラムが主キー/順序付けキーで使用される場合、クエリパフォーマンスが遅くなることが示されています。ユーザーには、それぞれの圧縮とクエリパフォーマンスのトレードオフを評価することをお勧めします。 + +## Dictionaryの使用 + +[Dictionary](/ja/sql-reference/dictionaries)は、ClickHouseの[重要な機能](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse)であり、さまざまな内部および外部の[ソース](/ja/sql-reference/dictionaries#dictionary-sources)からのデータを、メモリ内で[キー・バリュー](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)表現として提供し、超低遅延のルックアップクエリに最適化されています。 + +NEEDS ALT + +
    + +これは、データを集約する際に、取り込んだデータをその場で強化し、取り込みプロセスを遅延させず、全体的にクエリのパフォーマンスを向上させるなど、さまざまなシナリオで便利です。特にJOINに有益です。可視性の使用ケースではジョインが必要になることは稀ですが、Dictionaryは挿入時とクエリ時の両方で強化目的で役立つことがあります。以下に両方の例を示します。 + +> Dictionaryを使用してジョインを加速したいユーザーは、[こちら](/ja/dictionary)でさらに詳細を確認できます。 + +### 挿入時とクエリ時 + +Dictionaryは、データセットをクエリ時または挿入時に強化するために使用できます。これらのアプローチにはそれぞれ利点と欠点があります。要約すると: + +- **挿入時** - これは通常、強化値が変更されず、Dictionaryにポピュレートできる外部ソースに存在する場合に適切です。この場合、挿入時に行を強化すると、クエリ時にDictionaryのルックアップが回避されます。これは、挿入パフォーマンスのコストと、強化された値がカラムとして格納されるため、追加のストレージオーバーヘッドが発生します。 +- **クエリ時** - Dictionary内の値が頻繁に変更される場合、クエリ時ルックアップがより適用可能です。値がマッピングされて変更された場合、カラムを更新する(データを再書き込みする)必要がなくなります。この柔軟性は、クエリ時のルックアップコストを考慮に入れる必要があります。たとえば、フィルター句でDictionaryルックアップを使用する場合、複数の行のルックアップが必要であれば、このクエリ時コストは通常は顕著です。結果の強化、すなわち`SELECT`内では、このオーバーヘッドは通常顕著ではありません。 + +私たちは、ユーザーがDictionaryの基本を理解することをお勧めします。Dictionaryは、特定の[専門関数](/ja/sql-reference/functions/ext-dict-functions#dictgetall)を使用して値を取得できるメモリ内のルックアップテーブルを提供します。 + +シンプルな強化例については、Dictionaryに関するガイド[こちら](/ja/dictionary)を参照してください。以下では、一般的な可視性強化タスクに焦点を当てます。 + +### IP Dictionaryの使用 + +IPアドレスを使用してログやトレースに緯度と経度の値をジオ強化することは、一般的な可視性要件です。`ip_trie` Dictionary構造を使用することで実現できます。 + +私たちは、[DB-IP.com](https://db-ip.com/)によって提供されている、月ごとに更新される[DB-IP市レベルデータセット](https://github.com/sapics/ip-location-db#db-ip-database-update-monthly)を公開されているものを使用します。 + +[README](https://github.com/sapics/ip-location-db#csv-format)から、データが次のように構造化されていることを確認できます。 + +```csv +| ip_range_start | ip_range_end | country_code | state1 | state2 | city | postcode | latitude | longitude | timezone | +``` + +この構造を考慮して、URLテーブル関数を使用してデータを確認してみましょう。 + +```sql +SELECT * +FROM url('https://raw.githubusercontent.com/sapics/ip-location-db/master/dbip-city/dbip-city-ipv4.csv.gz', 'CSV', '\n \tip_range_start IPv4, \n \tip_range_end IPv4, \n \tcountry_code Nullable(String), \n \tstate1 Nullable(String), \n \tstate2 Nullable(String), \n \tcity Nullable(String), \n \tpostcode Nullable(String), \n \tlatitude Float64, \n \tlongitude Float64, \n \ttimezone Nullable(String)\n \t') +LIMIT 1 +FORMAT Vertical +Row 1: +────── +ip_range_start: 1.0.0.0 +ip_range_end: 1.0.0.255 +country_code: AU +state1: Queensland +state2: ᴺᵁᴸᴸ +city: South Brisbane +postcode: ᴺᵁᴸᴸ +latitude: -27.4767 +longitude: 153.017 +timezone: ᴺᵁᴸᴸ +``` + +私たちの生活を簡単にするために、[`URL()`](/ja/engines/table-engines/special/url)テーブルエンジンを使用して、ClickHouseテーブルオブジェクトを作成し、行数を確認します。 + +```sql +CREATE TABLE geoip_url( + ip_range_start IPv4, + ip_range_end IPv4, + country_code Nullable(String), + state1 Nullable(String), + state2 Nullable(String), + city Nullable(String), + postcode Nullable(String), + latitude Float64, + longitude Float64, + timezone Nullable(String) +) ENGINE = URL('https://raw.githubusercontent.com/sapics/ip-location-db/master/dbip-city/dbip-city-ipv4.csv.gz', 'CSV') + +SELECT count() FROM geoip_url; + +┌─count()─┐ +│ 3261621 │ -- 3.26百万 +└─────────┘ +``` + +私たちの`ip_trie`Dictionaryは、IPアドレス範囲をCIDR表記で表現する必要があるため、`ip_range_start`と`ip_range_end`を変換する必要があります。 + +各範囲についてのCIDRは、次のクエリで簡潔に計算できます。 + +```sql +WITH + bitXor(ip_range_start, ip_range_end) AS xor, + if(xor != 0, ceil(log2(xor)), 0) AS unmatched, + 32 - unmatched AS cidr_suffix, + toIPv4(bitAnd(bitNot(pow(2, unmatched) - 1), ip_range_start)::UInt64) AS cidr_address +SELECT + ip_range_start, + ip_range_end, + concat(toString(cidr_address),'/',toString(cidr_suffix)) AS cidr +FROM + geoip_url +LIMIT 4; + +┌─ip_range_start─┬─ip_range_end─┬─cidr───────┐ +│ 1.0.0.0 │ 1.0.0.255 │ 1.0.0.0/24 │ +│ 1.0.1.0 │ 1.0.3.255 │ 1.0.0.0/22 │ +│ 1.0.4.0 │ 1.0.7.255 │ 1.0.4.0/22 │ +│ 1.0.8.0 │ 1.0.15.255 │ 1.0.8.0/21 │ +└────────────────┴──────────────┴────────────┘ + +4 rows in set. Elapsed: 0.259 sec. +``` + +> 上記のクエリでは多くのことが行われています。興味のある方は、こちらの[優れた説明](https://clickhouse.com/blog/geolocating-ips-in-clickhouse-and-grafana#using-bit-functions-to-convert-ip-ranges-to-cidr-notation)を読んでください。それ以外は、上記の計算がIP範囲のCIDRを計算することを受け入れてください。 + +私たちの目的のためには、IP範囲、国コード、および座標だけが必要ですので、新しいテーブルを作成し、GeoIPデータを挿入します。 + +```sql +CREATE TABLE geoip +( + `cidr` String, + `latitude` Float64, + `longitude` Float64, + `country_code` String +) +ENGINE = MergeTree +ORDER BY cidr + +INSERT INTO geoip +WITH + bitXor(ip_range_start, ip_range_end) AS xor, + if(xor != 0, ceil(log2(xor)), 0) AS unmatched, + 32 - unmatched AS cidr_suffix, + toIPv4(bitAnd(bitNot(pow(2, unmatched) - 1), ip_range_start)::UInt64) AS cidr_address +SELECT + concat(toString(cidr_address),'/',toString(cidr_suffix)) AS cidr, + latitude, + longitude, + country_code +FROM geoip_url +``` + +低遅延のIPルックアップをClickHouseで実行できるように、Dictionaryを活用して、GeoIPデータのキー→属性マッピングをメモリ内に保存します。ClickHouseは、ネットワークプレフィックス(CIDRブロック)を座標および国コードにマッピングするための`ip_trie` [Dictionary構造](/ja/sql-reference/dictionaries#ip_trie)を提供します。次は、このレイアウトを使用し、上述のテーブルをソースとして指定するDictionaryを作成します。 + +```sql +CREATE DICTIONARY ip_trie ( + cidr String, + latitude Float64, + longitude Float64, + country_code String +) +PRIMARY KEY cidr +SOURCE(CLICKHOUSE(TABLE 'geoip')) +LAYOUT(ip_trie) +LIFETIME(3600); +``` + +Dictionaryから行を選択し、このデータセットがルックアップ用に利用可能であることを確認できます。 + +```sql +SELECT * FROM ip_trie LIMIT 3 + +┌─cidr───────┬─latitude─┬─longitude─┬─country_code─┐ +│ 1.0.0.0/22 │ 26.0998 │ 119.297 │ CN │ +│ 1.0.0.0/24 │ -27.4767 │ 153.017 │ AU │ +│ 1.0.4.0/22 │ -38.0267 │ 145.301 │ AU │ +└────────────┴──────────┴───────────┴──────────────┘ + +3 rows in set. Elapsed: 4.662 sec. +``` + +> ClickHouseのDictionaryは、基になるテーブルデータと使用したライフタイム条件に基づいて、定期的に更新されます。DB-IPデータセットの最新の変更を反映するために、`geoip`テーブルに対して、geoip_urlリモートテーブルからデータを再挿入する必要があります。 + +GeoIPデータがip_trie Dictionary(便利にもip_trieという名前)にロードされたので、これを使用してIPのジオロケーションを実行できます。これは、次のように[`dictGet()`関数](/ja/sql-reference/functions/ext-dict-functions)を使用することで実現できます。 + +```sql +SELECT dictGet('ip_trie', ('country_code', 'latitude', 'longitude'), CAST('85.242.48.167', 'IPv4')) AS ip_details + +┌─ip_details──────────────┐ +│ ('PT',38.7944,-9.34284) │ +└─────────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +ここでの取得速度に注目してください。これにより、ログを強化することができます。この場合、**クエリ時の強化を実行する**ことにします。 + +元のログデータセットに戻ると、国別にログを集約するために上記を使用できます。以下は、`RemoteAddress`カラムを抽出したマテリアライズドビューから得られるスキーマを使用すると仮定します。 + +```sql +SELECT dictGet('ip_trie', 'country_code', tuple(RemoteAddress)) AS country, + formatReadableQuantity(count()) AS num_requests +FROM default.otel_logs_v2 +WHERE country != '' +GROUP BY country +ORDER BY count() DESC +LIMIT 5 + +┌─country─┬─num_requests────┐ +│ IR │ 736万 │ +│ US │ 167万 │ +│ AE │ 52.674万 │ +│ DE │ 15.935万 │ +│ FR │ 10.982万 │ +└─────────┴─────────────────┘ + +5 rows in set. Elapsed: 0.140 sec. Processed 20.73 million rows, 82.92 MB (147.79 million rows/s., 591.16 MB/s.) +Peak memory usage: 1.16 MiB. +``` + +IPから地理的な位置へのマッピングは変わる可能性があるため、ユーザーはリクエストが行われた時点での元の位置を知りたい可能性が高くなります。この理由から、インデックス時の強化はここで望ましいと考えられます。これは、次のように、マテリアライズドカラムを使用することで行うことができます。 + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + `Country` String MATERIALIZED dictGet('ip_trie', 'country_code', tuple(RemoteAddress)), + `Latitude` Float32 MATERIALIZED dictGet('ip_trie', 'latitude', tuple(RemoteAddress)), + `Longitude` Float32 MATERIALIZED dictGet('ip_trie', 'longitude', tuple(RemoteAddress)) +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +> ユーザーは、新しいデータに基づいてIP Dictionaryの強化が定期的に更新されることを望む可能性が高いです。これはDictionaryのLIFETIME句を使用して達成でき、これによりDictionaryが基になるテーブルから定期的に再ロードされます。基になるテーブルを更新する方法は、「リフレッシュ可能なマテリアライズドビューの使用」を参照してください。 + +上記の国と座標は、国別にグループ化およびフィルタリングする以上の可視化能力を提供します。インスピレーションについては、「地理データの可視化」を参照してください。 + +### 正規表現Dictionaryの使用(ユーザーエージェント解析) + +ユーザーエージェント文字列の解析は、古典的な正規表現の問題であり、ログやトレースベースのデータセットの一般的な要件です。ClickHouseは、正規表現ツリーディクショナリを使用してユーザーエージェントの効率的な解析を提供します。 + +正規表現ツリーディクショナリは、ClickHouseオープンソースでYAMLRegExpTree Dictionaryソースタイプを使用して定義されており、正規表現ツリーを含むYAMLファイルへのパスを提供します。独自の正規表現Dictionaryを提供する場合に必要な構造の詳細は[こちら](/ja/sql-reference/dictionaries#use-regular-expression-tree-dictionary-in-clickhouse-open-source)にあります。以下では、ユーザーエージェント解析に[ua-parser](https://github.com/ua-parser/uap-core)を使用し、サポートされているCSVフォーマット用のDictionaryをロードします。このアプローチはOSSとClickHouse Cloudに対応しています。 + +> 以下の例では、2024年6月の最新のuap-coreユーザーエージェント解析用の正規表現のスナップショットを使用します。最新のファイルは時々更新され、[こちら](https://raw.githubusercontent.com/ua-parser/uap-core/master/regexes.yaml)で確認できます。ユーザーは、以下に使用されるCSVファイルをロードする手順を[こちら](/ja/sql-reference/dictionaries#collecting-attribute-values)で確認できます。 + +次のように、メモリテーブルを作成します。これにより、デバイス、ブラウザ、およびオペレーティングシステムの解析用の正規表現が保持されます。 + +```sql +CREATE TABLE regexp_os +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; + +CREATE TABLE regexp_browser +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; + +CREATE TABLE regexp_device +( + id UInt64, + parent_id UInt64, + regexp String, + keys Array(String), + values Array(String) +) ENGINE=Memory; +``` + +これらのテーブルは、URLテーブル関数を使用して、以下の公開ホストCSVファイルからポピュレートできます。 + +```sql +INSERT INTO regexp_os SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/user_agent_regex/regexp_os.csv', 'CSV', 'id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') + +INSERT INTO regexp_device SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/user_agent_regex/regexp_device.csv', 'CSV', 'id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') + +INSERT INTO regexp_browser SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/user_agent_regex/regexp_browser.csv', 'CSV', 'id UInt64, parent_id UInt64, regexp String, keys Array(String), values Array(String)') +``` + +メモリテーブルがポピュレートされたので、正規表現 Dictionaryをロードできます。ここで注意すべきは、キー値をカラムとして指定する必要があることです。これが、ユーザーエージェントから抽出できる属性になります。 + +```sql +CREATE DICTIONARY regexp_os_dict +( + regexp String, + os_replacement String default 'Other', + os_v1_replacement String default '0', + os_v2_replacement String default '0', + os_v3_replacement String default '0', + os_v4_replacement String default '0' +) +PRIMARY KEY regexp +SOURCE(CLICKHOUSE(TABLE 'regexp_os')) +LIFETIME(MIN 0 MAX 0) +LAYOUT(REGEXP_TREE); + +CREATE DICTIONARY regexp_device_dict +( + regexp String, + device_replacement String default 'Other', + brand_replacement String, + model_replacement String +) +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_device')) +LIFETIME(0) +LAYOUT(REGEXP_TREE); + +CREATE DICTIONARY regexp_browser_dict +( + regexp String, + family_replacement String default 'Other', + v1_replacement String default '0', + v2_replacement String default '0' +) +PRIMARY KEY(regexp) +SOURCE(CLICKHOUSE(TABLE 'regexp_browser')) +LIFETIME(0) +LAYOUT(REGEXP_TREE); +``` + +これらのDictionaryをロードした後、サンプルのユーザーエージェントを提供し、新しいDictionaryの抽出機能をテストできます。 + +```sql +WITH 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:127.0) Gecko/20100101 Firefox/127.0' AS user_agent +SELECT + dictGet('regexp_device_dict', ('device_replacement', 'brand_replacement', 'model_replacement'), user_agent) AS device, + dictGet('regexp_browser_dict', ('family_replacement', 'v1_replacement', 'v2_replacement'), user_agent) AS browser, + dictGet('regexp_os_dict', ('os_replacement', 'os_v1_replacement', 'os_v2_replacement', 'os_v3_replacement'), user_agent) AS os + +┌─device────────────────┬─browser───────────────┬─os─────────────────────────┐ +│ ('Mac','Apple','Mac') │ ('Firefox','127','0') │ ('Mac OS X','10','15','0') │ +└───────────────────────┴───────────────────────┴────────────────────────────┘ + +1 row in set. Elapsed: 0.003 sec. +``` + +ユーザーエージェントに関するルールはほとんど変わらないため、新しいブラウザ、オペレーティングシステム、およびデバイスに応じてDictionaryを更新する必要があるため、挿入時にこの抽出を実行するのが理にかなっています。 + +この作業は、マテリアライズドカラムを使用するか、マテリアライズドビューを使用して行うことができます。以前に使用したマテリアライズドビューを修正します。 + +```sql +CREATE MATERIALIZED VIEW otel_logs_mv TO otel_logs_v2 +AS SELECT + Body, + CAST(Timestamp, 'DateTime') AS Timestamp, + ServiceName, + LogAttributes['status'] AS Status, + LogAttributes['request_protocol'] AS RequestProtocol, + LogAttributes['run_time'] AS RunTime, + LogAttributes['size'] AS Size, + LogAttributes['user_agent'] AS UserAgent, + LogAttributes['referer'] AS Referer, + LogAttributes['remote_user'] AS RemoteUser, + LogAttributes['request_type'] AS RequestType, + LogAttributes['request_path'] AS RequestPath, + LogAttributes['remote_addr'] AS RemoteAddress, + domain(LogAttributes['referer']) AS RefererDomain, + path(LogAttributes['request_path']) AS RequestPage, + multiIf(CAST(Status, 'UInt64') > 500, 'CRITICAL', CAST(Status, 'UInt64') > 400, 'ERROR', CAST(Status, 'UInt64') > 300, 'WARNING', 'INFO') AS SeverityText, + multiIf(CAST(Status, 'UInt64') > 500, 20, CAST(Status, 'UInt64') > 400, 17, CAST(Status, 'UInt64') > 300, 13, 9) AS SeverityNumber, + dictGet('regexp_device_dict', ('device_replacement', 'brand_replacement', 'model_replacement'), UserAgent) AS Device, + dictGet('regexp_browser_dict', ('family_replacement', 'v1_replacement', 'v2_replacement'), UserAgent) AS Browser, + dictGet('regexp_os_dict', ('os_replacement', 'os_v1_replacement', 'os_v2_replacement', 'os_v3_replacement'), UserAgent) AS Os +FROM otel_logs +``` + +これにより、ターゲットテーブル`otel_logs_v2`のスキーマを修正する必要があります。 + +```sql +CREATE TABLE default.otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt8, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `remote_addr` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + `Device` Tuple(device_replacement LowCardinality(String), brand_replacement LowCardinality(String), model_replacement LowCardinality(String)), + `Browser` Tuple(family_replacement LowCardinality(String), v1_replacement LowCardinality(String), v2_replacement LowCardinality(String)), + `Os` Tuple(os_replacement LowCardinality(String), os_v1_replacement LowCardinality(String), os_v2_replacement LowCardinality(String), os_v3_replacement LowCardinality(String)) +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp, Status) +``` + +コレクタを再起動し、構造化されたログを取り込んだ後、次のように新しく抽出されたDevice、Browser、およびOsカラムをクエリできます。 + +```sql +SELECT Device, Browser, Os +FROM otel_logs_v2 +LIMIT 1 +FORMAT Vertical + +Row 1: +────── +Device: ('Spider','Spider','Desktop') +Browser: ('AhrefsBot','6','1') +Os: ('Other','0','0','0') +``` + +> ユーザーエージェントカラムに対してタプルを使用することに注意してください。タプルは、階層が事前に知られている複雑な構造に推奨されます。サブカラムは、マップキーと異なり、通常のカラムと同じパフォーマンスを提供しますが、異種型が可能です。 + +### さらなる読み物 + +Dictionaryに関するより多くの例や詳細については、次のような記事をお勧めします。 + +- [Dictionaryの高度なトピック](/ja/dictionary#advanced-dictionary-topics) +- [「Dictionaryを使用してクエリを加速する」](https://clickhouse.com/blog/faster-queries-dictionaries-clickhouse) +- [Dictionary](/ja/sql-reference/dictionaries) + +## クエリの加速 + +ClickHouseは、クエリパフォーマンスを加速するためのいくつかのテクニックをサポートしています。以下は、適切な主キー/順序付けキーを選択して最も人気のあるアクセスパターンを最適化し、圧縮を最大化する過程で検討すべきことです。これは通常、最小限の労力でパフォーマンスに最も大きな影響を与えます。 + +## 集約のためのマテリアライズドビュー(増分)使用 + +以前のセクションでは、データ変換とフィルタリングのためにマテリアライズドビューを使用することを探りました。しかし、マテリアライズドビューは、挿入時に集約を事前計算し、その結果をストアするためにも使用できます。この結果は、後続の挿入からの結果で更新できるため、実際に挿入時に集約を計算することができます。 + +ここでの主なアイデアは、結果が元のデータの小さい表現(集約の場合の一部のスケッチ)であることが多いということです。結果をターゲットテーブルから読み取るためのシンプルなクエリと組み合わせると、元のデータで同じ計算を行うよりもクエリ時間が早くなります。 + +構造化ログを使用して、時間ごとのトラフィック合計を計算する次のクエリを考えてみましょう。 + +```sql +SELECT toStartOfHour(Timestamp) AS Hour, + sum(toUInt64OrDefault(LogAttributes['size'])) AS TotalBytes +FROM otel_logs +GROUP BY Hour +ORDER BY Hour DESC +LIMIT 5 + +┌────────────────Hour─┬─TotalBytes─┐ +│ 2019-01-26 16:00:00 │ 1661716343 │ +│ 2019-01-26 15:00:00 │ 1824015281 │ +│ 2019-01-26 14:00:00 │ 1506284139 │ +│ 2019-01-26 13:00:00 │ 1580955392 │ +│ 2019-01-26 12:00:00 │ 1736840933 │ +└─────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.666 sec. Processed 10.37 million rows, 4.73 GB (15.56 million rows/s., 7.10 GB/s.) +Peak memory usage: 1.40 MiB. +``` + +これはGrafanaでの一般的なラインチャートになる可能性があります。このクエリは明らかに非常に速いです - データセットはわずか10百万行であり、ClickHouseは速いです!しかし、これをビリオンやトリリオン行にスケールさせると、私たちはこのクエリパフォーマンスを維持することを望むでしょう。 + +> このクエリは、LogAttributesからサイズキーを抽出する以前のマテリアライズドビューであるotel_logs_v2を使用すると、10倍速くなります。この例では生データを使用していますが、これはこのクエリが一般的な場合は以前のビューを使用することを推奨します。 + +マテリアライズドビューを使用して挿入時に計算を行う結果を受け取るテーブルが必要です。このテーブルは、各時間ごとに1行のみを保持する必要があります。既存の時間に対して更新が受信された場合、他のカラムは既存の時間の行にマージされる必要があります。部分的な状態を他のカラムのために保存することで、この増分状態のマージを実現できます。 + +これはClickHouseの特別なエンジンタイプ、すなわちSummingMergeTreeを必要とします。これにより、同じ順序キーを持つすべての行が1つの行に置き換えられ、数値カラムの値が合計された行が含まれます。次のテーブルは、同じ日付の行をマージし、数値カラムを合計します。 + +```sql +CREATE TABLE bytes_per_hour +( + `Hour` DateTime, + `TotalBytes` UInt64 +) +ENGINE = SummingMergeTree +ORDER BY Hour +``` + +挿入時に上記のSELECTを実行して、マテリアライズドビューを示すと仮定します。bytes_per_hourテーブルは空で、データの受信がまだ行われていないとします。マテリアライズドビューは、otel_logsに挿入されたデータに対して上記のSELECTを実行し、その結果をbytes_per_hourに送信します。構文は以下の通りです。 + +```sql +CREATE MATERIALIZED VIEW bytes_per_hour_mv TO bytes_per_hour AS +SELECT toStartOfHour(Timestamp) AS Hour, + sum(toUInt64OrDefault(LogAttributes['size'])) AS TotalBytes +FROM otel_logs +GROUP BY Hour +``` + +ここでの`TO`句は重要であり、結果が送信される場所、すなわち`bytes_per_hour`を示しています。 + +Otel Collectorを再起動し、ログを再送信すると、`bytes_per_hour`テーブルは上記のクエリ結果で増分的にポピュレートされます。完了後、`bytes_per_hour`のサイズを確認すると、時間ごとに1行のはずです。 + +```sql +SELECT count() +FROM bytes_per_hour +FINAL + +┌─count()─┐ +│ 113 │ +└─────────┘ +``` + +ここでは、`otel_logs`内の10百万行から113行に実質的に減少しました。このキーは、新しいログが`otel_logs`テーブルに挿入されると、新しい値がそれぞれの時間のために`bytes_per_hour`に送信され、バックグラウンドで非同期に自動的にマージされます。`bytes_per_hour`は常に小さく、最新の状態に保たれます。 + +行のマージは非同期であるため、ユーザーがクエリを行う際には、時間ごとに複数の行が存在する可能性があります。クエリ時に未処理の行がマージされるようにするために、2つのオプションがあります。 + +1. テーブル名の[`FINAL`修飾子](/ja/sql-reference/statements/select/from#final-modifier)を使用します。これは、上記のカウントクエリでも行いました。 +2. 最終テーブルで使用される順序キー(この場合はTimestamp)を集約し、メトリックを合計します。これは通常、効率が良く柔軟性があり(テーブルは他の用途にも使用できる)、前者は一部のクエリにはより簡単かもしれません。両方を以下に示します。 + +```sql +SELECT + Hour, + sum(TotalBytes) AS TotalBytes +FROM bytes_per_hour +GROUP BY Hour +ORDER BY Hour DESC +LIMIT 5 + +┌────────────────Hour─┬─TotalBytes─┐ +│ 2019-01-26 16:00:00 │ 1661716343 │ +│ 2019-01-26 15:00:00 │ 1824015281 │ +│ 2019-01-26 14:00:00 │ 1506284139 │ +│ 2019-01-26 13:00:00 │ 1580955392 │ +│ 2019-01-26 12:00:00 │ 1736840933 │ +└─────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.008 sec. + +SELECT + Hour, + TotalBytes +FROM bytes_per_hour +FINAL +ORDER BY Hour DESC +LIMIT 5 + +┌────────────────Hour─┬─TotalBytes─┐ +│ 2019-01-26 16:00:00 │ 1661716343 │ +│ 2019-01-26 15:00:00 │ 1824015281 │ +│ 2019-01-26 14:00:00 │ 1506284139 │ +│ 2019-01-26 13:00:00 │ 1580955392 │ +│ 2019-01-26 12:00:00 │ 1736840933 │ +└─────────────────────┴────────────┘ + +5 rows in set. Elapsed: 0.005 sec. +``` + +この結果、クエリの速度は0.6秒から0.008秒に75倍向上しました! + +> これらの節約は、より大きなデータセットやより複雑なクエリではさらに大きくなる可能性があります。例については[こちら](https://github.com/ClickHouse/clickpy)を参照してください。 + +### より複雑な例 + +上記の例は、SummingMergeTreeを使用して時間ごとの単純なカウントを集約しています。単純な合計を超える統計には、異なるターゲットテーブルエンジンであるAggregatingMergeTreeが必要です。 + +たとえば、日ごとのユニークなIPアドレス数(ユニークなユーザー数)を計算したいとします。このためのクエリは次の通りです。 + +```sql +SELECT toStartOfHour(Timestamp) AS Hour, uniq(LogAttributes['remote_addr']) AS UniqueUsers +FROM otel_logs +GROUP BY Hour +ORDER BY Hour DESC + +┌────────────────Hour─┬─UniqueUsers─┐ +│ 2019-01-26 16:00:00 │ 4763 │ +… +│ 2019-01-22 00:00:00 │ 536 │ +└─────────────────────┴────────────┘ + +113 rows in set. Elapsed: 0.667 sec. Processed 10.37 million rows, 4.73 GB (15.53 million rows/s., 7.09 GB/s.) +``` + +集約のために増分更新を維持するには、AggregatingMergeTreeが必要です。 + +```sql +CREATE TABLE unique_visitors_per_hour +( + `Hour` DateTime, + `UniqueUsers` AggregateFunction(uniq, IPv4) +) +ENGINE = AggregatingMergeTree +ORDER BY Hour +``` + +ClickHouseが集約状態が保存されることを認識するように、`UniqueUsers`カラムの型を[`AggregateFunction`](/ja/sql-reference/data-types/aggregatefunction)として定義し、部分状態のソース関数(uniq)とソースカラムの型(IPv4)を指定します。SummingMergeTreeと同様に、同じ`ORDER BY`キー値を持つ行がマージされます(上記の例ではHour)。 + +関連するマテリアライズドビューは、以前のクエリを使用します。 + +```sql +CREATE MATERIALIZED VIEW unique_visitors_per_hour_mv TO unique_visitors_per_hour AS +SELECT toStartOfHour(Timestamp) AS Hour, + uniqState(LogAttributes['remote_addr']::IPv4) AS UniqueUsers +FROM otel_logs +GROUP BY Hour +ORDER BY Hour DESC +``` + +集約関数の末尾に`suffix`を追加することに注意してください。これは、関数の集約状態が戻されることを保証し、最終結果ではありません。これにより、この部分状態が他の状態とマージするための追加情報を含むことができます。 + +データが再読み込みされた後、コレクタの再起動を経て、`unique_visitors_per_hour`テーブルに113行が確認できることができます。 + +```sql +SELECT count() +FROM unique_visitors_per_hour +FINAL + +┌─count()─┐ +│ 113 │ +└─────────┘ +``` +Our final query needs to utilize the Merge suffix for our functions (as the columns store partial aggregation states): + +```sql +SELECT Hour, uniqMerge(UniqueUsers) AS UniqueUsers +FROM unique_visitors_per_hour +GROUP BY Hour +ORDER BY Hour DESC + +┌────────────────Hour─┬─UniqueUsers─┐ +│ 2019-01-26 16:00:00 │ 4763 │ + +│ 2019-01-22 00:00:00 │ 536 │ +└─────────────────────┴─────────────┘ + +113 rows in set. Elapsed: 0.027 sec. +``` + +Note we use a `GROUP BY` here instead of using `FINAL`. + +## 使用したマテリアライズドビュー (累積) による高速検索 + +ユーザーは、フィルターおよび集計句で頻繁に使用されるカラムで ClickHouse の順序キーを選択する際に、そのアクセスパターンを考慮する必要があります。これは、ユーザーが多様なアクセスパターンを持つ観測性のユースケースにおいて、単一のカラムセットでカプセル化できないため制約になることがあります。これをデフォルトのOTelスキーマに組み込まれた例で最もよく示しています。トレースのデフォルトスキーマを考えてみましょう: + +```sql +CREATE TABLE otel_traces +( + `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `TraceId` String CODEC(ZSTD(1)), + `SpanId` String CODEC(ZSTD(1)), + `ParentSpanId` String CODEC(ZSTD(1)), + `TraceState` String CODEC(ZSTD(1)), + `SpanName` LowCardinality(String) CODEC(ZSTD(1)), + `SpanKind` LowCardinality(String) CODEC(ZSTD(1)), + `ServiceName` LowCardinality(String) CODEC(ZSTD(1)), + `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `ScopeName` String CODEC(ZSTD(1)), + `ScopeVersion` String CODEC(ZSTD(1)), + `SpanAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)), + `Duration` Int64 CODEC(ZSTD(1)), + `StatusCode` LowCardinality(String) CODEC(ZSTD(1)), + `StatusMessage` String CODEC(ZSTD(1)), + `Events.Timestamp` Array(DateTime64(9)) CODEC(ZSTD(1)), + `Events.Name` Array(LowCardinality(String)) CODEC(ZSTD(1)), + `Events.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + `Links.TraceId` Array(String) CODEC(ZSTD(1)), + `Links.SpanId` Array(String) CODEC(ZSTD(1)), + `Links.TraceState` Array(String) CODEC(ZSTD(1)), + `Links.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1, + INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_key mapKeys(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_span_attr_value mapValues(SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1, + INDEX idx_duration Duration TYPE minmax GRANULARITY 1 +) +ENGINE = MergeTree +PARTITION BY toDate(Timestamp) +ORDER BY (ServiceName, SpanName, toUnixTimestamp(Timestamp), TraceId) +``` + +このスキーマは、`ServiceName`、`SpanName`、および `Timestamp` によるフィルタリングに最適化されています。トレーシングでは、ユーザーは特定の `TraceId` による検索を行い、関連するトレースのスパンを取得する必要があります。これが順序キーに存在しますが、その位置が最後にあるため、[フィルタリングの効率が低下する](https://en/optimize/sparse-primary-indexes#ordering-key-columns-efficiently)ことがあり、単一のトレースを取得する際に、多くのデータをスキャンしなければならない可能性があります。 + +OTel コレクターは、この課題に対処するために、マテリアライズドビューと関連するテーブルもインストールします。テーブルとビューは以下のようになります: + +```sql +CREATE TABLE otel_traces_trace_id_ts +( + `TraceId` String CODEC(ZSTD(1)), + `Start` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + `End` DateTime64(9) CODEC(Delta(8), ZSTD(1)), + INDEX idx_trace_id TraceId TYPE bloom_filter(0.01) GRANULARITY 1 +) +ENGINE = MergeTree +ORDER BY (TraceId, toUnixTimestamp(Start)) + + +CREATE MATERIALIZED VIEW otel_traces_trace_id_ts_mv TO otel_traces_trace_id_ts +( + `TraceId` String, + `Start` DateTime64(9), + `End` DateTime64(9) +) +AS SELECT + TraceId, + min(Timestamp) AS Start, + max(Timestamp) AS End +FROM otel_traces +WHERE TraceId != '' +GROUP BY TraceId +``` + +このビューは、テーブル `otel_traces_trace_id_ts` にトレースの最小および最大のタイムスタンプを持つことを実効的に保証します。このテーブルは、`TraceId` によって順序付けられており、これによりこれらのタイムスタンプを効率的に取得できます。これらのタイムスタンプ範囲は、メイントレース `otel_traces` テーブルをクエリする際にも使用できます。具体的には、トレースのIDで取得する際にGrafanaが使用するクエリは以下の通りです: + +```sql +WITH 'ae9226c78d1d360601e6383928e4d22d' AS trace_id, + ( + SELECT min(Start) + FROM default.otel_traces_trace_id_ts + WHERE TraceId = trace_id + ) AS trace_start, + ( + SELECT max(End) + 1 + FROM default.otel_traces_trace_id_ts + WHERE TraceId = trace_id + ) AS trace_end +SELECT + TraceId AS traceID, + SpanId AS spanID, + ParentSpanId AS parentSpanID, + ServiceName AS serviceName, + SpanName AS operationName, + Timestamp AS startTime, + Duration * 0.000001 AS duration, + arrayMap(key -> map('key', key, 'value', SpanAttributes[key]), mapKeys(SpanAttributes)) AS tags, + arrayMap(key -> map('key', key, 'value', ResourceAttributes[key]), mapKeys(ResourceAttributes)) AS serviceTags +FROM otel_traces +WHERE (traceID = trace_id) AND (startTime >= trace_start) AND (startTime <= trace_end) +LIMIT 1000 +``` + +ここでのCTEは、トレースID `ae9226c78d1d360601e6383928e4d22d` の最小および最大タイムスタンプを特定し、これを使用してメインの `otel_traces` テーブルの関連スパンをフィルタリングします。 + +この同じアプローチは、同様のアクセスパターンに適用できます。データモデリングで類似の例を探求しています。 + +## プロジェクションの使用 + +ClickHouse のプロジェクションにより、ユーザーはテーブルに対して複数の `ORDER BY` 句を指定できます。 + +前のセクションでは、マテリアライズドビューを使用して ClickHouse で集計を事前に計算し、行を変換し、異なるアクセスパターンに合わせた観測性のクエリを最適化する方法を探求しました。 + +マテリアライズドビューは、トレースIDによる検索を最適化するために、元のテーブルとは異なる順序キーを持つターゲットテーブルに行を送信する例を提供しました。 + +プロジェクションは、主キーの一部ではないカラムに対するクエリを最適化するために、同じ問題に対処するために使用できます。 + +理論的には、この能力はテーブルのために複数の順序キーを提供するために使用できますが、一つの明確な欠点があります:データの重複です。具体的には、データは各プロジェクションに対して指定された順序に加え、主な主キーの順序で書き込む必要があります。これにより、挿入が遅くなり、より多くのディスクスペースが消費されます。 + +> プロジェクションは、マテリアライズドビューと同様の多くの機能を提供しますが、後者が好まれることが多く、控えめに使用するべきです。ユーザーは欠点を理解し、いつ適切に使用するかを理解する必要があります。例えば、プロジェクションは集計を事前に計算するために使用できますが、ユーザーはこれにマテリアライズドビューを使用することをお勧めします。 + +NEEDS ALT + +
    + +以下のクエリを考慮します。このクエリは `otel_logs_v2` テーブルを 500 のエラーコードでフィルターします。これは、ユーザーがエラーコードでフィルタリングしたいと考えているため、ログに使用される一般的なアクセスパターンです: + +```sql +SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent +FROM otel_logs_v2 +WHERE Status = 500 +FORMAT `Null` + +Ok. + +0 rows in set. Elapsed: 0.177 sec. Processed 10.37 million rows, 685.32 MB (58.66 million rows/s., 3.88 GB/s.) +Peak memory usage: 56.54 MiB. +``` + +> この場合、`FORMAT Null` を使用して結果を印刷していません。これにより、すべての結果が読み取られますが返却されないため、LIMIT によるクエリの早期終了を防ぎます。これは、全ての1000万行をスキャンするのにかかった時間を示すためのものです。 + +上記のクエリは、選択した順序キー `(ServiceName, Timestamp)` に対して線形スキャンを必要とします。私たちは、上記のクエリのパフォーマンスを向上させるために、`Status` を順序キーの最後に追加することができますが、プロジェクションを追加することもできます。 + +```sql +ALTER TABLE otel_logs_v2 ( + ADD PROJECTION status + ( + SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent ORDER BY Status + ) +) + +ALTER TABLE otel_logs_v2 MATERIALIZE PROJECTION status +``` + +プロジェクションを最初に作成し、次にそれをマテリアライズする必要があります。この後のコマンドにより、データが異なる順序の2つの異なる形式でディスクに保存されます。データを作成するときにプロジェクションを定義することもできます。以下のように自動的に維持されます。 + +```sql +CREATE TABLE otel_logs_v2 +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + PROJECTION status + ( + SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent + ORDER BY Status + ) +) +ENGINE = MergeTree +ORDER BY (ServiceName, Timestamp) +``` + +重要なのは、`ALTER`を介してプロジェクションが作成された場合、その作成は非同期であり、`MATERIALIZE PROJECTION`コマンドが発行されます。この操作の進行状況は、次のクエリで確認でき、`is_done=1`を待つことができます。 + +```sql +SELECT parts_to_do, is_done, latest_fail_reason +FROM system.mutations +WHERE (`table` = 'otel_logs_v2') AND (command LIKE '%MATERIALIZE%') + +┌─parts_to_do─┬─is_done─┬─latest_fail_reason─┐ +│ 0 │ 1 │ │ +└─────────────┴─────────┴────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. +``` + +上記のクエリを繰り返すと、パフォーマンスが大幅に向上したことがわかりますが、追加のストレージがかかっています(ストレージサイズと圧縮の測定方法については「テーブルサイズと圧縮の測定」を参照してください)。 + +```sql +SELECT Timestamp, RequestPath, Status, RemoteAddress, UserAgent +FROM otel_logs_v2 +WHERE Status = 500 +FORMAT `Null` + +0 rows in set. Elapsed: 0.031 sec. Processed 51.42 thousand rows, 22.85 MB (1.65 million rows/s., 734.63 MB/s.) +Peak memory usage: 27.85 MiB. +``` + +上記の例では、以前のクエリで使用されるカラムをプロジェクションに指定しています。これにより、これらの指定されたカラムのみが、ステータスによって順序付けられてディスクに保存されます。逆に、ここで `SELECT *` を使用した場合、すべてのカラムが保存されます。これにより、(カラムの任意のサブセットを使用した)より多くのクエリがプロジェクションの恩恵を受けることができますが、追加のストレージが必要になります。ディスクスペースと圧縮を測定する方法については、「テーブルサイズと圧縮の測定」を参照してください。 + +## セカンダリ/データスキップインデックス + +ClickHouse で主キーがどれほどチューニングされていても、いくつかのクエリは必然的に全テーブルスキャンを必要とします。これは、マテリアライズドビュー(および一部のクエリ用のプロジェクション)を使用することで軽減できますが、これには追加のメンテナンスが必要であり、ユーザーがその利用可能性を把握している必要があります。従来のリレーショナルデータベースは、セカンダリインデックスを使用してこれを解決しますが、ClickHouse のような列指向データベースでは効果がありません。代わりに、ClickHouse は「スキップ」インデックスを使用しており、これにより、データベースは一致する値がない大きなデータチャンクをスキップすることができ、クエリのパフォーマンスを大幅に向上させることができます。 + +デフォルトのOTelスキーマは、マップアクセスへのアクセスを加速するためにセカンダリインデックスを使用しています。一般的に効果がないと考えており、カスタムスキーマにコピーすることはお勧めしませんが、スキップインデックスは依然として有用です。 + +ユーザーは、適用する前に[セカンダリインデックスに関するガイド](https://en/optimize/skipping-indexes)を読み理解する必要があります。 + +**一般に、主キーとターゲットとなる非主キーのカラム/式の間に強い相関関係が存在する場合、かつユーザーがまれな値、つまり多くのグラニュールで発生しない値を探している場合に効果的です。** + +## テキスト検索のためのブルームフィルター + +観測性のクエリにおいて、セカンダリインデックスはユーザーがテキスト検索を行う必要があるときに役立ちます。具体的には、ngram およびトークンベースのブルームフィルターインデックス [`ngrambf_v1`](https://en/optimize/skipping-indexes#bloom-filter-types) および [`tokenbf_v1`](https://en/optimize/skipping-indexes#bloom-filter-types) を使用して、`LIKE` 、`IN`、および hasToken 演算子を使用して文字列カラムに対する検索を加速できます。特に、トークンベースのインデックスは、非英数字を区切りとして使用してトークンを生成します。これは、クエリ時にトークン(全体の単語)のみが一致することを意味します。より細かい一致には、[N-gramブルームフィルター](https://en/optimize/skipping-indexes#bloom-filter-types)を使用できます。これにより、指定されたサイズのn-gramに文字列を分割し、部分語の一致が可能になります。 + +生成されるトークンを評価するため、したがって一致するトークンを評価するために、`tokens` 関数を使用できます: + +```sql +SELECT tokens('https://www.zanbil.ir/m/filter/b113') + +┌─tokens────────────────────────────────────────────┐ +│ ['https','www','zanbil','ir','m','filter','b113'] │ +└───────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. +``` + +`ngram` 関数も同様の機能を提供します。具体的には、n-gramサイズを第二のパラメータとして指定できます: + +```sql +SELECT ngrams('https://www.zanbil.ir/m/filter/b113', 3) + +┌─ngrams('https://www.zanbil.ir/m/filter/b113', 3)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ +│ ['htt','ttp','tps','ps:','s:/','://','//w','/ww','www','ww.','w.z','.za','zan','anb','nbi','bil','il.','l.i','.ir','ir/','r/m','/m/','m/f','/fi','fil','ilt','lte','ter','er/','r/b','/b1','b11','113'] │ +└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ + +1 row in set. Elapsed: 0.008 sec. +``` + +> ClickHouse には、セカンダリインデックスとしての逆インデックスのエクスペリメンタルサポートもあります。これは現在、ログデータセットには推奨されていませんが、製品版に準備が整った場合にトークンベースのブルームフィルターに取って代わることを期待しています。 + +例の目的のためには、構造化ログデータセットを使用します。たとえば、`Referer` カラムに `ultra` を含むログをカウントしたいとします。 + +```sql +SELECT count() +FROM otel_logs_v2 +WHERE Referer LIKE '%ultra%' + +┌─count()─┐ +│ 114514 │ +└─────────┘ + +1 row in set. Elapsed: 0.177 sec. Processed 10.37 million rows, 908.49 MB (58.57 million rows/s., 5.13 GB/s.) +``` + +ここでは、n-gramサイズを3で一致させる必要があります。したがって、`ngrambf_v1` インデックスを作成します。 + +```sql +CREATE TABLE otel_logs_bloom +( + `Body` String, + `Timestamp` DateTime, + `ServiceName` LowCardinality(String), + `Status` UInt16, + `RequestProtocol` LowCardinality(String), + `RunTime` UInt32, + `Size` UInt32, + `UserAgent` String, + `Referer` String, + `RemoteUser` String, + `RequestType` LowCardinality(String), + `RequestPath` String, + `RemoteAddress` IPv4, + `RefererDomain` String, + `RequestPage` String, + `SeverityText` LowCardinality(String), + `SeverityNumber` UInt8, + INDEX idx_span_attr_value Referer TYPE ngrambf_v1(3, 10000, 3, 7) GRANULARITY 1 +) +ENGINE = MergeTree +ORDER BY (Timestamp) +``` + +インデックス `ngrambf_v1(3, 10000, 3, 7)` は、ここで4つのパラメータを取ります。最後の7はシードを表します。その他は、n-gram サイズ (3)、値 `m` (フィルターサイズ)、およびハッシュ関数の数 `k` (7) を表します。 `k` と `m` は調整が必要であり、ユニークな n-gram / トークンの数と、フィルターが偽の負を返す確率に基づいています - すなわち、値がグラニュールに存在しないことを確認します。これらの値を特定するのに役立つ推奨[関数](https://en/engines/table-engines/mergetree-family/mergetree#bloom-filter)があります。 + +適切にチューニングされれば、ここでのスピードアップは顕著です: + +```sql +SELECT count() +FROM otel_logs_bloom +WHERE Referer LIKE '%ultra%' +┌─count()─┐ +│ 182 │ +└─────────┘ + +1 row in set. Elapsed: 0.077 sec. Processed 4.22 million rows, 375.29 MB (54.81 million rows/s., 4.87 GB/s.) +Peak memory usage: 129.60 KiB. +``` + +> 上記は例示的な目的のためです。ユーザーは、テキスト検索を最適化しようとするのではなく、挿入時にログから構造を抽出することをお勧めします。ただし、テキスト検索が役立つケースもあります。たとえば、スタックトレースや他の大きな文字列など、構造があまり決定的でない場合です。 + +ブルームフィルターを使用する際の一般的なガイドライン: + +ブルームの目的は[グラニュール](https://en/optimize/sparse-primary-indexes#clickhouse-index-design)をフィルタリングし、カラムのすべての値を読み込んで線形スキャンを回避することです。`EXPLAIN`句を使用し、`indexes=1`パラメータを指定することで、スキップされたグラニュールの数を特定できます。以下は、元のテーブル `otel_logs_v2` と、ngrambf を持つ `otel_logs_bloom` テーブルのレスポンスを示します。 + +```sql +EXPLAIN indexes = 1 +SELECT count() +FROM otel_logs_v2 +WHERE Referer LIKE '%ultra%' + +┌─explain────────────────────────────────────────────────────────────┐ +│ Expression ((Project names + Projection)) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ Filter ((WHERE + Change column names to column identifiers)) │ +│ ReadFromMergeTree (default.otel_logs_v2) │ +│ Indexes: │ +│ PrimaryKey │ +│ Condition: true │ +│ Parts: 9/9 │ +│ Granules: 1278/1278 │ +└────────────────────────────────────────────────────────────────────┘ + +10 rows in set. Elapsed: 0.016 sec. + + +EXPLAIN indexes = 1 +SELECT count() +FROM otel_logs_bloom +WHERE Referer LIKE '%ultra%' + +┌─explain────────────────────────────────────────────────────────────┐ +│ Expression ((Project names + Projection)) │ +│ Aggregating │ +│ Expression (Before GROUP BY) │ +│ Filter ((WHERE + Change column names to column identifiers)) │ +│ ReadFromMergeTree (default.otel_logs_bloom) │ +│ Indexes: │ +│ PrimaryKey │ +│ Condition: true │ +│ Parts: 8/8 │ +│ Granules: 1276/1276 │ +│ Skip │ +│ Name: idx_span_attr_value │ +│ Description: ngrambf_v1 GRANULARITY 1 │ +│ Parts: 8/8 │ +│ Granules: 517/1276 │ +└────────────────────────────────────────────────────────────────────┘ +``` + +ブルームフィルターは、通常、列自体よりも小さい場合にのみ高速化されます。大きければ、パフォーマンスの利点はほとんどないでしょう。以下のクエリを使用して、フィルターと列のサイズを比較してください: + +```sql +SELECT + name, + formatReadableSize(sum(data_compressed_bytes)) AS compressed_size, + formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size, + round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio +FROM system.columns +WHERE (`table` = 'otel_logs_bloom') AND (name = 'Referer') +GROUP BY name +ORDER BY sum(data_compressed_bytes) DESC + +┌─name────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐ +│ Referer │ 56.16 MiB │ 789.21 MiB │ 14.05 │ +└─────────┴─────────────────┴───────────────────┴───────┘ + +1 row in set. Elapsed: 0.018 sec. + + +SELECT + `table`, + formatReadableSize(data_compressed_bytes) AS compressed_size, + formatReadableSize(data_uncompressed_bytes) AS uncompressed_size +FROM system.data_skipping_indices +WHERE `table` = 'otel_logs_bloom' + +┌─table───────────┬─compressed_size─┬─uncompressed_size─┐ +│ otel_logs_bloom │ 12.03 MiB │ 12.17 MiB │ +└─────────────────┴─────────────────┴───────────────────┘ + +1 row in set. Elapsed: 0.004 sec. +``` + +上記の例では、セカンダリブルームフィルターインデックスが12MBで、列自体の圧縮サイズである56MBの約5倍小さいことがわかります。 + +ブルームフィルターは、重要なチューニングが必要です。最適な設定を特定するのに役立つメモを[こちらに](https://en/engines/table-engines/mergetree-family/mergetree#bloom-filter)従うことをお勧めします。ブルームフィルターは、挿入およびマージ時にも高価になる可能性があります。製品前にブルームフィルターを追加する前に、挿入パフォーマンスへの影響を評価する必要があります。 + +セカンダリスキップインデックスに関する詳細は[こちら](https://en/optimize/skipping-indexes#skip-index-functions)にあります。 + +## マップからの抽出 + +Map 型は OTel スキーマにおいて広く使用されています。このタイプのキーと値は同じ型である必要があります - これは Kubernetes ラベルなどのメタデータには十分です。ここで注意すべきは、Map 型のサブキーをクエリする際に、親カラム全体が読み込まれることです。Map に多くのキーがある場合、これは、キーがカラムとして存在する場合に読み取るよりも多くのデータがディスクから読み取られるため、クエリに重要なペナルティを課すことがあります。 + +特定のキーを頻繁にクエリする場合は、それをルートに専用のカラムに移動することを検討してください。これは通常、一般的なアクセスパターンへの反応として、デプロイ後に発生するタスクであり、製品前に予測することは難しいかもしれません。「スキーマの進化」を参照して、デプロイ後にスキーマを変更する方法を確認してください。 + +## テーブルサイズと圧縮の測定 + +ClickHouse が観測性のために使用される主な理由の一つは、圧縮です。 + +ストレージコストを大幅に削減するだけでなく、ディスク上のデータが少ないということは、I/O が少なくなり、クエリや挿入が速くなります。I/O の削減は、CPUの観点からいかなる圧縮アルゴリズムのオーバーヘッドに対しても、上回るべきです。したがって、データの圧縮を改善することが、ClickHouse のクエリが速いことを確保する際の最初の焦点であるべきです。 + +圧縮を測定する方法の詳細は[こちら](https://en/data-compression/compression-in-clickhouse)にあります。 diff --git a/docs/ja/whats-new/_category_.yml b/docs/ja/whats-new/_category_.yml new file mode 100644 index 00000000000..a609b9ffc11 --- /dev/null +++ b/docs/ja/whats-new/_category_.yml @@ -0,0 +1,7 @@ +position: 100 +label: "What's New" +collapsible: true +collapsed: true +link: + type: generated-index + title: "What's New" diff --git a/docs/ja/whats-new/changelog/2017.md b/docs/ja/whats-new/changelog/2017.md new file mode 100644 index 00000000000..57a84002b14 --- /dev/null +++ b/docs/ja/whats-new/changelog/2017.md @@ -0,0 +1,268 @@ +--- +slug: /ja/whats-new/changelog/2017 +sidebar_position: 17 +sidebar_label: '2017' +title: 2017 Changelog +--- + +### ClickHouse Release 1.1.54327, 2017-12-21 {#clickhouse-release-1-1-54327-2017-12-21} + +This release contains bug fixes for the previous release 1.1.54318: + +- Fixed bug with possible race condition in replication that could lead to data loss. This issue affects versions 1.1.54310 and 1.1.54318. If you use one of these versions with Replicated tables, the update is strongly recommended. This issue shows in logs in Warning messages like `Part ... from own log does not exist.` The issue is relevant even if you do not see these messages in logs. + +### ClickHouse Release 1.1.54318, 2017-11-30 {#clickhouse-release-1-1-54318-2017-11-30} + +This release contains bug fixes for the previous release 1.1.54310: + +- Fixed incorrect row deletions during merges in the SummingMergeTree engine +- Fixed a memory leak in unreplicated MergeTree engines +- Fixed performance degradation with frequent inserts in MergeTree engines +- Fixed an issue that was causing the replication queue to stop running +- Fixed rotation and archiving of server logs + +### ClickHouse Release 1.1.54310, 2017-11-01 {#clickhouse-release-1-1-54310-2017-11-01} + +#### New Features: {#new-features} + +- Custom partitioning key for the MergeTree family of table engines. +- [Kafka](https://clickhouse.com/docs/ja/operations/table_engines/kafka/) table engine. +- Added support for loading [CatBoost](https://yandex.com/dev/catboost/) models and applying them to data stored in ClickHouse. +- Added support for time zones with non-integer offsets from UTC. +- Added support for arithmetic operations with time intervals. +- The range of values for the Date and DateTime types is extended to the year 2105. +- Added the `CREATE MATERIALIZED VIEW x TO y` query (specifies an existing table for storing the data of a materialized view). +- Added the `ATTACH TABLE` query without arguments. +- The processing logic for Nested columns with names ending in -Map in a SummingMergeTree table was extracted to the sumMap aggregate function. You can now specify such columns explicitly. +- Max size of the IP trie dictionary is increased to 128M entries. +- Added the getSizeOfEnumType function. +- Added the sumWithOverflow aggregate function. +- Added support for the Cap’n Proto input format. +- You can now customize compression level when using the zstd algorithm. + +#### Backward Incompatible Changes: {#backward-incompatible-changes} + +- Creation of temporary tables with an engine other than Memory is not allowed. +- Explicit creation of tables with the View or MaterializedView engine is not allowed. +- During table creation, a new check verifies that the sampling key expression is included in the primary key. + +#### Bug Fixes: {#bug-fixes} + +- Fixed hangups when synchronously inserting into a Distributed table. +- Fixed nonatomic adding and removing of parts in Replicated tables. +- Data inserted into a materialized view is not subjected to unnecessary deduplication. +- Executing a query to a Distributed table for which the local replica is lagging and remote replicas are unavailable does not result in an error anymore. +- Users do not need access permissions to the `default` database to create temporary tables anymore. +- Fixed crashing when specifying the Array type without arguments. +- Fixed hangups when the disk volume containing server logs is full. +- Fixed an overflow in the toRelativeWeekNum function for the first week of the Unix epoch. + +#### Build Improvements: {#build-improvements} + +- Several third-party libraries (notably Poco) were updated and converted to git submodules. + +### ClickHouse Release 1.1.54304, 2017-10-19 {#clickhouse-release-1-1-54304-2017-10-19} + +#### New Features: {#new-features-1} + +- TLS support in the native protocol (to enable, set `tcp_ssl_port` in `config.xml` ). + +#### Bug Fixes: {#bug-fixes-1} + +- `ALTER` for replicated tables now tries to start running as soon as possible. +- Fixed crashing when reading data with the setting `preferred_block_size_bytes=0.` +- Fixed crashes of `clickhouse-client` when pressing `Page Down` +- Correct interpretation of certain complex queries with `GLOBAL IN` and `UNION ALL` +- `FREEZE PARTITION` always works atomically now. +- Empty POST requests now return a response with code 411. +- Fixed interpretation errors for expressions like `CAST(1 AS Nullable(UInt8)).` +- Fixed an error when reading `Array(Nullable(String))` columns from `MergeTree` tables. +- Fixed crashing when parsing queries like `SELECT dummy AS dummy, dummy AS b` +- Users are updated correctly with invalid `users.xml` +- Correct handling when an executable dictionary returns a non-zero response code. + +### ClickHouse Release 1.1.54292, 2017-09-20 {#clickhouse-release-1-1-54292-2017-09-20} + +#### New Features: {#new-features-2} + +- Added the `pointInPolygon` function for working with coordinates on a coordinate plane. +- Added the `sumMap` aggregate function for calculating the sum of arrays, similar to `SummingMergeTree`. +- Added the `trunc` function. Improved performance of the rounding functions (`round`, `floor`, `ceil`, `roundToExp2`) and corrected the logic of how they work. Changed the logic of the `roundToExp2` function for fractions and negative numbers. +- The ClickHouse executable file is now less dependent on the libc version. The same ClickHouse executable file can run on a wide variety of Linux systems. There is still a dependency when using compiled queries (with the setting `compile = 1` , which is not used by default). +- Reduced the time needed for dynamic compilation of queries. + +#### Bug Fixes: {#bug-fixes-2} + +- Fixed an error that sometimes produced `part ... intersects previous part` messages and weakened replica consistency. +- Fixed an error that caused the server to lock up if ZooKeeper was unavailable during shutdown. +- Removed excessive logging when restoring replicas. +- Fixed an error in the UNION ALL implementation. +- Fixed an error in the concat function that occurred if the first column in a block has the Array type. +- Progress is now displayed correctly in the system.merges table. + +### ClickHouse Release 1.1.54289, 2017-09-13 {#clickhouse-release-1-1-54289-2017-09-13} + +#### New Features: {#new-features-3} + +- `SYSTEM` queries for server administration: `SYSTEM RELOAD DICTIONARY`, `SYSTEM RELOAD DICTIONARIES`, `SYSTEM DROP DNS CACHE`, `SYSTEM SHUTDOWN`, `SYSTEM KILL`. +- Added functions for working with arrays: `concat`, `arraySlice`, `arrayPushBack`, `arrayPushFront`, `arrayPopBack`, `arrayPopFront`. +- Added `root` and `identity` parameters for the ZooKeeper configuration. This allows you to isolate individual users on the same ZooKeeper cluster. +- Added aggregate functions `groupBitAnd`, `groupBitOr`, and `groupBitXor` (for compatibility, they are also available under the names `BIT_AND`, `BIT_OR`, and `BIT_XOR`). +- External dictionaries can be loaded from MySQL by specifying a socket in the filesystem. +- External dictionaries can be loaded from MySQL over SSL (`ssl_cert`, `ssl_key`, `ssl_ca` parameters). +- Added the `max_network_bandwidth_for_user` setting to restrict the overall bandwidth use for queries per user. +- Support for `DROP TABLE` for temporary tables. +- Support for reading `DateTime` values in Unix timestamp format from the `CSV` and `JSONEachRow` formats. +- Lagging replicas in distributed queries are now excluded by default (the default threshold is 5 minutes). +- FIFO locking is used during ALTER: an ALTER query isn’t blocked indefinitely for continuously running queries. +- Option to set `umask` in the config file. +- Improved performance for queries with `DISTINCT` . + +#### Bug Fixes: {#bug-fixes-3} + +- Improved the process for deleting old nodes in ZooKeeper. Previously, old nodes sometimes didn’t get deleted if there were very frequent inserts, which caused the server to be slow to shut down, among other things. +- Fixed randomization when choosing hosts for the connection to ZooKeeper. +- Fixed the exclusion of lagging replicas in distributed queries if the replica is localhost. +- Fixed an error where a data part in a `ReplicatedMergeTree` table could be broken after running `ALTER MODIFY` on an element in a `Nested` structure. +- Fixed an error that could cause SELECT queries to “hang”. +- Improvements to distributed DDL queries. +- Fixed the query `CREATE TABLE ... AS `. +- Resolved the deadlock in the `ALTER ... CLEAR COLUMN IN PARTITION` query for `Buffer` tables. +- Fixed the invalid default value for `Enum` s (0 instead of the minimum) when using the `JSONEachRow` and `TSKV` formats. +- Resolved the appearance of zombie processes when using a dictionary with an `executable` source. +- Fixed segfault for the HEAD query. + +#### Improved Workflow for Developing and Assembling ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse} + +- You can use `pbuilder` to build ClickHouse. +- You can use `libc++` instead of `libstdc++` for builds on Linux. +- Added instructions for using static code analysis tools: `Coverage`, `clang-tidy`, `cppcheck`. + +#### Please Note When Upgrading: {#please-note-when-upgrading} + +- There is now a higher default value for the MergeTree setting `max_bytes_to_merge_at_max_space_in_pool` (the maximum total size of data parts to merge, in bytes): it has increased from 100 GiB to 150 GiB. This might result in large merges running after the server upgrade, which could cause an increased load on the disk subsystem. If the free space available on the server is less than twice the total amount of the merges that are running, this will cause all other merges to stop running, including merges of small data parts. As a result, INSERT queries will fail with the message “Merges are processing significantly slower than inserts.” Use the `SELECT * FROM system.merges` query to monitor the situation. You can also check the `DiskSpaceReservedForMerge` metric in the `system.metrics` table, or in Graphite. You do not need to do anything to fix this, since the issue will resolve itself once the large merges finish. If you find this unacceptable, you can restore the previous value for the `max_bytes_to_merge_at_max_space_in_pool` setting. To do this, go to the `` section in config.xml, set ``` ``107374182400 ``` and restart the server. + +### ClickHouse Release 1.1.54284, 2017-08-29 {#clickhouse-release-1-1-54284-2017-08-29} + +- This is a bugfix release for the previous 1.1.54282 release. It fixes leaks in the parts directory in ZooKeeper. + +### ClickHouse Release 1.1.54282, 2017-08-23 {#clickhouse-release-1-1-54282-2017-08-23} + +This release contains bug fixes for the previous release 1.1.54276: + +- Fixed `DB::Exception: Assertion violation: !_path.empty()` when inserting into a Distributed table. +- Fixed parsing when inserting in RowBinary format if input data starts with’;’. +- Errors during runtime compilation of certain aggregate functions (e.g. `groupArray()`). + +### ClickHouse Release 1.1.54276, 2017-08-16 {#clickhouse-release-1-1-54276-2017-08-16} + +#### New Features: {#new-features-4} + +- Added an optional WITH section for a SELECT query. Example query: `WITH 1+1 AS a SELECT a, a*a` +- INSERT can be performed synchronously in a Distributed table: OK is returned only after all the data is saved on all the shards. This is activated by the setting insert_distributed_sync=1. +- Added the UUID data type for working with 16-byte identifiers. +- Added aliases of CHAR, FLOAT and other types for compatibility with the Tableau. +- Added the functions toYYYYMM, toYYYYMMDD, and toYYYYMMDDhhmmss for converting time into numbers. +- You can use IP addresses (together with the hostname) to identify servers for clustered DDL queries. +- Added support for non-constant arguments and negative offsets in the function `substring(str, pos, len).` +- Added the max_size parameter for the `groupArray(max_size)(column)` aggregate function, and optimized its performance. + +#### Main Changes: {#main-changes} + +- Security improvements: all server files are created with 0640 permissions (can be changed via `` config parameter). +- Improved error messages for queries with invalid syntax. +- Significantly reduced memory consumption and improved performance when merging large sections of MergeTree data. +- Significantly increased the performance of data merges for the ReplacingMergeTree engine. +- Improved performance for asynchronous inserts from a Distributed table by combining multiple source inserts. To enable this functionality, use the setting distributed_directory_monitor_batch_inserts=1. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-1} + +- Changed the binary format of aggregate states of `groupArray(array_column)` functions for arrays. + +#### Complete List of Changes: {#complete-list-of-changes} + +- Added the `output_format_json_quote_denormals` setting, which enables outputting nan and inf values in JSON format. +- Optimized stream allocation when reading from a Distributed table. +- Settings can be configured in readonly mode if the value does not change. +- Added the ability to retrieve non-integer granules of the MergeTree engine in order to meet restrictions on the block size specified in the preferred_block_size_bytes setting. The purpose is to reduce the consumption of RAM and increase cache locality when processing queries from tables with large columns. +- Efficient use of indexes that contain expressions like `toStartOfHour(x)` for conditions like `toStartOfHour(x) op сonstexpr.` +- Added new settings for MergeTree engines (the merge_tree section in config.xml): + - replicated_deduplication_window_seconds sets the number of seconds allowed for deduplicating inserts in Replicated tables. + - cleanup_delay_period sets how often to start cleanup to remove outdated data. + - replicated_can_become_leader can prevent a replica from becoming the leader (and assigning merges). +- Accelerated cleanup to remove outdated data from ZooKeeper. +- Multiple improvements and fixes for clustered DDL queries. Of particular interest is the new setting distributed_ddl_task_timeout, which limits the time to wait for a response from the servers in the cluster. If a ddl request has not been performed on all hosts, a response will contain a timeout error and a request will be executed in an async mode. +- Improved display of stack traces in the server logs. +- Added the “none” value for the compression method. +- You can use multiple dictionaries_config sections in config.xml. +- It is possible to connect to MySQL through a socket in the file system. +- The system.parts table has a new column with information about the size of marks, in bytes. + +#### Bug Fixes: {#bug-fixes-4} + +- Distributed tables using a Merge table now work correctly for a SELECT query with a condition on the `_table` field. +- Fixed a rare race condition in ReplicatedMergeTree when checking data parts. +- Fixed possible freezing on “leader election” when starting a server. +- The max_replica_delay_for_distributed_queries setting was ignored when using a local replica of the data source. This has been fixed. +- Fixed incorrect behavior of `ALTER TABLE CLEAR COLUMN IN PARTITION` when attempting to clean a non-existing column. +- Fixed an exception in the multiIf function when using empty arrays or strings. +- Fixed excessive memory allocations when deserializing Native format. +- Fixed incorrect auto-update of Trie dictionaries. +- Fixed an exception when running queries with a GROUP BY clause from a Merge table when using SAMPLE. +- Fixed a crash of GROUP BY when using distributed_aggregation_memory_efficient=1. +- Now you can specify the database.table in the right side of IN and JOIN. +- Too many threads were used for parallel aggregation. This has been fixed. +- Fixed how the “if” function works with FixedString arguments. +- SELECT worked incorrectly from a Distributed table for shards with a weight of 0. This has been fixed. +- Running `CREATE VIEW IF EXISTS no longer causes crashes.` +- Fixed incorrect behavior when input_format_skip_unknown_fields=1 is set and there are negative numbers. +- Fixed an infinite loop in the `dictGetHierarchy()` function if there is some invalid data in the dictionary. +- Fixed `Syntax error: unexpected (...)` errors when running distributed queries with subqueries in an IN or JOIN clause and Merge tables. +- Fixed an incorrect interpretation of a SELECT query from Dictionary tables. +- Fixed the “Cannot mremap” error when using arrays in IN and JOIN clauses with more than 2 billion elements. +- Fixed the failover for dictionaries with MySQL as the source. + +#### Improved Workflow for Developing and Assembling ClickHouse: {#improved-workflow-for-developing-and-assembling-clickhouse-1} + +- Builds can be assembled in Arcadia. +- You can use gcc 7 to compile ClickHouse. +- Parallel builds using ccache+distcc are faster now. + +### ClickHouse Release 1.1.54245, 2017-07-04 {#clickhouse-release-1-1-54245-2017-07-04} + +#### New Features: {#new-features-5} + +- Distributed DDL (for example, `CREATE TABLE ON CLUSTER`) +- The replicated query `ALTER TABLE CLEAR COLUMN IN PARTITION.` +- The engine for Dictionary tables (access to dictionary data in the form of a table). +- Dictionary database engine (this type of database automatically has Dictionary tables available for all the connected external dictionaries). +- You can check for updates to the dictionary by sending a request to the source. +- Qualified column names +- Quoting identifiers using double quotation marks. +- Sessions in the HTTP interface. +- The OPTIMIZE query for a Replicated table can can run not only on the leader. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-2} + +- Removed SET GLOBAL. + +#### Minor Changes: {#minor-changes} + +- Now after an alert is triggered, the log prints the full stack trace. +- Relaxed the verification of the number of damaged/extra data parts at startup (there were too many false positives). + +#### Bug Fixes: {#bug-fixes-5} + +- Fixed a bad connection “sticking” when inserting into a Distributed table. +- GLOBAL IN now works for a query from a Merge table that looks at a Distributed table. +- The incorrect number of cores was detected on a Google Compute Engine virtual machine. This has been fixed. +- Changes in how an executable source of cached external dictionaries works. +- Fixed the comparison of strings containing null characters. +- Fixed the comparison of Float32 primary key fields with constants. +- Previously, an incorrect estimate of the size of a field could lead to overly large allocations. +- Fixed a crash when querying a Nullable column added to a table using ALTER. +- Fixed a crash when sorting by a Nullable column, if the number of rows is less than LIMIT. +- Fixed an ORDER BY subquery consisting of only constant values. +- Previously, a Replicated table could remain in the invalid state after a failed DROP TABLE. +- Aliases for scalar subqueries with empty results are no longer lost. +- Now a query that used compilation does not fail with an error if the .so file gets damaged. diff --git a/docs/ja/whats-new/changelog/2018.md b/docs/ja/whats-new/changelog/2018.md new file mode 100644 index 00000000000..0761e4a1e4f --- /dev/null +++ b/docs/ja/whats-new/changelog/2018.md @@ -0,0 +1,1063 @@ +--- +slug: /ja/whats-new/changelog/2018 +sidebar_position: 16 +sidebar_label: '2018' +title: 2018 Changelog +--- + +## ClickHouse Release 18.16 {#clickhouse-release-18-16} + +### ClickHouse Release 18.16.1, 2018-12-21 {#clickhouse-release-18-16-1-2018-12-21} + +#### Bug Fixes: {#bug-fixes} + +- Fixed an error that led to problems with updating dictionaries with the ODBC source. [#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- JIT compilation of aggregate functions now works with LowCardinality columns. [#3838](https://github.com/ClickHouse/ClickHouse/issues/3838) + +#### Improvements: {#improvements} + +- Added the `low_cardinality_allow_in_native_format` setting (enabled by default). When disabled, LowCardinality columns will be converted to ordinary columns for SELECT queries and ordinary columns will be expected for INSERT queries. [#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) + +#### Build Improvements: {#build-improvements} + +- Fixes for builds on macOS and ARM. + +### ClickHouse Release 18.16.0, 2018-12-14 {#clickhouse-release-18-16-0-2018-12-14} + +#### New Features: {#new-features} + +- `DEFAULT` expressions are evaluated for missing fields when loading data in semi-structured input formats (`JSONEachRow`, `TSKV`). The feature is enabled with the `insert_sample_with_metadata` setting. [#3555](https://github.com/ClickHouse/ClickHouse/pull/3555) +- The `ALTER TABLE` query now has the `MODIFY ORDER BY` action for changing the sorting key when adding or removing a table column. This is useful for tables in the `MergeTree` family that perform additional tasks when merging based on this sorting key, such as `SummingMergeTree`, `AggregatingMergeTree`, and so on. [#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) [#3755](https://github.com/ClickHouse/ClickHouse/pull/3755) +- For tables in the `MergeTree` family, now you can specify a different sorting key (`ORDER BY`) and index (`PRIMARY KEY`). The sorting key can be longer than the index. [#3581](https://github.com/ClickHouse/ClickHouse/pull/3581) +- Added the `hdfs` table function and the `HDFS` table engine for importing and exporting data to HDFS. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/3617) +- Added functions for working with base64: `base64Encode`, `base64Decode`, `tryBase64Decode`. [Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3350) +- Now you can use a parameter to configure the precision of the `uniqCombined` aggregate function (select the number of HyperLogLog cells). [#3406](https://github.com/ClickHouse/ClickHouse/pull/3406) +- Added the `system.contributors` table that contains the names of everyone who made commits in ClickHouse. [#3452](https://github.com/ClickHouse/ClickHouse/pull/3452) +- Added the ability to omit the partition for the `ALTER TABLE ... FREEZE` query in order to back up all partitions at once. [#3514](https://github.com/ClickHouse/ClickHouse/pull/3514) +- Added `dictGet` and `dictGetOrDefault` functions that do not require specifying the type of return value. The type is determined automatically from the dictionary description. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3564) +- Now you can specify comments for a column in the table description and change it using `ALTER`. [#3377](https://github.com/ClickHouse/ClickHouse/pull/3377) +- Reading is supported for `Join` type tables with simple keys. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Now you can specify the options `join_use_nulls`, `max_rows_in_join`, `max_bytes_in_join`, and `join_overflow_mode` when creating a `Join` type table. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Added the `joinGet` function that allows you to use a `Join` type table like a dictionary. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3728) +- Added the `partition_key`, `sorting_key`, `primary_key`, and `sampling_key` columns to the `system.tables` table in order to provide information about table keys. [#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Added the `is_in_partition_key`, `is_in_sorting_key`, `is_in_primary_key`, and `is_in_sampling_key` columns to the `system.columns` table. [#3609](https://github.com/ClickHouse/ClickHouse/pull/3609) +- Added the `min_time` and `max_time` columns to the `system.parts` table. These columns are populated when the partitioning key is an expression consisting of `DateTime` columns. [Emmanuel Donin de Rosière](https://github.com/ClickHouse/ClickHouse/pull/3800) + +#### Bug Fixes: {#bug-fixes-1} + +- Fixes and performance improvements for the `LowCardinality` data type. `GROUP BY` using `LowCardinality(Nullable(...))`. Getting the values of `extremes`. Processing high-order functions. `LEFT ARRAY JOIN`. Distributed `GROUP BY`. Functions that return `Array`. Execution of `ORDER BY`. Writing to `Distributed` tables (nicelulu). Backward compatibility for `INSERT` queries from old clients that implement the `Native` protocol. Support for `LowCardinality` for `JOIN`. Improved performance when working in a single stream. [#3823](https://github.com/ClickHouse/ClickHouse/pull/3823) [#3803](https://github.com/ClickHouse/ClickHouse/pull/3803) [#3799](https://github.com/ClickHouse/ClickHouse/pull/3799) [#3769](https://github.com/ClickHouse/ClickHouse/pull/3769) [#3744](https://github.com/ClickHouse/ClickHouse/pull/3744) [#3681](https://github.com/ClickHouse/ClickHouse/pull/3681) [#3651](https://github.com/ClickHouse/ClickHouse/pull/3651) [#3649](https://github.com/ClickHouse/ClickHouse/pull/3649) [#3641](https://github.com/ClickHouse/ClickHouse/pull/3641) [#3632](https://github.com/ClickHouse/ClickHouse/pull/3632) [#3568](https://github.com/ClickHouse/ClickHouse/pull/3568) [#3523](https://github.com/ClickHouse/ClickHouse/pull/3523) [#3518](https://github.com/ClickHouse/ClickHouse/pull/3518) +- Fixed how the `select_sequential_consistency` option works. Previously, when this setting was enabled, an incomplete result was sometimes returned after beginning to write to a new partition. [#2863](https://github.com/ClickHouse/ClickHouse/pull/2863) +- Databases are correctly specified when executing DDL `ON CLUSTER` queries and `ALTER UPDATE/DELETE`. [#3772](https://github.com/ClickHouse/ClickHouse/pull/3772) [#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Databases are correctly specified for subqueries inside a VIEW. [#3521](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Fixed a bug in `PREWHERE` with `FINAL` for `VersionedCollapsingMergeTree`. [7167bfd7](https://github.com/ClickHouse/ClickHouse/commit/7167bfd7b365538f7a91c4307ad77e552ab4e8c1) +- Now you can use `KILL QUERY` to cancel queries that have not started yet because they are waiting for the table to be locked. [#3517](https://github.com/ClickHouse/ClickHouse/pull/3517) +- Corrected date and time calculations if the clocks were moved back at midnight (this happens in Iran, and happened in Moscow from 1981 to 1983). Previously, this led to the time being reset a day earlier than necessary, and also caused incorrect formatting of the date and time in text format. [#3819](https://github.com/ClickHouse/ClickHouse/pull/3819) +- Fixed bugs in some cases of `VIEW` and subqueries that omit the database. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3521) +- Fixed a race condition when simultaneously reading from a `MATERIALIZED VIEW` and deleting a `MATERIALIZED VIEW` due to not locking the internal `MATERIALIZED VIEW`. [#3404](https://github.com/ClickHouse/ClickHouse/pull/3404) [#3694](https://github.com/ClickHouse/ClickHouse/pull/3694) +- Fixed the error `Lock handler cannot be nullptr.` [#3689](https://github.com/ClickHouse/ClickHouse/pull/3689) +- Fixed query processing when the `compile_expressions` option is enabled (it’s enabled by default). Nondeterministic constant expressions like the `now` function are no longer unfolded. [#3457](https://github.com/ClickHouse/ClickHouse/pull/3457) +- Fixed a crash when specifying a non-constant scale argument in `toDecimal32/64/128` functions. +- Fixed an error when trying to insert an array with `NULL` elements in the `Values` format into a column of type `Array` without `Nullable` (if `input_format_values_interpret_expressions` = 1). [#3487](https://github.com/ClickHouse/ClickHouse/pull/3487) [#3503](https://github.com/ClickHouse/ClickHouse/pull/3503) +- Fixed continuous error logging in `DDLWorker` if ZooKeeper is not available. [8f50c620](https://github.com/ClickHouse/ClickHouse/commit/8f50c620334988b28018213ec0092fe6423847e2) +- Fixed the return type for `quantile*` functions from `Date` and `DateTime` types of arguments. [#3580](https://github.com/ClickHouse/ClickHouse/pull/3580) +- Fixed the `WITH` clause if it specifies a simple alias without expressions. [#3570](https://github.com/ClickHouse/ClickHouse/pull/3570) +- Fixed processing of queries with named sub-queries and qualified column names when `enable_optimize_predicate_expression` is enabled. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3588) +- Fixed the error `Attempt to attach to nullptr thread group` when working with materialized views. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3623) +- Fixed a crash when passing certain incorrect arguments to the `arrayReverse` function. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Fixed the buffer overflow in the `extractURLParameter` function. Improved performance. Added correct processing of strings containing zero bytes. [141e9799](https://github.com/ClickHouse/ClickHouse/commit/141e9799e49201d84ea8e951d1bed4fb6d3dacb5) +- Fixed buffer overflow in the `lowerUTF8` and `upperUTF8` functions. Removed the ability to execute these functions over `FixedString` type arguments. [#3662](https://github.com/ClickHouse/ClickHouse/pull/3662) +- Fixed a rare race condition when deleting `MergeTree` tables. [#3680](https://github.com/ClickHouse/ClickHouse/pull/3680) +- Fixed a race condition when reading from `Buffer` tables and simultaneously performing `ALTER` or `DROP` on the target tables. [#3719](https://github.com/ClickHouse/ClickHouse/pull/3719) +- Fixed a segfault if the `max_temporary_non_const_columns` limit was exceeded. [#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Improvements: {#improvements-1} + +- The server does not write the processed configuration files to the `/etc/clickhouse-server/` directory. Instead, it saves them in the `preprocessed_configs` directory inside `path`. This means that the `/etc/clickhouse-server/` directory does not have write access for the `clickhouse` user, which improves security. [#2443](https://github.com/ClickHouse/ClickHouse/pull/2443) +- The `min_merge_bytes_to_use_direct_io` option is set to 10 GiB by default. A merge that forms large parts of tables from the MergeTree family will be performed in `O_DIRECT` mode, which prevents excessive page cache eviction. [#3504](https://github.com/ClickHouse/ClickHouse/pull/3504) +- Accelerated server start when there is a very large number of tables. [#3398](https://github.com/ClickHouse/ClickHouse/pull/3398) +- Added a connection pool and HTTP `Keep-Alive` for connections between replicas. [#3594](https://github.com/ClickHouse/ClickHouse/pull/3594) +- If the query syntax is invalid, the `400 Bad Request` code is returned in the `HTTP` interface (500 was returned previously). [31bc680a](https://github.com/ClickHouse/ClickHouse/commit/31bc680ac5f4bb1d0360a8ba4696fa84bb47d6ab) +- The `join_default_strictness` option is set to `ALL` by default for compatibility. [120e2cbe](https://github.com/ClickHouse/ClickHouse/commit/120e2cbe2ff4fbad626c28042d9b28781c805afe) +- Removed logging to `stderr` from the `re2` library for invalid or complex regular expressions. [#3723](https://github.com/ClickHouse/ClickHouse/pull/3723) +- Added for the `Kafka` table engine: checks for subscriptions before beginning to read from Kafka; the kafka_max_block_size setting for the table. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3396) +- The `cityHash64`, `farmHash64`, `metroHash64`, `sipHash64`, `halfMD5`, `murmurHash2_32`, `murmurHash2_64`, `murmurHash3_32`, and `murmurHash3_64` functions now work for any number of arguments and for arguments in the form of tuples. [#3451](https://github.com/ClickHouse/ClickHouse/pull/3451) [#3519](https://github.com/ClickHouse/ClickHouse/pull/3519) +- The `arrayReverse` function now works with any types of arrays. [73e3a7b6](https://github.com/ClickHouse/ClickHouse/commit/73e3a7b662161d6005e7727d8a711b930386b871) +- Added an optional parameter: the slot size for the `timeSlots` function. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3724) +- For `FULL` and `RIGHT JOIN`, the `max_block_size` setting is used for a stream of non-joined data from the right table. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3699) +- Added the `--secure` command line parameter in `clickhouse-benchmark` and `clickhouse-performance-test` to enable TLS. [#3688](https://github.com/ClickHouse/ClickHouse/pull/3688) [#3690](https://github.com/ClickHouse/ClickHouse/pull/3690) +- Type conversion when the structure of a `Buffer` type table does not match the structure of the destination table. [Vitaly Baranov](https://github.com/ClickHouse/ClickHouse/pull/3603) +- Added the `tcp_keep_alive_timeout` option to enable keep-alive packets after inactivity for the specified time interval. [#3441](https://github.com/ClickHouse/ClickHouse/pull/3441) +- Removed unnecessary quoting of values for the partition key in the `system.parts` table if it consists of a single column. [#3652](https://github.com/ClickHouse/ClickHouse/pull/3652) +- The modulo function works for `Date` and `DateTime` data types. [#3385](https://github.com/ClickHouse/ClickHouse/pull/3385) +- Added synonyms for the `POWER`, `LN`, `LCASE`, `UCASE`, `REPLACE`, `LOCATE`, `SUBSTR`, and `MID` functions. [#3774](https://github.com/ClickHouse/ClickHouse/pull/3774) [#3763](https://github.com/ClickHouse/ClickHouse/pull/3763) Some function names are case-insensitive for compatibility with the SQL standard. Added syntactic sugar `SUBSTRING(expr FROM start FOR length)` for compatibility with SQL. [#3804](https://github.com/ClickHouse/ClickHouse/pull/3804) +- Added the ability to `mlock` memory pages corresponding to `clickhouse-server` executable code to prevent it from being forced out of memory. This feature is disabled by default. [#3553](https://github.com/ClickHouse/ClickHouse/pull/3553) +- Improved performance when reading from `O_DIRECT` (with the `min_bytes_to_use_direct_io` option enabled). [#3405](https://github.com/ClickHouse/ClickHouse/pull/3405) +- Improved performance of the `dictGet...OrDefault` function for a constant key argument and a non-constant default argument. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3563) +- The `firstSignificantSubdomain` function now processes the domains `gov`, `mil`, and `edu`. [Igor Hatarist](https://github.com/ClickHouse/ClickHouse/pull/3601) Improved performance. [#3628](https://github.com/ClickHouse/ClickHouse/pull/3628) +- Ability to specify custom environment variables for starting `clickhouse-server` using the `SYS-V init.d` script by defining `CLICKHOUSE_PROGRAM_ENV` in `/etc/default/clickhouse`. + [Pavlo Bashynskyi](https://github.com/ClickHouse/ClickHouse/pull/3612) +- Correct return code for the clickhouse-server init script. [#3516](https://github.com/ClickHouse/ClickHouse/pull/3516) +- The `system.metrics` table now has the `VersionInteger` metric, and `system.build_options` has the added line `VERSION_INTEGER`, which contains the numeric form of the ClickHouse version, such as `18016000`. [#3644](https://github.com/ClickHouse/ClickHouse/pull/3644) +- Removed the ability to compare the `Date` type with a number to avoid potential errors like `date = 2018-12-17`, where quotes around the date are omitted by mistake. [#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) +- Fixed the behavior of stateful functions like `rowNumberInAllBlocks`. They previously output a result that was one number larger due to starting during query analysis. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3729) +- If the `force_restore_data` file can’t be deleted, an error message is displayed. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3794) + +#### Build Improvements: {#build-improvements-1} + +- Updated the `jemalloc` library, which fixes a potential memory leak. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3557) +- Profiling with `jemalloc` is enabled by default in order to debug builds. [2cc82f5c](https://github.com/ClickHouse/ClickHouse/commit/2cc82f5cbe266421cd4c1165286c2c47e5ffcb15) +- Added the ability to run integration tests when only `Docker` is installed on the system. [#3650](https://github.com/ClickHouse/ClickHouse/pull/3650) +- Added the fuzz expression test in SELECT queries. [#3442](https://github.com/ClickHouse/ClickHouse/pull/3442) +- Added a stress test for commits, which performs functional tests in parallel and in random order to detect more race conditions. [#3438](https://github.com/ClickHouse/ClickHouse/pull/3438) +- Improved the method for starting clickhouse-server in a Docker image. [Elghazal Ahmed](https://github.com/ClickHouse/ClickHouse/pull/3663) +- For a Docker image, added support for initializing databases using files in the `/docker-entrypoint-initdb.d` directory. [Konstantin Lebedev](https://github.com/ClickHouse/ClickHouse/pull/3695) +- Fixes for builds on ARM. [#3709](https://github.com/ClickHouse/ClickHouse/pull/3709) + +#### Backward Incompatible Changes: {#backward-incompatible-changes} + +- Removed the ability to compare the `Date` type with a number. Instead of `toDate('2018-12-18') = 17883`, you must use explicit type conversion `= toDate(17883)` [#3687](https://github.com/ClickHouse/ClickHouse/pull/3687) + +## ClickHouse Release 18.14 {#clickhouse-release-18-14} + +### ClickHouse Release 18.14.19, 2018-12-19 {#clickhouse-release-18-14-19-2018-12-19} + +#### Bug Fixes: {#bug-fixes-2} + +- Fixed an error that led to problems with updating dictionaries with the ODBC source. [#3825](https://github.com/ClickHouse/ClickHouse/issues/3825), [#3829](https://github.com/ClickHouse/ClickHouse/issues/3829) +- Databases are correctly specified when executing DDL `ON CLUSTER` queries. [#3460](https://github.com/ClickHouse/ClickHouse/pull/3460) +- Fixed a segfault if the `max_temporary_non_const_columns` limit was exceeded. [#3788](https://github.com/ClickHouse/ClickHouse/pull/3788) + +#### Build Improvements: {#build-improvements-2} + +- Fixes for builds on ARM. + +### ClickHouse Release 18.14.18, 2018-12-04 {#clickhouse-release-18-14-18-2018-12-04} + +#### Bug Fixes: {#bug-fixes-3} + +- Fixed error in `dictGet...` function for dictionaries of type `range`, if one of the arguments is constant and other is not. [#3751](https://github.com/ClickHouse/ClickHouse/pull/3751) +- Fixed error that caused messages `netlink: '...': attribute type 1 has an invalid length` to be printed in Linux kernel log, that was happening only on fresh enough versions of Linux kernel. [#3749](https://github.com/ClickHouse/ClickHouse/pull/3749) +- Fixed segfault in function `empty` for argument of `FixedString` type. [Daniel, Dao Quang Minh](https://github.com/ClickHouse/ClickHouse/pull/3703) +- Fixed excessive memory allocation when using large value of `max_query_size` setting (a memory chunk of `max_query_size` bytes was preallocated at once). [#3720](https://github.com/ClickHouse/ClickHouse/pull/3720) + +#### Build Changes: {#build-changes} + +- Fixed build with LLVM/Clang libraries of version 7 from the OS packages (these libraries are used for runtime query compilation). [#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### ClickHouse Release 18.14.17, 2018-11-30 {#clickhouse-release-18-14-17-2018-11-30} + +#### Bug Fixes: {#bug-fixes-4} + +- Fixed cases when the ODBC bridge process did not terminate with the main server process. [#3642](https://github.com/ClickHouse/ClickHouse/pull/3642) +- Fixed synchronous insertion into the `Distributed` table with a columns list that differs from the column list of the remote table. [#3673](https://github.com/ClickHouse/ClickHouse/pull/3673) +- Fixed a rare race condition that can lead to a crash when dropping a MergeTree table. [#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Fixed a query deadlock in case when query thread creation fails with the `Resource temporarily unavailable` error. [#3643](https://github.com/ClickHouse/ClickHouse/pull/3643) +- Fixed parsing of the `ENGINE` clause when the `CREATE AS table` syntax was used and the `ENGINE` clause was specified before the `AS table` (the error resulted in ignoring the specified engine). [#3692](https://github.com/ClickHouse/ClickHouse/pull/3692) + +### ClickHouse Release 18.14.15, 2018-11-21 {#clickhouse-release-18-14-15-2018-11-21} + +#### Bug Fixes: {#bug-fixes-5} + +- The size of memory chunk was overestimated while deserializing the column of type `Array(String)` that leads to “Memory limit exceeded” errors. The issue appeared in version 18.12.13. [#3589](https://github.com/ClickHouse/ClickHouse/issues/3589) + +### ClickHouse Release 18.14.14, 2018-11-20 {#clickhouse-release-18-14-14-2018-11-20} + +#### Bug Fixes: {#bug-fixes-6} + +- Fixed `ON CLUSTER` queries when cluster configured as secure (flag ``). [#3599](https://github.com/ClickHouse/ClickHouse/pull/3599) + +#### Build Changes: {#build-changes-1} + +- Fixed problems (llvm-7 from system, macos) [#3582](https://github.com/ClickHouse/ClickHouse/pull/3582) + +### ClickHouse Release 18.14.13, 2018-11-08 {#clickhouse-release-18-14-13-2018-11-08} + +#### Bug Fixes: {#bug-fixes-7} + +- Fixed the `Block structure mismatch in MergingSorted stream` error. [#3162](https://github.com/ClickHouse/ClickHouse/issues/3162) +- Fixed `ON CLUSTER` queries in case when secure connections were turned on in the cluster config (the `` flag). [#3465](https://github.com/ClickHouse/ClickHouse/pull/3465) +- Fixed an error in queries that used `SAMPLE`, `PREWHERE` and alias columns. [#3543](https://github.com/ClickHouse/ClickHouse/pull/3543) +- Fixed a rare `unknown compression method` error when the `min_bytes_to_use_direct_io` setting was enabled. [3544](https://github.com/ClickHouse/ClickHouse/pull/3544) + +#### Performance Improvements: {#performance-improvements} + +- Fixed performance regression of queries with `GROUP BY` of columns of UInt16 or Date type when executing on AMD EPYC processors. [Igor Lapko](https://github.com/ClickHouse/ClickHouse/pull/3512) +- Fixed performance regression of queries that process long strings. [#3530](https://github.com/ClickHouse/ClickHouse/pull/3530) + +#### Build Improvements: {#build-improvements-3} + +- Improvements for simplifying the Arcadia build. [#3475](https://github.com/ClickHouse/ClickHouse/pull/3475), [#3535](https://github.com/ClickHouse/ClickHouse/pull/3535) + +### ClickHouse Release 18.14.12, 2018-11-02 {#clickhouse-release-18-14-12-2018-11-02} + +#### Bug Fixes: {#bug-fixes-8} + +- Fixed a crash on joining two unnamed subqueries. [#3505](https://github.com/ClickHouse/ClickHouse/pull/3505) +- Fixed generating incorrect queries (with an empty `WHERE` clause) when querying external databases. [hotid](https://github.com/ClickHouse/ClickHouse/pull/3477) +- Fixed using an incorrect timeout value in ODBC dictionaries. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3511) + +### ClickHouse Release 18.14.11, 2018-10-29 {#clickhouse-release-18-14-11-2018-10-29} + +#### Bug Fixes: {#bug-fixes-9} + +- Fixed the error `Block structure mismatch in UNION stream: different number of columns` in LIMIT queries. [#2156](https://github.com/ClickHouse/ClickHouse/issues/2156) +- Fixed errors when merging data in tables containing arrays inside Nested structures. [#3397](https://github.com/ClickHouse/ClickHouse/pull/3397) +- Fixed incorrect query results if the `merge_tree_uniform_read_distribution` setting is disabled (it is enabled by default). [#3429](https://github.com/ClickHouse/ClickHouse/pull/3429) +- Fixed an error on inserts to a Distributed table in Native format. [#3411](https://github.com/ClickHouse/ClickHouse/issues/3411) + +### ClickHouse Release 18.14.10, 2018-10-23 {#clickhouse-release-18-14-10-2018-10-23} + +- The `compile_expressions` setting (JIT compilation of expressions) is disabled by default. [#3410](https://github.com/ClickHouse/ClickHouse/pull/3410) +- The `enable_optimize_predicate_expression` setting is disabled by default. + +### ClickHouse Release 18.14.9, 2018-10-16 {#clickhouse-release-18-14-9-2018-10-16} + +#### New Features: {#new-features-1} + +- The `WITH CUBE` modifier for `GROUP BY` (the alternative syntax `GROUP BY CUBE(...)` is also available). [#3172](https://github.com/ClickHouse/ClickHouse/pull/3172) +- Added the `formatDateTime` function. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2770) +- Added the `JDBC` table engine and `jdbc` table function (requires installing clickhouse-jdbc-bridge). [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- Added functions for working with the ISO week number: `toISOWeek`, `toISOYear`, `toStartOfISOYear`, and `toDayOfYear`. [#3146](https://github.com/ClickHouse/ClickHouse/pull/3146) +- Now you can use `Nullable` columns for `MySQL` and `ODBC` tables. [#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Nested data structures can be read as nested objects in `JSONEachRow` format. Added the `input_format_import_nested_json` setting. [Veloman Yunkan](https://github.com/ClickHouse/ClickHouse/pull/3144) +- Parallel processing is available for many `MATERIALIZED VIEW`s when inserting data. See the `parallel_view_processing` setting. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3208) +- Added the `SYSTEM FLUSH LOGS` query (forced log flushes to system tables such as `query_log`) [#3321](https://github.com/ClickHouse/ClickHouse/pull/3321) +- Now you can use pre-defined `database` and `table` macros when declaring `Replicated` tables. [#3251](https://github.com/ClickHouse/ClickHouse/pull/3251) +- Added the ability to read `Decimal` type values in engineering notation (indicating powers of ten). [#3153](https://github.com/ClickHouse/ClickHouse/pull/3153) + +#### Experimental Features: {#experimental-features} + +- Optimization of the GROUP BY clause for `LowCardinality data types.` [#3138](https://github.com/ClickHouse/ClickHouse/pull/3138) +- Optimized calculation of expressions for `LowCardinality data types.` [#3200](https://github.com/ClickHouse/ClickHouse/pull/3200) + +#### Improvements: {#improvements-2} + +- Significantly reduced memory consumption for queries with `ORDER BY` and `LIMIT`. See the `max_bytes_before_remerge_sort` setting. [#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- In the absence of `JOIN` (`LEFT`, `INNER`, …), `INNER JOIN` is assumed. [#3147](https://github.com/ClickHouse/ClickHouse/pull/3147) +- Qualified asterisks work correctly in queries with `JOIN`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3202) +- The `ODBC` table engine correctly chooses the method for quoting identifiers in the SQL dialect of a remote database. [Alexandr Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/3210) +- The `compile_expressions` setting (JIT compilation of expressions) is enabled by default. +- Fixed behavior for simultaneous DROP DATABASE/TABLE IF EXISTS and CREATE DATABASE/TABLE IF NOT EXISTS. Previously, a `CREATE DATABASE ... IF NOT EXISTS` query could return the error message “File … already exists”, and the `CREATE TABLE ... IF NOT EXISTS` and `DROP TABLE IF EXISTS` queries could return `Table ... is creating or attaching right now`. [#3101](https://github.com/ClickHouse/ClickHouse/pull/3101) +- LIKE and IN expressions with a constant right half are passed to the remote server when querying from MySQL or ODBC tables. [#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Comparisons with constant expressions in a WHERE clause are passed to the remote server when querying from MySQL and ODBC tables. Previously, only comparisons with constants were passed. [#3182](https://github.com/ClickHouse/ClickHouse/pull/3182) +- Correct calculation of row width in the terminal for `Pretty` formats, including strings with hieroglyphs. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/3257). +- `ON CLUSTER` can be specified for `ALTER UPDATE` queries. +- Improved performance for reading data in `JSONEachRow` format. [#3332](https://github.com/ClickHouse/ClickHouse/pull/3332) +- Added synonyms for the `LENGTH` and `CHARACTER_LENGTH` functions for compatibility. The `CONCAT` function is no longer case-sensitive. [#3306](https://github.com/ClickHouse/ClickHouse/pull/3306) +- Added the `TIMESTAMP` synonym for the `DateTime` type. [#3390](https://github.com/ClickHouse/ClickHouse/pull/3390) +- There is always space reserved for query_id in the server logs, even if the log line is not related to a query. This makes it easier to parse server text logs with third-party tools. +- Memory consumption by a query is logged when it exceeds the next level of an integer number of gigabytes. [#3205](https://github.com/ClickHouse/ClickHouse/pull/3205) +- Added compatibility mode for the case when the client library that uses the Native protocol sends fewer columns by mistake than the server expects for the INSERT query. This scenario was possible when using the clickhouse-cpp library. Previously, this scenario caused the server to crash. [#3171](https://github.com/ClickHouse/ClickHouse/pull/3171) +- In a user-defined WHERE expression in `clickhouse-copier`, you can now use a `partition_key` alias (for additional filtering by source table partition). This is useful if the partitioning scheme changes during copying, but only changes slightly. [#3166](https://github.com/ClickHouse/ClickHouse/pull/3166) +- The workflow of the `Kafka` engine has been moved to a background thread pool in order to automatically reduce the speed of data reading at high loads. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- Support for reading `Tuple` and `Nested` values of structures like `struct` in the `Cap'n'Proto format`. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3216) +- The list of top-level domains for the `firstSignificantSubdomain` function now includes the domain `biz`. [decaseal](https://github.com/ClickHouse/ClickHouse/pull/3219) +- In the configuration of external dictionaries, `null_value` is interpreted as the value of the default data type. [#3330](https://github.com/ClickHouse/ClickHouse/pull/3330) +- Support for the `intDiv` and `intDivOrZero` functions for `Decimal`. [b48402e8](https://github.com/ClickHouse/ClickHouse/commit/b48402e8712e2b9b151e0eef8193811d433a1264) +- Support for the `Date`, `DateTime`, `UUID`, and `Decimal` types as a key for the `sumMap` aggregate function. [#3281](https://github.com/ClickHouse/ClickHouse/pull/3281) +- Support for the `Decimal` data type in external dictionaries. [#3324](https://github.com/ClickHouse/ClickHouse/pull/3324) +- Support for the `Decimal` data type in `SummingMergeTree` tables. [#3348](https://github.com/ClickHouse/ClickHouse/pull/3348) +- Added specializations for `UUID` in `if`. [#3366](https://github.com/ClickHouse/ClickHouse/pull/3366) +- Reduced the number of `open` and `close` system calls when reading from a `MergeTree table`. [#3283](https://github.com/ClickHouse/ClickHouse/pull/3283) +- A `TRUNCATE TABLE` query can be executed on any replica (the query is passed to the leader replica). [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/3375) + +#### Bug Fixes: {#bug-fixes-10} + +- Fixed an issue with `Dictionary` tables for `range_hashed` dictionaries. This error occurred in version 18.12.17. [#1702](https://github.com/ClickHouse/ClickHouse/pull/1702) +- Fixed an error when loading `range_hashed` dictionaries (the message `Unsupported type Nullable (...)`). This error occurred in version 18.12.17. [#3362](https://github.com/ClickHouse/ClickHouse/pull/3362) +- Fixed errors in the `pointInPolygon` function due to the accumulation of inaccurate calculations for polygons with a large number of vertices located close to each other. [#3331](https://github.com/ClickHouse/ClickHouse/pull/3331) [#3341](https://github.com/ClickHouse/ClickHouse/pull/3341) +- If after merging data parts, the checksum for the resulting part differs from the result of the same merge in another replica, the result of the merge is deleted and the data part is downloaded from the other replica (this is the correct behavior). But after downloading the data part, it couldn’t be added to the working set because of an error that the part already exists (because the data part was deleted with some delay after the merge). This led to cyclical attempts to download the same data. [#3194](https://github.com/ClickHouse/ClickHouse/pull/3194) +- Fixed incorrect calculation of total memory consumption by queries (because of incorrect calculation, the `max_memory_usage_for_all_queries` setting worked incorrectly and the `MemoryTracking` metric had an incorrect value). This error occurred in version 18.12.13. [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3344) +- Fixed the functionality of `CREATE TABLE ... ON CLUSTER ... AS SELECT ...` This error occurred in version 18.12.13. [#3247](https://github.com/ClickHouse/ClickHouse/pull/3247) +- Fixed unnecessary preparation of data structures for `JOIN`s on the server that initiates the query if the `JOIN` is only performed on remote servers. [#3340](https://github.com/ClickHouse/ClickHouse/pull/3340) +- Fixed bugs in the `Kafka` engine: deadlocks after exceptions when starting to read data, and locks upon completion [Marek Vavruša](https://github.com/ClickHouse/ClickHouse/pull/3215). +- For `Kafka` tables, the optional `schema` parameter was not passed (the schema of the `Cap'n'Proto` format). [Vojtech Splichal](https://github.com/ClickHouse/ClickHouse/pull/3150) +- If the ensemble of ZooKeeper servers has servers that accept the connection but then immediately close it instead of responding to the handshake, ClickHouse chooses to connect another server. Previously, this produced the error `Cannot read all data. Bytes read: 0. Bytes expected: 4.` and the server couldn’t start. [8218cf3a](https://github.com/ClickHouse/ClickHouse/commit/8218cf3a5f39a43401953769d6d12a0bb8d29da9) +- If the ensemble of ZooKeeper servers contains servers for which the DNS query returns an error, these servers are ignored. [17b8e209](https://github.com/ClickHouse/ClickHouse/commit/17b8e209221061325ad7ba0539f03c6e65f87f29) +- Fixed type conversion between `Date` and `DateTime` when inserting data in the `VALUES` format (if `input_format_values_interpret_expressions = 1`). Previously, the conversion was performed between the numerical value of the number of days in Unix Epoch time and the Unix timestamp, which led to unexpected results. [#3229](https://github.com/ClickHouse/ClickHouse/pull/3229) +- Corrected type conversion between `Decimal` and integer numbers. [#3211](https://github.com/ClickHouse/ClickHouse/pull/3211) +- Fixed errors in the `enable_optimize_predicate_expression` setting. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3231) +- Fixed a parsing error in CSV format with floating-point numbers if a non-default CSV separator is used, such as `;` [#3155](https://github.com/ClickHouse/ClickHouse/pull/3155) +- Fixed the `arrayCumSumNonNegative` function (it does not accumulate negative values if the accumulator is less than zero). [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/3163) +- Fixed how `Merge` tables work on top of `Distributed` tables when using `PREWHERE`. [#3165](https://github.com/ClickHouse/ClickHouse/pull/3165) +- Bug fixes in the `ALTER UPDATE` query. +- Fixed bugs in the `odbc` table function that appeared in version 18.12. [#3197](https://github.com/ClickHouse/ClickHouse/pull/3197) +- Fixed the operation of aggregate functions with `StateArray` combinators. [#3188](https://github.com/ClickHouse/ClickHouse/pull/3188) +- Fixed a crash when dividing a `Decimal` value by zero. [69dd6609](https://github.com/ClickHouse/ClickHouse/commit/69dd6609193beb4e7acd3e6ad216eca0ccfb8179) +- Fixed output of types for operations using `Decimal` and integer arguments. [#3224](https://github.com/ClickHouse/ClickHouse/pull/3224) +- Fixed the segfault during `GROUP BY` on `Decimal128`. [3359ba06](https://github.com/ClickHouse/ClickHouse/commit/3359ba06c39fcd05bfdb87d6c64154819621e13a) +- The `log_query_threads` setting (logging information about each thread of query execution) now takes effect only if the `log_queries` option (logging information about queries) is set to 1. Since the `log_query_threads` option is enabled by default, information about threads was previously logged even if query logging was disabled. [#3241](https://github.com/ClickHouse/ClickHouse/pull/3241) +- Fixed an error in the distributed operation of the quantiles aggregate function (the error message `Not found column quantile...`). [292a8855](https://github.com/ClickHouse/ClickHouse/commit/292a885533b8e3b41ce8993867069d14cbd5a664) +- Fixed the compatibility problem when working on a cluster of version 18.12.17 servers and older servers at the same time. For distributed queries with GROUP BY keys of both fixed and non-fixed length, if there was a large amount of data to aggregate, the returned data was not always fully aggregated (two different rows contained the same aggregation keys). [#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) +- Fixed handling of substitutions in `clickhouse-performance-test`, if the query contains only part of the substitutions declared in the test. [#3263](https://github.com/ClickHouse/ClickHouse/pull/3263) +- Fixed an error when using `FINAL` with `PREWHERE`. [#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Fixed an error when using `PREWHERE` over columns that were added during `ALTER`. [#3298](https://github.com/ClickHouse/ClickHouse/pull/3298) +- Added a check for the absence of `arrayJoin` for `DEFAULT` and `MATERIALIZED` expressions. Previously, `arrayJoin` led to an error when inserting data. [#3337](https://github.com/ClickHouse/ClickHouse/pull/3337) +- Added a check for the absence of `arrayJoin` in a `PREWHERE` clause. Previously, this led to messages like `Size ... does not match` or `Unknown compression method` when executing queries. [#3357](https://github.com/ClickHouse/ClickHouse/pull/3357) +- Fixed segfault that could occur in rare cases after optimization that replaced AND chains from equality evaluations with the corresponding IN expression. [liuyimin-bytedance](https://github.com/ClickHouse/ClickHouse/pull/3339) +- Minor corrections to `clickhouse-benchmark`: previously, client information was not sent to the server; now the number of queries executed is calculated more accurately when shutting down and for limiting the number of iterations. [#3351](https://github.com/ClickHouse/ClickHouse/pull/3351) [#3352](https://github.com/ClickHouse/ClickHouse/pull/3352) + +#### Backward Incompatible Changes: {#backward-incompatible-changes-1} + +- Removed the `allow_experimental_decimal_type` option. The `Decimal` data type is available for default use. [#3329](https://github.com/ClickHouse/ClickHouse/pull/3329) + +## ClickHouse Release 18.12 {#clickhouse-release-18-12} + +### ClickHouse Release 18.12.17, 2018-09-16 {#clickhouse-release-18-12-17-2018-09-16} + +#### New Features: {#new-features-2} + +- `invalidate_query` (the ability to specify a query to check whether an external dictionary needs to be updated) is implemented for the `clickhouse` source. [#3126](https://github.com/ClickHouse/ClickHouse/pull/3126) +- Added the ability to use `UInt*`, `Int*`, and `DateTime` data types (along with the `Date` type) as a `range_hashed` external dictionary key that defines the boundaries of ranges. Now `NULL` can be used to designate an open range. [Vasily Nemkov](https://github.com/ClickHouse/ClickHouse/pull/3123) +- The `Decimal` type now supports `var*` and `stddev*` aggregate functions. [#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- The `Decimal` type now supports mathematical functions (`exp`, `sin` and so on.) [#3129](https://github.com/ClickHouse/ClickHouse/pull/3129) +- The `system.part_log` table now has the `partition_id` column. [#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Bug Fixes: {#bug-fixes-11} + +- `Merge` now works correctly on `Distributed` tables. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3159) +- Fixed incompatibility (unnecessary dependency on the `glibc` version) that made it impossible to run ClickHouse on `Ubuntu Precise` and older versions. The incompatibility arose in version 18.12.13. [#3130](https://github.com/ClickHouse/ClickHouse/pull/3130) +- Fixed errors in the `enable_optimize_predicate_expression` setting. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) +- Fixed a minor issue with backwards compatibility that appeared when working with a cluster of replicas on versions earlier than 18.12.13 and simultaneously creating a new replica of a table on a server with a newer version (shown in the message `Can not clone replica, because the ... updated to new ClickHouse version`, which is logical, but shouldn’t happen). [#3122](https://github.com/ClickHouse/ClickHouse/pull/3122) + +#### Backward Incompatible Changes: {#backward-incompatible-changes-2} + +- The `enable_optimize_predicate_expression` option is enabled by default (which is rather optimistic). If query analysis errors occur that are related to searching for the column names, set `enable_optimize_predicate_expression` to 0. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3107) + +### ClickHouse Release 18.12.14, 2018-09-13 {#clickhouse-release-18-12-14-2018-09-13} + +#### New Features: {#new-features-3} + +- Added support for `ALTER UPDATE` queries. [#3035](https://github.com/ClickHouse/ClickHouse/pull/3035) +- Added the `allow_ddl` option, which restricts the user’s access to DDL queries. [#3104](https://github.com/ClickHouse/ClickHouse/pull/3104) +- Added the `min_merge_bytes_to_use_direct_io` option for `MergeTree` engines, which allows you to set a threshold for the total size of the merge (when above the threshold, data part files will be handled using O_DIRECT). [#3117](https://github.com/ClickHouse/ClickHouse/pull/3117) +- The `system.merges` system table now contains the `partition_id` column. [#3099](https://github.com/ClickHouse/ClickHouse/pull/3099) + +#### Improvements {#improvements-3} + +- If a data part remains unchanged during mutation, it isn’t downloaded by replicas. [#3103](https://github.com/ClickHouse/ClickHouse/pull/3103) +- Autocomplete is available for names of settings when working with `clickhouse-client`. [#3106](https://github.com/ClickHouse/ClickHouse/pull/3106) + +#### Bug Fixes: {#bug-fixes-12} + +- Added a check for the sizes of arrays that are elements of `Nested` type fields when inserting. [#3118](https://github.com/ClickHouse/ClickHouse/pull/3118) +- Fixed an error updating external dictionaries with the `ODBC` source and `hashed` storage. This error occurred in version 18.12.13. +- Fixed a crash when creating a temporary table from a query with an `IN` condition. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3098) +- Fixed an error in aggregate functions for arrays that can have `NULL` elements. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/3097) + +### ClickHouse Release 18.12.13, 2018-09-10 {#clickhouse-release-18-12-13-2018-09-10} + +#### New Features: {#new-features-4} + +- Added the `DECIMAL(digits, scale)` data type (`Decimal32(scale)`, `Decimal64(scale)`, `Decimal128(scale)`). To enable it, use the setting `allow_experimental_decimal_type`. [#2846](https://github.com/ClickHouse/ClickHouse/pull/2846) [#2970](https://github.com/ClickHouse/ClickHouse/pull/2970) [#3008](https://github.com/ClickHouse/ClickHouse/pull/3008) [#3047](https://github.com/ClickHouse/ClickHouse/pull/3047) +- New `WITH ROLLUP` modifier for `GROUP BY` (alternative syntax: `GROUP BY ROLLUP(...)`). [#2948](https://github.com/ClickHouse/ClickHouse/pull/2948) +- In queries with JOIN, the star character expands to a list of columns in all tables, in compliance with the SQL standard. You can restore the old behavior by setting `asterisk_left_columns_only` to 1 on the user configuration level. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2787) +- Added support for JOIN with table functions. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Autocomplete by pressing Tab in clickhouse-client. [Sergey Shcherbin](https://github.com/ClickHouse/ClickHouse/pull/2447) +- Ctrl+C in clickhouse-client clears a query that was entered. [#2877](https://github.com/ClickHouse/ClickHouse/pull/2877) +- Added the `join_default_strictness` setting (values: `"`, `'any'`, `'all'`). This allows you to not specify `ANY` or `ALL` for `JOIN`. [#2982](https://github.com/ClickHouse/ClickHouse/pull/2982) +- Each line of the server log related to query processing shows the query ID. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Now you can get query execution logs in clickhouse-client (use the `send_logs_level` setting). With distributed query processing, logs are cascaded from all the servers. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `system.query_log` and `system.processes` (`SHOW PROCESSLIST`) tables now have information about all changed settings when you run a query (the nested structure of the `Settings` data). Added the `log_query_settings` setting. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `system.query_log` and `system.processes` tables now show information about the number of threads that are participating in query execution (see the `thread_numbers` column). [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Added `ProfileEvents` counters that measure the time spent on reading and writing over the network and reading and writing to disk, the number of network errors, and the time spent waiting when network bandwidth is limited. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Added `ProfileEvents`counters that contain the system metrics from rusage (you can use them to get information about CPU usage in userspace and the kernel, page faults, and context switches), as well as taskstats metrics (use these to obtain information about I/O wait time, CPU wait time, and the amount of data read and recorded, both with and without page cache). [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `ProfileEvents` counters are applied globally and for each query, as well as for each query execution thread, which allows you to profile resource consumption by query in detail. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- Added the `system.query_thread_log` table, which contains information about each query execution thread. Added the `log_query_threads` setting. [#2482](https://github.com/ClickHouse/ClickHouse/pull/2482) +- The `system.metrics` and `system.events` tables now have built-in documentation. [#3016](https://github.com/ClickHouse/ClickHouse/pull/3016) +- Added the `arrayEnumerateDense` function. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2975) +- Added the `arrayCumSumNonNegative` and `arrayDifference` functions. [Aleksey Studnev](https://github.com/ClickHouse/ClickHouse/pull/2942) +- Added the `retention` aggregate function. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2887) +- Now you can add (merge) states of aggregate functions by using the plus operator, and multiply the states of aggregate functions by a nonnegative constant. [#3062](https://github.com/ClickHouse/ClickHouse/pull/3062) [#3034](https://github.com/ClickHouse/ClickHouse/pull/3034) +- Tables in the MergeTree family now have the virtual column `_partition_id`. [#3089](https://github.com/ClickHouse/ClickHouse/pull/3089) + +#### Experimental Features: {#experimental-features-1} + +- Added the `LowCardinality(T)` data type. This data type automatically creates a local dictionary of values and allows data processing without unpacking the dictionary. [#2830](https://github.com/ClickHouse/ClickHouse/pull/2830) +- Added a cache of JIT-compiled functions and a counter for the number of uses before compiling. To JIT compile expressions, enable the `compile_expressions` setting. [#2990](https://github.com/ClickHouse/ClickHouse/pull/2990) [#3077](https://github.com/ClickHouse/ClickHouse/pull/3077) + +#### Improvements: {#improvements-4} + +- Fixed the problem with unlimited accumulation of the replication log when there are abandoned replicas. Added an effective recovery mode for replicas with a long lag. +- Improved performance of `GROUP BY` with multiple aggregation fields when one of them is string and the others are fixed length. +- Improved performance when using `PREWHERE` and with implicit transfer of expressions in `PREWHERE`. +- Improved parsing performance for text formats (`CSV`, `TSV`). [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2977) [#2980](https://github.com/ClickHouse/ClickHouse/pull/2980) +- Improved performance of reading strings and arrays in binary formats. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2955) +- Increased performance and reduced memory consumption for queries to `system.tables` and `system.columns` when there is a very large number of tables on a single server. [#2953](https://github.com/ClickHouse/ClickHouse/pull/2953) +- Fixed a performance problem in the case of a large stream of queries that result in an error (the `_dl_addr` function is visible in `perf top`, but the server isn’t using much CPU). [#2938](https://github.com/ClickHouse/ClickHouse/pull/2938) +- Conditions are cast into the View (when `enable_optimize_predicate_expression` is enabled). [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2907) +- Improvements to the functionality for the `UUID` data type. [#3074](https://github.com/ClickHouse/ClickHouse/pull/3074) [#2985](https://github.com/ClickHouse/ClickHouse/pull/2985) +- The `UUID` data type is supported in The-Alchemist dictionaries. [#2822](https://github.com/ClickHouse/ClickHouse/pull/2822) +- The `visitParamExtractRaw` function works correctly with nested structures. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2974) +- When the `input_format_skip_unknown_fields` setting is enabled, object fields in `JSONEachRow` format are skipped correctly. [BlahGeek](https://github.com/ClickHouse/ClickHouse/pull/2958) +- For a `CASE` expression with conditions, you can now omit `ELSE`, which is equivalent to `ELSE NULL`. [#2920](https://github.com/ClickHouse/ClickHouse/pull/2920) +- The operation timeout can now be configured when working with ZooKeeper. [urykhy](https://github.com/ClickHouse/ClickHouse/pull/2971) +- You can specify an offset for `LIMIT n, m` as `LIMIT n OFFSET m`. [#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- You can use the `SELECT TOP n` syntax as an alternative for `LIMIT`. [#2840](https://github.com/ClickHouse/ClickHouse/pull/2840) +- Increased the size of the queue to write to system tables, so the `SystemLog parameter queue is full` error does not happen as often. +- The `windowFunnel` aggregate function now supports events that meet multiple conditions. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2801) +- Duplicate columns can be used in a `USING` clause for `JOIN`. [#3006](https://github.com/ClickHouse/ClickHouse/pull/3006) +- `Pretty` formats now have a limit on column alignment by width. Use the `output_format_pretty_max_column_pad_width` setting. If a value is wider, it will still be displayed in its entirety, but the other cells in the table will not be too wide. [#3003](https://github.com/ClickHouse/ClickHouse/pull/3003) +- The `odbc` table function now allows you to specify the database/schema name. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2885) +- Added the ability to use a username specified in the `clickhouse-client` config file. [Vladimir Kozbin](https://github.com/ClickHouse/ClickHouse/pull/2909) +- The `ZooKeeperExceptions` counter has been split into three counters: `ZooKeeperUserExceptions`, `ZooKeeperHardwareExceptions`, and `ZooKeeperOtherExceptions`. +- `ALTER DELETE` queries work for materialized views. +- Added randomization when running the cleanup thread periodically for `ReplicatedMergeTree` tables in order to avoid periodic load spikes when there are a very large number of `ReplicatedMergeTree` tables. +- Support for `ATTACH TABLE ... ON CLUSTER` queries. [#3025](https://github.com/ClickHouse/ClickHouse/pull/3025) + +#### Bug Fixes: {#bug-fixes-13} + +- Fixed an issue with `Dictionary` tables (throws the `Size of offsets does not match size of column` or `Unknown compression method` exception). This bug appeared in version 18.10.3. [#2913](https://github.com/ClickHouse/ClickHouse/issues/2913) +- Fixed a bug when merging `CollapsingMergeTree` tables if one of the data parts is empty (these parts are formed during merge or `ALTER DELETE` if all data was deleted), and the `vertical` algorithm was used for the merge. [#3049](https://github.com/ClickHouse/ClickHouse/pull/3049) +- Fixed a race condition during `DROP` or `TRUNCATE` for `Memory` tables with a simultaneous `SELECT`, which could lead to server crashes. This bug appeared in version 1.1.54388. [#3038](https://github.com/ClickHouse/ClickHouse/pull/3038) +- Fixed the possibility of data loss when inserting in `Replicated` tables if the `Session is expired` error is returned (data loss can be detected by the `ReplicatedDataLoss` metric). This error occurred in version 1.1.54378. [#2939](https://github.com/ClickHouse/ClickHouse/pull/2939) [#2949](https://github.com/ClickHouse/ClickHouse/pull/2949) [#2964](https://github.com/ClickHouse/ClickHouse/pull/2964) +- Fixed a segfault during `JOIN ... ON`. [#3000](https://github.com/ClickHouse/ClickHouse/pull/3000) +- Fixed the error searching column names when the `WHERE` expression consists entirely of a qualified column name, such as `WHERE table.column`. [#2994](https://github.com/ClickHouse/ClickHouse/pull/2994) +- Fixed the “Not found column” error that occurred when executing distributed queries if a single column consisting of an IN expression with a subquery is requested from a remote server. [#3087](https://github.com/ClickHouse/ClickHouse/pull/3087) +- Fixed the `Block structure mismatch in UNION stream: different number of columns` error that occurred for distributed queries if one of the shards is local and the other is not, and optimization of the move to `PREWHERE` is triggered. [#2226](https://github.com/ClickHouse/ClickHouse/pull/2226) [#3037](https://github.com/ClickHouse/ClickHouse/pull/3037) [#3055](https://github.com/ClickHouse/ClickHouse/pull/3055) [#3065](https://github.com/ClickHouse/ClickHouse/pull/3065) [#3073](https://github.com/ClickHouse/ClickHouse/pull/3073) [#3090](https://github.com/ClickHouse/ClickHouse/pull/3090) [#3093](https://github.com/ClickHouse/ClickHouse/pull/3093) +- Fixed the `pointInPolygon` function for certain cases of non-convex polygons. [#2910](https://github.com/ClickHouse/ClickHouse/pull/2910) +- Fixed the incorrect result when comparing `nan` with integers. [#3024](https://github.com/ClickHouse/ClickHouse/pull/3024) +- Fixed an error in the `zlib-ng` library that could lead to segfault in rare cases. [#2854](https://github.com/ClickHouse/ClickHouse/pull/2854) +- Fixed a memory leak when inserting into a table with `AggregateFunction` columns, if the state of the aggregate function is not simple (allocates memory separately), and if a single insertion request results in multiple small blocks. [#3084](https://github.com/ClickHouse/ClickHouse/pull/3084) +- Fixed a race condition when creating and deleting the same `Buffer` or `MergeTree` table simultaneously. +- Fixed the possibility of a segfault when comparing tuples made up of certain non-trivial types, such as tuples. [#2989](https://github.com/ClickHouse/ClickHouse/pull/2989) +- Fixed the possibility of a segfault when running certain `ON CLUSTER` queries. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2960) +- Fixed an error in the `arrayDistinct` function for `Nullable` array elements. [#2845](https://github.com/ClickHouse/ClickHouse/pull/2845) [#2937](https://github.com/ClickHouse/ClickHouse/pull/2937) +- The `enable_optimize_predicate_expression` option now correctly supports cases with `SELECT *`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2929) +- Fixed the segfault when re-initializing the ZooKeeper session. [#2917](https://github.com/ClickHouse/ClickHouse/pull/2917) +- Fixed potential blocking when working with ZooKeeper. +- Fixed incorrect code for adding nested data structures in a `SummingMergeTree`. +- When allocating memory for states of aggregate functions, alignment is correctly taken into account, which makes it possible to use operations that require alignment when implementing states of aggregate functions. [chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2808) + +#### Security Fix: {#security-fix} + +- Safe use of ODBC data sources. Interaction with ODBC drivers uses a separate `clickhouse-odbc-bridge` process. Errors in third-party ODBC drivers no longer cause problems with server stability or vulnerabilities. [#2828](https://github.com/ClickHouse/ClickHouse/pull/2828) [#2879](https://github.com/ClickHouse/ClickHouse/pull/2879) [#2886](https://github.com/ClickHouse/ClickHouse/pull/2886) [#2893](https://github.com/ClickHouse/ClickHouse/pull/2893) [#2921](https://github.com/ClickHouse/ClickHouse/pull/2921) +- Fixed incorrect validation of the file path in the `catBoostPool` table function. [#2894](https://github.com/ClickHouse/ClickHouse/pull/2894) +- The contents of system tables (`tables`, `databases`, `parts`, `columns`, `parts_columns`, `merges`, `mutations`, `replicas`, and `replication_queue`) are filtered according to the user’s configured access to databases (`allow_databases`). [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2856) + +#### Backward Incompatible Changes: {#backward-incompatible-changes-3} + +- In queries with JOIN, the star character expands to a list of columns in all tables, in compliance with the SQL standard. You can restore the old behavior by setting `asterisk_left_columns_only` to 1 on the user configuration level. + +#### Build Changes: {#build-changes-2} + +- Most integration tests can now be run by commit. +- Code style checks can also be run by commit. +- The `memcpy` implementation is chosen correctly when building on CentOS7/Fedora. [Etienne Champetier](https://github.com/ClickHouse/ClickHouse/pull/2912) +- When using clang to build, some warnings from `-Weverything` have been added, in addition to the regular `-Wall-Wextra -Werror`. [#2957](https://github.com/ClickHouse/ClickHouse/pull/2957) +- Debugging the build uses the `jemalloc` debug option. +- The interface of the library for interacting with ZooKeeper is declared abstract. [#2950](https://github.com/ClickHouse/ClickHouse/pull/2950) + +## ClickHouse Release 18.10 {#clickhouse-release-18-10} + +### ClickHouse Release 18.10.3, 2018-08-13 {#clickhouse-release-18-10-3-2018-08-13} + +#### New Features: {#new-features-5} + +- HTTPS can be used for replication. [#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) +- Added the functions `murmurHash2_64`, `murmurHash3_32`, `murmurHash3_64`, and `murmurHash3_128` in addition to the existing `murmurHash2_32`. [#2791](https://github.com/ClickHouse/ClickHouse/pull/2791) +- Support for Nullable types in the ClickHouse ODBC driver (`ODBCDriver2` output format). [#2834](https://github.com/ClickHouse/ClickHouse/pull/2834) +- Support for `UUID` in the key columns. + +#### Improvements: {#improvements-5} + +- Clusters can be removed without restarting the server when they are deleted from the config files. [#2777](https://github.com/ClickHouse/ClickHouse/pull/2777) +- External dictionaries can be removed without restarting the server when they are removed from config files. [#2779](https://github.com/ClickHouse/ClickHouse/pull/2779) +- Added `SETTINGS` support for the `Kafka` table engine. [Alexander Marshalov](https://github.com/ClickHouse/ClickHouse/pull/2781) +- Improvements for the `UUID` data type (not yet complete). [#2618](https://github.com/ClickHouse/ClickHouse/pull/2618) +- Support for empty parts after merges in the `SummingMergeTree`, `CollapsingMergeTree` and `VersionedCollapsingMergeTree` engines. [#2815](https://github.com/ClickHouse/ClickHouse/pull/2815) +- Old records of completed mutations are deleted (`ALTER DELETE`). [#2784](https://github.com/ClickHouse/ClickHouse/pull/2784) +- Added the `system.merge_tree_settings` table. [Kirill Shvakov](https://github.com/ClickHouse/ClickHouse/pull/2841) +- The `system.tables` table now has dependency columns: `dependencies_database` and `dependencies_table`. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2851) +- Added the `max_partition_size_to_drop` config option. [#2782](https://github.com/ClickHouse/ClickHouse/pull/2782) +- Added the `output_format_json_escape_forward_slashes` option. [Alexander Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2812) +- Added the `max_fetch_partition_retries_count` setting. [#2831](https://github.com/ClickHouse/ClickHouse/pull/2831) +- Added the `prefer_localhost_replica` setting for disabling the preference for a local replica and going to a local replica without inter-process interaction. [#2832](https://github.com/ClickHouse/ClickHouse/pull/2832) +- The `quantileExact` aggregate function returns `nan` in the case of aggregation on an empty `Float32` or `Float64` set. [Sundy Li](https://github.com/ClickHouse/ClickHouse/pull/2855) + +#### Bug Fixes: {#bug-fixes-14} + +- Removed unnecessary escaping of the connection string parameters for ODBC, which made it impossible to establish a connection. This error occurred in version 18.6.0. +- Fixed the logic for processing `REPLACE PARTITION` commands in the replication queue. If there are two `REPLACE` commands for the same partition, the incorrect logic could cause one of them to remain in the replication queue and not be executed. [#2814](https://github.com/ClickHouse/ClickHouse/pull/2814) +- Fixed a merge bug when all data parts were empty (parts that were formed from a merge or from `ALTER DELETE` if all data was deleted). This bug appeared in version 18.1.0. [#2930](https://github.com/ClickHouse/ClickHouse/pull/2930) +- Fixed an error for concurrent `Set` or `Join`. [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2823) +- Fixed the `Block structure mismatch in UNION stream: different number of columns` error that occurred for `UNION ALL` queries inside a sub-query if one of the `SELECT` queries contains duplicate column names. [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2094) +- Fixed a memory leak if an exception occurred when connecting to a MySQL server. +- Fixed incorrect clickhouse-client response code in case of a query error. +- Fixed incorrect behavior of materialized views containing DISTINCT. [#2795](https://github.com/ClickHouse/ClickHouse/issues/2795) + +#### Backward Incompatible Changes {#backward-incompatible-changes-4} + +- Removed support for CHECK TABLE queries for Distributed tables. + +#### Build Changes: {#build-changes-3} + +- The allocator has been replaced: `jemalloc` is now used instead of `tcmalloc`. In some scenarios, this increases speed up to 20%. However, there are queries that have slowed by up to 20%. Memory consumption has been reduced by approximately 10% in some scenarios, with improved stability. With highly competitive loads, CPU usage in userspace and in system shows just a slight increase. [#2773](https://github.com/ClickHouse/ClickHouse/pull/2773) +- Use of libressl from a submodule. [#1983](https://github.com/ClickHouse/ClickHouse/pull/1983) [#2807](https://github.com/ClickHouse/ClickHouse/pull/2807) +- Use of unixodbc from a submodule. [#2789](https://github.com/ClickHouse/ClickHouse/pull/2789) +- Use of mariadb-connector-c from a submodule. [#2785](https://github.com/ClickHouse/ClickHouse/pull/2785) +- Added functional test files to the repository that depend on the availability of test data (for the time being, without the test data itself). + +## ClickHouse Release 18.6 {#clickhouse-release-18-6} + +### ClickHouse Release 18.6.0, 2018-08-02 {#clickhouse-release-18-6-0-2018-08-02} + +#### New Features: {#new-features-6} + +- Added support for ON expressions for the JOIN ON syntax: + `JOIN ON Expr([table.]column ...) = Expr([table.]column, ...) [AND Expr([table.]column, ...) = Expr([table.]column, ...) ...]` + The expression must be a chain of equalities joined by the AND operator. Each side of the equality can be an arbitrary expression over the columns of one of the tables. The use of fully qualified column names is supported (`table.name`, `database.table.name`, `table_alias.name`, `subquery_alias.name`) for the right table. [#2742](https://github.com/ClickHouse/ClickHouse/pull/2742) +- HTTPS can be enabled for replication. [#2760](https://github.com/ClickHouse/ClickHouse/pull/2760) + +#### Improvements: {#improvements-6} + +- The server passes the patch component of its version to the client. Data about the patch version component is in `system.processes` and `query_log`. [#2646](https://github.com/ClickHouse/ClickHouse/pull/2646) + +## ClickHouse Release 18.5 {#clickhouse-release-18-5} + +### ClickHouse Release 18.5.1, 2018-07-31 {#clickhouse-release-18-5-1-2018-07-31} + +#### New Features: {#new-features-7} + +- Added the hash function `murmurHash2_32` [#2756](https://github.com/ClickHouse/ClickHouse/pull/2756). + +#### Improvements: {#improvements-7} + +- Now you can use the `from_env` [#2741](https://github.com/ClickHouse/ClickHouse/pull/2741) attribute to set values in config files from environment variables. +- Added case-insensitive versions of the `coalesce`, `ifNull`, and `nullIf functions` [#2752](https://github.com/ClickHouse/ClickHouse/pull/2752). + +#### Bug Fixes: {#bug-fixes-15} + +- Fixed a possible bug when starting a replica [#2759](https://github.com/ClickHouse/ClickHouse/pull/2759). + +## ClickHouse Release 18.4 {#clickhouse-release-18-4} + +### ClickHouse Release 18.4.0, 2018-07-28 {#clickhouse-release-18-4-0-2018-07-28} + +#### New Features: {#new-features-8} + +- Added system tables: `formats`, `data_type_families`, `aggregate_function_combinators`, `table_functions`, `table_engines`, `collations` [#2721](https://github.com/ClickHouse/ClickHouse/pull/2721). +- Added the ability to use a table function instead of a table as an argument of a `remote` or `cluster table function` [#2708](https://github.com/ClickHouse/ClickHouse/pull/2708). +- Support for `HTTP Basic` authentication in the replication protocol [#2727](https://github.com/ClickHouse/ClickHouse/pull/2727). +- The `has` function now allows searching for a numeric value in an array of `Enum` values [Maxim Khrisanfov](https://github.com/ClickHouse/ClickHouse/pull/2699). +- Support for adding arbitrary message separators when reading from `Kafka` [Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2701). + +#### Improvements: {#improvements-8} + +- The `ALTER TABLE t DELETE WHERE` query does not rewrite data parts that were not affected by the WHERE condition [#2694](https://github.com/ClickHouse/ClickHouse/pull/2694). +- The `use_minimalistic_checksums_in_zookeeper` option for `ReplicatedMergeTree` tables is enabled by default. This setting was added in version 1.1.54378, 2018-04-16. Versions that are older than 1.1.54378 can no longer be installed. +- Support for running `KILL` and `OPTIMIZE` queries that specify `ON CLUSTER` [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2689). + +#### Bug Fixes: {#bug-fixes-16} + +- Fixed the error `Column ... is not under an aggregate function and not in GROUP BY` for aggregation with an IN expression. This bug appeared in version 18.1.0. ([bbdd780b](https://github.com/ClickHouse/ClickHouse/commit/bbdd780be0be06a0f336775941cdd536878dd2c2)) +- Fixed a bug in the `windowFunnel aggregate function` [Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2735). +- Fixed a bug in the `anyHeavy` aggregate function ([a2101df2](https://github.com/ClickHouse/ClickHouse/commit/a2101df25a6a0fba99aa71f8793d762af2b801ee)) +- Fixed server crash when using the `countArray()` aggregate function. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-5} + +- Parameters for `Kafka` engine was changed from `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_schema, kafka_num_consumers])` to `Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format[, kafka_row_delimiter, kafka_schema, kafka_num_consumers])`. If your tables use `kafka_schema` or `kafka_num_consumers` parameters, you have to manually edit the metadata files `path/metadata/database/table.sql` and add `kafka_row_delimiter` parameter with `''` value. + +## ClickHouse Release 18.1 {#clickhouse-release-18-1} + +### ClickHouse Release 18.1.0, 2018-07-23 {#clickhouse-release-18-1-0-2018-07-23} + +#### New Features: {#new-features-9} + +- Support for the `ALTER TABLE t DELETE WHERE` query for non-replicated MergeTree tables ([#2634](https://github.com/ClickHouse/ClickHouse/pull/2634)). +- Support for arbitrary types for the `uniq*` family of aggregate functions ([#2010](https://github.com/ClickHouse/ClickHouse/issues/2010)). +- Support for arbitrary types in comparison operators ([#2026](https://github.com/ClickHouse/ClickHouse/issues/2026)). +- The `users.xml` file allows setting a subnet mask in the format `10.0.0.1/255.255.255.0`. This is necessary for using masks for IPv6 networks with zeros in the middle ([#2637](https://github.com/ClickHouse/ClickHouse/pull/2637)). +- Added the `arrayDistinct` function ([#2670](https://github.com/ClickHouse/ClickHouse/pull/2670)). +- The SummingMergeTree engine can now work with AggregateFunction type columns ([Constantin S. Pan](https://github.com/ClickHouse/ClickHouse/pull/2566)). + +#### Improvements: {#improvements-9} + +- Changed the numbering scheme for release versions. Now the first part contains the year of release (A.D., Moscow timezone, minus 2000), the second part contains the number for major changes (increases for most releases), and the third part is the patch version. Releases are still backward compatible, unless otherwise stated in the changelog. +- Faster conversions of floating-point numbers to a string ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2664)). +- If some rows were skipped during an insert due to parsing errors (this is possible with the `input_allow_errors_num` and `input_allow_errors_ratio` settings enabled), the number of skipped rows is now written to the server log ([Leonardo Cecchi](https://github.com/ClickHouse/ClickHouse/pull/2669)). + +#### Bug Fixes: {#bug-fixes-17} + +- Fixed the TRUNCATE command for temporary tables ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2624)). +- Fixed a rare deadlock in the ZooKeeper client library that occurred when there was a network error while reading the response ([c315200](https://github.com/ClickHouse/ClickHouse/commit/c315200e64b87e44bdf740707fc857d1fdf7e947)). +- Fixed an error during a CAST to Nullable types ([#1322](https://github.com/ClickHouse/ClickHouse/issues/1322)). +- Fixed the incorrect result of the `maxIntersection()` function when the boundaries of intervals coincided ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2657)). +- Fixed incorrect transformation of the OR expression chain in a function argument ([chenxing-xc](https://github.com/ClickHouse/ClickHouse/pull/2663)). +- Fixed performance degradation for queries containing `IN (subquery)` expressions inside another subquery ([#2571](https://github.com/ClickHouse/ClickHouse/issues/2571)). +- Fixed incompatibility between servers with different versions in distributed queries that use a `CAST` function that isn’t in uppercase letters ([fe8c4d6](https://github.com/ClickHouse/ClickHouse/commit/fe8c4d64e434cacd4ceef34faa9005129f2190a5)). +- Added missing quoting of identifiers for queries to an external DBMS ([#2635](https://github.com/ClickHouse/ClickHouse/issues/2635)). + +#### Backward Incompatible Changes: {#backward-incompatible-changes-6} + +- Converting a string containing the number zero to DateTime does not work. Example: `SELECT toDateTime('0')`. This is also the reason that `DateTime DEFAULT '0'` does not work in tables, as well as `0` in dictionaries. Solution: replace `0` with `0000-00-00 00:00:00`. + +## ClickHouse Release 1.1 {#clickhouse-release-1-1} + +### ClickHouse Release 1.1.54394, 2018-07-12 {#clickhouse-release-1-1-54394-2018-07-12} + +#### New Features: {#new-features-10} + +- Added the `histogram` aggregate function ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2521)). +- Now `OPTIMIZE TABLE ... FINAL` can be used without specifying partitions for `ReplicatedMergeTree` ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2600)). + +#### Bug Fixes: {#bug-fixes-18} + +- Fixed a problem with a very small timeout for sockets (one second) for reading and writing when sending and downloading replicated data, which made it impossible to download larger parts if there is a load on the network or disk (it resulted in cyclical attempts to download parts). This error occurred in version 1.1.54388. +- Fixed issues when using chroot in ZooKeeper if you inserted duplicate data blocks in the table. +- The `has` function now works correctly for an array with Nullable elements ([#2115](https://github.com/ClickHouse/ClickHouse/issues/2115)). +- The `system.tables` table now works correctly when used in distributed queries. The `metadata_modification_time` and `engine_full` columns are now non-virtual. Fixed an error that occurred if only these columns were queried from the table. +- Fixed how an empty `TinyLog` table works after inserting an empty data block ([#2563](https://github.com/ClickHouse/ClickHouse/issues/2563)). +- The `system.zookeeper` table works if the value of the node in ZooKeeper is NULL. + +### ClickHouse Release 1.1.54390, 2018-07-06 {#clickhouse-release-1-1-54390-2018-07-06} + +#### New Features: {#new-features-11} + +- Queries can be sent in `multipart/form-data` format (in the `query` field), which is useful if external data is also sent for query processing ([Olga Hvostikova](https://github.com/ClickHouse/ClickHouse/pull/2490)). +- Added the ability to enable or disable processing single or double quotes when reading data in CSV format. You can configure this in the `format_csv_allow_single_quotes` and `format_csv_allow_double_quotes` settings ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2574)). +- Now `OPTIMIZE TABLE ... FINAL` can be used without specifying the partition for non-replicated variants of `MergeTree` ([Amos Bird](https://github.com/ClickHouse/ClickHouse/pull/2599)). + +#### Improvements: {#improvements-10} + +- Improved performance, reduced memory consumption, and correct memory consumption tracking with use of the IN operator when a table index could be used ([#2584](https://github.com/ClickHouse/ClickHouse/pull/2584)). +- Removed redundant checking of checksums when adding a data part. This is important when there are a large number of replicas, because in these cases the total number of checks was equal to N^2. +- Added support for `Array(Tuple(...))` arguments for the `arrayEnumerateUniq` function ([#2573](https://github.com/ClickHouse/ClickHouse/pull/2573)). +- Added `Nullable` support for the `runningDifference` function ([#2594](https://github.com/ClickHouse/ClickHouse/pull/2594)). +- Improved query analysis performance when there is a very large number of expressions ([#2572](https://github.com/ClickHouse/ClickHouse/pull/2572)). +- Faster selection of data parts for merging in `ReplicatedMergeTree` tables. Faster recovery of the ZooKeeper session ([#2597](https://github.com/ClickHouse/ClickHouse/pull/2597)). +- The `format_version.txt` file for `MergeTree` tables is re-created if it is missing, which makes sense if ClickHouse is launched after copying the directory structure without files ([Ciprian Hacman](https://github.com/ClickHouse/ClickHouse/pull/2593)). + +#### Bug Fixes: {#bug-fixes-19} + +- Fixed a bug when working with ZooKeeper that could make it impossible to recover the session and readonly states of tables before restarting the server. +- Fixed a bug when working with ZooKeeper that could result in old nodes not being deleted if the session is interrupted. +- Fixed an error in the `quantileTDigest` function for Float arguments (this bug was introduced in version 1.1.54388) ([Mikhail Surin](https://github.com/ClickHouse/ClickHouse/pull/2553)). +- Fixed a bug in the index for MergeTree tables if the primary key column is located inside the function for converting types between signed and unsigned integers of the same size ([#2603](https://github.com/ClickHouse/ClickHouse/pull/2603)). +- Fixed segfault if `macros` are used but they aren’t in the config file ([#2570](https://github.com/ClickHouse/ClickHouse/pull/2570)). +- Fixed switching to the default database when reconnecting the client ([#2583](https://github.com/ClickHouse/ClickHouse/pull/2583)). +- Fixed a bug that occurred when the `use_index_for_in_with_subqueries` setting was disabled. + +#### Security Fix: {#security-fix-1} + +- Sending files is no longer possible when connected to MySQL (`LOAD DATA LOCAL INFILE`). + +### ClickHouse Release 1.1.54388, 2018-06-28 {#clickhouse-release-1-1-54388-2018-06-28} + +#### New Features: {#new-features-12} + +- Support for the `ALTER TABLE t DELETE WHERE` query for replicated tables. Added the `system.mutations` table to track progress of this type of queries. +- Support for the `ALTER TABLE t [REPLACE|ATTACH] PARTITION` query for \*MergeTree tables. +- Support for the `TRUNCATE TABLE` query ([Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2260)) +- Several new `SYSTEM` queries for replicated tables (`RESTART REPLICAS`, `SYNC REPLICA`, `[STOP|START] [MERGES|FETCHES|SENDS REPLICATED|REPLICATION QUEUES]`). +- Added the ability to write to a table with the MySQL engine and the corresponding table function ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2294)). +- Added the `url()` table function and the `URL` table engine ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2501)). +- Added the `windowFunnel` aggregate function ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2352)). +- New `startsWith` and `endsWith` functions for strings ([Vadim Plakhtinsky](https://github.com/ClickHouse/ClickHouse/pull/2429)). +- The `numbers()` table function now allows you to specify the offset ([Winter Zhang](https://github.com/ClickHouse/ClickHouse/pull/2535)). +- The password to `clickhouse-client` can be entered interactively. +- Server logs can now be sent to syslog ([Alexander Krasheninnikov](https://github.com/ClickHouse/ClickHouse/pull/2459)). +- Support for logging in dictionaries with a shared library source ([Alexander Sapin](https://github.com/ClickHouse/ClickHouse/pull/2472)). +- Support for custom CSV delimiters ([Ivan Zhukov](https://github.com/ClickHouse/ClickHouse/pull/2263)) +- Added the `date_time_input_format` setting. If you switch this setting to `'best_effort'`, DateTime values will be read in a wide range of formats. +- Added the `clickhouse-obfuscator` utility for data obfuscation. Usage example: publishing data used in performance tests. + +#### Experimental Features: {#experimental-features-2} + +- Added the ability to calculate `and` arguments only where they are needed ([Anastasia Tsarkova](https://github.com/ClickHouse/ClickHouse/pull/2272)) +- JIT compilation to native code is now available for some expressions ([pyos](https://github.com/ClickHouse/ClickHouse/pull/2277)). + +#### Bug Fixes: {#bug-fixes-20} + +- Duplicates no longer appear for a query with `DISTINCT` and `ORDER BY`. +- Queries with `ARRAY JOIN` and `arrayFilter` no longer return an incorrect result. +- Fixed an error when reading an array column from a Nested structure ([#2066](https://github.com/ClickHouse/ClickHouse/issues/2066)). +- Fixed an error when analyzing queries with a HAVING clause like `HAVING tuple IN (...)`. +- Fixed an error when analyzing queries with recursive aliases. +- Fixed an error when reading from ReplacingMergeTree with a condition in PREWHERE that filters all rows ([#2525](https://github.com/ClickHouse/ClickHouse/issues/2525)). +- User profile settings were not applied when using sessions in the HTTP interface. +- Fixed how settings are applied from the command line parameters in clickhouse-local. +- The ZooKeeper client library now uses the session timeout received from the server. +- Fixed a bug in the ZooKeeper client library when the client waited for the server response longer than the timeout. +- Fixed pruning of parts for queries with conditions on partition key columns ([#2342](https://github.com/ClickHouse/ClickHouse/issues/2342)). +- Merges are now possible after `CLEAR COLUMN IN PARTITION` ([#2315](https://github.com/ClickHouse/ClickHouse/issues/2315)). +- Type mapping in the ODBC table function has been fixed ([sundy-li](https://github.com/ClickHouse/ClickHouse/pull/2268)). +- Type comparisons have been fixed for `DateTime` with and without the time zone ([Alexander Bocharov](https://github.com/ClickHouse/ClickHouse/pull/2400)). +- Fixed syntactic parsing and formatting of the `CAST` operator. +- Fixed insertion into a materialized view for the Distributed table engine ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2411)). +- Fixed a race condition when writing data from the `Kafka` engine to materialized views ([Yangkuan Liu](https://github.com/ClickHouse/ClickHouse/pull/2448)). +- Fixed SSRF in the remote() table function. +- Fixed exit behavior of `clickhouse-client` in multiline mode ([#2510](https://github.com/ClickHouse/ClickHouse/issues/2510)). + +#### Improvements: {#improvements-11} + +- Background tasks in replicated tables are now performed in a thread pool instead of in separate threads ([Silviu Caragea](https://github.com/ClickHouse/ClickHouse/pull/1722)). +- Improved LZ4 compression performance. +- Faster analysis for queries with a large number of JOINs and sub-queries. +- The DNS cache is now updated automatically when there are too many network errors. +- Table inserts no longer occur if the insert into one of the materialized views is not possible because it has too many parts. +- Corrected the discrepancy in the event counters `Query`, `SelectQuery`, and `InsertQuery`. +- Expressions like `tuple IN (SELECT tuple)` are allowed if the tuple types match. +- A server with replicated tables can start even if you haven’t configured ZooKeeper. +- When calculating the number of available CPU cores, limits on cgroups are now taken into account ([Atri Sharma](https://github.com/ClickHouse/ClickHouse/pull/2325)). +- Added chown for config directories in the systemd config file ([Mikhail Shiryaev](https://github.com/ClickHouse/ClickHouse/pull/2421)). + +#### Build Changes: {#build-changes-4} + +- The gcc8 compiler can be used for builds. +- Added the ability to build llvm from submodule. +- The version of the librdkafka library has been updated to v0.11.4. +- Added the ability to use the system libcpuid library. The library version has been updated to 0.4.0. +- Fixed the build using the vectorclass library ([Babacar Diassé](https://github.com/ClickHouse/ClickHouse/pull/2274)). +- Cmake now generates files for ninja by default (like when using `-G Ninja`). +- Added the ability to use the libtinfo library instead of libtermcap ([Georgy Kondratiev](https://github.com/ClickHouse/ClickHouse/pull/2519)). +- Fixed a header file conflict in Fedora Rawhide ([#2520](https://github.com/ClickHouse/ClickHouse/issues/2520)). + +#### Backward Incompatible Changes: {#backward-incompatible-changes-7} + +- Removed escaping in `Vertical` and `Pretty*` formats and deleted the `VerticalRaw` format. +- If servers with version 1.1.54388 (or newer) and servers with an older version are used simultaneously in a distributed query and the query has the `cast(x, 'Type')` expression without the `AS` keyword and does not have the word `cast` in uppercase, an exception will be thrown with a message like `Not found column cast(0, 'UInt8') in block`. Solution: Update the server on the entire cluster. + +### ClickHouse Release 1.1.54385, 2018-06-01 {#clickhouse-release-1-1-54385-2018-06-01} + +#### Bug Fixes: {#bug-fixes-21} + +- Fixed an error that in some cases caused ZooKeeper operations to block. + +### ClickHouse Release 1.1.54383, 2018-05-22 {#clickhouse-release-1-1-54383-2018-05-22} + +#### Bug Fixes: {#bug-fixes-22} + +- Fixed a slowdown of replication queue if a table has many replicas. + +### ClickHouse Release 1.1.54381, 2018-05-14 {#clickhouse-release-1-1-54381-2018-05-14} + +#### Bug Fixes: {#bug-fixes-23} + +- Fixed a nodes leak in ZooKeeper when ClickHouse loses connection to ZooKeeper server. + +### ClickHouse Release 1.1.54380, 2018-04-21 {#clickhouse-release-1-1-54380-2018-04-21} + +#### New Features: {#new-features-13} + +- Added the table function `file(path, format, structure)`. An example reading bytes from `/dev/urandom`: ``` ln -s /dev/urandom /var/lib/clickhouse/user_files/random``clickhouse-client -q "SELECT * FROM file('random', 'RowBinary', 'd UInt8') LIMIT 10" ```. + +#### Improvements: {#improvements-12} + +- Subqueries can be wrapped in `()` brackets to enhance query readability. For example: `(SELECT 1) UNION ALL (SELECT 1)`. +- Simple `SELECT` queries from the `system.processes` table are not included in the `max_concurrent_queries` limit. + +#### Bug Fixes: {#bug-fixes-24} + +- Fixed incorrect behavior of the `IN` operator when select from `MATERIALIZED VIEW`. +- Fixed incorrect filtering by partition index in expressions like `partition_key_column IN (...)`. +- Fixed inability to execute `OPTIMIZE` query on non-leader replica if `REANAME` was performed on the table. +- Fixed the authorization error when executing `OPTIMIZE` or `ALTER` queries on a non-leader replica. +- Fixed freezing of `KILL QUERY`. +- Fixed an error in ZooKeeper client library which led to loss of watches, freezing of distributed DDL queue, and slowdowns in the replication queue if a non-empty `chroot` prefix is used in the ZooKeeper configuration. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-8} + +- Removed support for expressions like `(a, b) IN (SELECT (a, b))` (you can use the equivalent expression `(a, b) IN (SELECT a, b)`). In previous releases, these expressions led to undetermined `WHERE` filtering or caused errors. + +### ClickHouse Release 1.1.54378, 2018-04-16 {#clickhouse-release-1-1-54378-2018-04-16} + +#### New Features: {#new-features-14} + +- Logging level can be changed without restarting the server. +- Added the `SHOW CREATE DATABASE` query. +- The `query_id` can be passed to `clickhouse-client` (elBroom). +- New setting: `max_network_bandwidth_for_all_users`. +- Added support for `ALTER TABLE ... PARTITION ...` for `MATERIALIZED VIEW`. +- Added information about the size of data parts in uncompressed form in the system table. +- Server-to-server encryption support for distributed tables (`1` in the replica config in ``). +- Configuration of the table level for the `ReplicatedMergeTree` family in order to minimize the amount of data stored in Zookeeper: : `use_minimalistic_checksums_in_zookeeper = 1` +- Configuration of the `clickhouse-client` prompt. By default, server names are now output to the prompt. The server’s display name can be changed. It’s also sent in the `X-ClickHouse-Display-Name` HTTP header (Kirill Shvakov). +- Multiple comma-separated `topics` can be specified for the `Kafka` engine (Tobias Adamson) +- When a query is stopped by `KILL QUERY` or `replace_running_query`, the client receives the `Query was canceled` exception instead of an incomplete result. + +#### Improvements: {#improvements-13} + +- `ALTER TABLE ... DROP/DETACH PARTITION` queries are run at the front of the replication queue. +- `SELECT ... FINAL` and `OPTIMIZE ... FINAL` can be used even when the table has a single data part. +- A `query_log` table is recreated on the fly if it was deleted manually (Kirill Shvakov). +- The `lengthUTF8` function runs faster (zhang2014). +- Improved performance of synchronous inserts in `Distributed` tables (`insert_distributed_sync = 1`) when there is a very large number of shards. +- The server accepts the `send_timeout` and `receive_timeout` settings from the client and applies them when connecting to the client (they are applied in reverse order: the server socket’s `send_timeout` is set to the `receive_timeout` value received from the client, and vice versa). +- More robust crash recovery for asynchronous insertion into `Distributed` tables. +- The return type of the `countEqual` function changed from `UInt32` to `UInt64` (谢磊). + +#### Bug Fixes: {#bug-fixes-25} + +- Fixed an error with `IN` when the left side of the expression is `Nullable`. +- Correct results are now returned when using tuples with `IN` when some of the tuple components are in the table index. +- The `max_execution_time` limit now works correctly with distributed queries. +- Fixed errors when calculating the size of composite columns in the `system.columns` table. +- Fixed an error when creating a temporary table `CREATE TEMPORARY TABLE IF NOT EXISTS.` +- Fixed errors in `StorageKafka` (##2075) +- Fixed server crashes from invalid arguments of certain aggregate functions. +- Fixed the error that prevented the `DETACH DATABASE` query from stopping background tasks for `ReplicatedMergeTree` tables. +- `Too many parts` state is less likely to happen when inserting into aggregated materialized views (##2084). +- Corrected recursive handling of substitutions in the config if a substitution must be followed by another substitution on the same level. +- Corrected the syntax in the metadata file when creating a `VIEW` that uses a query with `UNION ALL`. +- `SummingMergeTree` now works correctly for summation of nested data structures with a composite key. +- Fixed the possibility of a race condition when choosing the leader for `ReplicatedMergeTree` tables. + +#### Build Changes: {#build-changes-5} + +- The build supports `ninja` instead of `make` and uses `ninja` by default for building releases. +- Renamed packages: `clickhouse-server-base` in `clickhouse-common-static`; `clickhouse-server-common` in `clickhouse-server`; `clickhouse-common-dbg` in `clickhouse-common-static-dbg`. To install, use `clickhouse-server clickhouse-client`. Packages with the old names will still load in the repositories for backward compatibility. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-9} + +- Removed the special interpretation of an IN expression if an array is specified on the left side. Previously, the expression `arr IN (set)` was interpreted as “at least one `arr` element belongs to the `set`”. To get the same behavior in the new version, write `arrayExists(x -> x IN (set), arr)`. +- Disabled the incorrect use of the socket option `SO_REUSEPORT`, which was incorrectly enabled by default in the Poco library. Note that on Linux there is no longer any reason to simultaneously specify the addresses `::` and `0.0.0.0` for listen – use just `::`, which allows listening to the connection both over IPv4 and IPv6 (with the default kernel config settings). You can also revert to the behavior from previous versions by specifying `1` in the config. + +### ClickHouse Release 1.1.54370, 2018-03-16 {#clickhouse-release-1-1-54370-2018-03-16} + +#### New Features: {#new-features-15} + +- Added the `system.macros` table and auto updating of macros when the config file is changed. +- Added the `SYSTEM RELOAD CONFIG` query. +- Added the `maxIntersections(left_col, right_col)` aggregate function, which returns the maximum number of simultaneously intersecting intervals `[left; right]`. The `maxIntersectionsPosition(left, right)` function returns the beginning of the “maximum” interval. ([Michael Furmur](https://github.com/ClickHouse/ClickHouse/pull/2012)). + +#### Improvements: {#improvements-14} + +- When inserting data in a `Replicated` table, fewer requests are made to `ZooKeeper` (and most of the user-level errors have disappeared from the `ZooKeeper` log). +- Added the ability to create aliases for data sets. Example: `WITH (1, 2, 3) AS set SELECT number IN set FROM system.numbers LIMIT 10`. + +#### Bug Fixes: {#bug-fixes-26} + +- Fixed the `Illegal PREWHERE` error when reading from Merge tables for `Distributed`tables. +- Added fixes that allow you to start clickhouse-server in IPv4-only Docker containers. +- Fixed a race condition when reading from system `system.parts_columns tables.` +- Removed double buffering during a synchronous insert to a `Distributed` table, which could have caused the connection to timeout. +- Fixed a bug that caused excessively long waits for an unavailable replica before beginning a `SELECT` query. +- Fixed incorrect dates in the `system.parts` table. +- Fixed a bug that made it impossible to insert data in a `Replicated` table if `chroot` was non-empty in the configuration of the `ZooKeeper` cluster. +- Fixed the vertical merging algorithm for an empty `ORDER BY` table. +- Restored the ability to use dictionaries in queries to remote tables, even if these dictionaries are not present on the requestor server. This functionality was lost in release 1.1.54362. +- Restored the behavior for queries like `SELECT * FROM remote('server2', default.table) WHERE col IN (SELECT col2 FROM default.table)` when the right side of the `IN` should use a remote `default.table` instead of a local one. This behavior was broken in version 1.1.54358. +- Removed extraneous error-level logging of `Not found column ... in block`. + +### ClickHouse Release 1.1.54362, 2018-03-11 {#clickhouse-release-1-1-54362-2018-03-11} + +#### New Features: {#new-features-16} + +- Aggregation without `GROUP BY` for an empty set (such as `SELECT count(*) FROM table WHERE 0`) now returns a result with one row with null values for aggregate functions, in compliance with the SQL standard. To restore the old behavior (return an empty result), set `empty_result_for_aggregation_by_empty_set` to 1. +- Added type conversion for `UNION ALL`. Different alias names are allowed in `SELECT` positions in `UNION ALL`, in compliance with the SQL standard. +- Arbitrary expressions are supported in `LIMIT BY` clauses. Previously, it was only possible to use columns resulting from `SELECT`. +- An index of `MergeTree` tables is used when `IN` is applied to a tuple of expressions from the columns of the primary key. Example: `WHERE (UserID, EventDate) IN ((123, '2000-01-01'), ...)` (Anastasiya Tsarkova). +- Added the `clickhouse-copier` tool for copying between clusters and resharding data (beta). +- Added consistent hashing functions: `yandexConsistentHash`, `jumpConsistentHash`, `sumburConsistentHash`. They can be used as a sharding key in order to reduce the amount of network traffic during subsequent reshardings. +- Added functions: `arrayAny`, `arrayAll`, `hasAny`, `hasAll`, `arrayIntersect`, `arrayResize`. +- Added the `arrayCumSum` function (Javi Santana). +- Added the `parseDateTimeBestEffort`, `parseDateTimeBestEffortOrZero`, and `parseDateTimeBestEffortOrNull` functions to read the DateTime from a string containing text in a wide variety of possible formats. +- Data can be partially reloaded from external dictionaries during updating (load just the records in which the value of the specified field greater than in the previous download) (Arsen Hakobyan). +- Added the `cluster` table function. Example: `cluster(cluster_name, db, table)`. The `remote` table function can accept the cluster name as the first argument, if it is specified as an identifier. +- The `remote` and `cluster` table functions can be used in `INSERT` queries. +- Added the `create_table_query` and `engine_full` virtual columns to the `system.tables`table . The `metadata_modification_time` column is virtual. +- Added the `data_path` and `metadata_path` columns to `system.tables`and`system.databases` tables, and added the `path` column to the `system.parts` and `system.parts_columns` tables. +- Added additional information about merges in the `system.part_log` table. +- An arbitrary partitioning key can be used for the `system.query_log` table (Kirill Shvakov). +- The `SHOW TABLES` query now also shows temporary tables. Added temporary tables and the `is_temporary` column to `system.tables` (zhang2014). +- Added `DROP TEMPORARY TABLE` and `EXISTS TEMPORARY TABLE` queries (zhang2014). +- Support for `SHOW CREATE TABLE` for temporary tables (zhang2014). +- Added the `system_profile` configuration parameter for the settings used by internal processes. +- Support for loading `object_id` as an attribute in `MongoDB` dictionaries (Pavel Litvinenko). +- Reading `null` as the default value when loading data for an external dictionary with the `MongoDB` source (Pavel Litvinenko). +- Reading `DateTime` values in the `Values` format from a Unix timestamp without single quotes. +- Failover is supported in `remote` table functions for cases when some of the replicas are missing the requested table. +- Configuration settings can be overridden in the command line when you run `clickhouse-server`. Example: `clickhouse-server -- --logger.level=information`. +- Implemented the `empty` function from a `FixedString` argument: the function returns 1 if the string consists entirely of null bytes (zhang2014). +- Added the `listen_try`configuration parameter for listening to at least one of the listen addresses without quitting, if some of the addresses can’t be listened to (useful for systems with disabled support for IPv4 or IPv6). +- Added the `VersionedCollapsingMergeTree` table engine. +- Support for rows and arbitrary numeric types for the `library` dictionary source. +- `MergeTree` tables can be used without a primary key (you need to specify `ORDER BY tuple()`). +- A `Nullable` type can be `CAST` to a non-`Nullable` type if the argument is not `NULL`. +- `RENAME TABLE` can be performed for `VIEW`. +- Added the `throwIf` function. +- Added the `odbc_default_field_size` option, which allows you to extend the maximum size of the value loaded from an ODBC source (by default, it is 1024). +- The `system.processes` table and `SHOW PROCESSLIST` now have the `is_cancelled` and `peak_memory_usage` columns. + +#### Improvements: {#improvements-15} + +- Limits and quotas on the result are no longer applied to intermediate data for `INSERT SELECT` queries or for `SELECT` subqueries. +- Fewer false triggers of `force_restore_data` when checking the status of `Replicated` tables when the server starts. +- Added the `allow_distributed_ddl` option. +- Nondeterministic functions are not allowed in expressions for `MergeTree` table keys. +- Files with substitutions from `config.d` directories are loaded in alphabetical order. +- Improved performance of the `arrayElement` function in the case of a constant multidimensional array with an empty array as one of the elements. Example: `[[1], []][x]`. +- The server starts faster now when using configuration files with very large substitutions (for instance, very large lists of IP networks). +- When running a query, table valued functions run once. Previously, `remote` and `mysql` table valued functions performed the same query twice to retrieve the table structure from a remote server. +- The `MkDocs` documentation generator is used. +- When you try to delete a table column that `DEFAULT`/`MATERIALIZED` expressions of other columns depend on, an exception is thrown (zhang2014). +- Added the ability to parse an empty line in text formats as the number 0 for `Float` data types. This feature was previously available but was lost in release 1.1.54342. +- `Enum` values can be used in `min`, `max`, `sum` and some other functions. In these cases, it uses the corresponding numeric values. This feature was previously available but was lost in the release 1.1.54337. +- Added `max_expanded_ast_elements` to restrict the size of the AST after recursively expanding aliases. + +#### Bug Fixes: {#bug-fixes-27} + +- Fixed cases when unnecessary columns were removed from subqueries in error, or not removed from subqueries containing `UNION ALL`. +- Fixed a bug in merges for `ReplacingMergeTree` tables. +- Fixed synchronous insertions in `Distributed` tables (`insert_distributed_sync = 1`). +- Fixed segfault for certain uses of `FULL` and `RIGHT JOIN` with duplicate columns in subqueries. +- Fixed segfault for certain uses of `replace_running_query` and `KILL QUERY`. +- Fixed the order of the `source` and `last_exception` columns in the `system.dictionaries` table. +- Fixed a bug when the `DROP DATABASE` query did not delete the file with metadata. +- Fixed the `DROP DATABASE` query for `Dictionary` databases. +- Fixed the low precision of `uniqHLL12` and `uniqCombined` functions for cardinalities greater than 100 million items (Alex Bocharov). +- Fixed the calculation of implicit default values when necessary to simultaneously calculate default explicit expressions in `INSERT` queries (zhang2014). +- Fixed a rare case when a query to a `MergeTree` table couldn’t finish (chenxing-xc). +- Fixed a crash that occurred when running a `CHECK` query for `Distributed` tables if all shards are local (chenxing.xc). +- Fixed a slight performance regression with functions that use regular expressions. +- Fixed a performance regression when creating multidimensional arrays from complex expressions. +- Fixed a bug that could cause an extra `FORMAT` section to appear in an `.sql` file with metadata. +- Fixed a bug that caused the `max_table_size_to_drop` limit to apply when trying to delete a `MATERIALIZED VIEW` looking at an explicitly specified table. +- Fixed incompatibility with old clients (old clients were sometimes sent data with the `DateTime('timezone')` type, which they do not understand). +- Fixed a bug when reading `Nested` column elements of structures that were added using `ALTER` but that are empty for the old partitions, when the conditions for these columns moved to `PREWHERE`. +- Fixed a bug when filtering tables by virtual `_table` columns in queries to `Merge` tables. +- Fixed a bug when using `ALIAS` columns in `Distributed` tables. +- Fixed a bug that made dynamic compilation impossible for queries with aggregate functions from the `quantile` family. +- Fixed a race condition in the query execution pipeline that occurred in very rare cases when using `Merge` tables with a large number of tables, and when using `GLOBAL` subqueries. +- Fixed a crash when passing arrays of different sizes to an `arrayReduce` function when using aggregate functions from multiple arguments. +- Prohibited the use of queries with `UNION ALL` in a `MATERIALIZED VIEW`. +- Fixed an error during initialization of the `part_log` system table when the server starts (by default, `part_log` is disabled). + +#### Backward Incompatible Changes: {#backward-incompatible-changes-10} + +- Removed the `distributed_ddl_allow_replicated_alter` option. This behavior is enabled by default. +- Removed the `strict_insert_defaults` setting. If you were using this functionality, write to `feedback@clickhouse.com`. +- Removed the `UnsortedMergeTree` engine. + +### ClickHouse Release 1.1.54343, 2018-02-05 {#clickhouse-release-1-1-54343-2018-02-05} + +- Added macros support for defining cluster names in distributed DDL queries and constructors of Distributed tables: `CREATE TABLE distr ON CLUSTER '{cluster}' (...) ENGINE = Distributed('{cluster}', 'db', 'table')`. +- Now queries like `SELECT ... FROM table WHERE expr IN (subquery)` are processed using the `table` index. +- Improved processing of duplicates when inserting to Replicated tables, so they no longer slow down execution of the replication queue. + +### ClickHouse Release 1.1.54342, 2018-01-22 {#clickhouse-release-1-1-54342-2018-01-22} + +This release contains bug fixes for the previous release 1.1.54337: + +- Fixed a regression in 1.1.54337: if the default user has readonly access, then the server refuses to start up with the message `Cannot create database in readonly mode`. +- Fixed a regression in 1.1.54337: on systems with systemd, logs are always written to syslog regardless of the configuration; the watchdog script still uses init.d. +- Fixed a regression in 1.1.54337: wrong default configuration in the Docker image. +- Fixed nondeterministic behavior of GraphiteMergeTree (you can see it in log messages `Data after merge is not byte-identical to the data on another replicas`). +- Fixed a bug that may lead to inconsistent merges after OPTIMIZE query to Replicated tables (you may see it in log messages `Part ... intersects the previous part`). +- Buffer tables now work correctly when MATERIALIZED columns are present in the destination table (by zhang2014). +- Fixed a bug in implementation of NULL. + +### ClickHouse Release 1.1.54337, 2018-01-18 {#clickhouse-release-1-1-54337-2018-01-18} + +#### New Features: {#new-features-17} + +- Added support for storage of multi-dimensional arrays and tuples (`Tuple` data type) in tables. +- Support for table functions for `DESCRIBE` and `INSERT` queries. Added support for subqueries in `DESCRIBE`. Examples: `DESC TABLE remote('host', default.hits)`; `DESC TABLE (SELECT 1)`; `INSERT INTO TABLE FUNCTION remote('host', default.hits)`. Support for `INSERT INTO TABLE` in addition to `INSERT INTO`. +- Improved support for time zones. The `DateTime` data type can be annotated with the timezone that is used for parsing and formatting in text formats. Example: `DateTime('Asia/Istanbul')`. When timezones are specified in functions for `DateTime` arguments, the return type will track the timezone, and the value will be displayed as expected. +- Added the functions `toTimeZone`, `timeDiff`, `toQuarter`, `toRelativeQuarterNum`. The `toRelativeHour`/`Minute`/`Second` functions can take a value of type `Date` as an argument. The `now` function name is case-sensitive. +- Added the `toStartOfFifteenMinutes` function (Kirill Shvakov). +- Added the `clickhouse format` tool for formatting queries. +- Added the `format_schema_path` configuration parameter (Marek Vavruşa). It is used for specifying a schema in `Cap'n Proto` format. Schema files can be located only in the specified directory. +- Added support for config substitutions (`incl` and `conf.d`) for configuration of external dictionaries and models (Pavel Yakunin). +- Added a column with documentation for the `system.settings` table (Kirill Shvakov). +- Added the `system.parts_columns` table with information about column sizes in each data part of `MergeTree` tables. +- Added the `system.models` table with information about loaded `CatBoost` machine learning models. +- Added the `mysql` and `odbc` table function and corresponding `MySQL` and `ODBC` table engines for accessing remote databases. This functionality is in the beta stage. +- Added the possibility to pass an argument of type `AggregateFunction` for the `groupArray` aggregate function (so you can create an array of states of some aggregate function). +- Removed restrictions on various combinations of aggregate function combinators. For example, you can use `avgForEachIf` as well as `avgIfForEach` aggregate functions, which have different behaviors. +- The `-ForEach` aggregate function combinator is extended for the case of aggregate functions of multiple arguments. +- Added support for aggregate functions of `Nullable` arguments even for cases when the function returns a non-`Nullable` result (added with the contribution of Silviu Caragea). Example: `groupArray`, `groupUniqArray`, `topK`. +- Added the `max_client_network_bandwidth` for `clickhouse-client` (Kirill Shvakov). +- Users with the `readonly = 2` setting are allowed to work with TEMPORARY tables (CREATE, DROP, INSERT…) (Kirill Shvakov). +- Added support for using multiple consumers with the `Kafka` engine. Extended configuration options for `Kafka` (Marek Vavruša). +- Added the `intExp3` and `intExp4` functions. +- Added the `sumKahan` aggregate function. +- Added the to \* Number\* OrNull functions, where \* Number\* is a numeric type. +- Added support for `WITH` clauses for an `INSERT SELECT` query (author: zhang2014). +- Added settings: `http_connection_timeout`, `http_send_timeout`, `http_receive_timeout`. In particular, these settings are used for downloading data parts for replication. Changing these settings allows for faster failover if the network is overloaded. +- Added support for `ALTER` for tables of type `Null` (Anastasiya Tsarkova). +- The `reinterpretAsString` function is extended for all data types that are stored contiguously in memory. +- Added the `--silent` option for the `clickhouse-local` tool. It suppresses printing query execution info in stderr. +- Added support for reading values of type `Date` from text in a format where the month and/or day of the month is specified using a single digit instead of two digits (Amos Bird). + +#### Performance Optimizations: {#performance-optimizations} + +- Improved performance of aggregate functions `min`, `max`, `any`, `anyLast`, `anyHeavy`, `argMin`, `argMax` from string arguments. +- Improved performance of the functions `isInfinite`, `isFinite`, `isNaN`, `roundToExp2`. +- Improved performance of parsing and formatting `Date` and `DateTime` type values in text format. +- Improved performance and precision of parsing floating point numbers. +- Lowered memory usage for `JOIN` in the case when the left and right parts have columns with identical names that are not contained in `USING` . +- Improved performance of aggregate functions `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr` by reducing computational stability. The old functions are available under the names `varSampStable`, `varPopStable`, `stddevSampStable`, `stddevPopStable`, `covarSampStable`, `covarPopStable`, `corrStable`. + +#### Bug Fixes: {#bug-fixes-28} + +- Fixed data deduplication after running a `DROP` or `DETACH PARTITION` query. In the previous version, dropping a partition and inserting the same data again was not working because inserted blocks were considered duplicates. +- Fixed a bug that could lead to incorrect interpretation of the `WHERE` clause for `CREATE MATERIALIZED VIEW` queries with `POPULATE` . +- Fixed a bug in using the `root_path` parameter in the `zookeeper_servers` configuration. +- Fixed unexpected results of passing the `Date` argument to `toStartOfDay` . +- Fixed the `addMonths` and `subtractMonths` functions and the arithmetic for `INTERVAL n MONTH` in cases when the result has the previous year. +- Added missing support for the `UUID` data type for `DISTINCT` , `JOIN` , and `uniq` aggregate functions and external dictionaries (Evgeniy Ivanov). Support for `UUID` is still incomplete. +- Fixed `SummingMergeTree` behavior in cases when the rows summed to zero. +- Various fixes for the `Kafka` engine (Marek Vavruša). +- Fixed incorrect behavior of the `Join` table engine (Amos Bird). +- Fixed incorrect allocator behavior under FreeBSD and OS X. +- The `extractAll` function now supports empty matches. +- Fixed an error that blocked usage of `libressl` instead of `openssl` . +- Fixed the `CREATE TABLE AS SELECT` query from temporary tables. +- Fixed non-atomicity of updating the replication queue. This could lead to replicas being out of sync until the server restarts. +- Fixed possible overflow in `gcd` , `lcm` and `modulo` (`%` operator) (Maks Skorokhod). +- `-preprocessed` files are now created after changing `umask` (`umask` can be changed in the config). +- Fixed a bug in the background check of parts (`MergeTreePartChecker` ) when using a custom partition key. +- Fixed parsing of tuples (values of the `Tuple` data type) in text formats. +- Improved error messages about incompatible types passed to `multiIf` , `array` and some other functions. +- Redesigned support for `Nullable` types. Fixed bugs that may lead to a server crash. Fixed almost all other bugs related to `NULL` support: incorrect type conversions in INSERT SELECT, insufficient support for Nullable in HAVING and PREWHERE, `join_use_nulls` mode, Nullable types as arguments of `OR` operator, etc. +- Fixed various bugs related to internal semantics of data types. Examples: unnecessary summing of `Enum` type fields in `SummingMergeTree` ; alignment of `Enum` types in `Pretty` formats, etc. +- Stricter checks for allowed combinations of composite columns. +- Fixed the overflow when specifying a very large parameter for the `FixedString` data type. +- Fixed a bug in the `topK` aggregate function in a generic case. +- Added the missing check for equality of array sizes in arguments of n-ary variants of aggregate functions with an `-Array` combinator. +- Fixed a bug in `--pager` for `clickhouse-client` (author: ks1322). +- Fixed the precision of the `exp10` function. +- Fixed the behavior of the `visitParamExtract` function for better compliance with documentation. +- Fixed the crash when incorrect data types are specified. +- Fixed the behavior of `DISTINCT` in the case when all columns are constants. +- Fixed query formatting in the case of using the `tupleElement` function with a complex constant expression as the tuple element index. +- Fixed a bug in `Dictionary` tables for `range_hashed` dictionaries. +- Fixed a bug that leads to excessive rows in the result of `FULL` and `RIGHT JOIN` (Amos Bird). +- Fixed a server crash when creating and removing temporary files in `config.d` directories during config reload. +- Fixed the `SYSTEM DROP DNS CACHE` query: the cache was flushed but addresses of cluster nodes were not updated. +- Fixed the behavior of `MATERIALIZED VIEW` after executing `DETACH TABLE` for the table under the view (Marek Vavruša). + +#### Build Improvements: {#build-improvements-4} + +- The `pbuilder` tool is used for builds. The build process is almost completely independent of the build host environment. +- A single build is used for different OS versions. Packages and binaries have been made compatible with a wide range of Linux systems. +- Added the `clickhouse-test` package. It can be used to run functional tests. +- The source tarball can now be published to the repository. It can be used to reproduce the build without using GitHub. +- Added limited integration with Travis CI. Due to limits on build time in Travis, only the debug build is tested and a limited subset of tests are run. +- Added support for `Cap'n'Proto` in the default build. +- Changed the format of documentation sources from `Restricted Text` to `Markdown`. +- Added support for `systemd` (Vladimir Smirnov). It is disabled by default due to incompatibility with some OS images and can be enabled manually. +- For dynamic code generation, `clang` and `lld` are embedded into the `clickhouse` binary. They can also be invoked as `clickhouse clang` and `clickhouse lld` . +- Removed usage of GNU extensions from the code. Enabled the `-Wextra` option. When building with `clang` the default is `libc++` instead of `libstdc++`. +- Extracted `clickhouse_parsers` and `clickhouse_common_io` libraries to speed up builds of various tools. + +#### Backward Incompatible Changes: {#backward-incompatible-changes-11} + +- The format for marks in `Log` type tables that contain `Nullable` columns was changed in a backward incompatible way. If you have these tables, you should convert them to the `TinyLog` type before starting up the new server version. To do this, replace `ENGINE = Log` with `ENGINE = TinyLog` in the corresponding `.sql` file in the `metadata` directory. If your table does not have `Nullable` columns or if the type of your table is not `Log`, then you do not need to do anything. +- Removed the `experimental_allow_extended_storage_definition_syntax` setting. Now this feature is enabled by default. +- The `runningIncome` function was renamed to `runningDifferenceStartingWithFirstvalue` to avoid confusion. +- Removed the `FROM ARRAY JOIN arr` syntax when ARRAY JOIN is specified directly after FROM with no table (Amos Bird). +- Removed the `BlockTabSeparated` format that was used solely for demonstration purposes. +- Changed the state format for aggregate functions `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. If you have stored states of these aggregate functions in tables (using the `AggregateFunction` data type or materialized views with corresponding states), please write to feedback@clickhouse.com. +- In previous server versions there was an undocumented feature: if an aggregate function depends on parameters, you can still specify it without parameters in the AggregateFunction data type. Example: `AggregateFunction(quantiles, UInt64)` instead of `AggregateFunction(quantiles(0.5, 0.9), UInt64)`. This feature was lost. Although it was undocumented, we plan to support it again in future releases. +- Enum data types cannot be used in min/max aggregate functions. This ability will be returned in the next release. + +#### Please Note When Upgrading: {#please-note-when-upgrading} + +- When doing a rolling update on a cluster, at the point when some of the replicas are running the old version of ClickHouse and some are running the new version, replication is temporarily stopped and the message `unknown parameter 'shard'` appears in the log. Replication will continue after all replicas of the cluster are updated. +- If different versions of ClickHouse are running on the cluster servers, it is possible that distributed queries using the following functions will have incorrect results: `varSamp`, `varPop`, `stddevSamp`, `stddevPop`, `covarSamp`, `covarPop`, `corr`. You should update all cluster nodes. + +## [Changelog for 2017](./2017.md) diff --git a/docs/ja/whats-new/changelog/2019.md b/docs/ja/whats-new/changelog/2019.md new file mode 100644 index 00000000000..cd4a2f45ff6 --- /dev/null +++ b/docs/ja/whats-new/changelog/2019.md @@ -0,0 +1,2074 @@ +--- +slug: /ja/whats-new/changelog/2019 +sidebar_position: 15 +sidebar_label: '2019' +title: 2019 Changelog +--- + +## ClickHouse Release 19.17 {#clickhouse-release-v19-17} + +### ClickHouse Release 19.17.6.36, 2019-12-27 {#clickhouse-release-v19-17-6-36-2019-12-27} + +#### Bug Fix {#bug-fix} + +- Fixed potential buffer overflow in decompress. Malicious user can pass fabricated compressed data that could cause read after buffer. This issue was found by Eldar Zaitov from Yandex information security team. [#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed possible server crash (`std::terminate`) when the server cannot send or write data in JSON or XML format with values of String data type (that require UTF-8 validation) or when compressing result data with Brotli algorithm or in some other rare cases. [#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed dictionaries with source from a clickhouse `VIEW`, now reading such dictionaries does not cause the error `There is no query`. [#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed checking if a client host is allowed by host_regexp specified in users.xml. [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241), [#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +- `RENAME TABLE` for a distributed table now renames the folder containing inserted data before sending to shards. This fixes an issue with successive renames `tableA->tableB`, `tableC->tableA`. [#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) +- `range_hashed` external dictionaries created by DDL queries now allow ranges of arbitrary numeric types. [#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) +- Fixed `INSERT INTO table SELECT ... FROM mysql(...)` table function. [#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) +- Fixed segfault in `INSERT INTO TABLE FUNCTION file()` while inserting into a file which does not exist. Now in this case file would be created and then insert would be processed. [#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed bitmapAnd error when intersecting an aggregated bitmap and a scalar bitmap. [#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +- Fixed segfault when `EXISTS` query was used without `TABLE` or `DICTIONARY` qualifier, just like `EXISTS t`. [#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed return type for functions `rand` and `randConstant` in case of nullable argument. Now functions always return `UInt32` and never `Nullable(UInt32)`. [#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed `DROP DICTIONARY IF EXISTS db.dict`, now it does not throw exception if `db` does not exist. [#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +- If a table wasn’t completely dropped because of server crash, the server will try to restore and load it [#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) +- Fixed a trivial count query for a distributed table if there are more than two shard local table. [#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +- Fixed bug that lead to a data race in DB::BlockStreamProfileInfo::calculateRowsBeforeLimit() [#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) +- Fixed `ALTER table MOVE part` executed immediately after merging the specified part, which could cause moving a part which the specified part merged into. Now it correctly moves the specified part. [#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Expressions for dictionaries can be specified as strings now. This is useful for calculation of attributes while extracting data from non-ClickHouse sources because it allows to use non-ClickHouse syntax for those expressions. [#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) +- Fixed a very rare race in `clickhouse-copier` because of an overflow in ZXid. [#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +- Fixed the bug when after the query failed (due to “Too many simultaneous queries” for example) it would not read external tables info, and the + next request would interpret this info as the beginning of the next query causing an error like `Unknown packet from client`. [#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +- Avoid null dereference after “Unknown packet X from server” [#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +- Restore support of all ICU locales, add the ability to apply collations for constant expressions and add language name to system.collations table. [#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) +- Number of streams for read from `StorageFile` and `StorageHDFS` is now limited, to avoid exceeding the memory limit. [#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) +- Fixed `CHECK TABLE` query for `*MergeTree` tables without key. [#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) +- Removed the mutation number from a part name in case there were no mutations. This removing improved the compatibility with older versions. [#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) +- Fixed the bug that mutations are skipped for some attached parts due to their data_version are larger than the table mutation version. [#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) +- Allow starting the server with redundant copies of parts after moving them to another device. [#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed the error “Sizes of columns does not match” that might appear when using aggregate function columns. [#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +- Now an exception will be thrown in case of using WITH TIES alongside LIMIT BY. And now it’s possible to use TOP with LIMIT BY. [#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix dictionary reload if it has `invalidate_query`, which stopped updates and some exception on previous update tries. [#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) + +### ClickHouse Release 19.17.4.11, 2019-11-22 {#clickhouse-release-v19-17-4-11-2019-11-22} + +#### Backward Incompatible Change {#backward-incompatible-change} + +- Using column instead of AST to store scalar subquery results for better performance. Setting `enable_scalar_subquery_optimization` was added in 19.17 and it was enabled by default. It leads to errors like [this](https://github.com/ClickHouse/ClickHouse/issues/7851) during upgrade to 19.17.2 or 19.17.3 from previous versions. This setting was disabled by default in 19.17.4, to make possible upgrading from 19.16 and older versions without errors. [#7392](https://github.com/ClickHouse/ClickHouse/pull/7392) ([Amos Bird](https://github.com/amosbird)) + +#### New Feature {#new-feature} + +- Add the ability to create dictionaries with DDL queries. [#7360](https://github.com/ClickHouse/ClickHouse/pull/7360) ([alesapin](https://github.com/alesapin)) +- Make `bloom_filter` type of index supporting `LowCardinality` and `Nullable` [#7363](https://github.com/ClickHouse/ClickHouse/issues/7363) [#7561](https://github.com/ClickHouse/ClickHouse/pull/7561) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Add function `isValidJSON` to check that passed string is a valid json. [#5910](https://github.com/ClickHouse/ClickHouse/issues/5910) [#7293](https://github.com/ClickHouse/ClickHouse/pull/7293) ([Vdimir](https://github.com/Vdimir)) +- Implement `arrayCompact` function [#7328](https://github.com/ClickHouse/ClickHouse/pull/7328) ([Memo](https://github.com/Joeywzr)) +- Created function `hex` for Decimal numbers. It works like `hex(reinterpretAsString())`, but does not delete last zero bytes. [#7355](https://github.com/ClickHouse/ClickHouse/pull/7355) ([Mikhail Korotov](https://github.com/millb)) +- Add `arrayFill` and `arrayReverseFill` functions, which replace elements by other elements in front/back of them in the array. [#7380](https://github.com/ClickHouse/ClickHouse/pull/7380) ([hcz](https://github.com/hczhcz)) +- Add `CRC32IEEE()`/`CRC64()` support [#7480](https://github.com/ClickHouse/ClickHouse/pull/7480) ([Azat Khuzhin](https://github.com/azat)) +- Implement `char` function similar to one in [mysql](https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_char) [#7486](https://github.com/ClickHouse/ClickHouse/pull/7486) ([sundyli](https://github.com/sundy-li)) +- Add `bitmapTransform` function. It transforms an array of values in a bitmap to another array of values, the result is a new bitmap [#7598](https://github.com/ClickHouse/ClickHouse/pull/7598) ([Zhichang Yu](https://github.com/yuzhichang)) +- Implemented `javaHashUTF16LE()` function [#7651](https://github.com/ClickHouse/ClickHouse/pull/7651) ([achimbab](https://github.com/achimbab)) +- Add `_shard_num` virtual column for the Distributed engine [#7624](https://github.com/ClickHouse/ClickHouse/pull/7624) ([Azat Khuzhin](https://github.com/azat)) + +#### Experimental Feature {#experimental-feature} + +- Support for processors (new query execution pipeline) in `MergeTree`. [#7181](https://github.com/ClickHouse/ClickHouse/pull/7181) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Bug Fix {#bug-fix-1} + +- Fix incorrect float parsing in `Values` [#7817](https://github.com/ClickHouse/ClickHouse/issues/7817) [#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) +- Fix rare deadlock which can happen when trace_log is enabled. [#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +- Prevent message duplication when producing Kafka table has any MVs selecting from it [#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) +- Support for `Array(LowCardinality(Nullable(String)))` in `IN`. Resolves [#7364](https://github.com/ClickHouse/ClickHouse/issues/7364) [#7366](https://github.com/ClickHouse/ClickHouse/pull/7366) ([achimbab](https://github.com/achimbab)) +- Add handling of `SQL_TINYINT` and `SQL_BIGINT`, and fix handling of `SQL_FLOAT` data source types in ODBC Bridge. [#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) +- Fix aggregation (`avg` and quantiles) over empty decimal columns [#7431](https://github.com/ClickHouse/ClickHouse/pull/7431) ([Andrey Konyaev](https://github.com/akonyaev90)) +- Fix `INSERT` into Distributed with `MATERIALIZED` columns [#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) +- Make `MOVE PARTITION` work if some parts of partition are already on destination disk or volume [#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed bug with hardlinks failing to be created during mutations in `ReplicatedMergeTree` in multi-disk configurations. [#7558](https://github.com/ClickHouse/ClickHouse/pull/7558) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed a bug with a mutation on a MergeTree when whole part remains unchanged and best space is being found on another disk [#7602](https://github.com/ClickHouse/ClickHouse/pull/7602) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed bug with `keep_free_space_ratio` not being read from disks configuration [#7645](https://github.com/ClickHouse/ClickHouse/pull/7645) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix bug with table contains only `Tuple` columns or columns with complex paths. Fixes [7541](https://github.com/ClickHouse/ClickHouse/issues/7541). [#7545](https://github.com/ClickHouse/ClickHouse/pull/7545) ([alesapin](https://github.com/alesapin)) +- Do not account memory for Buffer engine in max_memory_usage limit [#7552](https://github.com/ClickHouse/ClickHouse/pull/7552) ([Azat Khuzhin](https://github.com/azat)) +- Fix final mark usage in `MergeTree` tables ordered by `tuple()`. In rare cases it could lead to `Can't adjust last granule` error while select. [#7639](https://github.com/ClickHouse/ClickHouse/pull/7639) ([Anton Popov](https://github.com/CurtizJ)) +- Fix bug in mutations that have predicate with actions that require context (for example functions for json), which may lead to crashes or strange exceptions. [#7664](https://github.com/ClickHouse/ClickHouse/pull/7664) ([alesapin](https://github.com/alesapin)) +- Fix mismatch of database and table names escaping in `data/` and `shadow/` directories [#7575](https://github.com/ClickHouse/ClickHouse/pull/7575) ([Alexander Burmak](https://github.com/Alex-Burmak)) +- Support duplicated keys in RIGHT\|FULL JOINs, e.g. `ON t.x = u.x AND t.x = u.y`. Fix crash in this case. [#7586](https://github.com/ClickHouse/ClickHouse/pull/7586) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix `Not found column in block` when joining on expression with RIGHT or FULL JOIN. [#7641](https://github.com/ClickHouse/ClickHouse/pull/7641) ([Artem Zuikov](https://github.com/4ertus2)) +- One more attempt to fix infinite loop in `PrettySpace` format [#7591](https://github.com/ClickHouse/ClickHouse/pull/7591) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fix bug in `concat` function when all arguments were `FixedString` of the same size. [#7635](https://github.com/ClickHouse/ClickHouse/pull/7635) ([alesapin](https://github.com/alesapin)) +- Fixed exception in case of using 1 argument while defining S3, URL and HDFS storages. [#7618](https://github.com/ClickHouse/ClickHouse/pull/7618) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fix scope of the InterpreterSelectQuery for views with query [#7601](https://github.com/ClickHouse/ClickHouse/pull/7601) ([Azat Khuzhin](https://github.com/azat)) + +#### Improvement {#improvement} + +- `Nullable` columns recognized and NULL-values handled correctly by ODBC-bridge [#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) +- Write current batch for distributed send atomically [#7600](https://github.com/ClickHouse/ClickHouse/pull/7600) ([Azat Khuzhin](https://github.com/azat)) +- Throw an exception if we cannot detect table for column name in query. [#7358](https://github.com/ClickHouse/ClickHouse/pull/7358) ([Artem Zuikov](https://github.com/4ertus2)) +- Add `merge_max_block_size` setting to `MergeTreeSettings` [#7412](https://github.com/ClickHouse/ClickHouse/pull/7412) ([Artem Zuikov](https://github.com/4ertus2)) +- Queries with `HAVING` and without `GROUP BY` assume group by constant. So, `SELECT 1 HAVING 1` now returns a result. [#7496](https://github.com/ClickHouse/ClickHouse/pull/7496) ([Amos Bird](https://github.com/amosbird)) +- Support parsing `(X,)` as tuple similar to python. [#7501](https://github.com/ClickHouse/ClickHouse/pull/7501), [#7562](https://github.com/ClickHouse/ClickHouse/pull/7562) ([Amos Bird](https://github.com/amosbird)) +- Make `range` function behaviors almost like pythonic one. [#7518](https://github.com/ClickHouse/ClickHouse/pull/7518) ([sundyli](https://github.com/sundy-li)) +- Add `constraints` columns to table `system.settings` [#7553](https://github.com/ClickHouse/ClickHouse/pull/7553) ([Vitaly Baranov](https://github.com/vitlibar)) +- Better Null format for tcp handler, so that it’s possible to use `select ignore() from table format Null` for perf measure via clickhouse-client [#7606](https://github.com/ClickHouse/ClickHouse/pull/7606) ([Amos Bird](https://github.com/amosbird)) +- Queries like `CREATE TABLE ... AS (SELECT (1, 2))` are parsed correctly [#7542](https://github.com/ClickHouse/ClickHouse/pull/7542) ([hcz](https://github.com/hczhcz)) + +#### Performance Improvement {#performance-improvement} + +- The performance of aggregation over short string keys is improved. [#6243](https://github.com/ClickHouse/ClickHouse/pull/6243) ([Alexander Kuzmenkov](https://github.com/akuzm), [Amos Bird](https://github.com/amosbird)) +- Run another pass of syntax/expression analysis to get potential optimizations after constant predicates are folded. [#7497](https://github.com/ClickHouse/ClickHouse/pull/7497) ([Amos Bird](https://github.com/amosbird)) +- Use storage meta info to evaluate trivial `SELECT count() FROM table;` [#7510](https://github.com/ClickHouse/ClickHouse/pull/7510) ([Amos Bird](https://github.com/amosbird), [alexey-milovidov](https://github.com/alexey-milovidov)) +- Vectorize processing `arrayReduce` similar to Aggregator `addBatch`. [#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Bird](https://github.com/amosbird)) +- Minor improvements in performance of `Kafka` consumption [#7475](https://github.com/ClickHouse/ClickHouse/pull/7475) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement} + +- Add support for cross-compiling to the CPU architecture AARCH64. Refactor packager script. [#7370](https://github.com/ClickHouse/ClickHouse/pull/7370) [#7539](https://github.com/ClickHouse/ClickHouse/pull/7539) ([Ivan](https://github.com/abyss7)) +- Unpack darwin-x86_64 and linux-aarch64 toolchains into mounted Docker volume when building packages [#7534](https://github.com/ClickHouse/ClickHouse/pull/7534) ([Ivan](https://github.com/abyss7)) +- Update Docker Image for Binary Packager [#7474](https://github.com/ClickHouse/ClickHouse/pull/7474) ([Ivan](https://github.com/abyss7)) +- Fixed compile errors on macOS Catalina [#7585](https://github.com/ClickHouse/ClickHouse/pull/7585) ([Ernest Poletaev](https://github.com/ernestp)) +- Some refactoring in query analysis logic: split complex class into several simple ones. [#7454](https://github.com/ClickHouse/ClickHouse/pull/7454) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix build without submodules [#7295](https://github.com/ClickHouse/ClickHouse/pull/7295) ([proller](https://github.com/proller)) +- Better `add_globs` in CMake files [#7418](https://github.com/ClickHouse/ClickHouse/pull/7418) ([Amos Bird](https://github.com/amosbird)) +- Remove hardcoded paths in `unwind` target [#7460](https://github.com/ClickHouse/ClickHouse/pull/7460) ([Konstantin Podshumok](https://github.com/podshumok)) +- Allow to use mysql format without ssl [#7524](https://github.com/ClickHouse/ClickHouse/pull/7524) ([proller](https://github.com/proller)) + +#### Other {#other} + +- Added ANTLR4 grammar for ClickHouse SQL dialect [#7595](https://github.com/ClickHouse/ClickHouse/issues/7595) [#7596](https://github.com/ClickHouse/ClickHouse/pull/7596) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse Release 19.16 {#clickhouse-release-v19-16} + +#### ClickHouse Release 19.16.14.65, 2020-03-25 {#clickhouse-release-v19-16-14-65-2020-03-25} + +- Fixed up a bug in batched calculations of ternary logical OPs on multiple arguments (more than 10). [#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) This bugfix was backported to version 19.16 by a special request from Altinity. + +#### ClickHouse Release 19.16.14.65, 2020-03-05 {#clickhouse-release-v19-16-14-65-2020-03-05} + +- Fix distributed subqueries incompatibility with older CH versions. Fixes [#7851](https://github.com/ClickHouse/ClickHouse/issues/7851) + [(tabplubix)](https://github.com/tavplubix) +- When executing `CREATE` query, fold constant expressions in storage engine arguments. Replace empty database name with current database. Fixes [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). Also fix check for local address in `ClickHouseDictionarySource`. + [#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +- Now background merges in `*MergeTree` table engines family preserve storage policy volume order more accurately. + [#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Prevent losing data in `Kafka` in rare cases when exception happens after reading suffix but before commit. Fixes [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Related: [#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) + [#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +- Fix bug leading to server termination when trying to use / drop `Kafka` table created with wrong parameters. Fixes [#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporates [#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). + [#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) +- Allow using `MaterializedView` with subqueries above `Kafka` tables. + [#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) + +#### New Feature {#new-feature-1} + +- Add `deduplicate_blocks_in_dependent_materialized_views` option to control the behaviour of idempotent inserts into tables with materialized views. This new feature was added to the bugfix release by a special request from Altinity. + [#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### ClickHouse Release 19.16.2.2, 2019-10-30 {#clickhouse-release-v19-16-2-2-2019-10-30} + +#### Backward Incompatible Change {#backward-incompatible-change-1} + +- Add missing arity validation for count/counIf. + [#7095](https://github.com/ClickHouse/ClickHouse/issues/7095) + [#7298](https://github.com/ClickHouse/ClickHouse/pull/7298) ([Vdimir](https://github.com/Vdimir)) +- Remove legacy `asterisk_left_columns_only` setting (it was disabled by default). + [#7335](https://github.com/ClickHouse/ClickHouse/pull/7335) ([Artem + Zuikov](https://github.com/4ertus2)) +- Format strings for Template data format are now specified in files. + [#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) + ([tavplubix](https://github.com/tavplubix)) + +#### New Feature {#new-feature-2} + +- Introduce uniqCombined64() to calculate cardinality greater than UINT_MAX. + [#7213](https://github.com/ClickHouse/ClickHouse/pull/7213), + [#7222](https://github.com/ClickHouse/ClickHouse/pull/7222) ([Azat + Khuzhin](https://github.com/azat)) +- Support Bloom filter indexes on Array columns. + [#6984](https://github.com/ClickHouse/ClickHouse/pull/6984) + ([achimbab](https://github.com/achimbab)) +- Add a function `getMacro(name)` that returns String with the value of corresponding `` + from server configuration. [#7240](https://github.com/ClickHouse/ClickHouse/pull/7240) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Set two configuration options for a dictionary based on an HTTP source: `credentials` and + `http-headers`. [#7092](https://github.com/ClickHouse/ClickHouse/pull/7092) ([Guillaume + Tassery](https://github.com/YiuRULE)) +- Add a new ProfileEvent `Merge` that counts the number of launched background merges. + [#7093](https://github.com/ClickHouse/ClickHouse/pull/7093) ([Mikhail + Korotov](https://github.com/millb)) +- Add fullHostName function that returns a fully qualified domain name. + [#7263](https://github.com/ClickHouse/ClickHouse/issues/7263) + [#7291](https://github.com/ClickHouse/ClickHouse/pull/7291) ([sundyli](https://github.com/sundy-li)) +- Add function `arraySplit` and `arrayReverseSplit` which split an array by “cut off” + conditions. They are useful in time sequence handling. + [#7294](https://github.com/ClickHouse/ClickHouse/pull/7294) ([hcz](https://github.com/hczhcz)) +- Add new functions that return the Array of all matched indices in multiMatch family of functions. + [#7299](https://github.com/ClickHouse/ClickHouse/pull/7299) ([Danila + Kutenin](https://github.com/danlark1)) +- Add a new database engine `Lazy` that is optimized for storing a large number of small -Log + tables. [#7171](https://github.com/ClickHouse/ClickHouse/pull/7171) ([Nikita + Vasilev](https://github.com/nikvas0)) +- Add aggregate functions groupBitmapAnd, -Or, -Xor for bitmap columns. [#7109](https://github.com/ClickHouse/ClickHouse/pull/7109) ([Zhichang + Yu](https://github.com/yuzhichang)) +- Add aggregate function combinators -OrNull and -OrDefault, which return null + or default values when there is nothing to aggregate. + [#7331](https://github.com/ClickHouse/ClickHouse/pull/7331) + ([hcz](https://github.com/hczhcz)) +- Introduce CustomSeparated data format that supports custom escaping and + delimiter rules. [#7118](https://github.com/ClickHouse/ClickHouse/pull/7118) + ([tavplubix](https://github.com/tavplubix)) +- Support Redis as source of external dictionary. [#4361](https://github.com/ClickHouse/ClickHouse/pull/4361) [#6962](https://github.com/ClickHouse/ClickHouse/pull/6962) ([comunodi](https://github.com/comunodi), [Anton + Popov](https://github.com/CurtizJ)) + +#### Bug Fix {#bug-fix-2} + +- Fix wrong query result if it has `WHERE IN (SELECT ...)` section and `optimize_read_in_order` is + used. [#7371](https://github.com/ClickHouse/ClickHouse/pull/7371) ([Anton + Popov](https://github.com/CurtizJ)) +- Disabled MariaDB authentication plugin, which depends on files outside of project. + [#7140](https://github.com/ClickHouse/ClickHouse/pull/7140) ([Yuriy + Baranov](https://github.com/yurriy)) +- Fix exception `Cannot convert column ... because it is constant but values of constants are different in source and result` which could rarely happen when functions `now()`, `today()`, + `yesterday()`, `randConstant()` are used. + [#7156](https://github.com/ClickHouse/ClickHouse/pull/7156) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Fixed issue of using HTTP keep alive timeout instead of TCP keep alive timeout. + [#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily + Nemkov](https://github.com/Enmk)) +- Fixed a segmentation fault in groupBitmapOr (issue [#7109](https://github.com/ClickHouse/ClickHouse/issues/7109)). + [#7289](https://github.com/ClickHouse/ClickHouse/pull/7289) ([Zhichang + Yu](https://github.com/yuzhichang)) +- For materialized views the commit for Kafka is called after all data were written. + [#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) +- Fixed wrong `duration_ms` value in `system.part_log` table. It was ten times off. + [#7172](https://github.com/ClickHouse/ClickHouse/pull/7172) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- A quick fix to resolve crash in LIVE VIEW table and re-enabling all LIVE VIEW tests. + [#7201](https://github.com/ClickHouse/ClickHouse/pull/7201) + ([vzakaznikov](https://github.com/vzakaznikov)) +- Serialize NULL values correctly in min/max indexes of MergeTree parts. + [#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Don’t put virtual columns to .sql metadata when table is created as `CREATE TABLE AS`. + [#7183](https://github.com/ClickHouse/ClickHouse/pull/7183) ([Ivan](https://github.com/abyss7)) +- Fix segmentation fault in `ATTACH PART` query. + [#7185](https://github.com/ClickHouse/ClickHouse/pull/7185) + ([alesapin](https://github.com/alesapin)) +- Fix wrong result for some queries given by the optimization of empty IN subqueries and empty + INNER/RIGHT JOIN. [#7284](https://github.com/ClickHouse/ClickHouse/pull/7284) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Fixing AddressSanitizer error in the LIVE VIEW getHeader() method. + [#7271](https://github.com/ClickHouse/ClickHouse/pull/7271) + ([vzakaznikov](https://github.com/vzakaznikov)) + +#### Improvement {#improvement-1} + +- Add a message in case of queue_wait_max_ms wait takes place. + [#7390](https://github.com/ClickHouse/ClickHouse/pull/7390) ([Azat + Khuzhin](https://github.com/azat)) +- Made setting `s3_min_upload_part_size` table-level. + [#7059](https://github.com/ClickHouse/ClickHouse/pull/7059) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Check TTL in StorageFactory. [#7304](https://github.com/ClickHouse/ClickHouse/pull/7304) + ([sundyli](https://github.com/sundy-li)) +- Squash left-hand blocks in partial merge join (optimization). + [#7122](https://github.com/ClickHouse/ClickHouse/pull/7122) ([Artem + Zuikov](https://github.com/4ertus2)) +- Do not allow non-deterministic functions in mutations of Replicated table engines, because this + can introduce inconsistencies between replicas. + [#7247](https://github.com/ClickHouse/ClickHouse/pull/7247) ([Alexander + Kazakov](https://github.com/Akazz)) +- Disable memory tracker while converting exception stack trace to string. It can prevent the loss + of error messages of type `Memory limit exceeded` on server, which caused the `Attempt to read after eof` exception on client. [#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) + ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Miscellaneous format improvements. Resolves + [#6033](https://github.com/ClickHouse/ClickHouse/issues/6033), + [#2633](https://github.com/ClickHouse/ClickHouse/issues/2633), + [#6611](https://github.com/ClickHouse/ClickHouse/issues/6611), + [#6742](https://github.com/ClickHouse/ClickHouse/issues/6742) + [#7215](https://github.com/ClickHouse/ClickHouse/pull/7215) + ([tavplubix](https://github.com/tavplubix)) +- ClickHouse ignores values on the right side of IN operator that are not convertible to the left + side type. Make it work properly for compound types – Array and Tuple. + [#7283](https://github.com/ClickHouse/ClickHouse/pull/7283) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Support missing inequalities for ASOF JOIN. It’s possible to join less-or-equal variant and strict + greater and less variants for ASOF column in ON syntax. + [#7282](https://github.com/ClickHouse/ClickHouse/pull/7282) ([Artem + Zuikov](https://github.com/4ertus2)) +- Optimize partial merge join. [#7070](https://github.com/ClickHouse/ClickHouse/pull/7070) + ([Artem Zuikov](https://github.com/4ertus2)) +- Do not use more than 98K of memory in uniqCombined functions. + [#7236](https://github.com/ClickHouse/ClickHouse/pull/7236), + [#7270](https://github.com/ClickHouse/ClickHouse/pull/7270) ([Azat + Khuzhin](https://github.com/azat)) +- Flush parts of right-hand joining table on disk in PartialMergeJoin (if there is not enough + memory). Load data back when needed. [#7186](https://github.com/ClickHouse/ClickHouse/pull/7186) + ([Artem Zuikov](https://github.com/4ertus2)) + +#### Performance Improvement {#performance-improvement-1} + +- Speed up joinGet with const arguments by avoiding data duplication. + [#7359](https://github.com/ClickHouse/ClickHouse/pull/7359) ([Amos + Bird](https://github.com/amosbird)) +- Return early if the subquery is empty. + [#7007](https://github.com/ClickHouse/ClickHouse/pull/7007) ([小路](https://github.com/nicelulu)) +- Optimize parsing of SQL expression in Values. + [#6781](https://github.com/ClickHouse/ClickHouse/pull/6781) + ([tavplubix](https://github.com/tavplubix)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-1} + +- Disable some contribs for cross-compilation to Mac OS. + [#7101](https://github.com/ClickHouse/ClickHouse/pull/7101) ([Ivan](https://github.com/abyss7)) +- Add missing linking with PocoXML for clickhouse_common_io. + [#7200](https://github.com/ClickHouse/ClickHouse/pull/7200) ([Azat + Khuzhin](https://github.com/azat)) +- Accept multiple test filter arguments in clickhouse-test. + [#7226](https://github.com/ClickHouse/ClickHouse/pull/7226) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Enable musl and jemalloc for ARM. [#7300](https://github.com/ClickHouse/ClickHouse/pull/7300) + ([Amos Bird](https://github.com/amosbird)) +- Added `--client-option` parameter to `clickhouse-test` to pass additional parameters to client. + [#7277](https://github.com/ClickHouse/ClickHouse/pull/7277) ([Nikolai + Kochetov](https://github.com/KochetovNicolai)) +- Preserve existing configs on rpm package upgrade. + [#7103](https://github.com/ClickHouse/ClickHouse/pull/7103) + ([filimonov](https://github.com/filimonov)) +- Fix errors detected by PVS. [#7153](https://github.com/ClickHouse/ClickHouse/pull/7153) ([Artem + Zuikov](https://github.com/4ertus2)) +- Fix build for Darwin. [#7149](https://github.com/ClickHouse/ClickHouse/pull/7149) + ([Ivan](https://github.com/abyss7)) +- glibc 2.29 compatibility. [#7142](https://github.com/ClickHouse/ClickHouse/pull/7142) ([Amos + Bird](https://github.com/amosbird)) +- Make sure dh_clean does not touch potential source files. + [#7205](https://github.com/ClickHouse/ClickHouse/pull/7205) ([Amos + Bird](https://github.com/amosbird)) +- Attempt to avoid conflict when updating from altinity rpm - it has config file packaged separately + in clickhouse-server-common. [#7073](https://github.com/ClickHouse/ClickHouse/pull/7073) + ([filimonov](https://github.com/filimonov)) +- Optimize some header files for faster rebuilds. + [#7212](https://github.com/ClickHouse/ClickHouse/pull/7212), + [#7231](https://github.com/ClickHouse/ClickHouse/pull/7231) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Add performance tests for Date and DateTime. [#7332](https://github.com/ClickHouse/ClickHouse/pull/7332) ([Vasily + Nemkov](https://github.com/Enmk)) +- Fix some tests that contained non-deterministic mutations. + [#7132](https://github.com/ClickHouse/ClickHouse/pull/7132) ([Alexander + Kazakov](https://github.com/Akazz)) +- Add build with MemorySanitizer to CI. [#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) + ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Avoid use of uninitialized values in MetricsTransmitter. + [#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat + Khuzhin](https://github.com/azat)) +- Fix some issues in Fields found by MemorySanitizer. + [#7135](https://github.com/ClickHouse/ClickHouse/pull/7135), + [#7179](https://github.com/ClickHouse/ClickHouse/pull/7179) ([Alexander + Kuzmenkov](https://github.com/akuzm)), [#7376](https://github.com/ClickHouse/ClickHouse/pull/7376) + ([Amos Bird](https://github.com/amosbird)) +- Fix undefined behavior in murmurhash32. [#7388](https://github.com/ClickHouse/ClickHouse/pull/7388) ([Amos + Bird](https://github.com/amosbird)) +- Fix undefined behavior in StoragesInfoStream. [#7384](https://github.com/ClickHouse/ClickHouse/pull/7384) + ([tavplubix](https://github.com/tavplubix)) +- Fixed constant expressions folding for external database engines (MySQL, ODBC, JDBC). In previous + versions it wasn’t working for multiple constant expressions and was not working at all for Date, + DateTime and UUID. This fixes [#7245](https://github.com/ClickHouse/ClickHouse/issues/7245) + [#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixing ThreadSanitizer data race error in the LIVE VIEW when accessing no_users_thread variable. + [#7353](https://github.com/ClickHouse/ClickHouse/pull/7353) + ([vzakaznikov](https://github.com/vzakaznikov)) +- Get rid of malloc symbols in libcommon + [#7134](https://github.com/ClickHouse/ClickHouse/pull/7134), + [#7065](https://github.com/ClickHouse/ClickHouse/pull/7065) ([Amos + Bird](https://github.com/amosbird)) +- Add global flag ENABLE_LIBRARIES for disabling all libraries. + [#7063](https://github.com/ClickHouse/ClickHouse/pull/7063) + ([proller](https://github.com/proller)) + +#### Code Cleanup {#code-cleanup} + +- Generalize configuration repository to prepare for DDL for Dictionaries. [#7155](https://github.com/ClickHouse/ClickHouse/pull/7155) + ([alesapin](https://github.com/alesapin)) +- Parser for dictionaries DDL without any semantic. + [#7209](https://github.com/ClickHouse/ClickHouse/pull/7209) + ([alesapin](https://github.com/alesapin)) +- Split ParserCreateQuery into different smaller parsers. + [#7253](https://github.com/ClickHouse/ClickHouse/pull/7253) + ([alesapin](https://github.com/alesapin)) +- Small refactoring and renaming near external dictionaries. + [#7111](https://github.com/ClickHouse/ClickHouse/pull/7111) + ([alesapin](https://github.com/alesapin)) +- Refactor some code to prepare for role-based access control. [#7235](https://github.com/ClickHouse/ClickHouse/pull/7235) ([Vitaly + Baranov](https://github.com/vitlibar)) +- Some improvements in DatabaseOrdinary code. + [#7086](https://github.com/ClickHouse/ClickHouse/pull/7086) ([Nikita + Vasilev](https://github.com/nikvas0)) +- Do not use iterators in find() and emplace() methods of hash tables. + [#7026](https://github.com/ClickHouse/ClickHouse/pull/7026) ([Alexander + Kuzmenkov](https://github.com/akuzm)) +- Fix getMultipleValuesFromConfig in case when parameter root is not empty. [#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) + ([Mikhail Korotov](https://github.com/millb)) +- Remove some copy-paste (TemporaryFile and TemporaryFileStream) + [#7166](https://github.com/ClickHouse/ClickHouse/pull/7166) ([Artem + Zuikov](https://github.com/4ertus2)) +- Improved code readability a little bit (`MergeTreeData::getActiveContainingPart`). + [#7361](https://github.com/ClickHouse/ClickHouse/pull/7361) ([Vladimir + Chebotarev](https://github.com/excitoon)) +- Wait for all scheduled jobs, which are using local objects, if `ThreadPool::schedule(...)` throws + an exception. Rename `ThreadPool::schedule(...)` to `ThreadPool::scheduleOrThrowOnError(...)` and + fix comments to make obvious that it may throw. + [#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) + ([tavplubix](https://github.com/tavplubix)) + +## ClickHouse Release 19.15 {#clickhouse-release-19-15} + +### ClickHouse Release 19.15.4.10, 2019-10-31 {#clickhouse-release-19-15-4-10-2019-10-31} + +#### Bug Fix {#bug-fix-3} + +- Added handling of SQL_TINYINT and SQL_BIGINT, and fix handling of SQL_FLOAT data source types in ODBC Bridge. + [#7491](https://github.com/ClickHouse/ClickHouse/pull/7491) ([Denis Glazachev](https://github.com/traceon)) +- Allowed to have some parts on destination disk or volume in MOVE PARTITION. + [#7434](https://github.com/ClickHouse/ClickHouse/pull/7434) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixed NULL-values in nullable columns through ODBC-bridge. + [#7402](https://github.com/ClickHouse/ClickHouse/pull/7402) ([Vasily Nemkov](https://github.com/Enmk)) +- Fixed INSERT into Distributed non local node with MATERIALIZED columns. + [#7377](https://github.com/ClickHouse/ClickHouse/pull/7377) ([Azat Khuzhin](https://github.com/azat)) +- Fixed function getMultipleValuesFromConfig. + [#7374](https://github.com/ClickHouse/ClickHouse/pull/7374) ([Mikhail Korotov](https://github.com/millb)) +- Fixed issue of using HTTP keep alive timeout instead of TCP keep alive timeout. + [#7351](https://github.com/ClickHouse/ClickHouse/pull/7351) ([Vasily Nemkov](https://github.com/Enmk)) +- Wait for all jobs to finish on exception (fixes rare segfaults). + [#7350](https://github.com/ClickHouse/ClickHouse/pull/7350) ([tavplubix](https://github.com/tavplubix)) +- Don’t push to MVs when inserting into Kafka table. + [#7265](https://github.com/ClickHouse/ClickHouse/pull/7265) ([Ivan](https://github.com/abyss7)) +- Disable memory tracker for exception stack. + [#7264](https://github.com/ClickHouse/ClickHouse/pull/7264) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed bad code in transforming query for external database. + [#7252](https://github.com/ClickHouse/ClickHouse/pull/7252) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid use of uninitialized values in MetricsTransmitter. + [#7158](https://github.com/ClickHouse/ClickHouse/pull/7158) ([Azat Khuzhin](https://github.com/azat)) +- Added example config with macros for tests ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.15.3.6, 2019-10-09 {#clickhouse-release-19-15-3-6-2019-10-09} + +#### Bug Fix {#bug-fix-4} + +- Fixed bad_variant in hashed dictionary. + ([alesapin](https://github.com/alesapin)) +- Fixed up bug with segmentation fault in ATTACH PART query. + ([alesapin](https://github.com/alesapin)) +- Fixed time calculation in `MergeTreeData`. + ([Vladimir Chebotarev](https://github.com/excitoon)) +- Commit to Kafka explicitly after the writing is finalized. + [#7175](https://github.com/ClickHouse/ClickHouse/pull/7175) ([Ivan](https://github.com/abyss7)) +- Serialize NULL values correctly in min/max indexes of MergeTree parts. + [#7234](https://github.com/ClickHouse/ClickHouse/pull/7234) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +### ClickHouse Release 19.15.2.2, 2019-10-01 {#clickhouse-release-19-15-2-2-2019-10-01} + +#### New Feature {#new-feature-3} + +- Tiered storage: support to use multiple storage volumes for tables with MergeTree engine. It’s possible to store fresh data on SSD and automatically move old data to HDD. ([example](https://clickhouse.github.io/clickhouse-presentations/meetup30/new_features/#12)). [#4918](https://github.com/ClickHouse/ClickHouse/pull/4918) ([Igr](https://github.com/ObjatieGroba)) [#6489](https://github.com/ClickHouse/ClickHouse/pull/6489) ([alesapin](https://github.com/alesapin)) +- Add table function `input` for reading incoming data in `INSERT SELECT` query. [#5450](https://github.com/ClickHouse/ClickHouse/pull/5450) ([palasonic1](https://github.com/palasonic1)) [#6832](https://github.com/ClickHouse/ClickHouse/pull/6832) ([Anton Popov](https://github.com/CurtizJ)) +- Add a `sparse_hashed` dictionary layout, that is functionally equivalent to the `hashed` layout, but is more memory efficient. It uses about twice as less memory at the cost of slower value retrieval. [#6894](https://github.com/ClickHouse/ClickHouse/pull/6894) ([Azat Khuzhin](https://github.com/azat)) +- Implement ability to define list of users for access to dictionaries. Only current connected database using. [#6907](https://github.com/ClickHouse/ClickHouse/pull/6907) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Add `LIMIT` option to `SHOW` query. [#6944](https://github.com/ClickHouse/ClickHouse/pull/6944) ([Philipp Malkovsky](https://github.com/malkfilipp)) +- Add `bitmapSubsetLimit(bitmap, range_start, limit)` function, that returns subset of the smallest `limit` values in set that is no smaller than `range_start`. [#6957](https://github.com/ClickHouse/ClickHouse/pull/6957) ([Zhichang Yu](https://github.com/yuzhichang)) +- Add `bitmapMin` and `bitmapMax` functions. [#6970](https://github.com/ClickHouse/ClickHouse/pull/6970) ([Zhichang Yu](https://github.com/yuzhichang)) +- Add function `repeat` related to [issue-6648](https://github.com/ClickHouse/ClickHouse/issues/6648) [#6999](https://github.com/ClickHouse/ClickHouse/pull/6999) ([flynn](https://github.com/ucasFL)) + +#### Experimental Feature {#experimental-feature-1} + +- Implement (in memory) Merge Join variant that does not change current pipeline. Result is partially sorted by merge key. Set `partial_merge_join = 1` to use this feature. The Merge Join is still in development. [#6940](https://github.com/ClickHouse/ClickHouse/pull/6940) ([Artem Zuikov](https://github.com/4ertus2)) +- Add `S3` engine and table function. It is still in development (no authentication support yet). [#5596](https://github.com/ClickHouse/ClickHouse/pull/5596) ([Vladimir Chebotarev](https://github.com/excitoon)) + +#### Improvement {#improvement-2} + +- Every message read from Kafka is inserted atomically. This resolves almost all known issues with Kafka engine. [#6950](https://github.com/ClickHouse/ClickHouse/pull/6950) ([Ivan](https://github.com/abyss7)) +- Improvements for failover of Distributed queries. Shorten recovery time, also it is now configurable and can be seen in `system.clusters`. [#6399](https://github.com/ClickHouse/ClickHouse/pull/6399) ([Vasily Nemkov](https://github.com/Enmk)) +- Support numeric values for Enums directly in `IN` section. #6766 [#6941](https://github.com/ClickHouse/ClickHouse/pull/6941) ([dimarub2000](https://github.com/dimarub2000)) +- Support (optional, disabled by default) redirects on URL storage. [#6914](https://github.com/ClickHouse/ClickHouse/pull/6914) ([maqroll](https://github.com/maqroll)) +- Add information message when client with an older version connects to a server. [#6893](https://github.com/ClickHouse/ClickHouse/pull/6893) ([Philipp Malkovsky](https://github.com/malkfilipp)) +- Remove maximum backoff sleep time limit for sending data in Distributed tables [#6895](https://github.com/ClickHouse/ClickHouse/pull/6895) ([Azat Khuzhin](https://github.com/azat)) +- Add ability to send profile events (counters) with cumulative values to graphite. It can be enabled under `` in server `config.xml`. [#6969](https://github.com/ClickHouse/ClickHouse/pull/6969) ([Azat Khuzhin](https://github.com/azat)) +- Add automatically cast type `T` to `LowCardinality(T)` while inserting data in column of type `LowCardinality(T)` in Native format via HTTP. [#6891](https://github.com/ClickHouse/ClickHouse/pull/6891) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Add ability to use function `hex` without using `reinterpretAsString` for `Float32`, `Float64`. [#7024](https://github.com/ClickHouse/ClickHouse/pull/7024) ([Mikhail Korotov](https://github.com/millb)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-2} + +- Add gdb-index to clickhouse binary with debug info. It will speed up startup time of `gdb`. [#6947](https://github.com/ClickHouse/ClickHouse/pull/6947) ([alesapin](https://github.com/alesapin)) +- Speed up deb packaging with patched dpkg-deb which uses `pigz`. [#6960](https://github.com/ClickHouse/ClickHouse/pull/6960) ([alesapin](https://github.com/alesapin)) +- Set `enable_fuzzing = 1` to enable libfuzzer instrumentation of all the project code. [#7042](https://github.com/ClickHouse/ClickHouse/pull/7042) ([kyprizel](https://github.com/kyprizel)) +- Add split build smoke test in CI. [#7061](https://github.com/ClickHouse/ClickHouse/pull/7061) ([alesapin](https://github.com/alesapin)) +- Add build with MemorySanitizer to CI. [#7066](https://github.com/ClickHouse/ClickHouse/pull/7066) ([Alexander Kuzmenkov](https://github.com/akuzm)) +- Replace `libsparsehash` with `sparsehash-c11` [#6965](https://github.com/ClickHouse/ClickHouse/pull/6965) ([Azat Khuzhin](https://github.com/azat)) + +#### Bug Fix {#bug-fix-5} + +- Fixed performance degradation of index analysis on complex keys on large tables. This fixes #6924. [#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix logical error causing segfaults when selecting from Kafka empty topic. [#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) +- Fix too early MySQL connection close in `MySQLBlockInputStream.cpp`. [#6882](https://github.com/ClickHouse/ClickHouse/pull/6882) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Returned support for very old Linux kernels (fix [#6841](https://github.com/ClickHouse/ClickHouse/issues/6841)) [#6853](https://github.com/ClickHouse/ClickHouse/pull/6853) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix possible data loss in `insert select` query in case of empty block in input stream. #6834 #6862 [#6911](https://github.com/ClickHouse/ClickHouse/pull/6911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix for function `АrrayEnumerateUniqRanked` with empty arrays in params [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) +- Fix complex queries with array joins and global subqueries. [#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) +- Fix `Unknown identifier` error in ORDER BY and GROUP BY with multiple JOINs [#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed `MSan` warning while executing function with `LowCardinality` argument. [#7062](https://github.com/ClickHouse/ClickHouse/pull/7062) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Backward Incompatible Change {#backward-incompatible-change-2} + +- Changed serialization format of bitmap\* aggregate function states to improve performance. Serialized states of bitmap\* from previous versions cannot be read. [#6908](https://github.com/ClickHouse/ClickHouse/pull/6908) ([Zhichang Yu](https://github.com/yuzhichang)) + +## ClickHouse Release 19.14 {#clickhouse-release-19-14} + +### ClickHouse Release 19.14.7.15, 2019-10-02 {#clickhouse-release-19-14-7-15-2019-10-02} + +#### Bug Fix {#bug-fix-6} + +- This release also contains all bug fixes from 19.11.12.69. +- Fixed compatibility for distributed queries between 19.14 and earlier versions. This fixes [#7068](https://github.com/ClickHouse/ClickHouse/issues/7068). [#7069](https://github.com/ClickHouse/ClickHouse/pull/7069) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.14.6.12, 2019-09-19 {#clickhouse-release-19-14-6-12-2019-09-19} + +#### Bug Fix {#bug-fix-7} + +- Fix for function `АrrayEnumerateUniqRanked` with empty arrays in params. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) +- Fixed subquery name in queries with `ARRAY JOIN` and `GLOBAL IN subquery` with alias. Use subquery alias for external table name if it is specified. [#6934](https://github.com/ClickHouse/ClickHouse/pull/6934) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-3} + +- Fix [flapping](https://clickhouse-test-reports.s3.yandex.net/6944/aab95fd5175a513413c7395a73a82044bdafb906/functional_stateless_tests_(debug).html) test `00715_fetch_merged_or_mutated_part_zookeeper` by rewriting it to a shell scripts because it needs to wait for mutations to apply. [#6977](https://github.com/ClickHouse/ClickHouse/pull/6977) ([Alexander Kazakov](https://github.com/Akazz)) +- Fixed UBSan and MemSan failure in function `groupUniqArray` with emtpy array argument. It was caused by placing of empty `PaddedPODArray` into hash table zero cell because constructor for zero cell value was not called. [#6937](https://github.com/ClickHouse/ClickHouse/pull/6937) ([Amos Bird](https://github.com/amosbird)) + +### ClickHouse Release 19.14.3.3, 2019-09-10 {#clickhouse-release-19-14-3-3-2019-09-10} + +#### New Feature {#new-feature-4} + +- `WITH FILL` modifier for `ORDER BY`. (continuation of [#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) +- `WITH TIES` modifier for `LIMIT`. (continuation of [#5069](https://github.com/ClickHouse/ClickHouse/issues/5069)) [#6610](https://github.com/ClickHouse/ClickHouse/pull/6610) ([Anton Popov](https://github.com/CurtizJ)) +- Parse unquoted `NULL` literal as NULL (if setting `format_csv_unquoted_null_literal_as_null=1`). Initialize null fields with default values if data type of this field is not nullable (if setting `input_format_null_as_default=1`). [#5990](https://github.com/ClickHouse/ClickHouse/issues/5990) [#6055](https://github.com/ClickHouse/ClickHouse/pull/6055) ([tavplubix](https://github.com/tavplubix)) +- Support for wildcards in paths of table functions `file` and `hdfs`. If the path contains wildcards, the table will be readonly. Example of usage: `select * from hdfs('hdfs://hdfs1:9000/some_dir/another_dir/*/file{0..9}{0..9}')` and `select * from file('some_dir/{some_file,another_file,yet_another}.tsv', 'TSV', 'value UInt32')`. [#6092](https://github.com/ClickHouse/ClickHouse/pull/6092) ([Olga Khvostikova](https://github.com/stavrolia)) +- New `system.metric_log` table which stores values of `system.events` and `system.metrics` with specified time interval. [#6363](https://github.com/ClickHouse/ClickHouse/issues/6363) [#6467](https://github.com/ClickHouse/ClickHouse/pull/6467) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#6530](https://github.com/ClickHouse/ClickHouse/pull/6530) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to write ClickHouse text logs to `system.text_log` table. [#6037](https://github.com/ClickHouse/ClickHouse/issues/6037) [#6103](https://github.com/ClickHouse/ClickHouse/pull/6103) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#6164](https://github.com/ClickHouse/ClickHouse/pull/6164) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Show private symbols in stack traces (this is done via parsing symbol tables of ELF files). Added information about file and line number in stack traces if debug info is present. Speedup symbol name lookup with indexing symbols present in program. Added new SQL functions for introspection: `demangle` and `addressToLine`. Renamed function `symbolizeAddress` to `addressToSymbol` for consistency. Function `addressToSymbol` will return mangled name for performance reasons and you have to apply `demangle`. Added setting `allow_introspection_functions` which is turned off by default. [#6201](https://github.com/ClickHouse/ClickHouse/pull/6201) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Table function `values` (the name is case-insensitive). It allows to read from `VALUES` list proposed in [#5984](https://github.com/ClickHouse/ClickHouse/issues/5984). Example: `SELECT * FROM VALUES('a UInt64, s String', (1, 'one'), (2, 'two'), (3, 'three'))`. [#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([dimarub2000](https://github.com/dimarub2000)) +- Added an ability to alter storage settings. Syntax: `ALTER TABLE MODIFY SETTING = `. [#6366](https://github.com/ClickHouse/ClickHouse/pull/6366) [#6669](https://github.com/ClickHouse/ClickHouse/pull/6669) [#6685](https://github.com/ClickHouse/ClickHouse/pull/6685) ([alesapin](https://github.com/alesapin)) +- Support for removing of detached parts. Syntax: `ALTER TABLE DROP DETACHED PART ''`. [#6158](https://github.com/ClickHouse/ClickHouse/pull/6158) ([tavplubix](https://github.com/tavplubix)) +- Table constraints. Allows to add constraint to table definition which will be checked at insert. [#5273](https://github.com/ClickHouse/ClickHouse/pull/5273) ([Gleb Novikov](https://github.com/NanoBjorn)) [#6652](https://github.com/ClickHouse/ClickHouse/pull/6652) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Suppport for cascaded materialized views. [#6324](https://github.com/ClickHouse/ClickHouse/pull/6324) ([Amos Bird](https://github.com/amosbird)) +- Turn on query profiler by default to sample every query execution thread once a second. [#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Input format `ORC`. [#6454](https://github.com/ClickHouse/ClickHouse/pull/6454) [#6703](https://github.com/ClickHouse/ClickHouse/pull/6703) ([akonyaev90](https://github.com/akonyaev90)) +- Added two new functions: `sigmoid` and `tanh` (that are useful for machine learning applications). [#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Function `hasToken(haystack, token)`, `hasTokenCaseInsensitive(haystack, token)` to check if given token is in haystack. Token is a maximal length substring between two non alphanumeric ASCII characters (or boundaries of haystack). Token must be a constant string. Supported by tokenbf_v1 index specialization. [#6596](https://github.com/ClickHouse/ClickHouse/pull/6596), [#6662](https://github.com/ClickHouse/ClickHouse/pull/6662) ([Vasily Nemkov](https://github.com/Enmk)) +- New function `neighbor(value, offset[, default_value])`. Allows to reach prev/next value within column in a block of data. [#5925](https://github.com/ClickHouse/ClickHouse/pull/5925) ([Alex Krash](https://github.com/alex-krash)) [6685365ab8c5b74f9650492c88a012596eb1b0c6](https://github.com/ClickHouse/ClickHouse/commit/6685365ab8c5b74f9650492c88a012596eb1b0c6) [341e2e4587a18065c2da1ca888c73389f48ce36c](https://github.com/ClickHouse/ClickHouse/commit/341e2e4587a18065c2da1ca888c73389f48ce36c) [Alexey Milovidov](https://github.com/alexey-milovidov) +- Created a function `currentUser()`, returning login of authorized user. Added alias `user()` for compatibility with MySQL. [#6470](https://github.com/ClickHouse/ClickHouse/pull/6470) ([Alex Krash](https://github.com/alex-krash)) +- New aggregate functions `quantilesExactInclusive` and `quantilesExactExclusive` which were proposed in [#5885](https://github.com/ClickHouse/ClickHouse/issues/5885). [#6477](https://github.com/ClickHouse/ClickHouse/pull/6477) ([dimarub2000](https://github.com/dimarub2000)) +- Function `bitmapRange(bitmap, range_begin, range_end)` which returns new set with specified range (not include the `range_end`). [#6314](https://github.com/ClickHouse/ClickHouse/pull/6314) ([Zhichang Yu](https://github.com/yuzhichang)) +- Function `geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)` which creates array of precision-long strings of geohash-boxes covering provided area. [#6127](https://github.com/ClickHouse/ClickHouse/pull/6127) ([Vasily Nemkov](https://github.com/Enmk)) +- Implement support for INSERT query with `Kafka` tables. [#6012](https://github.com/ClickHouse/ClickHouse/pull/6012) ([Ivan](https://github.com/abyss7)) +- Added support for `_partition` and `_timestamp` virtual columns to Kafka engine. [#6400](https://github.com/ClickHouse/ClickHouse/pull/6400) ([Ivan](https://github.com/abyss7)) +- Possibility to remove sensitive data from `query_log`, server logs, process list with regexp-based rules. [#5710](https://github.com/ClickHouse/ClickHouse/pull/5710) ([filimonov](https://github.com/filimonov)) + +#### Experimental Feature {#experimental-feature-2} + +- Input and output data format `Template`. It allows to specify custom format string for input and output. [#4354](https://github.com/ClickHouse/ClickHouse/issues/4354) [#6727](https://github.com/ClickHouse/ClickHouse/pull/6727) ([tavplubix](https://github.com/tavplubix)) +- Implementation of `LIVE VIEW` tables that were originally proposed in [#2898](https://github.com/ClickHouse/ClickHouse/pull/2898), prepared in [#3925](https://github.com/ClickHouse/ClickHouse/issues/3925), and then updated in [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541). See [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) for detailed description. [#5541](https://github.com/ClickHouse/ClickHouse/issues/5541) ([vzakaznikov](https://github.com/vzakaznikov)) [#6425](https://github.com/ClickHouse/ClickHouse/pull/6425) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#6656](https://github.com/ClickHouse/ClickHouse/pull/6656) ([vzakaznikov](https://github.com/vzakaznikov)) Note that `LIVE VIEW` feature may be removed in next versions. + +#### Bug Fix {#bug-fix-8} + +- This release also contains all bug fixes from 19.13 and 19.11. +- Fix segmentation fault when the table has skip indices and vertical merge happens. [#6723](https://github.com/ClickHouse/ClickHouse/pull/6723) ([alesapin](https://github.com/alesapin)) +- Fix per-column TTL with non-trivial column defaults. Previously in case of force TTL merge with `OPTIMIZE ... FINAL` query, expired values was replaced by type defaults instead of user-specified column defaults. [#6796](https://github.com/ClickHouse/ClickHouse/pull/6796) ([Anton Popov](https://github.com/CurtizJ)) +- Fix Kafka messages duplication problem on normal server restart. [#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) +- Fixed infinite loop when reading Kafka messages. Do not pause/resume consumer on subscription at all - otherwise it may get paused indefinitely in some scenarios. [#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([Ivan](https://github.com/abyss7)) +- Fix `Key expression contains comparison between inconvertible types` exception in `bitmapContains` function. [#6136](https://github.com/ClickHouse/ClickHouse/issues/6136) [#6146](https://github.com/ClickHouse/ClickHouse/issues/6146) [#6156](https://github.com/ClickHouse/ClickHouse/pull/6156) ([dimarub2000](https://github.com/dimarub2000)) +- Fix segfault with enabled `optimize_skip_unused_shards` and missing sharding key. [#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed wrong code in mutations that may lead to memory corruption. Fixed segfault with read of address `0x14c0` that may happed due to concurrent `DROP TABLE` and `SELECT` from `system.parts` or `system.parts_columns`. Fixed race condition in preparation of mutation queries. Fixed deadlock caused by `OPTIMIZE` of Replicated tables and concurrent modification operations like ALTERs. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Removed extra verbose logging in MySQL interface [#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Return the ability to parse boolean settings from ‘true’ and ‘false’ in the configuration file. [#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) +- Fix crash in `quantile` and `median` function over `Nullable(Decimal128)`. [#6378](https://github.com/ClickHouse/ClickHouse/pull/6378) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed possible incomplete result returned by `SELECT` query with `WHERE` condition on primary key contained conversion to Float type. It was caused by incorrect checking of monotonicity in `toFloat` function. [#6248](https://github.com/ClickHouse/ClickHouse/issues/6248) [#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([dimarub2000](https://github.com/dimarub2000)) +- Check `max_expanded_ast_elements` setting for mutations. Clear mutations after `TRUNCATE TABLE`. [#6205](https://github.com/ClickHouse/ClickHouse/pull/6205) ([Winter Zhang](https://github.com/zhang2014)) +- Fix JOIN results for key columns when used with `join_use_nulls`. Attach Nulls instead of columns defaults. [#6249](https://github.com/ClickHouse/ClickHouse/pull/6249) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix for skip indices with vertical merge and alter. Fix for `Bad size of marks file` exception. [#6594](https://github.com/ClickHouse/ClickHouse/issues/6594) [#6713](https://github.com/ClickHouse/ClickHouse/pull/6713) ([alesapin](https://github.com/alesapin)) +- Fix rare crash in `ALTER MODIFY COLUMN` and vertical merge when one of merged/altered parts is empty (0 rows) [#6746](https://github.com/ClickHouse/ClickHouse/issues/6746) [#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) +- Fixed bug in conversion of `LowCardinality` types in `AggregateFunctionFactory`. This fixes [#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix wrong behavior and possible segfaults in `topK` and `topKWeighted` aggregated functions. [#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed unsafe code around `getIdentifier` function. [#6401](https://github.com/ClickHouse/ClickHouse/issues/6401) [#6409](https://github.com/ClickHouse/ClickHouse/pull/6409) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed bug in MySQL wire protocol (is used while connecting to ClickHouse form MySQL client). Caused by heap buffer overflow in `PacketPayloadWriteBuffer`. [#6212](https://github.com/ClickHouse/ClickHouse/pull/6212) ([Yuriy Baranov](https://github.com/yurriy)) +- Fixed memory leak in `bitmapSubsetInRange` function. [#6819](https://github.com/ClickHouse/ClickHouse/pull/6819) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fix rare bug when mutation executed after granularity change. [#6816](https://github.com/ClickHouse/ClickHouse/pull/6816) ([alesapin](https://github.com/alesapin)) +- Allow protobuf message with all fields by default. [#6132](https://github.com/ClickHouse/ClickHouse/pull/6132) ([Vitaly Baranov](https://github.com/vitlibar)) +- Resolve a bug with `nullIf` function when we send a `NULL` argument on the second argument. [#6446](https://github.com/ClickHouse/ClickHouse/pull/6446) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Fix rare bug with wrong memory allocation/deallocation in complex key cache dictionaries with string fields which leads to infinite memory consumption (looks like memory leak). Bug reproduces when string size was a power of two starting from eight (8, 16, 32, etc). [#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) +- Fixed Gorilla encoding on small sequences which caused exception `Cannot write after end of buffer`. [#6398](https://github.com/ClickHouse/ClickHouse/issues/6398) [#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Vasily Nemkov](https://github.com/Enmk)) +- Allow to use not nullable types in JOINs with `join_use_nulls` enabled. [#6705](https://github.com/ClickHouse/ClickHouse/pull/6705) ([Artem Zuikov](https://github.com/4ertus2)) +- Disable `Poco::AbstractConfiguration` substitutions in query in `clickhouse-client`. [#6706](https://github.com/ClickHouse/ClickHouse/pull/6706) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid deadlock in `REPLACE PARTITION`. [#6677](https://github.com/ClickHouse/ClickHouse/pull/6677) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Using `arrayReduce` for constant arguments may lead to segfault. [#6242](https://github.com/ClickHouse/ClickHouse/issues/6242) [#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix inconsistent parts which can appear if replica was restored after `DROP PARTITION`. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) +- Fixed hang in `JSONExtractRaw` function. [#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug with incorrect skip indices serialization and aggregation with adaptive granularity. [#6594](https://github.com/ClickHouse/ClickHouse/issues/6594). [#6748](https://github.com/ClickHouse/ClickHouse/pull/6748) ([alesapin](https://github.com/alesapin)) +- Fix `WITH ROLLUP` and `WITH CUBE` modifiers of `GROUP BY` with two-level aggregation. [#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) +- Fix bug with writing secondary indices marks with adaptive granularity. [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) +- Fix initialization order while server startup. Since `StorageMergeTree::background_task_handle` is initialized in `startup()` the `MergeTreeBlockOutputStream::write()` may try to use it before initialization. Just check if it is initialized. [#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) +- Clearing the data buffer from the previous read operation that was completed with an error. [#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) +- Fix bug with enabling adaptive granularity when creating a new replica for Replicated\*MergeTree table. [#6394](https://github.com/ClickHouse/ClickHouse/issues/6394) [#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) +- Fixed possible crash during server startup in case of exception happened in `libunwind` during exception at access to uninitialized `ThreadStatus` structure. [#6456](https://github.com/ClickHouse/ClickHouse/pull/6456) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix crash in `yandexConsistentHash` function. Found by fuzz test. [#6304](https://github.com/ClickHouse/ClickHouse/issues/6304) [#6305](https://github.com/ClickHouse/ClickHouse/pull/6305) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed the possibility of hanging queries when server is overloaded and global thread pool becomes near full. This have higher chance to happen on clusters with large number of shards (hundreds), because distributed queries allocate a thread per connection to each shard. For example, this issue may reproduce if a cluster of 330 shards is processing 30 concurrent distributed queries. This issue affects all versions starting from 19.2. [#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed logic of `arrayEnumerateUniqRanked` function. [#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix segfault when decoding symbol table. [#6603](https://github.com/ClickHouse/ClickHouse/pull/6603) ([Amos Bird](https://github.com/amosbird)) +- Fixed irrelevant exception in cast of `LowCardinality(Nullable)` to not-Nullable column in case if it does not contain Nulls (e.g. in query like `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String)`. [#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Removed extra quoting of description in `system.settings` table. [#6696](https://github.com/ClickHouse/ClickHouse/issues/6696) [#6699](https://github.com/ClickHouse/ClickHouse/pull/6699) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid possible deadlock in `TRUNCATE` of Replicated table. [#6695](https://github.com/ClickHouse/ClickHouse/pull/6695) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix reading in order of sorting key. [#6189](https://github.com/ClickHouse/ClickHouse/pull/6189) ([Anton Popov](https://github.com/CurtizJ)) +- Fix `ALTER TABLE ... UPDATE` query for tables with `enable_mixed_granularity_parts=1`. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Fix bug opened by [#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) (since 19.4.0). Reproduces in queries to Distributed tables over MergeTree tables when we does not query any columns (`SELECT 1`). [#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) +- Fixed overflow in integer division of signed type to unsigned type. The behaviour was exactly as in C or C++ language (integer promotion rules) that may be surprising. Please note that the overflow is still possible when dividing large signed number to large unsigned number or vice-versa (but that case is less usual). The issue existed in all server versions. [#6214](https://github.com/ClickHouse/ClickHouse/issues/6214) [#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Limit maximum sleep time for throttling when `max_execution_speed` or `max_execution_speed_bytes` is set. Fixed false errors like `Estimated query execution time (inf seconds) is too long`. [#5547](https://github.com/ClickHouse/ClickHouse/issues/5547) [#6232](https://github.com/ClickHouse/ClickHouse/pull/6232) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed issues about using `MATERIALIZED` columns and aliases in `MaterializedView`. [#448](https://github.com/ClickHouse/ClickHouse/issues/448) [#3484](https://github.com/ClickHouse/ClickHouse/issues/3484) [#3450](https://github.com/ClickHouse/ClickHouse/issues/3450) [#2878](https://github.com/ClickHouse/ClickHouse/issues/2878) [#2285](https://github.com/ClickHouse/ClickHouse/issues/2285) [#3796](https://github.com/ClickHouse/ClickHouse/pull/3796) ([Amos Bird](https://github.com/amosbird)) [#6316](https://github.com/ClickHouse/ClickHouse/pull/6316) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `FormatFactory` behaviour for input streams which are not implemented as processor. [#6495](https://github.com/ClickHouse/ClickHouse/pull/6495) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed typo. [#6631](https://github.com/ClickHouse/ClickHouse/pull/6631) ([Alex Ryndin](https://github.com/alexryndin)) +- Typo in the error message ( is -\> are ). [#6839](https://github.com/ClickHouse/ClickHouse/pull/6839) ([Denis Zhuravlev](https://github.com/den-crane)) +- Fixed error while parsing of columns list from string if type contained a comma (this issue was relevant for `File`, `URL`, `HDFS` storages) [#6217](https://github.com/ClickHouse/ClickHouse/issues/6217). [#6209](https://github.com/ClickHouse/ClickHouse/pull/6209) ([dimarub2000](https://github.com/dimarub2000)) + +#### Security Fix {#security-fix} + +- This release also contains all bug security fixes from 19.13 and 19.11. +- Fixed the possibility of a fabricated query to cause server crash due to stack overflow in SQL parser. Fixed the possibility of stack overflow in Merge and Distributed tables, materialized views and conditions for row-level security that involve subqueries. [#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement {#improvement-3} + +- Correct implementation of ternary logic for `AND/OR`. [#6048](https://github.com/ClickHouse/ClickHouse/pull/6048) ([Alexander Kazakov](https://github.com/Akazz)) +- Now values and rows with expired TTL will be removed after `OPTIMIZE ... FINAL` query from old parts without TTL infos or with outdated TTL infos, e.g. after `ALTER ... MODIFY TTL` query. Added queries `SYSTEM STOP/START TTL MERGES` to disallow/allow assign merges with TTL and filter expired values in all merges. [#6274](https://github.com/ClickHouse/ClickHouse/pull/6274) ([Anton Popov](https://github.com/CurtizJ)) +- Possibility to change the location of ClickHouse history file for client using `CLICKHOUSE_HISTORY_FILE` env. [#6840](https://github.com/ClickHouse/ClickHouse/pull/6840) ([filimonov](https://github.com/filimonov)) +- Remove `dry_run` flag from `InterpreterSelectQuery`. … [#6375](https://github.com/ClickHouse/ClickHouse/pull/6375) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Support `ASOF JOIN` with `ON` section. [#6211](https://github.com/ClickHouse/ClickHouse/pull/6211) ([Artem Zuikov](https://github.com/4ertus2)) +- Better support of skip indexes for mutations and replication. Support for `MATERIALIZE/CLEAR INDEX ... IN PARTITION` query. `UPDATE x = x` recalculates all indices that use column `x`. [#5053](https://github.com/ClickHouse/ClickHouse/pull/5053) ([Nikita Vasilev](https://github.com/nikvas0)) +- Allow to `ATTACH` live views (for example, at the server startup) regardless to `allow_experimental_live_view` setting. [#6754](https://github.com/ClickHouse/ClickHouse/pull/6754) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- For stack traces gathered by query profiler, do not include stack frames generated by the query profiler itself. [#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now table functions `values`, `file`, `url`, `hdfs` have support for ALIAS columns. [#6255](https://github.com/ClickHouse/ClickHouse/pull/6255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Throw an exception if `config.d` file does not have the corresponding root element as the config file. [#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([dimarub2000](https://github.com/dimarub2000)) +- Print extra info in exception message for `no space left on device`. [#6182](https://github.com/ClickHouse/ClickHouse/issues/6182), [#6252](https://github.com/ClickHouse/ClickHouse/issues/6252) [#6352](https://github.com/ClickHouse/ClickHouse/pull/6352) ([tavplubix](https://github.com/tavplubix)) +- When determining shards of a `Distributed` table to be covered by a read query (for `optimize_skip_unused_shards` = 1) ClickHouse now checks conditions from both `prewhere` and `where` clauses of select statement. [#6521](https://github.com/ClickHouse/ClickHouse/pull/6521) ([Alexander Kazakov](https://github.com/Akazz)) +- Enabled `SIMDJSON` for machines without AVX2 but with SSE 4.2 and PCLMUL instruction set. [#6285](https://github.com/ClickHouse/ClickHouse/issues/6285) [#6320](https://github.com/ClickHouse/ClickHouse/pull/6320) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- ClickHouse can work on filesystems without `O_DIRECT` support (such as ZFS and BtrFS) without additional tuning. [#4449](https://github.com/ClickHouse/ClickHouse/issues/4449) [#6730](https://github.com/ClickHouse/ClickHouse/pull/6730) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Support push down predicate for final subquery. [#6120](https://github.com/ClickHouse/ClickHouse/pull/6120) ([TCeason](https://github.com/TCeason)) [#6162](https://github.com/ClickHouse/ClickHouse/pull/6162) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Better `JOIN ON` keys extraction [#6131](https://github.com/ClickHouse/ClickHouse/pull/6131) ([Artem Zuikov](https://github.com/4ertus2)) +- Upated `SIMDJSON`. [#6285](https://github.com/ClickHouse/ClickHouse/issues/6285). [#6306](https://github.com/ClickHouse/ClickHouse/pull/6306) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Optimize selecting of smallest column for `SELECT count()` query. [#6344](https://github.com/ClickHouse/ClickHouse/pull/6344) ([Amos Bird](https://github.com/amosbird)) +- Added `strict` parameter in `windowFunnel()`. When the `strict` is set, the `windowFunnel()` applies conditions only for the unique values. [#6548](https://github.com/ClickHouse/ClickHouse/pull/6548) ([achimbab](https://github.com/achimbab)) +- Safer interface of `mysqlxx::Pool`. [#6150](https://github.com/ClickHouse/ClickHouse/pull/6150) ([avasiliev](https://github.com/avasiliev)) +- Options line size when executing with `--help` option now corresponds with terminal size. [#6590](https://github.com/ClickHouse/ClickHouse/pull/6590) ([dimarub2000](https://github.com/dimarub2000)) +- Disable “read in order” optimization for aggregation without keys. [#6599](https://github.com/ClickHouse/ClickHouse/pull/6599) ([Anton Popov](https://github.com/CurtizJ)) +- HTTP status code for `INCORRECT_DATA` and `TYPE_MISMATCH` error codes was changed from default `500 Internal Server Error` to `400 Bad Request`. [#6271](https://github.com/ClickHouse/ClickHouse/pull/6271) ([Alexander Rodin](https://github.com/a-rodin)) +- Move Join object from `ExpressionAction` into `AnalyzedJoin`. `ExpressionAnalyzer` and `ExpressionAction` do not know about `Join` class anymore. Its logic is hidden by `AnalyzedJoin` iface. [#6801](https://github.com/ClickHouse/ClickHouse/pull/6801) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed possible deadlock of distributed queries when one of shards is localhost but the query is sent via network connection. [#6759](https://github.com/ClickHouse/ClickHouse/pull/6759) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Changed semantic of multiple tables `RENAME` to avoid possible deadlocks. [#6757](https://github.com/ClickHouse/ClickHouse/issues/6757). [#6756](https://github.com/ClickHouse/ClickHouse/pull/6756) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Rewritten MySQL compatibility server to prevent loading full packet payload in memory. Decreased memory consumption for each connection to approximately `2 * DBMS_DEFAULT_BUFFER_SIZE` (read/write buffers). [#5811](https://github.com/ClickHouse/ClickHouse/pull/5811) ([Yuriy Baranov](https://github.com/yurriy)) +- Move AST alias interpreting logic out of parser that does not have to know anything about query semantics. [#6108](https://github.com/ClickHouse/ClickHouse/pull/6108) ([Artem Zuikov](https://github.com/4ertus2)) +- Slightly more safe parsing of `NamesAndTypesList`. [#6408](https://github.com/ClickHouse/ClickHouse/issues/6408). [#6410](https://github.com/ClickHouse/ClickHouse/pull/6410) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-copier`: Allow use `where_condition` from config with `partition_key` alias in query for checking partition existence (Earlier it was used only in reading data queries). [#6577](https://github.com/ClickHouse/ClickHouse/pull/6577) ([proller](https://github.com/proller)) +- Added optional message argument in `throwIf`. ([#5772](https://github.com/ClickHouse/ClickHouse/issues/5772)) [#6329](https://github.com/ClickHouse/ClickHouse/pull/6329) ([Vdimir](https://github.com/Vdimir)) +- Server exception got while sending insertion data is now being processed in client as well. [#5891](https://github.com/ClickHouse/ClickHouse/issues/5891) [#6711](https://github.com/ClickHouse/ClickHouse/pull/6711) ([dimarub2000](https://github.com/dimarub2000)) +- Added a metric `DistributedFilesToInsert` that shows the total number of files in filesystem that are selected to send to remote servers by Distributed tables. The number is summed across all shards. [#6600](https://github.com/ClickHouse/ClickHouse/pull/6600) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Move most of JOINs prepare logic from `ExpressionAction/ExpressionAnalyzer` to `AnalyzedJoin`. [#6785](https://github.com/ClickHouse/ClickHouse/pull/6785) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix TSan [warning](https://clickhouse-test-reports.s3.yandex.net/6399/c1c1d1daa98e199e620766f1bd06a5921050a00d/functional_stateful_tests_(thread).html) ‘lock-order-inversion’. [#6740](https://github.com/ClickHouse/ClickHouse/pull/6740) ([Vasily Nemkov](https://github.com/Enmk)) +- Better information messages about lack of Linux capabilities. Logging fatal errors with “fatal” level, that will make it easier to find in `system.text_log`. [#6441](https://github.com/ClickHouse/ClickHouse/pull/6441) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- When enable dumping temporary data to the disk to restrict memory usage during `GROUP BY`, `ORDER BY`, it didn’t check the free disk space. The fix add a new setting `min_free_disk_space`, when the free disk space it smaller then the threshold, the query will stop and throw `ErrorCodes::NOT_ENOUGH_SPACE`. [#6678](https://github.com/ClickHouse/ClickHouse/pull/6678) ([Weiqing Xu](https://github.com/weiqxu)) [#6691](https://github.com/ClickHouse/ClickHouse/pull/6691) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Removed recursive rwlock by thread. It makes no sense, because threads are reused between queries. `SELECT` query may acquire a lock in one thread, hold a lock from another thread and exit from first thread. In the same time, first thread can be reused by `DROP` query. This will lead to false “Attempt to acquire exclusive lock recursively” messages. [#6771](https://github.com/ClickHouse/ClickHouse/pull/6771) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Split `ExpressionAnalyzer.appendJoin()`. Prepare a place in `ExpressionAnalyzer` for `MergeJoin`. [#6524](https://github.com/ClickHouse/ClickHouse/pull/6524) ([Artem Zuikov](https://github.com/4ertus2)) +- Added `mysql_native_password` authentication plugin to MySQL compatibility server. [#6194](https://github.com/ClickHouse/ClickHouse/pull/6194) ([Yuriy Baranov](https://github.com/yurriy)) +- Less number of `clock_gettime` calls; fixed ABI compatibility between debug/release in `Allocator` (insignificant issue). [#6197](https://github.com/ClickHouse/ClickHouse/pull/6197) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Move `collectUsedColumns` from `ExpressionAnalyzer` to `SyntaxAnalyzer`. `SyntaxAnalyzer` makes `required_source_columns` itself now. [#6416](https://github.com/ClickHouse/ClickHouse/pull/6416) ([Artem Zuikov](https://github.com/4ertus2)) +- Add setting `joined_subquery_requires_alias` to require aliases for subselects and table functions in `FROM` that more than one table is present (i.e. queries with JOINs). [#6733](https://github.com/ClickHouse/ClickHouse/pull/6733) ([Artem Zuikov](https://github.com/4ertus2)) +- Extract `GetAggregatesVisitor` class from `ExpressionAnalyzer`. [#6458](https://github.com/ClickHouse/ClickHouse/pull/6458) ([Artem Zuikov](https://github.com/4ertus2)) +- `system.query_log`: change data type of `type` column to `Enum`. [#6265](https://github.com/ClickHouse/ClickHouse/pull/6265) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Static linking of `sha256_password` authentication plugin. [#6512](https://github.com/ClickHouse/ClickHouse/pull/6512) ([Yuriy Baranov](https://github.com/yurriy)) +- Avoid extra dependency for the setting `compile` to work. In previous versions, the user may get error like `cannot open crti.o`, `unable to find library -lc` etc. [#6309](https://github.com/ClickHouse/ClickHouse/pull/6309) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- More validation of the input that may come from malicious replica. [#6303](https://github.com/ClickHouse/ClickHouse/pull/6303) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now `clickhouse-obfuscator` file is available in `clickhouse-client` package. In previous versions it was available as `clickhouse obfuscator` (with whitespace). [#5816](https://github.com/ClickHouse/ClickHouse/issues/5816) [#6609](https://github.com/ClickHouse/ClickHouse/pull/6609) ([dimarub2000](https://github.com/dimarub2000)) +- Fixed deadlock when we have at least two queries that read at least two tables in different order and another query that performs DDL operation on one of tables. Fixed another very rare deadlock. [#6764](https://github.com/ClickHouse/ClickHouse/pull/6764) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added `os_thread_ids` column to `system.processes` and `system.query_log` for better debugging possibilities. [#6763](https://github.com/ClickHouse/ClickHouse/pull/6763) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- A workaround for PHP mysqlnd extension bugs which occur when `sha256_password` is used as a default authentication plugin (described in [#6031](https://github.com/ClickHouse/ClickHouse/issues/6031)). [#6113](https://github.com/ClickHouse/ClickHouse/pull/6113) ([Yuriy Baranov](https://github.com/yurriy)) +- Remove unneeded place with changed nullability columns. [#6693](https://github.com/ClickHouse/ClickHouse/pull/6693) ([Artem Zuikov](https://github.com/4ertus2)) +- Set default value of `queue_max_wait_ms` to zero, because current value (five seconds) makes no sense. There are rare circumstances when this settings has any use. Added settings `replace_running_query_max_wait_ms`, `kafka_max_wait_ms` and `connection_pool_max_wait_ms` for disambiguation. [#6692](https://github.com/ClickHouse/ClickHouse/pull/6692) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Extract `SelectQueryExpressionAnalyzer` from `ExpressionAnalyzer`. Keep the last one for non-select queries. [#6499](https://github.com/ClickHouse/ClickHouse/pull/6499) ([Artem Zuikov](https://github.com/4ertus2)) +- Removed duplicating input and output formats. [#6239](https://github.com/ClickHouse/ClickHouse/pull/6239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Allow user to override `poll_interval` and `idle_connection_timeout` settings on connection. [#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `MergeTree` now has an additional option `ttl_only_drop_parts` (disabled by default) to avoid partial pruning of parts, so that they dropped completely when all the rows in a part are expired. [#6191](https://github.com/ClickHouse/ClickHouse/pull/6191) ([Sergi Vladykin](https://github.com/svladykin)) +- Type checks for set index functions. Throw exception if function got a wrong type. This fixes fuzz test with UBSan. [#6511](https://github.com/ClickHouse/ClickHouse/pull/6511) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Performance Improvement {#performance-improvement-2} + +- Optimize queries with `ORDER BY expressions` clause, where `expressions` have coinciding prefix with sorting key in `MergeTree` tables. This optimization is controlled by `optimize_read_in_order` setting. [#6054](https://github.com/ClickHouse/ClickHouse/pull/6054) [#6629](https://github.com/ClickHouse/ClickHouse/pull/6629) ([Anton Popov](https://github.com/CurtizJ)) +- Allow to use multiple threads during parts loading and removal. [#6372](https://github.com/ClickHouse/ClickHouse/issues/6372) [#6074](https://github.com/ClickHouse/ClickHouse/issues/6074) [#6438](https://github.com/ClickHouse/ClickHouse/pull/6438) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implemented batch variant of updating aggregate function states. It may lead to performance benefits. [#6435](https://github.com/ClickHouse/ClickHouse/pull/6435) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Using `FastOps` library for functions `exp`, `log`, `sigmoid`, `tanh`. FastOps is a fast vector math library from Michael Parakhin (Yandex CTO). Improved performance of `exp` and `log` functions more than 6 times. The functions `exp` and `log` from `Float32` argument will return `Float32` (in previous versions they always return `Float64`). Now `exp(nan)` may return `inf`. The result of `exp` and `log` functions may be not the nearest machine representable number to the true answer. [#6254](https://github.com/ClickHouse/ClickHouse/pull/6254) ([alexey-milovidov](https://github.com/alexey-milovidov)) Using Danila Kutenin variant to make fastops working [#6317](https://github.com/ClickHouse/ClickHouse/pull/6317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Disable consecutive key optimization for `UInt8/16`. [#6298](https://github.com/ClickHouse/ClickHouse/pull/6298) [#6701](https://github.com/ClickHouse/ClickHouse/pull/6701) ([akuzm](https://github.com/akuzm)) +- Improved performance of `simdjson` library by getting rid of dynamic allocation in `ParsedJson::Iterator`. [#6479](https://github.com/ClickHouse/ClickHouse/pull/6479) ([Vitaly Baranov](https://github.com/vitlibar)) +- Pre-fault pages when allocating memory with `mmap()`. [#6667](https://github.com/ClickHouse/ClickHouse/pull/6667) ([akuzm](https://github.com/akuzm)) +- Fix performance bug in `Decimal` comparison. [#6380](https://github.com/ClickHouse/ClickHouse/pull/6380) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-4} + +- Remove Compiler (runtime template instantiation) because we’ve win over it’s performance. [#6646](https://github.com/ClickHouse/ClickHouse/pull/6646) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added performance test to show degradation of performance in gcc-9 in more isolated way. [#6302](https://github.com/ClickHouse/ClickHouse/pull/6302) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added table function `numbers_mt`, which is multithreaded version of `numbers`. Updated performance tests with hash functions. [#6554](https://github.com/ClickHouse/ClickHouse/pull/6554) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Comparison mode in `clickhouse-benchmark` [#6220](https://github.com/ClickHouse/ClickHouse/issues/6220) [#6343](https://github.com/ClickHouse/ClickHouse/pull/6343) ([dimarub2000](https://github.com/dimarub2000)) +- Best effort for printing stack traces. Also added `SIGPROF` as a debugging signal to print stack trace of a running thread. [#6529](https://github.com/ClickHouse/ClickHouse/pull/6529) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Every function in its own file, part 10. [#6321](https://github.com/ClickHouse/ClickHouse/pull/6321) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Remove doubled const `TABLE_IS_READ_ONLY`. [#6566](https://github.com/ClickHouse/ClickHouse/pull/6566) ([filimonov](https://github.com/filimonov)) +- Formatting changes for `StringHashMap` PR [#5417](https://github.com/ClickHouse/ClickHouse/issues/5417). [#6700](https://github.com/ClickHouse/ClickHouse/pull/6700) ([akuzm](https://github.com/akuzm)) +- Better subquery for join creation in `ExpressionAnalyzer`. [#6824](https://github.com/ClickHouse/ClickHouse/pull/6824) ([Artem Zuikov](https://github.com/4ertus2)) +- Remove a redundant condition (found by PVS Studio). [#6775](https://github.com/ClickHouse/ClickHouse/pull/6775) ([akuzm](https://github.com/akuzm)) +- Separate the hash table interface for `ReverseIndex`. [#6672](https://github.com/ClickHouse/ClickHouse/pull/6672) ([akuzm](https://github.com/akuzm)) +- Refactoring of settings. [#6689](https://github.com/ClickHouse/ClickHouse/pull/6689) ([alesapin](https://github.com/alesapin)) +- Add comments for `set` index functions. [#6319](https://github.com/ClickHouse/ClickHouse/pull/6319) ([Nikita Vasilev](https://github.com/nikvas0)) +- Increase OOM score in debug version on Linux. [#6152](https://github.com/ClickHouse/ClickHouse/pull/6152) ([akuzm](https://github.com/akuzm)) +- HDFS HA now work in debug build. [#6650](https://github.com/ClickHouse/ClickHouse/pull/6650) ([Weiqing Xu](https://github.com/weiqxu)) +- Added a test to `transform_query_for_external_database`. [#6388](https://github.com/ClickHouse/ClickHouse/pull/6388) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add test for multiple materialized views for Kafka table. [#6509](https://github.com/ClickHouse/ClickHouse/pull/6509) ([Ivan](https://github.com/abyss7)) +- Make a better build scheme. [#6500](https://github.com/ClickHouse/ClickHouse/pull/6500) ([Ivan](https://github.com/abyss7)) +- Fixed `test_external_dictionaries` integration in case it was executed under non root user. [#6507](https://github.com/ClickHouse/ClickHouse/pull/6507) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- The bug reproduces when total size of written packets exceeds `DBMS_DEFAULT_BUFFER_SIZE`. [#6204](https://github.com/ClickHouse/ClickHouse/pull/6204) ([Yuriy Baranov](https://github.com/yurriy)) +- Added a test for `RENAME` table race condition [#6752](https://github.com/ClickHouse/ClickHouse/pull/6752) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid data race on Settings in `KILL QUERY`. [#6753](https://github.com/ClickHouse/ClickHouse/pull/6753) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add integration test for handling errors by a cache dictionary. [#6755](https://github.com/ClickHouse/ClickHouse/pull/6755) ([Vitaly Baranov](https://github.com/vitlibar)) +- Disable parsing of ELF object files on Mac OS, because it makes no sense. [#6578](https://github.com/ClickHouse/ClickHouse/pull/6578) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Attempt to make changelog generator better. [#6327](https://github.com/ClickHouse/ClickHouse/pull/6327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Adding `-Wshadow` switch to the GCC. [#6325](https://github.com/ClickHouse/ClickHouse/pull/6325) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +- Removed obsolete code for `mimalloc` support. [#6715](https://github.com/ClickHouse/ClickHouse/pull/6715) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `zlib-ng` determines x86 capabilities and saves this info to global variables. This is done in defalteInit call, which may be made by different threads simultaneously. To avoid multithreaded writes, do it on library startup. [#6141](https://github.com/ClickHouse/ClickHouse/pull/6141) ([akuzm](https://github.com/akuzm)) +- Regression test for a bug which in join which was fixed in [#5192](https://github.com/ClickHouse/ClickHouse/issues/5192). [#6147](https://github.com/ClickHouse/ClickHouse/pull/6147) ([Bakhtiyor Ruziev](https://github.com/theruziev)) +- Fixed MSan report. [#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix flapping TTL test. [#6782](https://github.com/ClickHouse/ClickHouse/pull/6782) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed false data race in `MergeTreeDataPart::is_frozen` field. [#6583](https://github.com/ClickHouse/ClickHouse/pull/6583) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed timeouts in fuzz test. In previous version, it managed to find false hangup in query `SELECT * FROM numbers_mt(gccMurmurHash(''))`. [#6582](https://github.com/ClickHouse/ClickHouse/pull/6582) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added debug checks to `static_cast` of columns. [#6581](https://github.com/ClickHouse/ClickHouse/pull/6581) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Support for Oracle Linux in official RPM packages. [#6356](https://github.com/ClickHouse/ClickHouse/issues/6356) [#6585](https://github.com/ClickHouse/ClickHouse/pull/6585) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Changed json perftests from `once` to `loop` type. [#6536](https://github.com/ClickHouse/ClickHouse/pull/6536) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- `odbc-bridge.cpp` defines `main()` so it should not be included in `clickhouse-lib`. [#6538](https://github.com/ClickHouse/ClickHouse/pull/6538) ([Orivej Desh](https://github.com/orivej)) +- Test for crash in `FULL|RIGHT JOIN` with nulls in right table’s keys. [#6362](https://github.com/ClickHouse/ClickHouse/pull/6362) ([Artem Zuikov](https://github.com/4ertus2)) +- Added a test for the limit on expansion of aliases just in case. [#6442](https://github.com/ClickHouse/ClickHouse/pull/6442) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Switched from `boost::filesystem` to `std::filesystem` where appropriate. [#6253](https://github.com/ClickHouse/ClickHouse/pull/6253) [#6385](https://github.com/ClickHouse/ClickHouse/pull/6385) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added RPM packages to website. [#6251](https://github.com/ClickHouse/ClickHouse/pull/6251) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add a test for fixed `Unknown identifier` exception in `IN` section. [#6708](https://github.com/ClickHouse/ClickHouse/pull/6708) ([Artem Zuikov](https://github.com/4ertus2)) +- Simplify `shared_ptr_helper` because people facing difficulties understanding it. [#6675](https://github.com/ClickHouse/ClickHouse/pull/6675) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added performance tests for fixed Gorilla and DoubleDelta codec. [#6179](https://github.com/ClickHouse/ClickHouse/pull/6179) ([Vasily Nemkov](https://github.com/Enmk)) +- Split the integration test `test_dictionaries` into 4 separate tests. [#6776](https://github.com/ClickHouse/ClickHouse/pull/6776) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix PVS-Studio warning in `PipelineExecutor`. [#6777](https://github.com/ClickHouse/ClickHouse/pull/6777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Allow to use `library` dictionary source with ASan. [#6482](https://github.com/ClickHouse/ClickHouse/pull/6482) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added option to generate changelog from a list of PRs. [#6350](https://github.com/ClickHouse/ClickHouse/pull/6350) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Lock the `TinyLog` storage when reading. [#6226](https://github.com/ClickHouse/ClickHouse/pull/6226) ([akuzm](https://github.com/akuzm)) +- Check for broken symlinks in CI. [#6634](https://github.com/ClickHouse/ClickHouse/pull/6634) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Increase timeout for “stack overflow” test because it may take a long time in debug build. [#6637](https://github.com/ClickHouse/ClickHouse/pull/6637) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added a check for double whitespaces. [#6643](https://github.com/ClickHouse/ClickHouse/pull/6643) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `new/delete` memory tracking when build with sanitizers. Tracking is not clear. It only prevents memory limit exceptions in tests. [#6450](https://github.com/ClickHouse/ClickHouse/pull/6450) ([Artem Zuikov](https://github.com/4ertus2)) +- Enable back the check of undefined symbols while linking. [#6453](https://github.com/ClickHouse/ClickHouse/pull/6453) ([Ivan](https://github.com/abyss7)) +- Avoid rebuilding `hyperscan` every day. [#6307](https://github.com/ClickHouse/ClickHouse/pull/6307) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed UBSan report in `ProtobufWriter`. [#6163](https://github.com/ClickHouse/ClickHouse/pull/6163) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Don’t allow to use query profiler with sanitizers because it is not compatible. [#6769](https://github.com/ClickHouse/ClickHouse/pull/6769) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add test for reloading a dictionary after fail by timer. [#6114](https://github.com/ClickHouse/ClickHouse/pull/6114) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix inconsistency in `PipelineExecutor::prepareProcessor` argument type. [#6494](https://github.com/ClickHouse/ClickHouse/pull/6494) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Added a test for bad URIs. [#6493](https://github.com/ClickHouse/ClickHouse/pull/6493) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added more checks to `CAST` function. This should get more information about segmentation fault in fuzzy test. [#6346](https://github.com/ClickHouse/ClickHouse/pull/6346) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Added `gcc-9` support to `docker/builder` container that builds image locally. [#6333](https://github.com/ClickHouse/ClickHouse/pull/6333) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Test for primary key with `LowCardinality(String)`. [#5044](https://github.com/ClickHouse/ClickHouse/issues/5044) [#6219](https://github.com/ClickHouse/ClickHouse/pull/6219) ([dimarub2000](https://github.com/dimarub2000)) +- Fixed tests affected by slow stack traces printing. [#6315](https://github.com/ClickHouse/ClickHouse/pull/6315) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add a test case for crash in `groupUniqArray` fixed in [#6029](https://github.com/ClickHouse/ClickHouse/pull/6029). [#4402](https://github.com/ClickHouse/ClickHouse/issues/4402) [#6129](https://github.com/ClickHouse/ClickHouse/pull/6129) ([akuzm](https://github.com/akuzm)) +- Fixed indices mutations tests. [#6645](https://github.com/ClickHouse/ClickHouse/pull/6645) ([Nikita Vasilev](https://github.com/nikvas0)) +- In performance test, do not read query log for queries we didn’t run. [#6427](https://github.com/ClickHouse/ClickHouse/pull/6427) ([akuzm](https://github.com/akuzm)) +- Materialized view now could be created with any low cardinality types regardless to the setting about suspicious low cardinality types. [#6428](https://github.com/ClickHouse/ClickHouse/pull/6428) ([Olga Khvostikova](https://github.com/stavrolia)) +- Updated tests for `send_logs_level` setting. [#6207](https://github.com/ClickHouse/ClickHouse/pull/6207) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix build under gcc-8.2. [#6196](https://github.com/ClickHouse/ClickHouse/pull/6196) ([Max Akhmedov](https://github.com/zlobober)) +- Fix build with internal libc++. [#6724](https://github.com/ClickHouse/ClickHouse/pull/6724) ([Ivan](https://github.com/abyss7)) +- Fix shared build with `rdkafka` library [#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) +- Fixes for Mac OS build (incomplete). [#6390](https://github.com/ClickHouse/ClickHouse/pull/6390) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#6429](https://github.com/ClickHouse/ClickHouse/pull/6429) ([alex-zaitsev](https://github.com/alex-zaitsev)) +- Fix “splitted” build. [#6618](https://github.com/ClickHouse/ClickHouse/pull/6618) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Other build fixes: [#6186](https://github.com/ClickHouse/ClickHouse/pull/6186) ([Amos Bird](https://github.com/amosbird)) [#6486](https://github.com/ClickHouse/ClickHouse/pull/6486) [#6348](https://github.com/ClickHouse/ClickHouse/pull/6348) ([vxider](https://github.com/Vxider)) [#6744](https://github.com/ClickHouse/ClickHouse/pull/6744) ([Ivan](https://github.com/abyss7)) [#6016](https://github.com/ClickHouse/ClickHouse/pull/6016) [#6421](https://github.com/ClickHouse/ClickHouse/pull/6421) [#6491](https://github.com/ClickHouse/ClickHouse/pull/6491) ([proller](https://github.com/proller)) + +#### Backward Incompatible Change {#backward-incompatible-change-3} + +- Removed rarely used table function `catBoostPool` and storage `CatBoostPool`. If you have used this table function, please write email to `feedback@clickhouse.com`. Note that CatBoost integration remains and will be supported. [#6279](https://github.com/ClickHouse/ClickHouse/pull/6279) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Disable `ANY RIGHT JOIN` and `ANY FULL JOIN` by default. Set `any_join_distinct_right_table_keys` setting to enable them. [#5126](https://github.com/ClickHouse/ClickHouse/issues/5126) [#6351](https://github.com/ClickHouse/ClickHouse/pull/6351) ([Artem Zuikov](https://github.com/4ertus2)) + +## ClickHouse Release 19.13 {#clickhouse-release-19-13} + +### ClickHouse Release 19.13.6.51, 2019-10-02 {#clickhouse-release-19-13-6-51-2019-10-02} + +#### Bug Fix {#bug-fix-9} + +- This release also contains all bug fixes from 19.11.12.69. + +### ClickHouse Release 19.13.5.44, 2019-09-20 {#clickhouse-release-19-13-5-44-2019-09-20} + +#### Bug Fix {#bug-fix-10} + +- This release also contains all bug fixes from 19.14.6.12. +- Fixed possible inconsistent state of table while executing `DROP` query for replicated table while zookeeper is not accessible. [#6045](https://github.com/ClickHouse/ClickHouse/issues/6045) [#6413](https://github.com/ClickHouse/ClickHouse/pull/6413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Fix for data race in StorageMerge [#6717](https://github.com/ClickHouse/ClickHouse/pull/6717) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug introduced in query profiler which leads to endless recv from socket. [#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) ([alesapin](https://github.com/alesapin)) +- Fix excessive CPU usage while executing `JSONExtractRaw` function over a boolean value. [#6208](https://github.com/ClickHouse/ClickHouse/pull/6208) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixes the regression while pushing to materialized view. [#6415](https://github.com/ClickHouse/ClickHouse/pull/6415) ([Ivan](https://github.com/abyss7)) +- Table function `url` had the vulnerability allowed the attacker to inject arbitrary HTTP headers in the request. This issue was found by [Nikita Tikhomirov](https://github.com/NSTikhomirov). [#6466](https://github.com/ClickHouse/ClickHouse/pull/6466) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix useless `AST` check in Set index. [#6510](https://github.com/ClickHouse/ClickHouse/issues/6510) [#6651](https://github.com/ClickHouse/ClickHouse/pull/6651) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fixed parsing of `AggregateFunction` values embedded in query. [#6575](https://github.com/ClickHouse/ClickHouse/issues/6575) [#6773](https://github.com/ClickHouse/ClickHouse/pull/6773) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fixed wrong behaviour of `trim` functions family. [#6647](https://github.com/ClickHouse/ClickHouse/pull/6647) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.13.4.32, 2019-09-10 {#clickhouse-release-19-13-4-32-2019-09-10} + +#### Bug Fix {#bug-fix-11} + +- This release also contains all bug security fixes from 19.11.9.52 and 19.11.10.54. +- Fixed data race in `system.parts` table and `ALTER` query. [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245) [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed mismatched header in streams happened in case of reading from empty distributed table with sample and prewhere. [#6167](https://github.com/ClickHouse/ClickHouse/issues/6167) ([Lixiang Qian](https://github.com/fancyqlx)) [#6823](https://github.com/ClickHouse/ClickHouse/pull/6823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed crash when using `IN` clause with a subquery with a tuple. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) +- Fix case with same column names in `GLOBAL JOIN ON` section. [#6181](https://github.com/ClickHouse/ClickHouse/pull/6181) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix crash when casting types to `Decimal` that do not support it. Throw exception instead. [#6297](https://github.com/ClickHouse/ClickHouse/pull/6297) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed crash in `extractAll()` function. [#6644](https://github.com/ClickHouse/ClickHouse/pull/6644) ([Artem Zuikov](https://github.com/4ertus2)) +- Query transformation for `MySQL`, `ODBC`, `JDBC` table functions now works properly for `SELECT WHERE` queries with multiple `AND` expressions. [#6381](https://github.com/ClickHouse/ClickHouse/issues/6381) [#6676](https://github.com/ClickHouse/ClickHouse/pull/6676) ([dimarub2000](https://github.com/dimarub2000)) +- Added previous declaration checks for MySQL 8 integration. [#6569](https://github.com/ClickHouse/ClickHouse/pull/6569) ([Rafael David Tinoco](https://github.com/rafaeldtinoco)) + +#### Security Fix {#security-fix-1} + +- Fix two vulnerabilities in codecs in decompression phase (malicious user can fabricate compressed data that will lead to buffer overflow in decompression). [#6670](https://github.com/ClickHouse/ClickHouse/pull/6670) ([Artem Zuikov](https://github.com/4ertus2)) + +### ClickHouse Release 19.13.3.26, 2019-08-22 {#clickhouse-release-19-13-3-26-2019-08-22} + +#### Bug Fix {#bug-fix-12} + +- Fix `ALTER TABLE ... UPDATE` query for tables with `enable_mixed_granularity_parts=1`. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Fix NPE when using IN clause with a subquery with a tuple. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) +- Fixed an issue that if a stale replica becomes alive, it may still have data parts that were removed by DROP PARTITION. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) +- Fixed issue with parsing CSV [#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([tavplubix](https://github.com/tavplubix)) +- Fixed data race in system.parts table and ALTER query. This fixes [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed wrong code in mutations that may lead to memory corruption. Fixed segfault with read of address `0x14c0` that may happed due to concurrent `DROP TABLE` and `SELECT` from `system.parts` or `system.parts_columns`. Fixed race condition in preparation of mutation queries. Fixed deadlock caused by `OPTIMIZE` of Replicated tables and concurrent modification operations like ALTERs. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed possible data loss after `ALTER DELETE` query on table with skipping index. [#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Security Fix {#security-fix-2} + +- If the attacker has write access to ZooKeeper and is able to run custom server available from the network where ClickHouse run, it can create custom-built malicious server that will act as ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. Found by Eldar Zaitov, information security team at Yandex. [#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.13.2.19, 2019-08-14 {#clickhouse-release-19-13-2-19-2019-08-14} + +#### New Feature {#new-feature-5} + +- Sampling profiler on query level. [Example](https://gist.github.com/alexey-milovidov/92758583dd41c24c360fdb8d6a4da194). [#4247](https://github.com/ClickHouse/ClickHouse/issues/4247) ([laplab](https://github.com/laplab)) [#6124](https://github.com/ClickHouse/ClickHouse/pull/6124) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#6250](https://github.com/ClickHouse/ClickHouse/pull/6250) [#6283](https://github.com/ClickHouse/ClickHouse/pull/6283) [#6386](https://github.com/ClickHouse/ClickHouse/pull/6386) +- Allow to specify a list of columns with `COLUMNS('regexp')` expression that works like a more sophisticated variant of `*` asterisk. [#5951](https://github.com/ClickHouse/ClickHouse/pull/5951) ([mfridental](https://github.com/mfridental)), ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `CREATE TABLE AS table_function()` is now possible [#6057](https://github.com/ClickHouse/ClickHouse/pull/6057) ([dimarub2000](https://github.com/dimarub2000)) +- Adam optimizer for stochastic gradient descent is used by default in `stochasticLinearRegression()` and `stochasticLogisticRegression()` aggregate functions, because it shows good quality without almost any tuning. [#6000](https://github.com/ClickHouse/ClickHouse/pull/6000) ([Quid37](https://github.com/Quid37)) +- Added functions for working with the сustom week number [#5212](https://github.com/ClickHouse/ClickHouse/pull/5212) ([Andy Yang](https://github.com/andyyzh)) +- `RENAME` queries now work with all storages. [#5953](https://github.com/ClickHouse/ClickHouse/pull/5953) ([Ivan](https://github.com/abyss7)) +- Now client receive logs from server with any desired level by setting `send_logs_level` regardless to the log level specified in server settings. [#5964](https://github.com/ClickHouse/ClickHouse/pull/5964) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) + +#### Backward Incompatible Change {#backward-incompatible-change-4} + +- The setting `input_format_defaults_for_omitted_fields` is enabled by default. Inserts in Distributed tables need this setting to be the same on cluster (you need to set it before rolling update). It enables calculation of complex default expressions for omitted fields in `JSONEachRow` and `CSV*` formats. It should be the expected behavior but may lead to negligible performance difference. [#6043](https://github.com/ClickHouse/ClickHouse/pull/6043) ([Artem Zuikov](https://github.com/4ertus2)), [#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) + +#### Experimental Features {#experimental-features} + +- New query processing pipeline. Use `experimental_use_processors=1` option to enable it. Use for your own trouble. [#4914](https://github.com/ClickHouse/ClickHouse/pull/4914) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Bug Fix {#bug-fix-13} + +- Kafka integration has been fixed in this version. +- Fixed `DoubleDelta` encoding of `Int64` for large `DoubleDelta` values, improved `DoubleDelta` encoding for random data for `Int32`. [#5998](https://github.com/ClickHouse/ClickHouse/pull/5998) ([Vasily Nemkov](https://github.com/Enmk)) +- Fixed overestimation of `max_rows_to_read` if the setting `merge_tree_uniform_read_distribution` is set to 0. [#6019](https://github.com/ClickHouse/ClickHouse/pull/6019) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement {#improvement-4} + +- Throws an exception if `config.d` file does not have the corresponding root element as the config file [#6123](https://github.com/ClickHouse/ClickHouse/pull/6123) ([dimarub2000](https://github.com/dimarub2000)) + +#### Performance Improvement {#performance-improvement-3} + +- Optimize `count()`. Now it uses the smallest column (if possible). [#6028](https://github.com/ClickHouse/ClickHouse/pull/6028) ([Amos Bird](https://github.com/amosbird)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-5} + +- Report memory usage in performance tests. [#5899](https://github.com/ClickHouse/ClickHouse/pull/5899) ([akuzm](https://github.com/akuzm)) +- Fix build with external `libcxx` [#6010](https://github.com/ClickHouse/ClickHouse/pull/6010) ([Ivan](https://github.com/abyss7)) +- Fix shared build with `rdkafka` library [#6101](https://github.com/ClickHouse/ClickHouse/pull/6101) ([Ivan](https://github.com/abyss7)) + +## ClickHouse Release 19.11 {#clickhouse-release-19-11} + +### ClickHouse Release 19.11.13.74, 2019-11-01 {#clickhouse-release-19-11-13-74-2019-11-01} + +#### Bug Fix {#bug-fix-14} + +- Fixed rare crash in `ALTER MODIFY COLUMN` and vertical merge when one of merged/altered parts is empty (0 rows). [#6780](https://github.com/ClickHouse/ClickHouse/pull/6780) ([alesapin](https://github.com/alesapin)) +- Manual update of `SIMDJSON`. This fixes possible flooding of stderr files with bogus json diagnostic messages. [#7548](https://github.com/ClickHouse/ClickHouse/pull/7548) ([Alexander Kazakov](https://github.com/Akazz)) +- Fixed bug with `mrk` file extension for mutations ([alesapin](https://github.com/alesapin)) + +### ClickHouse Release 19.11.12.69, 2019-10-02 {#clickhouse-release-19-11-12-69-2019-10-02} + +#### Bug Fix {#bug-fix-15} + +- Fixed performance degradation of index analysis on complex keys on large tables. This fixes [#6924](https://github.com/ClickHouse/ClickHouse/issues/6924). [#7075](https://github.com/ClickHouse/ClickHouse/pull/7075) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid rare SIGSEGV while sending data in tables with Distributed engine (`Failed to send batch: file with index XXXXX is absent`). [#7032](https://github.com/ClickHouse/ClickHouse/pull/7032) ([Azat Khuzhin](https://github.com/azat)) +- Fix `Unknown identifier` with multiple joins. This fixes [#5254](https://github.com/ClickHouse/ClickHouse/issues/5254). [#7022](https://github.com/ClickHouse/ClickHouse/pull/7022) ([Artem Zuikov](https://github.com/4ertus2)) + +### ClickHouse Release 19.11.11.57, 2019-09-13 {#clickhouse-release-19-11-11-57-2019-09-13} + +- Fix logical error causing segfaults when selecting from Kafka empty topic. [#6902](https://github.com/ClickHouse/ClickHouse/issues/6902) [#6909](https://github.com/ClickHouse/ClickHouse/pull/6909) ([Ivan](https://github.com/abyss7)) +- Fix for function `АrrayEnumerateUniqRanked` with empty arrays in params. [#6928](https://github.com/ClickHouse/ClickHouse/pull/6928) ([proller](https://github.com/proller)) + +### ClickHouse Release 19.11.10.54, 2019-09-10 {#clickhouse-release-19-11-10-54-2019-09-10} + +#### Bug Fix {#bug-fix-16} + +- Do store offsets for Kafka messages manually to be able to commit them all at once for all partitions. Fixes potential duplication in “one consumer - many partitions” scenario. [#6872](https://github.com/ClickHouse/ClickHouse/pull/6872) ([Ivan](https://github.com/abyss7)) + +### ClickHouse Release 19.11.9.52, 2019-09-6 {#clickhouse-release-19-11-9-52-2019-09-6} + +- Improve error handling in cache dictionaries. [#6737](https://github.com/ClickHouse/ClickHouse/pull/6737) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixed bug in function `arrayEnumerateUniqRanked`. [#6779](https://github.com/ClickHouse/ClickHouse/pull/6779) ([proller](https://github.com/proller)) +- Fix `JSONExtract` function while extracting a `Tuple` from JSON. [#6718](https://github.com/ClickHouse/ClickHouse/pull/6718) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixed possible data loss after `ALTER DELETE` query on table with skipping index. [#6224](https://github.com/ClickHouse/ClickHouse/issues/6224) [#6282](https://github.com/ClickHouse/ClickHouse/pull/6282) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fixed performance test. [#6392](https://github.com/ClickHouse/ClickHouse/pull/6392) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Parquet: Fix reading boolean columns. [#6579](https://github.com/ClickHouse/ClickHouse/pull/6579) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed wrong behaviour of `nullIf` function for constant arguments. [#6518](https://github.com/ClickHouse/ClickHouse/pull/6518) ([Guillaume Tassery](https://github.com/YiuRULE)) [#6580](https://github.com/ClickHouse/ClickHouse/pull/6580) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix Kafka messages duplication problem on normal server restart. [#6597](https://github.com/ClickHouse/ClickHouse/pull/6597) ([Ivan](https://github.com/abyss7)) +- Fixed an issue when long `ALTER UPDATE` or `ALTER DELETE` may prevent regular merges to run. Prevent mutations from executing if there is no enough free threads available. [#6502](https://github.com/ClickHouse/ClickHouse/issues/6502) [#6617](https://github.com/ClickHouse/ClickHouse/pull/6617) ([tavplubix](https://github.com/tavplubix)) +- Fixed error with processing “timezone” in server configuration file. [#6709](https://github.com/ClickHouse/ClickHouse/pull/6709) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix kafka tests. [#6805](https://github.com/ClickHouse/ClickHouse/pull/6805) ([Ivan](https://github.com/abyss7)) + +#### Security Fix {#security-fix-3} + +- If the attacker has write access to ZooKeeper and is able to run custom server available from the network where ClickHouse runs, it can create custom-built malicious server that will act as ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. Found by Eldar Zaitov, information security team at Yandex. [#6247](https://github.com/ClickHouse/ClickHouse/pull/6247) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.11.8.46, 2019-08-22 {#clickhouse-release-19-11-8-46-2019-08-22} + +#### Bug Fix {#bug-fix-17} + +- Fix `ALTER TABLE ... UPDATE` query for tables with `enable_mixed_granularity_parts=1`. [#6543](https://github.com/ClickHouse/ClickHouse/pull/6543) ([alesapin](https://github.com/alesapin)) +- Fix NPE when using IN clause with a subquery with a tuple. [#6125](https://github.com/ClickHouse/ClickHouse/issues/6125) [#6550](https://github.com/ClickHouse/ClickHouse/pull/6550) ([tavplubix](https://github.com/tavplubix)) +- Fixed an issue that if a stale replica becomes alive, it may still have data parts that were removed by DROP PARTITION. [#6522](https://github.com/ClickHouse/ClickHouse/issues/6522) [#6523](https://github.com/ClickHouse/ClickHouse/pull/6523) ([tavplubix](https://github.com/tavplubix)) +- Fixed issue with parsing CSV [#6426](https://github.com/ClickHouse/ClickHouse/issues/6426) [#6559](https://github.com/ClickHouse/ClickHouse/pull/6559) ([tavplubix](https://github.com/tavplubix)) +- Fixed data race in system.parts table and ALTER query. This fixes [#6245](https://github.com/ClickHouse/ClickHouse/issues/6245). [#6513](https://github.com/ClickHouse/ClickHouse/pull/6513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed wrong code in mutations that may lead to memory corruption. Fixed segfault with read of address `0x14c0` that may happed due to concurrent `DROP TABLE` and `SELECT` from `system.parts` or `system.parts_columns`. Fixed race condition in preparation of mutation queries. Fixed deadlock caused by `OPTIMIZE` of Replicated tables and concurrent modification operations like ALTERs. [#6514](https://github.com/ClickHouse/ClickHouse/pull/6514) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.11.7.40, 2019-08-14 {#clickhouse-release-19-11-7-40-2019-08-14} + +#### Bug Fix {#bug-fix-18} + +- Kafka integration has been fixed in this version. +- Fix segfault when using `arrayReduce` for constant arguments. [#6326](https://github.com/ClickHouse/ClickHouse/pull/6326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `toFloat()` monotonicity. [#6374](https://github.com/ClickHouse/ClickHouse/pull/6374) ([dimarub2000](https://github.com/dimarub2000)) +- Fix segfault with enabled `optimize_skip_unused_shards` and missing sharding key. [#6384](https://github.com/ClickHouse/ClickHouse/pull/6384) ([CurtizJ](https://github.com/CurtizJ)) +- Fixed logic of `arrayEnumerateUniqRanked` function. [#6423](https://github.com/ClickHouse/ClickHouse/pull/6423) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Removed extra verbose logging from MySQL handler. [#6389](https://github.com/ClickHouse/ClickHouse/pull/6389) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix wrong behavior and possible segfaults in `topK` and `topKWeighted` aggregated functions. [#6404](https://github.com/ClickHouse/ClickHouse/pull/6404) ([CurtizJ](https://github.com/CurtizJ)) +- Do not expose virtual columns in `system.columns` table. This is required for backward compatibility. [#6406](https://github.com/ClickHouse/ClickHouse/pull/6406) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug with memory allocation for string fields in complex key cache dictionary. [#6447](https://github.com/ClickHouse/ClickHouse/pull/6447) ([alesapin](https://github.com/alesapin)) +- Fix bug with enabling adaptive granularity when creating new replica for `Replicated*MergeTree` table. [#6452](https://github.com/ClickHouse/ClickHouse/pull/6452) ([alesapin](https://github.com/alesapin)) +- Fix infinite loop when reading Kafka messages. [#6354](https://github.com/ClickHouse/ClickHouse/pull/6354) ([abyss7](https://github.com/abyss7)) +- Fixed the possibility of a fabricated query to cause server crash due to stack overflow in SQL parser and possibility of stack overflow in `Merge` and `Distributed` tables [#6433](https://github.com/ClickHouse/ClickHouse/pull/6433) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed Gorilla encoding error on small sequences. [#6444](https://github.com/ClickHouse/ClickHouse/pull/6444) ([Enmk](https://github.com/Enmk)) + +#### Improvement {#improvement-5} + +- Allow user to override `poll_interval` and `idle_connection_timeout` settings on connection. [#6230](https://github.com/ClickHouse/ClickHouse/pull/6230) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.11.5.28, 2019-08-05 {#clickhouse-release-19-11-5-28-2019-08-05} + +#### Bug Fix {#bug-fix-19} + +- Fixed the possibility of hanging queries when server is overloaded. [#6301](https://github.com/ClickHouse/ClickHouse/pull/6301) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix FPE in yandexConsistentHash function. This fixes [#6304](https://github.com/ClickHouse/ClickHouse/issues/6304). [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed bug in conversion of `LowCardinality` types in `AggregateFunctionFactory`. This fixes [#6257](https://github.com/ClickHouse/ClickHouse/issues/6257). [#6281](https://github.com/ClickHouse/ClickHouse/pull/6281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix parsing of `bool` settings from `true` and `false` strings in configuration files. [#6278](https://github.com/ClickHouse/ClickHouse/pull/6278) ([alesapin](https://github.com/alesapin)) +- Fix rare bug with incompatible stream headers in queries to `Distributed` table over `MergeTree` table when part of `WHERE` moves to `PREWHERE`. [#6236](https://github.com/ClickHouse/ClickHouse/pull/6236) ([alesapin](https://github.com/alesapin)) +- Fixed overflow in integer division of signed type to unsigned type. This fixes [#6214](https://github.com/ClickHouse/ClickHouse/issues/6214). [#6233](https://github.com/ClickHouse/ClickHouse/pull/6233) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Backward Incompatible Change {#backward-incompatible-change-5} + +- `Kafka` still broken. + +### ClickHouse Release 19.11.4.24, 2019-08-01 {#clickhouse-release-19-11-4-24-2019-08-01} + +#### Bug Fix {#bug-fix-20} + +- Fix bug with writing secondary indices marks with adaptive granularity. [#6126](https://github.com/ClickHouse/ClickHouse/pull/6126) ([alesapin](https://github.com/alesapin)) +- Fix `WITH ROLLUP` and `WITH CUBE` modifiers of `GROUP BY` with two-level aggregation. [#6225](https://github.com/ClickHouse/ClickHouse/pull/6225) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed hang in `JSONExtractRaw` function. Fixed [#6195](https://github.com/ClickHouse/ClickHouse/issues/6195) [#6198](https://github.com/ClickHouse/ClickHouse/pull/6198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix segfault in ExternalLoader::reloadOutdated(). [#6082](https://github.com/ClickHouse/ClickHouse/pull/6082) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fixed the case when server may close listening sockets but not shutdown and continue serving remaining queries. You may end up with two running clickhouse-server processes. Sometimes, the server may return an error `bad_function_call` for remaining queries. [#6231](https://github.com/ClickHouse/ClickHouse/pull/6231) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed useless and incorrect condition on update field for initial loading of external dictionaries via ODBC, MySQL, ClickHouse and HTTP. This fixes [#6069](https://github.com/ClickHouse/ClickHouse/issues/6069) [#6083](https://github.com/ClickHouse/ClickHouse/pull/6083) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed irrelevant exception in cast of `LowCardinality(Nullable)` to not-Nullable column in case if it does not contain Nulls (e.g. in query like `SELECT CAST(CAST('Hello' AS LowCardinality(Nullable(String))) AS String)`. [#6094](https://github.com/ClickHouse/ClickHouse/issues/6094) [#6119](https://github.com/ClickHouse/ClickHouse/pull/6119) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix non-deterministic result of “uniq” aggregate function in extreme rare cases. The bug was present in all ClickHouse versions. [#6058](https://github.com/ClickHouse/ClickHouse/pull/6058) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Segfault when we set a little bit too high CIDR on the function `IPv6CIDRToRange`. [#6068](https://github.com/ClickHouse/ClickHouse/pull/6068) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Fixed small memory leak when server throw many exceptions from many different contexts. [#6144](https://github.com/ClickHouse/ClickHouse/pull/6144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix the situation when consumer got paused before subscription and not resumed afterwards. [#6075](https://github.com/ClickHouse/ClickHouse/pull/6075) ([Ivan](https://github.com/abyss7)) Note that Kafka is broken in this version. +- Clearing the Kafka data buffer from the previous read operation that was completed with an error [#6026](https://github.com/ClickHouse/ClickHouse/pull/6026) ([Nikolay](https://github.com/bopohaa)) Note that Kafka is broken in this version. +- Since `StorageMergeTree::background_task_handle` is initialized in `startup()` the `MergeTreeBlockOutputStream::write()` may try to use it before initialization. Just check if it is initialized. [#6080](https://github.com/ClickHouse/ClickHouse/pull/6080) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-6} + +- Added official `rpm` packages. [#5740](https://github.com/ClickHouse/ClickHouse/pull/5740) ([proller](https://github.com/proller)) ([alesapin](https://github.com/alesapin)) +- Add an ability to build `.rpm` and `.tgz` packages with `packager` script. [#5769](https://github.com/ClickHouse/ClickHouse/pull/5769) ([alesapin](https://github.com/alesapin)) +- Fixes for “Arcadia” build system. [#6223](https://github.com/ClickHouse/ClickHouse/pull/6223) ([proller](https://github.com/proller)) + +#### Backward Incompatible Change {#backward-incompatible-change-6} + +- `Kafka` is broken in this version. + +### ClickHouse Release 19.11.3.11, 2019-07-18 {#clickhouse-release-19-11-3-11-2019-07-18} + +#### New Feature {#new-feature-6} + +- Added support for prepared statements. [#5331](https://github.com/ClickHouse/ClickHouse/pull/5331/) ([Alexander](https://github.com/sanych73)) [#5630](https://github.com/ClickHouse/ClickHouse/pull/5630) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `DoubleDelta` and `Gorilla` column codecs [#5600](https://github.com/ClickHouse/ClickHouse/pull/5600) ([Vasily Nemkov](https://github.com/Enmk)) +- Added `os_thread_priority` setting that allows to control the “nice” value of query processing threads that is used by OS to adjust dynamic scheduling priority. It requires `CAP_SYS_NICE` capabilities to work. This implements [#5858](https://github.com/ClickHouse/ClickHouse/issues/5858) [#5909](https://github.com/ClickHouse/ClickHouse/pull/5909) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implement `_topic`, `_offset`, `_key` columns for Kafka engine [#5382](https://github.com/ClickHouse/ClickHouse/pull/5382) ([Ivan](https://github.com/abyss7)) Note that Kafka is broken in this version. +- Add aggregate function combinator `-Resample` [#5590](https://github.com/ClickHouse/ClickHouse/pull/5590) ([hcz](https://github.com/hczhcz)) +- Aggregate functions `groupArrayMovingSum(win_size)(x)` and `groupArrayMovingAvg(win_size)(x)`, which calculate moving sum/avg with or without window-size limitation. [#5595](https://github.com/ClickHouse/ClickHouse/pull/5595) ([inv2004](https://github.com/inv2004)) +- Add synonim `arrayFlatten` \<-\> `flatten` [#5764](https://github.com/ClickHouse/ClickHouse/pull/5764) ([hcz](https://github.com/hczhcz)) +- Intergate H3 function `geoToH3` from Uber. [#4724](https://github.com/ClickHouse/ClickHouse/pull/4724) ([Remen Ivan](https://github.com/BHYCHIK)) [#5805](https://github.com/ClickHouse/ClickHouse/pull/5805) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Bug Fix {#bug-fix-21} + +- Implement DNS cache with asynchronous update. Separate thread resolves all hosts and updates DNS cache with period (setting `dns_cache_update_period`). It should help, when ip of hosts changes frequently. [#5857](https://github.com/ClickHouse/ClickHouse/pull/5857) ([Anton Popov](https://github.com/CurtizJ)) +- Fix segfault in `Delta` codec which affects columns with values less than 32 bits size. The bug led to random memory corruption. [#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) +- Fix segfault in TTL merge with non-physical columns in block. [#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) +- Fix rare bug in checking of part with `LowCardinality` column. Previously `checkDataPart` always fails for part with `LowCardinality` column. [#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) +- Avoid hanging connections when server thread pool is full. It is important for connections from `remote` table function or connections to a shard without replicas when there is long connection timeout. This fixes [#5878](https://github.com/ClickHouse/ClickHouse/issues/5878) [#5881](https://github.com/ClickHouse/ClickHouse/pull/5881) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Support for constant arguments to `evalMLModel` function. This fixes [#5817](https://github.com/ClickHouse/ClickHouse/issues/5817) [#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed the issue when ClickHouse determines default time zone as `UCT` instead of `UTC`. This fixes [#5804](https://github.com/ClickHouse/ClickHouse/issues/5804). [#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed buffer underflow in `visitParamExtractRaw`. This fixes [#5901](https://github.com/ClickHouse/ClickHouse/issues/5901) [#5902](https://github.com/ClickHouse/ClickHouse/pull/5902) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now distributed `DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER` queries will be executed directly on leader replica. [#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) +- Fix `coalesce` for `ColumnConst` with `ColumnNullable` + related changes. [#5755](https://github.com/ClickHouse/ClickHouse/pull/5755) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix the `ReadBufferFromKafkaConsumer` so that it keeps reading new messages after `commit()` even if it was stalled before [#5852](https://github.com/ClickHouse/ClickHouse/pull/5852) ([Ivan](https://github.com/abyss7)) +- Fix `FULL` and `RIGHT` JOIN results when joining on `Nullable` keys in right table. [#5859](https://github.com/ClickHouse/ClickHouse/pull/5859) ([Artem Zuikov](https://github.com/4ertus2)) +- Possible fix of infinite sleeping of low-priority queries. [#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix race condition, which cause that some queries may not appear in query_log after `SYSTEM FLUSH LOGS` query. [#5456](https://github.com/ClickHouse/ClickHouse/issues/5456) [#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) +- Fixed `heap-use-after-free` ASan warning in ClusterCopier caused by watch which try to use already removed copier object. [#5871](https://github.com/ClickHouse/ClickHouse/pull/5871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed wrong `StringRef` pointer returned by some implementations of `IColumn::deserializeAndInsertFromArena`. This bug affected only unit-tests. [#5973](https://github.com/ClickHouse/ClickHouse/pull/5973) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Prevent source and intermediate array join columns of masking same name columns. [#5941](https://github.com/ClickHouse/ClickHouse/pull/5941) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix insert and select query to MySQL engine with MySQL style identifier quoting. [#5704](https://github.com/ClickHouse/ClickHouse/pull/5704) ([Winter Zhang](https://github.com/zhang2014)) +- Now `CHECK TABLE` query can work with MergeTree engine family. It returns check status and message if any for each part (or file in case of simplier engines). Also, fix bug in fetch of a broken part. [#5865](https://github.com/ClickHouse/ClickHouse/pull/5865) ([alesapin](https://github.com/alesapin)) +- Fix SPLIT_SHARED_LIBRARIES runtime [#5793](https://github.com/ClickHouse/ClickHouse/pull/5793) ([Danila Kutenin](https://github.com/danlark1)) +- Fixed time zone initialization when `/etc/localtime` is a relative symlink like `../usr/share/zoneinfo/Asia/Istanbul` [#5922](https://github.com/ClickHouse/ClickHouse/pull/5922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- clickhouse-copier: Fix use-after free on shutdown [#5752](https://github.com/ClickHouse/ClickHouse/pull/5752) ([proller](https://github.com/proller)) +- Updated `simdjson`. Fixed the issue that some invalid JSONs with zero bytes successfully parse. [#5938](https://github.com/ClickHouse/ClickHouse/pull/5938) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix shutdown of SystemLogs [#5802](https://github.com/ClickHouse/ClickHouse/pull/5802) ([Anton Popov](https://github.com/CurtizJ)) +- Fix hanging when condition in invalidate_query depends on a dictionary. [#6011](https://github.com/ClickHouse/ClickHouse/pull/6011) ([Vitaly Baranov](https://github.com/vitlibar)) + +#### Improvement {#improvement-6} + +- Allow unresolvable addresses in cluster configuration. They will be considered unavailable and tried to resolve at every connection attempt. This is especially useful for Kubernetes. This fixes [#5714](https://github.com/ClickHouse/ClickHouse/issues/5714) [#5924](https://github.com/ClickHouse/ClickHouse/pull/5924) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Close idle TCP connections (with one hour timeout by default). This is especially important for large clusters with multiple distributed tables on every server, because every server can possibly keep a connection pool to every other server, and after peak query concurrency, connections will stall. This fixes [#5879](https://github.com/ClickHouse/ClickHouse/issues/5879) [#5880](https://github.com/ClickHouse/ClickHouse/pull/5880) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Better quality of `topK` function. Changed the SavingSpace set behavior to remove the last element if the new element have a bigger weight. [#5833](https://github.com/ClickHouse/ClickHouse/issues/5833) [#5850](https://github.com/ClickHouse/ClickHouse/pull/5850) ([Guillaume Tassery](https://github.com/YiuRULE)) +- URL functions to work with domains now can work for incomplete URLs without scheme [#5725](https://github.com/ClickHouse/ClickHouse/pull/5725) ([alesapin](https://github.com/alesapin)) +- Checksums added to the `system.parts_columns` table. [#5874](https://github.com/ClickHouse/ClickHouse/pull/5874) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +- Added `Enum` data type as a synonim for `Enum8` or `Enum16`. [#5886](https://github.com/ClickHouse/ClickHouse/pull/5886) ([dimarub2000](https://github.com/dimarub2000)) +- Full bit transpose variant for `T64` codec. Could lead to better compression with `zstd`. [#5742](https://github.com/ClickHouse/ClickHouse/pull/5742) ([Artem Zuikov](https://github.com/4ertus2)) +- Condition on `startsWith` function now can uses primary key. This fixes [#5310](https://github.com/ClickHouse/ClickHouse/issues/5310) and [#5882](https://github.com/ClickHouse/ClickHouse/issues/5882) [#5919](https://github.com/ClickHouse/ClickHouse/pull/5919) ([dimarub2000](https://github.com/dimarub2000)) +- Allow to use `clickhouse-copier` with cross-replication cluster topology by permitting empty database name. [#5745](https://github.com/ClickHouse/ClickHouse/pull/5745) ([nvartolomei](https://github.com/nvartolomei)) +- Use `UTC` as default timezone on a system without `tzdata` (e.g. bare Docker container). Before this patch, error message `Could not determine local time zone` was printed and server or client refused to start. [#5827](https://github.com/ClickHouse/ClickHouse/pull/5827) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Returned back support for floating point argument in function `quantileTiming` for backward compatibility. [#5911](https://github.com/ClickHouse/ClickHouse/pull/5911) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Show which table is missing column in error messages. [#5768](https://github.com/ClickHouse/ClickHouse/pull/5768) ([Ivan](https://github.com/abyss7)) +- Disallow run query with same query_id by various users [#5430](https://github.com/ClickHouse/ClickHouse/pull/5430) ([proller](https://github.com/proller)) +- More robust code for sending metrics to Graphite. It will work even during long multiple `RENAME TABLE` operation. [#5875](https://github.com/ClickHouse/ClickHouse/pull/5875) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- More informative error messages will be displayed when ThreadPool cannot schedule a task for execution. This fixes [#5305](https://github.com/ClickHouse/ClickHouse/issues/5305) [#5801](https://github.com/ClickHouse/ClickHouse/pull/5801) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Inverting ngramSearch to be more intuitive [#5807](https://github.com/ClickHouse/ClickHouse/pull/5807) ([Danila Kutenin](https://github.com/danlark1)) +- Add user parsing in HDFS engine builder [#5946](https://github.com/ClickHouse/ClickHouse/pull/5946) ([akonyaev90](https://github.com/akonyaev90)) +- Update default value of `max_ast_elements parameter` [#5933](https://github.com/ClickHouse/ClickHouse/pull/5933) ([Artem Konovalov](https://github.com/izebit)) +- Added a notion of obsolete settings. The obsolete setting `allow_experimental_low_cardinality_type` can be used with no effect. [0f15c01c6802f7ce1a1494c12c846be8c98944cd](https://github.com/ClickHouse/ClickHouse/commit/0f15c01c6802f7ce1a1494c12c846be8c98944cd) [Alexey Milovidov](https://github.com/alexey-milovidov) + +#### Performance Improvement {#performance-improvement-4} + +- Increase number of streams to SELECT from Merge table for more uniform distribution of threads. Added setting `max_streams_multiplier_for_merge_tables`. This fixes [#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [#5915](https://github.com/ClickHouse/ClickHouse/pull/5915) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-7} + +- Add a backward compatibility test for client-server interaction with different versions of clickhouse. [#5868](https://github.com/ClickHouse/ClickHouse/pull/5868) ([alesapin](https://github.com/alesapin)) +- Test coverage information in every commit and pull request. [#5896](https://github.com/ClickHouse/ClickHouse/pull/5896) ([alesapin](https://github.com/alesapin)) +- Cooperate with address sanitizer to support our custom allocators (`Arena` and `ArenaWithFreeLists`) for better debugging of “use-after-free” errors. [#5728](https://github.com/ClickHouse/ClickHouse/pull/5728) ([akuzm](https://github.com/akuzm)) +- Switch to [LLVM libunwind implementation](https://github.com/llvm-mirror/libunwind) for C++ exception handling and for stack traces printing [#4828](https://github.com/ClickHouse/ClickHouse/pull/4828) ([Nikita Lapkov](https://github.com/laplab)) +- Add two more warnings from -Weverything [#5923](https://github.com/ClickHouse/ClickHouse/pull/5923) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to build ClickHouse with Memory Sanitizer. [#3949](https://github.com/ClickHouse/ClickHouse/pull/3949) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed ubsan report about `bitTest` function in fuzz test. [#5943](https://github.com/ClickHouse/ClickHouse/pull/5943) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Docker: added possibility to init a ClickHouse instance which requires authentication. [#5727](https://github.com/ClickHouse/ClickHouse/pull/5727) ([Korviakov Andrey](https://github.com/shurshun)) +- Update librdkafka to version 1.1.0 [#5872](https://github.com/ClickHouse/ClickHouse/pull/5872) ([Ivan](https://github.com/abyss7)) +- Add global timeout for integration tests and disable some of them in tests code. [#5741](https://github.com/ClickHouse/ClickHouse/pull/5741) ([alesapin](https://github.com/alesapin)) +- Fix some ThreadSanitizer failures. [#5854](https://github.com/ClickHouse/ClickHouse/pull/5854) ([akuzm](https://github.com/akuzm)) +- The `--no-undefined` option forces the linker to check all external names for existence while linking. It’s very useful to track real dependencies between libraries in the split build mode. [#5855](https://github.com/ClickHouse/ClickHouse/pull/5855) ([Ivan](https://github.com/abyss7)) +- Added performance test for [#5797](https://github.com/ClickHouse/ClickHouse/issues/5797) [#5914](https://github.com/ClickHouse/ClickHouse/pull/5914) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed compatibility with gcc-7. [#5840](https://github.com/ClickHouse/ClickHouse/pull/5840) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added support for gcc-9. This fixes [#5717](https://github.com/ClickHouse/ClickHouse/issues/5717) [#5774](https://github.com/ClickHouse/ClickHouse/pull/5774) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error when libunwind can be linked incorrectly. [#5948](https://github.com/ClickHouse/ClickHouse/pull/5948) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a few warnings found by PVS-Studio. [#5921](https://github.com/ClickHouse/ClickHouse/pull/5921) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added initial support for `clang-tidy` static analyzer. [#5806](https://github.com/ClickHouse/ClickHouse/pull/5806) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Convert BSD/Linux endian macros( ‘be64toh’ and ‘htobe64’) to the Mac OS X equivalents [#5785](https://github.com/ClickHouse/ClickHouse/pull/5785) ([Fu Chen](https://github.com/fredchenbj)) +- Improved integration tests guide. [#5796](https://github.com/ClickHouse/ClickHouse/pull/5796) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Fixing build at macosx + gcc9 [#5822](https://github.com/ClickHouse/ClickHouse/pull/5822) ([filimonov](https://github.com/filimonov)) +- Fix a hard-to-spot typo: aggreAGte -\> aggregate. [#5753](https://github.com/ClickHouse/ClickHouse/pull/5753) ([akuzm](https://github.com/akuzm)) +- Fix freebsd build [#5760](https://github.com/ClickHouse/ClickHouse/pull/5760) ([proller](https://github.com/proller)) +- Add link to experimental YouTube channel to website [#5845](https://github.com/ClickHouse/ClickHouse/pull/5845) ([Ivan Blinkov](https://github.com/blinkov)) +- CMake: add option for coverage flags: WITH_COVERAGE [#5776](https://github.com/ClickHouse/ClickHouse/pull/5776) ([proller](https://github.com/proller)) +- Fix initial size of some inline PODArray’s. [#5787](https://github.com/ClickHouse/ClickHouse/pull/5787) ([akuzm](https://github.com/akuzm)) +- clickhouse-server.postinst: fix os detection for centos 6 [#5788](https://github.com/ClickHouse/ClickHouse/pull/5788) ([proller](https://github.com/proller)) +- Added Arch linux package generation. [#5719](https://github.com/ClickHouse/ClickHouse/pull/5719) ([Vladimir Chebotarev](https://github.com/excitoon)) +- Split Common/config.h by libs (dbms) [#5715](https://github.com/ClickHouse/ClickHouse/pull/5715) ([proller](https://github.com/proller)) +- Fixes for “Arcadia” build platform [#5795](https://github.com/ClickHouse/ClickHouse/pull/5795) ([proller](https://github.com/proller)) +- Fixes for unconventional build (gcc9, no submodules) [#5792](https://github.com/ClickHouse/ClickHouse/pull/5792) ([proller](https://github.com/proller)) +- Require explicit type in unalignedStore because it was proven to be bug-prone [#5791](https://github.com/ClickHouse/ClickHouse/pull/5791) ([akuzm](https://github.com/akuzm)) +- Fixes macOS build [#5830](https://github.com/ClickHouse/ClickHouse/pull/5830) ([filimonov](https://github.com/filimonov)) +- Performance test concerning the new JIT feature with bigger dataset, as requested here [#5263](https://github.com/ClickHouse/ClickHouse/issues/5263) [#5887](https://github.com/ClickHouse/ClickHouse/pull/5887) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Run stateful tests in stress test [12693e568722f11e19859742f56428455501fd2a](https://github.com/ClickHouse/ClickHouse/commit/12693e568722f11e19859742f56428455501fd2a) ([alesapin](https://github.com/alesapin)) + +#### Backward Incompatible Change {#backward-incompatible-change-7} + +- `Kafka` is broken in this version. +- Enable `adaptive_index_granularity` = 10MB by default for new `MergeTree` tables. If you created new MergeTree tables on version 19.11+, downgrade to versions prior to 19.6 will be impossible. [#5628](https://github.com/ClickHouse/ClickHouse/pull/5628) ([alesapin](https://github.com/alesapin)) +- Removed obsolete undocumented embedded dictionaries that were used by Yandex.Metrica. The functions `OSIn`, `SEIn`, `OSToRoot`, `SEToRoot`, `OSHierarchy`, `SEHierarchy` are no longer available. If you are using these functions, write email to clickhouse-feedback@yandex-team.com. Note: at the last moment we decided to keep these functions for a while. [#5780](https://github.com/ClickHouse/ClickHouse/pull/5780) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse Release 19.10 {#clickhouse-release-19-10} + +### ClickHouse Release 19.10.1.5, 2019-07-12 {#clickhouse-release-19-10-1-5-2019-07-12} + +#### New Feature {#new-feature-7} + +- Add new column codec: `T64`. Made for (U)IntX/EnumX/Data(Time)/DecimalX columns. It should be good for columns with constant or small range values. Codec itself allows enlarge or shrink data type without re-compression. [#5557](https://github.com/ClickHouse/ClickHouse/pull/5557) ([Artem Zuikov](https://github.com/4ertus2)) +- Add database engine `MySQL` that allow to view all the tables in remote MySQL server [#5599](https://github.com/ClickHouse/ClickHouse/pull/5599) ([Winter Zhang](https://github.com/zhang2014)) +- `bitmapContains` implementation. It’s 2x faster than `bitmapHasAny` if the second bitmap contains one element. [#5535](https://github.com/ClickHouse/ClickHouse/pull/5535) ([Zhichang Yu](https://github.com/yuzhichang)) +- Support for `crc32` function (with behaviour exactly as in MySQL or PHP). Do not use it if you need a hash function. [#5661](https://github.com/ClickHouse/ClickHouse/pull/5661) ([Remen Ivan](https://github.com/BHYCHIK)) +- Implemented `SYSTEM START/STOP DISTRIBUTED SENDS` queries to control asynchronous inserts into `Distributed` tables. [#4935](https://github.com/ClickHouse/ClickHouse/pull/4935) ([Winter Zhang](https://github.com/zhang2014)) + +#### Bug Fix {#bug-fix-22} + +- Ignore query execution limits and max parts size for merge limits while executing mutations. [#5659](https://github.com/ClickHouse/ClickHouse/pull/5659) ([Anton Popov](https://github.com/CurtizJ)) +- Fix bug which may lead to deduplication of normal blocks (extremely rare) and insertion of duplicate blocks (more often). [#5549](https://github.com/ClickHouse/ClickHouse/pull/5549) ([alesapin](https://github.com/alesapin)) +- Fix of function `arrayEnumerateUniqRanked` for arguments with empty arrays [#5559](https://github.com/ClickHouse/ClickHouse/pull/5559) ([proller](https://github.com/proller)) +- Don’t subscribe to Kafka topics without intent to poll any messages. [#5698](https://github.com/ClickHouse/ClickHouse/pull/5698) ([Ivan](https://github.com/abyss7)) +- Make setting `join_use_nulls` get no effect for types that cannot be inside Nullable [#5700](https://github.com/ClickHouse/ClickHouse/pull/5700) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed `Incorrect size of index granularity` errors [#5720](https://github.com/ClickHouse/ClickHouse/pull/5720) ([coraxster](https://github.com/coraxster)) +- Fix Float to Decimal convert overflow [#5607](https://github.com/ClickHouse/ClickHouse/pull/5607) ([coraxster](https://github.com/coraxster)) +- Flush buffer when `WriteBufferFromHDFS`’s destructor is called. This fixes writing into `HDFS`. [#5684](https://github.com/ClickHouse/ClickHouse/pull/5684) ([Xindong Peng](https://github.com/eejoin)) + +#### Improvement {#improvement-7} + +- Treat empty cells in `CSV` as default values when the setting `input_format_defaults_for_omitted_fields` is enabled. [#5625](https://github.com/ClickHouse/ClickHouse/pull/5625) ([akuzm](https://github.com/akuzm)) +- Non-blocking loading of external dictionaries. [#5567](https://github.com/ClickHouse/ClickHouse/pull/5567) ([Vitaly Baranov](https://github.com/vitlibar)) +- Network timeouts can be dynamically changed for already established connections according to the settings. [#4558](https://github.com/ClickHouse/ClickHouse/pull/4558) ([Konstantin Podshumok](https://github.com/podshumok)) +- Using “public_suffix_list” for functions `firstSignificantSubdomain`, `cutToFirstSignificantSubdomain`. It’s using a perfect hash table generated by `gperf` with a list generated from the file: https://publicsuffix.org/list/public_suffix_list.dat. (for example, now we recognize the domain `ac.uk` as non-significant). [#5030](https://github.com/ClickHouse/ClickHouse/pull/5030) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Adopted `IPv6` data type in system tables; unified client info columns in `system.processes` and `system.query_log` [#5640](https://github.com/ClickHouse/ClickHouse/pull/5640) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Using sessions for connections with MySQL compatibility protocol. #5476 [#5646](https://github.com/ClickHouse/ClickHouse/pull/5646) ([Yuriy Baranov](https://github.com/yurriy)) +- Support more `ALTER` queries `ON CLUSTER`. [#5593](https://github.com/ClickHouse/ClickHouse/pull/5593) [#5613](https://github.com/ClickHouse/ClickHouse/pull/5613) ([sundyli](https://github.com/sundy-li)) +- Support `` section in `clickhouse-local` config file. [#5540](https://github.com/ClickHouse/ClickHouse/pull/5540) ([proller](https://github.com/proller)) +- Allow run query with `remote` table function in `clickhouse-local` [#5627](https://github.com/ClickHouse/ClickHouse/pull/5627) ([proller](https://github.com/proller)) + +#### Performance Improvement {#performance-improvement-5} + +- Add the possibility to write the final mark at the end of MergeTree columns. It allows to avoid useless reads for keys that are out of table data range. It is enabled only if adaptive index granularity is in use. [#5624](https://github.com/ClickHouse/ClickHouse/pull/5624) ([alesapin](https://github.com/alesapin)) +- Improved performance of MergeTree tables on very slow filesystems by reducing number of `stat` syscalls. [#5648](https://github.com/ClickHouse/ClickHouse/pull/5648) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed performance degradation in reading from MergeTree tables that was introduced in version 19.6. Fixes #5631. [#5633](https://github.com/ClickHouse/ClickHouse/pull/5633) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-8} + +- Implemented `TestKeeper` as an implementation of ZooKeeper interface used for testing [#5643](https://github.com/ClickHouse/ClickHouse/pull/5643) ([alexey-milovidov](https://github.com/alexey-milovidov)) ([levushkin aleksej](https://github.com/alexey-milovidov)) +- From now on `.sql` tests can be run isolated by server, in parallel, with random database. It allows to run them faster, add new tests with custom server configurations, and be sure that different tests does not affect each other. [#5554](https://github.com/ClickHouse/ClickHouse/pull/5554) ([Ivan](https://github.com/abyss7)) +- Remove `` and `` from performance tests [#5672](https://github.com/ClickHouse/ClickHouse/pull/5672) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed “select_format” performance test for `Pretty` formats [#5642](https://github.com/ClickHouse/ClickHouse/pull/5642) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## ClickHouse Release 19.9 {#clickhouse-release-19-9} + +### ClickHouse Release 19.9.3.31, 2019-07-05 {#clickhouse-release-19-9-3-31-2019-07-05} + +#### Bug Fix {#bug-fix-23} + +- Fix segfault in Delta codec which affects columns with values less than 32 bits size. The bug led to random memory corruption. [#5786](https://github.com/ClickHouse/ClickHouse/pull/5786) ([alesapin](https://github.com/alesapin)) +- Fix rare bug in checking of part with LowCardinality column. [#5832](https://github.com/ClickHouse/ClickHouse/pull/5832) ([alesapin](https://github.com/alesapin)) +- Fix segfault in TTL merge with non-physical columns in block. [#5819](https://github.com/ClickHouse/ClickHouse/pull/5819) ([Anton Popov](https://github.com/CurtizJ)) +- Fix potential infinite sleeping of low-priority queries. [#5842](https://github.com/ClickHouse/ClickHouse/pull/5842) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix how ClickHouse determines default time zone as UCT instead of UTC. [#5828](https://github.com/ClickHouse/ClickHouse/pull/5828) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug about executing distributed DROP/ALTER/TRUNCATE/OPTIMIZE ON CLUSTER queries on follower replica before leader replica. Now they will be executed directly on leader replica. [#5757](https://github.com/ClickHouse/ClickHouse/pull/5757) ([alesapin](https://github.com/alesapin)) +- Fix race condition, which cause that some queries may not appear in query_log instantly after SYSTEM FLUSH LOGS query. [#5685](https://github.com/ClickHouse/ClickHouse/pull/5685) ([Anton Popov](https://github.com/CurtizJ)) +- Added missing support for constant arguments to `evalMLModel` function. [#5820](https://github.com/ClickHouse/ClickHouse/pull/5820) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.9.2.4, 2019-06-24 {#clickhouse-release-19-9-2-4-2019-06-24} + +#### New Feature {#new-feature-8} + +- Print information about frozen parts in `system.parts` table. [#5471](https://github.com/ClickHouse/ClickHouse/pull/5471) ([proller](https://github.com/proller)) +- Ask client password on clickhouse-client start on tty if not set in arguments [#5092](https://github.com/ClickHouse/ClickHouse/pull/5092) ([proller](https://github.com/proller)) +- Implement `dictGet` and `dictGetOrDefault` functions for Decimal types. [#5394](https://github.com/ClickHouse/ClickHouse/pull/5394) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Improvement {#improvement-8} + +- Debian init: Add service stop timeout [#5522](https://github.com/ClickHouse/ClickHouse/pull/5522) ([proller](https://github.com/proller)) +- Add setting forbidden by default to create table with suspicious types for LowCardinality [#5448](https://github.com/ClickHouse/ClickHouse/pull/5448) ([Olga Khvostikova](https://github.com/stavrolia)) +- Regression functions return model weights when not used as State in function `evalMLMethod`. [#5411](https://github.com/ClickHouse/ClickHouse/pull/5411) ([Quid37](https://github.com/Quid37)) +- Rename and improve regression methods. [#5492](https://github.com/ClickHouse/ClickHouse/pull/5492) ([Quid37](https://github.com/Quid37)) +- Clearer interfaces of string searchers. [#5586](https://github.com/ClickHouse/ClickHouse/pull/5586) ([Danila Kutenin](https://github.com/danlark1)) + +#### Bug Fix {#bug-fix-24} + +- Fix potential data loss in Kafka [#5445](https://github.com/ClickHouse/ClickHouse/pull/5445) ([Ivan](https://github.com/abyss7)) +- Fix potential infinite loop in `PrettySpace` format when called with zero columns [#5560](https://github.com/ClickHouse/ClickHouse/pull/5560) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixed UInt32 overflow bug in linear models. Allow eval ML model for non-const model argument. [#5516](https://github.com/ClickHouse/ClickHouse/pull/5516) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- `ALTER TABLE ... DROP INDEX IF EXISTS ...` should not raise an exception if provided index does not exist [#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Fix segfault with `bitmapHasAny` in scalar subquery [#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fixed error when replication connection pool does not retry to resolve host, even when DNS cache was dropped. [#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) +- Fixed `ALTER ... MODIFY TTL` on ReplicatedMergeTree. [#5539](https://github.com/ClickHouse/ClickHouse/pull/5539) ([Anton Popov](https://github.com/CurtizJ)) +- Fix INSERT into Distributed table with MATERIALIZED column [#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) +- Fix bad alloc when truncate Join storage [#5437](https://github.com/ClickHouse/ClickHouse/pull/5437) ([TCeason](https://github.com/TCeason)) +- In recent versions of package tzdata some of files are symlinks now. The current mechanism for detecting default timezone gets broken and gives wrong names for some timezones. Now at least we force the timezone name to the contents of TZ if provided. [#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) +- Fix some extremely rare cases with MultiVolnitsky searcher when the constant needles in sum are at least 16KB long. The algorithm missed or overwrote the previous results which can lead to the incorrect result of `multiSearchAny`. [#5588](https://github.com/ClickHouse/ClickHouse/pull/5588) ([Danila Kutenin](https://github.com/danlark1)) +- Fix the issue when settings for ExternalData requests couldn’t use ClickHouse settings. Also, for now, settings `date_time_input_format` and `low_cardinality_allow_in_native_format` cannot be used because of the ambiguity of names (in external data it can be interpreted as table format and in the query it can be a setting). [#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila Kutenin](https://github.com/danlark1)) +- Fix bug when parts were removed only from FS without dropping them from Zookeeper. [#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) +- Remove debug logging from MySQL protocol [#5478](https://github.com/ClickHouse/ClickHouse/pull/5478) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Skip ZNONODE during DDL query processing [#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) +- Fix mix `UNION ALL` result column type. There were cases with inconsistent data and column types of resulting columns. [#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) +- Throw an exception on wrong integers in `dictGetT` functions instead of crash. [#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix wrong element_count and load_factor for hashed dictionary in `system.dictionaries` table. [#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-9} + +- Fixed build without `Brotli` HTTP compression support (`ENABLE_BROTLI=OFF` cmake variable). [#5521](https://github.com/ClickHouse/ClickHouse/pull/5521) ([Anton Yuzhaninov](https://github.com/citrin)) +- Include roaring.h as roaring/roaring.h [#5523](https://github.com/ClickHouse/ClickHouse/pull/5523) ([Orivej Desh](https://github.com/orivej)) +- Fix gcc9 warnings in hyperscan (#line directive is evil!) [#5546](https://github.com/ClickHouse/ClickHouse/pull/5546) ([Danila Kutenin](https://github.com/danlark1)) +- Fix all warnings when compiling with gcc-9. Fix some contrib issues. Fix gcc9 ICE and submit it to bugzilla. [#5498](https://github.com/ClickHouse/ClickHouse/pull/5498) ([Danila Kutenin](https://github.com/danlark1)) +- Fixed linking with lld [#5477](https://github.com/ClickHouse/ClickHouse/pull/5477) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Remove unused specializations in dictionaries [#5452](https://github.com/ClickHouse/ClickHouse/pull/5452) ([Artem Zuikov](https://github.com/4ertus2)) +- Improvement performance tests for formatting and parsing tables for different types of files [#5497](https://github.com/ClickHouse/ClickHouse/pull/5497) ([Olga Khvostikova](https://github.com/stavrolia)) +- Fixes for parallel test run [#5506](https://github.com/ClickHouse/ClickHouse/pull/5506) ([proller](https://github.com/proller)) +- Docker: use configs from clickhouse-test [#5531](https://github.com/ClickHouse/ClickHouse/pull/5531) ([proller](https://github.com/proller)) +- Fix compile for FreeBSD [#5447](https://github.com/ClickHouse/ClickHouse/pull/5447) ([proller](https://github.com/proller)) +- Upgrade boost to 1.70 [#5570](https://github.com/ClickHouse/ClickHouse/pull/5570) ([proller](https://github.com/proller)) +- Fix build clickhouse as submodule [#5574](https://github.com/ClickHouse/ClickHouse/pull/5574) ([proller](https://github.com/proller)) +- Improve JSONExtract performance tests [#5444](https://github.com/ClickHouse/ClickHouse/pull/5444) ([Vitaly Baranov](https://github.com/vitlibar)) + +## ClickHouse Release 19.8 {#clickhouse-release-19-8} + +### ClickHouse Release 19.8.3.8, 2019-06-11 {#clickhouse-release-19-8-3-8-2019-06-11} + +#### New Features {#new-features} + +- Added functions to work with JSON [#4686](https://github.com/ClickHouse/ClickHouse/pull/4686) ([hcz](https://github.com/hczhcz)) [#5124](https://github.com/ClickHouse/ClickHouse/pull/5124). ([Vitaly Baranov](https://github.com/vitlibar)) +- Add a function basename, with a similar behaviour to a basename function, which exists in a lot of languages (`os.path.basename` in python, `basename` in PHP, etc…). Work with both an UNIX-like path or a Windows path. [#5136](https://github.com/ClickHouse/ClickHouse/pull/5136) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Added `LIMIT n, m BY` or `LIMIT m OFFSET n BY` syntax to set offset of n for LIMIT BY clause. [#5138](https://github.com/ClickHouse/ClickHouse/pull/5138) ([Anton Popov](https://github.com/CurtizJ)) +- Added new data type `SimpleAggregateFunction`, which allows to have columns with light aggregation in an `AggregatingMergeTree`. This can only be used with simple functions like `any`, `anyLast`, `sum`, `min`, `max`. [#4629](https://github.com/ClickHouse/ClickHouse/pull/4629) ([Boris Granveaud](https://github.com/bgranvea)) +- Added support for non-constant arguments in function `ngramDistance` [#5198](https://github.com/ClickHouse/ClickHouse/pull/5198) ([Danila Kutenin](https://github.com/danlark1)) +- Added functions `skewPop`, `skewSamp`, `kurtPop` and `kurtSamp` to compute for sequence skewness, sample skewness, kurtosis and sample kurtosis respectively. [#5200](https://github.com/ClickHouse/ClickHouse/pull/5200) ([hcz](https://github.com/hczhcz)) +- Support rename operation for `MaterializeView` storage. [#5209](https://github.com/ClickHouse/ClickHouse/pull/5209) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Added server which allows connecting to ClickHouse using MySQL client. [#4715](https://github.com/ClickHouse/ClickHouse/pull/4715) ([Yuriy Baranov](https://github.com/yurriy)) +- Add `toDecimal*OrZero` and `toDecimal*OrNull` functions. [#5291](https://github.com/ClickHouse/ClickHouse/pull/5291) ([Artem Zuikov](https://github.com/4ertus2)) +- Support Decimal types in functions: `quantile`, `quantiles`, `median`, `quantileExactWeighted`, `quantilesExactWeighted`, medianExactWeighted. [#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) +- Added `toValidUTF8` function, which replaces all invalid UTF-8 characters by replacement character � (U+FFFD). [#5322](https://github.com/ClickHouse/ClickHouse/pull/5322) ([Danila Kutenin](https://github.com/danlark1)) +- Added `format` function. Formatting constant pattern (simplified Python format pattern) with the strings listed in the arguments. [#5330](https://github.com/ClickHouse/ClickHouse/pull/5330) ([Danila Kutenin](https://github.com/danlark1)) +- Added `system.detached_parts` table containing information about detached parts of `MergeTree` tables. [#5353](https://github.com/ClickHouse/ClickHouse/pull/5353) ([akuzm](https://github.com/akuzm)) +- Added `ngramSearch` function to calculate the non-symmetric difference between needle and haystack. [#5418](https://github.com/ClickHouse/ClickHouse/pull/5418)[#5422](https://github.com/ClickHouse/ClickHouse/pull/5422) ([Danila Kutenin](https://github.com/danlark1)) +- Implementation of basic machine learning methods (stochastic linear regression and logistic regression) using aggregate functions interface. Has different strategies for updating model weights (simple gradient descent, momentum method, Nesterov method). Also supports mini-batches of custom size. [#4943](https://github.com/ClickHouse/ClickHouse/pull/4943) ([Quid37](https://github.com/Quid37)) +- Implementation of `geohashEncode` and `geohashDecode` functions. [#5003](https://github.com/ClickHouse/ClickHouse/pull/5003) ([Vasily Nemkov](https://github.com/Enmk)) +- Added aggregate function `timeSeriesGroupSum`, which can aggregate different time series that sample timestamp not alignment. It will use linear interpolation between two sample timestamp and then sum time-series together. Added aggregate function `timeSeriesGroupRateSum`, which calculates the rate of time-series and then sum rates together. [#4542](https://github.com/ClickHouse/ClickHouse/pull/4542) ([Yangkuan Liu](https://github.com/LiuYangkuan)) +- Added functions `IPv4CIDRtoIPv4Range` and `IPv6CIDRtoIPv6Range` to calculate the lower and higher bounds for an IP in the subnet using a CIDR. [#5095](https://github.com/ClickHouse/ClickHouse/pull/5095) ([Guillaume Tassery](https://github.com/YiuRULE)) +- Add a X-ClickHouse-Summary header when we send a query using HTTP with enabled setting `send_progress_in_http_headers`. Return the usual information of X-ClickHouse-Progress, with additional information like how many rows and bytes were inserted in the query. [#5116](https://github.com/ClickHouse/ClickHouse/pull/5116) ([Guillaume Tassery](https://github.com/YiuRULE)) + +#### Improvements {#improvements} + +- Added `max_parts_in_total` setting for MergeTree family of tables (default: 100 000) that prevents unsafe specification of partition key #5166. [#5171](https://github.com/ClickHouse/ClickHouse/pull/5171) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-obfuscator`: derive seed for individual columns by combining initial seed with column name, not column position. This is intended to transform datasets with multiple related tables, so that tables will remain JOINable after transformation. [#5178](https://github.com/ClickHouse/ClickHouse/pull/5178) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added functions `JSONExtractRaw`, `JSONExtractKeyAndValues`. Renamed functions `jsonExtract` to `JSONExtract`. When something goes wrong these functions return the correspondent values, not `NULL`. Modified function `JSONExtract`, now it gets the return type from its last parameter and does not inject nullables. Implemented fallback to RapidJSON in case AVX2 instructions are not available. Simdjson library updated to a new version. [#5235](https://github.com/ClickHouse/ClickHouse/pull/5235) ([Vitaly Baranov](https://github.com/vitlibar)) +- Now `if` and `multiIf` functions do not rely on the condition’s `Nullable`, but rely on the branches for sql compatibility. [#5238](https://github.com/ClickHouse/ClickHouse/pull/5238) ([Jian Wu](https://github.com/janplus)) +- `In` predicate now generates `Null` result from `Null` input like the `Equal` function. [#5152](https://github.com/ClickHouse/ClickHouse/pull/5152) ([Jian Wu](https://github.com/janplus)) +- Check the time limit every (flush_interval / poll_timeout) number of rows from Kafka. This allows to break the reading from Kafka consumer more frequently and to check the time limits for the top-level streams [#5249](https://github.com/ClickHouse/ClickHouse/pull/5249) ([Ivan](https://github.com/abyss7)) +- Link rdkafka with bundled SASL. It should allow to use SASL SCRAM authentication [#5253](https://github.com/ClickHouse/ClickHouse/pull/5253) ([Ivan](https://github.com/abyss7)) +- Batched version of RowRefList for ALL JOINS. [#5267](https://github.com/ClickHouse/ClickHouse/pull/5267) ([Artem Zuikov](https://github.com/4ertus2)) +- clickhouse-server: more informative listen error messages. [#5268](https://github.com/ClickHouse/ClickHouse/pull/5268) ([proller](https://github.com/proller)) +- Support dictionaries in clickhouse-copier for functions in `` [#5270](https://github.com/ClickHouse/ClickHouse/pull/5270) ([proller](https://github.com/proller)) +- Add new setting `kafka_commit_every_batch` to regulate Kafka committing policy. + It allows to set commit mode: after every batch of messages is handled, or after the whole block is written to the storage. It’s a trade-off between losing some messages or reading them twice in some extreme situations. [#5308](https://github.com/ClickHouse/ClickHouse/pull/5308) ([Ivan](https://github.com/abyss7)) +- Make `windowFunnel` support other Unsigned Integer Types. [#5320](https://github.com/ClickHouse/ClickHouse/pull/5320) ([sundyli](https://github.com/sundy-li)) +- Allow to shadow virtual column `_table` in Merge engine. [#5325](https://github.com/ClickHouse/ClickHouse/pull/5325) ([Ivan](https://github.com/abyss7)) +- Make `sequenceMatch` aggregate functions support other unsigned Integer types [#5339](https://github.com/ClickHouse/ClickHouse/pull/5339) ([sundyli](https://github.com/sundy-li)) +- Better error messages if checksum mismatch is most likely caused by hardware failures. [#5355](https://github.com/ClickHouse/ClickHouse/pull/5355) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Check that underlying tables support sampling for `StorageMerge` [#5366](https://github.com/ClickHouse/ClickHouse/pull/5366) ([Ivan](https://github.com/abyss7)) +- Сlose MySQL connections after their usage in external dictionaries. It is related to issue #893. [#5395](https://github.com/ClickHouse/ClickHouse/pull/5395) ([Clément Rodriguez](https://github.com/clemrodriguez)) +- Improvements of MySQL Wire Protocol. Changed name of format to MySQLWire. Using RAII for calling RSA_free. Disabling SSL if context cannot be created. [#5419](https://github.com/ClickHouse/ClickHouse/pull/5419) ([Yuriy Baranov](https://github.com/yurriy)) +- clickhouse-client: allow to run with unaccessable history file (read-only, no disk space, file is directory, …). [#5431](https://github.com/ClickHouse/ClickHouse/pull/5431) ([proller](https://github.com/proller)) +- Respect query settings in asynchronous INSERTs into Distributed tables. [#4936](https://github.com/ClickHouse/ClickHouse/pull/4936) ([TCeason](https://github.com/TCeason)) +- Renamed functions `leastSqr` to `simpleLinearRegression`, `LinearRegression` to `linearRegression`, `LogisticRegression` to `logisticRegression`. [#5391](https://github.com/ClickHouse/ClickHouse/pull/5391) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Performance Improvements {#performance-improvements} + +- Parallelize processing of parts of non-replicated MergeTree tables in ALTER MODIFY query. [#4639](https://github.com/ClickHouse/ClickHouse/pull/4639) ([Ivan Kush](https://github.com/IvanKush)) +- Optimizations in regular expressions extraction. [#5193](https://github.com/ClickHouse/ClickHouse/pull/5193) [#5191](https://github.com/ClickHouse/ClickHouse/pull/5191) ([Danila Kutenin](https://github.com/danlark1)) +- Do not add right join key column to join result if it’s used only in join on section. [#5260](https://github.com/ClickHouse/ClickHouse/pull/5260) ([Artem Zuikov](https://github.com/4ertus2)) +- Freeze the Kafka buffer after first empty response. It avoids multiple invokations of `ReadBuffer::next()` for empty result in some row-parsing streams. [#5283](https://github.com/ClickHouse/ClickHouse/pull/5283) ([Ivan](https://github.com/abyss7)) +- `concat` function optimization for multiple arguments. [#5357](https://github.com/ClickHouse/ClickHouse/pull/5357) ([Danila Kutenin](https://github.com/danlark1)) +- Query optimisation. Allow push down IN statement while rewriting commа/cross join into inner one. [#5396](https://github.com/ClickHouse/ClickHouse/pull/5396) ([Artem Zuikov](https://github.com/4ertus2)) +- Upgrade our LZ4 implementation with reference one to have faster decompression. [#5070](https://github.com/ClickHouse/ClickHouse/pull/5070) ([Danila Kutenin](https://github.com/danlark1)) +- Implemented MSD radix sort (based on kxsort), and partial sorting. [#5129](https://github.com/ClickHouse/ClickHouse/pull/5129) ([Evgenii Pravda](https://github.com/kvinty)) + +#### Bug Fixes {#bug-fixes} + +- Fix push require columns with join [#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed bug, when ClickHouse is run by systemd, the command `sudo service clickhouse-server forcerestart` was not working as expected. [#5204](https://github.com/ClickHouse/ClickHouse/pull/5204) ([proller](https://github.com/proller)) +- Fix http error codes in DataPartsExchange (interserver http server on 9009 port always returned code 200, even on errors). [#5216](https://github.com/ClickHouse/ClickHouse/pull/5216) ([proller](https://github.com/proller)) +- Fix SimpleAggregateFunction for String longer than MAX_SMALL_STRING_SIZE [#5311](https://github.com/ClickHouse/ClickHouse/pull/5311) ([Azat Khuzhin](https://github.com/azat)) +- Fix error for `Decimal` to `Nullable(Decimal)` conversion in IN. Support other Decimal to Decimal conversions (including different scales). [#5350](https://github.com/ClickHouse/ClickHouse/pull/5350) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed FPU clobbering in simdjson library that lead to wrong calculation of `uniqHLL` and `uniqCombined` aggregate function and math functions such as `log`. [#5354](https://github.com/ClickHouse/ClickHouse/pull/5354) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed handling mixed const/nonconst cases in JSON functions. [#5435](https://github.com/ClickHouse/ClickHouse/pull/5435) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix `retention` function. Now all conditions that satisfy in a row of data are added to the data state. [#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) +- Fix result type for `quantileExact` with Decimals. [#5304](https://github.com/ClickHouse/ClickHouse/pull/5304) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Documentation {#documentation} + +- Translate documentation for `CollapsingMergeTree` to chinese. [#5168](https://github.com/ClickHouse/ClickHouse/pull/5168) ([张风啸](https://github.com/AlexZFX)) +- Translate some documentation about table engines to chinese. + [#5134](https://github.com/ClickHouse/ClickHouse/pull/5134) + [#5328](https://github.com/ClickHouse/ClickHouse/pull/5328) + ([never lee](https://github.com/neverlee)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements} + +- Fix some sanitizer reports that show probable use-after-free.[#5139](https://github.com/ClickHouse/ClickHouse/pull/5139) [#5143](https://github.com/ClickHouse/ClickHouse/pull/5143) [#5393](https://github.com/ClickHouse/ClickHouse/pull/5393) ([Ivan](https://github.com/abyss7)) +- Move performance tests out of separate directories for convenience. [#5158](https://github.com/ClickHouse/ClickHouse/pull/5158) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix incorrect performance tests. [#5255](https://github.com/ClickHouse/ClickHouse/pull/5255) ([alesapin](https://github.com/alesapin)) +- Added a tool to calculate checksums caused by bit flips to debug hardware issues. [#5334](https://github.com/ClickHouse/ClickHouse/pull/5334) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Make runner script more usable. [#5340](https://github.com/ClickHouse/ClickHouse/pull/5340)[#5360](https://github.com/ClickHouse/ClickHouse/pull/5360) ([filimonov](https://github.com/filimonov)) +- Add small instruction how to write performance tests. [#5408](https://github.com/ClickHouse/ClickHouse/pull/5408) ([alesapin](https://github.com/alesapin)) +- Add ability to make substitutions in create, fill and drop query in performance tests [#5367](https://github.com/ClickHouse/ClickHouse/pull/5367) ([Olga Khvostikova](https://github.com/stavrolia)) + +## ClickHouse Release 19.7 {#clickhouse-release-19-7} + +### ClickHouse Release 19.7.5.29, 2019-07-05 {#clickhouse-release-19-7-5-29-2019-07-05} + +#### Bug Fix {#bug-fix-25} + +- Fix performance regression in some queries with JOIN. [#5192](https://github.com/ClickHouse/ClickHouse/pull/5192) ([Winter Zhang](https://github.com/zhang2014)) + +### ClickHouse Release 19.7.5.27, 2019-06-09 {#clickhouse-release-19-7-5-27-2019-06-09} + +#### New Features {#new-features-1} + +- Added bitmap related functions `bitmapHasAny` and `bitmapHasAll` analogous to `hasAny` and `hasAll` functions for arrays. [#5279](https://github.com/ClickHouse/ClickHouse/pull/5279) ([Sergi Vladykin](https://github.com/svladykin)) + +#### Bug Fixes {#bug-fixes-1} + +- Fix segfault on `minmax` INDEX with Null value. [#5246](https://github.com/ClickHouse/ClickHouse/pull/5246) ([Nikita Vasilev](https://github.com/nikvas0)) +- Mark all input columns in LIMIT BY as required output. It fixes ‘Not found column’ error in some distributed queries. [#5407](https://github.com/ClickHouse/ClickHouse/pull/5407) ([Constantin S. Pan](https://github.com/kvap)) +- Fix “Column ‘0’ already exists” error in `SELECT .. PREWHERE` on column with DEFAULT [#5397](https://github.com/ClickHouse/ClickHouse/pull/5397) ([proller](https://github.com/proller)) +- Fix `ALTER MODIFY TTL` query on `ReplicatedMergeTree`. [#5539](https://github.com/ClickHouse/ClickHouse/pull/5539/commits) ([Anton Popov](https://github.com/CurtizJ)) +- Don’t crash the server when Kafka consumers have failed to start. [#5285](https://github.com/ClickHouse/ClickHouse/pull/5285) ([Ivan](https://github.com/abyss7)) +- Fixed bitmap functions produce wrong result. [#5359](https://github.com/ClickHouse/ClickHouse/pull/5359) ([Andy Yang](https://github.com/andyyzh)) +- Fix element_count for hashed dictionary (do not include duplicates) [#5440](https://github.com/ClickHouse/ClickHouse/pull/5440) ([Azat Khuzhin](https://github.com/azat)) +- Use contents of environment variable TZ as the name for timezone. It helps to correctly detect default timezone in some cases.[#5443](https://github.com/ClickHouse/ClickHouse/pull/5443) ([Ivan](https://github.com/abyss7)) +- Do not try to convert integers in `dictGetT` functions, because it does not work correctly. Throw an exception instead. [#5446](https://github.com/ClickHouse/ClickHouse/pull/5446) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix settings in ExternalData HTTP request. [#5455](https://github.com/ClickHouse/ClickHouse/pull/5455) ([Danila + Kutenin](https://github.com/danlark1)) +- Fix bug when parts were removed only from FS without dropping them from Zookeeper. [#5520](https://github.com/ClickHouse/ClickHouse/pull/5520) ([alesapin](https://github.com/alesapin)) +- Fix segmentation fault in `bitmapHasAny` function. [#5528](https://github.com/ClickHouse/ClickHouse/pull/5528) ([Zhichang Yu](https://github.com/yuzhichang)) +- Fixed error when replication connection pool does not retry to resolve host, even when DNS cache was dropped. [#5534](https://github.com/ClickHouse/ClickHouse/pull/5534) ([alesapin](https://github.com/alesapin)) +- Fixed `DROP INDEX IF EXISTS` query. Now `ALTER TABLE ... DROP INDEX IF EXISTS ...` query does not raise an exception if provided index does not exist. [#5524](https://github.com/ClickHouse/ClickHouse/pull/5524) ([Gleb Novikov](https://github.com/NanoBjorn)) +- Fix union all supertype column. There were cases with inconsistent data and column types of resulting columns. [#5503](https://github.com/ClickHouse/ClickHouse/pull/5503) ([Artem Zuikov](https://github.com/4ertus2)) +- Skip ZNONODE during DDL query processing. Before if another node removes the znode in task queue, the one that + did not process it, but already get list of children, will terminate the DDLWorker thread. [#5489](https://github.com/ClickHouse/ClickHouse/pull/5489) ([Azat Khuzhin](https://github.com/azat)) +- Fix INSERT into Distributed() table with MATERIALIZED column. [#5429](https://github.com/ClickHouse/ClickHouse/pull/5429) ([Azat Khuzhin](https://github.com/azat)) + +### ClickHouse Release 19.7.3.9, 2019-05-30 {#clickhouse-release-19-7-3-9-2019-05-30} + +#### New Features {#new-features-2} + +- Allow to limit the range of a setting that can be specified by user. + These constraints can be set up in user settings profile. + [#4931](https://github.com/ClickHouse/ClickHouse/pull/4931) ([Vitaly + Baranov](https://github.com/vitlibar)) +- Add a second version of the function `groupUniqArray` with an optional + `max_size` parameter that limits the size of the resulting array. This + behavior is similar to `groupArray(max_size)(x)` function. + [#5026](https://github.com/ClickHouse/ClickHouse/pull/5026) ([Guillaume + Tassery](https://github.com/YiuRULE)) +- For TSVWithNames/CSVWithNames input file formats, column order can now be + determined from file header. This is controlled by + `input_format_with_names_use_header` parameter. + [#5081](https://github.com/ClickHouse/ClickHouse/pull/5081) + ([Alexander](https://github.com/Akazz)) + +#### Bug Fixes {#bug-fixes-2} + +- Crash with uncompressed_cache + JOIN during merge (#5197) + [#5133](https://github.com/ClickHouse/ClickHouse/pull/5133) ([Danila + Kutenin](https://github.com/danlark1)) +- Segmentation fault on a clickhouse-client query to system tables. #5066 + [#5127](https://github.com/ClickHouse/ClickHouse/pull/5127) + ([Ivan](https://github.com/abyss7)) +- Data loss on heavy load via KafkaEngine (#4736) + [#5080](https://github.com/ClickHouse/ClickHouse/pull/5080) + ([Ivan](https://github.com/abyss7)) +- Fixed very rare data race condition that could happen when executing a query with UNION ALL involving at least two SELECTs from system.columns, system.tables, system.parts, system.parts_tables or tables of Merge family and performing ALTER of columns of the related tables concurrently. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Performance Improvements {#performance-improvements-1} + +- Use radix sort for sorting by single numeric column in `ORDER BY` without + `LIMIT`. [#5106](https://github.com/ClickHouse/ClickHouse/pull/5106), + [#4439](https://github.com/ClickHouse/ClickHouse/pull/4439) + ([Evgenii Pravda](https://github.com/kvinty), + [alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Documentation {#documentation-1} + +- Translate documentation for some table engines to Chinese. + [#5107](https://github.com/ClickHouse/ClickHouse/pull/5107), + [#5094](https://github.com/ClickHouse/ClickHouse/pull/5094), + [#5087](https://github.com/ClickHouse/ClickHouse/pull/5087) + ([张风啸](https://github.com/AlexZFX)), + [#5068](https://github.com/ClickHouse/ClickHouse/pull/5068) ([never + lee](https://github.com/neverlee)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-1} + +- Print UTF-8 characters properly in `clickhouse-test`. + [#5084](https://github.com/ClickHouse/ClickHouse/pull/5084) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add command line parameter for clickhouse-client to always load suggestion + data. [#5102](https://github.com/ClickHouse/ClickHouse/pull/5102) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Resolve some of PVS-Studio warnings. + [#5082](https://github.com/ClickHouse/ClickHouse/pull/5082) + ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Update LZ4 [#5040](https://github.com/ClickHouse/ClickHouse/pull/5040) ([Danila + Kutenin](https://github.com/danlark1)) +- Add gperf to build requirements for upcoming pull request #5030. + [#5110](https://github.com/ClickHouse/ClickHouse/pull/5110) + ([proller](https://github.com/proller)) + +## ClickHouse Release 19.6 {#clickhouse-release-19-6} + +### ClickHouse Release 19.6.3.18, 2019-06-13 {#clickhouse-release-19-6-3-18-2019-06-13} + +#### Bug Fixes {#bug-fixes-3} + +- Fixed IN condition pushdown for queries from table functions `mysql` and `odbc` and corresponding table engines. This fixes #3540 and #2384. [#5313](https://github.com/ClickHouse/ClickHouse/pull/5313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix deadlock in Zookeeper. [#5297](https://github.com/ClickHouse/ClickHouse/pull/5297) ([github1youlc](https://github.com/github1youlc)) +- Allow quoted decimals in CSV. [#5284](https://github.com/ClickHouse/ClickHouse/pull/5284) ([Artem Zuikov](https://github.com/4ertus2) +- Disallow conversion from float Inf/NaN into Decimals (throw exception). [#5282](https://github.com/ClickHouse/ClickHouse/pull/5282) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix data race in rename query. [#5247](https://github.com/ClickHouse/ClickHouse/pull/5247) ([Winter Zhang](https://github.com/zhang2014)) +- Temporarily disable LFAlloc. Usage of LFAlloc might lead to a lot of MAP_FAILED in allocating UncompressedCache and in a result to crashes of queries at high loaded servers. [cfdba93](https://github.com/ClickHouse/ClickHouse/commit/cfdba938ce22f16efeec504f7f90206a515b1280)([Danila Kutenin](https://github.com/danlark1)) + +### ClickHouse Release 19.6.2.11, 2019-05-13 {#clickhouse-release-19-6-2-11-2019-05-13} + +#### New Features {#new-features-3} + +- TTL expressions for columns and tables. [#4212](https://github.com/ClickHouse/ClickHouse/pull/4212) ([Anton Popov](https://github.com/CurtizJ)) +- Added support for `brotli` compression for HTTP responses (Accept-Encoding: br) [#4388](https://github.com/ClickHouse/ClickHouse/pull/4388) ([Mikhail](https://github.com/fandyushin)) +- Added new function `isValidUTF8` for checking whether a set of bytes is correctly utf-8 encoded. [#4934](https://github.com/ClickHouse/ClickHouse/pull/4934) ([Danila Kutenin](https://github.com/danlark1)) +- Add new load balancing policy `first_or_random` which sends queries to the first specified host and if it’s inaccessible send queries to random hosts of shard. Useful for cross-replication topology setups. [#5012](https://github.com/ClickHouse/ClickHouse/pull/5012) ([nvartolomei](https://github.com/nvartolomei)) + +#### Experimental Features {#experimental-features-1} + +- Add setting `index_granularity_bytes` (adaptive index granularity) for MergeTree\* tables family. [#4826](https://github.com/ClickHouse/ClickHouse/pull/4826) ([alesapin](https://github.com/alesapin)) + +#### Improvements {#improvements-1} + +- Added support for non-constant and negative size and length arguments for function `substringUTF8`. [#4989](https://github.com/ClickHouse/ClickHouse/pull/4989) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Disable push-down to right table in left join, left table in right join, and both tables in full join. This fixes wrong JOIN results in some cases. [#4846](https://github.com/ClickHouse/ClickHouse/pull/4846) ([Ivan](https://github.com/abyss7)) +- `clickhouse-copier`: auto upload task configuration from `--task-file` option [#4876](https://github.com/ClickHouse/ClickHouse/pull/4876) ([proller](https://github.com/proller)) +- Added typos handler for storage factory and table functions factory. [#4891](https://github.com/ClickHouse/ClickHouse/pull/4891) ([Danila Kutenin](https://github.com/danlark1)) +- Support asterisks and qualified asterisks for multiple joins without subqueries [#4898](https://github.com/ClickHouse/ClickHouse/pull/4898) ([Artem Zuikov](https://github.com/4ertus2)) +- Make missing column error message more user friendly. [#4915](https://github.com/ClickHouse/ClickHouse/pull/4915) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Performance Improvements {#performance-improvements-2} + +- Significant speedup of ASOF JOIN [#4924](https://github.com/ClickHouse/ClickHouse/pull/4924) ([Martijn Bakker](https://github.com/Gladdy)) + +#### Backward Incompatible Changes {#backward-incompatible-changes} + +- HTTP header `Query-Id` was renamed to `X-ClickHouse-Query-Id` for consistency. [#4972](https://github.com/ClickHouse/ClickHouse/pull/4972) ([Mikhail](https://github.com/fandyushin)) + +#### Bug Fixes {#bug-fixes-4} + +- Fixed potential null pointer dereference in `clickhouse-copier`. [#4900](https://github.com/ClickHouse/ClickHouse/pull/4900) ([proller](https://github.com/proller)) +- Fixed error on query with JOIN + ARRAY JOIN [#4938](https://github.com/ClickHouse/ClickHouse/pull/4938) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed hanging on start of the server when a dictionary depends on another dictionary via a database with engine=Dictionary. [#4962](https://github.com/ClickHouse/ClickHouse/pull/4962) ([Vitaly Baranov](https://github.com/vitlibar)) +- Partially fix distributed_product_mode = local. It’s possible to allow columns of local tables in where/having/order by/… via table aliases. Throw exception if table does not have alias. There’s not possible to access to the columns without table aliases yet. [#4986](https://github.com/ClickHouse/ClickHouse/pull/4986) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix potentially wrong result for `SELECT DISTINCT` with `JOIN` [#5001](https://github.com/ClickHouse/ClickHouse/pull/5001) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed very rare data race condition that could happen when executing a query with UNION ALL involving at least two SELECTs from system.columns, system.tables, system.parts, system.parts_tables or tables of Merge family and performing ALTER of columns of the related tables concurrently. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-2} + +- Fixed test failures when running clickhouse-server on different host [#4713](https://github.com/ClickHouse/ClickHouse/pull/4713) ([Vasily Nemkov](https://github.com/Enmk)) +- clickhouse-test: Disable color control sequences in non tty environment. [#4937](https://github.com/ClickHouse/ClickHouse/pull/4937) ([alesapin](https://github.com/alesapin)) +- clickhouse-test: Allow use any test database (remove `test.` qualification where it possible) [#5008](https://github.com/ClickHouse/ClickHouse/pull/5008) ([proller](https://github.com/proller)) +- Fix ubsan errors [#5037](https://github.com/ClickHouse/ClickHouse/pull/5037) ([Vitaly Baranov](https://github.com/vitlibar)) +- Yandex LFAlloc was added to ClickHouse to allocate MarkCache and UncompressedCache data in different ways to catch segfaults more reliable [#4995](https://github.com/ClickHouse/ClickHouse/pull/4995) ([Danila Kutenin](https://github.com/danlark1)) +- Python util to help with backports and changelogs. [#4949](https://github.com/ClickHouse/ClickHouse/pull/4949) ([Ivan](https://github.com/abyss7)) + +## ClickHouse Release 19.5 {#clickhouse-release-19-5} + +### ClickHouse Release 19.5.4.22, 2019-05-13 {#clickhouse-release-19-5-4-22-2019-05-13} + +#### Bug Fixes {#bug-fixes-5} + +- Fixed possible crash in bitmap\* functions [#5220](https://github.com/ClickHouse/ClickHouse/pull/5220) [#5228](https://github.com/ClickHouse/ClickHouse/pull/5228) ([Andy Yang](https://github.com/andyyzh)) +- Fixed very rare data race condition that could happen when executing a query with UNION ALL involving at least two SELECTs from system.columns, system.tables, system.parts, system.parts_tables or tables of Merge family and performing ALTER of columns of the related tables concurrently. [#5189](https://github.com/ClickHouse/ClickHouse/pull/5189) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error `Set for IN is not created yet in case of using single LowCardinality column in the left part of IN`. This error happened if LowCardinality column was the part of primary key. #5031 [#5154](https://github.com/ClickHouse/ClickHouse/pull/5154) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Modification of retention function: If a row satisfies both the first and NTH condition, only the first satisfied condition is added to the data state. Now all conditions that satisfy in a row of data are added to the data state. [#5119](https://github.com/ClickHouse/ClickHouse/pull/5119) ([小路](https://github.com/nicelulu)) + +### ClickHouse Release 19.5.3.8, 2019-04-18 {#clickhouse-release-19-5-3-8-2019-04-18} + +#### Bug Fixes {#bug-fixes-6} + +- Fixed type of setting `max_partitions_per_insert_block` from boolean to UInt64. [#5028](https://github.com/ClickHouse/ClickHouse/pull/5028) ([Mohammad Hossein Sekhavat](https://github.com/mhsekhavat)) + +### ClickHouse Release 19.5.2.6, 2019-04-15 {#clickhouse-release-19-5-2-6-2019-04-15} + +#### New Features {#new-features-4} + +- [Hyperscan](https://github.com/intel/hyperscan) multiple regular expression matching was added (functions `multiMatchAny`, `multiMatchAnyIndex`, `multiFuzzyMatchAny`, `multiFuzzyMatchAnyIndex`). [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780), [#4841](https://github.com/ClickHouse/ClickHouse/pull/4841) ([Danila Kutenin](https://github.com/danlark1)) +- `multiSearchFirstPosition` function was added. [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Danila Kutenin](https://github.com/danlark1)) +- Implement the predefined expression filter per row for tables. [#4792](https://github.com/ClickHouse/ClickHouse/pull/4792) ([Ivan](https://github.com/abyss7)) +- A new type of data skipping indices based on bloom filters (can be used for `equal`, `in` and `like` functions). [#4499](https://github.com/ClickHouse/ClickHouse/pull/4499) ([Nikita Vasilev](https://github.com/nikvas0)) +- Added `ASOF JOIN` which allows to run queries that join to the most recent value known. [#4774](https://github.com/ClickHouse/ClickHouse/pull/4774) [#4867](https://github.com/ClickHouse/ClickHouse/pull/4867) [#4863](https://github.com/ClickHouse/ClickHouse/pull/4863) [#4875](https://github.com/ClickHouse/ClickHouse/pull/4875) ([Martijn Bakker](https://github.com/Gladdy), [Artem Zuikov](https://github.com/4ertus2)) +- Rewrite multiple `COMMA JOIN` to `CROSS JOIN`. Then rewrite them to `INNER JOIN` if possible. [#4661](https://github.com/ClickHouse/ClickHouse/pull/4661) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Improvement {#improvement-9} + +- `topK` and `topKWeighted` now supports custom `loadFactor` (fixes issue [#4252](https://github.com/ClickHouse/ClickHouse/issues/4252)). [#4634](https://github.com/ClickHouse/ClickHouse/pull/4634) ([Kirill Danshin](https://github.com/kirillDanshin)) +- Allow to use `parallel_replicas_count > 1` even for tables without sampling (the setting is simply ignored for them). In previous versions it was lead to exception. [#4637](https://github.com/ClickHouse/ClickHouse/pull/4637) ([Alexey Elymanov](https://github.com/digitalist)) +- Support for `CREATE OR REPLACE VIEW`. Allow to create a view or set a new definition in a single statement. [#4654](https://github.com/ClickHouse/ClickHouse/pull/4654) ([Boris Granveaud](https://github.com/bgranvea)) +- `Buffer` table engine now supports `PREWHERE`. [#4671](https://github.com/ClickHouse/ClickHouse/pull/4671) ([Yangkuan Liu](https://github.com/LiuYangkuan)) +- Add ability to start replicated table without metadata in zookeeper in `readonly` mode. [#4691](https://github.com/ClickHouse/ClickHouse/pull/4691) ([alesapin](https://github.com/alesapin)) +- Fixed flicker of progress bar in clickhouse-client. The issue was most noticeable when using `FORMAT Null` with streaming queries. [#4811](https://github.com/ClickHouse/ClickHouse/pull/4811) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to disable functions with `hyperscan` library on per user basis to limit potentially excessive and uncontrolled resource usage. [#4816](https://github.com/ClickHouse/ClickHouse/pull/4816) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add version number logging in all errors. [#4824](https://github.com/ClickHouse/ClickHouse/pull/4824) ([proller](https://github.com/proller)) +- Added restriction to the `multiMatch` functions which requires string size to fit into `unsigned int`. Also added the number of arguments limit to the `multiSearch` functions. [#4834](https://github.com/ClickHouse/ClickHouse/pull/4834) ([Danila Kutenin](https://github.com/danlark1)) +- Improved usage of scratch space and error handling in Hyperscan. [#4866](https://github.com/ClickHouse/ClickHouse/pull/4866) ([Danila Kutenin](https://github.com/danlark1)) +- Fill `system.graphite_detentions` from a table config of `*GraphiteMergeTree` engine tables. [#4584](https://github.com/ClickHouse/ClickHouse/pull/4584) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Rename `trigramDistance` function to `ngramDistance` and add more functions with `CaseInsensitive` and `UTF`. [#4602](https://github.com/ClickHouse/ClickHouse/pull/4602) ([Danila Kutenin](https://github.com/danlark1)) +- Improved data skipping indices calculation. [#4640](https://github.com/ClickHouse/ClickHouse/pull/4640) ([Nikita Vasilev](https://github.com/nikvas0)) +- Keep ordinary, `DEFAULT`, `MATERIALIZED` and `ALIAS` columns in a single list (fixes issue [#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Alex Zatelepin](https://github.com/ztlpn)) + +#### Bug Fix {#bug-fix-26} + +- Avoid `std::terminate` in case of memory allocation failure. Now `std::bad_alloc` exception is thrown as expected. [#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixes capnproto reading from buffer. Sometimes files wasn’t loaded successfully by HTTP. [#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) +- Fix error `Unknown log entry type: 0` after `OPTIMIZE TABLE FINAL` query. [#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos Bird](https://github.com/amosbird)) +- Wrong arguments to `hasAny` or `hasAll` functions may lead to segfault. [#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deadlock may happen while executing `DROP DATABASE dictionary` query. [#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix undefined behavior in `median` and `quantile` functions. [#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([hcz](https://github.com/hczhcz)) +- Fix compression level detection when `network_compression_method` in lowercase. Broken in v19.1. [#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([proller](https://github.com/proller)) +- Fixed ignorance of `UTC` setting (fixes issue [#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([proller](https://github.com/proller)) +- Fix `histogram` function behaviour with `Distributed` tables. [#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([olegkv](https://github.com/olegkv)) +- Fixed tsan report `destroy of a locked mutex`. [#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed TSan report on shutdown due to race condition in system logs usage. Fixed potential use-after-free on shutdown when part_log is enabled. [#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix recheck parts in `ReplicatedMergeTreeAlterThread` in case of error. [#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Arithmetic operations on intermediate aggregate function states were not working for constant arguments (such as subquery results). [#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Always backquote column names in metadata. Otherwise it’s impossible to create a table with column named `index` (server won’t restart due to malformed `ATTACH` query in metadata). [#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix crash in `ALTER ... MODIFY ORDER BY` on `Distributed` table. [#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([TCeason](https://github.com/TCeason)) +- Fix segfault in `JOIN ON` with enabled `enable_optimize_predicate_expression`. [#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Winter Zhang](https://github.com/zhang2014)) +- Fix bug with adding an extraneous row after consuming a protobuf message from Kafka. [#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix crash of `JOIN` on not-nullable vs nullable column. Fix `NULLs` in right keys in `ANY JOIN` + `join_use_nulls`. [#4815](https://github.com/ClickHouse/ClickHouse/pull/4815) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) +- Fixed race condition in `SELECT` from `system.tables` if the table is renamed or altered concurrently. [#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed data race when fetching data part that is already obsolete. [#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed rare data race that can happen during `RENAME` table of MergeTree family. [#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed segmentation fault in function `arrayIntersect`. Segmentation fault could happen if function was called with mixed constant and ordinary arguments. [#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix crash in `FULL/RIGHT JOIN` when we joining on nullable vs not nullable. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix `No message received` exception while fetching parts between replicas. [#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) +- Fixed `arrayIntersect` function wrong result in case of several repeated values in single array. [#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix a race condition during concurrent `ALTER COLUMN` queries that could lead to a server crash (fixes issue [#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix incorrect result in `FULL/RIGHT JOIN` with const column. [#4723](https://github.com/ClickHouse/ClickHouse/pull/4723) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix duplicates in `GLOBAL JOIN` with asterisk. [#4705](https://github.com/ClickHouse/ClickHouse/pull/4705) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix parameter deduction in `ALTER MODIFY` of column `CODEC` when column type is not specified. [#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) +- Functions `cutQueryStringAndFragment()` and `queryStringAndFragment()` now works correctly when `URL` contains a fragment and no query. [#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix rare bug when setting `min_bytes_to_use_direct_io` is greater than zero, which occures when thread have to seek backward in column file. [#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) +- Fix wrong argument types for aggregate functions with `LowCardinality` arguments (fixes issue [#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix wrong name qualification in `GLOBAL JOIN`. [#4969](https://github.com/ClickHouse/ClickHouse/pull/4969) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix function `toISOWeek` result for year 1970. [#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `DROP`, `TRUNCATE` and `OPTIMIZE` queries duplication, when executed on `ON CLUSTER` for `ReplicatedMergeTree*` tables family. [#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) + +#### Backward Incompatible Change {#backward-incompatible-change-8} + +- Rename setting `insert_sample_with_metadata` to setting `input_format_defaults_for_omitted_fields`. [#4771](https://github.com/ClickHouse/ClickHouse/pull/4771) ([Artem Zuikov](https://github.com/4ertus2)) +- Added setting `max_partitions_per_insert_block` (with value 100 by default). If inserted block contains larger number of partitions, an exception is thrown. Set it to 0 if you want to remove the limit (not recommended). [#4845](https://github.com/ClickHouse/ClickHouse/pull/4845) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Multi-search functions were renamed (`multiPosition` to `multiSearchAllPositions`, `multiSearch` to `multiSearchAny`, `firstMatch` to `multiSearchFirstIndex`). [#4780](https://github.com/ClickHouse/ClickHouse/pull/4780) ([Danila Kutenin](https://github.com/danlark1)) + +#### Performance Improvement {#performance-improvement-6} + +- Optimize Volnitsky searcher by inlining, giving about 5-10% search improvement for queries with many needles or many similar bigrams. [#4862](https://github.com/ClickHouse/ClickHouse/pull/4862) ([Danila Kutenin](https://github.com/danlark1)) +- Fix performance issue when setting `use_uncompressed_cache` is greater than zero, which appeared when all read data contained in cache. [#4913](https://github.com/ClickHouse/ClickHouse/pull/4913) ([alesapin](https://github.com/alesapin)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-10} + +- Hardening debug build: more granular memory mappings and ASLR; add memory protection for mark cache and index. This allows to find more memory stomping bugs in case when ASan and MSan cannot do it. [#4632](https://github.com/ClickHouse/ClickHouse/pull/4632) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add support for cmake variables `ENABLE_PROTOBUF`, `ENABLE_PARQUET` and `ENABLE_BROTLI` which allows to enable/disable the above features (same as we can do for librdkafka, mysql, etc). [#4669](https://github.com/ClickHouse/ClickHouse/pull/4669) ([Silviu Caragea](https://github.com/silviucpp)) +- Add ability to print process list and stacktraces of all threads if some queries are hung after test run. [#4675](https://github.com/ClickHouse/ClickHouse/pull/4675) ([alesapin](https://github.com/alesapin)) +- Add retries on `Connection loss` error in `clickhouse-test`. [#4682](https://github.com/ClickHouse/ClickHouse/pull/4682) ([alesapin](https://github.com/alesapin)) +- Add freebsd build with vagrant and build with thread sanitizer to packager script. [#4712](https://github.com/ClickHouse/ClickHouse/pull/4712) [#4748](https://github.com/ClickHouse/ClickHouse/pull/4748) ([alesapin](https://github.com/alesapin)) +- Now user asked for password for user `'default'` during installation. [#4725](https://github.com/ClickHouse/ClickHouse/pull/4725) ([proller](https://github.com/proller)) +- Suppress warning in `rdkafka` library. [#4740](https://github.com/ClickHouse/ClickHouse/pull/4740) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow ability to build without ssl. [#4750](https://github.com/ClickHouse/ClickHouse/pull/4750) ([proller](https://github.com/proller)) +- Add a way to launch clickhouse-server image from a custom user. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Upgrade contrib boost to 1.69. [#4793](https://github.com/ClickHouse/ClickHouse/pull/4793) ([proller](https://github.com/proller)) +- Disable usage of `mremap` when compiled with Thread Sanitizer. Surprisingly enough, TSan does not intercept `mremap` (though it does intercept `mmap`, `munmap`) that leads to false positives. Fixed TSan report in stateful tests. [#4859](https://github.com/ClickHouse/ClickHouse/pull/4859) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add test checking using format schema via HTTP interface. [#4864](https://github.com/ClickHouse/ClickHouse/pull/4864) ([Vitaly Baranov](https://github.com/vitlibar)) + +## ClickHouse Release 19.4 {#clickhouse-release-19-4} + +### ClickHouse Release 19.4.4.33, 2019-04-17 {#clickhouse-release-19-4-4-33-2019-04-17} + +#### Bug Fixes {#bug-fixes-7} + +- Avoid `std::terminate` in case of memory allocation failure. Now `std::bad_alloc` exception is thrown as expected. [#4665](https://github.com/ClickHouse/ClickHouse/pull/4665) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixes capnproto reading from buffer. Sometimes files wasn’t loaded successfully by HTTP. [#4674](https://github.com/ClickHouse/ClickHouse/pull/4674) ([Vladislav](https://github.com/smirnov-vs)) +- Fix error `Unknown log entry type: 0` after `OPTIMIZE TABLE FINAL` query. [#4683](https://github.com/ClickHouse/ClickHouse/pull/4683) ([Amos Bird](https://github.com/amosbird)) +- Wrong arguments to `hasAny` or `hasAll` functions may lead to segfault. [#4698](https://github.com/ClickHouse/ClickHouse/pull/4698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Deadlock may happen while executing `DROP DATABASE dictionary` query. [#4701](https://github.com/ClickHouse/ClickHouse/pull/4701) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix undefined behavior in `median` and `quantile` functions. [#4702](https://github.com/ClickHouse/ClickHouse/pull/4702) ([hcz](https://github.com/hczhcz)) +- Fix compression level detection when `network_compression_method` in lowercase. Broken in v19.1. [#4706](https://github.com/ClickHouse/ClickHouse/pull/4706) ([proller](https://github.com/proller)) +- Fixed ignorance of `UTC` setting (fixes issue [#4658](https://github.com/ClickHouse/ClickHouse/issues/4658)). [#4718](https://github.com/ClickHouse/ClickHouse/pull/4718) ([proller](https://github.com/proller)) +- Fix `histogram` function behaviour with `Distributed` tables. [#4741](https://github.com/ClickHouse/ClickHouse/pull/4741) ([olegkv](https://github.com/olegkv)) +- Fixed tsan report `destroy of a locked mutex`. [#4742](https://github.com/ClickHouse/ClickHouse/pull/4742) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed TSan report on shutdown due to race condition in system logs usage. Fixed potential use-after-free on shutdown when part_log is enabled. [#4758](https://github.com/ClickHouse/ClickHouse/pull/4758) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix recheck parts in `ReplicatedMergeTreeAlterThread` in case of error. [#4772](https://github.com/ClickHouse/ClickHouse/pull/4772) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Arithmetic operations on intermediate aggregate function states were not working for constant arguments (such as subquery results). [#4776](https://github.com/ClickHouse/ClickHouse/pull/4776) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Always backquote column names in metadata. Otherwise it’s impossible to create a table with column named `index` (server won’t restart due to malformed `ATTACH` query in metadata). [#4782](https://github.com/ClickHouse/ClickHouse/pull/4782) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix crash in `ALTER ... MODIFY ORDER BY` on `Distributed` table. [#4790](https://github.com/ClickHouse/ClickHouse/pull/4790) ([TCeason](https://github.com/TCeason)) +- Fix segfault in `JOIN ON` with enabled `enable_optimize_predicate_expression`. [#4794](https://github.com/ClickHouse/ClickHouse/pull/4794) ([Winter Zhang](https://github.com/zhang2014)) +- Fix bug with adding an extraneous row after consuming a protobuf message from Kafka. [#4808](https://github.com/ClickHouse/ClickHouse/pull/4808) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) +- Fixed race condition in `SELECT` from `system.tables` if the table is renamed or altered concurrently. [#4836](https://github.com/ClickHouse/ClickHouse/pull/4836) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed data race when fetching data part that is already obsolete. [#4839](https://github.com/ClickHouse/ClickHouse/pull/4839) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed rare data race that can happen during `RENAME` table of MergeTree family. [#4844](https://github.com/ClickHouse/ClickHouse/pull/4844) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed segmentation fault in function `arrayIntersect`. Segmentation fault could happen if function was called with mixed constant and ordinary arguments. [#4847](https://github.com/ClickHouse/ClickHouse/pull/4847) ([Lixiang Qian](https://github.com/fancyqlx)) +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix `No message received` exception while fetching parts between replicas. [#4856](https://github.com/ClickHouse/ClickHouse/pull/4856) ([alesapin](https://github.com/alesapin)) +- Fixed `arrayIntersect` function wrong result in case of several repeated values in single array. [#4871](https://github.com/ClickHouse/ClickHouse/pull/4871) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix a race condition during concurrent `ALTER COLUMN` queries that could lead to a server crash (fixes issue [#3421](https://github.com/ClickHouse/ClickHouse/issues/3421)). [#4592](https://github.com/ClickHouse/ClickHouse/pull/4592) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix parameter deduction in `ALTER MODIFY` of column `CODEC` when column type is not specified. [#4883](https://github.com/ClickHouse/ClickHouse/pull/4883) ([alesapin](https://github.com/alesapin)) +- Functions `cutQueryStringAndFragment()` and `queryStringAndFragment()` now works correctly when `URL` contains a fragment and no query. [#4894](https://github.com/ClickHouse/ClickHouse/pull/4894) ([Vitaly Baranov](https://github.com/vitlibar)) +- Fix rare bug when setting `min_bytes_to_use_direct_io` is greater than zero, which occures when thread have to seek backward in column file. [#4897](https://github.com/ClickHouse/ClickHouse/pull/4897) ([alesapin](https://github.com/alesapin)) +- Fix wrong argument types for aggregate functions with `LowCardinality` arguments (fixes issue [#4919](https://github.com/ClickHouse/ClickHouse/issues/4919)). [#4922](https://github.com/ClickHouse/ClickHouse/pull/4922) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fix function `toISOWeek` result for year 1970. [#4988](https://github.com/ClickHouse/ClickHouse/pull/4988) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix `DROP`, `TRUNCATE` and `OPTIMIZE` queries duplication, when executed on `ON CLUSTER` for `ReplicatedMergeTree*` tables family. [#4991](https://github.com/ClickHouse/ClickHouse/pull/4991) ([alesapin](https://github.com/alesapin)) + +#### Improvements {#improvements-2} + +- Keep ordinary, `DEFAULT`, `MATERIALIZED` and `ALIAS` columns in a single list (fixes issue [#2867](https://github.com/ClickHouse/ClickHouse/issues/2867)). [#4707](https://github.com/ClickHouse/ClickHouse/pull/4707) ([Alex Zatelepin](https://github.com/ztlpn)) + +### ClickHouse Release 19.4.3.11, 2019-04-02 {#clickhouse-release-19-4-3-11-2019-04-02} + +#### Bug Fixes {#bug-fixes-8} + +- Fix crash in `FULL/RIGHT JOIN` when we joining on nullable vs not nullable. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-11} + +- Add a way to launch clickhouse-server image from a custom user. [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) + +### ClickHouse Release 19.4.2.7, 2019-03-30 {#clickhouse-release-19-4-2-7-2019-03-30} + +#### Bug Fixes {#bug-fixes-9} + +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +### ClickHouse Release 19.4.1.3, 2019-03-19 {#clickhouse-release-19-4-1-3-2019-03-19} + +#### Bug Fixes {#bug-fixes-10} + +- Fixed remote queries which contain both `LIMIT BY` and `LIMIT`. Previously, if `LIMIT BY` and `LIMIT` were used for remote query, `LIMIT` could happen before `LIMIT BY`, which led to too filtered result. [#4708](https://github.com/ClickHouse/ClickHouse/pull/4708) ([Constantin S. Pan](https://github.com/kvap)) + +### ClickHouse Release 19.4.0.49, 2019-03-09 {#clickhouse-release-19-4-0-49-2019-03-09} + +#### New Features {#new-features-5} + +- Added full support for `Protobuf` format (input and output, nested data structures). [#4174](https://github.com/ClickHouse/ClickHouse/pull/4174) [#4493](https://github.com/ClickHouse/ClickHouse/pull/4493) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added bitmap functions with Roaring Bitmaps. [#4207](https://github.com/ClickHouse/ClickHouse/pull/4207) ([Andy Yang](https://github.com/andyyzh)) [#4568](https://github.com/ClickHouse/ClickHouse/pull/4568) ([Vitaly Baranov](https://github.com/vitlibar)) +- Parquet format support. [#4448](https://github.com/ClickHouse/ClickHouse/pull/4448) ([proller](https://github.com/proller)) +- N-gram distance was added for fuzzy string comparison. It is similar to q-gram metrics in R language. [#4466](https://github.com/ClickHouse/ClickHouse/pull/4466) ([Danila Kutenin](https://github.com/danlark1)) +- Combine rules for graphite rollup from dedicated aggregation and retention patterns. [#4426](https://github.com/ClickHouse/ClickHouse/pull/4426) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +- Added `max_execution_speed` and `max_execution_speed_bytes` to limit resource usage. Added `min_execution_speed_bytes` setting to complement the `min_execution_speed`. [#4430](https://github.com/ClickHouse/ClickHouse/pull/4430) ([Winter Zhang](https://github.com/zhang2014)) +- Implemented function `flatten`. [#4555](https://github.com/ClickHouse/ClickHouse/pull/4555) [#4409](https://github.com/ClickHouse/ClickHouse/pull/4409) ([alexey-milovidov](https://github.com/alexey-milovidov), [kzon](https://github.com/kzon)) +- Added functions `arrayEnumerateDenseRanked` and `arrayEnumerateUniqRanked` (it’s like `arrayEnumerateUniq` but allows to fine tune array depth to look inside multidimensional arrays). [#4475](https://github.com/ClickHouse/ClickHouse/pull/4475) ([proller](https://github.com/proller)) [#4601](https://github.com/ClickHouse/ClickHouse/pull/4601) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Multiple JOINS with some restrictions: no asterisks, no complex aliases in ON/WHERE/GROUP BY/… [#4462](https://github.com/ClickHouse/ClickHouse/pull/4462) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Bug Fixes {#bug-fixes-11} + +- This release also contains all bug fixes from 19.3 and 19.1. +- Fixed bug in data skipping indices: order of granules after INSERT was incorrect. [#4407](https://github.com/ClickHouse/ClickHouse/pull/4407) ([Nikita Vasilev](https://github.com/nikvas0)) +- Fixed `set` index for `Nullable` and `LowCardinality` columns. Before it, `set` index with `Nullable` or `LowCardinality` column led to error `Data type must be deserialized with multiple streams` while selecting. [#4594](https://github.com/ClickHouse/ClickHouse/pull/4594) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Correctly set update_time on full `executable` dictionary update. [#4551](https://github.com/ClickHouse/ClickHouse/pull/4551) ([Tema Novikov](https://github.com/temoon)) +- Fix broken progress bar in 19.3. [#4627](https://github.com/ClickHouse/ClickHouse/pull/4627) ([filimonov](https://github.com/filimonov)) +- Fixed inconsistent values of MemoryTracker when memory region was shrinked, in certain cases. [#4619](https://github.com/ClickHouse/ClickHouse/pull/4619) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed undefined behaviour in ThreadPool. [#4612](https://github.com/ClickHouse/ClickHouse/pull/4612) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a very rare crash with the message `mutex lock failed: Invalid argument` that could happen when a MergeTree table was dropped concurrently with a SELECT. [#4608](https://github.com/ClickHouse/ClickHouse/pull/4608) ([Alex Zatelepin](https://github.com/ztlpn)) +- ODBC driver compatibility with `LowCardinality` data type. [#4381](https://github.com/ClickHouse/ClickHouse/pull/4381) ([proller](https://github.com/proller)) +- FreeBSD: Fixup for `AIOcontextPool: Found io_event with unknown id 0` error. [#4438](https://github.com/ClickHouse/ClickHouse/pull/4438) ([urgordeadbeef](https://github.com/urgordeadbeef)) +- `system.part_log` table was created regardless to configuration. [#4483](https://github.com/ClickHouse/ClickHouse/pull/4483) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix undefined behaviour in `dictIsIn` function for cache dictionaries. [#4515](https://github.com/ClickHouse/ClickHouse/pull/4515) ([alesapin](https://github.com/alesapin)) +- Fixed a deadlock when a SELECT query locks the same table multiple times (e.g. from different threads or when executing multiple subqueries) and there is a concurrent DDL query. [#4535](https://github.com/ClickHouse/ClickHouse/pull/4535) ([Alex Zatelepin](https://github.com/ztlpn)) +- Disable compile_expressions by default until we get own `llvm` contrib and can test it with `clang` and `asan`. [#4579](https://github.com/ClickHouse/ClickHouse/pull/4579) ([alesapin](https://github.com/alesapin)) +- Prevent `std::terminate` when `invalidate_query` for `clickhouse` external dictionary source has returned wrong resultset (empty or more than one row or more than one column). Fixed issue when the `invalidate_query` was performed every five seconds regardless to the `lifetime`. [#4583](https://github.com/ClickHouse/ClickHouse/pull/4583) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Avoid deadlock when the `invalidate_query` for a dictionary with `clickhouse` source was involving `system.dictionaries` table or `Dictionaries` database (rare case). [#4599](https://github.com/ClickHouse/ClickHouse/pull/4599) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixes for CROSS JOIN with empty WHERE. [#4598](https://github.com/ClickHouse/ClickHouse/pull/4598) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed segfault in function “replicate” when constant argument is passed. [#4603](https://github.com/ClickHouse/ClickHouse/pull/4603) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix lambda function with predicate optimizer. [#4408](https://github.com/ClickHouse/ClickHouse/pull/4408) ([Winter Zhang](https://github.com/zhang2014)) +- Multiple JOINs multiple fixes. [#4595](https://github.com/ClickHouse/ClickHouse/pull/4595) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Improvements {#improvements-3} + +- Support aliases in JOIN ON section for right table columns. [#4412](https://github.com/ClickHouse/ClickHouse/pull/4412) ([Artem Zuikov](https://github.com/4ertus2)) +- Result of multiple JOINs need correct result names to be used in subselects. Replace flat aliases with source names in result. [#4474](https://github.com/ClickHouse/ClickHouse/pull/4474) ([Artem Zuikov](https://github.com/4ertus2)) +- Improve push-down logic for joined statements. [#4387](https://github.com/ClickHouse/ClickHouse/pull/4387) ([Ivan](https://github.com/abyss7)) + +#### Performance Improvements {#performance-improvements-3} + +- Improved heuristics of “move to PREWHERE” optimization. [#4405](https://github.com/ClickHouse/ClickHouse/pull/4405) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Use proper lookup tables that uses HashTable’s API for 8-bit and 16-bit keys. [#4536](https://github.com/ClickHouse/ClickHouse/pull/4536) ([Amos Bird](https://github.com/amosbird)) +- Improved performance of string comparison. [#4564](https://github.com/ClickHouse/ClickHouse/pull/4564) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Cleanup distributed DDL queue in a separate thread so that it does not slow down the main loop that processes distributed DDL tasks. [#4502](https://github.com/ClickHouse/ClickHouse/pull/4502) ([Alex Zatelepin](https://github.com/ztlpn)) +- When `min_bytes_to_use_direct_io` is set to 1, not every file was opened with O_DIRECT mode because the data size to read was sometimes underestimated by the size of one compressed block. [#4526](https://github.com/ClickHouse/ClickHouse/pull/4526) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-12} + +- Added support for clang-9 [#4604](https://github.com/ClickHouse/ClickHouse/pull/4604) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix wrong `__asm__` instructions (again) [#4621](https://github.com/ClickHouse/ClickHouse/pull/4621) ([Konstantin Podshumok](https://github.com/podshumok)) +- Add ability to specify settings for `clickhouse-performance-test` from command line. [#4437](https://github.com/ClickHouse/ClickHouse/pull/4437) ([alesapin](https://github.com/alesapin)) +- Add dictionaries tests to integration tests. [#4477](https://github.com/ClickHouse/ClickHouse/pull/4477) ([alesapin](https://github.com/alesapin)) +- Added queries from the benchmark on the website to automated performance tests. [#4496](https://github.com/ClickHouse/ClickHouse/pull/4496) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `xxhash.h` does not exist in external lz4 because it is an implementation detail and its symbols are namespaced with `XXH_NAMESPACE` macro. When lz4 is external, xxHash has to be external too, and the dependents have to link to it. [#4495](https://github.com/ClickHouse/ClickHouse/pull/4495) ([Orivej Desh](https://github.com/orivej)) +- Fixed a case when `quantileTiming` aggregate function can be called with negative or floating point argument (this fixes fuzz test with undefined behaviour sanitizer). [#4506](https://github.com/ClickHouse/ClickHouse/pull/4506) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Spelling error correction. [#4531](https://github.com/ClickHouse/ClickHouse/pull/4531) ([sdk2](https://github.com/sdk2)) +- Fix compilation on Mac. [#4371](https://github.com/ClickHouse/ClickHouse/pull/4371) ([Vitaly Baranov](https://github.com/vitlibar)) +- Build fixes for FreeBSD and various unusual build configurations. [#4444](https://github.com/ClickHouse/ClickHouse/pull/4444) ([proller](https://github.com/proller)) + +## ClickHouse Release 19.3 {#clickhouse-release-19-3} + +### ClickHouse Release 19.3.9.1, 2019-04-02 {#clickhouse-release-19-3-9-1-2019-04-02} + +#### Bug Fixes {#bug-fixes-12} + +- Fix crash in `FULL/RIGHT JOIN` when we joining on nullable vs not nullable. [#4855](https://github.com/ClickHouse/ClickHouse/pull/4855) ([Artem Zuikov](https://github.com/4ertus2)) +- Fix segmentation fault in `clickhouse-copier`. [#4835](https://github.com/ClickHouse/ClickHouse/pull/4835) ([proller](https://github.com/proller)) +- Fixed reading from `Array(LowCardinality)` column in rare case when column contained a long sequence of empty arrays. [#4850](https://github.com/ClickHouse/ClickHouse/pull/4850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Build/Testing/Packaging Improvement {#buildtestingpackaging-improvement-13} + +- Add a way to launch clickhouse-server image from a custom user [#4753](https://github.com/ClickHouse/ClickHouse/pull/4753) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) + +### ClickHouse Release 19.3.7, 2019-03-12 {#clickhouse-release-19-3-7-2019-03-12} + +#### Bug Fixes {#bug-fixes-13} + +- Fixed error in #3920. This error manifests itself as random cache corruption (messages `Unknown codec family code`, `Cannot seek through file`) and segfaults. This bug first appeared in version 19.1 and is present in versions up to 19.1.10 and 19.3.6. [#4623](https://github.com/ClickHouse/ClickHouse/pull/4623) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.3.6, 2019-03-02 {#clickhouse-release-19-3-6-2019-03-02} + +#### Bug Fixes {#bug-fixes-14} + +- When there are more than 1000 threads in a thread pool, `std::terminate` may happen on thread exit. [Azat Khuzhin](https://github.com/azat) [#4485](https://github.com/ClickHouse/ClickHouse/pull/4485) [#4505](https://github.com/ClickHouse/ClickHouse/pull/4505) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Now it’s possible to create `ReplicatedMergeTree*` tables with comments on columns without defaults and tables with columns codecs without comments and defaults. Also fix comparison of codecs. [#4523](https://github.com/ClickHouse/ClickHouse/pull/4523) ([alesapin](https://github.com/alesapin)) +- Fixed crash on JOIN with array or tuple. [#4552](https://github.com/ClickHouse/ClickHouse/pull/4552) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed crash in clickhouse-copier with the message `ThreadStatus not created`. [#4540](https://github.com/ClickHouse/ClickHouse/pull/4540) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed hangup on server shutdown if distributed DDLs were used. [#4472](https://github.com/ClickHouse/ClickHouse/pull/4472) ([Alex Zatelepin](https://github.com/ztlpn)) +- Incorrect column numbers were printed in error message about text format parsing for columns with number greater than 10. [#4484](https://github.com/ClickHouse/ClickHouse/pull/4484) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-3} + +- Fixed build with AVX enabled. [#4527](https://github.com/ClickHouse/ClickHouse/pull/4527) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Enable extended accounting and IO accounting based on good known version instead of kernel under which it is compiled. [#4541](https://github.com/ClickHouse/ClickHouse/pull/4541) ([nvartolomei](https://github.com/nvartolomei)) +- Allow to skip setting of core_dump.size_limit, warning instead of throw if limit set fail. [#4473](https://github.com/ClickHouse/ClickHouse/pull/4473) ([proller](https://github.com/proller)) +- Removed the `inline` tags of `void readBinary(...)` in `Field.cpp`. Also merged redundant `namespace DB` blocks. [#4530](https://github.com/ClickHouse/ClickHouse/pull/4530) ([hcz](https://github.com/hczhcz)) + +### ClickHouse Release 19.3.5, 2019-02-21 {#clickhouse-release-19-3-5-2019-02-21} + +#### Bug Fixes {#bug-fixes-15} + +- Fixed bug with large http insert queries processing. [#4454](https://github.com/ClickHouse/ClickHouse/pull/4454) ([alesapin](https://github.com/alesapin)) +- Fixed backward incompatibility with old versions due to wrong implementation of `send_logs_level` setting. [#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed backward incompatibility of table function `remote` introduced with column comments. [#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.3.4, 2019-02-16 {#clickhouse-release-19-3-4-2019-02-16} + +#### Improvements {#improvements-4} + +- Table index size is not accounted for memory limits when doing `ATTACH TABLE` query. Avoided the possibility that a table cannot be attached after being detached. [#4396](https://github.com/ClickHouse/ClickHouse/pull/4396) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Slightly raised up the limit on max string and array size received from ZooKeeper. It allows to continue to work with increased size of `CLIENT_JVMFLAGS=-Djute.maxbuffer=...` on ZooKeeper. [#4398](https://github.com/ClickHouse/ClickHouse/pull/4398) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Allow to repair abandoned replica even if it already has huge number of nodes in its queue. [#4399](https://github.com/ClickHouse/ClickHouse/pull/4399) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Add one required argument to `SET` index (max stored rows number). [#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) + +#### Bug Fixes {#bug-fixes-16} + +- Fixed `WITH ROLLUP` result for group by single `LowCardinality` key. [#4384](https://github.com/ClickHouse/ClickHouse/pull/4384) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Fixed bug in the set index (dropping a granule if it contains more than `max_rows` rows). [#4386](https://github.com/ClickHouse/ClickHouse/pull/4386) ([Nikita Vasilev](https://github.com/nikvas0)) +- A lot of FreeBSD build fixes. [#4397](https://github.com/ClickHouse/ClickHouse/pull/4397) ([proller](https://github.com/proller)) +- Fixed aliases substitution in queries with subquery containing same alias (issue [#4110](https://github.com/ClickHouse/ClickHouse/issues/4110)). [#4351](https://github.com/ClickHouse/ClickHouse/pull/4351) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-4} + +- Add ability to run `clickhouse-server` for stateless tests in docker image. [#4347](https://github.com/ClickHouse/ClickHouse/pull/4347) ([Vasily Nemkov](https://github.com/Enmk)) + +### ClickHouse Release 19.3.3, 2019-02-13 {#clickhouse-release-19-3-3-2019-02-13} + +#### New Features {#new-features-6} + +- Added the `KILL MUTATION` statement that allows removing mutations that are for some reasons stuck. Added `latest_failed_part`, `latest_fail_time`, `latest_fail_reason` fields to the `system.mutations` table for easier troubleshooting. [#4287](https://github.com/ClickHouse/ClickHouse/pull/4287) ([Alex Zatelepin](https://github.com/ztlpn)) +- Added aggregate function `entropy` which computes Shannon entropy. [#4238](https://github.com/ClickHouse/ClickHouse/pull/4238) ([Quid37](https://github.com/Quid37)) +- Added ability to send queries `INSERT INTO tbl VALUES (....` to server without splitting on `query` and `data` parts. [#4301](https://github.com/ClickHouse/ClickHouse/pull/4301) ([alesapin](https://github.com/alesapin)) +- Generic implementation of `arrayWithConstant` function was added. [#4322](https://github.com/ClickHouse/ClickHouse/pull/4322) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Implemented `NOT BETWEEN` comparison operator. [#4228](https://github.com/ClickHouse/ClickHouse/pull/4228) ([Dmitry Naumov](https://github.com/nezed)) +- Implement `sumMapFiltered` in order to be able to limit the number of keys for which values will be summed by `sumMap`. [#4129](https://github.com/ClickHouse/ClickHouse/pull/4129) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Added support of `Nullable` types in `mysql` table function. [#4198](https://github.com/ClickHouse/ClickHouse/pull/4198) ([Emmanuel Donin de Rosière](https://github.com/edonin)) +- Support for arbitrary constant expressions in `LIMIT` clause. [#4246](https://github.com/ClickHouse/ClickHouse/pull/4246) ([k3box](https://github.com/k3box)) +- Added `topKWeighted` aggregate function that takes additional argument with (unsigned integer) weight. [#4245](https://github.com/ClickHouse/ClickHouse/pull/4245) ([Andrew Golman](https://github.com/andrewgolman)) +- `StorageJoin` now supports `join_any_take_last_row` setting that allows overwriting existing values of the same key. [#3973](https://github.com/ClickHouse/ClickHouse/pull/3973) ([Amos Bird](https://github.com/amosbird) +- Added function `toStartOfInterval`. [#4304](https://github.com/ClickHouse/ClickHouse/pull/4304) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added `RowBinaryWithNamesAndTypes` format. [#4200](https://github.com/ClickHouse/ClickHouse/pull/4200) ([Oleg V. Kozlyuk](https://github.com/DarkWanderer)) +- Added `IPv4` and `IPv6` data types. More effective implementations of `IPv*` functions. [#3669](https://github.com/ClickHouse/ClickHouse/pull/3669) ([Vasily Nemkov](https://github.com/Enmk)) +- Added function `toStartOfTenMinutes()`. [#4298](https://github.com/ClickHouse/ClickHouse/pull/4298) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added `Protobuf` output format. [#4005](https://github.com/ClickHouse/ClickHouse/pull/4005) [#4158](https://github.com/ClickHouse/ClickHouse/pull/4158) ([Vitaly Baranov](https://github.com/vitlibar)) +- Added brotli support for HTTP interface for data import (INSERTs). [#4235](https://github.com/ClickHouse/ClickHouse/pull/4235) ([Mikhail](https://github.com/fandyushin)) +- Added hints while user make typo in function name or type in command line client. [#4239](https://github.com/ClickHouse/ClickHouse/pull/4239) ([Danila Kutenin](https://github.com/danlark1)) +- Added `Query-Id` to Server’s HTTP Response header. [#4231](https://github.com/ClickHouse/ClickHouse/pull/4231) ([Mikhail](https://github.com/fandyushin)) + +#### Experimental Features {#experimental-features-2} + +- Added `minmax` and `set` data skipping indices for MergeTree table engines family. [#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) +- Added conversion of `CROSS JOIN` to `INNER JOIN` if possible. [#4221](https://github.com/ClickHouse/ClickHouse/pull/4221) [#4266](https://github.com/ClickHouse/ClickHouse/pull/4266) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Bug Fixes {#bug-fixes-17} + +- Fixed `Not found column` for duplicate columns in `JOIN ON` section. [#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) +- Make `START REPLICATED SENDS` command start replicated sends. [#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([nvartolomei](https://github.com/nvartolomei)) +- Fixed aggregate functions execution with `Array(LowCardinality)` arguments. [#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed wrong behaviour when doing `INSERT ... SELECT ... FROM file(...)` query and file has `CSVWithNames` or `TSVWIthNames` format and the first data row is missing. [#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed crash on dictionary reload if dictionary not available. This bug was appeared in 19.1.6. [#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([proller](https://github.com/proller)) +- Fixed `ALL JOIN` with duplicates in right table. [#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed segmentation fault with `use_uncompressed_cache=1` and exception with wrong uncompressed size. This bug was appeared in 19.1.6. [#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) +- Fixed `compile_expressions` bug with comparison of big (more than int16) dates. [#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) +- Fixed infinite loop when selecting from table function `numbers(0)`. [#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Temporarily disable predicate optimization for `ORDER BY`. [#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed `Illegal instruction` error when using base64 functions on old CPUs. This error has been reproduced only when ClickHouse was compiled with gcc-8. [#4275](https://github.com/ClickHouse/ClickHouse/pull/4275) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `No message received` error when interacting with PostgreSQL ODBC Driver through TLS connection. Also fixes segfault when using MySQL ODBC Driver. [#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed incorrect result when `Date` and `DateTime` arguments are used in branches of conditional operator (function `if`). Added generic case for function `if`. [#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- ClickHouse dictionaries now load within `clickhouse` process. [#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed deadlock when `SELECT` from a table with `File` engine was retried after `No such file or directory` error. [#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed race condition when selecting from `system.tables` may give `table does not exist` error. [#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `clickhouse-client` can segfault on exit while loading data for command line suggestions if it was run in interactive mode. [#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a bug when the execution of mutations containing `IN` operators was producing incorrect results. [#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fixed error: if there is a database with `Dictionary` engine, all dictionaries forced to load at server startup, and if there is a dictionary with ClickHouse source from localhost, the dictionary cannot load. [#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error when system logs are tried to create again at server shutdown. [#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Correctly return the right type and properly handle locks in `joinGet` function. [#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos Bird](https://github.com/amosbird)) +- Added `sumMapWithOverflow` function. [#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Fixed segfault with `allow_experimental_multiple_joins_emulation`. [52de2c](https://github.com/ClickHouse/ClickHouse/commit/52de2cd927f7b5257dd67e175f0a5560a48840d0) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed bug with incorrect `Date` and `DateTime` comparison. [#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([valexey](https://github.com/valexey)) +- Fixed fuzz test under undefined behavior sanitizer: added parameter type check for `quantile*Weighted` family of functions. [#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed rare race condition when removing of old data parts can fail with `File not found` error. [#4378](https://github.com/ClickHouse/ClickHouse/pull/4378) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix install package with missing /etc/clickhouse-server/config.xml. [#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([proller](https://github.com/proller)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-5} + +- Debian package: correct /etc/clickhouse-server/preprocessed link according to config. [#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([proller](https://github.com/proller)) +- Various build fixes for FreeBSD. [#4225](https://github.com/ClickHouse/ClickHouse/pull/4225) ([proller](https://github.com/proller)) +- Added ability to create, fill and drop tables in perftest. [#4220](https://github.com/ClickHouse/ClickHouse/pull/4220) ([alesapin](https://github.com/alesapin)) +- Added a script to check for duplicate includes. [#4326](https://github.com/ClickHouse/ClickHouse/pull/4326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added ability to run queries by index in performance test. [#4264](https://github.com/ClickHouse/ClickHouse/pull/4264) ([alesapin](https://github.com/alesapin)) +- Package with debug symbols is suggested to be installed. [#4274](https://github.com/ClickHouse/ClickHouse/pull/4274) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Refactoring of performance-test. Better logging and signals handling. [#4171](https://github.com/ClickHouse/ClickHouse/pull/4171) ([alesapin](https://github.com/alesapin)) +- Added docs to anonymized Yandex.Metrika datasets. [#4164](https://github.com/ClickHouse/ClickHouse/pull/4164) ([alesapin](https://github.com/alesapin)) +- Аdded tool for converting an old month-partitioned part to the custom-partitioned format. [#4195](https://github.com/ClickHouse/ClickHouse/pull/4195) ([Alex Zatelepin](https://github.com/ztlpn)) +- Added docs about two datasets in s3. [#4144](https://github.com/ClickHouse/ClickHouse/pull/4144) ([alesapin](https://github.com/alesapin)) +- Added script which creates changelog from pull requests description. [#4169](https://github.com/ClickHouse/ClickHouse/pull/4169) [#4173](https://github.com/ClickHouse/ClickHouse/pull/4173) ([KochetovNicolai](https://github.com/KochetovNicolai)) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Added puppet module for ClickHouse. [#4182](https://github.com/ClickHouse/ClickHouse/pull/4182) ([Maxim Fedotov](https://github.com/MaxFedotov)) +- Added docs for a group of undocumented functions. [#4168](https://github.com/ClickHouse/ClickHouse/pull/4168) ([Winter Zhang](https://github.com/zhang2014)) +- ARM build fixes. [#4210](https://github.com/ClickHouse/ClickHouse/pull/4210)[#4306](https://github.com/ClickHouse/ClickHouse/pull/4306) [#4291](https://github.com/ClickHouse/ClickHouse/pull/4291) ([proller](https://github.com/proller)) ([proller](https://github.com/proller)) +- Dictionary tests now able to run from `ctest`. [#4189](https://github.com/ClickHouse/ClickHouse/pull/4189) ([proller](https://github.com/proller)) +- Now `/etc/ssl` is used as default directory with SSL certificates. [#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added checking SSE and AVX instruction at start. [#4234](https://github.com/ClickHouse/ClickHouse/pull/4234) ([Igr](https://github.com/igron99)) +- Init script will wait server until start. [#4281](https://github.com/ClickHouse/ClickHouse/pull/4281) ([proller](https://github.com/proller)) + +#### Backward Incompatible Changes {#backward-incompatible-changes-1} + +- Removed `allow_experimental_low_cardinality_type` setting. `LowCardinality` data types are production ready. [#4323](https://github.com/ClickHouse/ClickHouse/pull/4323) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Reduce mark cache size and uncompressed cache size accordingly to available memory amount. [#4240](https://github.com/ClickHouse/ClickHouse/pull/4240) ([Lopatin Konstantin](https://github.com/k-lopatin) +- Added keyword `INDEX` in `CREATE TABLE` query. A column with name `index` must be quoted with backticks or double quotes: `` `index` ``. [#4143](https://github.com/ClickHouse/ClickHouse/pull/4143) ([Nikita Vasilev](https://github.com/nikvas0)) +- `sumMap` now promote result type instead of overflow. The old `sumMap` behavior can be obtained by using `sumMapWithOverflow` function. [#4151](https://github.com/ClickHouse/ClickHouse/pull/4151) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) + +#### Performance Improvements {#performance-improvements-4} + +- `std::sort` replaced by `pdqsort` for queries without `LIMIT`. [#4236](https://github.com/ClickHouse/ClickHouse/pull/4236) ([Evgenii Pravda](https://github.com/kvinty)) +- Now server reuse threads from global thread pool. This affects performance in some corner cases. [#4150](https://github.com/ClickHouse/ClickHouse/pull/4150) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvements {#improvements-5} + +- Implemented AIO support for FreeBSD. [#4305](https://github.com/ClickHouse/ClickHouse/pull/4305) ([urgordeadbeef](https://github.com/urgordeadbeef)) +- `SELECT * FROM a JOIN b USING a, b` now return `a` and `b` columns only from the left table. [#4141](https://github.com/ClickHouse/ClickHouse/pull/4141) ([Artem Zuikov](https://github.com/4ertus2)) +- Allow `-C` option of client to work as `-c` option. [#4232](https://github.com/ClickHouse/ClickHouse/pull/4232) ([syominsergey](https://github.com/syominsergey)) +- Now option `--password` used without value requires password from stdin. [#4230](https://github.com/ClickHouse/ClickHouse/pull/4230) ([BSD_Conqueror](https://github.com/bsd-conqueror)) +- Added highlighting of unescaped metacharacters in string literals that contain `LIKE` expressions or regexps. [#4327](https://github.com/ClickHouse/ClickHouse/pull/4327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added cancelling of HTTP read only queries if client socket goes away. [#4213](https://github.com/ClickHouse/ClickHouse/pull/4213) ([nvartolomei](https://github.com/nvartolomei)) +- Now server reports progress to keep client connections alive. [#4215](https://github.com/ClickHouse/ClickHouse/pull/4215) ([Ivan](https://github.com/abyss7)) +- Slightly better message with reason for OPTIMIZE query with `optimize_throw_if_noop` setting enabled. [#4294](https://github.com/ClickHouse/ClickHouse/pull/4294) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added support of `--version` option for clickhouse server. [#4251](https://github.com/ClickHouse/ClickHouse/pull/4251) ([Lopatin Konstantin](https://github.com/k-lopatin)) +- Added `--help/-h` option to `clickhouse-server`. [#4233](https://github.com/ClickHouse/ClickHouse/pull/4233) ([Yuriy Baranov](https://github.com/yurriy)) +- Added support for scalar subqueries with aggregate function state result. [#4348](https://github.com/ClickHouse/ClickHouse/pull/4348) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +- Improved server shutdown time and ALTERs waiting time. [#4372](https://github.com/ClickHouse/ClickHouse/pull/4372) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added info about the replicated_can_become_leader setting to system.replicas and add logging if the replica won’t try to become leader. [#4379](https://github.com/ClickHouse/ClickHouse/pull/4379) ([Alex Zatelepin](https://github.com/ztlpn)) + +## ClickHouse Release 19.1 {#clickhouse-release-19-1} + +### ClickHouse Release 19.1.14, 2019-03-14 {#clickhouse-release-19-1-14-2019-03-14} + +- Fixed error `Column ... queried more than once` that may happen if the setting `asterisk_left_columns_only` is set to 1 in case of using `GLOBAL JOIN` with `SELECT *` (rare case). The issue does not exist in 19.3 and newer. [6bac7d8d](https://github.com/ClickHouse/ClickHouse/pull/4692/commits/6bac7d8d11a9b0d6de0b32b53c47eb2f6f8e7062) ([Artem Zuikov](https://github.com/4ertus2)) + +### ClickHouse Release 19.1.13, 2019-03-12 {#clickhouse-release-19-1-13-2019-03-12} + +This release contains exactly the same set of patches as 19.3.7. + +### ClickHouse Release 19.1.10, 2019-03-03 {#clickhouse-release-19-1-10-2019-03-03} + +This release contains exactly the same set of patches as 19.3.6. + +## ClickHouse Release 19.1 {#clickhouse-release-19-1-1} + +### ClickHouse Release 19.1.9, 2019-02-21 {#clickhouse-release-19-1-9-2019-02-21} + +#### Bug Fixes {#bug-fixes-18} + +- Fixed backward incompatibility with old versions due to wrong implementation of `send_logs_level` setting. [#4445](https://github.com/ClickHouse/ClickHouse/pull/4445) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed backward incompatibility of table function `remote` introduced with column comments. [#4446](https://github.com/ClickHouse/ClickHouse/pull/4446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.1.8, 2019-02-16 {#clickhouse-release-19-1-8-2019-02-16} + +#### Bug Fixes {#bug-fixes-19} + +- Fix install package with missing /etc/clickhouse-server/config.xml. [#4343](https://github.com/ClickHouse/ClickHouse/pull/4343) ([proller](https://github.com/proller)) + +## ClickHouse Release 19.1 {#clickhouse-release-19-1-2} + +### ClickHouse Release 19.1.7, 2019-02-15 {#clickhouse-release-19-1-7-2019-02-15} + +#### Bug Fixes {#bug-fixes-20} + +- Correctly return the right type and properly handle locks in `joinGet` function. [#4153](https://github.com/ClickHouse/ClickHouse/pull/4153) ([Amos Bird](https://github.com/amosbird)) +- Fixed error when system logs are tried to create again at server shutdown. [#4254](https://github.com/ClickHouse/ClickHouse/pull/4254) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error: if there is a database with `Dictionary` engine, all dictionaries forced to load at server startup, and if there is a dictionary with ClickHouse source from localhost, the dictionary cannot load. [#4255](https://github.com/ClickHouse/ClickHouse/pull/4255) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a bug when the execution of mutations containing `IN` operators was producing incorrect results. [#4099](https://github.com/ClickHouse/ClickHouse/pull/4099) ([Alex Zatelepin](https://github.com/ztlpn)) +- `clickhouse-client` can segfault on exit while loading data for command line suggestions if it was run in interactive mode. [#4317](https://github.com/ClickHouse/ClickHouse/pull/4317) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed race condition when selecting from `system.tables` may give `table does not exist` error. [#4313](https://github.com/ClickHouse/ClickHouse/pull/4313) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed deadlock when `SELECT` from a table with `File` engine was retried after `No such file or directory` error. [#4161](https://github.com/ClickHouse/ClickHouse/pull/4161) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed an issue: local ClickHouse dictionaries are loaded via TCP, but should load within process. [#4166](https://github.com/ClickHouse/ClickHouse/pull/4166) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `No message received` error when interacting with PostgreSQL ODBC Driver through TLS connection. Also fixes segfault when using MySQL ODBC Driver. [#4170](https://github.com/ClickHouse/ClickHouse/pull/4170) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Temporarily disable predicate optimization for `ORDER BY`. [#3890](https://github.com/ClickHouse/ClickHouse/pull/3890) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed infinite loop when selecting from table function `numbers(0)`. [#4280](https://github.com/ClickHouse/ClickHouse/pull/4280) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed `compile_expressions` bug with comparison of big (more than int16) dates. [#4341](https://github.com/ClickHouse/ClickHouse/pull/4341) ([alesapin](https://github.com/alesapin)) +- Fixed segmentation fault with `uncompressed_cache=1` and exception with wrong uncompressed size. [#4186](https://github.com/ClickHouse/ClickHouse/pull/4186) ([alesapin](https://github.com/alesapin)) +- Fixed `ALL JOIN` with duplicates in right table. [#4184](https://github.com/ClickHouse/ClickHouse/pull/4184) ([Artem Zuikov](https://github.com/4ertus2)) +- Fixed wrong behaviour when doing `INSERT ... SELECT ... FROM file(...)` query and file has `CSVWithNames` or `TSVWIthNames` format and the first data row is missing. [#4297](https://github.com/ClickHouse/ClickHouse/pull/4297) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed aggregate functions execution with `Array(LowCardinality)` arguments. [#4055](https://github.com/ClickHouse/ClickHouse/pull/4055) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Debian package: correct /etc/clickhouse-server/preprocessed link according to config. [#4205](https://github.com/ClickHouse/ClickHouse/pull/4205) ([proller](https://github.com/proller)) +- Fixed fuzz test under undefined behavior sanitizer: added parameter type check for `quantile*Weighted` family of functions. [#4145](https://github.com/ClickHouse/ClickHouse/pull/4145) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Make `START REPLICATED SENDS` command start replicated sends. [#4229](https://github.com/ClickHouse/ClickHouse/pull/4229) ([nvartolomei](https://github.com/nvartolomei)) +- Fixed `Not found column` for duplicate columns in JOIN ON section. [#4279](https://github.com/ClickHouse/ClickHouse/pull/4279) ([Artem Zuikov](https://github.com/4ertus2)) +- Now `/etc/ssl` is used as default directory with SSL certificates. [#4167](https://github.com/ClickHouse/ClickHouse/pull/4167) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed crash on dictionary reload if dictionary not available. [#4188](https://github.com/ClickHouse/ClickHouse/pull/4188) ([proller](https://github.com/proller)) +- Fixed bug with incorrect `Date` and `DateTime` comparison. [#4237](https://github.com/ClickHouse/ClickHouse/pull/4237) ([valexey](https://github.com/valexey)) +- Fixed incorrect result when `Date` and `DateTime` arguments are used in branches of conditional operator (function `if`). Added generic case for function `if`. [#4243](https://github.com/ClickHouse/ClickHouse/pull/4243) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +### ClickHouse Release 19.1.6, 2019-01-24 {#clickhouse-release-19-1-6-2019-01-24} + +#### New Features {#new-features-7} + +- Custom per column compression codecs for tables. [#3899](https://github.com/ClickHouse/ClickHouse/pull/3899) [#4111](https://github.com/ClickHouse/ClickHouse/pull/4111) ([alesapin](https://github.com/alesapin), [Winter Zhang](https://github.com/zhang2014), [Anatoly](https://github.com/Sindbag)) +- Added compression codec `Delta`. [#4052](https://github.com/ClickHouse/ClickHouse/pull/4052) ([alesapin](https://github.com/alesapin)) +- Allow to `ALTER` compression codecs. [#4054](https://github.com/ClickHouse/ClickHouse/pull/4054) ([alesapin](https://github.com/alesapin)) +- Added functions `left`, `right`, `trim`, `ltrim`, `rtrim`, `timestampadd`, `timestampsub` for SQL standard compatibility. [#3826](https://github.com/ClickHouse/ClickHouse/pull/3826) ([Ivan Blinkov](https://github.com/blinkov)) +- Support for write in `HDFS` tables and `hdfs` table function. [#4084](https://github.com/ClickHouse/ClickHouse/pull/4084) ([alesapin](https://github.com/alesapin)) +- Added functions to search for multiple constant strings from big haystack: `multiPosition`, `multiSearch` ,`firstMatch` also with `-UTF8`, `-CaseInsensitive`, and `-CaseInsensitiveUTF8` variants. [#4053](https://github.com/ClickHouse/ClickHouse/pull/4053) ([Danila Kutenin](https://github.com/danlark1)) +- Pruning of unused shards if `SELECT` query filters by sharding key (setting `optimize_skip_unused_shards`). [#3851](https://github.com/ClickHouse/ClickHouse/pull/3851) ([Gleb Kanterov](https://github.com/kanterov), [Ivan](https://github.com/abyss7)) +- Allow `Kafka` engine to ignore some number of parsing errors per block. [#4094](https://github.com/ClickHouse/ClickHouse/pull/4094) ([Ivan](https://github.com/abyss7)) +- Added support for `CatBoost` multiclass models evaluation. Function `modelEvaluate` returns tuple with per-class raw predictions for multiclass models. `libcatboostmodel.so` should be built with [#607](https://github.com/catboost/catboost/pull/607). [#3959](https://github.com/ClickHouse/ClickHouse/pull/3959) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Added functions `filesystemAvailable`, `filesystemFree`, `filesystemCapacity`. [#4097](https://github.com/ClickHouse/ClickHouse/pull/4097) ([Boris Granveaud](https://github.com/bgranvea)) +- Added hashing functions `xxHash64` and `xxHash32`. [#3905](https://github.com/ClickHouse/ClickHouse/pull/3905) ([filimonov](https://github.com/filimonov)) +- Added `gccMurmurHash` hashing function (GCC flavoured Murmur hash) which uses the same hash seed as [gcc](https://github.com/gcc-mirror/gcc/blob/41d6b10e96a1de98e90a7c0378437c3255814b16/libstdc%2B%2B-v3/include/bits/functional_hash.h#L191) [#4000](https://github.com/ClickHouse/ClickHouse/pull/4000) ([sundyli](https://github.com/sundy-li)) +- Added hashing functions `javaHash`, `hiveHash`. [#3811](https://github.com/ClickHouse/ClickHouse/pull/3811) ([shangshujie365](https://github.com/shangshujie365)) +- Added table function `remoteSecure`. Function works as `remote`, but uses secure connection. [#4088](https://github.com/ClickHouse/ClickHouse/pull/4088) ([proller](https://github.com/proller)) + +#### Experimental Features {#experimental-features-3} + +- Added multiple JOINs emulation (`allow_experimental_multiple_joins_emulation` setting). [#3946](https://github.com/ClickHouse/ClickHouse/pull/3946) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Bug Fixes {#bug-fixes-21} + +- Make `compiled_expression_cache_size` setting limited by default to lower memory consumption. [#4041](https://github.com/ClickHouse/ClickHouse/pull/4041) ([alesapin](https://github.com/alesapin)) +- Fix a bug that led to hangups in threads that perform ALTERs of Replicated tables and in the thread that updates configuration from ZooKeeper. [#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [#3891](https://github.com/ClickHouse/ClickHouse/issues/3891) [#3934](https://github.com/ClickHouse/ClickHouse/pull/3934) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fixed a race condition when executing a distributed ALTER task. The race condition led to more than one replica trying to execute the task and all replicas except one failing with a ZooKeeper error. [#3904](https://github.com/ClickHouse/ClickHouse/pull/3904) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix a bug when `from_zk` config elements weren’t refreshed after a request to ZooKeeper timed out. [#2947](https://github.com/ClickHouse/ClickHouse/issues/2947) [#3947](https://github.com/ClickHouse/ClickHouse/pull/3947) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix bug with wrong prefix for IPv4 subnet masks. [#3945](https://github.com/ClickHouse/ClickHouse/pull/3945) ([alesapin](https://github.com/alesapin)) +- Fixed crash (`std::terminate`) in rare cases when a new thread cannot be created due to exhausted resources. [#3956](https://github.com/ClickHouse/ClickHouse/pull/3956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix bug when in `remote` table function execution when wrong restrictions were used for in `getStructureOfRemoteTable`. [#4009](https://github.com/ClickHouse/ClickHouse/pull/4009) ([alesapin](https://github.com/alesapin)) +- Fix a leak of netlink sockets. They were placed in a pool where they were never deleted and new sockets were created at the start of a new thread when all current sockets were in use. [#4017](https://github.com/ClickHouse/ClickHouse/pull/4017) ([Alex Zatelepin](https://github.com/ztlpn)) +- Fix bug with closing `/proc/self/fd` directory earlier than all fds were read from `/proc` after forking `odbc-bridge` subprocess. [#4120](https://github.com/ClickHouse/ClickHouse/pull/4120) ([alesapin](https://github.com/alesapin)) +- Fixed String to UInt monotonic conversion in case of usage String in primary key. [#3870](https://github.com/ClickHouse/ClickHouse/pull/3870) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed error in calculation of integer conversion function monotonicity. [#3921](https://github.com/ClickHouse/ClickHouse/pull/3921) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed segfault in `arrayEnumerateUniq`, `arrayEnumerateDense` functions in case of some invalid arguments. [#3909](https://github.com/ClickHouse/ClickHouse/pull/3909) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fix UB in StorageMerge. [#3910](https://github.com/ClickHouse/ClickHouse/pull/3910) ([Amos Bird](https://github.com/amosbird)) +- Fixed segfault in functions `addDays`, `subtractDays`. [#3913](https://github.com/ClickHouse/ClickHouse/pull/3913) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error: functions `round`, `floor`, `trunc`, `ceil` may return bogus result when executed on integer argument and large negative scale. [#3914](https://github.com/ClickHouse/ClickHouse/pull/3914) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed a bug induced by ‘kill query sync’ which leads to a core dump. [#3916](https://github.com/ClickHouse/ClickHouse/pull/3916) ([muVulDeePecker](https://github.com/fancyqlx)) +- Fix bug with long delay after empty replication queue. [#3928](https://github.com/ClickHouse/ClickHouse/pull/3928) [#3932](https://github.com/ClickHouse/ClickHouse/pull/3932) ([alesapin](https://github.com/alesapin)) +- Fixed excessive memory usage in case of inserting into table with `LowCardinality` primary key. [#3955](https://github.com/ClickHouse/ClickHouse/pull/3955) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed `LowCardinality` serialization for `Native` format in case of empty arrays. [#3907](https://github.com/ClickHouse/ClickHouse/issues/3907) [#4011](https://github.com/ClickHouse/ClickHouse/pull/4011) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed incorrect result while using distinct by single LowCardinality numeric column. [#3895](https://github.com/ClickHouse/ClickHouse/issues/3895) [#4012](https://github.com/ClickHouse/ClickHouse/pull/4012) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fixed specialized aggregation with LowCardinality key (in case when `compile` setting is enabled). [#3886](https://github.com/ClickHouse/ClickHouse/pull/3886) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Fix user and password forwarding for replicated tables queries. [#3957](https://github.com/ClickHouse/ClickHouse/pull/3957) ([alesapin](https://github.com/alesapin)) ([小路](https://github.com/nicelulu)) +- Fixed very rare race condition that can happen when listing tables in Dictionary database while reloading dictionaries. [#3970](https://github.com/ClickHouse/ClickHouse/pull/3970) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed incorrect result when HAVING was used with ROLLUP or CUBE. [#3756](https://github.com/ClickHouse/ClickHouse/issues/3756) [#3837](https://github.com/ClickHouse/ClickHouse/pull/3837) ([Sam Chou](https://github.com/reflection)) +- Fixed column aliases for query with `JOIN ON` syntax and distributed tables. [#3980](https://github.com/ClickHouse/ClickHouse/pull/3980) ([Winter Zhang](https://github.com/zhang2014)) +- Fixed error in internal implementation of `quantileTDigest` (found by Artem Vakhrushev). This error never happens in ClickHouse and was relevant only for those who use ClickHouse codebase as a library directly. [#3935](https://github.com/ClickHouse/ClickHouse/pull/3935) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvements {#improvements-6} + +- Support for `IF NOT EXISTS` in `ALTER TABLE ADD COLUMN` statements along with `IF EXISTS` in `DROP/MODIFY/CLEAR/COMMENT COLUMN`. [#3900](https://github.com/ClickHouse/ClickHouse/pull/3900) ([Boris Granveaud](https://github.com/bgranvea)) +- Function `parseDateTimeBestEffort`: support for formats `DD.MM.YYYY`, `DD.MM.YY`, `DD-MM-YYYY`, `DD-Mon-YYYY`, `DD/Month/YYYY` and similar. [#3922](https://github.com/ClickHouse/ClickHouse/pull/3922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- `CapnProtoInputStream` now support jagged structures. [#4063](https://github.com/ClickHouse/ClickHouse/pull/4063) ([Odin Hultgren Van Der Horst](https://github.com/Miniwoffer)) +- Usability improvement: added a check that server process is started from the data directory’s owner. Do not allow to start server from root if the data belongs to non-root user. [#3785](https://github.com/ClickHouse/ClickHouse/pull/3785) ([sergey-v-galtsev](https://github.com/sergey-v-galtsev)) +- Better logic of checking required columns during analysis of queries with JOINs. [#3930](https://github.com/ClickHouse/ClickHouse/pull/3930) ([Artem Zuikov](https://github.com/4ertus2)) +- Decreased the number of connections in case of large number of Distributed tables in a single server. [#3726](https://github.com/ClickHouse/ClickHouse/pull/3726) ([Winter Zhang](https://github.com/zhang2014)) +- Supported totals row for `WITH TOTALS` query for ODBC driver. [#3836](https://github.com/ClickHouse/ClickHouse/pull/3836) ([Maksim Koritckiy](https://github.com/nightweb)) +- Allowed to use `Enum`s as integers inside if function. [#3875](https://github.com/ClickHouse/ClickHouse/pull/3875) ([Ivan](https://github.com/abyss7)) +- Added `low_cardinality_allow_in_native_format` setting. If disabled, do not use `LowCadrinality` type in `Native` format. [#3879](https://github.com/ClickHouse/ClickHouse/pull/3879) ([KochetovNicolai](https://github.com/KochetovNicolai)) +- Removed some redundant objects from compiled expressions cache to lower memory usage. [#4042](https://github.com/ClickHouse/ClickHouse/pull/4042) ([alesapin](https://github.com/alesapin)) +- Add check that `SET send_logs_level = 'value'` query accept appropriate value. [#3873](https://github.com/ClickHouse/ClickHouse/pull/3873) ([Sabyanin Maxim](https://github.com/s-mx)) +- Fixed data type check in type conversion functions. [#3896](https://github.com/ClickHouse/ClickHouse/pull/3896) ([Winter Zhang](https://github.com/zhang2014)) + +#### Performance Improvements {#performance-improvements-5} + +- Add a MergeTree setting `use_minimalistic_part_header_in_zookeeper`. If enabled, Replicated tables will store compact part metadata in a single part znode. This can dramatically reduce ZooKeeper snapshot size (especially if the tables have a lot of columns). Note that after enabling this setting you will not be able to downgrade to a version that does not support it. [#3960](https://github.com/ClickHouse/ClickHouse/pull/3960) ([Alex Zatelepin](https://github.com/ztlpn)) +- Add an DFA-based implementation for functions `sequenceMatch` and `sequenceCount` in case pattern does not contain time. [#4004](https://github.com/ClickHouse/ClickHouse/pull/4004) ([Léo Ercolanelli](https://github.com/ercolanelli-leo)) +- Performance improvement for integer numbers serialization. [#3968](https://github.com/ClickHouse/ClickHouse/pull/3968) ([Amos Bird](https://github.com/amosbird)) +- Zero left padding PODArray so that -1 element is always valid and zeroed. It’s used for branchless calculation of offsets. [#3920](https://github.com/ClickHouse/ClickHouse/pull/3920) ([Amos Bird](https://github.com/amosbird)) +- Reverted `jemalloc` version which lead to performance degradation. [#4018](https://github.com/ClickHouse/ClickHouse/pull/4018) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Backward Incompatible Changes {#backward-incompatible-changes-2} + +- Removed undocumented feature `ALTER MODIFY PRIMARY KEY` because it was superseded by the `ALTER MODIFY ORDER BY` command. [#3887](https://github.com/ClickHouse/ClickHouse/pull/3887) ([Alex Zatelepin](https://github.com/ztlpn)) +- Removed function `shardByHash`. [#3833](https://github.com/ClickHouse/ClickHouse/pull/3833) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Forbid using scalar subqueries with result of type `AggregateFunction`. [#3865](https://github.com/ClickHouse/ClickHouse/pull/3865) ([Ivan](https://github.com/abyss7)) + +#### Build/Testing/Packaging Improvements {#buildtestingpackaging-improvements-6} + +- Added support for PowerPC (`ppc64le`) build. [#4132](https://github.com/ClickHouse/ClickHouse/pull/4132) ([Danila Kutenin](https://github.com/danlark1)) +- Stateful functional tests are run on public available dataset. [#3969](https://github.com/ClickHouse/ClickHouse/pull/3969) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed error when the server cannot start with the `bash: /usr/bin/clickhouse-extract-from-config: Operation not permitted` message within Docker or systemd-nspawn. [#4136](https://github.com/ClickHouse/ClickHouse/pull/4136) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Updated `rdkafka` library to v1.0.0-RC5. Used cppkafka instead of raw C interface. [#4025](https://github.com/ClickHouse/ClickHouse/pull/4025) ([Ivan](https://github.com/abyss7)) +- Updated `mariadb-client` library. Fixed one of issues found by UBSan. [#3924](https://github.com/ClickHouse/ClickHouse/pull/3924) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Some fixes for UBSan builds. [#3926](https://github.com/ClickHouse/ClickHouse/pull/3926) [#3021](https://github.com/ClickHouse/ClickHouse/pull/3021) [#3948](https://github.com/ClickHouse/ClickHouse/pull/3948) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added per-commit runs of tests with UBSan build. +- Added per-commit runs of PVS-Studio static analyzer. +- Fixed bugs found by PVS-Studio. [#4013](https://github.com/ClickHouse/ClickHouse/pull/4013) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed glibc compatibility issues. [#4100](https://github.com/ClickHouse/ClickHouse/pull/4100) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Move Docker images to 18.10 and add compatibility file for glibc \>= 2.28 [#3965](https://github.com/ClickHouse/ClickHouse/pull/3965) ([alesapin](https://github.com/alesapin)) +- Add env variable if user do not want to chown directories in server Docker image. [#3967](https://github.com/ClickHouse/ClickHouse/pull/3967) ([alesapin](https://github.com/alesapin)) +- Enabled most of the warnings from `-Weverything` in clang. Enabled `-Wpedantic`. [#3986](https://github.com/ClickHouse/ClickHouse/pull/3986) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Added a few more warnings that are available only in clang 8. [#3993](https://github.com/ClickHouse/ClickHouse/pull/3993) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Link to `libLLVM` rather than to individual LLVM libs when using shared linking. [#3989](https://github.com/ClickHouse/ClickHouse/pull/3989) ([Orivej Desh](https://github.com/orivej)) +- Added sanitizer variables for test images. [#4072](https://github.com/ClickHouse/ClickHouse/pull/4072) ([alesapin](https://github.com/alesapin)) +- `clickhouse-server` debian package will recommend `libcap2-bin` package to use `setcap` tool for setting capabilities. This is optional. [#4093](https://github.com/ClickHouse/ClickHouse/pull/4093) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Improved compilation time, fixed includes. [#3898](https://github.com/ClickHouse/ClickHouse/pull/3898) ([proller](https://github.com/proller)) +- Added performance tests for hash functions. [#3918](https://github.com/ClickHouse/ClickHouse/pull/3918) ([filimonov](https://github.com/filimonov)) +- Fixed cyclic library dependences. [#3958](https://github.com/ClickHouse/ClickHouse/pull/3958) ([proller](https://github.com/proller)) +- Improved compilation with low available memory. [#4030](https://github.com/ClickHouse/ClickHouse/pull/4030) ([proller](https://github.com/proller)) +- Added test script to reproduce performance degradation in `jemalloc`. [#4036](https://github.com/ClickHouse/ClickHouse/pull/4036) ([alexey-milovidov](https://github.com/alexey-milovidov)) +- Fixed misspells in comments and string literals under `dbms`. [#4122](https://github.com/ClickHouse/ClickHouse/pull/4122) ([maiha](https://github.com/maiha)) +- Fixed typos in comments. [#4089](https://github.com/ClickHouse/ClickHouse/pull/4089) ([Evgenii Pravda](https://github.com/kvinty)) + +## [Changelog for 2018](./2018.md) diff --git a/docs/ja/whats-new/changelog/2020.md b/docs/ja/whats-new/changelog/2020.md new file mode 100644 index 00000000000..cbd0ee1ccca --- /dev/null +++ b/docs/ja/whats-new/changelog/2020.md @@ -0,0 +1,3534 @@ +--- +slug: /ja/whats-new/changelog/2020 +sidebar_position: 14 +sidebar_label: '2020' +title: 2020 Changelog +--- + +### ClickHouse release 20.12 + +### ClickHouse release v20.12.5.14-stable, 2020-12-28 + +#### Bug Fix + +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). +* Fix filling table `system.settings_profile_elements`. This PR fixes [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error when query `MODIFY COLUMN ... REMOVE TTL` does not actually remove column TTL. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). + +#### Build/Testing/Packaging Improvement + +* Update timezones info to 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.12.4.5-stable, 2020-12-24 + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual IPv4/IPv6 stack; - Fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes; Possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fixed key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed the issue when query optimization was producing wrong result if query contains `ARRAY JOIN`. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Fixed possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). + + +### ClickHouse release v20.12.3.3-stable, 2020-12-13 + +#### Backward Incompatible Change + +* Enable `use_compact_format_in_distributed_parts_names` by default (see the documentation for the reference). [#16728](https://github.com/ClickHouse/ClickHouse/pull/16728) ([Azat Khuzhin](https://github.com/azat)). +* Accept user settings related to file formats (e.g. `format_csv_delimiter`) in the `SETTINGS` clause when creating a table that uses `File` engine, and use these settings in all `INSERT`s and `SELECT`s. The file format settings changed in the current user session, or in the `SETTINGS` clause of a DML query itself, no longer affect the query. [#16591](https://github.com/ClickHouse/ClickHouse/pull/16591) ([Alexander Kuzmenkov](https://github.com/akuzm)). + +#### New Feature + +* add `*.xz` compression/decompression support.It enables using `*.xz` in `file()` function. This closes [#8828](https://github.com/ClickHouse/ClickHouse/issues/8828). [#16578](https://github.com/ClickHouse/ClickHouse/pull/16578) ([Abi Palagashvili](https://github.com/fibersel)). +* Introduce the query `ALTER TABLE ... DROP|DETACH PART 'part_name'`. [#15511](https://github.com/ClickHouse/ClickHouse/pull/15511) ([nvartolomei](https://github.com/nvartolomei)). +* Added new ALTER UPDATE/DELETE IN PARTITION syntax. [#13403](https://github.com/ClickHouse/ClickHouse/pull/13403) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Allow formatting named tuples as JSON objects when using JSON input/output formats, controlled by the `output_format_json_named_tuples_as_objects` setting, disabled by default. [#17175](https://github.com/ClickHouse/ClickHouse/pull/17175) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add a possibility to input enum value as it's id in TSV and CSV formats by default. [#16834](https://github.com/ClickHouse/ClickHouse/pull/16834) ([Kruglov Pavel](https://github.com/Avogar)). +* Add COLLATE support for Nullable, LowCardinality, Array and Tuple, where nested type is String. Also refactor the code associated with collations in ColumnString.cpp. [#16273](https://github.com/ClickHouse/ClickHouse/pull/16273) ([Kruglov Pavel](https://github.com/Avogar)). +* New `tcpPort` function returns TCP port listened by this server. [#17134](https://github.com/ClickHouse/ClickHouse/pull/17134) ([Ivan](https://github.com/abyss7)). +* Add new math functions: `acosh`, `asinh`, `atan2`, `atanh`, `cosh`, `hypot`, `log1p`, `sinh`. [#16636](https://github.com/ClickHouse/ClickHouse/pull/16636) ([Konstantin Malanchev](https://github.com/hombit)). +* Possibility to distribute the merges between different replicas. Introduces the `execute_merges_on_single_replica_time_threshold` mergetree setting. [#16424](https://github.com/ClickHouse/ClickHouse/pull/16424) ([filimonov](https://github.com/filimonov)). +* Add setting `aggregate_functions_null_for_empty` for SQL standard compatibility. This option will rewrite all aggregate functions in a query, adding -OrNull suffix to them. Implements [10273](https://github.com/ClickHouse/ClickHouse/issues/10273). [#16123](https://github.com/ClickHouse/ClickHouse/pull/16123) ([flynn](https://github.com/ucasFL)). +* Updated DateTime, DateTime64 parsing to accept string Date literal format. [#16040](https://github.com/ClickHouse/ClickHouse/pull/16040) ([Maksim Kita](https://github.com/kitaisreal)). +* Make it possible to change the path to history file in `clickhouse-client` using the `--history_file` parameter. [#15960](https://github.com/ClickHouse/ClickHouse/pull/15960) ([Maksim Kita](https://github.com/kitaisreal)). + +#### Bug Fix + +* Fix the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([Amos Bird](https://github.com/amosbird)). +* Fixed `Function not implemented` error when executing `RENAME` query in `Atomic` database with ClickHouse running on Windows Subsystem for Linux. Fixes [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). +* Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* fix incorrect initialization of `max_compress_block_size` of MergeTreeWriterSettings with `min_compress_block_size`. [#17833](https://github.com/ClickHouse/ClickHouse/pull/17833) ([flynn](https://github.com/ucasFL)). +* Exception message about max table size to drop was displayed incorrectly. [#17764](https://github.com/ClickHouse/ClickHouse/pull/17764) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault when there is not enough space when inserting into `Distributed` table. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* In might be determined incorrectly if cluster is circular- (cross-) replicated or not when executing `ON CLUSTER` query due to race condition when `pool_size` > 1. It's fixed. [#17640](https://github.com/ClickHouse/ClickHouse/pull/17640) ([tavplubix](https://github.com/tavplubix)). +* Exception `fmt::v7::format_error` can be logged in background for MergeTree tables. This fixes [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When clickhouse-client is used in interactive mode with multiline queries, single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix alter query hang when the corresponding mutation was killed on the different replica. Fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fix issue when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fix `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fix duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash while reading from `JOIN` table with `LowCardinality` types. Fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* fix `toInt256(inf)` stack overflow. Int256 is an experimental feature. Closed [#17235](https://github.com/ClickHouse/ClickHouse/issues/17235). [#17257](https://github.com/ClickHouse/ClickHouse/pull/17257) ([flynn](https://github.com/ucasFL)). +* Fix possible `Unexpected packet Data received from client` error logged for Distributed queries with `LIMIT`. [#17254](https://github.com/ClickHouse/ClickHouse/pull/17254) ([Azat Khuzhin](https://github.com/azat)). +* Fix set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fix possible wrong index analysis when the types of the index comparison are different. This fixes [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). +* Fix ColumnConst comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Multiple fixed for MaterializeMySQL (experimental feature). Fixes [#16923](https://github.com/ClickHouse/ClickHouse/issues/16923) Fixes [#15883](https://github.com/ClickHouse/ClickHouse/issues/15883) Fix MaterializeMySQL SYNC failure when the modify MySQL binlog_checksum. [#17091](https://github.com/ClickHouse/ClickHouse/pull/17091) ([Winter Zhang](https://github.com/zhang2014)). +* Fix bug when `ON CLUSTER` queries may hang forever for non-leader ReplicatedMergeTreeTables. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Fixed crash on `CREATE TABLE ... AS some_table` query when `some_table` was created `AS table_function()` Fixes [#16944](https://github.com/ClickHouse/ClickHouse/issues/16944). [#17072](https://github.com/ClickHouse/ClickHouse/pull/17072) ([tavplubix](https://github.com/tavplubix)). +* Bug unfinished implementation for funciton fuzzBits, related issue: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Fix LLVM's libunwind in the case when CFA register is RAX. This is the [bug](https://bugs.llvm.org/show_bug.cgi?id=48186) in [LLVM's libunwind](https://github.com/llvm/llvm-project/tree/master/libunwind). We already have workarounds for this bug. [#17046](https://github.com/ClickHouse/ClickHouse/pull/17046) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Fix `optimize_distributed_group_by_sharding_key` setting (that is disabled by default) for query with OFFSET only. [#16996](https://github.com/ClickHouse/ClickHouse/pull/16996) ([Azat Khuzhin](https://github.com/azat)). +* Fix for Merge tables over Distributed tables with JOIN. [#16993](https://github.com/ClickHouse/ClickHouse/pull/16993) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result in big integers (128, 256 bit) when casting from double. Big integers support is experimental. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). +* Fix possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Blame info was not calculated correctly in `clickhouse-git-import`. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix order by optimization with monotonous functions. Fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fix optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. Fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible error `Illegal type of argument` for queries with `ORDER BY`. Fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix strange code in InterpreterShowAccessQuery. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). +* Prevent clickhouse server crashes when using the function `timeSeriesGroupSum`. The function is removed from newer ClickHouse releases. [#16865](https://github.com/ClickHouse/ClickHouse/pull/16865) ([filimonov](https://github.com/filimonov)). +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when using `any` without any arguments. This is for [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803) . cc @azat. [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* If no memory can be allocated while writing table metadata on disk, broken metadata file can be written. [#16772](https://github.com/ClickHouse/ClickHouse/pull/16772) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix trivial query optimization with partition predicate. [#16767](https://github.com/ClickHouse/ClickHouse/pull/16767) ([Azat Khuzhin](https://github.com/azat)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* Return number of affected rows for INSERT queries via MySQL protocol. Previously ClickHouse used to always return 0, it's fixed. Fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fix remote query failure when using 'if' suffix aggregate function. Fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) Fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). +* Fix inconsistent behavior caused by `select_sequential_consistency` for optimized trivial count query and system.tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). + +#### Improvement + +* Remove empty parts after they were pruned by TTL, mutation, or collapsing merge algorithm. [#16895](https://github.com/ClickHouse/ClickHouse/pull/16895) ([Anton Popov](https://github.com/CurtizJ)). +* Enable compact format of directories for asynchronous sends in Distributed tables: `use_compact_format_in_distributed_parts_names` is set to 1 by default. [#16788](https://github.com/ClickHouse/ClickHouse/pull/16788) ([Azat Khuzhin](https://github.com/azat)). +* Abort multipart upload if no data was written to S3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Mask password in data_path in the system.distribution_queue. [#16727](https://github.com/ClickHouse/ClickHouse/pull/16727) ([Azat Khuzhin](https://github.com/azat)). +* Throw error when use column transformer replaces non existing column. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). +* Turn off parallel parsing when there is no enough memory for all threads to work simultaneously. Also there could be exceptions like "Memory limit exceeded" when somebody will try to insert extremely huge rows (> min_chunk_bytes_for_parallel_parsing), because each piece to parse has to be independent set of strings (one or more). [#16721](https://github.com/ClickHouse/ClickHouse/pull/16721) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Correct grammar in error message in JSONEachRow, JSONCompactEachRow, and RegexpRow input formats. [#17205](https://github.com/ClickHouse/ClickHouse/pull/17205) ([nico piderman](https://github.com/sneako)). +* Set default `host` and `port` parameters for `SOURCE(CLICKHOUSE(...))` to current instance and set default `user` value to `'default'`. [#16997](https://github.com/ClickHouse/ClickHouse/pull/16997) ([vdimir](https://github.com/vdimir)). +* Throw an informative error message when doing `ATTACH/DETACH TABLE `. Before this PR, `detach table ` works but leads to an ill-formed in-memory metadata. [#16885](https://github.com/ClickHouse/ClickHouse/pull/16885) ([Amos Bird](https://github.com/amosbird)). +* Add cutToFirstSignificantSubdomainWithWWW(). [#16845](https://github.com/ClickHouse/ClickHouse/pull/16845) ([Azat Khuzhin](https://github.com/azat)). +* Server refused to startup with exception message if wrong config is given (`metric_log`.`collect_interval_milliseconds` is missing). [#16815](https://github.com/ClickHouse/ClickHouse/pull/16815) ([Ivan](https://github.com/abyss7)). +* Better exception message when configuration for distributed DDL is absent. This fixes [#5075](https://github.com/ClickHouse/ClickHouse/issues/5075). [#16769](https://github.com/ClickHouse/ClickHouse/pull/16769) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Usability improvement: better suggestions in syntax error message when `CODEC` expression is misplaced in `CREATE TABLE` query. This fixes [#12493](https://github.com/ClickHouse/ClickHouse/issues/12493). [#16768](https://github.com/ClickHouse/ClickHouse/pull/16768) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove empty directories for async INSERT at start of Distributed engine. [#16729](https://github.com/ClickHouse/ClickHouse/pull/16729) ([Azat Khuzhin](https://github.com/azat)). +* Workaround for use S3 with nginx server as proxy. Nginx currenty does not accept urls with empty path like `http://domain.com?delete`, but vanilla aws-sdk-cpp produces this kind of urls. This commit uses patched aws-sdk-cpp version, which makes urls with "/" as path in this cases, like `http://domain.com/?delete`. [#16709](https://github.com/ClickHouse/ClickHouse/pull/16709) ([ianton-ru](https://github.com/ianton-ru)). +* Allow `reinterpretAs*` functions to work for integers and floats of the same size. Implements [16640](https://github.com/ClickHouse/ClickHouse/issues/16640). [#16657](https://github.com/ClickHouse/ClickHouse/pull/16657) ([flynn](https://github.com/ucasFL)). +* Now, `` configuration can be changed in `config.xml` and reloaded without server startup. [#16627](https://github.com/ClickHouse/ClickHouse/pull/16627) ([Amos Bird](https://github.com/amosbird)). +* Support SNI in https connections to remote resources. This will allow to connect to Cloudflare servers that require SNI. This fixes [#10055](https://github.com/ClickHouse/ClickHouse/issues/10055). [#16252](https://github.com/ClickHouse/ClickHouse/pull/16252) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make it possible to connect to `clickhouse-server` secure endpoint which requires SNI. This is possible when `clickhouse-server` is hosted behind TLS proxy. [#16938](https://github.com/ClickHouse/ClickHouse/pull/16938) ([filimonov](https://github.com/filimonov)). +* Fix possible stack overflow if a loop of materialized views is created. This closes [#15732](https://github.com/ClickHouse/ClickHouse/issues/15732). [#16048](https://github.com/ClickHouse/ClickHouse/pull/16048) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Simplify the implementation of background tasks processing for the MergeTree table engines family. There should be no visible changes for user. [#15983](https://github.com/ClickHouse/ClickHouse/pull/15983) ([alesapin](https://github.com/alesapin)). +* Improvement for MaterializeMySQL (experimental feature). Throw exception about right sync privileges when MySQL sync user has error privileges. [#15977](https://github.com/ClickHouse/ClickHouse/pull/15977) ([TCeason](https://github.com/TCeason)). +* Made `indexOf()` use BloomFilter. [#14977](https://github.com/ClickHouse/ClickHouse/pull/14977) ([achimbab](https://github.com/achimbab)). + +#### Performance Improvement + +* Use Floyd-Rivest algorithm, it is the best for the ClickHouse use case of partial sorting. Bechmarks are in https://github.com/danlark1/miniselect and [here](https://drive.google.com/drive/folders/1DHEaeXgZuX6AJ9eByeZ8iQVQv0ueP8XM). [#16825](https://github.com/ClickHouse/ClickHouse/pull/16825) ([Danila Kutenin](https://github.com/danlark1)). +* Now `ReplicatedMergeTree` tree engines family uses a separate thread pool for replicated fetches. Size of the pool limited by setting `background_fetches_pool_size` which can be tuned with a server restart. The default value of the setting is 3 and it means that the maximum amount of parallel fetches is equal to 3 (and it allows to utilize 10G network). Fixes #520. [#16390](https://github.com/ClickHouse/ClickHouse/pull/16390) ([alesapin](https://github.com/alesapin)). +* Fixed uncontrolled growth of the state of `quantileTDigest`. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). +* Add `VIEW` subquery description to `EXPLAIN`. Limit push down optimisation for `VIEW`. Add local replicas of `Distributed` to query plan. [#14936](https://github.com/ClickHouse/ClickHouse/pull/14936) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix optimize_read_in_order/optimize_aggregation_in_order with max_threads > 0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Fix performance of reading from `Merge` tables over huge number of `MergeTree` tables. Fixes [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). +* Now we can safely prune partitions with exact match. Useful case: Suppose table is partitioned by `intHash64(x) % 100` and the query has condition on `intHash64(x) % 100` verbatim, not on x. [#16253](https://github.com/ClickHouse/ClickHouse/pull/16253) ([Amos Bird](https://github.com/amosbird)). + +#### Experimental Feature + +* Add `EmbeddedRocksDB` table engine (can be used for dictionaries). [#15073](https://github.com/ClickHouse/ClickHouse/pull/15073) ([sundyli](https://github.com/sundy-li)). + +#### Build/Testing/Packaging Improvement + +* Improvements in test coverage building images. [#17233](https://github.com/ClickHouse/ClickHouse/pull/17233) ([alesapin](https://github.com/alesapin)). +* Update embedded timezone data to version 2020d (also update cctz to the latest master). [#17204](https://github.com/ClickHouse/ClickHouse/pull/17204) ([filimonov](https://github.com/filimonov)). +* Fix UBSan report in Poco. This closes [#12719](https://github.com/ClickHouse/ClickHouse/issues/12719). [#16765](https://github.com/ClickHouse/ClickHouse/pull/16765) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do not instrument 3rd-party libraries with UBSan. [#16764](https://github.com/ClickHouse/ClickHouse/pull/16764) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in cache dictionaries. This closes [#12641](https://github.com/ClickHouse/ClickHouse/issues/12641). [#16763](https://github.com/ClickHouse/ClickHouse/pull/16763) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report when trying to convert infinite floating point number to integer. This closes [#14190](https://github.com/ClickHouse/ClickHouse/issues/14190). [#16677](https://github.com/ClickHouse/ClickHouse/pull/16677) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +## ClickHouse release 20.11 + +### ClickHouse release v20.11.7.16-stable, 2021-03-02 + +#### Improvement + +* Explicitly set uid / gid of clickhouse user & group to the fixed values (101) in clickhouse-server images. [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). + +#### Bug Fix + +* BloomFilter index crash fix. Fixes [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). +* Deadlock was possible if system.text_log is enabled. This fixes [#19874](https://github.com/ClickHouse/ClickHouse/issues/19874). [#19875](https://github.com/ClickHouse/ClickHouse/pull/19875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* In previous versions, unusual arguments for function arrayEnumerateUniq may cause crash or infinite loop. This closes [#19787](https://github.com/ClickHouse/ClickHouse/issues/19787). [#19788](https://github.com/ClickHouse/ClickHouse/pull/19788) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed stack overflow when using accurate comparison of arithmetic type with string type. [#19773](https://github.com/ClickHouse/ClickHouse/pull/19773) ([tavplubix](https://github.com/tavplubix)). +* Fix a segmentation fault in `bitmapAndnot` function. Fixes [#19668](https://github.com/ClickHouse/ClickHouse/issues/19668). [#19713](https://github.com/ClickHouse/ClickHouse/pull/19713) ([Maksim Kita](https://github.com/kitaisreal)). +* Some functions with big integers may cause segfault. Big integers is experimental feature. This closes [#19667](https://github.com/ClickHouse/ClickHouse/issues/19667). [#19672](https://github.com/ClickHouse/ClickHouse/pull/19672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of function `neighbor` for `LowCardinality` argument. Fixes [#10333](https://github.com/ClickHouse/ClickHouse/issues/10333). [#19617](https://github.com/ClickHouse/ClickHouse/pull/19617) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix use-after-free of the CompressedWriteBuffer in Connection after disconnect. [#19599](https://github.com/ClickHouse/ClickHouse/pull/19599) ([Azat Khuzhin](https://github.com/azat)). +* `DROP/DETACH TABLE table ON CLUSTER cluster SYNC` query might hang, it's fixed. Fixes [#19568](https://github.com/ClickHouse/ClickHouse/issues/19568). [#19572](https://github.com/ClickHouse/ClickHouse/pull/19572) ([tavplubix](https://github.com/tavplubix)). +* Query CREATE DICTIONARY id expression fix. [#19571](https://github.com/ClickHouse/ClickHouse/pull/19571) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix SIGSEGV with merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read=0/UINT64_MAX. [#19528](https://github.com/ClickHouse/ClickHouse/pull/19528) ([Azat Khuzhin](https://github.com/azat)). +* Buffer overflow (on memory read) was possible if `addMonth` function was called with specifically crafted arguments. This fixes [#19441](https://github.com/ClickHouse/ClickHouse/issues/19441). This fixes [#19413](https://github.com/ClickHouse/ClickHouse/issues/19413). [#19472](https://github.com/ClickHouse/ClickHouse/pull/19472) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Mark distributed batch as broken in case of empty data block in one of files. [#19449](https://github.com/ClickHouse/ClickHouse/pull/19449) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible buffer overflow in Uber H3 library. See https://github.com/uber/h3/issues/392. This closes [#19219](https://github.com/ClickHouse/ClickHouse/issues/19219). [#19383](https://github.com/ClickHouse/ClickHouse/pull/19383) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix system.parts _state column (LOGICAL_ERROR when querying this column, due to incorrect order). [#19346](https://github.com/ClickHouse/ClickHouse/pull/19346) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `Cannot convert column now64() because it is constant but values of constants are different in source and result`. Continuation of [#7156](https://github.com/ClickHouse/ClickHouse/issues/7156). [#19316](https://github.com/ClickHouse/ClickHouse/pull/19316) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug when concurrent `ALTER` and `DROP` queries may hang while processing ReplicatedMergeTree table. [#19237](https://github.com/ClickHouse/ClickHouse/pull/19237) ([alesapin](https://github.com/alesapin)). +* Fix infinite reading from file in `ORC` format (was introduced in [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580)). Fixes [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix startup bug when clickhouse was not able to read compression codec from `LowCardinality(Nullable(...))` and throws exception `Attempt to read after EOF`. Fixes [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). +* Fixed `There is no checkpoint` error when inserting data through http interface using `Template` or `CustomSeparated` format. Fixes [#19021](https://github.com/ClickHouse/ClickHouse/issues/19021). [#19072](https://github.com/ClickHouse/ClickHouse/pull/19072) ([tavplubix](https://github.com/tavplubix)). +* Restrict `MODIFY TTL` queries for `MergeTree` tables created in old syntax. Previously the query succeeded, but actually it had no effect. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). +* Make sure `groupUniqArray` returns correct type for argument of Enum type. This closes [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible error `Expected single dictionary argument for function` if use function `ignore` with `LowCardinality` argument. Fixes [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inserting of `LowCardinality` column to table with `TinyLog` engine. Fixes [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Disable `optimize_move_functions_out_of_any` because optimization is not always correct. This closes [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). This closes [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed very rare deadlock at shutdown. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when mutation with some escaped text (like `ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1')` serialized incorrectly. Fixes [#18878](https://github.com/ClickHouse/ClickHouse/issues/18878). [#18944](https://github.com/ClickHouse/ClickHouse/pull/18944) ([alesapin](https://github.com/alesapin)). +* Attach partition should reset the mutation. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). +* Fix possible hang at shutdown in clickhouse-local. This fixes [#18891](https://github.com/ClickHouse/ClickHouse/issues/18891). [#18893](https://github.com/ClickHouse/ClickHouse/pull/18893) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix *If combinator with unary function and Nullable types. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). +* Asynchronous distributed INSERTs can be rejected by the server if the setting `network_compression_method` is globally set to non-default value. This fixes [#18741](https://github.com/ClickHouse/ClickHouse/issues/18741). [#18776](https://github.com/ClickHouse/ClickHouse/pull/18776) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Attempt to read after eof` error when trying to `CAST` `NULL` from `Nullable(String)` to `Nullable(Decimal(P, S))`. Now function `CAST` returns `NULL` when it cannot parse decimal from nullable string. Fixes [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). +* Fix Logger with unmatched arg size. [#18717](https://github.com/ClickHouse/ClickHouse/pull/18717) ([sundyli](https://github.com/sundy-li)). +* Add FixedString Data type support. I'll get this exception "Code: 50, e.displayText() = DB::Exception: Unsupported type FixedString(1)" when replicating data from MySQL to ClickHouse. This patch fixes bug [#18450](https://github.com/ClickHouse/ClickHouse/issues/18450) Also fixes [#6556](https://github.com/ClickHouse/ClickHouse/issues/6556). [#18553](https://github.com/ClickHouse/ClickHouse/pull/18553) ([awesomeleo](https://github.com/awesomeleo)). +* Fix possible `Pipeline stuck` error while using `ORDER BY` after subquery with `RIGHT` or `FULL` join. [#18550](https://github.com/ClickHouse/ClickHouse/pull/18550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which may lead to `ALTER` queries hung after corresponding mutation kill. Found by thread fuzzer. [#18518](https://github.com/ClickHouse/ClickHouse/pull/18518) ([alesapin](https://github.com/alesapin)). +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Disable constant folding for subqueries on the analysis stage, when the result cannot be calculated. [#18446](https://github.com/ClickHouse/ClickHouse/pull/18446) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). +* Fix filling table `system.settings_profile_elements`. This PR fixes [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix index analysis of binary functions with constant argument which leads to wrong query results. This fixes [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). +* `SELECT count() FROM table` now can be executed if only one any column can be selected from the `table`. This PR fixes [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). +* `SELECT JOIN` now requires the `SELECT` privilege on each of the joined tables. This PR fixes [#17654](https://github.com/ClickHouse/ClickHouse/issues/17654). [#18232](https://github.com/ClickHouse/ClickHouse/pull/18232) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible incomplete query result while reading from `MergeTree*` in case of read backoff (message ` MergeTreeReadPool: Will lower number of threads` in logs). Was introduced in [#16423](https://github.com/ClickHouse/ClickHouse/issues/16423). Fixes [#18137](https://github.com/ClickHouse/ClickHouse/issues/18137). [#18216](https://github.com/ClickHouse/ClickHouse/pull/18216) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error when query `MODIFY COLUMN ... REMOVE TTL` does not actually remove column TTL. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). +* Fix indeterministic functions with predicate optimizer. This fixes [#17244](https://github.com/ClickHouse/ClickHouse/issues/17244). [#17273](https://github.com/ClickHouse/ClickHouse/pull/17273) ([Winter Zhang](https://github.com/zhang2014)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). + +#### Build/Testing/Packaging Improvement + +* Update timezones info to 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). + + + +### ClickHouse release v20.11.6.6-stable, 2020-12-24 + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual `IPv4/IPv6 stack` and fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes. This possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fixed key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed the issue when query optimization was producing wrong result if query contains `ARRAY JOIN`. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed inconsistent behaviour of `optimize_trivial_count_query` with partition predicate. [#17644](https://github.com/ClickHouse/ClickHouse/pull/17644) ([Azat Khuzhin](https://github.com/azat)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when xxception `fmt::v7::format_error` can be logged in background for MergeTree tables. This fixes [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour when clickhouse-client is used in interactive mode with multiline queries and single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed alter query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fixed bug when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fixed `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed duplicates after `DISTINCT` which were possible because of incorrect optimization. This fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed crash while reading from `JOIN` table with `LowCardinality` types. This fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246) . [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fixed possible wrong index analysis when the types of the index comparison are different. This fixes [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). +* Fixed `ColumnConst` comparison which leads to crash. This fixes [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed bug when `ON CLUSTER` queries may hang forever for non-leader `ReplicatedMergeTreeTables`. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Fixed fuzzer-found bug in funciton `fuzzBits`. This fixes [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result in big integers (128, 256 bit) when casting from double. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fixed possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Blame info was not calculated correctly in `clickhouse-git-import`. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order by optimization with monotonous functions. Fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. This fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fixed possible error `Illegal type of argument` for queries with `ORDER BY`. This fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to WriteBufferFromS3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed crash when using `any` without any arguments. This fixes [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when ClickHouse used to always return 0 insted of a number of affected rows for `INSERT` queries via MySQL protocol. This fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed uncontrolled growth of TDigest. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). +* Fixed remote query failure when using suffix `if` in Aggregate function. This fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed inconsistent behavior caused by `select_sequential_consistency` for optimized trivial count query and system.tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). +* Throw error when use ColumnTransformer replace non exist column. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). + + +### ClickHouse release v20.11.3.3-stable, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.11.2.1, 2020-11-11 + +#### Backward Incompatible Change + +* If some `profile` was specified in `distributed_ddl` config section, then this profile could overwrite settings of `default` profile on server startup. It's fixed, now settings of distributed DDL queries should not affect global server settings. [#16635](https://github.com/ClickHouse/ClickHouse/pull/16635) ([tavplubix](https://github.com/tavplubix)). +* Restrict to use of non-comparable data types (like `AggregateFunction`) in keys (Sorting key, Primary key, Partition key, and so on). [#16601](https://github.com/ClickHouse/ClickHouse/pull/16601) ([alesapin](https://github.com/alesapin)). +* Remove `ANALYZE` and `AST` queries, and make the setting `enable_debug_queries` obsolete since now it is the part of full featured `EXPLAIN` query. [#16536](https://github.com/ClickHouse/ClickHouse/pull/16536) ([Ivan](https://github.com/abyss7)). +* Aggregate functions `boundingRatio`, `rankCorr`, `retention`, `timeSeriesGroupSum`, `timeSeriesGroupRateSum`, `windowFunnel` were erroneously made case-insensitive. Now their names are made case sensitive as designed. Only functions that are specified in SQL standard or made for compatibility with other DBMS or functions similar to those should be case-insensitive. [#16407](https://github.com/ClickHouse/ClickHouse/pull/16407) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `rankCorr` function return nan on insufficient data [#16124](https://github.com/ClickHouse/ClickHouse/issues/16124). [#16135](https://github.com/ClickHouse/ClickHouse/pull/16135) ([hexiaoting](https://github.com/hexiaoting)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Added support of LDAP as a user directory for locally non-existent users. [#12736](https://github.com/ClickHouse/ClickHouse/pull/12736) ([Denis Glazachev](https://github.com/traceon)). +* Add `system.replicated_fetches` table which shows currently running background fetches. [#16428](https://github.com/ClickHouse/ClickHouse/pull/16428) ([alesapin](https://github.com/alesapin)). +* Added setting `date_time_output_format`. [#15845](https://github.com/ClickHouse/ClickHouse/pull/15845) ([Maksim Kita](https://github.com/kitaisreal)). +* Added minimal web UI to ClickHouse. [#16158](https://github.com/ClickHouse/ClickHouse/pull/16158) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allows to read/write Single protobuf message at once (w/o length-delimiters). [#15199](https://github.com/ClickHouse/ClickHouse/pull/15199) ([filimonov](https://github.com/filimonov)). +* Added initial OpenTelemetry support. ClickHouse now accepts OpenTelemetry traceparent headers over Native and HTTP protocols, and passes them downstream in some cases. The trace spans for executed queries are saved into the `system.opentelemetry_span_log` table. [#14195](https://github.com/ClickHouse/ClickHouse/pull/14195) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Allow specify primary key in column list of `CREATE TABLE` query. This is needed for compatibility with other SQL dialects. [#15823](https://github.com/ClickHouse/ClickHouse/pull/15823) ([Maksim Kita](https://github.com/kitaisreal)). +* Implement `OFFSET offset_row_count {ROW | ROWS} FETCH {FIRST | NEXT} fetch_row_count {ROW | ROWS} {ONLY | WITH TIES}` in SELECT query with ORDER BY. This is the SQL-standard way to specify `LIMIT`. [#15855](https://github.com/ClickHouse/ClickHouse/pull/15855) ([hexiaoting](https://github.com/hexiaoting)). +* `errorCodeToName` function - return variable name of the error (useful for analyzing query_log and similar). `system.errors` table - shows how many times errors has been happened (respects `system_events_show_zero_values`). [#16438](https://github.com/ClickHouse/ClickHouse/pull/16438) ([Azat Khuzhin](https://github.com/azat)). +* Added function `untuple` which is a special function which can introduce new columns to the SELECT list by expanding a named tuple. [#16242](https://github.com/ClickHouse/ClickHouse/pull/16242) ([Nikolai Kochetov](https://github.com/KochetovNicolai), [Amos Bird](https://github.com/amosbird)). +* Now we can provide identifiers via query parameters. And these parameters can be used as table objects or columns. [#16594](https://github.com/ClickHouse/ClickHouse/pull/16594) ([Amos Bird](https://github.com/amosbird)). +* Added big integers (UInt256, Int128, Int256) and UUID data types support for MergeTree BloomFilter index. Big integers is an experimental feature. [#16642](https://github.com/ClickHouse/ClickHouse/pull/16642) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `farmFingerprint64` function (non-cryptographic string hashing). [#16570](https://github.com/ClickHouse/ClickHouse/pull/16570) ([Jacob Hayes](https://github.com/JacobHayes)). +* Add `log_queries_min_query_duration_ms`, only queries slower than the value of this setting will go to `query_log`/`query_thread_log` (i.e. something like `slow_query_log` in mysql). [#16529](https://github.com/ClickHouse/ClickHouse/pull/16529) ([Azat Khuzhin](https://github.com/azat)). +* Ability to create a docker image on the top of `Alpine`. Uses precompiled binary and glibc components from ubuntu 20.04. [#16479](https://github.com/ClickHouse/ClickHouse/pull/16479) ([filimonov](https://github.com/filimonov)). +* Added `toUUIDOrNull`, `toUUIDOrZero` cast functions. [#16337](https://github.com/ClickHouse/ClickHouse/pull/16337) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `max_concurrent_queries_for_all_users` setting, see [#6636](https://github.com/ClickHouse/ClickHouse/issues/6636) for use cases. [#16154](https://github.com/ClickHouse/ClickHouse/pull/16154) ([nvartolomei](https://github.com/nvartolomei)). +* Add a new option `print_query_id` to clickhouse-client. It helps generate arbitrary strings with the current query id generated by the client. Also print query id in clickhouse-client by default. [#15809](https://github.com/ClickHouse/ClickHouse/pull/15809) ([Amos Bird](https://github.com/amosbird)). +* Add `tid` and `logTrace` functions. This closes [#9434](https://github.com/ClickHouse/ClickHouse/issues/9434). [#15803](https://github.com/ClickHouse/ClickHouse/pull/15803) ([flynn](https://github.com/ucasFL)). +* Add function `formatReadableTimeDelta` that format time delta to human readable string ... [#15497](https://github.com/ClickHouse/ClickHouse/pull/15497) ([Filipe Caixeta](https://github.com/filipecaixeta)). +* Added `disable_merges` option for volumes in multi-disk configuration. [#13956](https://github.com/ClickHouse/ClickHouse/pull/13956) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Experimental Feature + +* New functions `encrypt`, `aes_encrypt_mysql`, `decrypt`, `aes_decrypt_mysql`. These functions are working slowly, so we consider it as an experimental feature. [#11844](https://github.com/ClickHouse/ClickHouse/pull/11844) ([Vasily Nemkov](https://github.com/Enmk)). + +#### Bug Fix + +* Mask password in data_path in the `system.distribution_queue`. [#16727](https://github.com/ClickHouse/ClickHouse/pull/16727) ([Azat Khuzhin](https://github.com/azat)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* The setting `max_parallel_replicas` worked incorrectly if the queried table has no sampling. This fixes [#5733](https://github.com/ClickHouse/ClickHouse/issues/5733). [#16675](https://github.com/ClickHouse/ClickHouse/pull/16675) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix optimize_read_in_order/optimize_aggregation_in_order with max_threads > 0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Calculation of `DEFAULT` expressions was involving possible name collisions (that was very unlikely to encounter). This fixes [#9359](https://github.com/ClickHouse/ClickHouse/issues/9359). [#16612](https://github.com/ClickHouse/ClickHouse/pull/16612) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `query_thread_log.query_duration_ms` unit. [#16563](https://github.com/ClickHouse/ClickHouse/pull/16563) ([Azat Khuzhin](https://github.com/azat)). +* Fix a bug when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine. `MaterializeMySQL` is an experimental feature. [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Specifically crafted argument of `round` function with `Decimal` was leading to integer division by zero. This fixes [#13338](https://github.com/ClickHouse/ClickHouse/issues/13338). [#16451](https://github.com/ClickHouse/ClickHouse/pull/16451) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the inconsistent behaviour when a part of return data could be dropped because the set for its filtration wasn't created. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix dictGet in sharding_key (and similar places, i.e. when the function context is stored permanently). [#16205](https://github.com/ClickHouse/ClickHouse/pull/16205) ([Azat Khuzhin](https://github.com/azat)). +* Fix the exception thrown in `clickhouse-local` when trying to execute `OPTIMIZE` command. Fixes [#16076](https://github.com/ClickHouse/ClickHouse/issues/16076). [#16192](https://github.com/ClickHouse/ClickHouse/pull/16192) ([filimonov](https://github.com/filimonov)). +* Fixes [#15780](https://github.com/ClickHouse/ClickHouse/issues/15780) regression, e.g. `indexOf([1, 2, 3], toLowCardinality(1))` now is prohibited but it should not be. [#16038](https://github.com/ClickHouse/ClickHouse/pull/16038) ([Mike](https://github.com/myrrc)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). +* Now exception will be thrown when `ALTER MODIFY COLUMN ... DEFAULT ...` has incompatible default with column type. Fixes [#15854](https://github.com/ClickHouse/ClickHouse/issues/15854). [#15858](https://github.com/ClickHouse/ClickHouse/pull/15858) ([alesapin](https://github.com/alesapin)). +* Fixed IPv4CIDRToRange/IPv6CIDRToRange functions to accept const IP-column values. [#15856](https://github.com/ClickHouse/ClickHouse/pull/15856) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). + +#### Improvement + +* Treat `INTERVAL '1 hour'` as equivalent to `INTERVAL 1 HOUR`, to be compatible with Postgres and similar. This fixes [#15637](https://github.com/ClickHouse/ClickHouse/issues/15637). [#15978](https://github.com/ClickHouse/ClickHouse/pull/15978) ([flynn](https://github.com/ucasFL)). +* Enable parsing enum values by their numeric ids for CSV, TSV and JSON input formats. [#15685](https://github.com/ClickHouse/ClickHouse/pull/15685) ([vivarum](https://github.com/vivarum)). +* Better read task scheduling for JBOD architecture and `MergeTree` storage. New setting `read_backoff_min_concurrency` which serves as the lower limit to the number of reading threads. [#16423](https://github.com/ClickHouse/ClickHouse/pull/16423) ([Amos Bird](https://github.com/amosbird)). +* Add missing support for `LowCardinality` in `Avro` format. [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Workaround for use `S3` with nginx server as proxy. Nginx currenty does not accept urls with empty path like `http://domain.com?delete`, but vanilla aws-sdk-cpp produces this kind of urls. This commit uses patched aws-sdk-cpp version, which makes urls with "/" as path in this cases, like `http://domain.com/?delete`. [#16814](https://github.com/ClickHouse/ClickHouse/pull/16814) ([ianton-ru](https://github.com/ianton-ru)). +* Better diagnostics on parse errors in input data. Provide row number on `Cannot read all data` errors. [#16644](https://github.com/ClickHouse/ClickHouse/pull/16644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make the behaviour of `minMap` and `maxMap` more desireable. It will not skip zero values in the result. Fixes [#16087](https://github.com/ClickHouse/ClickHouse/issues/16087). [#16631](https://github.com/ClickHouse/ClickHouse/pull/16631) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Better update of ZooKeeper configuration in runtime. [#16630](https://github.com/ClickHouse/ClickHouse/pull/16630) ([sundyli](https://github.com/sundy-li)). +* Apply SETTINGS clause as early as possible. It allows to modify more settings in the query. This closes [#3178](https://github.com/ClickHouse/ClickHouse/issues/3178). [#16619](https://github.com/ClickHouse/ClickHouse/pull/16619) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now `event_time_microseconds` field stores in Decimal64, not UInt64. [#16617](https://github.com/ClickHouse/ClickHouse/pull/16617) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now paratmeterized functions can be used in `APPLY` column transformer. [#16589](https://github.com/ClickHouse/ClickHouse/pull/16589) ([Amos Bird](https://github.com/amosbird)). +* Improve scheduling of background task which removes data of dropped tables in `Atomic` databases. `Atomic` databases do not create broken symlink to table data directory if table actually has no data directory. [#16584](https://github.com/ClickHouse/ClickHouse/pull/16584) ([tavplubix](https://github.com/tavplubix)). +* Subqueries in `WITH` section (CTE) can reference previous subqueries in `WITH` section by their name. [#16575](https://github.com/ClickHouse/ClickHouse/pull/16575) ([Amos Bird](https://github.com/amosbird)). +* Add current_database into `system.query_thread_log`. [#16558](https://github.com/ClickHouse/ClickHouse/pull/16558) ([Azat Khuzhin](https://github.com/azat)). +* Allow to fetch parts that are already committed or outdated in the current instance into the detached directory. It's useful when migrating tables from another cluster and having N to 1 shards mapping. It's also consistent with the current fetchPartition implementation. [#16538](https://github.com/ClickHouse/ClickHouse/pull/16538) ([Amos Bird](https://github.com/amosbird)). +* Multiple improvements for `RabbitMQ`: Fixed bug for [#16263](https://github.com/ClickHouse/ClickHouse/issues/16263). Also minimized event loop lifetime. Added more efficient queues setup. [#16426](https://github.com/ClickHouse/ClickHouse/pull/16426) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix debug assertion in `quantileDeterministic` function. In previous version it may also transfer up to two times more data over the network. Although no bug existed. This fixes [#15683](https://github.com/ClickHouse/ClickHouse/issues/15683). [#16410](https://github.com/ClickHouse/ClickHouse/pull/16410) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `TablesToDropQueueSize` metric. It's equal to number of dropped tables, that are waiting for background data removal. [#16364](https://github.com/ClickHouse/ClickHouse/pull/16364) ([tavplubix](https://github.com/tavplubix)). +* Better diagnostics when client has dropped connection. In previous versions, `Attempt to read after EOF` and `Broken pipe` exceptions were logged in server. In new version, it's information message `Client has dropped the connection, cancel the query.`. [#16329](https://github.com/ClickHouse/ClickHouse/pull/16329) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add total_rows/total_bytes (from system.tables) support for Set/Join table engines. [#16306](https://github.com/ClickHouse/ClickHouse/pull/16306) ([Azat Khuzhin](https://github.com/azat)). +* Now it's possible to specify `PRIMARY KEY` without `ORDER BY` for MergeTree table engines family. Closes [#15591](https://github.com/ClickHouse/ClickHouse/issues/15591). [#16284](https://github.com/ClickHouse/ClickHouse/pull/16284) ([alesapin](https://github.com/alesapin)). +* If there is no tmp folder in the system (chroot, misconfigutation etc) `clickhouse-local` will create temporary subfolder in the current directory. [#16280](https://github.com/ClickHouse/ClickHouse/pull/16280) ([filimonov](https://github.com/filimonov)). +* Add support for nested data types (like named tuple) as sub-types. Fixes [#15587](https://github.com/ClickHouse/ClickHouse/issues/15587). [#16262](https://github.com/ClickHouse/ClickHouse/pull/16262) ([Ivan](https://github.com/abyss7)). +* Support for `database_atomic_wait_for_drop_and_detach_synchronously`/`NO DELAY`/`SYNC` for `DROP DATABASE`. [#16127](https://github.com/ClickHouse/ClickHouse/pull/16127) ([Azat Khuzhin](https://github.com/azat)). +* Add `allow_nondeterministic_optimize_skip_unused_shards` (to allow non deterministic like `rand()` or `dictGet()` in sharding key). [#16105](https://github.com/ClickHouse/ClickHouse/pull/16105) ([Azat Khuzhin](https://github.com/azat)). +* Fix `memory_profiler_step`/`max_untracked_memory` for queries via HTTP (test included). Fix the issue that adjusting this value globally in xml config does not help either, since those settings are not applied anyway, only default (4MB) value is [used](https://github.com/ClickHouse/ClickHouse/blob/17731245336d8c84f75e4c0894c5797ed7732190/src/Common/ThreadStatus.h#L104). Fix `query_id` for the most root ThreadStatus of the http query (by initializing QueryScope after reading query_id). [#16101](https://github.com/ClickHouse/ClickHouse/pull/16101) ([Azat Khuzhin](https://github.com/azat)). +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Fix rare issue when `clickhouse-client` may abort on exit due to loading of suggestions. This fixes [#16035](https://github.com/ClickHouse/ClickHouse/issues/16035). [#16047](https://github.com/ClickHouse/ClickHouse/pull/16047) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support of `cache` layout for `Redis` dictionaries with complex key. [#15985](https://github.com/ClickHouse/ClickHouse/pull/15985) ([Anton Popov](https://github.com/CurtizJ)). +* Fix query hang (endless loop) in case of misconfiguration (`connections_with_failover_max_tries` set to 0). [#15876](https://github.com/ClickHouse/ClickHouse/pull/15876) ([Azat Khuzhin](https://github.com/azat)). +* Change level of some log messages from information to debug, so information messages will not appear for every query. This closes [#5293](https://github.com/ClickHouse/ClickHouse/issues/5293). [#15816](https://github.com/ClickHouse/ClickHouse/pull/15816) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove `MemoryTrackingInBackground*` metrics to avoid potentially misleading results. This fixes [#15684](https://github.com/ClickHouse/ClickHouse/issues/15684). [#15813](https://github.com/ClickHouse/ClickHouse/pull/15813) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add reconnects to `zookeeper-dump-tree` tool. [#15711](https://github.com/ClickHouse/ClickHouse/pull/15711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow explicitly specify columns list in `CREATE TABLE table AS table_function(...)` query. Fixes [#9249](https://github.com/ClickHouse/ClickHouse/issues/9249) Fixes [#14214](https://github.com/ClickHouse/ClickHouse/issues/14214). [#14295](https://github.com/ClickHouse/ClickHouse/pull/14295) ([tavplubix](https://github.com/tavplubix)). + +#### Performance Improvement + +* Do not merge parts across partitions in SELECT FINAL. [#15938](https://github.com/ClickHouse/ClickHouse/pull/15938) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve performance of `-OrNull` and `-OrDefault` aggregate functions. [#16661](https://github.com/ClickHouse/ClickHouse/pull/16661) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of `quantileMerge`. In previous versions it was obnoxiously slow. This closes [#1463](https://github.com/ClickHouse/ClickHouse/issues/1463). [#16643](https://github.com/ClickHouse/ClickHouse/pull/16643) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of logical functions a little. [#16347](https://github.com/ClickHouse/ClickHouse/pull/16347) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improved performance of merges assignment in MergeTree table engines. Shouldn't be visible for the user. [#16191](https://github.com/ClickHouse/ClickHouse/pull/16191) ([alesapin](https://github.com/alesapin)). +* Speedup hashed/sparse_hashed dictionary loading by preallocating the hash table. [#15454](https://github.com/ClickHouse/ClickHouse/pull/15454) ([Azat Khuzhin](https://github.com/azat)). +* Now trivial count optimization becomes slightly non-trivial. Predicates that contain exact partition expr can be optimized too. This also fixes [#11092](https://github.com/ClickHouse/ClickHouse/issues/11092) which returns wrong count when `max_parallel_replicas > 1`. [#15074](https://github.com/ClickHouse/ClickHouse/pull/15074) ([Amos Bird](https://github.com/amosbird)). + +#### Build/Testing/Packaging Improvement + +* Add flaky check for stateless tests. It will detect potentially flaky functional tests in advance, before they are merged. [#16238](https://github.com/ClickHouse/ClickHouse/pull/16238) ([alesapin](https://github.com/alesapin)). +* Use proper version for `croaring` instead of amalgamation. [#16285](https://github.com/ClickHouse/ClickHouse/pull/16285) ([sundyli](https://github.com/sundy-li)). +* Improve generation of build files for `ya.make` build system (Arcadia). [#16700](https://github.com/ClickHouse/ClickHouse/pull/16700) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add MySQL BinLog file check tool for `MaterializeMySQL` database engine. `MaterializeMySQL` is an experimental feature. [#16223](https://github.com/ClickHouse/ClickHouse/pull/16223) ([Winter Zhang](https://github.com/zhang2014)). +* Check for executable bit on non-executable files. People often accidentially commit executable files from Windows. [#15843](https://github.com/ClickHouse/ClickHouse/pull/15843) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check for `#pragma once` in headers. [#15818](https://github.com/ClickHouse/ClickHouse/pull/15818) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix illegal code style `&vector[idx]` in libhdfs3. This fixes libcxx debug build. See also https://github.com/ClickHouse-Extras/libhdfs3/pull/8 . [#15815](https://github.com/ClickHouse/ClickHouse/pull/15815) ([Amos Bird](https://github.com/amosbird)). +* Fix build of one miscellaneous example tool on Mac OS. Note that we don't build examples on Mac OS in our CI (we build only ClickHouse binary), so there is zero chance it will not break again. This fixes [#15804](https://github.com/ClickHouse/ClickHouse/issues/15804). [#15808](https://github.com/ClickHouse/ClickHouse/pull/15808) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Simplify Sys/V init script. [#14135](https://github.com/ClickHouse/ClickHouse/pull/14135) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added `boost::program_options` to `db_generator` in order to increase its usability. This closes [#15940](https://github.com/ClickHouse/ClickHouse/issues/15940). [#15973](https://github.com/ClickHouse/ClickHouse/pull/15973) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + + +## ClickHouse release 20.10 + +### ClickHouse release v20.10.7.4-stable, 2020-12-24 + +#### Bug Fix + +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual `IPv4/IPv6` stack and fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes. This possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Fix key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Fixed unique key convert crash in `MaterializeMySQL` database engine. This fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) and fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed the issue when some tables not synchronized to ClickHouse from MySQL caused by the fact that convertion MySQL prefix index wasn't supported for MaterializeMySQL. This fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) and fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not restore parts from `WAL` if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when `clickhouse-client` is used in interactive mode with multiline queries and single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `ALTER` query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fixed bug when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fixed `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed crash while reading from `JOIN` table with `LowCardinality` types. This fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246) . [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fixed `ColumnConst` comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed bug when `ON CLUSTER` queries may hang forever for non-leader `ReplicatedMergeTreeTables`. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Fixed fuzzer-found bug in function `fuzzBits`. This fixes [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result in big integers (128, 256 bit) when casting from double. [#16986](https://github.com/ClickHouse/ClickHouse/pull/16986) ([Mike](https://github.com/myrrc)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fixed possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Blame info was not calculated correctly in `clickhouse-git-import`. [#16959](https://github.com/ClickHouse/ClickHouse/pull/16959) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order by optimization with monotonous functions. This fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fixrf optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. This fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fixrf possible error `Illegal type of argument` for queries with `ORDER BY`. This fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to `WriteBufferFromS3`. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed crash when using `any` without any arguments. This fixes [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fixed the behaviour when ClickHouse used to always return 0 insted of a number of affected rows for `INSERT` queries via MySQL protocol. This fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed uncontrolled growth of `TDigest`. [#16680](https://github.com/ClickHouse/ClickHouse/pull/16680) ([hrissan](https://github.com/hrissan)). +* Fixed remote query failure when using suffix `if` in Aggregate function. This fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). + + +### ClickHouse release v20.10.4.1-stable, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* This will fix optimize_read_in_order/optimize_aggregation_in_order with max_threads>0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Now when parsing AVRO from input the LowCardinality is removed from type. Fixes [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Fix rapid growth of metadata when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine, and `slave_parallel_worker` enabled on MySQL Slave, by properly shrinking GTID sets. This fixes [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Improvement + +* Workaround for use S3 with nginx server as proxy. Nginx currenty does not accept urls with empty path like http://domain.com?delete, but vanilla aws-sdk-cpp produces this kind of urls. This commit uses patched aws-sdk-cpp version, which makes urls with "/" as path in this cases, like http://domain.com/?delete. [#16813](https://github.com/ClickHouse/ClickHouse/pull/16813) ([ianton-ru](https://github.com/ianton-ru)). + + +### ClickHouse release v20.10.3.30, 2020-10-28 + +#### Backward Incompatible Change + +* Make `multiple_joins_rewriter_version` obsolete. Remove first version of joins rewriter. [#15472](https://github.com/ClickHouse/ClickHouse/pull/15472) ([Artem Zuikov](https://github.com/4ertus2)). +* Change default value of `format_regexp_escaping_rule` setting (it's related to `Regexp` format) to `Raw` (it means - read whole subpattern as a value) to make the behaviour more like to what users expect. [#15426](https://github.com/ClickHouse/ClickHouse/pull/15426) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for nested multiline comments `/* comment /* comment */ */` in SQL. This conforms to the SQL standard. [#14655](https://github.com/ClickHouse/ClickHouse/pull/14655) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added MergeTree settings (`max_replicated_merges_with_ttl_in_queue` and `max_number_of_merges_with_ttl_in_pool`) to control the number of merges with TTL in the background pool and replicated queue. This change breaks compatibility with older versions only if you use delete TTL. Otherwise, replication will stay compatible. You can avoid incompatibility issues if you update all shard replicas at once or execute `SYSTEM STOP TTL MERGES` until you finish the update of all replicas. If you'll get an incompatible entry in the replication queue, first of all, execute `SYSTEM STOP TTL MERGES` and after `ALTER TABLE ... DETACH PARTITION ...` the partition where incompatible TTL merge was assigned. Attach it back on a single replica. [#14490](https://github.com/ClickHouse/ClickHouse/pull/14490) ([alesapin](https://github.com/alesapin)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Background data recompression. Add the ability to specify `TTL ... RECOMPRESS codec_name` for MergeTree table engines family. [#14494](https://github.com/ClickHouse/ClickHouse/pull/14494) ([alesapin](https://github.com/alesapin)). +* Add parallel quorum inserts. This closes [#15601](https://github.com/ClickHouse/ClickHouse/issues/15601). [#15601](https://github.com/ClickHouse/ClickHouse/pull/15601) ([Latysheva Alexandra](https://github.com/alexelex)). +* Settings for additional enforcement of data durability. Useful for non-replicated setups. [#11948](https://github.com/ClickHouse/ClickHouse/pull/11948) ([Anton Popov](https://github.com/CurtizJ)). +* When duplicate block is written to replica where it does not exist locally (has not been fetched from replicas), don't ignore it and write locally to achieve the same effect as if it was successfully replicated. [#11684](https://github.com/ClickHouse/ClickHouse/pull/11684) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now we support `WITH AS (subquery) ... ` to introduce named subqueries in the query context. This closes [#2416](https://github.com/ClickHouse/ClickHouse/issues/2416). This closes [#4967](https://github.com/ClickHouse/ClickHouse/issues/4967). [#14771](https://github.com/ClickHouse/ClickHouse/pull/14771) ([Amos Bird](https://github.com/amosbird)). +* Introduce `enable_global_with_statement` setting which propagates the first select's `WITH` statements to other select queries at the same level, and makes aliases in `WITH` statements visible to subqueries. [#15451](https://github.com/ClickHouse/ClickHouse/pull/15451) ([Amos Bird](https://github.com/amosbird)). +* Secure inter-cluster query execution (with initial_user as current query user). [#13156](https://github.com/ClickHouse/ClickHouse/pull/13156) ([Azat Khuzhin](https://github.com/azat)). [#15551](https://github.com/ClickHouse/ClickHouse/pull/15551) ([Azat Khuzhin](https://github.com/azat)). +* Add the ability to remove column properties and table TTLs. Introduced queries `ALTER TABLE MODIFY COLUMN col_name REMOVE what_to_remove` and `ALTER TABLE REMOVE TTL`. Both operations are lightweight and executed at the metadata level. [#14742](https://github.com/ClickHouse/ClickHouse/pull/14742) ([alesapin](https://github.com/alesapin)). +* Added format `RawBLOB`. It is intended for input or output a single value without any escaping and delimiters. This closes [#15349](https://github.com/ClickHouse/ClickHouse/issues/15349). [#15364](https://github.com/ClickHouse/ClickHouse/pull/15364) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the `reinterpretAsUUID` function that allows to convert a big-endian byte string to UUID. [#15480](https://github.com/ClickHouse/ClickHouse/pull/15480) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Implement `force_data_skipping_indices` setting. [#15642](https://github.com/ClickHouse/ClickHouse/pull/15642) ([Azat Khuzhin](https://github.com/azat)). +* Add a setting `output_format_pretty_row_numbers` to numerate the result in Pretty formats. This closes [#15350](https://github.com/ClickHouse/ClickHouse/issues/15350). [#15443](https://github.com/ClickHouse/ClickHouse/pull/15443) ([flynn](https://github.com/ucasFL)). +* Added query obfuscation tool. It allows to share more queries for better testing. This closes [#15268](https://github.com/ClickHouse/ClickHouse/issues/15268). [#15321](https://github.com/ClickHouse/ClickHouse/pull/15321) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add table function `null('structure')`. [#14797](https://github.com/ClickHouse/ClickHouse/pull/14797) ([vxider](https://github.com/Vxider)). +* Added `formatReadableQuantity` function. It is useful for reading big numbers by human. [#14725](https://github.com/ClickHouse/ClickHouse/pull/14725) ([Artem Hnilov](https://github.com/BooBSD)). +* Add format `LineAsString` that accepts a sequence of lines separated by newlines, every line is parsed as a whole as a single String field. [#14703](https://github.com/ClickHouse/ClickHouse/pull/14703) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)), [#13846](https://github.com/ClickHouse/ClickHouse/pull/13846) ([hexiaoting](https://github.com/hexiaoting)). +* Add `JSONStrings` format which output data in arrays of strings. [#14333](https://github.com/ClickHouse/ClickHouse/pull/14333) ([hcz](https://github.com/hczhcz)). +* Add support for "Raw" column format for `Regexp` format. It allows to simply extract subpatterns as a whole without any escaping rules. [#15363](https://github.com/ClickHouse/ClickHouse/pull/15363) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow configurable `NULL` representation for `TSV` output format. It is controlled by the setting `output_format_tsv_null_representation` which is `\N` by default. This closes [#9375](https://github.com/ClickHouse/ClickHouse/issues/9375). Note that the setting only controls output format and `\N` is the only supported `NULL` representation for `TSV` input format. [#14586](https://github.com/ClickHouse/ClickHouse/pull/14586) ([Kruglov Pavel](https://github.com/Avogar)). +* Support Decimal data type for `MaterializeMySQL`. `MaterializeMySQL` is an experimental feature. [#14535](https://github.com/ClickHouse/ClickHouse/pull/14535) ([Winter Zhang](https://github.com/zhang2014)). +* Add new feature: `SHOW DATABASES LIKE 'xxx'`. [#14521](https://github.com/ClickHouse/ClickHouse/pull/14521) ([hexiaoting](https://github.com/hexiaoting)). +* Added a script to import (arbitrary) git repository to ClickHouse as a sample dataset. [#14471](https://github.com/ClickHouse/ClickHouse/pull/14471) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now insert statements can have asterisk (or variants) with column transformers in the column list. [#14453](https://github.com/ClickHouse/ClickHouse/pull/14453) ([Amos Bird](https://github.com/amosbird)). +* New query complexity limit settings `max_rows_to_read_leaf`, `max_bytes_to_read_leaf` for distributed queries to limit max rows/bytes read on the leaf nodes. Limit is applied for local reads only, *excluding* the final merge stage on the root node. [#14221](https://github.com/ClickHouse/ClickHouse/pull/14221) ([Roman Khavronenko](https://github.com/hagen1778)). +* Allow user to specify settings for `ReplicatedMergeTree*` storage in `` section of config file. It works similarly to `` section. For `ReplicatedMergeTree*` storages settings from `` and `` are applied together, but settings from `` has higher priority. Added `system.replicated_merge_tree_settings` table. [#13573](https://github.com/ClickHouse/ClickHouse/pull/13573) ([Amos Bird](https://github.com/amosbird)). +* Add `mapPopulateSeries` function. [#13166](https://github.com/ClickHouse/ClickHouse/pull/13166) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Supporting MySQL types: `decimal` (as ClickHouse `Decimal`) and `datetime` with sub-second precision (as `DateTime64`). [#11512](https://github.com/ClickHouse/ClickHouse/pull/11512) ([Vasily Nemkov](https://github.com/Enmk)). +* Introduce `event_time_microseconds` field to `system.text_log`, `system.trace_log`, `system.query_log` and `system.query_thread_log` tables. [#14760](https://github.com/ClickHouse/ClickHouse/pull/14760) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `event_time_microseconds` to `system.asynchronous_metric_log` & `system.metric_log` tables. [#14514](https://github.com/ClickHouse/ClickHouse/pull/14514) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `query_start_time_microseconds` field to `system.query_log` & `system.query_thread_log` tables. [#14252](https://github.com/ClickHouse/ClickHouse/pull/14252) ([Bharat Nallan](https://github.com/bharatnc)). + +#### Bug Fix + +* Fix the case when memory can be overallocated regardless to the limit. This closes [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `executable` dictionary source hang. In previous versions, when using some formats (e.g. `JSONEachRow`) data was not feed to a child process before it outputs at least something. This closes [#1697](https://github.com/ClickHouse/ClickHouse/issues/1697). This closes [#2455](https://github.com/ClickHouse/ClickHouse/issues/2455). [#14525](https://github.com/ClickHouse/ClickHouse/pull/14525) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix double free in case of exception in function `dictGet`. It could have happened if dictionary was loaded with error. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix group by with totals/rollup/cube modifers and min/max functions over group by keys. Fixes [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). +* Fix async Distributed INSERT with prefer_localhost_replica=0 and internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). +* Fix a very wrong code in TwoLevelStringHashTable implementation, which might lead to memory leak. [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). +* Fix segfault in some cases of wrong aggregation in lambdas. [#16082](https://github.com/ClickHouse/ClickHouse/pull/16082) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `ALTER MODIFY ... ORDER BY` query hang for `ReplicatedVersionedCollapsingMergeTree`. This fixes [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). +* `MaterializeMySQL` (experimental feature): Fix collate name & charset name parser and support `length = 0` for string type. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). +* Allow to use `direct` layout for dictionaries with complex keys. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). +* Prevent replica hang for 5-10 mins when replication error happens after a period of inactivity. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). +* Fix rare segfaults when inserting into or selecting from MaterializedView and concurrently dropping target table (for Atomic database engine). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). +* Fix ambiguity in parsing of settings profiles: `CREATE USER ... SETTINGS profile readonly` is now considered as using a profile named `readonly`, not a setting named `profile` with the readonly constraint. This fixes [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). +* `MaterializeMySQL` (experimental feature): Fix crash on create database failure. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `DROP TABLE IF EXISTS` failure with `Table ... does not exist` error when table is concurrently renamed (for Atomic database engine). Fixed rare deadlock when concurrently executing some DDL queries with multiple tables (like `DROP DATABASE` and `RENAME TABLE`) - Fixed `DROP/DETACH DATABASE` failure with `Table ... does not exist` when concurrently executing `DROP/DETACH TABLE`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixes [#12513](https://github.com/ClickHouse/ClickHouse/issues/12513): difference expressions with same alias when query is reanalyzed. [#15886](https://github.com/ClickHouse/ClickHouse/pull/15886) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible very rare deadlocks in RBAC implementation. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix exception `Block structure mismatch` in `SELECT ... ORDER BY DESC` queries which were executed after `ALTER MODIFY COLUMN` query. Fixes [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). +* `MaterializeMySQL` (experimental feature): Fix `select count()` inaccuracy. [#15767](https://github.com/ClickHouse/ClickHouse/pull/15767) ([tavplubix](https://github.com/tavplubix)). +* Fix some cases of queries, in which only virtual columns are selected. Previously `Not found column _nothing in block` exception may be thrown. Fixes [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). +* Fix drop of materialized view with inner table in Atomic database (hangs all subsequent DROP TABLE due to hang of the worker thread, due to recursive DROP TABLE for inner table of MV). [#15743](https://github.com/ClickHouse/ClickHouse/pull/15743) ([Azat Khuzhin](https://github.com/azat)). +* Possibility to move part to another disk/volume if the first attempt was failed. [#15723](https://github.com/ClickHouse/ClickHouse/pull/15723) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix error `Cannot find column` which may happen at insertion into `MATERIALIZED VIEW` in case if query for `MV` containes `ARRAY JOIN`. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed too low default value of `max_replicated_logs_to_keep` setting, which might cause replicas to become lost too often. Improve lost replica recovery process by choosing the most up-to-date replica to clone. Also do not remove old parts from lost replica, detach them instead. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). +* Fix rare race condition in dictionaries and tables from MySQL. [#15686](https://github.com/ClickHouse/ClickHouse/pull/15686) ([alesapin](https://github.com/alesapin)). +* Fix (benign) race condition in AMQP-CPP. [#15667](https://github.com/ClickHouse/ClickHouse/pull/15667) ([alesapin](https://github.com/alesapin)). +* Fix error `Cannot add simple transform to empty Pipe` which happened while reading from `Buffer` table which has different structure than destination table. It was possible if destination table returned empty result for query. Fixes [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Proper error handling during insert into MergeTree with S3. MergeTree over S3 is an experimental feature. [#15657](https://github.com/ClickHouse/ClickHouse/pull/15657) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed bug with S3 table function: region from URL was not applied to S3 client configuration. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix the order of destruction for resources in `ReadFromStorage` step of query plan. It might cause crashes in rare cases. Possibly connected with [#15610](https://github.com/ClickHouse/ClickHouse/issues/15610). [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Subtract `ReadonlyReplica` metric when detach readonly tables. [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). +* Fixed `Element ... is not a constant expression` error when using `JSON*` function result in `VALUES`, `LIMIT` or right side of `IN` operator. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). +* Query will finish faster in case of exception. Cancel execution on remote replicas if exception happens. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). +* Prevent the possibility of error message `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call`. This fixes [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `Database does not exist.` in queries with IN and Distributed table when there's no database on initiator. [#15538](https://github.com/ClickHouse/ClickHouse/pull/15538) ([Artem Zuikov](https://github.com/4ertus2)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ILIKE` operator stops being case insensitive if `LIKE` with the same pattern was executed. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). +* Fix `Missing columns` errors when selecting columns which absent in data, but depend on other columns which also absent in data. Fixes [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). +* Throw an error when a single parameter is passed to ReplicatedMergeTree instead of ignoring it. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). +* Fix bug with event subscription in DDLWorker which rarely may lead to query hangs in `ON CLUSTER`. Introduced in [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). +* Report proper error when the second argument of `boundingRatio` aggregate function has a wrong type. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). +* Fixes [#15365](https://github.com/ClickHouse/ClickHouse/issues/15365): attach a database with MySQL engine throws exception (no query context). [#15384](https://github.com/ClickHouse/ClickHouse/pull/15384) ([Winter Zhang](https://github.com/zhang2014)). +* Fix the case of multiple occurrences of column transformers in a select query. [#15378](https://github.com/ClickHouse/ClickHouse/pull/15378) ([Amos Bird](https://github.com/amosbird)). +* Fixed compression in `S3` storage. [#15376](https://github.com/ClickHouse/ClickHouse/pull/15376) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix bug where queries like `SELECT toStartOfDay(today())` fail complaining about empty time_zone argument. [#15319](https://github.com/ClickHouse/ClickHouse/pull/15319) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix race condition during MergeTree table rename and background cleanup. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). +* Fix rare race condition on server startup when system logs are enabled. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). +* Fix hang of queries with a lot of subqueries to same table of `MySQL` engine. Previously, if there were more than 16 subqueries to same `MySQL` table in query, it hang forever. [#15299](https://github.com/ClickHouse/ClickHouse/pull/15299) ([Anton Popov](https://github.com/CurtizJ)). +* Fix MSan report in QueryLog. Uninitialized memory can be used for the field `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix 'Unknown identifier' in GROUP BY when query has JOIN over Merge table. [#15242](https://github.com/ClickHouse/ClickHouse/pull/15242) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix instance crash when using `joinGet` with `LowCardinality` types. This fixes [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). +* Fix bug in table engine `Buffer` which does not allow to insert data of new structure into `Buffer` after `ALTER` query. Fixes [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). +* Adjust Decimal field size in MySQL column definition packet. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). +* Fixes `Data compressed with different methods` in `join_algorithm='auto'`. Keep LowCardinality as type for left table join key in `join_algorithm='partial_merge'`. [#15088](https://github.com/ClickHouse/ClickHouse/pull/15088) ([Artem Zuikov](https://github.com/4ertus2)). +* Update `jemalloc` to fix `percpu_arena` with affinity mask. [#15035](https://github.com/ClickHouse/ClickHouse/pull/15035) ([Azat Khuzhin](https://github.com/azat)). [#14957](https://github.com/ClickHouse/ClickHouse/pull/14957) ([Azat Khuzhin](https://github.com/azat)). +* We already use padded comparison between String and FixedString (https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionsComparison.h#L333). This PR applies the same logic to field comparison which corrects the usage of FixedString as primary keys. This fixes [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). +* If function `bar` was called with specifically crafted arguments, buffer overflow was possible. This closes [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Cannot rename ... errno: 22, strerror: Invalid argument` error on DDL query execution in Atomic database when running clickhouse-server in Docker on Mac OS. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). +* Fix crash in RIGHT or FULL JOIN with join_algorith='auto' when memory limit exceeded and we should change HashJoin with MergeJoin. [#15002](https://github.com/ClickHouse/ClickHouse/pull/15002) ([Artem Zuikov](https://github.com/4ertus2)). +* Now settings `number_of_free_entries_in_pool_to_execute_mutation` and `number_of_free_entries_in_pool_to_lower_max_size_of_merge` can be equal to `background_pool_size`. [#14975](https://github.com/ClickHouse/ClickHouse/pull/14975) ([alesapin](https://github.com/alesapin)). +* Fix to make predicate push down work when subquery contains `finalizeAggregation` function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Publish CPU frequencies per logical core in `system.asynchronous_metrics`. This fixes [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* `MaterializeMySQL` (experimental feature): Fixed `.metadata.tmp File exists` error. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). +* Fix the issue when some invocations of `extractAllGroups` function may trigger "Memory limit exceeded" error. This fixes [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix SIGSEGV for an attempt to INSERT into StorageFile with file descriptor. [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). +* Fixed segfault in `cache` dictionary [#14837](https://github.com/ClickHouse/ClickHouse/issues/14837). [#14879](https://github.com/ClickHouse/ClickHouse/pull/14879) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* `MaterializeMySQL` (experimental feature): Fixed bug in parsing MySQL binlog events, which causes `Attempt to read after eof` and `Packet payload is not fully read` in `MaterializeMySQL` database engine. [#14852](https://github.com/ClickHouse/ClickHouse/pull/14852) ([Winter Zhang](https://github.com/zhang2014)). +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix wrong monotonicity detection for shrunk `Int -> Int` cast of signed types. It might lead to incorrect query result. This bug is unveiled in [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513). [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). +* `Replace` column transformer should replace identifiers with cloned ASTs. This fixes [#14695](https://github.com/ClickHouse/ClickHouse/issues/14695) . [#14734](https://github.com/ClickHouse/ClickHouse/pull/14734) ([Amos Bird](https://github.com/amosbird)). +* Fixed missed default database name in metadata of materialized view when executing `ALTER ... MODIFY QUERY`. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ALTER UPDATE` mutation with `Nullable` column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix function `has` with `LowCardinality` of `Nullable`. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([Mike](https://github.com/myrrc)). +* Cleanup data directory after Zookeeper exceptions during CreateQuery for StorageReplicatedMergeTree Engine. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix rare segfaults in functions with combinator `-Resample`, which could appear in result of overflow with very large parameters. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). +* Fix a bug when converting `Nullable(String)` to Enum. Introduced by [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745). This fixes [#14435](https://github.com/ClickHouse/ClickHouse/issues/14435). [#14530](https://github.com/ClickHouse/ClickHouse/pull/14530) ([Amos Bird](https://github.com/amosbird)). +* Fixed the incorrect sorting order of `Nullable` column. This fixes [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `currentDatabase()` function cannot be used in `ON CLUSTER` ddl query. [#14211](https://github.com/ClickHouse/ClickHouse/pull/14211) ([Winter Zhang](https://github.com/zhang2014)). +* `MaterializeMySQL` (experimental feature): Fixed `Packet payload is not fully read` error in `MaterializeMySQL` database engine. [#14696](https://github.com/ClickHouse/ClickHouse/pull/14696) ([BohuTANG](https://github.com/BohuTANG)). + +#### Improvement + +* Enable `Atomic` database engine by default for newly created databases. [#15003](https://github.com/ClickHouse/ClickHouse/pull/15003) ([tavplubix](https://github.com/tavplubix)). +* Add the ability to specify specialized codecs like `Delta`, `T64`, etc. for columns with subtypes. Implements [#12551](https://github.com/ClickHouse/ClickHouse/issues/12551), fixes [#11397](https://github.com/ClickHouse/ClickHouse/issues/11397), fixes [#4609](https://github.com/ClickHouse/ClickHouse/issues/4609). [#15089](https://github.com/ClickHouse/ClickHouse/pull/15089) ([alesapin](https://github.com/alesapin)). +* Dynamic reload of zookeeper config. [#14678](https://github.com/ClickHouse/ClickHouse/pull/14678) ([sundyli](https://github.com/sundy-li)). +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Now `joinGet` supports multi-key lookup. Continuation of [#12418](https://github.com/ClickHouse/ClickHouse/issues/12418). [#13015](https://github.com/ClickHouse/ClickHouse/pull/13015) ([Amos Bird](https://github.com/amosbird)). +* Wait for `DROP/DETACH TABLE` to actually finish if `NO DELAY` or `SYNC` is specified for `Atomic` database. [#15448](https://github.com/ClickHouse/ClickHouse/pull/15448) ([tavplubix](https://github.com/tavplubix)). +* Now it's possible to change the type of version column for `VersionedCollapsingMergeTree` with `ALTER` query. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). +* Unfold `{database}`, `{table}` and `{uuid}` macros in `zookeeper_path` on replicated table creation. Do not allow `RENAME TABLE` if it may break `zookeeper_path` after server restart. Fixes [#6917](https://github.com/ClickHouse/ClickHouse/issues/6917). [#15348](https://github.com/ClickHouse/ClickHouse/pull/15348) ([tavplubix](https://github.com/tavplubix)). +* The function `now` allows an argument with timezone. This closes [15264](https://github.com/ClickHouse/ClickHouse/issues/15264). [#15285](https://github.com/ClickHouse/ClickHouse/pull/15285) ([flynn](https://github.com/ucasFL)). +* Do not allow connections to ClickHouse server until all scripts in `/docker-entrypoint-initdb.d/` are executed. [#15244](https://github.com/ClickHouse/ClickHouse/pull/15244) ([Aleksei Kozharin](https://github.com/alekseik1)). +* Added `optimize` setting to `EXPLAIN PLAN` query. If enabled, query plan level optimisations are applied. Enabled by default. [#15201](https://github.com/ClickHouse/ClickHouse/pull/15201) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Proper exception message for wrong number of arguments of CAST. This closes [#13992](https://github.com/ClickHouse/ClickHouse/issues/13992). [#15029](https://github.com/ClickHouse/ClickHouse/pull/15029) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add option to disable TTL move on data part insert. [#15000](https://github.com/ClickHouse/ClickHouse/pull/15000) ([Pavel Kovalenko](https://github.com/Jokser)). +* Ignore key constraints when doing mutations. Without this pull request, it's not possible to do mutations when `force_index_by_date = 1` or `force_primary_key = 1`. [#14973](https://github.com/ClickHouse/ClickHouse/pull/14973) ([Amos Bird](https://github.com/amosbird)). +* Allow to drop Replicated table if previous drop attempt was failed due to ZooKeeper session expiration. This fixes [#11891](https://github.com/ClickHouse/ClickHouse/issues/11891). [#14926](https://github.com/ClickHouse/ClickHouse/pull/14926) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed excessive settings constraint violation when running SELECT with SETTINGS from a distributed table. [#14876](https://github.com/ClickHouse/ClickHouse/pull/14876) ([Amos Bird](https://github.com/amosbird)). +* Provide a `load_balancing_first_offset` query setting to explicitly state what the first replica is. It's used together with `FIRST_OR_RANDOM` load balancing strategy, which allows to control replicas workload. [#14867](https://github.com/ClickHouse/ClickHouse/pull/14867) ([Amos Bird](https://github.com/amosbird)). +* Show subqueries for `SET` and `JOIN` in `EXPLAIN` result. [#14856](https://github.com/ClickHouse/ClickHouse/pull/14856) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow using multi-volume storage configuration in storage `Distributed`. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). +* Construct `query_start_time` and `query_start_time_microseconds` from the same timespec. [#14831](https://github.com/ClickHouse/ClickHouse/pull/14831) ([Bharat Nallan](https://github.com/bharatnc)). +* Support for disabling persistency for `StorageJoin` and `StorageSet`, this feature is controlled by setting `disable_set_and_join_persistency`. And this PR solved issue [#6318](https://github.com/ClickHouse/ClickHouse/issues/6318). [#14776](https://github.com/ClickHouse/ClickHouse/pull/14776) ([vxider](https://github.com/Vxider)). +* Now `COLUMNS` can be used to wrap over a list of columns and apply column transformers afterwards. [#14775](https://github.com/ClickHouse/ClickHouse/pull/14775) ([Amos Bird](https://github.com/amosbird)). +* Add `merge_algorithm` to `system.merges` table to improve merging inspections. [#14705](https://github.com/ClickHouse/ClickHouse/pull/14705) ([Amos Bird](https://github.com/amosbird)). +* Fix potential memory leak caused by zookeeper exists watch. [#14693](https://github.com/ClickHouse/ClickHouse/pull/14693) ([hustnn](https://github.com/hustnn)). +* Allow parallel execution of distributed DDL. [#14684](https://github.com/ClickHouse/ClickHouse/pull/14684) ([Azat Khuzhin](https://github.com/azat)). +* Add `QueryMemoryLimitExceeded` event counter. This closes [#14589](https://github.com/ClickHouse/ClickHouse/issues/14589). [#14647](https://github.com/ClickHouse/ClickHouse/pull/14647) ([fastio](https://github.com/fastio)). +* Fix some trailing whitespaces in query formatting. [#14595](https://github.com/ClickHouse/ClickHouse/pull/14595) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse treats partition expr and key expr differently. Partition expr is used to construct an minmax index containing related columns, while primary key expr is stored as an expr. Sometimes user might partition a table at coarser levels, such as `partition by i / 1000`. However, binary operators are not monotonic and this PR tries to fix that. It might also benifit other use cases. [#14513](https://github.com/ClickHouse/ClickHouse/pull/14513) ([Amos Bird](https://github.com/amosbird)). +* Add an option to skip access checks for `DiskS3`. `s3` disk is an experimental feature. [#14497](https://github.com/ClickHouse/ClickHouse/pull/14497) ([Pavel Kovalenko](https://github.com/Jokser)). +* Speed up server shutdown process if there are ongoing S3 requests. [#14496](https://github.com/ClickHouse/ClickHouse/pull/14496) ([Pavel Kovalenko](https://github.com/Jokser)). +* `SYSTEM RELOAD CONFIG` now throws an exception if failed to reload and continues using the previous users.xml. The background periodic reloading also continues using the previous users.xml if failed to reload. [#14492](https://github.com/ClickHouse/ClickHouse/pull/14492) ([Vitaly Baranov](https://github.com/vitlibar)). +* For INSERTs with inline data in VALUES format in the script mode of `clickhouse-client`, support semicolon as the data terminator, in addition to the new line. Closes [#12288](https://github.com/ClickHouse/ClickHouse/issues/12288). [#13192](https://github.com/ClickHouse/ClickHouse/pull/13192) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + +#### Performance Improvement + +* Enable compact parts by default for small parts. This will allow to process frequent inserts slightly more efficiently (4..100 times). [#11913](https://github.com/ClickHouse/ClickHouse/pull/11913) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve `quantileTDigest` performance. This fixes [#2668](https://github.com/ClickHouse/ClickHouse/issues/2668). [#15542](https://github.com/ClickHouse/ClickHouse/pull/15542) ([Kruglov Pavel](https://github.com/Avogar)). +* Significantly reduce memory usage in AggregatingInOrderTransform/optimize_aggregation_in_order. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). +* Faster 256-bit multiplication. [#15418](https://github.com/ClickHouse/ClickHouse/pull/15418) ([Artem Zuikov](https://github.com/4ertus2)). +* Improve performance of 256-bit types using (u)int64_t as base type for wide integers. Original wide integers use 8-bit types as base. [#14859](https://github.com/ClickHouse/ClickHouse/pull/14859) ([Artem Zuikov](https://github.com/4ertus2)). +* Explicitly use a temporary disk to store vertical merge temporary data. [#15639](https://github.com/ClickHouse/ClickHouse/pull/15639) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Use one S3 DeleteObjects request instead of multiple DeleteObject in a loop. No any functionality changes, so covered by existing tests like integration/test_log_family_s3. [#15238](https://github.com/ClickHouse/ClickHouse/pull/15238) ([ianton-ru](https://github.com/ianton-ru)). +* Fix `DateTime DateTime` mistakenly choosing the slow generic implementation. This fixes [#15153](https://github.com/ClickHouse/ClickHouse/issues/15153). [#15178](https://github.com/ClickHouse/ClickHouse/pull/15178) ([Amos Bird](https://github.com/amosbird)). +* Improve performance of GROUP BY key of type `FixedString`. [#15034](https://github.com/ClickHouse/ClickHouse/pull/15034) ([Amos Bird](https://github.com/amosbird)). +* Only `mlock` code segment when starting clickhouse-server. In previous versions, all mapped regions were locked in memory, including debug info. Debug info is usually splitted to a separate file but if it isn't, it led to +2..3 GiB memory usage. [#14929](https://github.com/ClickHouse/ClickHouse/pull/14929) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse binary become smaller due to link time optimization. + +#### Build/Testing/Packaging Improvement + +* Now we use clang-11 for production ClickHouse build. [#15239](https://github.com/ClickHouse/ClickHouse/pull/15239) ([alesapin](https://github.com/alesapin)). +* Now we use clang-11 to build ClickHouse in CI. [#14846](https://github.com/ClickHouse/ClickHouse/pull/14846) ([alesapin](https://github.com/alesapin)). +* Switch binary builds (Linux, Darwin, AArch64, FreeDSD) to clang-11. [#15622](https://github.com/ClickHouse/ClickHouse/pull/15622) ([Ilya Yatsishin](https://github.com/qoega)). +* Now all test images use `llvm-symbolizer-11`. [#15069](https://github.com/ClickHouse/ClickHouse/pull/15069) ([alesapin](https://github.com/alesapin)). +* Allow to build with llvm-11. [#15366](https://github.com/ClickHouse/ClickHouse/pull/15366) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Switch from `clang-tidy-10` to `clang-tidy-11`. [#14922](https://github.com/ClickHouse/ClickHouse/pull/14922) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Use LLVM's experimental pass manager by default. [#15608](https://github.com/ClickHouse/ClickHouse/pull/15608) ([Danila Kutenin](https://github.com/danlark1)). +* Don't allow any C++ translation unit to build more than 10 minutes or to use more than 10 GB or memory. This fixes [#14925](https://github.com/ClickHouse/ClickHouse/issues/14925). [#15060](https://github.com/ClickHouse/ClickHouse/pull/15060) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make performance test more stable and representative by splitting test runs and profile runs. [#15027](https://github.com/ClickHouse/ClickHouse/pull/15027) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Attempt to make performance test more reliable. It is done by remapping the executable memory of the process on the fly with `madvise` to use transparent huge pages - it can lower the number of iTLB misses which is the main source of instabilities in performance tests. [#14685](https://github.com/ClickHouse/ClickHouse/pull/14685) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Convert to python3. This closes [#14886](https://github.com/ClickHouse/ClickHouse/issues/14886). [#15007](https://github.com/ClickHouse/ClickHouse/pull/15007) ([Azat Khuzhin](https://github.com/azat)). +* Fail early in functional tests if server failed to respond. This closes [#15262](https://github.com/ClickHouse/ClickHouse/issues/15262). [#15267](https://github.com/ClickHouse/ClickHouse/pull/15267) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to run AArch64 version of clickhouse-server without configs. This facilitates [#15174](https://github.com/ClickHouse/ClickHouse/issues/15174). [#15266](https://github.com/ClickHouse/ClickHouse/pull/15266) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improvements in CI docker images: get rid of ZooKeeper and single script for test configs installation. [#15215](https://github.com/ClickHouse/ClickHouse/pull/15215) ([alesapin](https://github.com/alesapin)). +* Fix CMake options forwarding in fast test script. Fixes error in [#14711](https://github.com/ClickHouse/ClickHouse/issues/14711). [#15155](https://github.com/ClickHouse/ClickHouse/pull/15155) ([alesapin](https://github.com/alesapin)). +* Added a script to perform hardware benchmark in a single command. [#15115](https://github.com/ClickHouse/ClickHouse/pull/15115) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Splitted huge test `test_dictionaries_all_layouts_and_sources` into smaller ones. [#15110](https://github.com/ClickHouse/ClickHouse/pull/15110) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Maybe fix MSan report in base64 (on servers with AVX-512). This fixes [#14006](https://github.com/ClickHouse/ClickHouse/issues/14006). [#15030](https://github.com/ClickHouse/ClickHouse/pull/15030) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reformat and cleanup code in all integration test *.py files. [#14864](https://github.com/ClickHouse/ClickHouse/pull/14864) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix MaterializeMySQL empty transaction unstable test case found in CI. [#14854](https://github.com/ClickHouse/ClickHouse/pull/14854) ([Winter Zhang](https://github.com/zhang2014)). +* Attempt to speed up build a little. [#14808](https://github.com/ClickHouse/ClickHouse/pull/14808) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Speed up build a little by removing unused headers. [#14714](https://github.com/ClickHouse/ClickHouse/pull/14714) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix build failure in OSX. [#14761](https://github.com/ClickHouse/ClickHouse/pull/14761) ([Winter Zhang](https://github.com/zhang2014)). +* Enable ccache by default in cmake if it's found in OS. [#14575](https://github.com/ClickHouse/ClickHouse/pull/14575) ([alesapin](https://github.com/alesapin)). +* Control CI builds configuration from the ClickHouse repository. [#14547](https://github.com/ClickHouse/ClickHouse/pull/14547) ([alesapin](https://github.com/alesapin)). +* In CMake files: - Moved some options' descriptions' parts to comments above. - Replace 0 -> `OFF`, 1 -> `ON` in `option`s default values. - Added some descriptions and links to docs to the options. - Replaced `FUZZER` option (there is another option `ENABLE_FUZZING` which also enables same functionality). - Removed `ENABLE_GTEST_LIBRARY` option as there is `ENABLE_TESTS`. See the full description in PR: [#14711](https://github.com/ClickHouse/ClickHouse/pull/14711) ([Mike](https://github.com/myrrc)). +* Make binary a bit smaller (~50 Mb for debug version). [#14555](https://github.com/ClickHouse/ClickHouse/pull/14555) ([Artem Zuikov](https://github.com/4ertus2)). +* Use std::filesystem::path in ConfigProcessor for concatenating file paths. [#14558](https://github.com/ClickHouse/ClickHouse/pull/14558) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix debug assertion in `bitShiftLeft()` when called with negative big integer. [#14697](https://github.com/ClickHouse/ClickHouse/pull/14697) ([Artem Zuikov](https://github.com/4ertus2)). + + +## ClickHouse release 20.9 + +### ClickHouse release v20.9.7.11-stable, 2020-12-07 + +#### Performance Improvement + +* Fix performance of reading from `Merge` tables over huge number of `MergeTree` tables. Fixes [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). + +#### Bug Fix + +* Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Fixed segfault when there is not enough space when inserting into `Distributed` table. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed `Function not implemented` error when executing `RENAME` query in `Atomic` database with ClickHouse running on Windows Subsystem for Linux. Fixes [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). +* When clickhouse-client is used in interactive mode with multiline queries, single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix alter query hang when the corresponding mutation was killed on the different replica. Fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fix bug when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fix `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fix duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash while reading from `JOIN` table with `LowCardinality` types. Fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246) . [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* Fix ColumnConst comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed crash on `CREATE TABLE ... AS some_table` query when `some_table` was created `AS table_function()` Fixes [#16944](https://github.com/ClickHouse/ClickHouse/issues/16944). [#17072](https://github.com/ClickHouse/ClickHouse/pull/17072) ([tavplubix](https://github.com/tavplubix)). +* Bug fix for funciton fuzzBits, related issue: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* TODO. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). +* Return number of affected rows for INSERT queries via MySQL protocol. Previously ClickHouse used to always return 0, it's fixed. Fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). + +#### Build/Testing/Packaging Improvement + +* Update embedded timezone data to version 2020d (also update cctz to the latest master). [#17204](https://github.com/ClickHouse/ClickHouse/pull/17204) ([filimonov](https://github.com/filimonov)). + + +### ClickHouse release v20.9.6.14-stable, 2020-11-20 + +#### Improvement + +* Make it possible to connect to `clickhouse-server` secure endpoint which requires SNI. This is possible when `clickhouse-server` is hosted behind TLS proxy. [#16938](https://github.com/ClickHouse/ClickHouse/pull/16938) ([filimonov](https://github.com/filimonov)). +* Conditional aggregate functions (for example: `avgIf`, `sumIf`, `maxIf`) should return `NULL` when miss rows and use nullable arguments. [#13964](https://github.com/ClickHouse/ClickHouse/pull/13964) ([Winter Zhang](https://github.com/zhang2014)). + +#### Bug Fix + +* Fix bug when `ON CLUSTER` queries may hang forever for non-leader ReplicatedMergeTreeTables. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fix possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fix possible error `Illegal type of argument` for queries with `ORDER BY`. Fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to WriteBufferFromS3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix crash when using `any` without any arguments. This is for [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803) . cc @azat. [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fix `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* This will fix optimize_read_in_order/optimize_aggregation_in_order with max_threads>0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* fixes [#16574](https://github.com/ClickHouse/ClickHouse/issues/16574) fixes [#16231](https://github.com/ClickHouse/ClickHouse/issues/16231) fix remote query failure when using 'if' suffix aggregate function. [#16610](https://github.com/ClickHouse/ClickHouse/pull/16610) ([Winter Zhang](https://github.com/zhang2014)). +* Query is finished faster in case of exception. Cancel execution on remote replicas if exception happens. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.9.5.5-stable, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now when parsing AVRO from input the LowCardinality is removed from type. Fixes [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Fix rapid growth of metadata when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine, and `slave_parallel_worker` enabled on MySQL Slave, by properly shrinking GTID sets. This fixes [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the inconsistent behaviour when a part of return data could be dropped because the set for its filtration wasn't created. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release v20.9.4.76-stable (2020-10-29) + +#### Bug Fix + +* Fix double free in case of exception in function `dictGet`. It could have happened if dictionary was loaded with error. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix group by with totals/rollup/cube modifers and min/max functions over group by keys. Fixes [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). +* Fix async Distributed INSERT w/ prefer_localhost_replica=0 and internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). +* Fix a very wrong code in TwoLevelStringHashTable implementation, which might lead to memory leak. I'm suprised how this bug can lurk for so long.... [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). +* Fix the case when memory can be overallocated regardless to the limit. This closes [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `ALTER MODIFY ... ORDER BY` query hang for `ReplicatedVersionedCollapsingMergeTree`. This fixes [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). +* Fix collate name & charset name parser and support `length = 0` for string type. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). +* Allow to use direct layout for dictionaries with complex keys. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). +* Prevent replica hang for 5-10 mins when replication error happens after a period of inactivity. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). +* Fix rare segfaults when inserting into or selecting from MaterializedView and concurrently dropping target table (for Atomic database engine). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). +* Fix ambiguity in parsing of settings profiles: `CREATE USER ... SETTINGS profile readonly` is now considered as using a profile named `readonly`, not a setting named `profile` with the readonly constraint. This fixes [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a crash when database creation fails. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `DROP TABLE IF EXISTS` failure with `Table ... does not exist` error when table is concurrently renamed (for Atomic database engine). Fixed rare deadlock when concurrently executing some DDL queries with multiple tables (like `DROP DATABASE` and `RENAME TABLE`) Fixed `DROP/DETACH DATABASE` failure with `Table ... does not exist` when concurrently executing `DROP/DETACH TABLE`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible deadlocks in RBAC. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix exception `Block structure mismatch` in `SELECT ... ORDER BY DESC` queries which were executed after `ALTER MODIFY COLUMN` query. Fixes [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). +* Fix `select count()` inaccuracy for MaterializeMySQL. [#15767](https://github.com/ClickHouse/ClickHouse/pull/15767) ([tavplubix](https://github.com/tavplubix)). +* Fix some cases of queries, in which only virtual columns are selected. Previously `Not found column _nothing in block` exception may be thrown. Fixes [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed too low default value of `max_replicated_logs_to_keep` setting, which might cause replicas to become lost too often. Improve lost replica recovery process by choosing the most up-to-date replica to clone. Also do not remove old parts from lost replica, detach them instead. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot add simple transform to empty Pipe` which happened while reading from `Buffer` table which has different structure than destination table. It was possible if destination table returned empty result for query. Fixes [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug with globs in S3 table function, region from URL was not applied to S3 client configuration. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Decrement the `ReadonlyReplica` metric when detaching read-only tables. This fixes [#15598](https://github.com/ClickHouse/ClickHouse/issues/15598). [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). +* Throw an error when a single parameter is passed to ReplicatedMergeTree instead of ignoring it. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). + +#### Improvement + +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Unfold `{database}`, `{table}` and `{uuid}` macros in `ReplicatedMergeTree` arguments on table creation. [#16160](https://github.com/ClickHouse/ClickHouse/pull/16160) ([tavplubix](https://github.com/tavplubix)). + + +### ClickHouse release v20.9.3.45-stable (2020-10-09) + +#### Bug Fix + +* Fix error `Cannot find column` which may happen at insertion into `MATERIALIZED VIEW` in case if query for `MV` containes `ARRAY JOIN`. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix race condition in AMQP-CPP. [#15667](https://github.com/ClickHouse/ClickHouse/pull/15667) ([alesapin](https://github.com/alesapin)). +* Fix the order of destruction for resources in `ReadFromStorage` step of query plan. It might cause crashes in rare cases. Possibly connected with [#15610](https://github.com/ClickHouse/ClickHouse/issues/15610). [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `Element ... is not a constant expression` error when using `JSON*` function result in `VALUES`, `LIMIT` or right side of `IN` operator. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). +* Prevent the possibility of error message `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call`. This fixes [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Significantly reduce memory usage in AggregatingInOrderTransform/optimize_aggregation_in_order. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ILIKE` operator stops being case insensitive if `LIKE` with the same pattern was executed. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). +* Fix `Missing columns` errors when selecting columns which absent in data, but depend on other columns which also absent in data. Fixes [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). +* Fix bug with event subscription in DDLWorker which rarely may lead to query hangs in `ON CLUSTER`. Introduced in [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). +* Report proper error when the second argument of `boundingRatio` aggregate function has a wrong type. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). +* Fix bug where queries like `SELECT toStartOfDay(today())` fail complaining about empty time_zone argument. [#15319](https://github.com/ClickHouse/ClickHouse/pull/15319) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix race condition during MergeTree table rename and background cleanup. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). +* Fix rare race condition on server startup when system.logs are enabled. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). +* Fix MSan report in QueryLog. Uninitialized memory can be used for the field `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix instance crash when using joinGet with LowCardinality types. This fixes [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). +* Fix bug in table engine `Buffer` which does not allow to insert data of new structure into `Buffer` after `ALTER` query. Fixes [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). +* Adjust decimals field size in mysql column definition packet. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). +* Fixed `Cannot rename ... errno: 22, strerror: Invalid argument` error on DDL query execution in Atomic database when running clickhouse-server in docker on Mac OS. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). +* Fix to make predicate push down work when subquery contains finalizeAggregation function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). + +#### Improvement + +* Now it's possible to change the type of version column for `VersionedCollapsingMergeTree` with `ALTER` query. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.9.2.20, 2020-09-22 + +#### Backward Incompatible Change + +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Added column transformers `EXCEPT`, `REPLACE`, `APPLY`, which can be applied to the list of selected columns (after `*` or `COLUMNS(...)`). For example, you can write `SELECT * EXCEPT(URL) REPLACE(number + 1 AS number)`. Another example: `select * apply(length) apply(max) from wide_string_table` to find out the maxium length of all string columns. [#14233](https://github.com/ClickHouse/ClickHouse/pull/14233) ([Amos Bird](https://github.com/amosbird)). +* Added an aggregate function `rankCorr` which computes a rank correlation coefficient. [#11769](https://github.com/ClickHouse/ClickHouse/pull/11769) ([antikvist](https://github.com/antikvist)) [#14411](https://github.com/ClickHouse/ClickHouse/pull/14411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added table function `view` which turns a subquery into a table object. This helps passing queries around. For instance, it can be used in remote/cluster table functions. [#12567](https://github.com/ClickHouse/ClickHouse/pull/12567) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix + +* Fix bug when `ALTER UPDATE` mutation with Nullable column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed the incorrect sorting order of `Nullable` column. This fixes [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed inconsistent comparison with primary key of type `FixedString` on index analysis if they're compered with a string of less size. This fixes [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). +* Fix bug which leads to wrong merges assignment if table has partitions with a single part. [#14444](https://github.com/ClickHouse/ClickHouse/pull/14444) ([alesapin](https://github.com/alesapin)). +* If function `bar` was called with specifically crafted arguments, buffer overflow was possible. This closes [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Publish CPU frequencies per logical core in `system.asynchronous_metrics`. This fixes [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fixed `.metadata.tmp File exists` error when using `MaterializeMySQL` database engine. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). +* Fix the issue when some invocations of `extractAllGroups` function may trigger "Memory limit exceeded" error. This fixes [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix SIGSEGV for an attempt to INSERT into StorageFile(fd). [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fix wrong monotonicity detection for shrunk `Int -> Int` cast of signed types. It might lead to incorrect query result. This bug is unveiled in [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513). [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). +* Fixed missed default database name in metadata of materialized view when executing `ALTER ... MODIFY QUERY`. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). +* Fix possibly incorrect result of function `has` when LowCardinality and Nullable types are involved. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([Mike](https://github.com/myrrc)). +* Cleanup data directory after Zookeeper exceptions during CREATE query for tables with ReplicatedMergeTree Engine. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix rare segfaults in functions with combinator `-Resample`, which could appear in result of overflow with very large parameters. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). +* Check for array size overflow in `topK` aggregate function. Without this check the user may send a query with carefully crafted parameters that will lead to server crash. This closes [#14452](https://github.com/ClickHouse/ClickHouse/issues/14452). [#14467](https://github.com/ClickHouse/ClickHouse/pull/14467) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Proxy restart/start/stop/reload of SysVinit to systemd (if it is used). [#14460](https://github.com/ClickHouse/ClickHouse/pull/14460) ([Azat Khuzhin](https://github.com/azat)). +* Stop query execution if exception happened in `PipelineExecutor` itself. This could prevent rare possible query hung. [#14334](https://github.com/ClickHouse/ClickHouse/pull/14334) [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash during `ALTER` query for table which was created `AS table_function`. Fixes [#14212](https://github.com/ClickHouse/ClickHouse/issues/14212). [#14326](https://github.com/ClickHouse/ClickHouse/pull/14326) ([alesapin](https://github.com/alesapin)). +* Fix exception during ALTER LIVE VIEW query with REFRESH command. LIVE VIEW is an experimental feature. [#14320](https://github.com/ClickHouse/ClickHouse/pull/14320) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix QueryPlan lifetime (for EXPLAIN PIPELINE graph=1) for queries with nested interpreter. [#14315](https://github.com/ClickHouse/ClickHouse/pull/14315) ([Azat Khuzhin](https://github.com/azat)). +* Better check for tuple size in SSD cache complex key external dictionaries. This fixes [#13981](https://github.com/ClickHouse/ClickHouse/issues/13981). [#14313](https://github.com/ClickHouse/ClickHouse/pull/14313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Disallows `CODEC` on `ALIAS` column type. Fixes [#13911](https://github.com/ClickHouse/ClickHouse/issues/13911). [#14263](https://github.com/ClickHouse/ClickHouse/pull/14263) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix GRANT ALL statement when executed on a non-global level. [#13987](https://github.com/ClickHouse/ClickHouse/pull/13987) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix arrayJoin() capturing in lambda (exception with logical error message was thrown). [#13792](https://github.com/ClickHouse/ClickHouse/pull/13792) ([Azat Khuzhin](https://github.com/azat)). + +#### Experimental Feature + +* Added `db-generator` tool for random database generation by given SELECT queries. It may faciliate reproducing issues when there is only incomplete bug report from the user. [#14442](https://github.com/ClickHouse/ClickHouse/pull/14442) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) [#10973](https://github.com/ClickHouse/ClickHouse/issues/10973) ([ZeDRoman](https://github.com/ZeDRoman)). + +#### Improvement + +* Allow using multi-volume storage configuration in storage Distributed. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). +* Disallow empty time_zone argument in `toStartOf*` type of functions. [#14509](https://github.com/ClickHouse/ClickHouse/pull/14509) ([Bharat Nallan](https://github.com/bharatnc)). +* MySQL handler returns `OK` for queries like `SET @@var = value`. Such statement is ignored. It is needed because some MySQL drivers send `SET @@` query for setup after handshake https://github.com/ClickHouse/ClickHouse/issues/9336#issuecomment-686222422 . [#14469](https://github.com/ClickHouse/ClickHouse/pull/14469) ([BohuTANG](https://github.com/BohuTANG)). +* Now TTLs will be applied during merge if they were not previously materialized. [#14438](https://github.com/ClickHouse/ClickHouse/pull/14438) ([alesapin](https://github.com/alesapin)). +* Now `clickhouse-obfuscator` supports UUID type as proposed in [#13163](https://github.com/ClickHouse/ClickHouse/issues/13163). [#14409](https://github.com/ClickHouse/ClickHouse/pull/14409) ([dimarub2000](https://github.com/dimarub2000)). +* Added new setting `system_events_show_zero_values` as proposed in [#11384](https://github.com/ClickHouse/ClickHouse/issues/11384). [#14404](https://github.com/ClickHouse/ClickHouse/pull/14404) ([dimarub2000](https://github.com/dimarub2000)). +* Implicitly convert primary key to not null in `MaterializeMySQL` (Same as `MySQL`). Fixes [#14114](https://github.com/ClickHouse/ClickHouse/issues/14114). [#14397](https://github.com/ClickHouse/ClickHouse/pull/14397) ([Winter Zhang](https://github.com/zhang2014)). +* Replace wide integers (256 bit) from boost multiprecision with implementation from https://github.com/cerevra/int. 256bit integers are experimental. [#14229](https://github.com/ClickHouse/ClickHouse/pull/14229) ([Artem Zuikov](https://github.com/4ertus2)). +* Add default compression codec for parts in `system.part_log` with the name `default_compression_codec`. [#14116](https://github.com/ClickHouse/ClickHouse/pull/14116) ([alesapin](https://github.com/alesapin)). +* Add precision argument for `DateTime` type. It allows to use `DateTime` name instead of `DateTime64`. [#13761](https://github.com/ClickHouse/ClickHouse/pull/13761) ([Winter Zhang](https://github.com/zhang2014)). +* Added requirepass authorization for `Redis` external dictionary. [#13688](https://github.com/ClickHouse/ClickHouse/pull/13688) ([Ivan Torgashov](https://github.com/it1804)). +* Improvements in `RabbitMQ` engine: added connection and channels failure handling, proper commits, insert failures handling, better exchanges, queue durability and queue resume opportunity, new queue settings. Fixed tests. [#12761](https://github.com/ClickHouse/ClickHouse/pull/12761) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + +#### Performance Improvement + +* Optimize queries with LIMIT/LIMIT BY/ORDER BY for distributed with GROUP BY sharding_key (under `optimize_skip_unused_shards` and `optimize_distributed_group_by_sharding_key`). [#10373](https://github.com/ClickHouse/ClickHouse/pull/10373) ([Azat Khuzhin](https://github.com/azat)). +* Creating sets for multiple `JOIN` and `IN` in parallel. It may slightly improve performance for queries with several different `IN subquery` expressions. [#14412](https://github.com/ClickHouse/ClickHouse/pull/14412) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve Kafka engine performance by providing independent thread for each consumer. Separate thread pool for streaming engines (like Kafka). [#13939](https://github.com/ClickHouse/ClickHouse/pull/13939) ([fastio](https://github.com/fastio)). + +#### Build/Testing/Packaging Improvement + +* Lower binary size in debug build by removing debug info from `Functions`. This is needed only for one internal project in Yandex who is using very old linker. [#14549](https://github.com/ClickHouse/ClickHouse/pull/14549) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Prepare for build with clang 11. [#14455](https://github.com/ClickHouse/ClickHouse/pull/14455) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the logic in backport script. In previous versions it was triggered for any labels of 100% red color. It was strange. [#14433](https://github.com/ClickHouse/ClickHouse/pull/14433) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Integration tests use default base config. All config changes are explicit with main_configs, user_configs and dictionaries parameters for instance. [#13647](https://github.com/ClickHouse/ClickHouse/pull/13647) ([Ilya Yatsishin](https://github.com/qoega)). + + + +## ClickHouse release 20.8 + +### ClickHouse release v20.8.12.2-lts, 2021-01-16 + +#### Bug Fix + +* Fix *If combinator with unary function and Nullable types. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.8.11.17-lts, 2020-12-25 + +#### Bug Fix + +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.8.10.13-lts, 2020-12-24 + +#### Bug Fix + +* When server log rotation was configured using `logger.size` parameter with numeric value larger than 2^32, the logs were not rotated properly. [#17905](https://github.com/ClickHouse/ClickHouse/pull/17905) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fixed incorrect initialization of `max_compress_block_size` in MergeTreeWriterSettings with `min_compress_block_size`. [#17833](https://github.com/ClickHouse/ClickHouse/pull/17833) ([flynn](https://github.com/ucasFL)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed `ALTER` query hang when the corresponding mutation was killed on the different replica. This fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fixed a bug when mark cache size was underestimated by ClickHouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fixed `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `ColumnConst` comparison which leads to crash. This fixed [#17088](https://github.com/ClickHouse/ClickHouse/issues/17088) . [#17135](https://github.com/ClickHouse/ClickHouse/pull/17135) ([Amos Bird](https://github.com/amosbird)). +* Fixed bug when `ON CLUSTER` queries may hang forever for non-leader ReplicatedMergeTreeTables. [#17089](https://github.com/ClickHouse/ClickHouse/pull/17089) ([alesapin](https://github.com/alesapin)). +* Avoid unnecessary network errors for remote queries which may be cancelled while execution, like queries with `LIMIT`. [#17006](https://github.com/ClickHouse/ClickHouse/pull/17006) ([Azat Khuzhin](https://github.com/azat)). +* Reresolve the IP of the `format_avro_schema_registry_url` in case of errors. [#16985](https://github.com/ClickHouse/ClickHouse/pull/16985) ([filimonov](https://github.com/filimonov)). +* Fixed possible server crash after `ALTER TABLE ... MODIFY COLUMN ... NewType` when `SELECT` have `WHERE` expression on altering column and alter does not finished yet. [#16968](https://github.com/ClickHouse/ClickHouse/pull/16968) ([Amos Bird](https://github.com/amosbird)). +* Install script should always create subdirs in config folders. This is only relevant for Docker build with custom config. [#16936](https://github.com/ClickHouse/ClickHouse/pull/16936) ([filimonov](https://github.com/filimonov)). +* Fixed possible error `Illegal type of argument` for queries with `ORDER BY`. Fixes [#16580](https://github.com/ClickHouse/ClickHouse/issues/16580). [#16928](https://github.com/ClickHouse/ClickHouse/pull/16928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Abort multipart upload if no data was written to WriteBufferFromS3. [#16840](https://github.com/ClickHouse/ClickHouse/pull/16840) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed crash when using `any` without any arguments. This fixes [#16803](https://github.com/ClickHouse/ClickHouse/issues/16803). [#16826](https://github.com/ClickHouse/ClickHouse/pull/16826) ([Amos Bird](https://github.com/amosbird)). +* Fixed `IN` operator over several columns and tuples with enabled `transform_null_in` setting. Fixes [#15310](https://github.com/ClickHouse/ClickHouse/issues/15310). [#16722](https://github.com/ClickHouse/ClickHouse/pull/16722) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed inconsistent behaviour of `optimize_read_in_order/optimize_aggregation_in_order` with max_threads > 0 and expression in ORDER BY. [#16637](https://github.com/ClickHouse/ClickHouse/pull/16637) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue when query optimization was producing wrong result if query contains `ARRAY JOIN`. [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Query is finished faster in case of exception. Cancel execution on remote replicas if exception happens. [#15578](https://github.com/ClickHouse/ClickHouse/pull/15578) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.8.6.6-lts, 2020-11-13 + +#### Bug Fix + +* Fix rare silent crashes when query profiler is on and ClickHouse is installed on OS with glibc version that has (supposedly) broken asynchronous unwind tables for some functions. This fixes [#15301](https://github.com/ClickHouse/ClickHouse/issues/15301). This fixes [#13098](https://github.com/ClickHouse/ClickHouse/issues/13098). [#16846](https://github.com/ClickHouse/ClickHouse/pull/16846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now when parsing AVRO from input the LowCardinality is removed from type. Fixes [#16188](https://github.com/ClickHouse/ClickHouse/issues/16188). [#16521](https://github.com/ClickHouse/ClickHouse/pull/16521) ([Mike](https://github.com/myrrc)). +* Fix rapid growth of metadata when using MySQL Master -> MySQL Slave -> ClickHouse MaterializeMySQL Engine, and `slave_parallel_worker` enabled on MySQL Slave, by properly shrinking GTID sets. This fixes [#15951](https://github.com/ClickHouse/ClickHouse/issues/15951). [#16504](https://github.com/ClickHouse/ClickHouse/pull/16504) ([TCeason](https://github.com/TCeason)). +* Fix DROP TABLE for Distributed (racy with INSERT). [#16409](https://github.com/ClickHouse/ClickHouse/pull/16409) ([Azat Khuzhin](https://github.com/azat)). +* Fix processing of very large entries in replication queue. Very large entries may appear in ALTER queries if table structure is extremely large (near 1 MB). This fixes [#16307](https://github.com/ClickHouse/ClickHouse/issues/16307). [#16332](https://github.com/ClickHouse/ClickHouse/pull/16332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the inconsistent behaviour when a part of return data could be dropped because the set for its filtration wasn't created. [#16308](https://github.com/ClickHouse/ClickHouse/pull/16308) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug with MySQL database. When MySQL server used as database engine is down some queries raise Exception, because they try to get tables from disabled server, while it's unnecessary. For example, query `SELECT ... FROM system.parts` should work only with MergeTree tables and don't touch MySQL database at all. [#16032](https://github.com/ClickHouse/ClickHouse/pull/16032) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release v20.8.5.45-lts, 2020-10-29 + +#### Bug Fix + +* Fix double free in case of exception in function `dictGet`. It could have happened if dictionary was loaded with error. [#16429](https://github.com/ClickHouse/ClickHouse/pull/16429) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix group by with totals/rollup/cube modifers and min/max functions over group by keys. Fixes [#16393](https://github.com/ClickHouse/ClickHouse/issues/16393). [#16397](https://github.com/ClickHouse/ClickHouse/pull/16397) ([Anton Popov](https://github.com/CurtizJ)). +* Fix async Distributed INSERT w/ prefer_localhost_replica=0 and internal_replication. [#16358](https://github.com/ClickHouse/ClickHouse/pull/16358) ([Azat Khuzhin](https://github.com/azat)). +* Fix a possible memory leak during `GROUP BY` with string keys, caused by an error in `TwoLevelStringHashTable` implementation. [#16264](https://github.com/ClickHouse/ClickHouse/pull/16264) ([Amos Bird](https://github.com/amosbird)). +* Fix the case when memory can be overallocated regardless to the limit. This closes [#14560](https://github.com/ClickHouse/ClickHouse/issues/14560). [#16206](https://github.com/ClickHouse/ClickHouse/pull/16206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `ALTER MODIFY ... ORDER BY` query hang for `ReplicatedVersionedCollapsingMergeTree`. This fixes [#15980](https://github.com/ClickHouse/ClickHouse/issues/15980). [#16011](https://github.com/ClickHouse/ClickHouse/pull/16011) ([alesapin](https://github.com/alesapin)). +* Fix collate name & charset name parser and support `length = 0` for string type. [#16008](https://github.com/ClickHouse/ClickHouse/pull/16008) ([Winter Zhang](https://github.com/zhang2014)). +* Allow to use direct layout for dictionaries with complex keys. [#16007](https://github.com/ClickHouse/ClickHouse/pull/16007) ([Anton Popov](https://github.com/CurtizJ)). +* Prevent replica hang for 5-10 mins when replication error happens after a period of inactivity. [#15987](https://github.com/ClickHouse/ClickHouse/pull/15987) ([filimonov](https://github.com/filimonov)). +* Fix rare segfaults when inserting into or selecting from MaterializedView and concurrently dropping target table (for Atomic database engine). [#15984](https://github.com/ClickHouse/ClickHouse/pull/15984) ([tavplubix](https://github.com/tavplubix)). +* Fix ambiguity in parsing of settings profiles: `CREATE USER ... SETTINGS profile readonly` is now considered as using a profile named `readonly`, not a setting named `profile` with the readonly constraint. This fixes [#15628](https://github.com/ClickHouse/ClickHouse/issues/15628). [#15982](https://github.com/ClickHouse/ClickHouse/pull/15982) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a crash when database creation fails. [#15954](https://github.com/ClickHouse/ClickHouse/pull/15954) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `DROP TABLE IF EXISTS` failure with `Table ... does not exist` error when table is concurrently renamed (for Atomic database engine). Fixed rare deadlock when concurrently executing some DDL queries with multiple tables (like `DROP DATABASE` and `RENAME TABLE`) Fixed `DROP/DETACH DATABASE` failure with `Table ... does not exist` when concurrently executing `DROP/DETACH TABLE`. [#15934](https://github.com/ClickHouse/ClickHouse/pull/15934) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible deadlocks in RBAC. [#15875](https://github.com/ClickHouse/ClickHouse/pull/15875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix exception `Block structure mismatch` in `SELECT ... ORDER BY DESC` queries which were executed after `ALTER MODIFY COLUMN` query. Fixes [#15800](https://github.com/ClickHouse/ClickHouse/issues/15800). [#15852](https://github.com/ClickHouse/ClickHouse/pull/15852) ([alesapin](https://github.com/alesapin)). +* Fix some cases of queries, in which only virtual columns are selected. Previously `Not found column _nothing in block` exception may be thrown. Fixes [#12298](https://github.com/ClickHouse/ClickHouse/issues/12298). [#15756](https://github.com/ClickHouse/ClickHouse/pull/15756) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Cannot find column` which may happen at insertion into `MATERIALIZED VIEW` in case if query for `MV` containes `ARRAY JOIN`. [#15717](https://github.com/ClickHouse/ClickHouse/pull/15717) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed too low default value of `max_replicated_logs_to_keep` setting, which might cause replicas to become lost too often. Improve lost replica recovery process by choosing the most up-to-date replica to clone. Also do not remove old parts from lost replica, detach them instead. [#15701](https://github.com/ClickHouse/ClickHouse/pull/15701) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot add simple transform to empty Pipe` which happened while reading from `Buffer` table which has different structure than destination table. It was possible if destination table returned empty result for query. Fixes [#15529](https://github.com/ClickHouse/ClickHouse/issues/15529). [#15662](https://github.com/ClickHouse/ClickHouse/pull/15662) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug with globs in S3 table function, region from URL was not applied to S3 client configuration. [#15646](https://github.com/ClickHouse/ClickHouse/pull/15646) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Decrement the `ReadonlyReplica` metric when detaching read-only tables. This fixes [#15598](https://github.com/ClickHouse/ClickHouse/issues/15598). [#15592](https://github.com/ClickHouse/ClickHouse/pull/15592) ([sundyli](https://github.com/sundy-li)). +* Throw an error when a single parameter is passed to ReplicatedMergeTree instead of ignoring it. [#15516](https://github.com/ClickHouse/ClickHouse/pull/15516) ([nvartolomei](https://github.com/nvartolomei)). + +#### Improvement + +* Now it's allowed to execute `ALTER ... ON CLUSTER` queries regardless of the `` setting in cluster config. [#16075](https://github.com/ClickHouse/ClickHouse/pull/16075) ([alesapin](https://github.com/alesapin)). +* Unfold `{database}`, `{table}` and `{uuid}` macros in `ReplicatedMergeTree` arguments on table creation. [#16159](https://github.com/ClickHouse/ClickHouse/pull/16159) ([tavplubix](https://github.com/tavplubix)). + + +### ClickHouse release v20.8.4.11-lts, 2020-10-09 + +#### Bug Fix + +* Fix the order of destruction for resources in `ReadFromStorage` step of query plan. It might cause crashes in rare cases. Possibly connected with [#15610](https://github.com/ClickHouse/ClickHouse/issues/15610). [#15645](https://github.com/ClickHouse/ClickHouse/pull/15645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `Element ... is not a constant expression` error when using `JSON*` function result in `VALUES`, `LIMIT` or right side of `IN` operator. [#15589](https://github.com/ClickHouse/ClickHouse/pull/15589) ([tavplubix](https://github.com/tavplubix)). +* Prevent the possibility of error message `Could not calculate available disk space (statvfs), errno: 4, strerror: Interrupted system call`. This fixes [#15541](https://github.com/ClickHouse/ClickHouse/issues/15541). [#15557](https://github.com/ClickHouse/ClickHouse/pull/15557) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Significantly reduce memory usage in AggregatingInOrderTransform/optimize_aggregation_in_order. [#15543](https://github.com/ClickHouse/ClickHouse/pull/15543) ([Azat Khuzhin](https://github.com/azat)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ILIKE` operator stops being case insensitive if `LIKE` with the same pattern was executed. [#15536](https://github.com/ClickHouse/ClickHouse/pull/15536) ([alesapin](https://github.com/alesapin)). +* Fix `Missing columns` errors when selecting columns which absent in data, but depend on other columns which also absent in data. Fixes [#15530](https://github.com/ClickHouse/ClickHouse/issues/15530). [#15532](https://github.com/ClickHouse/ClickHouse/pull/15532) ([alesapin](https://github.com/alesapin)). +* Fix bug with event subscription in DDLWorker which rarely may lead to query hangs in `ON CLUSTER`. Introduced in [#13450](https://github.com/ClickHouse/ClickHouse/issues/13450). [#15477](https://github.com/ClickHouse/ClickHouse/pull/15477) ([alesapin](https://github.com/alesapin)). +* Report proper error when the second argument of `boundingRatio` aggregate function has a wrong type. [#15407](https://github.com/ClickHouse/ClickHouse/pull/15407) ([detailyang](https://github.com/detailyang)). +* Fix race condition during MergeTree table rename and background cleanup. [#15304](https://github.com/ClickHouse/ClickHouse/pull/15304) ([alesapin](https://github.com/alesapin)). +* Fix rare race condition on server startup when system.logs are enabled. [#15300](https://github.com/ClickHouse/ClickHouse/pull/15300) ([alesapin](https://github.com/alesapin)). +* Fix MSan report in QueryLog. Uninitialized memory can be used for the field `memory_usage`. [#15258](https://github.com/ClickHouse/ClickHouse/pull/15258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix instance crash when using joinGet with LowCardinality types. This fixes [#15214](https://github.com/ClickHouse/ClickHouse/issues/15214). [#15220](https://github.com/ClickHouse/ClickHouse/pull/15220) ([Amos Bird](https://github.com/amosbird)). +* Fix bug in table engine `Buffer` which does not allow to insert data of new structure into `Buffer` after `ALTER` query. Fixes [#15117](https://github.com/ClickHouse/ClickHouse/issues/15117). [#15192](https://github.com/ClickHouse/ClickHouse/pull/15192) ([alesapin](https://github.com/alesapin)). +* Adjust decimals field size in mysql column definition packet. [#15152](https://github.com/ClickHouse/ClickHouse/pull/15152) ([maqroll](https://github.com/maqroll)). +* We already use padded comparison between String and FixedString (https://github.com/ClickHouse/ClickHouse/blob/master/src/Functions/FunctionsComparison.h#L333). This PR applies the same logic to field comparison which corrects the usage of FixedString as primary keys. This fixes [#14908](https://github.com/ClickHouse/ClickHouse/issues/14908). [#15033](https://github.com/ClickHouse/ClickHouse/pull/15033) ([Amos Bird](https://github.com/amosbird)). +* If function `bar` was called with specifically crafted arguments, buffer overflow was possible. This closes [#13926](https://github.com/ClickHouse/ClickHouse/issues/13926). [#15028](https://github.com/ClickHouse/ClickHouse/pull/15028) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Cannot rename ... errno: 22, strerror: Invalid argument` error on DDL query execution in Atomic database when running clickhouse-server in docker on Mac OS. [#15024](https://github.com/ClickHouse/ClickHouse/pull/15024) ([tavplubix](https://github.com/tavplubix)). +* Now settings `number_of_free_entries_in_pool_to_execute_mutation` and `number_of_free_entries_in_pool_to_lower_max_size_of_merge` can be equal to `background_pool_size`. [#14975](https://github.com/ClickHouse/ClickHouse/pull/14975) ([alesapin](https://github.com/alesapin)). +* Fix to make predicate push down work when subquery contains finalizeAggregation function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Publish CPU frequencies per logical core in `system.asynchronous_metrics`. This fixes [#14923](https://github.com/ClickHouse/ClickHouse/issues/14923). [#14924](https://github.com/ClickHouse/ClickHouse/pull/14924) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fixed `.metadata.tmp File exists` error when using `MaterializeMySQL` database engine. [#14898](https://github.com/ClickHouse/ClickHouse/pull/14898) ([Winter Zhang](https://github.com/zhang2014)). +* Fix a problem where the server may get stuck on startup while talking to ZooKeeper, if the configuration files have to be fetched from ZK (using the `from_zk` include option). This fixes [#14814](https://github.com/ClickHouse/ClickHouse/issues/14814). [#14843](https://github.com/ClickHouse/ClickHouse/pull/14843) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix wrong monotonicity detection for shrunk `Int -> Int` cast of signed types. It might lead to incorrect query result. This bug is unveiled in [#14513](https://github.com/ClickHouse/ClickHouse/issues/14513). [#14783](https://github.com/ClickHouse/ClickHouse/pull/14783) ([Amos Bird](https://github.com/amosbird)). +* Fixed the incorrect sorting order of `Nullable` column. This fixes [#14344](https://github.com/ClickHouse/ClickHouse/issues/14344). [#14495](https://github.com/ClickHouse/ClickHouse/pull/14495) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Improvement + +* Now it's possible to change the type of version column for `VersionedCollapsingMergeTree` with `ALTER` query. [#15442](https://github.com/ClickHouse/ClickHouse/pull/15442) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.8.3.18-stable, 2020-09-18 + +#### Bug Fix + +* Fix the issue when some invocations of `extractAllGroups` function may trigger "Memory limit exceeded" error. This fixes [#13383](https://github.com/ClickHouse/ClickHouse/issues/13383). [#14889](https://github.com/ClickHouse/ClickHouse/pull/14889) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix SIGSEGV for an attempt to INSERT into StorageFile(fd). [#14887](https://github.com/ClickHouse/ClickHouse/pull/14887) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fixed missed default database name in metadata of materialized view when executing `ALTER ... MODIFY QUERY`. [#14664](https://github.com/ClickHouse/ClickHouse/pull/14664) ([tavplubix](https://github.com/tavplubix)). +* Fix bug when `ALTER UPDATE` mutation with Nullable column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). +* Added the checker as neither calling `lc->isNullable()` nor calling `ls->getDictionaryPtr()->isNullable()` would return the correct result. [#14591](https://github.com/ClickHouse/ClickHouse/pull/14591) ([myrrc](https://github.com/myrrc)). +* Cleanup data directory after Zookeeper exceptions during CreateQuery for StorageReplicatedMergeTree Engine. [#14563](https://github.com/ClickHouse/ClickHouse/pull/14563) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix rare segfaults in functions with combinator -Resample, which could appear in result of overflow with very large parameters. [#14562](https://github.com/ClickHouse/ClickHouse/pull/14562) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvement + +* Speed up server shutdown process if there are ongoing S3 requests. [#14858](https://github.com/ClickHouse/ClickHouse/pull/14858) ([Pavel Kovalenko](https://github.com/Jokser)). +* Allow using multi-volume storage configuration in storage Distributed. [#14839](https://github.com/ClickHouse/ClickHouse/pull/14839) ([Pavel Kovalenko](https://github.com/Jokser)). +* Speed up server shutdown process if there are ongoing S3 requests. [#14496](https://github.com/ClickHouse/ClickHouse/pull/14496) ([Pavel Kovalenko](https://github.com/Jokser)). +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.8.2.3-stable, 2020-09-08 + +#### Backward Incompatible Change + +* Now `OPTIMIZE FINAL` query does not recalculate TTL for parts that were added before TTL was created. Use `ALTER TABLE ... MATERIALIZE TTL` once to calculate them, after that `OPTIMIZE FINAL` will evaluate TTL's properly. This behavior never worked for replicated tables. [#14220](https://github.com/ClickHouse/ClickHouse/pull/14220) ([alesapin](https://github.com/alesapin)). +* Extend `parallel_distributed_insert_select` setting, adding an option to run `INSERT` into local table. The setting changes type from `Bool` to `UInt64`, so the values `false` and `true` are no longer supported. If you have these values in server configuration, the server will not start. Please replace them with `0` and `1`, respectively. [#14060](https://github.com/ClickHouse/ClickHouse/pull/14060) ([Azat Khuzhin](https://github.com/azat)). +* Remove support for the `ODBCDriver` input/output format. This was a deprecated format once used for communication with the ClickHouse ODBC driver, now long superseded by the `ODBCDriver2` format. Resolves [#13629](https://github.com/ClickHouse/ClickHouse/issues/13629). [#13847](https://github.com/ClickHouse/ClickHouse/pull/13847) ([hexiaoting](https://github.com/hexiaoting)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Add the ability to specify `Default` compression codec for columns that correspond to settings specified in `config.xml`. Implements: [#9074](https://github.com/ClickHouse/ClickHouse/issues/9074). [#14049](https://github.com/ClickHouse/ClickHouse/pull/14049) ([alesapin](https://github.com/alesapin)). +* Support Kerberos authentication in Kafka, using `krb5` and `cyrus-sasl` libraries. [#12771](https://github.com/ClickHouse/ClickHouse/pull/12771) ([Ilya Golshtein](https://github.com/ilejn)). +* Add function `normalizeQuery` that replaces literals, sequences of literals and complex aliases with placeholders. Add function `normalizedQueryHash` that returns identical 64bit hash values for similar queries. It helps to analyze query log. This closes [#11271](https://github.com/ClickHouse/ClickHouse/issues/11271). [#13816](https://github.com/ClickHouse/ClickHouse/pull/13816) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `time_zones` table. [#13880](https://github.com/ClickHouse/ClickHouse/pull/13880) ([Bharat Nallan](https://github.com/bharatnc)). +* Add function `defaultValueOfTypeName` that returns the default value for a given type. [#13877](https://github.com/ClickHouse/ClickHouse/pull/13877) ([hcz](https://github.com/hczhcz)). +* Add `countDigits(x)` function that count number of decimal digits in integer or decimal column. Add `isDecimalOverflow(d, [p])` function that checks if the value in Decimal column is out of its (or specified) precision. [#14151](https://github.com/ClickHouse/ClickHouse/pull/14151) ([Artem Zuikov](https://github.com/4ertus2)). +* Add `quantileExactLow` and `quantileExactHigh` implementations with respective aliases for `medianExactLow` and `medianExactHigh`. [#13818](https://github.com/ClickHouse/ClickHouse/pull/13818) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `date_trunc` function that truncates a date/time value to a specified date/time part. [#13888](https://github.com/ClickHouse/ClickHouse/pull/13888) ([Vladimir Golovchenko](https://github.com/vladimir-golovchenko)). +* Add new optional section `` to the main config. [#13425](https://github.com/ClickHouse/ClickHouse/pull/13425) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add `ALTER SAMPLE BY` statement that allows to change table sample clause. [#13280](https://github.com/ClickHouse/ClickHouse/pull/13280) ([Amos Bird](https://github.com/amosbird)). +* Function `position` now supports optional `start_pos` argument. [#13237](https://github.com/ClickHouse/ClickHouse/pull/13237) ([vdimir](https://github.com/vdimir)). + +#### Bug Fix + +* Fix visible data clobbering by progress bar in client in interactive mode. This fixes [#12562](https://github.com/ClickHouse/ClickHouse/issues/12562) and [#13369](https://github.com/ClickHouse/ClickHouse/issues/13369) and [#13584](https://github.com/ClickHouse/ClickHouse/issues/13584) and fixes [#12964](https://github.com/ClickHouse/ClickHouse/issues/12964). [#13691](https://github.com/ClickHouse/ClickHouse/pull/13691) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect sorting order if `LowCardinality` column when sorting by multiple columns. This fixes [#13958](https://github.com/ClickHouse/ClickHouse/issues/13958). [#14223](https://github.com/ClickHouse/ClickHouse/pull/14223) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Check for array size overflow in `topK` aggregate function. Without this check the user may send a query with carefully crafted parameters that will lead to server crash. This closes [#14452](https://github.com/ClickHouse/ClickHouse/issues/14452). [#14467](https://github.com/ClickHouse/ClickHouse/pull/14467) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug which can lead to wrong merges assignment if table has partitions with a single part. [#14444](https://github.com/ClickHouse/ClickHouse/pull/14444) ([alesapin](https://github.com/alesapin)). +* Stop query execution if exception happened in `PipelineExecutor` itself. This could prevent rare possible query hung. Continuation of [#14334](https://github.com/ClickHouse/ClickHouse/issues/14334). [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) [#14334](https://github.com/ClickHouse/ClickHouse/pull/14334) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash during `ALTER` query for table which was created `AS table_function`. Fixes [#14212](https://github.com/ClickHouse/ClickHouse/issues/14212). [#14326](https://github.com/ClickHouse/ClickHouse/pull/14326) ([alesapin](https://github.com/alesapin)). +* Fix exception during ALTER LIVE VIEW query with REFRESH command. Live view is an experimental feature. [#14320](https://github.com/ClickHouse/ClickHouse/pull/14320) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix QueryPlan lifetime (for EXPLAIN PIPELINE graph=1) for queries with nested interpreter. [#14315](https://github.com/ClickHouse/ClickHouse/pull/14315) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault in `clickhouse-odbc-bridge` during schema fetch from some external sources. This PR fixes [#13861](https://github.com/ClickHouse/ClickHouse/issues/13861). [#14267](https://github.com/ClickHouse/ClickHouse/pull/14267) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix crash in mark inclusion search introduced in [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277). [#14225](https://github.com/ClickHouse/ClickHouse/pull/14225) ([Amos Bird](https://github.com/amosbird)). +* Fix creation of tables with named tuples. This fixes [#13027](https://github.com/ClickHouse/ClickHouse/issues/13027). [#14143](https://github.com/ClickHouse/ClickHouse/pull/14143) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix formatting of minimal negative decimal numbers. This fixes [#14111](https://github.com/ClickHouse/ClickHouse/issues/14111). [#14119](https://github.com/ClickHouse/ClickHouse/pull/14119) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix `DistributedFilesToInsert` metric (zeroed when it should not). [#14095](https://github.com/ClickHouse/ClickHouse/pull/14095) ([Azat Khuzhin](https://github.com/azat)). +* Fix `pointInPolygon` with const 2d array as polygon. [#14079](https://github.com/ClickHouse/ClickHouse/pull/14079) ([Alexey Ilyukhov](https://github.com/livace)). +* Fixed wrong mount point in extra info for `Poco::Exception: no space left on device`. [#14050](https://github.com/ClickHouse/ClickHouse/pull/14050) ([tavplubix](https://github.com/tavplubix)). +* Fix GRANT ALL statement when executed on a non-global level. [#13987](https://github.com/ClickHouse/ClickHouse/pull/13987) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix parser to reject create table as table function with engine. [#13940](https://github.com/ClickHouse/ClickHouse/pull/13940) ([hcz](https://github.com/hczhcz)). +* Fix wrong results in select queries with `DISTINCT` keyword and subqueries with UNION ALL in case `optimize_duplicate_order_by_and_distinct` setting is enabled. [#13925](https://github.com/ClickHouse/ClickHouse/pull/13925) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed potential deadlock when renaming `Distributed` table. [#13922](https://github.com/ClickHouse/ClickHouse/pull/13922) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect sorting for `FixedString` columns when sorting by multiple columns. Fixes [#13182](https://github.com/ClickHouse/ClickHouse/issues/13182). [#13887](https://github.com/ClickHouse/ClickHouse/pull/13887) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix potentially imprecise result of `topK`/`topKWeighted` merge (with non-default parameters). [#13817](https://github.com/ClickHouse/ClickHouse/pull/13817) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading from MergeTree table with INDEX of type SET fails when comparing against NULL. This fixes [#13686](https://github.com/ClickHouse/ClickHouse/issues/13686). [#13793](https://github.com/ClickHouse/ClickHouse/pull/13793) ([Amos Bird](https://github.com/amosbird)). +* Fix `arrayJoin` capturing in lambda (LOGICAL_ERROR). [#13792](https://github.com/ClickHouse/ClickHouse/pull/13792) ([Azat Khuzhin](https://github.com/azat)). +* Add step overflow check in function `range`. [#13790](https://github.com/ClickHouse/ClickHouse/pull/13790) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Directory not empty` error when concurrently executing `DROP DATABASE` and `CREATE TABLE`. [#13756](https://github.com/ClickHouse/ClickHouse/pull/13756) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add range check for `h3KRing` function. This fixes [#13633](https://github.com/ClickHouse/ClickHouse/issues/13633). [#13752](https://github.com/ClickHouse/ClickHouse/pull/13752) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix race condition between DETACH and background merges. Parts may revive after detach. This is continuation of [#8602](https://github.com/ClickHouse/ClickHouse/issues/8602) that did not fix the issue but introduced a test that started to fail in very rare cases, demonstrating the issue. [#13746](https://github.com/ClickHouse/ClickHouse/pull/13746) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix logging Settings.Names/Values when log_queries_min_type > QUERY_START. [#13737](https://github.com/ClickHouse/ClickHouse/pull/13737) ([Azat Khuzhin](https://github.com/azat)). +* Fixes `/replicas_status` endpoint response status code when verbose=1. [#13722](https://github.com/ClickHouse/ClickHouse/pull/13722) ([javi santana](https://github.com/javisantana)). +* Fix incorrect message in `clickhouse-server.init` while checking user and group. [#13711](https://github.com/ClickHouse/ClickHouse/pull/13711) ([ylchou](https://github.com/ylchou)). +* Do not optimize any(arrayJoin()) -> arrayJoin() under `optimize_move_functions_out_of_any` setting. [#13681](https://github.com/ClickHouse/ClickHouse/pull/13681) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash in JOIN with StorageMerge and `set enable_optimize_predicate_expression=1`. [#13679](https://github.com/ClickHouse/ClickHouse/pull/13679) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix typo in error message about `The value of 'number_of_free_entries_in_pool_to_lower_max_size_of_merge' setting`. [#13678](https://github.com/ClickHouse/ClickHouse/pull/13678) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Concurrent `ALTER ... REPLACE/MOVE PARTITION ...` queries might cause deadlock. It's fixed. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). +* Fixed the behaviour when sometimes cache-dictionary returned default value instead of present value from source. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix secondary indices corruption in compact parts. Compact parts are experimental feature. [#13538](https://github.com/ClickHouse/ClickHouse/pull/13538) ([Anton Popov](https://github.com/CurtizJ)). +* Fix premature `ON CLUSTER` timeouts for queries that must be executed on a single replica. Fixes [#6704](https://github.com/ClickHouse/ClickHouse/issues/6704), [#7228](https://github.com/ClickHouse/ClickHouse/issues/7228), [#13361](https://github.com/ClickHouse/ClickHouse/issues/13361), [#11884](https://github.com/ClickHouse/ClickHouse/issues/11884). [#13450](https://github.com/ClickHouse/ClickHouse/pull/13450) ([alesapin](https://github.com/alesapin)). +* Fix wrong code in function `netloc`. This fixes [#13335](https://github.com/ClickHouse/ClickHouse/issues/13335). [#13446](https://github.com/ClickHouse/ClickHouse/pull/13446) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible race in `StorageMemory`. [#13416](https://github.com/ClickHouse/ClickHouse/pull/13416) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix missing or excessive headers in `TSV/CSVWithNames` formats in HTTP protocol. This fixes [#12504](https://github.com/ClickHouse/ClickHouse/issues/12504). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing row policies from users.xml when names of databases or tables contain dots. This fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix access to `redis` dictionary after connection was dropped once. It may happen with `cache` and `direct` dictionary layouts. [#13082](https://github.com/ClickHouse/ClickHouse/pull/13082) ([Anton Popov](https://github.com/CurtizJ)). +* Removed wrong auth access check when using ClickHouseDictionarySource to query remote tables. [#12756](https://github.com/ClickHouse/ClickHouse/pull/12756) ([sundyli](https://github.com/sundy-li)). +* Properly distinguish subqueries in some cases for common subexpression elimination. [#8333](https://github.com/ClickHouse/ClickHouse/issues/8333). [#8367](https://github.com/ClickHouse/ClickHouse/pull/8367) ([Amos Bird](https://github.com/amosbird)). + +#### Improvement + +* Disallows `CODEC` on `ALIAS` column type. Fixes [#13911](https://github.com/ClickHouse/ClickHouse/issues/13911). [#14263](https://github.com/ClickHouse/ClickHouse/pull/14263) ([Bharat Nallan](https://github.com/bharatnc)). +* When waiting for a dictionary update to complete, use the timeout specified by `query_wait_timeout_milliseconds` setting instead of a hard-coded value. [#14105](https://github.com/ClickHouse/ClickHouse/pull/14105) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add setting `min_index_granularity_bytes` that protects against accidentally creating a table with very low `index_granularity_bytes` setting. [#14139](https://github.com/ClickHouse/ClickHouse/pull/14139) ([Bharat Nallan](https://github.com/bharatnc)). +* Now it's possible to fetch partitions from clusters that use different ZooKeeper: `ALTER TABLE table_name FETCH PARTITION partition_expr FROM 'zk-name:/path-in-zookeeper'`. It's useful for shipping data to new clusters. [#14155](https://github.com/ClickHouse/ClickHouse/pull/14155) ([Amos Bird](https://github.com/amosbird)). +* Slightly better performance of Memory table if it was constructed from a huge number of very small blocks (that's unlikely). Author of the idea: [Mark Papadakis](https://github.com/markpapadakis). Closes [#14043](https://github.com/ClickHouse/ClickHouse/issues/14043). [#14056](https://github.com/ClickHouse/ClickHouse/pull/14056) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Conditional aggregate functions (for example: `avgIf`, `sumIf`, `maxIf`) should return `NULL` when miss rows and use nullable arguments. [#13964](https://github.com/ClickHouse/ClickHouse/pull/13964) ([Winter Zhang](https://github.com/zhang2014)). +* Increase limit in -Resample combinator to 1M. [#13947](https://github.com/ClickHouse/ClickHouse/pull/13947) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Corrected an error in AvroConfluent format that caused the Kafka table engine to stop processing messages when an abnormally small, malformed, message was received. [#13941](https://github.com/ClickHouse/ClickHouse/pull/13941) ([Gervasio Varela](https://github.com/gervarela)). +* Fix wrong error for long queries. It was possible to get syntax error other than `Max query size exceeded` for correct query. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Better error message for null value of `TabSeparated` format. [#13906](https://github.com/ClickHouse/ClickHouse/pull/13906) ([jiang tao](https://github.com/tomjiang1987)). +* Function `arrayCompact` will compare NaNs bitwise if the type of array elements is Float32/Float64. In previous versions NaNs were always not equal if the type of array elements is Float32/Float64 and were always equal if the type is more complex, like Nullable(Float64). This closes [#13857](https://github.com/ClickHouse/ClickHouse/issues/13857). [#13868](https://github.com/ClickHouse/ClickHouse/pull/13868) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix data race in `lgamma` function. This race was caught only in `tsan`, no side effects a really happened. [#13842](https://github.com/ClickHouse/ClickHouse/pull/13842) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Avoid too slow queries when arrays are manipulated as fields. Throw exception instead. [#13753](https://github.com/ClickHouse/ClickHouse/pull/13753) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added Redis requirepass authorization (for redis dictionary source). [#13688](https://github.com/ClickHouse/ClickHouse/pull/13688) ([Ivan Torgashov](https://github.com/it1804)). +* Add MergeTree Write-Ahead-Log (WAL) dump tool. WAL is an experimental feature. [#13640](https://github.com/ClickHouse/ClickHouse/pull/13640) ([BohuTANG](https://github.com/BohuTANG)). +* In previous versions `lcm` function may produce assertion violation in debug build if called with specifically crafted arguments. This fixes [#13368](https://github.com/ClickHouse/ClickHouse/issues/13368). [#13510](https://github.com/ClickHouse/ClickHouse/pull/13510) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Provide monotonicity for `toDate/toDateTime` functions in more cases. Monotonicity information is used for index analysis (more complex queries will be able to use index). Now the input arguments are saturated more naturally and provides better monotonicity. [#13497](https://github.com/ClickHouse/ClickHouse/pull/13497) ([Amos Bird](https://github.com/amosbird)). +* Support compound identifiers for custom settings. Custom settings is an integration point of ClickHouse codebase with other codebases (no benefits for ClickHouse itself) [#13496](https://github.com/ClickHouse/ClickHouse/pull/13496) ([Vitaly Baranov](https://github.com/vitlibar)). +* Move parts from DiskLocal to DiskS3 in parallel. `DiskS3` is an experimental feature. [#13459](https://github.com/ClickHouse/ClickHouse/pull/13459) ([Pavel Kovalenko](https://github.com/Jokser)). +* Enable mixed granularity parts by default. [#13449](https://github.com/ClickHouse/ClickHouse/pull/13449) ([alesapin](https://github.com/alesapin)). +* Proper remote host checking in S3 redirects (security-related thing). [#13404](https://github.com/ClickHouse/ClickHouse/pull/13404) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add `QueryTimeMicroseconds`, `SelectQueryTimeMicroseconds` and `InsertQueryTimeMicroseconds` to system.events. [#13336](https://github.com/ClickHouse/ClickHouse/pull/13336) ([ianton-ru](https://github.com/ianton-ru)). +* Fix debug assertion when Decimal has too large negative exponent. Fixes [#13188](https://github.com/ClickHouse/ClickHouse/issues/13188). [#13228](https://github.com/ClickHouse/ClickHouse/pull/13228) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added cache layer for DiskS3 (cache to local disk mark and index files). `DiskS3` is an experimental feature. [#13076](https://github.com/ClickHouse/ClickHouse/pull/13076) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix readline so it dumps history to file now. [#13600](https://github.com/ClickHouse/ClickHouse/pull/13600) ([Amos Bird](https://github.com/amosbird)). +* Create `system` database with `Atomic` engine by default (a preparation to enable `Atomic` database engine by default everywhere). [#13680](https://github.com/ClickHouse/ClickHouse/pull/13680) ([tavplubix](https://github.com/tavplubix)). + +#### Performance Improvement + +* Slightly optimize very short queries with `LowCardinality`. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). +* Enable parallel INSERTs for table engines `Null`, `Memory`, `Distributed` and `Buffer` when the setting `max_insert_threads` is set. [#14120](https://github.com/ClickHouse/ClickHouse/pull/14120) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fail fast if `max_rows_to_read` limit is exceeded on parts scan. The motivation behind this change is to skip ranges scan for all selected parts if it is clear that `max_rows_to_read` is already exceeded. The change is quite noticeable for queries over big number of parts. [#13677](https://github.com/ClickHouse/ClickHouse/pull/13677) ([Roman Khavronenko](https://github.com/hagen1778)). +* Slightly improve performance of aggregation by UInt8/UInt16 keys. [#13099](https://github.com/ClickHouse/ClickHouse/pull/13099) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimize `has()`, `indexOf()` and `countEqual()` functions for `Array(LowCardinality(T))` and constant right arguments. [#12550](https://github.com/ClickHouse/ClickHouse/pull/12550) ([myrrc](https://github.com/myrrc)). +* When performing trivial `INSERT SELECT` queries, automatically set `max_threads` to 1 or `max_insert_threads`, and set `max_block_size` to `min_insert_block_size_rows`. Related to [#5907](https://github.com/ClickHouse/ClickHouse/issues/5907). [#12195](https://github.com/ClickHouse/ClickHouse/pull/12195) ([flynn](https://github.com/ucasFL)). + +#### Experimental Feature + +* ClickHouse can work as MySQL replica - it is implemented by `MaterializeMySQL` database engine. Implements [#4006](https://github.com/ClickHouse/ClickHouse/issues/4006). [#10851](https://github.com/ClickHouse/ClickHouse/pull/10851) ([Winter Zhang](https://github.com/zhang2014)). +* Add types `Int128`, `Int256`, `UInt256` and related functions for them. Extend Decimals with Decimal256 (precision up to 76 digits). New types are under the setting `allow_experimental_bigint_types`. It is working extremely slow and bad. The implementation is incomplete. Please don't use this feature. [#13097](https://github.com/ClickHouse/ClickHouse/pull/13097) ([Artem Zuikov](https://github.com/4ertus2)). + +#### Build/Testing/Packaging Improvement + +* Added `clickhouse install` script, that is useful if you only have a single binary. [#13528](https://github.com/ClickHouse/ClickHouse/pull/13528) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to run `clickhouse` binary without configuration. [#13515](https://github.com/ClickHouse/ClickHouse/pull/13515) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable check for typos in code with `codespell`. [#13513](https://github.com/ClickHouse/ClickHouse/pull/13513) [#13511](https://github.com/ClickHouse/ClickHouse/pull/13511) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable Shellcheck in CI as a linter of .sh tests. This closes [#13168](https://github.com/ClickHouse/ClickHouse/issues/13168). [#13530](https://github.com/ClickHouse/ClickHouse/pull/13530) [#13529](https://github.com/ClickHouse/ClickHouse/pull/13529) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add a CMake option to fail configuration instead of auto-reconfiguration, enabled by default. [#13687](https://github.com/ClickHouse/ClickHouse/pull/13687) ([Konstantin](https://github.com/podshumok)). +* Expose version of embedded tzdata via TZDATA_VERSION in system.build_options. [#13648](https://github.com/ClickHouse/ClickHouse/pull/13648) ([filimonov](https://github.com/filimonov)). +* Improve generation of system.time_zones table during build. Closes [#14209](https://github.com/ClickHouse/ClickHouse/issues/14209). [#14215](https://github.com/ClickHouse/ClickHouse/pull/14215) ([filimonov](https://github.com/filimonov)). +* Build ClickHouse with the most fresh tzdata from package repository. [#13623](https://github.com/ClickHouse/ClickHouse/pull/13623) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the ability to write js-style comments in skip_list.json. [#14159](https://github.com/ClickHouse/ClickHouse/pull/14159) ([alesapin](https://github.com/alesapin)). +* Ensure that there is no copy-pasted GPL code. [#13514](https://github.com/ClickHouse/ClickHouse/pull/13514) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Switch tests docker images to use test-base parent. [#14167](https://github.com/ClickHouse/ClickHouse/pull/14167) ([Ilya Yatsishin](https://github.com/qoega)). +* Adding retry logic when bringing up docker-compose cluster; Increasing COMPOSE_HTTP_TIMEOUT. [#14112](https://github.com/ClickHouse/ClickHouse/pull/14112) ([vzakaznikov](https://github.com/vzakaznikov)). +* Enabled `system.text_log` in stress test to find more bugs. [#13855](https://github.com/ClickHouse/ClickHouse/pull/13855) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Testflows LDAP module: adding missing certificates and dhparam.pem for openldap4. [#13780](https://github.com/ClickHouse/ClickHouse/pull/13780) ([vzakaznikov](https://github.com/vzakaznikov)). +* ZooKeeper cannot work reliably in unit tests in CI infrastructure. Using unit tests for ZooKeeper interaction with real ZooKeeper is bad idea from the start (unit tests are not supposed to verify complex distributed systems). We already using integration tests for this purpose and they are better suited. [#13745](https://github.com/ClickHouse/ClickHouse/pull/13745) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added docker image for style check. Added style check that all docker and docker compose files are located in docker directory. [#13724](https://github.com/ClickHouse/ClickHouse/pull/13724) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix cassandra build on Mac OS. [#13708](https://github.com/ClickHouse/ClickHouse/pull/13708) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix link error in shared build. [#13700](https://github.com/ClickHouse/ClickHouse/pull/13700) ([Amos Bird](https://github.com/amosbird)). +* Updating LDAP user authentication suite to check that it works with RBAC. [#13656](https://github.com/ClickHouse/ClickHouse/pull/13656) ([vzakaznikov](https://github.com/vzakaznikov)). +* Removed `-DENABLE_CURL_CLIENT` for `contrib/aws`. [#13628](https://github.com/ClickHouse/ClickHouse/pull/13628) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Increasing health-check timeouts for ClickHouse nodes and adding support to dump docker-compose logs if unhealthy containers found. [#13612](https://github.com/ClickHouse/ClickHouse/pull/13612) ([vzakaznikov](https://github.com/vzakaznikov)). +* Make sure [#10977](https://github.com/ClickHouse/ClickHouse/issues/10977) is invalid. [#13539](https://github.com/ClickHouse/ClickHouse/pull/13539) ([Amos Bird](https://github.com/amosbird)). +* Skip PR's from robot-clickhouse. [#13489](https://github.com/ClickHouse/ClickHouse/pull/13489) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Move Dockerfiles from integration tests to `docker/test` directory. docker_compose files are available in `runner` docker container. Docker images are built in CI and not in integration tests. [#13448](https://github.com/ClickHouse/ClickHouse/pull/13448) ([Ilya Yatsishin](https://github.com/qoega)). + + +## ClickHouse release 20.7 + +### ClickHouse release v20.7.2.30-stable, 2020-08-31 + +#### Backward Incompatible Change + +* Function `modulo` (operator `%`) with at least one floating point number as argument will calculate remainder of division directly on floating point numbers without converting both arguments to integers. It makes behaviour compatible with most of DBMS. This also applicable for Date and DateTime data types. Added alias `mod`. This closes [#7323](https://github.com/ClickHouse/ClickHouse/issues/7323). [#12585](https://github.com/ClickHouse/ClickHouse/pull/12585) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Deprecate special printing of zero Date/DateTime values as `0000-00-00` and `0000-00-00 00:00:00`. [#12442](https://github.com/ClickHouse/ClickHouse/pull/12442) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The function `groupArrayMoving*` was not working for distributed queries. It's result was calculated within incorrect data type (without promotion to the largest type). The function `groupArrayMovingAvg` was returning integer number that was inconsistent with the `avg` function. This fixes [#12568](https://github.com/ClickHouse/ClickHouse/issues/12568). [#12622](https://github.com/ClickHouse/ClickHouse/pull/12622) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add sanity check for MergeTree settings. If the settings are incorrect, the server will refuse to start or to create a table, printing detailed explanation to the user. [#13153](https://github.com/ClickHouse/ClickHouse/pull/13153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Protect from the cases when user may set `background_pool_size` to value lower than `number_of_free_entries_in_pool_to_execute_mutation` or `number_of_free_entries_in_pool_to_lower_max_size_of_merge`. In these cases ALTERs won't work or the maximum size of merge will be too limited. It will throw exception explaining what to do. This closes [#10897](https://github.com/ClickHouse/ClickHouse/issues/10897). [#12728](https://github.com/ClickHouse/ClickHouse/pull/12728) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Polygon dictionary type that provides efficient "reverse geocoding" lookups - to find the region by coordinates in a dictionary of many polygons (world map). It is using carefully optimized algorithm with recursive grids to maintain low CPU and memory usage. [#9278](https://github.com/ClickHouse/ClickHouse/pull/9278) ([achulkov2](https://github.com/achulkov2)). +* Added support of LDAP authentication for preconfigured users ("Simple Bind" method). [#11234](https://github.com/ClickHouse/ClickHouse/pull/11234) ([Denis Glazachev](https://github.com/traceon)). +* Introduce setting `alter_partition_verbose_result` which outputs information about touched parts for some types of `ALTER TABLE ... PARTITION ...` queries (currently `ATTACH` and `FREEZE`). Closes [#8076](https://github.com/ClickHouse/ClickHouse/issues/8076). [#13017](https://github.com/ClickHouse/ClickHouse/pull/13017) ([alesapin](https://github.com/alesapin)). +* Add `bayesAB` function for bayesian-ab-testing. [#12327](https://github.com/ClickHouse/ClickHouse/pull/12327) ([achimbab](https://github.com/achimbab)). +* Added `system.crash_log` table into which stack traces for fatal errors are collected. This table should be empty. [#12316](https://github.com/ClickHouse/ClickHouse/pull/12316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added http headers `X-ClickHouse-Database` and `X-ClickHouse-Format` which may be used to set default database and output format. [#12981](https://github.com/ClickHouse/ClickHouse/pull/12981) ([hcz](https://github.com/hczhcz)). +* Add `minMap` and `maxMap` functions support to `SimpleAggregateFunction`. [#12662](https://github.com/ClickHouse/ClickHouse/pull/12662) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Add setting `allow_non_metadata_alters` which restricts to execute `ALTER` queries which modify data on disk. Disabled be default. Closes [#11547](https://github.com/ClickHouse/ClickHouse/issues/11547). [#12635](https://github.com/ClickHouse/ClickHouse/pull/12635) ([alesapin](https://github.com/alesapin)). +* A function `formatRow` is added to support turning arbitrary expressions into a string via given format. It's useful for manipulating SQL outputs and is quite versatile combined with the `columns` function. [#12574](https://github.com/ClickHouse/ClickHouse/pull/12574) ([Amos Bird](https://github.com/amosbird)). +* Add `FROM_UNIXTIME` function for compatibility with MySQL, related to [12149](https://github.com/ClickHouse/ClickHouse/issues/12149). [#12484](https://github.com/ClickHouse/ClickHouse/pull/12484) ([flynn](https://github.com/ucasFL)). +* Allow Nullable types as keys in MergeTree tables if `allow_nullable_key` table setting is enabled. Closes [#5319](https://github.com/ClickHouse/ClickHouse/issues/5319). [#12433](https://github.com/ClickHouse/ClickHouse/pull/12433) ([Amos Bird](https://github.com/amosbird)). +* Integration with [COS](https://intl.cloud.tencent.com/product/cos). [#12386](https://github.com/ClickHouse/ClickHouse/pull/12386) ([fastio](https://github.com/fastio)). +* Add `mapAdd` and `mapSubtract` functions for adding/subtracting key-mapped values. [#11735](https://github.com/ClickHouse/ClickHouse/pull/11735) ([Ildus Kurbangaliev](https://github.com/ildus)). + +#### Bug Fix + +* Fix premature `ON CLUSTER` timeouts for queries that must be executed on a single replica. Fixes [#6704](https://github.com/ClickHouse/ClickHouse/issues/6704), [#7228](https://github.com/ClickHouse/ClickHouse/issues/7228), [#13361](https://github.com/ClickHouse/ClickHouse/issues/13361), [#11884](https://github.com/ClickHouse/ClickHouse/issues/11884). [#13450](https://github.com/ClickHouse/ClickHouse/pull/13450) ([alesapin](https://github.com/alesapin)). +* Fix crash in mark inclusion search introduced in [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277). [#14225](https://github.com/ClickHouse/ClickHouse/pull/14225) ([Amos Bird](https://github.com/amosbird)). +* Fix race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Fix visible data clobbering by progress bar in client in interactive mode. This fixes [#12562](https://github.com/ClickHouse/ClickHouse/issues/12562) and [#13369](https://github.com/ClickHouse/ClickHouse/issues/13369) and [#13584](https://github.com/ClickHouse/ClickHouse/issues/13584) and fixes [#12964](https://github.com/ClickHouse/ClickHouse/issues/12964). [#13691](https://github.com/ClickHouse/ClickHouse/pull/13691) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect sorting order for `LowCardinality` columns when ORDER BY multiple columns is used. This fixes [#13958](https://github.com/ClickHouse/ClickHouse/issues/13958). [#14223](https://github.com/ClickHouse/ClickHouse/pull/14223) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Removed hardcoded timeout, which wrongly overruled `query_wait_timeout_milliseconds` setting for cache-dictionary. [#14105](https://github.com/ClickHouse/ClickHouse/pull/14105) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed wrong mount point in extra info for `Poco::Exception: no space left on device`. [#14050](https://github.com/ClickHouse/ClickHouse/pull/14050) ([tavplubix](https://github.com/tavplubix)). +* Fix wrong query optimization of select queries with `DISTINCT` keyword when subqueries also have `DISTINCT` in case `optimize_duplicate_order_by_and_distinct` setting is enabled. [#13925](https://github.com/ClickHouse/ClickHouse/pull/13925) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed potential deadlock when renaming `Distributed` table. [#13922](https://github.com/ClickHouse/ClickHouse/pull/13922) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect sorting for `FixedString` columns when ORDER BY multiple columns is used. Fixes [#13182](https://github.com/ClickHouse/ClickHouse/issues/13182). [#13887](https://github.com/ClickHouse/ClickHouse/pull/13887) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix potentially lower precision of `topK`/`topKWeighted` aggregations (with non-default parameters). [#13817](https://github.com/ClickHouse/ClickHouse/pull/13817) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading from MergeTree table with INDEX of type SET fails when compared against NULL. This fixes [#13686](https://github.com/ClickHouse/ClickHouse/issues/13686). [#13793](https://github.com/ClickHouse/ClickHouse/pull/13793) ([Amos Bird](https://github.com/amosbird)). +* Fix step overflow in function `range()`. [#13790](https://github.com/ClickHouse/ClickHouse/pull/13790) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Directory not empty` error when concurrently executing `DROP DATABASE` and `CREATE TABLE`. [#13756](https://github.com/ClickHouse/ClickHouse/pull/13756) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add range check for `h3KRing` function. This fixes [#13633](https://github.com/ClickHouse/ClickHouse/issues/13633). [#13752](https://github.com/ClickHouse/ClickHouse/pull/13752) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix race condition between DETACH and background merges. Parts may revive after detach. This is continuation of [#8602](https://github.com/ClickHouse/ClickHouse/issues/8602) that did not fix the issue but introduced a test that started to fail in very rare cases, demonstrating the issue. [#13746](https://github.com/ClickHouse/ClickHouse/pull/13746) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix logging Settings.Names/Values when `log_queries_min_type` greater than `QUERY_START`. [#13737](https://github.com/ClickHouse/ClickHouse/pull/13737) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect message in `clickhouse-server.init` while checking user and group. [#13711](https://github.com/ClickHouse/ClickHouse/pull/13711) ([ylchou](https://github.com/ylchou)). +* Do not optimize `any(arrayJoin())` to `arrayJoin()` under `optimize_move_functions_out_of_any`. [#13681](https://github.com/ClickHouse/ClickHouse/pull/13681) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible deadlock in concurrent `ALTER ... REPLACE/MOVE PARTITION ...` queries. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). +* Fixed the behaviour when sometimes cache-dictionary returned default value instead of present value from source. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix secondary indices corruption in compact parts (compact parts is an experimental feature). [#13538](https://github.com/ClickHouse/ClickHouse/pull/13538) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong code in function `netloc`. This fixes [#13335](https://github.com/ClickHouse/ClickHouse/issues/13335). [#13446](https://github.com/ClickHouse/ClickHouse/pull/13446) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error in `parseDateTimeBestEffort` function when unix timestamp was passed as an argument. This fixes [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix invalid return type for comparison of tuples with `NULL` elements. Fixes [#12461](https://github.com/ClickHouse/ClickHouse/issues/12461). [#13420](https://github.com/ClickHouse/ClickHouse/pull/13420) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong optimization caused `aggregate function any(x) is found inside another aggregate function in query` error with `SET optimize_move_functions_out_of_any = 1` and aliases inside `any()`. [#13419](https://github.com/ClickHouse/ClickHouse/pull/13419) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible race in `StorageMemory`. [#13416](https://github.com/ClickHouse/ClickHouse/pull/13416) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix empty output for `Arrow` and `Parquet` formats in case if query return zero rows. It was done because empty output is not valid for this formats. [#13399](https://github.com/ClickHouse/ClickHouse/pull/13399) ([hcz](https://github.com/hczhcz)). +* Fix select queries with constant columns and prefix of primary key in `ORDER BY` clause. [#13396](https://github.com/ClickHouse/ClickHouse/pull/13396) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `PrettyCompactMonoBlock` for clickhouse-local. Fix extremes/totals with `PrettyCompactMonoBlock`. Fixes [#7746](https://github.com/ClickHouse/ClickHouse/issues/7746). [#13394](https://github.com/ClickHouse/ClickHouse/pull/13394) ([Azat Khuzhin](https://github.com/azat)). +* Fixed deadlock in system.text_log. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). It is a part of [#12339](https://github.com/ClickHouse/ClickHouse/issues/12339). This fixes [#12325](https://github.com/ClickHouse/ClickHouse/issues/12325). [#13386](https://github.com/ClickHouse/ClickHouse/pull/13386) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed `File(TSVWithNames*)` (header was written multiple times), fixed `clickhouse-local --format CSVWithNames*` (lacks header, broken after [#12197](https://github.com/ClickHouse/ClickHouse/issues/12197)), fixed `clickhouse-local --format CSVWithNames*` with zero rows (lacks header). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault when function `groupArrayMovingSum` deserializes empty state. Fixes [#13339](https://github.com/ClickHouse/ClickHouse/issues/13339). [#13341](https://github.com/ClickHouse/ClickHouse/pull/13341) ([alesapin](https://github.com/alesapin)). +* Throw error on `arrayJoin()` function in `JOIN ON` section. [#13330](https://github.com/ClickHouse/ClickHouse/pull/13330) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix crash in `LEFT ASOF JOIN` with `join_use_nulls=1`. [#13291](https://github.com/ClickHouse/ClickHouse/pull/13291) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible error `Totals having transform was already added to pipeline` in case of a query from delayed replica. [#13290](https://github.com/ClickHouse/ClickHouse/pull/13290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* The server may crash if user passed specifically crafted arguments to the function `h3ToChildren`. This fixes [#13275](https://github.com/ClickHouse/ClickHouse/issues/13275). [#13277](https://github.com/ClickHouse/ClickHouse/pull/13277) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with `NaN` values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix assertion in KeyCondition when primary key contains expression with monotonic function and query contains comparison with constant whose type is different. This fixes [#12465](https://github.com/ClickHouse/ClickHouse/issues/12465). [#13251](https://github.com/ClickHouse/ClickHouse/pull/13251) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Return passed number for numbers with MSB set in function roundUpToPowerOfTwoOrZero(). It prevents potential errors in case of overflow of array sizes. [#13234](https://github.com/ClickHouse/ClickHouse/pull/13234) ([Azat Khuzhin](https://github.com/azat)). +* Fix function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix DateTime64 conversion functions with constant argument. [#13205](https://github.com/ClickHouse/ClickHouse/pull/13205) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing row policies from users.xml when names of databases or tables contain dots. This fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix access to `redis` dictionary after connection was dropped once. It may happen with `cache` and `direct` dictionary layouts. [#13082](https://github.com/ClickHouse/ClickHouse/pull/13082) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong index analysis with functions. It could lead to some data parts being skipped when reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Cannot convert column because it is constant but values of constants are different in source and result` for remote queries which use deterministic functions in scope of query, but not deterministic between queries, like `now()`, `now64()`, `randConstant()`. Fixes [#11327](https://github.com/ClickHouse/ClickHouse/issues/11327). [#13075](https://github.com/ClickHouse/ClickHouse/pull/13075) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash which was possible for queries with `ORDER BY` tuple and small `LIMIT`. Fixes [#12623](https://github.com/ClickHouse/ClickHouse/issues/12623). [#13009](https://github.com/ClickHouse/ClickHouse/pull/13009) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `Block structure mismatch` error for queries with `UNION` and `JOIN`. Fixes [#12602](https://github.com/ClickHouse/ClickHouse/issues/12602). [#12989](https://github.com/ClickHouse/ClickHouse/pull/12989) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Corrected `merge_with_ttl_timeout` logic which did not work well when expiration affected more than one partition over one time interval. (Authored by @excitoon). [#12982](https://github.com/ClickHouse/ClickHouse/pull/12982) ([Alexander Kazakov](https://github.com/Akazz)). +* Fix columns duplication for range hashed dictionary created from DDL query. This fixes [#10605](https://github.com/ClickHouse/ClickHouse/issues/10605). [#12857](https://github.com/ClickHouse/ClickHouse/pull/12857) ([alesapin](https://github.com/alesapin)). +* Fix unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix rare bug when `ALTER DELETE` and `ALTER MODIFY COLUMN` queries executed simultaneously as a single mutation. Bug leads to an incorrect amount of rows in `count.txt` and as a consequence incorrect data in part. Also, fix a small bug with simultaneous `ALTER RENAME COLUMN` and `ALTER ADD COLUMN`. [#12760](https://github.com/ClickHouse/ClickHouse/pull/12760) ([alesapin](https://github.com/alesapin)). +* Wrong credentials being used when using `clickhouse` dictionary source to query remote tables. [#12756](https://github.com/ClickHouse/ClickHouse/pull/12756) ([sundyli](https://github.com/sundy-li)). +* Fix `CAST(Nullable(String), Enum())`. [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). +* Fix performance with large tuples, which are interpreted as functions in `IN` section. The case when user writes `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fix memory tracking for input_format_parallel_parsing (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong optimization `optimize_move_functions_out_of_any=1` in case of `any(func())`. [#12664](https://github.com/ClickHouse/ClickHouse/pull/12664) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) fix bloom filter index with const expression. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fix SIGSEGV in StorageKafka when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Add support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* CREATE USER IF NOT EXISTS now does not throw exception if the user exists. This fixes [#12507](https://github.com/ClickHouse/ClickHouse/issues/12507). [#12646](https://github.com/ClickHouse/ClickHouse/pull/12646) ([Vitaly Baranov](https://github.com/vitlibar)). +* Exception `There is no supertype...` can be thrown during `ALTER ... UPDATE` in unexpected cases (e.g. when subtracting from UInt64 column). This fixes [#7306](https://github.com/ClickHouse/ClickHouse/issues/7306). This fixes [#4165](https://github.com/ClickHouse/ClickHouse/issues/4165). [#12633](https://github.com/ClickHouse/ClickHouse/pull/12633) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible `Pipeline stuck` error for queries with external sorting. Fixes [#12617](https://github.com/ClickHouse/ClickHouse/issues/12617). [#12618](https://github.com/ClickHouse/ClickHouse/pull/12618) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error `Output of TreeExecutor is not sorted` for `OPTIMIZE DEDUPLICATE`. Fixes [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572). [#12613](https://github.com/ClickHouse/ClickHouse/pull/12613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix the issue when alias on result of function `any` can be lost during query optimization. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). +* Remove data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Now ClickHouse will recalculate checksums for parts when file `checksums.txt` is absent. Broken since [#9827](https://github.com/ClickHouse/ClickHouse/issues/9827). [#12545](https://github.com/ClickHouse/ClickHouse/pull/12545) ([alesapin](https://github.com/alesapin)). +* Fix bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Fixing race condition in live view tables which could cause data duplication. LIVE VIEW is an experimental feature. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix backwards compatibility in binary format of `AggregateFunction(avg, ...)` values. This fixes [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in JOIN with dictionary when we are joining over expression of dictionary key: `t JOIN dict ON expr(dict.id) = t.id`. Disable dictionary join optimisation for this case. [#12458](https://github.com/ClickHouse/ClickHouse/pull/12458) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix overflow when very large LIMIT or OFFSET is specified. This fixes [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* kafka: fix SIGSEGV if there is a message with error in the middle of the batch. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Keep smaller amount of logs in ZooKeeper. Avoid excessive growing of ZooKeeper nodes in case of offline replicas when having many servers/tables/inserts. [#13100](https://github.com/ClickHouse/ClickHouse/pull/13100) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now exceptions forwarded to the client if an error happened during ALTER or mutation. Closes [#11329](https://github.com/ClickHouse/ClickHouse/issues/11329). [#12666](https://github.com/ClickHouse/ClickHouse/pull/12666) ([alesapin](https://github.com/alesapin)). +* Add `QueryTimeMicroseconds`, `SelectQueryTimeMicroseconds` and `InsertQueryTimeMicroseconds` to `system.events`, along with system.metrics, processes, query_log, etc. [#13028](https://github.com/ClickHouse/ClickHouse/pull/13028) ([ianton-ru](https://github.com/ianton-ru)). +* Added `SelectedRows` and `SelectedBytes` to `system.events`, along with system.metrics, processes, query_log, etc. [#12638](https://github.com/ClickHouse/ClickHouse/pull/12638) ([ianton-ru](https://github.com/ianton-ru)). +* Added `current_database` information to `system.query_log`. [#12652](https://github.com/ClickHouse/ClickHouse/pull/12652) ([Amos Bird](https://github.com/amosbird)). +* Allow `TabSeparatedRaw` as input format. [#12009](https://github.com/ClickHouse/ClickHouse/pull/12009) ([hcz](https://github.com/hczhcz)). +* Now `joinGet` supports multi-key lookup. [#12418](https://github.com/ClickHouse/ClickHouse/pull/12418) ([Amos Bird](https://github.com/amosbird)). +* Allow `*Map` aggregate functions to work on Arrays with NULLs. Fixes [#13157](https://github.com/ClickHouse/ClickHouse/issues/13157). [#13225](https://github.com/ClickHouse/ClickHouse/pull/13225) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid overflow in parsing of DateTime values that will lead to negative unix timestamp in their timezone (for example, `1970-01-01 00:00:00` in Moscow). Saturate to zero instead. This fixes [#3470](https://github.com/ClickHouse/ClickHouse/issues/3470). This fixes [#4172](https://github.com/ClickHouse/ClickHouse/issues/4172). [#12443](https://github.com/ClickHouse/ClickHouse/pull/12443) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* AvroConfluent: Skip Kafka tombstone records - Support skipping broken records [#13203](https://github.com/ClickHouse/ClickHouse/pull/13203) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fix wrong error for long queries. It was possible to get syntax error other than `Max query size exceeded` for correct query. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix data race in `lgamma` function. This race was caught only in `tsan`, no side effects really happened. [#13842](https://github.com/ClickHouse/ClickHouse/pull/13842) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a 'Week'-interval formatting for ATTACH/ALTER/CREATE QUOTA-statements. [#13417](https://github.com/ClickHouse/ClickHouse/pull/13417) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). +* Now broken parts are also reported when encountered in compact part processing. Compact parts is an experimental feature. [#13282](https://github.com/ClickHouse/ClickHouse/pull/13282) ([Amos Bird](https://github.com/amosbird)). +* Fix assert in `geohashesInBox`. This fixes [#12554](https://github.com/ClickHouse/ClickHouse/issues/12554). [#13229](https://github.com/ClickHouse/ClickHouse/pull/13229) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix assert in `parseDateTimeBestEffort`. This fixes [#12649](https://github.com/ClickHouse/ClickHouse/issues/12649). [#13227](https://github.com/ClickHouse/ClickHouse/pull/13227) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor optimization in Processors/PipelineExecutor: breaking out of a loop because it makes sense to do so. [#13058](https://github.com/ClickHouse/ClickHouse/pull/13058) ([Mark Papadakis](https://github.com/markpapadakis)). +* Support TRUNCATE table without TABLE keyword. [#12653](https://github.com/ClickHouse/ClickHouse/pull/12653) ([Winter Zhang](https://github.com/zhang2014)). +* Fix explain query format overwrite by default. This fixes [#12541](https://github.com/ClickHouse/ClickHouse/issues/12432). [#12541](https://github.com/ClickHouse/ClickHouse/pull/12541) ([BohuTANG](https://github.com/BohuTANG)). +* Allow to set JOIN kind and type in more standad way: `LEFT SEMI JOIN` instead of `SEMI LEFT JOIN`. For now both are correct. [#12520](https://github.com/ClickHouse/ClickHouse/pull/12520) ([Artem Zuikov](https://github.com/4ertus2)). +* Changes default value for `multiple_joins_rewriter_version` to 2. It enables new multiple joins rewriter that knows about column names. [#12469](https://github.com/ClickHouse/ClickHouse/pull/12469) ([Artem Zuikov](https://github.com/4ertus2)). +* Add several metrics for requests to S3 storages. [#12464](https://github.com/ClickHouse/ClickHouse/pull/12464) ([ianton-ru](https://github.com/ianton-ru)). +* Use correct default secure port for clickhouse-benchmark with `--secure` argument. This fixes [#11044](https://github.com/ClickHouse/ClickHouse/issues/11044). [#12440](https://github.com/ClickHouse/ClickHouse/pull/12440) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Rollback insertion errors in `Log`, `TinyLog`, `StripeLog` engines. In previous versions insertion error lead to inconsisent table state (this works as documented and it is normal for these table engines). This fixes [#12402](https://github.com/ClickHouse/ClickHouse/issues/12402). [#12426](https://github.com/ClickHouse/ClickHouse/pull/12426) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement `RENAME DATABASE` and `RENAME DICTIONARY` for `Atomic` database engine - Add implicit `{uuid}` macro, which can be used in ZooKeeper path for `ReplicatedMergeTree`. It works with `CREATE ... ON CLUSTER ...` queries. Set `show_table_uuid_in_table_create_query_if_not_nil` to `true` to use it. - Make `ReplicatedMergeTree` engine arguments optional, `/clickhouse/tables/{uuid}/{shard}/` and `{replica}` are used by default. Closes [#12135](https://github.com/ClickHouse/ClickHouse/issues/12135). - Minor fixes. - These changes break backward compatibility of `Atomic` database engine. Previously created `Atomic` databases must be manually converted to new format. Atomic database is an experimental feature. [#12343](https://github.com/ClickHouse/ClickHouse/pull/12343) ([tavplubix](https://github.com/tavplubix)). +* Separated `AWSAuthV4Signer` into different logger, removed excessive `AWSClient: AWSClient` from log messages. [#12320](https://github.com/ClickHouse/ClickHouse/pull/12320) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Better exception message in disk access storage. [#12625](https://github.com/ClickHouse/ClickHouse/pull/12625) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error message about adaptive granularity. [#12624](https://github.com/ClickHouse/ClickHouse/pull/12624) ([alesapin](https://github.com/alesapin)). +* Fix SETTINGS parse after FORMAT. [#12480](https://github.com/ClickHouse/ClickHouse/pull/12480) ([Azat Khuzhin](https://github.com/azat)). +* If MergeTree table does not contain ORDER BY or PARTITION BY, it was possible to request ALTER to CLEAR all the columns and ALTER will stuck. Fixed [#7941](https://github.com/ClickHouse/ClickHouse/issues/7941). [#12382](https://github.com/ClickHouse/ClickHouse/pull/12382) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid re-loading completion from the history file after each query (to avoid history overlaps with other client sessions). [#13086](https://github.com/ClickHouse/ClickHouse/pull/13086) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement + +* Lower memory usage for some operations up to 2 times. [#12424](https://github.com/ClickHouse/ClickHouse/pull/12424) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimize PK lookup for queries that match exact PK range. [#12277](https://github.com/ClickHouse/ClickHouse/pull/12277) ([Ivan Babrou](https://github.com/bobrik)). +* Slightly optimize very short queries with `LowCardinality`. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). +* Slightly improve performance of aggregation by UInt8/UInt16 keys. [#13091](https://github.com/ClickHouse/ClickHouse/pull/13091) and [#13055](https://github.com/ClickHouse/ClickHouse/pull/13055) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Push down `LIMIT` step for query plan (inside subqueries). [#13016](https://github.com/ClickHouse/ClickHouse/pull/13016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Parallel primary key lookup and skipping index stages on parts, as described in [#11564](https://github.com/ClickHouse/ClickHouse/issues/11564). [#12589](https://github.com/ClickHouse/ClickHouse/pull/12589) ([Ivan Babrou](https://github.com/bobrik)). +* Converting String-type arguments of function "if" and "transform" into enum if `set optimize_if_transform_strings_to_enum = 1`. [#12515](https://github.com/ClickHouse/ClickHouse/pull/12515) ([Artem Zuikov](https://github.com/4ertus2)). +* Replaces monotonic functions with its argument in `ORDER BY` if `set optimize_monotonous_functions_in_order_by=1`. [#12467](https://github.com/ClickHouse/ClickHouse/pull/12467) ([Artem Zuikov](https://github.com/4ertus2)). +* Add order by optimization that rewrites `ORDER BY x, f(x)` with `ORDER by x` if `set optimize_redundant_functions_in_order_by = 1`. [#12404](https://github.com/ClickHouse/ClickHouse/pull/12404) ([Artem Zuikov](https://github.com/4ertus2)). +* Allow pushdown predicate when subquery contains `WITH` clause. This fixes [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). +* Improve performance of reading from compact parts. Compact parts is an experimental feature. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Attempt to implement streaming optimization in `DiskS3`. DiskS3 is an experimental feature. [#12434](https://github.com/ClickHouse/ClickHouse/pull/12434) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Build/Testing/Packaging Improvement + +* Use `shellcheck` for sh tests linting. [#13200](https://github.com/ClickHouse/ClickHouse/pull/13200) [#13207](https://github.com/ClickHouse/ClickHouse/pull/13207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add script which set labels for pull requests in GitHub hook. [#13183](https://github.com/ClickHouse/ClickHouse/pull/13183) ([alesapin](https://github.com/alesapin)). +* Remove some of recursive submodules. See [#13378](https://github.com/ClickHouse/ClickHouse/issues/13378). [#13379](https://github.com/ClickHouse/ClickHouse/pull/13379) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Ensure that all the submodules are from proper URLs. Continuation of [#13379](https://github.com/ClickHouse/ClickHouse/issues/13379). This fixes [#13378](https://github.com/ClickHouse/ClickHouse/issues/13378). [#13397](https://github.com/ClickHouse/ClickHouse/pull/13397) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added support for user-declared settings, which can be accessed from inside queries. This is needed when ClickHouse engine is used as a component of another system. [#13013](https://github.com/ClickHouse/ClickHouse/pull/13013) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added testing for RBAC functionality of INSERT privilege in TestFlows. Expanded tables on which SELECT is being tested. Added Requirements to match new table engine tests. [#13340](https://github.com/ClickHouse/ClickHouse/pull/13340) ([MyroTk](https://github.com/MyroTk)). +* Fix timeout error during server restart in the stress test. [#13321](https://github.com/ClickHouse/ClickHouse/pull/13321) ([alesapin](https://github.com/alesapin)). +* Now fast test will wait server with retries. [#13284](https://github.com/ClickHouse/ClickHouse/pull/13284) ([alesapin](https://github.com/alesapin)). +* Function `materialize()` (the function for ClickHouse testing) will work for NULL as expected - by transforming it to non-constant column. [#13212](https://github.com/ClickHouse/ClickHouse/pull/13212) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix libunwind build in AArch64. This fixes [#13204](https://github.com/ClickHouse/ClickHouse/issues/13204). [#13208](https://github.com/ClickHouse/ClickHouse/pull/13208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Even more retries in zkutil gtest to prevent test flakiness. [#13165](https://github.com/ClickHouse/ClickHouse/pull/13165) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Small fixes to the RBAC TestFlows. [#13152](https://github.com/ClickHouse/ClickHouse/pull/13152) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixing `00960_live_view_watch_events_live.py` test. [#13108](https://github.com/ClickHouse/ClickHouse/pull/13108) ([vzakaznikov](https://github.com/vzakaznikov)). +* Improve cache purge in documentation deploy script. [#13107](https://github.com/ClickHouse/ClickHouse/pull/13107) ([alesapin](https://github.com/alesapin)). +* Rewrote some orphan tests to gtest. Removed useless includes from tests. [#13073](https://github.com/ClickHouse/ClickHouse/pull/13073) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added tests for RBAC functionality of `SELECT` privilege in TestFlows. [#13061](https://github.com/ClickHouse/ClickHouse/pull/13061) ([Ritaank Tiwari](https://github.com/ritaank)). +* Rerun some tests in fast test check. [#12992](https://github.com/ClickHouse/ClickHouse/pull/12992) ([alesapin](https://github.com/alesapin)). +* Fix MSan error in "rdkafka" library. This closes [#12990](https://github.com/ClickHouse/ClickHouse/issues/12990). Updated `rdkafka` to version 1.5 (master). [#12991](https://github.com/ClickHouse/ClickHouse/pull/12991) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in base64 if tests were run on server with AVX-512. This fixes [#12318](https://github.com/ClickHouse/ClickHouse/issues/12318). Author: @qoega. [#12441](https://github.com/ClickHouse/ClickHouse/pull/12441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in HDFS library. This closes [#12330](https://github.com/ClickHouse/ClickHouse/issues/12330). [#12453](https://github.com/ClickHouse/ClickHouse/pull/12453) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check an ability that we able to restore the backup from an old version to the new version. This closes [#8979](https://github.com/ClickHouse/ClickHouse/issues/8979). [#12959](https://github.com/ClickHouse/ClickHouse/pull/12959) ([alesapin](https://github.com/alesapin)). +* Do not build helper_container image inside integrational tests. Build docker container in CI and use pre-built helper_container in integration tests. [#12953](https://github.com/ClickHouse/ClickHouse/pull/12953) ([Ilya Yatsishin](https://github.com/qoega)). +* Add a test for `ALTER TABLE CLEAR COLUMN` query for primary key columns. [#12951](https://github.com/ClickHouse/ClickHouse/pull/12951) ([alesapin](https://github.com/alesapin)). +* Increased timeouts in testflows tests. [#12949](https://github.com/ClickHouse/ClickHouse/pull/12949) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix build of test under Mac OS X. This closes [#12767](https://github.com/ClickHouse/ClickHouse/issues/12767). [#12772](https://github.com/ClickHouse/ClickHouse/pull/12772) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Connector-ODBC updated to mysql-connector-odbc-8.0.21. [#12739](https://github.com/ClickHouse/ClickHouse/pull/12739) ([Ilya Yatsishin](https://github.com/qoega)). +* Adding RBAC syntax tests in TestFlows. [#12642](https://github.com/ClickHouse/ClickHouse/pull/12642) ([vzakaznikov](https://github.com/vzakaznikov)). +* Improve performance of TestKeeper. This will speedup tests with heavy usage of Replicated tables. [#12505](https://github.com/ClickHouse/ClickHouse/pull/12505) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now we check that server is able to start after stress tests run. This fixes [#12473](https://github.com/ClickHouse/ClickHouse/issues/12473). [#12496](https://github.com/ClickHouse/ClickHouse/pull/12496) ([alesapin](https://github.com/alesapin)). +* Update fmtlib to master (7.0.1). [#12446](https://github.com/ClickHouse/ClickHouse/pull/12446) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add docker image for fast tests. [#12294](https://github.com/ClickHouse/ClickHouse/pull/12294) ([alesapin](https://github.com/alesapin)). +* Rework configuration paths for integration tests. [#12285](https://github.com/ClickHouse/ClickHouse/pull/12285) ([Ilya Yatsishin](https://github.com/qoega)). +* Add compiler option to control that stack frames are not too large. This will help to run the code in fibers with small stack size. [#11524](https://github.com/ClickHouse/ClickHouse/pull/11524) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update gitignore-files. [#13447](https://github.com/ClickHouse/ClickHouse/pull/13447) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). + + +## ClickHouse release 20.6 + +### ClickHouse release v20.6.3.28-stable + +#### Backward Incompatible Change + +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* Added an initial implementation of `EXPLAIN` query. Syntax: `EXPLAIN SELECT ...`. This fixes [#1118](https://github.com/ClickHouse/ClickHouse/issues/1118). [#11873](https://github.com/ClickHouse/ClickHouse/pull/11873) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Added storage `RabbitMQ`. [#11069](https://github.com/ClickHouse/ClickHouse/pull/11069) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Implemented PostgreSQL-like `ILIKE` operator for [#11710](https://github.com/ClickHouse/ClickHouse/issues/11710). [#12125](https://github.com/ClickHouse/ClickHouse/pull/12125) ([Mike](https://github.com/myrrc)). +* Supported RIGHT and FULL JOIN with `SET join_algorithm = 'partial_merge'`. Only ALL strictness is allowed (ANY, SEMI, ANTI, ASOF are not). [#12118](https://github.com/ClickHouse/ClickHouse/pull/12118) ([Artem Zuikov](https://github.com/4ertus2)). +* Added a function `initializeAggregation` to initialize an aggregation based on a single value. [#12109](https://github.com/ClickHouse/ClickHouse/pull/12109) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Supported `ALTER TABLE ... [ADD|MODIFY] COLUMN ... FIRST` [#4006](https://github.com/ClickHouse/ClickHouse/issues/4006). [#12073](https://github.com/ClickHouse/ClickHouse/pull/12073) ([Winter Zhang](https://github.com/zhang2014)). +* Added function `parseDateTimeBestEffortUS`. [#12028](https://github.com/ClickHouse/ClickHouse/pull/12028) ([flynn](https://github.com/ucasFL)). +* Support format `ORC` for output (was supported only for input). [#11662](https://github.com/ClickHouse/ClickHouse/pull/11662) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Bug Fix + +* Fixed `aggregate function any(x) is found inside another aggregate function in query` error with `SET optimize_move_functions_out_of_any = 1` and aliases inside `any()`. [#13419](https://github.com/ClickHouse/ClickHouse/pull/13419) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed `PrettyCompactMonoBlock` for clickhouse-local. Fixed extremes/totals with `PrettyCompactMonoBlock`. This fixes [#7746](https://github.com/ClickHouse/ClickHouse/issues/7746). [#13394](https://github.com/ClickHouse/ClickHouse/pull/13394) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible error `Totals having transform was already added to pipeline` in case of a query from delayed replica. [#13290](https://github.com/ClickHouse/ClickHouse/pull/13290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* The server may crash if user passed specifically crafted arguments to the function `h3ToChildren`. This fixes [#13275](https://github.com/ClickHouse/ClickHouse/issues/13275). [#13277](https://github.com/ClickHouse/ClickHouse/pull/13277) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with NaN values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `DateTime64` conversion functions with constant argument. [#13205](https://github.com/ClickHouse/ClickHouse/pull/13205) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong index analysis with functions. It could lead to pruning wrong parts, while reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed error `Cannot convert column because it is constant but values of constants are different in source and result` for remote queries which use deterministic functions in scope of query, but not deterministic between queries, like `now()`, `now64()`, `randConstant()`. Fixes [#11327](https://github.com/ClickHouse/ClickHouse/issues/11327). [#13075](https://github.com/ClickHouse/ClickHouse/pull/13075) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed rare bug when `ALTER DELETE` and `ALTER MODIFY COLUMN` queries executed simultaneously as a single mutation. Bug leads to an incorrect amount of rows in `count.txt` and as a consequence incorrect data in part. Also, fix a small bug with simultaneous `ALTER RENAME COLUMN` and `ALTER ADD COLUMN`. [#12760](https://github.com/ClickHouse/ClickHouse/pull/12760) ([alesapin](https://github.com/alesapin)). +* Fixed `CAST(Nullable(String), Enum())`. [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for `input_format_parallel_parsing` (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bloom filter index with const expression. This fixes [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572). [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `SIGSEGV` in `StorageKafka` when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Added support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `CREATE USER IF NOT EXISTS` now does not throw exception if the user exists. This fixes [#12507](https://github.com/ClickHouse/ClickHouse/issues/12507). [#12646](https://github.com/ClickHouse/ClickHouse/pull/12646) ([Vitaly Baranov](https://github.com/vitlibar)). +* Better exception message in disk access storage. [#12625](https://github.com/ClickHouse/ClickHouse/pull/12625) ([alesapin](https://github.com/alesapin)). +* The function `groupArrayMoving*` was not working for distributed queries. It's result was calculated within incorrect data type (without promotion to the largest type). The function `groupArrayMovingAvg` was returning integer number that was inconsistent with the `avg` function. This fixes [#12568](https://github.com/ClickHouse/ClickHouse/issues/12568). [#12622](https://github.com/ClickHouse/ClickHouse/pull/12622) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed lack of aliases with function `any`. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Remove data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixing race condition in live view tables which could cause data duplication. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed backwards compatibility in binary format of `AggregateFunction(avg, ...)` values. This fixes [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed SETTINGS parse after FORMAT. [#12480](https://github.com/ClickHouse/ClickHouse/pull/12480) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the deadlock if `text_log` is enabled. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed overflow when very large `LIMIT` or `OFFSET` is specified. This fixes [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault if `StorageMerge`. This fixes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Reverted change introduced in [#11079](https://github.com/ClickHouse/ClickHouse/issues/11079) to resolve [#12098](https://github.com/ClickHouse/ClickHouse/issues/12098). [#12397](https://github.com/ClickHouse/ClickHouse/pull/12397) ([Mike](https://github.com/myrrc)). +* Additional check for arguments of bloom filter index. This fixes [#11408](https://github.com/ClickHouse/ClickHouse/issues/11408). [#12388](https://github.com/ClickHouse/ClickHouse/pull/12388) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid exception when negative or floating point constant is used in WHERE condition for indexed tables. This fixes [#11905](https://github.com/ClickHouse/ClickHouse/issues/11905). [#12384](https://github.com/ClickHouse/ClickHouse/pull/12384) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allowed to `CLEAR` column even if there are depending `DEFAULT` expressions. This fixes [#12333](https://github.com/ClickHouse/ClickHouse/issues/12333). [#12378](https://github.com/ClickHouse/ClickHouse/pull/12378) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `TOTALS/ROLLUP/CUBE` for aggregate functions with `-State` and `Nullable` arguments. This fixes [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed error message and exit codes for `ALTER RENAME COLUMN` queries, when `RENAME` is not allowed. Fixes [#12301](https://github.com/ClickHouse/ClickHouse/issues/12301) and [#12303](https://github.com/ClickHouse/ClickHouse/issues/12303). [#12335](https://github.com/ClickHouse/ClickHouse/pull/12335) ([alesapin](https://github.com/alesapin)). +* Fixed very rare race condition in `ReplicatedMergeTreeQueue`. [#12315](https://github.com/ClickHouse/ClickHouse/pull/12315) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When using codec `Delta` or `DoubleDelta` with non fixed width types, exception with code `LOGICAL_ERROR` was returned instead of exception with code `BAD_ARGUMENTS` (we ensure that exceptions with code logical error never happen). This fixes [#12110](https://github.com/ClickHouse/ClickHouse/issues/12110). [#12308](https://github.com/ClickHouse/ClickHouse/pull/12308) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order of columns in `WITH FILL` modifier. Previously order of columns of `ORDER BY` statement wasn't respected. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid "bad cast" exception when there is an expression that filters data by virtual columns (like `_table` in `Merge` tables) or by "index" columns in system tables such as filtering by database name when querying from `system.tables`, and this expression returns `Nullable` type. This fixes [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `TTL` after renaming column, on which depends TTL expression. [#12304](https://github.com/ClickHouse/ClickHouse/pull/12304) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed SIGSEGV if there is an message with error in the middle of the batch in `Kafka` Engine. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the situation when some threads might randomly hang for a few seconds during `DNS` cache updating. [#12296](https://github.com/ClickHouse/ClickHouse/pull/12296) ([tavplubix](https://github.com/tavplubix)). +* Fixed typo in setting name. [#12292](https://github.com/ClickHouse/ClickHouse/pull/12292) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Show error after `TrieDictionary` failed to load. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). +* The function `arrayFill` worked incorrectly for empty arrays that may lead to crash. This fixes [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement conversions to the common type for `LowCardinality` types. This allows to execute UNION ALL of tables with columns of LowCardinality and other columns. This fixes [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour on reaching redirect limit in request to `S3` storage. [#12256](https://github.com/ClickHouse/ClickHouse/pull/12256) ([ianton-ru](https://github.com/ianton-ru)). +* Fixed the behaviour when during multiple sequential inserts in `StorageFile` header for some special types was written more than once. This fixed [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed logical functions for UInt8 values when they are not equal to 0 or 1. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). +* Cap max_memory_usage* limits to the process resident memory. [#12182](https://github.com/ClickHouse/ClickHouse/pull/12182) ([Azat Khuzhin](https://github.com/azat)). +* Fix dictGet arguments check during `GROUP BY` injective functions elimination. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the behaviour when `SummingMergeTree` engine sums up columns from partition key. Added an exception in case of explicit definition of columns to sum which intersects with partition key columns. This fixes [#7867](https://github.com/ClickHouse/ClickHouse/issues/7867). [#12173](https://github.com/ClickHouse/ClickHouse/pull/12173) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Don't split the dictionary source's table name into schema and table name itself if ODBC connection does not support schema. [#12165](https://github.com/ClickHouse/ClickHouse/pull/12165) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed wrong logic in `ALTER DELETE` that leads to deleting of records when condition evaluates to NULL. This fixes [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bad code in redundant ORDER BY optimization. The bug was introduced in [#10067](https://github.com/ClickHouse/ClickHouse/issues/10067). [#12148](https://github.com/ClickHouse/ClickHouse/pull/12148) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential overflow in integer division. This fixes [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential infinite loop in `greatCircleDistance`, `geoDistance`. This fixes [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Normalize "pid" file handling. In previous versions the server may refuse to start if it was killed without proper shutdown and if there is another process that has the same pid as previously runned server. Also pid file may be removed in unsuccessful server startup even if there is another server running. This fixes [#3501](https://github.com/ClickHouse/ClickHouse/issues/3501). [#12133](https://github.com/ClickHouse/ClickHouse/pull/12133) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug which leads to incorrect table metadata in ZooKeepeer for ReplicatedVersionedCollapsingMergeTree tables. Fixes [#12093](https://github.com/ClickHouse/ClickHouse/issues/12093). [#12121](https://github.com/ClickHouse/ClickHouse/pull/12121) ([alesapin](https://github.com/alesapin)). +* Avoid "There is no query" exception for materialized views with joins or with subqueries attached to system logs (system.query_log, metric_log, etc) or to engine=Buffer underlying table. [#12120](https://github.com/ClickHouse/ClickHouse/pull/12120) ([filimonov](https://github.com/filimonov)). +* Fixed handling dependency of table with ENGINE=Dictionary on dictionary. This fixes [#10994](https://github.com/ClickHouse/ClickHouse/issues/10994). This fixes [#10397](https://github.com/ClickHouse/ClickHouse/issues/10397). [#12116](https://github.com/ClickHouse/ClickHouse/pull/12116) ([Vitaly Baranov](https://github.com/vitlibar)). +* Format `Parquet` now properly works with `LowCardinality` and `LowCardinality(Nullable)` types. Fixes [#12086](https://github.com/ClickHouse/ClickHouse/issues/12086), [#8406](https://github.com/ClickHouse/ClickHouse/issues/8406). [#12108](https://github.com/ClickHouse/ClickHouse/pull/12108) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance for selects with `UNION` caused by wrong limit for the total number of threads. Fixes [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed segfault with `-StateResample` combinators. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed empty `result_rows` and `result_bytes` metrics in `system.quey_log` for selects. Fixes [#11595](https://github.com/ClickHouse/ClickHouse/issues/11595). [#12089](https://github.com/ClickHouse/ClickHouse/pull/12089) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed SIGSEGV in StorageKafka on DROP TABLE. [#12075](https://github.com/ClickHouse/ClickHouse/pull/12075) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible crash while using wrong type for `PREWHERE`. Fixes [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Cannot capture column` for higher-order functions with `Tuple(LowCardinality)` argument. Fixes [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed constraints check if constraint is a constant expression. This fixes [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong result and potential crash when invoking function `if` with arguments of type `FixedString` with different sizes. This fixes [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Improvement + +* Allowed to set `JOIN` kind and type in more standard way: `LEFT SEMI JOIN` instead of `SEMI LEFT JOIN`. For now both are correct. [#12520](https://github.com/ClickHouse/ClickHouse/pull/12520) ([Artem Zuikov](https://github.com/4ertus2)). +* lifetime_rows/lifetime_bytes for Buffer engine. [#12421](https://github.com/ClickHouse/ClickHouse/pull/12421) ([Azat Khuzhin](https://github.com/azat)). +* Write the detail exception message to the client instead of 'MySQL server has gone away'. [#12383](https://github.com/ClickHouse/ClickHouse/pull/12383) ([BohuTANG](https://github.com/BohuTANG)). +* Allows to change a charset which is used for printing grids borders. Available charsets are following: UTF-8, ASCII. Setting `output_format_pretty_grid_charset` enables this feature. [#12372](https://github.com/ClickHouse/ClickHouse/pull/12372) ([Sabyanin Maxim](https://github.com/s-mx)). +* Supported MySQL 'SELECT DATABASE()' [#9336](https://github.com/ClickHouse/ClickHouse/issues/9336) 2. Add MySQL replacement query integration test. [#12314](https://github.com/ClickHouse/ClickHouse/pull/12314) ([BohuTANG](https://github.com/BohuTANG)). +* Added `KILL QUERY [connection_id]` for the MySQL client/driver to cancel the long query, issue [#12038](https://github.com/ClickHouse/ClickHouse/issues/12038). [#12152](https://github.com/ClickHouse/ClickHouse/pull/12152) ([BohuTANG](https://github.com/BohuTANG)). +* Added support for `%g` (two digit ISO year) and `%G` (four digit ISO year) substitutions in `formatDateTime` function. [#12136](https://github.com/ClickHouse/ClickHouse/pull/12136) ([vivarum](https://github.com/vivarum)). +* Added 'type' column in system.disks. [#12115](https://github.com/ClickHouse/ClickHouse/pull/12115) ([ianton-ru](https://github.com/ianton-ru)). +* Improved `REVOKE` command: now it requires grant/admin option for only access which will be revoked. For example, to execute `REVOKE ALL ON *.* FROM user1` now it does not require to have full access rights granted with grant option. Added command `REVOKE ALL FROM user1` - it revokes all granted roles from `user1`. [#12083](https://github.com/ClickHouse/ClickHouse/pull/12083) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added replica priority for load_balancing (for manual prioritization of the load balancing). [#11995](https://github.com/ClickHouse/ClickHouse/pull/11995) ([Azat Khuzhin](https://github.com/azat)). +* Switched paths in S3 metadata to relative which allows to handle S3 blobs more easily. [#11892](https://github.com/ClickHouse/ClickHouse/pull/11892) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Performance Improvement + +* Improved performace of 'ORDER BY' and 'GROUP BY' by prefix of sorting key (enabled with `optimize_aggregation_in_order` setting, disabled by default). [#11696](https://github.com/ClickHouse/ClickHouse/pull/11696) ([Anton Popov](https://github.com/CurtizJ)). +* Removed injective functions inside `uniq*()` if `set optimize_injective_functions_inside_uniq=1`. [#12337](https://github.com/ClickHouse/ClickHouse/pull/12337) ([Ruslan Kamalov](https://github.com/kamalov-ruslan)). +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). +* Implemented single part uploads for DiskS3 (experimental feature). [#12026](https://github.com/ClickHouse/ClickHouse/pull/12026) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Experimental Feature +* Added new in-memory format of parts in `MergeTree`-family tables, which stores data in memory. Parts are written on disk at first merge. Part will be created in in-memory format if its size in rows or bytes is below thresholds `min_rows_for_compact_part` and `min_bytes_for_compact_part`. Also optional support of Write-Ahead-Log is available, which is enabled by default and is controlled by setting `in_memory_parts_enable_wal`. [#10697](https://github.com/ClickHouse/ClickHouse/pull/10697) ([Anton Popov](https://github.com/CurtizJ)). + +#### Build/Testing/Packaging Improvement + +* Implement AST-based query fuzzing mode for clickhouse-client. See [this label](https://github.com/ClickHouse/ClickHouse/issues?q=label%3Afuzz+is%3Aissue) for the list of issues we recently found by fuzzing. Most of them were found by this tool, and a couple by SQLancer and `00746_sql_fuzzy.pl`. [#12111](https://github.com/ClickHouse/ClickHouse/pull/12111) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add new type of tests based on Testflows framework. [#12090](https://github.com/ClickHouse/ClickHouse/pull/12090) ([vzakaznikov](https://github.com/vzakaznikov)). +* Added S3 HTTPS integration test. [#12412](https://github.com/ClickHouse/ClickHouse/pull/12412) ([Pavel Kovalenko](https://github.com/Jokser)). +* Log sanitizer trap messages from separate thread. This will prevent possible deadlock under thread sanitizer. [#12313](https://github.com/ClickHouse/ClickHouse/pull/12313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now functional and stress tests will be able to run with old version of `clickhouse-test` script. [#12287](https://github.com/ClickHouse/ClickHouse/pull/12287) ([alesapin](https://github.com/alesapin)). +* Remove strange file creation during build in `orc`. [#12258](https://github.com/ClickHouse/ClickHouse/pull/12258) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Place common docker compose files to integration docker container. [#12168](https://github.com/ClickHouse/ClickHouse/pull/12168) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix warnings from CodeQL. `CodeQL` is another static analyzer that we will use along with `clang-tidy` and `PVS-Studio` that we use already. [#12138](https://github.com/ClickHouse/ClickHouse/pull/12138) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor CMake fixes for UNBUNDLED build. [#12131](https://github.com/ClickHouse/ClickHouse/pull/12131) ([Matwey V. Kornilov](https://github.com/matwey)). +* Added a showcase of the minimal Docker image without using any Linux distribution. [#12126](https://github.com/ClickHouse/ClickHouse/pull/12126) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Perform an upgrade of system packages in the `clickhouse-server` docker image. [#12124](https://github.com/ClickHouse/ClickHouse/pull/12124) ([Ivan Blinkov](https://github.com/blinkov)). +* Add `UNBUNDLED` flag to `system.build_options` table. Move skip lists for `clickhouse-test` to clickhouse repo. [#12107](https://github.com/ClickHouse/ClickHouse/pull/12107) ([alesapin](https://github.com/alesapin)). +* Regular check by [Anchore Container Analysis](https://docs.anchore.com) security analysis tool that looks for [CVE](https://cve.mitre.org/) in `clickhouse-server` Docker image. Also confirms that `Dockerfile` is buildable. Runs daily on `master` and on pull-requests to `Dockerfile`. [#12102](https://github.com/ClickHouse/ClickHouse/pull/12102) ([Ivan Blinkov](https://github.com/blinkov)). +* Daily check by [GitHub CodeQL](https://securitylab.github.com/tools/codeql) security analysis tool that looks for [CWE](https://cwe.mitre.org/). [#12101](https://github.com/ClickHouse/ClickHouse/pull/12101) ([Ivan Blinkov](https://github.com/blinkov)). +* Install `ca-certificates` before the first `apt-get update` in Dockerfile. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). + +## ClickHouse release 20.5 + +### ClickHouse release v20.5.4.40-stable 2020-08-10 + +#### Bug Fix + +* Fixed wrong index analysis with functions. It could lead to pruning wrong parts, while reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for input_format_parallel_parsing (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bloom filter index with const expression. This fixes [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572). [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `SIGSEGV` in `StorageKafka` when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Added support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed lack of aliases with function `any`. [#12593](https://github.com/ClickHouse/ClickHouse/pull/12593) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Remove data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed race condition in live view tables which could cause data duplication. [#12519](https://github.com/ClickHouse/ClickHouse/pull/12519) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed backwards compatibility in binary format of `AggregateFunction(avg, ...)` values. This fixes [#12342](https://github.com/ClickHouse/ClickHouse/issues/12342). [#12486](https://github.com/ClickHouse/ClickHouse/pull/12486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the deadlock if `text_log` is enabled. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed overflow when very large LIMIT or OFFSET is specified. This fixes [#10470](https://github.com/ClickHouse/ClickHouse/issues/10470). This fixes [#11372](https://github.com/ClickHouse/ClickHouse/issues/11372). [#12427](https://github.com/ClickHouse/ClickHouse/pull/12427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault if StorageMerge. Closes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Reverts change introduced in [#11079](https://github.com/ClickHouse/ClickHouse/issues/11079) to resolve [#12098](https://github.com/ClickHouse/ClickHouse/issues/12098). [#12397](https://github.com/ClickHouse/ClickHouse/pull/12397) ([Mike](https://github.com/myrrc)). +* Avoid exception when negative or floating point constant is used in WHERE condition for indexed tables. This fixes [#11905](https://github.com/ClickHouse/ClickHouse/issues/11905). [#12384](https://github.com/ClickHouse/ClickHouse/pull/12384) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to CLEAR column even if there are depending DEFAULT expressions. This fixes [#12333](https://github.com/ClickHouse/ClickHouse/issues/12333). [#12378](https://github.com/ClickHouse/ClickHouse/pull/12378) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed TOTALS/ROLLUP/CUBE for aggregate functions with `-State` and `Nullable` arguments. This fixes [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed SIGSEGV if there is an message with error in the middle of the batch in `Kafka` Engine. [#12302](https://github.com/ClickHouse/ClickHouse/pull/12302) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the behaviour when `SummingMergeTree` engine sums up columns from partition key. Added an exception in case of explicit definition of columns to sum which intersects with partition key columns. This fixes [#7867](https://github.com/ClickHouse/ClickHouse/issues/7867). [#12173](https://github.com/ClickHouse/ClickHouse/pull/12173) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug which leads to incorrect table metadata in ZooKeepeer for ReplicatedVersionedCollapsingMergeTree tables. Fixes [#12093](https://github.com/ClickHouse/ClickHouse/issues/12093). [#12121](https://github.com/ClickHouse/ClickHouse/pull/12121) ([alesapin](https://github.com/alesapin)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed crash in JOIN with LowCardinality type with `join_algorithm=partial_merge`. [#12035](https://github.com/ClickHouse/ClickHouse/pull/12035) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed wrong result for `if()` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). + +#### Performance Improvement + +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). + +#### Build/Testing/Packaging Improvement + +* Install `ca-certificates` before the first `apt-get update` in Dockerfile. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). + + +### ClickHouse release v20.5.2.7-stable 2020-07-02 + +#### Backward Incompatible Change + +* Return non-Nullable result from COUNT(DISTINCT), and `uniq` aggregate functions family. If all passed values are NULL, return zero instead. This improves SQL compatibility. [#11661](https://github.com/ClickHouse/ClickHouse/pull/11661) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a check for the case when user-level setting is specified in a wrong place. User-level settings should be specified in `users.xml` inside `` section for specific user profile (or in `` for default settings). The server won't start with exception message in log. This fixes [#9051](https://github.com/ClickHouse/ClickHouse/issues/9051). If you want to skip the check, you can either move settings to the appropriate place or add `1` to config.xml. [#11449](https://github.com/ClickHouse/ClickHouse/pull/11449) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The setting `input_format_with_names_use_header` is enabled by default. It will affect parsing of input formats `-WithNames` and `-WithNamesAndTypes`. [#10937](https://github.com/ClickHouse/ClickHouse/pull/10937) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove `experimental_use_processors` setting. It is enabled by default. [#10924](https://github.com/ClickHouse/ClickHouse/pull/10924) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update `zstd` to 1.4.4. It has some minor improvements in performance and compression ratio. If you run replicas with different versions of ClickHouse you may see reasonable error messages `Data after merge is not byte-identical to data on another replicas.` with explanation. These messages are Ok and you should not worry. This change is backward compatible but we list it here in changelog in case you will wonder about these messages. [#10663](https://github.com/ClickHouse/ClickHouse/pull/10663) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a check for meaningless codecs and a setting `allow_suspicious_codecs` to control this check. This closes [#4966](https://github.com/ClickHouse/ClickHouse/issues/4966). [#10645](https://github.com/ClickHouse/ClickHouse/pull/10645) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Several Kafka setting changes their defaults. See [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388). +* When upgrading from versions older than 20.5, if rolling update is performed and cluster contains both versions 20.5 or greater and less than 20.5, if ClickHouse nodes with old versions are restarted and old version has been started up in presence of newer versions, it may lead to `Part ... intersects previous part` errors. To prevent this error, first install newer clickhouse-server packages on all cluster nodes and then do restarts (so, when clickhouse-server is restarted, it will start up with the new version). + +#### New Feature + +* `TTL DELETE WHERE` and `TTL GROUP BY` for automatic data coarsening and rollup in tables. [#10537](https://github.com/ClickHouse/ClickHouse/pull/10537) ([expl0si0nn](https://github.com/expl0si0nn)). +* Implementation of PostgreSQL wire protocol. [#10242](https://github.com/ClickHouse/ClickHouse/pull/10242) ([Movses](https://github.com/MovElb)). +* Added system tables for users, roles, grants, settings profiles, quotas, row policies; added commands SHOW USER, SHOW [CURRENT|ENABLED] ROLES, SHOW SETTINGS PROFILES. [#10387](https://github.com/ClickHouse/ClickHouse/pull/10387) ([Vitaly Baranov](https://github.com/vitlibar)). +* Support writes in ODBC Table function [#10554](https://github.com/ClickHouse/ClickHouse/pull/10554) ([ageraab](https://github.com/ageraab)). [#10901](https://github.com/ClickHouse/ClickHouse/pull/10901) ([tavplubix](https://github.com/tavplubix)). +* Add query performance metrics based on Linux `perf_events` (these metrics are calculated with hardware CPU counters and OS counters). It is optional and requires `CAP_SYS_ADMIN` to be set on clickhouse binary. [#9545](https://github.com/ClickHouse/ClickHouse/pull/9545) [Andrey Skobtsov](https://github.com/And42). [#11226](https://github.com/ClickHouse/ClickHouse/pull/11226) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Now support `NULL` and `NOT NULL` modifiers for data types in `CREATE` query. [#11057](https://github.com/ClickHouse/ClickHouse/pull/11057) ([Павел Потемкин](https://github.com/Potya)). +* Add `ArrowStream` input and output format. [#11088](https://github.com/ClickHouse/ClickHouse/pull/11088) ([hcz](https://github.com/hczhcz)). +* Support Cassandra as external dictionary source. [#4978](https://github.com/ClickHouse/ClickHouse/pull/4978) ([favstovol](https://github.com/favstovol)). +* Added a new layout `direct` which loads all the data directly from the source for each query, without storing or caching data. [#10622](https://github.com/ClickHouse/ClickHouse/pull/10622) ([Artem Streltsov](https://github.com/kekekekule)). +* Added new `complex_key_direct` layout to dictionaries, that does not store anything locally during query execution. [#10850](https://github.com/ClickHouse/ClickHouse/pull/10850) ([Artem Streltsov](https://github.com/kekekekule)). +* Added support for MySQL style global variables syntax (stub). This is needed for compatibility of MySQL protocol. [#11832](https://github.com/ClickHouse/ClickHouse/pull/11832) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added syntax highligting to `clickhouse-client` using `replxx`. [#11422](https://github.com/ClickHouse/ClickHouse/pull/11422) ([Tagir Kuskarov](https://github.com/kuskarov)). +* `minMap` and `maxMap` functions were added. [#11603](https://github.com/ClickHouse/ClickHouse/pull/11603) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Add the `system.asynchronous_metric_log` table that logs historical metrics from `system.asynchronous_metrics`. [#11588](https://github.com/ClickHouse/ClickHouse/pull/11588) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add functions `extractAllGroupsHorizontal(haystack, re)` and `extractAllGroupsVertical(haystack, re)`. [#11554](https://github.com/ClickHouse/ClickHouse/pull/11554) ([Vasily Nemkov](https://github.com/Enmk)). +* Add SHOW CLUSTER(S) queries. [#11467](https://github.com/ClickHouse/ClickHouse/pull/11467) ([hexiaoting](https://github.com/hexiaoting)). +* Add `netloc` function for extracting network location, similar to `urlparse(url)`, `netloc` in python. [#11356](https://github.com/ClickHouse/ClickHouse/pull/11356) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Add 2 more virtual columns for engine=Kafka to access message headers. [#11283](https://github.com/ClickHouse/ClickHouse/pull/11283) ([filimonov](https://github.com/filimonov)). +* Add `_timestamp_ms` virtual column for Kafka engine (type is `Nullable(DateTime64(3))`). [#11260](https://github.com/ClickHouse/ClickHouse/pull/11260) ([filimonov](https://github.com/filimonov)). +* Add function `randomFixedString`. [#10866](https://github.com/ClickHouse/ClickHouse/pull/10866) ([Andrei Nekrashevich](https://github.com/xolm)). +* Add function `fuzzBits` that randomly flips bits in a string with given probability. [#11237](https://github.com/ClickHouse/ClickHouse/pull/11237) ([Andrei Nekrashevich](https://github.com/xolm)). +* Allow comparison of numbers with constant string in comparison operators, IN and VALUES sections. [#11647](https://github.com/ClickHouse/ClickHouse/pull/11647) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `round_robin` load_balancing mode. [#11645](https://github.com/ClickHouse/ClickHouse/pull/11645) ([Azat Khuzhin](https://github.com/azat)). +* Add `cast_keep_nullable` setting. If set `CAST(something_nullable AS Type)` return `Nullable(Type)`. [#11733](https://github.com/ClickHouse/ClickHouse/pull/11733) ([Artem Zuikov](https://github.com/4ertus2)). +* Added column `position` to `system.columns` table and `column_position` to `system.parts_columns` table. It contains ordinal position of a column in a table starting with 1. This closes [#7744](https://github.com/ClickHouse/ClickHouse/issues/7744). [#11655](https://github.com/ClickHouse/ClickHouse/pull/11655) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ON CLUSTER support for SYSTEM {FLUSH DISTRIBUTED,STOP/START DISTRIBUTED SEND}. [#11415](https://github.com/ClickHouse/ClickHouse/pull/11415) ([Azat Khuzhin](https://github.com/azat)). +* Add system.distribution_queue table. [#11394](https://github.com/ClickHouse/ClickHouse/pull/11394) ([Azat Khuzhin](https://github.com/azat)). +* Support for all format settings in Kafka, expose some setting on table level, adjust the defaults for better performance. [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388) ([filimonov](https://github.com/filimonov)). +* Add `port` function (to extract port from URL). [#11120](https://github.com/ClickHouse/ClickHouse/pull/11120) ([Azat Khuzhin](https://github.com/azat)). +* Now `dictGet*` functions accept table names. [#11050](https://github.com/ClickHouse/ClickHouse/pull/11050) ([Vitaly Baranov](https://github.com/vitlibar)). +* The `clickhouse-format` tool is now able to format multiple queries when the `-n` argument is used. [#10852](https://github.com/ClickHouse/ClickHouse/pull/10852) ([Darío](https://github.com/dgrr)). +* Possibility to configure proxy-resolver for DiskS3. [#10744](https://github.com/ClickHouse/ClickHouse/pull/10744) ([Pavel Kovalenko](https://github.com/Jokser)). +* Make `pointInPolygon` work with non-constant polygon. PointInPolygon now can take Array(Array(Tuple(..., ...))) as second argument, array of polygon and holes. [#10623](https://github.com/ClickHouse/ClickHouse/pull/10623) ([Alexey Ilyukhov](https://github.com/livace)) [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Added `move_ttl_info` to `system.parts` in order to provide introspection of move TTL functionality. [#10591](https://github.com/ClickHouse/ClickHouse/pull/10591) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Possibility to work with S3 through proxies. [#10576](https://github.com/ClickHouse/ClickHouse/pull/10576) ([Pavel Kovalenko](https://github.com/Jokser)). +* Add `NCHAR` and `NVARCHAR` synonims for data types. [#11025](https://github.com/ClickHouse/ClickHouse/pull/11025) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Resolved [#7224](https://github.com/ClickHouse/ClickHouse/issues/7224): added `FailedQuery`, `FailedSelectQuery` and `FailedInsertQuery` metrics to `system.events` table. [#11151](https://github.com/ClickHouse/ClickHouse/pull/11151) ([Nikita Orlov](https://github.com/naorlov)). +* Add more `jemalloc` statistics to `system.asynchronous_metrics`, and ensure that we see up-to-date values for them. [#11748](https://github.com/ClickHouse/ClickHouse/pull/11748) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Allow to specify default S3 credentials and custom auth headers. [#11134](https://github.com/ClickHouse/ClickHouse/pull/11134) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Added new functions to import/export DateTime64 as Int64 with various precision: `to-/fromUnixTimestamp64Milli/-Micro/-Nano`. [#10923](https://github.com/ClickHouse/ClickHouse/pull/10923) ([Vasily Nemkov](https://github.com/Enmk)). +* Allow specifying `mongodb://` URI for MongoDB dictionaries. [#10915](https://github.com/ClickHouse/ClickHouse/pull/10915) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* OFFSET keyword can now be used without an affiliated LIMIT clause. [#10802](https://github.com/ClickHouse/ClickHouse/pull/10802) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Added `system.licenses` table. This table contains licenses of third-party libraries that are located in `contrib` directory. This closes [#2890](https://github.com/ClickHouse/ClickHouse/issues/2890). [#10795](https://github.com/ClickHouse/ClickHouse/pull/10795) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* New function function toStartOfSecond(DateTime64) -> DateTime64 that nullifies sub-second part of DateTime64 value. [#10722](https://github.com/ClickHouse/ClickHouse/pull/10722) ([Vasily Nemkov](https://github.com/Enmk)). +* Add new input format `JSONAsString` that accepts a sequence of JSON objects separated by newlines, spaces and/or commas. [#10607](https://github.com/ClickHouse/ClickHouse/pull/10607) ([Kruglov Pavel](https://github.com/Avogar)). +* Allowed to profile memory with finer granularity steps than 4 MiB. Added sampling memory profiler to capture random allocations/deallocations. [#10598](https://github.com/ClickHouse/ClickHouse/pull/10598) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `SimpleAggregateFunction` now also supports `sumMap`. [#10000](https://github.com/ClickHouse/ClickHouse/pull/10000) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `ALTER RENAME COLUMN` for the distributed table engine. Continuation of [#10727](https://github.com/ClickHouse/ClickHouse/issues/10727). Fixes [#10747](https://github.com/ClickHouse/ClickHouse/issues/10747). [#10887](https://github.com/ClickHouse/ClickHouse/pull/10887) ([alesapin](https://github.com/alesapin)). + +#### Bug Fix + +* Fix UBSan report in Decimal parse. This fixes [#7540](https://github.com/ClickHouse/ClickHouse/issues/7540). [#10512](https://github.com/ClickHouse/ClickHouse/pull/10512) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential floating point exception when parsing DateTime64. This fixes [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. [#11895](https://github.com/ClickHouse/ClickHouse/pull/11895) [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608) [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of comparison of FixedString with constant String. This fixes [#11393](https://github.com/ClickHouse/ClickHouse/issues/11393). This bug appeared in version 20.4. [#11828](https://github.com/ClickHouse/ClickHouse/pull/11828) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result for `if` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix using too many threads for queries. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `Scalar does not exist` exception when using `WITH ...` in `SELECT ... FROM merge_tree_table ...` [#11621](https://github.com/ClickHouse/ClickHouse/issues/11621). [#11767](https://github.com/ClickHouse/ClickHouse/pull/11767) ([Amos Bird](https://github.com/amosbird)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Now replicated fetches will be cancelled during metadata alter. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). +* Parse metadata stored in zookeeper before checking for equality. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Fix very rare race condition in SYSTEM SYNC REPLICA. If the replicated table is created and at the same time from the separate connection another client is issuing `SYSTEM SYNC REPLICA` command on that table (this is unlikely, because another client should be aware that the table is created), it's possible to get nullptr dereference. [#11691](https://github.com/ClickHouse/ClickHouse/pull/11691) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `LIMIT n WITH TIES` usage together with `ORDER BY` statement, which contains aliases. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible `Pipeline stuck` for selects with parallel `FINAL`. Fixes [#11636](https://github.com/ClickHouse/ClickHouse/issues/11636). [#11682](https://github.com/ClickHouse/ClickHouse/pull/11682) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error which leads to an incorrect state of `system.mutations`. It may show that whole mutation is already done but the server still has `MUTATE_PART` tasks in the replication queue and tries to execute them. This fixes [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). +* Fix syntax hilite in CREATE USER query. [#11664](https://github.com/ClickHouse/ClickHouse/pull/11664) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trivial count query optimization if row-level security is set. In previous versions the user get total count of records in a table instead filtered. This fixes [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Without `-q` option the database does not get created at startup. [#11604](https://github.com/ClickHouse/ClickHouse/pull/11604) ([giordyb](https://github.com/giordyb)). +* Fix error `Block structure mismatch` for queries with sampling reading from `Buffer` table. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when `exception.code() % 256 == 0`. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix race conditions in CREATE/DROP of different replicas of ReplicatedMergeTree. Continue to work if the table was not removed completely from ZooKeeper or not created successfully. This fixes [#11432](https://github.com/ClickHouse/ClickHouse/issues/11432). [#11592](https://github.com/ClickHouse/ClickHouse/pull/11592) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed rare segfault in `SHOW CREATE TABLE` Fixes [#11490](https://github.com/ClickHouse/ClickHouse/issues/11490). [#11579](https://github.com/ClickHouse/ClickHouse/pull/11579) ([tavplubix](https://github.com/tavplubix)). +* All queries in HTTP session have had the same query_id. It is fixed. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix shard_num/replica_num for `` (breaks use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). +* Fix async INSERT into Distributed for prefer_localhost_replica=0 and w/o internal_replication. [#11527](https://github.com/ClickHouse/ClickHouse/pull/11527) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak when exception is thrown in the middle of aggregation with `-State` functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `Pipeline stuck` exception for `INSERT SELECT FINAL` where `SELECT` (`max_threads`>1) has multiple streams but `INSERT` has only one (`max_insert_threads`==0). [#11455](https://github.com/ClickHouse/ClickHouse/pull/11455) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong result in queries like `select count() from t, u`. [#11454](https://github.com/ClickHouse/ClickHouse/pull/11454) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix potential uninitialized memory read in MergeTree shutdown if table was not created successfully. [#11420](https://github.com/ClickHouse/ClickHouse/pull/11420) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in JOIN over `LowCarinality(T)` and `Nullable(T)`. [#11380](https://github.com/ClickHouse/ClickHouse/issues/11380). [#11414](https://github.com/ClickHouse/ClickHouse/pull/11414) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix error code for wrong `USING` key. [#11373](https://github.com/ClickHouse/ClickHouse/issues/11373). [#11404](https://github.com/ClickHouse/ClickHouse/pull/11404) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed `geohashesInBox` with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Better errors for `joinGet()` functions. [#11389](https://github.com/ClickHouse/ClickHouse/pull/11389) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove redundant lock during parts send in ReplicatedMergeTree. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). +* Fix support for `\G` (vertical output) in clickhouse-client in multiline mode. This closes [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential segfault when using `Lazy` database. [#11348](https://github.com/ClickHouse/ClickHouse/pull/11348) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in direct selects from `Join` table engine (without JOIN) and wrong nullability. [#11340](https://github.com/ClickHouse/ClickHouse/pull/11340) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now merges stopped before change metadata in `ALTER` queries. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `visitParamExtractRaw` when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix insignificant data race in `clickhouse-copier`. Found by integration tests. [#11313](https://github.com/ClickHouse/ClickHouse/pull/11313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when `SET DEFAULT ROLE` is called with wrong arguments. This fixes [#10586](https://github.com/ClickHouse/ClickHouse/issues/10586). [#11278](https://github.com/ClickHouse/ClickHouse/pull/11278) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix crash while reading malformed data in `Protobuf` format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed a bug when `cache` dictionary could return default value instead of normal (when there are only expired keys). This affects only string fields. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix error `Block structure mismatch in QueryPipeline` while reading from `VIEW` with constants in inner query. Fixes [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible exception `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now `primary.idx` will be checked if it's defined in `CREATE` query. [#11199](https://github.com/ClickHouse/ClickHouse/pull/11199) ([alesapin](https://github.com/alesapin)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `S3` globbing which could fail in case of more than 1000 keys and some backends. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Fix for the hang which was happening sometimes during DROP of table engine=Kafka (or during server restarts). [#11145](https://github.com/ClickHouse/ClickHouse/pull/11145) ([filimonov](https://github.com/filimonov)). +* Fix excessive reserving of threads for simple queries (optimization for reducing the number of threads, which was partly broken after changes in pipeline). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). +* Remove logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed deadlock during server startup after update with changes in structure of system log tables. [#11106](https://github.com/ClickHouse/ClickHouse/pull/11106) ([alesapin](https://github.com/alesapin)). +* Fixed memory leak in registerDiskS3. [#11074](https://github.com/ClickHouse/ClickHouse/pull/11074) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix error `No such name in Block::erase()` when JOIN appears with PREWHERE or `optimize_move_to_prewhere` makes PREWHERE from WHERE. [#11051](https://github.com/ClickHouse/ClickHouse/pull/11051) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixes the potential missed data during termination of Kafka engine table. [#11048](https://github.com/ClickHouse/ClickHouse/pull/11048) ([filimonov](https://github.com/filimonov)). +* Fixed parseDateTime64BestEffort argument resolution bugs. [#10925](https://github.com/ClickHouse/ClickHouse/issues/10925). [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Now it's possible to `ADD/DROP` and `RENAME` the same one column in a single `ALTER` query. Exception message for simultaneous `MODIFY` and `RENAME` became more clear. Partially fixes [#10669](https://github.com/ClickHouse/ClickHouse/issues/10669). [#11037](https://github.com/ClickHouse/ClickHouse/pull/11037) ([alesapin](https://github.com/alesapin)). +* Fixed parsing of S3 URLs. [#11036](https://github.com/ClickHouse/ClickHouse/pull/11036) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix memory tracking for two-level `GROUP BY` when there is a `LIMIT`. [#11022](https://github.com/ClickHouse/ClickHouse/pull/11022) ([Azat Khuzhin](https://github.com/azat)). +* Fix very rare potential use-after-free error in MergeTree if table was not created successfully. [#10986](https://github.com/ClickHouse/ClickHouse/pull/10986) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix metadata (relative path for rename) and data (relative path for symlink) handling for Atomic database. [#10980](https://github.com/ClickHouse/ClickHouse/pull/10980) ([Azat Khuzhin](https://github.com/azat)). +* Fix server crash on concurrent `ALTER` and `DROP DATABASE` queries with `Atomic` database engine. [#10968](https://github.com/ClickHouse/ClickHouse/pull/10968) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect raw data size in method getRawData(). [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fix incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of GROUP BY result is large and aggregation is performed by a single String field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid sending partially written files by the DistributedBlockOutputStream. [#10940](https://github.com/ClickHouse/ClickHouse/pull/10940) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash in `SELECT count(notNullIn(NULL, []))`. [#10920](https://github.com/ClickHouse/ClickHouse/pull/10920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix for the hang which was happening sometimes during DROP of table engine=Kafka (or during server restarts). [#10910](https://github.com/ClickHouse/ClickHouse/pull/10910) ([filimonov](https://github.com/filimonov)). +* Now it's possible to execute multiple `ALTER RENAME` like `a TO b, c TO a`. [#10895](https://github.com/ClickHouse/ClickHouse/pull/10895) ([alesapin](https://github.com/alesapin)). +* Fix possible race which could happen when you get result from aggregate function state from multiple thread for the same column. The only way (which I found) it can happen is when you use `finalizeAggregation` function while reading from table with `Memory` engine which stores `AggregateFunction` state for `quanite*` function. [#10890](https://github.com/ClickHouse/ClickHouse/pull/10890) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix backward compatibility with tuples in Distributed tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SIGSEGV in StringHashTable (if such key does not exist). [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `WATCH` hangs after `LiveView` table was dropped from database with `Atomic` engine. [#10859](https://github.com/ClickHouse/ClickHouse/pull/10859) ([tavplubix](https://github.com/tavplubix)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Now constraints are updated if the column participating in `CONSTRAINT` expression was renamed. Fixes [#10844](https://github.com/ClickHouse/ClickHouse/issues/10844). [#10847](https://github.com/ClickHouse/ClickHouse/pull/10847) ([alesapin](https://github.com/alesapin)). +* Fix potential read of uninitialized memory in cache dictionary. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix columns order after Block::sortColumns() (also add a test that shows that it affects some real use case - Buffer engine). [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fix the issue with ODBC bridge when no quoting of identifiers is requested. This fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan and MSan report in DateLUT. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make use of `src_type` for correct type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Get rid of old libunwind patches. https://github.com/ClickHouse-Extras/libunwind/commit/500aa227911bd185a94bfc071d68f4d3b03cb3b1#r39048012 This allows to disable `-fno-omit-frame-pointer` in `clang` builds that improves performance at least by 1% in average. [#10761](https://github.com/ClickHouse/ClickHouse/pull/10761) ([Amos Bird](https://github.com/amosbird)). +* Fix avgWeighted when using floating-point weight over multiple shards. [#10758](https://github.com/ClickHouse/ClickHouse/pull/10758) ([Baudouin Giard](https://github.com/bgiard)). +* Fix `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix combinator -OrNull and -OrDefault when combined with -State. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fix crash in `generateRandom` with nested types. Fixes [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix usage of primary key wrapped into a function with 'FINAL' modifier and 'ORDER BY' optimization. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible buffer overflow in function `h3EdgeAngle`. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix disappearing totals. Totals could have being filtered if query had had join or subquery with external where condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix atomicity of HTTP insert. This fixes [#9666](https://github.com/ClickHouse/ClickHouse/issues/9666). [#10687](https://github.com/ClickHouse/ClickHouse/pull/10687) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fix multiple usages of `IN` operator with the identical set in one query. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed bug, which causes http requests stuck on client close when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. Fixes [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). +* Fix order of parameters in AggregateTransform constructor. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). +* Fix the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible incorrect number of rows for queries with `LIMIT`. Fixes [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709). [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which locks concurrent alters when table has a lot of parts. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). +* Fix nullptr dereference in StorageBuffer if server was shutdown before table startup. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). +* Fix optimize_skip_unused_shards with LowCardinality. [#10611](https://github.com/ClickHouse/ClickHouse/pull/10611) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault in StorageBuffer when exception on server startup. Fixes [#10550](https://github.com/ClickHouse/ClickHouse/issues/10550). [#10609](https://github.com/ClickHouse/ClickHouse/pull/10609) ([tavplubix](https://github.com/tavplubix)). +* On `SYSTEM DROP DNS CACHE` query also drop caches, which are used to check if user is allowed to connect from some IP addresses. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed handling condition variable for synchronous mutations. In some cases signals to that condition variable could be lost. [#10588](https://github.com/ClickHouse/ClickHouse/pull/10588) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixes possible crash `createDictionary()` is called before `loadStoredObject()` has finished. [#10587](https://github.com/ClickHouse/ClickHouse/pull/10587) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix error `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). +* Fix SELECT of column ALIAS which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* Implemented comparison between DateTime64 and String values (just like for DateTime). [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix index corruption, which may occur in some cases after merge compact parts into another compact part. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)). +* Disable GROUP BY sharding_key optimization by default (`optimize_distributed_group_by_sharding_key` had been introduced and turned of by default, due to trickery of sharding_key analyzing, simple example is `if` in sharding key) and fix it for WITH ROLLUP/CUBE/TOTALS. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)). +* Fixes: [#10263](https://github.com/ClickHouse/ClickHouse/issues/10263) (after that PR dist send via INSERT had been postponing on each INSERT) Fixes: [#8756](https://github.com/ClickHouse/ClickHouse/issues/8756) (that PR breaks distributed sends with all of the following conditions met (unlikely setup for now I guess): `internal_replication == false`, multiple local shards (activates the hardlinking code) and `distributed_storage_policy` (makes `link(2)` fails on `EXDEV`)). [#10486](https://github.com/ClickHouse/ClickHouse/pull/10486) ([Azat Khuzhin](https://github.com/azat)). +* Fixed error with "max_rows_to_sort" limit. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Get dictionary and check access rights only once per each call of any function reading external dictionaries. [#10928](https://github.com/ClickHouse/ClickHouse/pull/10928) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Improvement + +* Apply `TTL` for old data, after `ALTER MODIFY TTL` query. This behaviour is controlled by setting `materialize_ttl_after_modify`, which is enabled by default. [#11042](https://github.com/ClickHouse/ClickHouse/pull/11042) ([Anton Popov](https://github.com/CurtizJ)). +* When parsing C-style backslash escapes in string literals, VALUES and various text formats (this is an extension to SQL standard that is endemic for ClickHouse and MySQL), keep backslash if unknown escape sequence is found (e.g. `\%` or `\w`) that will make usage of `LIKE` and `match` regular expressions more convenient (it's enough to write `name LIKE 'used\_cars'` instead of `name LIKE 'used\\_cars'`) and more compatible at the same time. This fixes [#10922](https://github.com/ClickHouse/ClickHouse/issues/10922). [#11208](https://github.com/ClickHouse/ClickHouse/pull/11208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When reading Decimal value, cut extra digits after point. This behaviour is more compatible with MySQL and PostgreSQL. This fixes [#10202](https://github.com/ClickHouse/ClickHouse/issues/10202). [#11831](https://github.com/ClickHouse/ClickHouse/pull/11831) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to DROP replicated table if the metadata in ZooKeeper was already removed and does not exist (this is also the case when using TestKeeper for testing and the server was restarted). Allow to RENAME replicated table even if there is an error communicating with ZooKeeper. This fixes [#10720](https://github.com/ClickHouse/ClickHouse/issues/10720). [#11652](https://github.com/ClickHouse/ClickHouse/pull/11652) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Slightly improve diagnostic of reading decimal from string. This closes [#10202](https://github.com/ClickHouse/ClickHouse/issues/10202). [#11829](https://github.com/ClickHouse/ClickHouse/pull/11829) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix sleep invocation in signal handler. It was sleeping for less amount of time than expected. [#11825](https://github.com/ClickHouse/ClickHouse/pull/11825) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* (Only Linux) OS related performance metrics (for CPU and I/O) will work even without `CAP_NET_ADMIN` capability. [#10544](https://github.com/ClickHouse/ClickHouse/pull/10544) ([Alexander Kazakov](https://github.com/Akazz)). +* Added `hostname` as an alias to function `hostName`. This feature was suggested by Victor Tarnavskiy from Yandex.Metrica. [#11821](https://github.com/ClickHouse/ClickHouse/pull/11821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added support for distributed `DDL` (update/delete/drop partition) on cross replication clusters. [#11703](https://github.com/ClickHouse/ClickHouse/pull/11703) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Emit warning instead of error in server log at startup if we cannot listen one of the listen addresses (e.g. IPv6 is unavailable inside Docker). Note that if server fails to listen all listed addresses, it will refuse to startup as before. This fixes [#4406](https://github.com/ClickHouse/ClickHouse/issues/4406). [#11687](https://github.com/ClickHouse/ClickHouse/pull/11687) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Default user and database creation on docker image starting. [#10637](https://github.com/ClickHouse/ClickHouse/pull/10637) ([Paramtamtam](https://github.com/tarampampam)). +* When multiline query is printed to server log, the lines are joined. Make it to work correct in case of multiline string literals, identifiers and single-line comments. This fixes [#3853](https://github.com/ClickHouse/ClickHouse/issues/3853). [#11686](https://github.com/ClickHouse/ClickHouse/pull/11686) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Multiple names are now allowed in commands: CREATE USER, CREATE ROLE, ALTER USER, SHOW CREATE USER, SHOW GRANTS and so on. [#11670](https://github.com/ClickHouse/ClickHouse/pull/11670) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for distributed DDL (`UPDATE/DELETE/DROP PARTITION`) on cross replication clusters. [#11508](https://github.com/ClickHouse/ClickHouse/pull/11508) ([frank lee](https://github.com/etah000)). +* Clear password from command line in `clickhouse-client` and `clickhouse-benchmark` if the user has specified it with explicit value. This prevents password exposure by `ps` and similar tools. [#11665](https://github.com/ClickHouse/ClickHouse/pull/11665) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Don't use debug info from ELF file if it does not correspond to the running binary. It is needed to avoid printing wrong function names and source locations in stack traces. This fixes [#7514](https://github.com/ClickHouse/ClickHouse/issues/7514). [#11657](https://github.com/ClickHouse/ClickHouse/pull/11657) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Return NULL/zero when value is not parsed completely in parseDateTimeBestEffortOrNull/Zero functions. This fixes [#7876](https://github.com/ClickHouse/ClickHouse/issues/7876). [#11653](https://github.com/ClickHouse/ClickHouse/pull/11653) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Skip empty parameters in requested URL. They may appear when you write `http://localhost:8123/?&a=b` or `http://localhost:8123/?a=b&&c=d`. This closes [#10749](https://github.com/ClickHouse/ClickHouse/issues/10749). [#11651](https://github.com/ClickHouse/ClickHouse/pull/11651) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow using `groupArrayArray` and `groupUniqArrayArray` as `SimpleAggregateFunction`. [#11650](https://github.com/ClickHouse/ClickHouse/pull/11650) ([Volodymyr Kuznetsov](https://github.com/ksvladimir)). +* Allow comparison with constant strings by implicit conversions when analysing index conditions on other types. This may close [#11630](https://github.com/ClickHouse/ClickHouse/issues/11630). [#11648](https://github.com/ClickHouse/ClickHouse/pull/11648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* https://github.com/ClickHouse/ClickHouse/pull/7572#issuecomment-642815377 Support config default HTTPHandlers. [#11628](https://github.com/ClickHouse/ClickHouse/pull/11628) ([Winter Zhang](https://github.com/zhang2014)). +* Make more input formats to work with Kafka engine. Fix the issue with premature flushes. Fix the performance issue when `kafka_num_consumers` is greater than number of partitions in topic. [#11599](https://github.com/ClickHouse/ClickHouse/pull/11599) ([filimonov](https://github.com/filimonov)). +* Improve `multiple_joins_rewriter_version=2` logic. Fix unknown columns error for lambda aliases. [#11587](https://github.com/ClickHouse/ClickHouse/pull/11587) ([Artem Zuikov](https://github.com/4ertus2)). +* Better exception message when cannot parse columns declaration list. This closes [#10403](https://github.com/ClickHouse/ClickHouse/issues/10403). [#11537](https://github.com/ClickHouse/ClickHouse/pull/11537) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve `enable_optimize_predicate_expression=1` logic for VIEW. [#11513](https://github.com/ClickHouse/ClickHouse/pull/11513) ([Artem Zuikov](https://github.com/4ertus2)). +* Adding support for PREWHERE in live view tables. [#11495](https://github.com/ClickHouse/ClickHouse/pull/11495) ([vzakaznikov](https://github.com/vzakaznikov)). +* Automatically update DNS cache, which is used to check if user is allowed to connect from an address. [#11487](https://github.com/ClickHouse/ClickHouse/pull/11487) ([tavplubix](https://github.com/tavplubix)). +* OPTIMIZE FINAL will force merge even if concurrent merges are performed. This closes [#11309](https://github.com/ClickHouse/ClickHouse/issues/11309) and closes [#11322](https://github.com/ClickHouse/ClickHouse/issues/11322). [#11346](https://github.com/ClickHouse/ClickHouse/pull/11346) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Suppress output of cancelled queries in clickhouse-client. In previous versions result may continue to print in terminal even after you press Ctrl+C to cancel query. This closes [#9473](https://github.com/ClickHouse/ClickHouse/issues/9473). [#11342](https://github.com/ClickHouse/ClickHouse/pull/11342) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now history file is updated after each query and there is no race condition if multiple clients use one history file. This fixes [#9897](https://github.com/ClickHouse/ClickHouse/issues/9897). [#11453](https://github.com/ClickHouse/ClickHouse/pull/11453) ([Tagir Kuskarov](https://github.com/kuskarov)). +* Better log messages in while reloading configuration. [#11341](https://github.com/ClickHouse/ClickHouse/pull/11341) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trailing whitespaces from formatted queries in `clickhouse-client` or `clickhouse-format` in some cases. [#11325](https://github.com/ClickHouse/ClickHouse/pull/11325) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add setting "output_format_pretty_max_value_width". If value is longer, it will be cut to avoid output of too large values in terminal. This closes [#11140](https://github.com/ClickHouse/ClickHouse/issues/11140). [#11324](https://github.com/ClickHouse/ClickHouse/pull/11324) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better exception message in case when there is shortage of memory mappings. This closes [#11027](https://github.com/ClickHouse/ClickHouse/issues/11027). [#11316](https://github.com/ClickHouse/ClickHouse/pull/11316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support (U)Int8, (U)Int16, Date in ASOF JOIN. [#11301](https://github.com/ClickHouse/ClickHouse/pull/11301) ([Artem Zuikov](https://github.com/4ertus2)). +* Support kafka_client_id parameter for Kafka tables. It also changes the default `client.id` used by ClickHouse when communicating with Kafka to be more verbose and usable. [#11252](https://github.com/ClickHouse/ClickHouse/pull/11252) ([filimonov](https://github.com/filimonov)). +* Keep the value of `DistributedFilesToInsert` metric on exceptions. In previous versions, the value was set when we are going to send some files, but it is zero, if there was an exception and some files are still pending. Now it corresponds to the number of pending files in filesystem. [#11220](https://github.com/ClickHouse/ClickHouse/pull/11220) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for multi-word data type names (such as `DOUBLE PRECISION` and `CHAR VARYING`) for better SQL compatibility. [#11214](https://github.com/ClickHouse/ClickHouse/pull/11214) ([Павел Потемкин](https://github.com/Potya)). +* Provide synonyms for some data types. [#10856](https://github.com/ClickHouse/ClickHouse/pull/10856) ([Павел Потемкин](https://github.com/Potya)). +* The query log is now enabled by default. [#11184](https://github.com/ClickHouse/ClickHouse/pull/11184) ([Ivan Blinkov](https://github.com/blinkov)). +* Show authentication type in table system.users and while executing SHOW CREATE USER query. [#11080](https://github.com/ClickHouse/ClickHouse/pull/11080) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove data on explicit `DROP DATABASE` for `Memory` database engine. Fixes [#10557](https://github.com/ClickHouse/ClickHouse/issues/10557). [#11021](https://github.com/ClickHouse/ClickHouse/pull/11021) ([tavplubix](https://github.com/tavplubix)). +* Set thread names for internal threads of rdkafka library. Make logs from rdkafka available in server logs. [#10983](https://github.com/ClickHouse/ClickHouse/pull/10983) ([Azat Khuzhin](https://github.com/azat)). +* Support for unicode whitespaces in queries. This helps when queries are copy-pasted from Word or from web page. This fixes [#10896](https://github.com/ClickHouse/ClickHouse/issues/10896). [#10903](https://github.com/ClickHouse/ClickHouse/pull/10903) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow large UInt types as the index in function `tupleElement`. [#10874](https://github.com/ClickHouse/ClickHouse/pull/10874) ([hcz](https://github.com/hczhcz)). +* Respect prefer_localhost_replica/load_balancing on INSERT into Distributed. [#10867](https://github.com/ClickHouse/ClickHouse/pull/10867) ([Azat Khuzhin](https://github.com/azat)). +* Introduce `min_insert_block_size_rows_for_materialized_views`, `min_insert_block_size_bytes_for_materialized_views` settings. This settings are similar to `min_insert_block_size_rows` and `min_insert_block_size_bytes`, but applied only for blocks inserted into `MATERIALIZED VIEW`. It helps to control blocks squashing while pushing to MVs and avoid excessive memory usage. [#10858](https://github.com/ClickHouse/ClickHouse/pull/10858) ([Azat Khuzhin](https://github.com/azat)). +* Get rid of exception from replicated queue during server shutdown. Fixes [#10819](https://github.com/ClickHouse/ClickHouse/issues/10819). [#10841](https://github.com/ClickHouse/ClickHouse/pull/10841) ([alesapin](https://github.com/alesapin)). +* Ensure that `varSamp`, `varPop` cannot return negative results due to numerical errors and that `stddevSamp`, `stddevPop` cannot be calculated from negative variance. This fixes [#10532](https://github.com/ClickHouse/ClickHouse/issues/10532). [#10829](https://github.com/ClickHouse/ClickHouse/pull/10829) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better DNS exception message. This fixes [#10813](https://github.com/ClickHouse/ClickHouse/issues/10813). [#10828](https://github.com/ClickHouse/ClickHouse/pull/10828) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Change HTTP response code in case of some parse errors to 400 Bad Request. This fix [#10636](https://github.com/ClickHouse/ClickHouse/issues/10636). [#10640](https://github.com/ClickHouse/ClickHouse/pull/10640) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Print a message if clickhouse-client is newer than clickhouse-server. [#10627](https://github.com/ClickHouse/ClickHouse/pull/10627) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adding support for `INSERT INTO [db.]table WATCH` query. [#10498](https://github.com/ClickHouse/ClickHouse/pull/10498) ([vzakaznikov](https://github.com/vzakaznikov)). +* Allow to pass quota_key in clickhouse-client. This closes [#10227](https://github.com/ClickHouse/ClickHouse/issues/10227). [#10270](https://github.com/ClickHouse/ClickHouse/pull/10270) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement + +* Allow multiple replicas to assign merges, mutations, partition drop, move and replace concurrently. This closes [#10367](https://github.com/ClickHouse/ClickHouse/issues/10367). [#11639](https://github.com/ClickHouse/ClickHouse/pull/11639) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#11795](https://github.com/ClickHouse/ClickHouse/pull/11795) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimization of GROUP BY with respect to table sorting key, enabled with `optimize_aggregation_in_order` setting. [#9113](https://github.com/ClickHouse/ClickHouse/pull/9113) ([dimarub2000](https://github.com/dimarub2000)). +* Selects with final are executed in parallel. Added setting `max_final_threads` to limit the number of threads used. [#10463](https://github.com/ClickHouse/ClickHouse/pull/10463) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve performance for INSERT queries via `INSERT SELECT` or INSERT with clickhouse-client when small blocks are generated (typical case with parallel parsing). This fixes [#11275](https://github.com/ClickHouse/ClickHouse/issues/11275). Fix the issue that CONSTRAINTs were not working for DEFAULT fields. This fixes [#11273](https://github.com/ClickHouse/ClickHouse/issues/11273). Fix the issue that CONSTRAINTS were ignored for TEMPORARY tables. This fixes [#11274](https://github.com/ClickHouse/ClickHouse/issues/11274). [#11276](https://github.com/ClickHouse/ClickHouse/pull/11276) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimization that eliminates min/max/any aggregators of GROUP BY keys in SELECT section, enabled with `optimize_aggregators_of_group_by_keys` setting. [#11667](https://github.com/ClickHouse/ClickHouse/pull/11667) ([xPoSx](https://github.com/xPoSx)). [#11806](https://github.com/ClickHouse/ClickHouse/pull/11806) ([Azat Khuzhin](https://github.com/azat)). +* New optimization that takes all operations out of `any` function, enabled with `optimize_move_functions_out_of_any` [#11529](https://github.com/ClickHouse/ClickHouse/pull/11529) ([Ruslan](https://github.com/kamalov-ruslan)). +* Improve performance of `clickhouse-client` in interactive mode when Pretty formats are used. In previous versions, significant amount of time can be spent calculating visible width of UTF-8 string. This closes [#11323](https://github.com/ClickHouse/ClickHouse/issues/11323). [#11323](https://github.com/ClickHouse/ClickHouse/pull/11323) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improved performance for queries with `ORDER BY` and small `LIMIT` (less, then `max_block_size`). [#11171](https://github.com/ClickHouse/ClickHouse/pull/11171) ([Albert Kidrachev](https://github.com/Provet)). +* Add runtime CPU detection to select and dispatch the best function implementation. Add support for codegeneration for multiple targets. This closes [#1017](https://github.com/ClickHouse/ClickHouse/issues/1017). [#10058](https://github.com/ClickHouse/ClickHouse/pull/10058) ([DimasKovas](https://github.com/DimasKovas)). +* Enable `mlock` of clickhouse binary by default. It will prevent clickhouse executable from being paged out under high IO load. [#11139](https://github.com/ClickHouse/ClickHouse/pull/11139) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make queries with `sum` aggregate function and without GROUP BY keys to run multiple times faster. [#10992](https://github.com/ClickHouse/ClickHouse/pull/10992) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improving radix sort (used in `ORDER BY` with simple keys) by removing some redundant data moves. [#10981](https://github.com/ClickHouse/ClickHouse/pull/10981) ([Arslan Gumerov](https://github.com/g-arslan)). +* Sort bigger parts of the left table in MergeJoin. Buffer left blocks in memory. Add `partial_merge_join_left_table_buffer_bytes` setting to manage the left blocks buffers sizes. [#10601](https://github.com/ClickHouse/ClickHouse/pull/10601) ([Artem Zuikov](https://github.com/4ertus2)). +* Remove duplicate ORDER BY and DISTINCT from subqueries, this optimization is enabled with `optimize_duplicate_order_by_and_distinct` [#10067](https://github.com/ClickHouse/ClickHouse/pull/10067) ([Mikhail Malafeev](https://github.com/demo-99)). +* This feature eliminates functions of other keys in GROUP BY section, enabled with `optimize_group_by_function_keys` [#10051](https://github.com/ClickHouse/ClickHouse/pull/10051) ([xPoSx](https://github.com/xPoSx)). +* New optimization that takes arithmetic operations out of aggregate functions, enabled with `optimize_arithmetic_operations_in_aggregate_functions` [#10047](https://github.com/ClickHouse/ClickHouse/pull/10047) ([Ruslan](https://github.com/kamalov-ruslan)). +* Use HTTP client for S3 based on Poco instead of curl. This will improve performance and lower memory usage of s3 storage and table functions. [#11230](https://github.com/ClickHouse/ClickHouse/pull/11230) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix Kafka performance issue related to reschedules based on limits, which were always applied. [#11149](https://github.com/ClickHouse/ClickHouse/pull/11149) ([filimonov](https://github.com/filimonov)). +* Enable percpu_arena:percpu for jemalloc (This will reduce memory fragmentation due to thread pool). [#11084](https://github.com/ClickHouse/ClickHouse/pull/11084) ([Azat Khuzhin](https://github.com/azat)). +* Optimize memory usage when reading a response from an S3 HTTP client. [#11561](https://github.com/ClickHouse/ClickHouse/pull/11561) ([Pavel Kovalenko](https://github.com/Jokser)). +* Adjust the default Kafka settings for better performance. [#11388](https://github.com/ClickHouse/ClickHouse/pull/11388) ([filimonov](https://github.com/filimonov)). + +#### Experimental Feature + +* Add data type `Point` (Tuple(Float64, Float64)) and `Polygon` (Array(Array(Tuple(Float64, Float64))). [#10678](https://github.com/ClickHouse/ClickHouse/pull/10678) ([Alexey Ilyukhov](https://github.com/livace)). +* Add's a `hasSubstr` function that allows for look for subsequences in arrays. Note: this function is likely to be renamed without further notice. [#11071](https://github.com/ClickHouse/ClickHouse/pull/11071) ([Ryad Zenine](https://github.com/r-zenine)). +* Added OpenCL support and bitonic sort algorithm, which can be used for sorting integer types of data in single column. Needs to be build with flag `-DENABLE_OPENCL=1`. For using bitonic sort algorithm instead of others you need to set `bitonic_sort` for Setting's option `special_sort` and make sure that OpenCL is available. This feature does not improve performance or anything else, it is only provided as an example and for demonstration purposes. It is likely to be removed in near future if there will be no further development in this direction. [#10232](https://github.com/ClickHouse/ClickHouse/pull/10232) ([Ri](https://github.com/margaritiko)). + +#### Build/Testing/Packaging Improvement + +* Enable clang-tidy for programs and utils. [#10991](https://github.com/ClickHouse/ClickHouse/pull/10991) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove dependency on `tzdata`: do not fail if `/usr/share/zoneinfo` directory does not exist. Note that all timezones work in ClickHouse even without tzdata installed in system. [#11827](https://github.com/ClickHouse/ClickHouse/pull/11827) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added MSan and UBSan stress tests. Note that we already have MSan, UBSan for functional tests and "stress" test is another kind of tests. [#10871](https://github.com/ClickHouse/ClickHouse/pull/10871) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Print compiler build id in crash messages. It will make us slightly more certain about what binary has crashed. Added new function `buildId`. [#11824](https://github.com/ClickHouse/ClickHouse/pull/11824) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a test to ensure that mutations continue to work after FREEZE query. [#11820](https://github.com/ClickHouse/ClickHouse/pull/11820) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Don't allow tests with "fail" substring in their names because it makes looking at the tests results in browser less convenient when you type Ctrl+F and search for "fail". [#11817](https://github.com/ClickHouse/ClickHouse/pull/11817) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Removes unused imports from HTTPHandlerFactory. [#11660](https://github.com/ClickHouse/ClickHouse/pull/11660) ([Bharat Nallan](https://github.com/bharatnc)). +* Added a random sampling of instances where copier is executed. It is needed to avoid `Too many simultaneous queries` error. Also increased timeout and decreased fault probability. [#11573](https://github.com/ClickHouse/ClickHouse/pull/11573) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix missed include. [#11525](https://github.com/ClickHouse/ClickHouse/pull/11525) ([Matwey V. Kornilov](https://github.com/matwey)). +* Speed up build by removing old example programs. Also found some orphan functional test. [#11486](https://github.com/ClickHouse/ClickHouse/pull/11486) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Increase ccache size for builds in CI. [#11450](https://github.com/ClickHouse/ClickHouse/pull/11450) ([alesapin](https://github.com/alesapin)). +* Leave only unit_tests_dbms in deb build. [#11429](https://github.com/ClickHouse/ClickHouse/pull/11429) ([Ilya Yatsishin](https://github.com/qoega)). +* Update librdkafka to version [1.4.2](https://github.com/edenhill/librdkafka/releases/tag/v1.4.2). [#11256](https://github.com/ClickHouse/ClickHouse/pull/11256) ([filimonov](https://github.com/filimonov)). +* Refactor CMake build files. [#11390](https://github.com/ClickHouse/ClickHouse/pull/11390) ([Ivan](https://github.com/abyss7)). +* Fix several flaky integration tests. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). +* Add support for unit tests run with UBSan. [#11345](https://github.com/ClickHouse/ClickHouse/pull/11345) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove redundant timeout from integration test `test_insertion_sync_fails_with_timeout`. [#11343](https://github.com/ClickHouse/ClickHouse/pull/11343) ([alesapin](https://github.com/alesapin)). +* Better check for hung queries in clickhouse-test. [#11321](https://github.com/ClickHouse/ClickHouse/pull/11321) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Emit a warning if server was build in debug or with sanitizers. [#11304](https://github.com/ClickHouse/ClickHouse/pull/11304) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now clickhouse-test check the server aliveness before tests run. [#11285](https://github.com/ClickHouse/ClickHouse/pull/11285) ([alesapin](https://github.com/alesapin)). +* Fix potentially flacky test `00731_long_merge_tree_select_opened_files.sh`. It does not fail frequently but we have discovered potential race condition in this test while experimenting with ThreadFuzzer: [#9814](https://github.com/ClickHouse/ClickHouse/issues/9814) See [link](https://clickhouse-test-reports.s3.yandex.net/9814/40e3023e215df22985d275bf85f4d2290897b76b/functional_stateless_tests_(unbundled).html#fail1) for the example. [#11270](https://github.com/ClickHouse/ClickHouse/pull/11270) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Repeat test in CI if `curl` invocation was timed out. It is possible due to system hangups for 10+ seconds that are typical in our CI infrastructure. This fixes [#11267](https://github.com/ClickHouse/ClickHouse/issues/11267). [#11268](https://github.com/ClickHouse/ClickHouse/pull/11268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add a test for Join table engine from @donmikel. This closes [#9158](https://github.com/ClickHouse/ClickHouse/issues/9158). [#11265](https://github.com/ClickHouse/ClickHouse/pull/11265) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix several non significant errors in unit tests. [#11262](https://github.com/ClickHouse/ClickHouse/pull/11262) ([alesapin](https://github.com/alesapin)). +* Now parts of linker command for `cctz` library will not be shuffled with other libraries. [#11213](https://github.com/ClickHouse/ClickHouse/pull/11213) ([alesapin](https://github.com/alesapin)). +* Split /programs/server into actual program and library. [#11186](https://github.com/ClickHouse/ClickHouse/pull/11186) ([Ivan](https://github.com/abyss7)). +* Improve build scripts for protobuf & gRPC. [#11172](https://github.com/ClickHouse/ClickHouse/pull/11172) ([Vitaly Baranov](https://github.com/vitlibar)). +* Enable performance test that was not working. [#11158](https://github.com/ClickHouse/ClickHouse/pull/11158) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Create root S3 bucket for tests before any CH instance is started. [#11142](https://github.com/ClickHouse/ClickHouse/pull/11142) ([Pavel Kovalenko](https://github.com/Jokser)). +* Add performance test for non-constant polygons. [#11141](https://github.com/ClickHouse/ClickHouse/pull/11141) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixing `00979_live_view_watch_continuous_aggregates` test. [#11024](https://github.com/ClickHouse/ClickHouse/pull/11024) ([vzakaznikov](https://github.com/vzakaznikov)). +* Add ability to run zookeeper in integration tests over tmpfs. [#11002](https://github.com/ClickHouse/ClickHouse/pull/11002) ([alesapin](https://github.com/alesapin)). +* Wait for odbc-bridge with exponential backoff. Previous wait time of 200 ms was not enough in our CI environment. [#10990](https://github.com/ClickHouse/ClickHouse/pull/10990) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix non-deterministic test. [#10989](https://github.com/ClickHouse/ClickHouse/pull/10989) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added a test for empty external data. [#10926](https://github.com/ClickHouse/ClickHouse/pull/10926) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Database is recreated for every test. This improves separation of tests. [#10902](https://github.com/ClickHouse/ClickHouse/pull/10902) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added more asserts in columns code. [#10833](https://github.com/ClickHouse/ClickHouse/pull/10833) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better cooperation with sanitizers. Print information about query_id in the message of sanitizer failure. [#10832](https://github.com/ClickHouse/ClickHouse/pull/10832) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix obvious race condition in "Split build smoke test" check. [#10820](https://github.com/ClickHouse/ClickHouse/pull/10820) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix (false) MSan report in MergeTreeIndexFullText. The issue first appeared in [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add MSan suppression for MariaDB Client library. [#10800](https://github.com/ClickHouse/ClickHouse/pull/10800) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* GRPC make couldn't find protobuf files, changed make file by adding the right link. [#10794](https://github.com/ClickHouse/ClickHouse/pull/10794) ([mnkonkova](https://github.com/mnkonkova)). +* Enable extra warnings (`-Weverything`) for base, utils, programs. Note that we already have it for the most of the code. [#10779](https://github.com/ClickHouse/ClickHouse/pull/10779) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Suppressions of warnings from libraries was mistakenly declared as public in [#10396](https://github.com/ClickHouse/ClickHouse/issues/10396). [#10776](https://github.com/ClickHouse/ClickHouse/pull/10776) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Restore a patch that was accidentially deleted in [#10396](https://github.com/ClickHouse/ClickHouse/issues/10396). [#10774](https://github.com/ClickHouse/ClickHouse/pull/10774) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix performance tests errors, part 2. [#10773](https://github.com/ClickHouse/ClickHouse/pull/10773) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix performance test errors. [#10766](https://github.com/ClickHouse/ClickHouse/pull/10766) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update cross-builds to use clang-10 compiler. [#10724](https://github.com/ClickHouse/ClickHouse/pull/10724) ([Ivan](https://github.com/abyss7)). +* Update instruction to install RPM packages. This was suggested by Denis (TG login @ldviolet) and implemented by Arkady Shejn. [#10707](https://github.com/ClickHouse/ClickHouse/pull/10707) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Trying to fix `tests/queries/0_stateless/01246_insert_into_watch_live_view.py` test. [#10670](https://github.com/ClickHouse/ClickHouse/pull/10670) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fixing and re-enabling 00979_live_view_watch_continuous_aggregates.py test. [#10658](https://github.com/ClickHouse/ClickHouse/pull/10658) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix OOM in ASan stress test. [#10646](https://github.com/ClickHouse/ClickHouse/pull/10646) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report (adding zero to nullptr) in HashTable that appeared after migration to clang-10. [#10638](https://github.com/ClickHouse/ClickHouse/pull/10638) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove external call to `ld` (bfd) linker during tzdata processing in compile time. [#10634](https://github.com/ClickHouse/ClickHouse/pull/10634) ([alesapin](https://github.com/alesapin)). +* Allow to use `lld` to link blobs (resources). [#10632](https://github.com/ClickHouse/ClickHouse/pull/10632) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan report in `LZ4` library. [#10631](https://github.com/ClickHouse/ClickHouse/pull/10631) ([alexey-milovidov](https://github.com/alexey-milovidov)). See also [https://github.com/lz4/lz4/issues/857](https://github.com/lz4/lz4/issues/857) +* Update LZ4 to the latest dev branch. [#10630](https://github.com/ClickHouse/ClickHouse/pull/10630) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added auto-generated machine-readable file with the list of stable versions. [#10628](https://github.com/ClickHouse/ClickHouse/pull/10628) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `capnproto` version check for `capnp::UnalignedFlatArrayMessageReader`. [#10618](https://github.com/ClickHouse/ClickHouse/pull/10618) ([Matwey V. Kornilov](https://github.com/matwey)). +* Lower memory usage in tests. [#10617](https://github.com/ClickHouse/ClickHouse/pull/10617) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixing hard coded timeouts in new live view tests. [#10604](https://github.com/ClickHouse/ClickHouse/pull/10604) ([vzakaznikov](https://github.com/vzakaznikov)). +* Increasing timeout when opening a client in tests/queries/0_stateless/helpers/client.py. [#10599](https://github.com/ClickHouse/ClickHouse/pull/10599) ([vzakaznikov](https://github.com/vzakaznikov)). +* Enable ThinLTO for clang builds, continuation of [#10435](https://github.com/ClickHouse/ClickHouse/pull/10435). [#10585](https://github.com/ClickHouse/ClickHouse/pull/10585) ([Amos Bird](https://github.com/amosbird)). +* Adding fuzzers and preparing for oss-fuzz integration. [#10546](https://github.com/ClickHouse/ClickHouse/pull/10546) ([kyprizel](https://github.com/kyprizel)). +* Fix FreeBSD build. [#10150](https://github.com/ClickHouse/ClickHouse/pull/10150) ([Ivan](https://github.com/abyss7)). +* Add new build for query tests using pytest framework. [#10039](https://github.com/ClickHouse/ClickHouse/pull/10039) ([Ivan](https://github.com/abyss7)). + + +## ClickHouse release v20.4 + +### ClickHouse release v20.4.8.99-stable 2020-08-10 + +#### Bug Fix + +* Fixed error in `parseDateTimeBestEffort` function when unix timestamp was passed as an argument. This fixes [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with NaN values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong index analysis with functions. It could lead to pruning wrong parts, while reading from `MergeTree` tables. Fixes [#13060](https://github.com/ClickHouse/ClickHouse/issues/13060). Fixes [#12406](https://github.com/ClickHouse/ClickHouse/issues/12406). [#13081](https://github.com/ClickHouse/ClickHouse/pull/13081) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible extra overflow row in data which could appear for queries `WITH TOTALS`. [#12747](https://github.com/ClickHouse/ClickHouse/pull/12747) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for `input_format_parallel_parsing` (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) allow push predicate when subquery contains with clause. [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) fix bloom filter index with const expression. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed `SIGSEGV` in `StorageKafka` when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Added support for function `if` with `Array(UUID)` arguments. This fixes [#11066](https://github.com/ClickHouse/ClickHouse/issues/11066). [#12648](https://github.com/ClickHouse/ClickHouse/pull/12648) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Removed data for Distributed tables (blocks from async INSERTs) on DROP TABLE. [#12556](https://github.com/ClickHouse/ClickHouse/pull/12556) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed crash in JOIN with dictionary when we are joining over expression of dictionary key: `t JOIN dict ON expr(dict.id) = t.id`. Disable dictionary join optimisation for this case. [#12458](https://github.com/ClickHouse/ClickHouse/pull/12458) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed possible segfault if StorageMerge. Closes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Fixed order of columns in `WITH FILL` modifier. Previously order of columns of `ORDER BY` statement wasn't respected. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid "bad cast" exception when there is an expression that filters data by virtual columns (like `_table` in `Merge` tables) or by "index" columns in system tables such as filtering by database name when querying from `system.tables`, and this expression returns `Nullable` type. This fixes [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Show error after TrieDictionary failed to load. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). +* The function `arrayFill` worked incorrectly for empty arrays that may lead to crash. This fixes [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implemented conversions to the common type for `LowCardinality` types. This allows to execute UNION ALL of tables with columns of LowCardinality and other columns. This fixes [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour when during multiple sequential inserts in `StorageFile` header for some special types was written more than once. This fixed [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed logical functions for UInt8 values when they are not equal to 0 or 1. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). +* Cap max_memory_usage* limits to the process resident memory. [#12182](https://github.com/ClickHouse/ClickHouse/pull/12182) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `dictGet` arguments check during GROUP BY injective functions elimination. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). +* Don't split the dictionary source's table name into schema and table name itself if ODBC connection does not support schema. [#12165](https://github.com/ClickHouse/ClickHouse/pull/12165) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed wrong logic in `ALTER DELETE` that leads to deleting of records when condition evaluates to NULL. This fixes [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential overflow in integer division. This fixes [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential infinite loop in `greatCircleDistance`, `geoDistance`. This fixes [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Normalize "pid" file handling. In previous versions the server may refuse to start if it was killed without proper shutdown and if there is another process that has the same pid as previously runned server. Also pid file may be removed in unsuccessful server startup even if there is another server running. This fixes [#3501](https://github.com/ClickHouse/ClickHouse/issues/3501). [#12133](https://github.com/ClickHouse/ClickHouse/pull/12133) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed handling dependency of table with ENGINE=Dictionary on dictionary. This fixes [#10994](https://github.com/ClickHouse/ClickHouse/issues/10994). This fixes [#10397](https://github.com/ClickHouse/ClickHouse/issues/10397). [#12116](https://github.com/ClickHouse/ClickHouse/pull/12116) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed performance for selects with `UNION` caused by wrong limit for the total number of threads. Fixes [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed segfault with `-StateResample` combinators. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed empty `result_rows` and `result_bytes` metrics in `system.quey_log` for selects. Fixes [#11595](https://github.com/ClickHouse/ClickHouse/issues/11595). [#12089](https://github.com/ClickHouse/ClickHouse/pull/12089) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible crash while using wrong type for `PREWHERE`. Fixes [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Expected single dictionary argument for function` for function `defaultValueOfArgumentType` with `LowCardinality` type. Fixes [#11808](https://github.com/ClickHouse/ClickHouse/issues/11808). [#12056](https://github.com/ClickHouse/ClickHouse/pull/12056) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Cannot capture column` for higher-order functions with `Tuple(LowCardinality)` argument. Fixes [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Parse tables metadata in parallel when loading database. This fixes slow server startup when there are large number of tables. [#12045](https://github.com/ClickHouse/ClickHouse/pull/12045) ([tavplubix](https://github.com/tavplubix)). +* Make `topK` aggregate function return Enum for Enum types. This fixes [#3740](https://github.com/ClickHouse/ClickHouse/issues/3740). [#12043](https://github.com/ClickHouse/ClickHouse/pull/12043) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed constraints check if constraint is a constant expression. This fixes [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect comparison of tuples with `Nullable` columns. Fixes [#11985](https://github.com/ClickHouse/ClickHouse/issues/11985). [#12039](https://github.com/ClickHouse/ClickHouse/pull/12039) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed calculation of access rights when allow_introspection_functions=0. [#12031](https://github.com/ClickHouse/ClickHouse/pull/12031) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed wrong result and potential crash when invoking function `if` with arguments of type `FixedString` with different sizes. This fixes [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* A query with function `neighbor` as the only returned expression may return empty result if the function is called with offset `-9223372036854775808`. This fixes [#11367](https://github.com/ClickHouse/ClickHouse/issues/11367). [#12019](https://github.com/ClickHouse/ClickHouse/pull/12019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed calculation of access rights when allow_ddl=0. [#12015](https://github.com/ClickHouse/ClickHouse/pull/12015) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed potential array size overflow in generateRandom that may lead to crash. This fixes [#11371](https://github.com/ClickHouse/ClickHouse/issues/11371). [#12013](https://github.com/ClickHouse/ClickHouse/pull/12013) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential floating point exception. This closes [#11378](https://github.com/ClickHouse/ClickHouse/issues/11378). [#12005](https://github.com/ClickHouse/ClickHouse/pull/12005) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong setting name in log message at server startup. [#11997](https://github.com/ClickHouse/ClickHouse/pull/11997) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Query parameter was not set` in `Values` format. Fixes [#11918](https://github.com/ClickHouse/ClickHouse/issues/11918). [#11936](https://github.com/ClickHouse/ClickHouse/pull/11936) ([tavplubix](https://github.com/tavplubix)). +* Keep aliases for substitutions in query (parametrized queries). This fixes [#11914](https://github.com/ClickHouse/ClickHouse/issues/11914). [#11916](https://github.com/ClickHouse/ClickHouse/pull/11916) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug with no moves when changing storage policy from default one. [#11893](https://github.com/ClickHouse/ClickHouse/pull/11893) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed potential floating point exception when parsing `DateTime64`. This fixes [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed memory accounting via HTTP interface (can be significant with `wait_end_of_query=1`). [#11840](https://github.com/ClickHouse/ClickHouse/pull/11840) ([Azat Khuzhin](https://github.com/azat)). +* Parse metadata stored in zookeeper before checking for equality. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement + +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). + +#### Build/Testing/Packaging Improvement + +* Install `ca-certificates` before the first `apt-get update` in Dockerfile. [#12095](https://github.com/ClickHouse/ClickHouse/pull/12095) ([Ivan Blinkov](https://github.com/blinkov)). + + +### ClickHouse release v20.4.6.53-stable 2020-06-25 + +#### Bug Fix + +* Fix rare crash caused by using `Nullable` column in prewhere condition. Continuation of [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of comparison of FixedString with constant String. This fixes [#11393](https://github.com/ClickHouse/ClickHouse/issues/11393). This bug appeared in version 20.4. [#11828](https://github.com/ClickHouse/ClickHouse/pull/11828) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result for `if()` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix using too many threads for queries. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Now replicated fetches will be cancelled during metadata alter. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `LIMIT n WITH TIES` usage together with `ORDER BY` statement, which contains aliases. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error which leads to an incorrect state of `system.mutations`. It may show that whole mutation is already done but the server still has `MUTATE_PART` tasks in the replication queue and tries to execute them. This fixes [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trivial count query optimization if row-level security is set. In previous versions the user get total count of records in a table instead filtered. This fixes [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. (Probably it is connected with [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error `Block structure mismatch` for queries with sampling reading from `Buffer` table. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when exception.code() % 256 = 0. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed rare segfault in `SHOW CREATE TABLE` Fixes [#11490](https://github.com/ClickHouse/ClickHouse/issues/11490). [#11579](https://github.com/ClickHouse/ClickHouse/pull/11579) ([tavplubix](https://github.com/tavplubix)). +* All queries in HTTP session have had the same query_id. It is fixed. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix shard_num/replica_num for `` (breaks use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). +* Fix race condition which may lead to an exception during table drop. It's a bit tricky and not dangerous at all. If you want an explanation, just notice me in telegram. [#11523](https://github.com/ClickHouse/ClickHouse/pull/11523) ([alesapin](https://github.com/alesapin)). +* Fix memory leak when exception is thrown in the middle of aggregation with -State functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Get rid of old libunwind patches. https://github.com/ClickHouse-Extras/libunwind/commit/500aa227911bd185a94bfc071d68f4d3b03cb3b1#r39048012 This allows to disable `-fno-omit-frame-pointer` in `clang` builds that improves performance at least by 1% in average. [#10761](https://github.com/ClickHouse/ClickHouse/pull/10761) ([Amos Bird](https://github.com/amosbird)). +* Fix usage of primary key wrapped into a function with 'FINAL' modifier and 'ORDER BY' optimization. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). + +#### Build/Testing/Packaging Improvement + +* Fix several non significant errors in unit tests. [#11262](https://github.com/ClickHouse/ClickHouse/pull/11262) ([alesapin](https://github.com/alesapin)). +* Fix (false) MSan report in MergeTreeIndexFullText. The issue first appeared in [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.4.5.36-stable 2020-06-10 + +#### Bug Fix + +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix pointInPolygon with nan as point. Fixes [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Fix potential uninitialized memory read in MergeTree shutdown if table was not created successfully. [#11420](https://github.com/ClickHouse/ClickHouse/pull/11420) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed geohashesInBox with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove redundant lock during parts send in ReplicatedMergeTree. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). +* Fix support for `\G` (vertical output) in clickhouse-client in multiline mode. This closes [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential segfault when using `Lazy` database. [#11348](https://github.com/ClickHouse/ClickHouse/pull/11348) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now merges stopped before change metadata in `ALTER` queries. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix visitParamExtractRaw when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix insignificant data race in clickhouse-copier. Found by integration tests. [#11313](https://github.com/ClickHouse/ClickHouse/pull/11313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when SET DEFAULT ROLE is called with wrong arguments. This fixes [#10586](https://github.com/ClickHouse/ClickHouse/issues/10586). [#11278](https://github.com/ClickHouse/ClickHouse/pull/11278) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix crash while reading malformed data in Protobuf format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed a bug when cache-dictionary could return default value instead of normal (when there are only expired keys). This affects only string fields. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix error `Block structure mismatch in QueryPipeline` while reading from `VIEW` with constants in inner query. Fixes [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible exception `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed S3 globbing which could fail in case of more than 1000 keys and some backends. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Fix Kafka performance issue related to reschedules based on limits, which were always applied. [#11149](https://github.com/ClickHouse/ClickHouse/pull/11149) ([filimonov](https://github.com/filimonov)). +* Fix for the hang which was happening sometimes during DROP of table engine=Kafka (or during server restarts). [#11145](https://github.com/ClickHouse/ClickHouse/pull/11145) ([filimonov](https://github.com/filimonov)). +* Fix excessive reserving of threads for simple queries (optimization for reducing the number of threads, which was partly broken after changes in pipeline). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). + +#### Build/Testing/Packaging Improvement + +* Fix several flaky integration tests. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). + +### ClickHouse release v20.4.4.18-stable 2020-05-26 + +No changes compared to v20.4.3.16-stable. + +### ClickHouse release v20.4.3.16-stable 2020-05-23 + +#### Bug Fix + +* Removed logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed memory leak in registerDiskS3. [#11074](https://github.com/ClickHouse/ClickHouse/pull/11074) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fixed the potential missed data during termination of Kafka engine table. [#11048](https://github.com/ClickHouse/ClickHouse/pull/11048) ([filimonov](https://github.com/filimonov)). +* Fixed `parseDateTime64BestEffort` argument resolution bugs. [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed very rare potential use-after-free error in `MergeTree` if table was not created successfully. [#10986](https://github.com/ClickHouse/ClickHouse/pull/10986), [#10970](https://github.com/ClickHouse/ClickHouse/pull/10970) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed metadata (relative path for rename) and data (relative path for symlink) handling for Atomic database. [#10980](https://github.com/ClickHouse/ClickHouse/pull/10980) ([Azat Khuzhin](https://github.com/azat)). +* Fixed server crash on concurrent `ALTER` and `DROP DATABASE` queries with `Atomic` database engine. [#10968](https://github.com/ClickHouse/ClickHouse/pull/10968) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect raw data size in `getRawData()` method. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fixed incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of GROUP BY result is large and aggregation is performed by a single String field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed sending partially written files by the `DistributedBlockOutputStream`. [#10940](https://github.com/ClickHouse/ClickHouse/pull/10940) ([Azat Khuzhin](https://github.com/azat)). +* Fixed crash in `SELECT count(notNullIn(NULL, []))`. [#10920](https://github.com/ClickHouse/ClickHouse/pull/10920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the hang which was happening sometimes during `DROP` of `Kafka` table engine. (or during server restarts). [#10910](https://github.com/ClickHouse/ClickHouse/pull/10910) ([filimonov](https://github.com/filimonov)). +* Fixed the impossibility of executing multiple `ALTER RENAME` like `a TO b, c TO a`. [#10895](https://github.com/ClickHouse/ClickHouse/pull/10895) ([alesapin](https://github.com/alesapin)). +* Fixed possible race which could happen when you get result from aggregate function state from multiple thread for the same column. The only way it can happen is when you use `finalizeAggregation` function while reading from table with `Memory` engine which stores `AggregateFunction` state for `quantile*` function. [#10890](https://github.com/ClickHouse/ClickHouse/pull/10890) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed backward compatibility with tuples in Distributed tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `SIGSEGV` in `StringHashTable` if such a key does not exist. [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `WATCH` hangs after `LiveView` table was dropped from database with `Atomic` engine. [#10859](https://github.com/ClickHouse/ClickHouse/pull/10859) ([tavplubix](https://github.com/tavplubix)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Now constraints are updated if the column participating in `CONSTRAINT` expression was renamed. Fixes [#10844](https://github.com/ClickHouse/ClickHouse/issues/10844). [#10847](https://github.com/ClickHouse/ClickHouse/pull/10847) ([alesapin](https://github.com/alesapin)). +* Fixed potential read of uninitialized memory in cache-dictionary. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed columns order after `Block::sortColumns()`. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue with `ODBC` bridge when no quoting of identifiers is requested. Fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `UBSan` and `MSan` report in `DateLUT`. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fixed `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed combinator `-OrNull` and `-OrDefault` when combined with `-State`. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fixed possible buffer overflow in function `h3EdgeAngle`. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed bug which locks concurrent alters when table has a lot of parts. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). +* Fixed `nullptr` dereference in `StorageBuffer` if server was shutdown before table startup. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `optimize_skip_unused_shards` with `LowCardinality`. [#10611](https://github.com/ClickHouse/ClickHouse/pull/10611) ([Azat Khuzhin](https://github.com/azat)). +* Fixed handling condition variable for synchronous mutations. In some cases signals to that condition variable could be lost. [#10588](https://github.com/ClickHouse/ClickHouse/pull/10588) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed possible crash when `createDictionary()` is called before `loadStoredObject()` has finished. [#10587](https://github.com/ClickHouse/ClickHouse/pull/10587) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `SELECT` of column `ALIAS` which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* Implemented comparison between DateTime64 and String values. [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). +* Disable `GROUP BY` sharding_key optimization by default (`optimize_distributed_group_by_sharding_key` had been introduced and turned of by default, due to trickery of sharding_key analyzing, simple example is `if` in sharding key) and fix it for `WITH ROLLUP/CUBE/TOTALS`. [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)). +* Fixed [#10263](https://github.com/ClickHouse/ClickHouse/issues/10263). [#10486](https://github.com/ClickHouse/ClickHouse/pull/10486) ([Azat Khuzhin](https://github.com/azat)). +* Added tests about `max_rows_to_sort` setting. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added backward compatibility for create bloom filter index. [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). + +### ClickHouse release v20.4.2.9, 2020-05-12 + +#### Backward Incompatible Change +* System tables (e.g. system.query_log, system.trace_log, system.metric_log) are using compact data part format for parts smaller than 10 MiB in size. Compact data part format is supported since version 20.3. If you are going to downgrade to version less than 20.3, you should manually delete table data for system logs in `/var/lib/clickhouse/data/system/`. +* When string comparison involves FixedString and compared arguments are of different sizes, do comparison as if smaller string is padded to the length of the larger. This is intented for SQL compatibility if we imagine that FixedString data type corresponds to SQL CHAR. This closes [#9272](https://github.com/ClickHouse/ClickHouse/issues/9272). [#10363](https://github.com/ClickHouse/ClickHouse/pull/10363) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make SHOW CREATE TABLE multiline. Now it is more readable and more like MySQL. [#10049](https://github.com/ClickHouse/ClickHouse/pull/10049) ([Azat Khuzhin](https://github.com/azat)) +* Added a setting `validate_polygons` that is used in `pointInPolygon` function and enabled by default. [#9857](https://github.com/ClickHouse/ClickHouse/pull/9857) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### New Feature +* Add support for secured connection from ClickHouse to Zookeeper [#10184](https://github.com/ClickHouse/ClickHouse/pull/10184) ([Konstantin Lebedev](https://github.com/xzkostyan)) +* Support custom HTTP handlers. See [#5436](https://github.com/ClickHouse/ClickHouse/issues/5436) for description. [#7572](https://github.com/ClickHouse/ClickHouse/pull/7572) ([Winter Zhang](https://github.com/zhang2014)) +* Add MessagePack Input/Output format. [#9889](https://github.com/ClickHouse/ClickHouse/pull/9889) ([Kruglov Pavel](https://github.com/Avogar)) +* Add Regexp input format. [#9196](https://github.com/ClickHouse/ClickHouse/pull/9196) ([Kruglov Pavel](https://github.com/Avogar)) +* Added output format `Markdown` for embedding tables in markdown documents. [#10317](https://github.com/ClickHouse/ClickHouse/pull/10317) ([Kruglov Pavel](https://github.com/Avogar)) +* Added support for custom settings section in dictionaries. Also fixes issue [#2829](https://github.com/ClickHouse/ClickHouse/issues/2829). [#10137](https://github.com/ClickHouse/ClickHouse/pull/10137) ([Artem Streltsov](https://github.com/kekekekule)) +* Added custom settings support in DDL-queries for `CREATE DICTIONARY` [#10465](https://github.com/ClickHouse/ClickHouse/pull/10465) ([Artem Streltsov](https://github.com/kekekekule)) +* Add simple server-wide memory profiler that will collect allocation contexts when server memory usage becomes higher than the next allocation threshold. [#10444](https://github.com/ClickHouse/ClickHouse/pull/10444) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add setting `always_fetch_merged_part` which restrict replica to merge parts by itself and always prefer dowloading from other replicas. [#10379](https://github.com/ClickHouse/ClickHouse/pull/10379) ([alesapin](https://github.com/alesapin)) +* Add function `JSONExtractKeysAndValuesRaw` which extracts raw data from JSON objects [#10378](https://github.com/ClickHouse/ClickHouse/pull/10378) ([hcz](https://github.com/hczhcz)) +* Add memory usage from OS to `system.asynchronous_metrics`. [#10361](https://github.com/ClickHouse/ClickHouse/pull/10361) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added generic variants for functions `least` and `greatest`. Now they work with arbitrary number of arguments of arbitrary types. This fixes [#4767](https://github.com/ClickHouse/ClickHouse/issues/4767) [#10318](https://github.com/ClickHouse/ClickHouse/pull/10318) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now ClickHouse controls timeouts of dictionary sources on its side. Two new settings added to cache dictionary configuration: `strict_max_lifetime_seconds`, which is `max_lifetime` by default, and `query_wait_timeout_milliseconds`, which is one minute by default. The first settings is also useful with `allow_read_expired_keys` settings (to forbid reading very expired keys). [#10337](https://github.com/ClickHouse/ClickHouse/pull/10337) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add log_queries_min_type to filter which entries will be written to query_log [#10053](https://github.com/ClickHouse/ClickHouse/pull/10053) ([Azat Khuzhin](https://github.com/azat)) +* Added function `isConstant`. This function checks whether its argument is constant expression and returns 1 or 0. It is intended for development, debugging and demonstration purposes. [#10198](https://github.com/ClickHouse/ClickHouse/pull/10198) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* add joinGetOrNull to return NULL when key is missing instead of returning the default value. [#10094](https://github.com/ClickHouse/ClickHouse/pull/10094) ([Amos Bird](https://github.com/amosbird)) +* Consider `NULL` to be equal to `NULL` in `IN` operator, if the option `transform_null_in` is set. [#10085](https://github.com/ClickHouse/ClickHouse/pull/10085) ([achimbab](https://github.com/achimbab)) +* Add `ALTER TABLE ... RENAME COLUMN` for MergeTree table engines family. [#9948](https://github.com/ClickHouse/ClickHouse/pull/9948) ([alesapin](https://github.com/alesapin)) +* Support parallel distributed INSERT SELECT. [#9759](https://github.com/ClickHouse/ClickHouse/pull/9759) ([vxider](https://github.com/Vxider)) +* Add ability to query Distributed over Distributed (w/o `distributed_group_by_no_merge`) ... [#9923](https://github.com/ClickHouse/ClickHouse/pull/9923) ([Azat Khuzhin](https://github.com/azat)) +* Add function `arrayReduceInRanges` which aggregates array elements in given ranges. [#9598](https://github.com/ClickHouse/ClickHouse/pull/9598) ([hcz](https://github.com/hczhcz)) +* Add Dictionary Status on prometheus exporter. [#9622](https://github.com/ClickHouse/ClickHouse/pull/9622) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Add function `arrayAUC` [#8698](https://github.com/ClickHouse/ClickHouse/pull/8698) ([taiyang-li](https://github.com/taiyang-li)) +* Support `DROP VIEW` statement for better TPC-H compatibility. [#9831](https://github.com/ClickHouse/ClickHouse/pull/9831) ([Amos Bird](https://github.com/amosbird)) +* Add 'strict_order' option to windowFunnel() [#9773](https://github.com/ClickHouse/ClickHouse/pull/9773) ([achimbab](https://github.com/achimbab)) +* Support `DATE` and `TIMESTAMP` SQL operators, e.g. `SELECT date '2001-01-01'` [#9691](https://github.com/ClickHouse/ClickHouse/pull/9691) ([Artem Zuikov](https://github.com/4ertus2)) + +#### Experimental Feature +* Added experimental database engine Atomic. It supports non-blocking `DROP` and `RENAME TABLE` queries and atomic `EXCHANGE TABLES t1 AND t2` query [#7512](https://github.com/ClickHouse/ClickHouse/pull/7512) ([tavplubix](https://github.com/tavplubix)) +* Initial support for ReplicatedMergeTree over S3 (it works in suboptimal way) [#10126](https://github.com/ClickHouse/ClickHouse/pull/10126) ([Pavel Kovalenko](https://github.com/Jokser)) + +#### Bug Fix +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed bug, which caused HTTP requests to get stuck on client closing connection when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)) +* Fix segfault in StorageBuffer when exception is thrown on server startup. Fixes [#10550](https://github.com/ClickHouse/ClickHouse/issues/10550) [#10609](https://github.com/ClickHouse/ClickHouse/pull/10609) ([tavplubix](https://github.com/tavplubix)) +* The query`SYSTEM DROP DNS CACHE` now also drops caches used to check if user is allowed to connect from some IP addresses [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)) +* Fix usage of multiple `IN` operators with an identical set in one query. Fixes [#10539](https://github.com/ClickHouse/ClickHouse/issues/10539) [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)) +* Fix crash in `generateRandom` with nested types. Fixes [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix logic for aggregation_memory_efficient_merge_threads setting. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)) +* Fix disappearing totals. Totals could have being filtered if query had `JOIN` or subquery with external `WHERE` condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674) [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655) [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix possible incorrect number of rows for queries with `LIMIT`. Fixes [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709) [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix index corruption, which may occur in some cases after merging compact parts into another compact part. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)) +* Fix the situation, when mutation finished all parts, but hung up in `is_done=0`. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)) +* Fix overflow at beginning of unix epoch for timezones with fractional offset from UTC. Fixes [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better diagnostics for input formats. Fixes [#10204](https://github.com/ClickHouse/ClickHouse/issues/10204) [#10418](https://github.com/ClickHouse/ClickHouse/pull/10418) ([tavplubix](https://github.com/tavplubix)) +* Fix numeric overflow in `simpleLinearRegression()` over large integers [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)) +* Fix use-after-free in Distributed shutdown, avoid waiting for sending all batches [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)) +* Add CA certificates to clickhouse-server docker image [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)) +* Fix a rare endless loop that might have occurred when using the `addressToLine` function or AggregateFunctionState columns. [#10466](https://github.com/ClickHouse/ClickHouse/pull/10466) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Handle zookeeper "no node error" during distributed query [#10050](https://github.com/ClickHouse/ClickHouse/pull/10050) ([Daniel Chen](https://github.com/Phantomape)) +* Fix bug when server cannot attach table after column's default was altered. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin)) +* Implicitly cast the default expression type to the column type for the ALIAS columns [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)) +* Don't remove metadata directory if `ATTACH DATABASE` fails [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)) +* Avoid dependency on system tzdata. Fixes loading of `Africa/Casablanca` timezone on CentOS 8. Fixes [#10211](https://github.com/ClickHouse/ClickHouse/issues/10211) [#10425](https://github.com/ClickHouse/ClickHouse/pull/10425) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix some issues if data is inserted with quorum and then gets deleted (DROP PARTITION, TTL, etc.). It led to stuck of INSERTs or false-positive exceptions in SELECTs. Fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Check the number and type of arguments when creating BloomFilter index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)) +* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`, otherwise when both settings specified and there are no up-to-date replicas the query will fail (patch from @alex-zaitsev ) [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)) +* Fix the issue when a query with ARRAY JOIN, ORDER BY and LIMIT may return incomplete result. Fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([Vadim Plakhtinskiy](https://github.com/VadimPlh)) +* Add database name to dictionary name after DETACH/ATTACH. Fixes system.dictionaries table and `SYSTEM RELOAD` query [#10415](https://github.com/ClickHouse/ClickHouse/pull/10415) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible incorrect result for extremes in processors pipeline. [#10131](https://github.com/ClickHouse/ClickHouse/pull/10131) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix possible segfault when the setting `distributed_group_by_no_merge` is enabled (introduced in 20.3.7.46 by [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131)). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix wrong flattening of `Array(Tuple(...))` data types. Fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix column names of constants inside JOIN that may clash with names of constants outside of JOIN [#9950](https://github.com/ClickHouse/ClickHouse/pull/9950) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix order of columns after Block::sortColumns() [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible `Pipeline stuck` error in `ConcatProcessor` which may happen in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Don't make disk reservations for aggregations. Fixes [#9241](https://github.com/ClickHouse/ClickHouse/issues/9241) [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat)) +* Fix wrong behaviour of datetime functions for timezones that has altered between positive and negative offsets from UTC (e.g. Pacific/Kiritimati). Fixes [#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid infinite loop in `dictIsIn` function. Fixes #515 [#10365](https://github.com/ClickHouse/ClickHouse/pull/10365) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Disable GROUP BY sharding_key optimization by default and fix it for WITH ROLLUP/CUBE/TOTALS [#10516](https://github.com/ClickHouse/ClickHouse/pull/10516) ([Azat Khuzhin](https://github.com/azat)) +* Check for error code when checking parts and don't mark part as broken if the error is like "not enough memory". Fixes [#6269](https://github.com/ClickHouse/ClickHouse/issues/6269) [#10364](https://github.com/ClickHouse/ClickHouse/pull/10364) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Show information about not loaded dictionaries in system tables. [#10234](https://github.com/ClickHouse/ClickHouse/pull/10234) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix nullptr dereference in StorageBuffer if server was shutdown before table startup. [#10641](https://github.com/ClickHouse/ClickHouse/pull/10641) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed `DROP` vs `OPTIMIZE` race in `ReplicatedMergeTree`. `DROP` could left some garbage in replica path in ZooKeeper if there was concurrent `OPTIMIZE` query. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix)) +* Fix 'Logical error: CROSS JOIN has expressions' error for queries with comma and names joins mix. Fixes [#9910](https://github.com/ClickHouse/ClickHouse/issues/9910) [#10311](https://github.com/ClickHouse/ClickHouse/pull/10311) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix queries with `max_bytes_before_external_group_by`. [#10302](https://github.com/ClickHouse/ClickHouse/pull/10302) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix the issue with limiting maximum recursion depth in parser in certain cases. This fixes [#10283](https://github.com/ClickHouse/ClickHouse/issues/10283) This fix may introduce minor incompatibility: long and deep queries via clickhouse-client may refuse to work, and you should adjust settings `max_query_size` and `max_parser_depth` accordingly. [#10295](https://github.com/ClickHouse/ClickHouse/pull/10295) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to use `count(*)` with multiple JOINs. Fixes [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix error `Pipeline stuck` with `max_rows_to_group_by` and `group_by_overflow_mode = 'break'`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix 'Cannot add column' error while creating `range_hashed` dictionary using DDL query. Fixes [#10093](https://github.com/ClickHouse/ClickHouse/issues/10093). [#10235](https://github.com/ClickHouse/ClickHouse/pull/10235) ([alesapin](https://github.com/alesapin)) +* Fix rare possible exception `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed bug where ClickHouse would throw "Unknown function lambda." error message when user tries to run ALTER UPDATE/DELETE on tables with ENGINE = Replicated*. Check for nondeterministic functions now handles lambda expressions correctly. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)) +* Fixed reasonably rare segfault in StorageSystemTables that happens when SELECT ... FROM system.tables is run on a database with Lazy engine. [#10209](https://github.com/ClickHouse/ClickHouse/pull/10209) ([Alexander Kazakov](https://github.com/Akazz)) +* Fix possible infinite query execution when the query actually should stop on LIMIT, while reading from infinite source like `system.numbers` or `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed "generateRandom" function for Date type. This fixes [#9973](https://github.com/ClickHouse/ClickHouse/issues/9973). Fix an edge case when dates with year 2106 are inserted to MergeTree tables with old-style partitioning but partitions are named with year 1970. [#10218](https://github.com/ClickHouse/ClickHouse/pull/10218) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Convert types if the table definition of a View does not correspond to the SELECT query. This fixes [#10180](https://github.com/ClickHouse/ClickHouse/issues/10180) and [#10022](https://github.com/ClickHouse/ClickHouse/issues/10022) [#10217](https://github.com/ClickHouse/ClickHouse/pull/10217) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `parseDateTimeBestEffort` for strings in RFC-2822 when day of week is Tuesday or Thursday. This fixes [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082) [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix column names of constants inside JOIN that may clash with names of constants outside of JOIN. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix move-to-prewhere optimization in presense of arrayJoin functions (in certain cases). This fixes [#10092](https://github.com/ClickHouse/ClickHouse/issues/10092) [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix issue with separator appearing in SCRAMBLE for native mysql-connector-java (JDBC) [#10140](https://github.com/ClickHouse/ClickHouse/pull/10140) ([BohuTANG](https://github.com/BohuTANG)) +* Fix using the current database for an access checking when the database isn't specified. [#10192](https://github.com/ClickHouse/ClickHouse/pull/10192) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix ALTER of tables with compact parts. [#10130](https://github.com/ClickHouse/ClickHouse/pull/10130) ([Anton Popov](https://github.com/CurtizJ)) +* Add the ability to relax the restriction on non-deterministic functions usage in mutations with `allow_nondeterministic_mutations` setting. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)) +* Fix `DROP TABLE` invoked for dictionary [#10165](https://github.com/ClickHouse/ClickHouse/pull/10165) ([Azat Khuzhin](https://github.com/azat)) +* Convert blocks if structure does not match when doing `INSERT` into Distributed table [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)) +* The number of rows was logged incorrectly (as sum across all parts) when inserted block is split by parts with partition key. [#10138](https://github.com/ClickHouse/ClickHouse/pull/10138) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add some arguments check and support identifier arguments for MySQL Database Engine [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)) +* Fix incorrect `index_granularity_bytes` check while creating new replica. Fixes [#10098](https://github.com/ClickHouse/ClickHouse/issues/10098). [#10121](https://github.com/ClickHouse/ClickHouse/pull/10121) ([alesapin](https://github.com/alesapin)) +* Fix bug in `CHECK TABLE` query when table contain skip indices. [#10068](https://github.com/ClickHouse/ClickHouse/pull/10068) ([alesapin](https://github.com/alesapin)) +* Fix Distributed-over-Distributed with the only one shard in a nested table [#9997](https://github.com/ClickHouse/ClickHouse/pull/9997) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible rows loss for queries with `JOIN` and `UNION ALL`. Fixes [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). ... [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix bug in dictionary when local clickhouse server is used as source. It may caused memory corruption if types in dictionary and source are not compatible. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)) +* Fixed replicated tables startup when updating from an old ClickHouse version where `/table/replicas/replica_name/metadata` node does not exist. Fixes [#10037](https://github.com/ClickHouse/ClickHouse/issues/10037). [#10095](https://github.com/ClickHouse/ClickHouse/pull/10095) ([alesapin](https://github.com/alesapin)) +* Fix error `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. It happened when setting `distributed_aggregation_memory_efficient` was enabled, and distributed query read aggregating data with mixed single and two-level aggregation from different shards. [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix deadlock when database with materialized view failed attach at start [#10054](https://github.com/ClickHouse/ClickHouse/pull/10054) ([Azat Khuzhin](https://github.com/azat)) +* Fix a segmentation fault that could occur in GROUP BY over string keys containing trailing zero bytes ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). ... [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix wrong results of distributed queries when alias could override qualified column name. Fixes [#9672](https://github.com/ClickHouse/ClickHouse/issues/9672) [#9714](https://github.com/ClickHouse/ClickHouse/issues/9714) [#9972](https://github.com/ClickHouse/ClickHouse/pull/9972) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix possible deadlock in `SYSTEM RESTART REPLICAS` [#9955](https://github.com/ClickHouse/ClickHouse/pull/9955) ([tavplubix](https://github.com/tavplubix)) +* Fix the number of threads used for remote query execution (performance regression, since 20.3). This happened when query from `Distributed` table was executed simultaneously on local and remote shards. Fixes [#9965](https://github.com/ClickHouse/ClickHouse/issues/9965) [#9971](https://github.com/ClickHouse/ClickHouse/pull/9971) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed `DeleteOnDestroy` logic in `ATTACH PART` which could lead to automatic removal of attached part and added few tests [#9410](https://github.com/ClickHouse/ClickHouse/pull/9410) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix a bug with `ON CLUSTER` DDL queries freezing on server startup. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)) +* Fix bug in which the necessary tables weren't retrieved at one of the processing stages of queries to some databases. Fixes [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)) +* Fix 'Not found column in block' error when `JOIN` appears with `TOTALS`. Fixes [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839) [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix parsing multiple hosts set in the CREATE USER command [#9924](https://github.com/ClickHouse/ClickHouse/pull/9924) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix `TRUNCATE` for Join table engine ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)) +* Fix race condition between drop and optimize in `ReplicatedMergeTree`. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)) +* Fix `DISTINCT` for Distributed when `optimize_skip_unused_shards` is set. [#9808](https://github.com/ClickHouse/ClickHouse/pull/9808) ([Azat Khuzhin](https://github.com/azat)) +* Fix "scalar does not exist" error in ALTERs ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). ... [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)) +* Fix error with qualified names in `distributed_product_mode=\'local\'`. Fixes [#4756](https://github.com/ClickHouse/ClickHouse/issues/4756) [#9891](https://github.com/ClickHouse/ClickHouse/pull/9891) ([Artem Zuikov](https://github.com/4ertus2)) +* For INSERT queries shards now do clamp the settings from the initiator to their constraints instead of throwing an exception. This fix allows to send INSERT queries to a shard with another constraints. This change improves fix [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)) +* Add some retries when commiting offsets to Kafka broker, since it can reject commit if during `offsets.commit.timeout.ms` there were no enough replicas available for the `__consumer_offsets` topic [#9884](https://github.com/ClickHouse/ClickHouse/pull/9884) ([filimonov](https://github.com/filimonov)) +* Fix Distributed engine behavior when virtual columns of the underlying table used in `WHERE` [#9847](https://github.com/ClickHouse/ClickHouse/pull/9847) ([Azat Khuzhin](https://github.com/azat)) +* Fixed some cases when timezone of the function argument wasn't used properly. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)) +* Fix 'Different expressions with the same alias' error when query has PREWHERE and WHERE on distributed table and `SET distributed_product_mode = 'local'`. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix mutations excessive memory consumption for tables with a composite primary key. This fixes [#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)) +* Fix calculating grants for introspection functions from the setting `allow_introspection_functions`. [#9840](https://github.com/ClickHouse/ClickHouse/pull/9840) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix max_distributed_connections (w/ and w/o Processors) [#9673](https://github.com/ClickHouse/ClickHouse/pull/9673) ([Azat Khuzhin](https://github.com/azat)) +* Fix possible exception `Got 0 in totals chunk, expected 1` on client. It happened for queries with `JOIN` in case if right joined table had zero rows. Example: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. Fixes [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). ... [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix 'COMMA to CROSS JOIN rewriter is not enabled or cannot rewrite query' error in case of subqueries with COMMA JOIN out of tables lists (i.e. in WHERE). Fixes [#9782](https://github.com/ClickHouse/ClickHouse/issues/9782) [#9830](https://github.com/ClickHouse/ClickHouse/pull/9830) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix server crashing when `optimize_skip_unused_shards` is set and expression for key can't be converted to its field type [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)) +* Fix empty string handling in `splitByString`. [#9767](https://github.com/ClickHouse/ClickHouse/pull/9767) ([hcz](https://github.com/hczhcz)) +* Fix broken `ALTER TABLE DELETE COLUMN` query for compact parts. [#9779](https://github.com/ClickHouse/ClickHouse/pull/9779) ([alesapin](https://github.com/alesapin)) +* Fixed missing `rows_before_limit_at_least` for queries over http (with processors pipeline). Fixes [#9730](https://github.com/ClickHouse/ClickHouse/issues/9730) [#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix excessive memory consumption in `ALTER` queries (mutations). This fixes [#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) and [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alesapin](https://github.com/alesapin)) +* Fix possible permanent "Cannot schedule a task" error. [#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) +* Fix bug in backquoting in external dictionaries DDL. Fixes [#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alesapin](https://github.com/alesapin)) +* Fixed data race in `text_log`. It does not correspond to any real bug. [#9726](https://github.com/ClickHouse/ClickHouse/pull/9726) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix bug in a replication that does not allow replication to work if the user has executed mutations on the previous version. This fixes [#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)) +* Fixed incorrect internal function names for `sumKahan` and `sumWithOverflow`. It led to exception while using this functions in remote queries. [#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)) +* Add setting `use_compact_format_in_distributed_parts_names` which allows to write files for `INSERT` queries into `Distributed` table with more compact format. This fixes [#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)) +* Fix RIGHT and FULL JOIN with LowCardinality in JOIN keys. [#9610](https://github.com/ClickHouse/ClickHouse/pull/9610) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix possible exceptions `Size of filter does not match size of column` and `Invalid number of rows in Chunk` in `MergeTreeRangeReader`. They could appear while executing `PREWHERE` in some cases. [#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) +* Allow `ALTER ON CLUSTER` of Distributed tables with internal replication. This fixes [#3268](https://github.com/ClickHouse/ClickHouse/issues/3268) [#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)) +* Fix issue when timezone was not preserved if you write a simple arithmetic expression like `time + 1` (in contrast to an expression like `time + INTERVAL 1 SECOND`). This fixes [#5743](https://github.com/ClickHouse/ClickHouse/issues/5743) [#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement +* Use time zone when comparing DateTime with string literal. This fixes [#5206](https://github.com/ClickHouse/ClickHouse/issues/5206). [#10515](https://github.com/ClickHouse/ClickHouse/pull/10515) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Print verbose diagnostic info if Decimal value cannot be parsed from text input format. [#10205](https://github.com/ClickHouse/ClickHouse/pull/10205) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add tasks/memory metrics for distributed/buffer schedule pools [#10449](https://github.com/ClickHouse/ClickHouse/pull/10449) ([Azat Khuzhin](https://github.com/azat)) +* Display result as soon as it's ready for SELECT DISTINCT queries in clickhouse-local and HTTP interface. This fixes [#8951](https://github.com/ClickHouse/ClickHouse/issues/8951) [#9559](https://github.com/ClickHouse/ClickHouse/pull/9559) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to use `SAMPLE OFFSET` query instead of `cityHash64(PRIMARY KEY) % N == n` for splitting in `clickhouse-copier`. To use this feature, pass `--experimental-use-sample-offset 1` as a command line argument. [#10414](https://github.com/ClickHouse/ClickHouse/pull/10414) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Allow to parse BOM in TSV if the first column cannot contain BOM in its value. This fixes [#10301](https://github.com/ClickHouse/ClickHouse/issues/10301) [#10424](https://github.com/ClickHouse/ClickHouse/pull/10424) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add Avro nested fields insert support [#10354](https://github.com/ClickHouse/ClickHouse/pull/10354) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Allowed to alter column in non-modifying data mode when the same type is specified. [#10382](https://github.com/ClickHouse/ClickHouse/pull/10382) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Auto `distributed_group_by_no_merge` on GROUP BY sharding key (if `optimize_skip_unused_shards` is set) [#10341](https://github.com/ClickHouse/ClickHouse/pull/10341) ([Azat Khuzhin](https://github.com/azat)) +* Optimize queries with LIMIT/LIMIT BY/ORDER BY for distributed with GROUP BY sharding_key [#10373](https://github.com/ClickHouse/ClickHouse/pull/10373) ([Azat Khuzhin](https://github.com/azat)) +* Added a setting `max_server_memory_usage` to limit total memory usage of the server. The metric `MemoryTracking` is now calculated without a drift. The setting `max_memory_usage_for_all_queries` is now obsolete and does nothing. This closes [#10293](https://github.com/ClickHouse/ClickHouse/issues/10293). [#10362](https://github.com/ClickHouse/ClickHouse/pull/10362) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add config option `system_tables_lazy_load`. If it's set to false, then system tables with logs are loaded at the server startup. [Alexander Burmak](https://github.com/Alex-Burmak), [Svyatoslav Tkhon Il Pak](https://github.com/DeifyTheGod), [#9642](https://github.com/ClickHouse/ClickHouse/pull/9642) [#10359](https://github.com/ClickHouse/ClickHouse/pull/10359) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Use background thread pool (background_schedule_pool_size) for distributed sends [#10263](https://github.com/ClickHouse/ClickHouse/pull/10263) ([Azat Khuzhin](https://github.com/azat)) +* Use background thread pool for background buffer flushes. [#10315](https://github.com/ClickHouse/ClickHouse/pull/10315) ([Azat Khuzhin](https://github.com/azat)) +* Support for one special case of removing incompletely written parts. This fixes [#9940](https://github.com/ClickHouse/ClickHouse/issues/9940). [#10221](https://github.com/ClickHouse/ClickHouse/pull/10221) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Use isInjective() over manual list of such functions for GROUP BY optimization. [#10342](https://github.com/ClickHouse/ClickHouse/pull/10342) ([Azat Khuzhin](https://github.com/azat)) +* Avoid printing error message in log if client sends RST packet immediately on connect. It is typical behaviour of IPVS balancer with keepalived and VRRP. This fixes [#1851](https://github.com/ClickHouse/ClickHouse/issues/1851) [#10274](https://github.com/ClickHouse/ClickHouse/pull/10274) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to parse `+inf` for floating point types. This closes [#1839](https://github.com/ClickHouse/ClickHouse/issues/1839) [#10272](https://github.com/ClickHouse/ClickHouse/pull/10272) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Implemented `generateRandom` table function for Nested types. This closes [#9903](https://github.com/ClickHouse/ClickHouse/issues/9903) [#10219](https://github.com/ClickHouse/ClickHouse/pull/10219) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Provide `max_allowed_packed` in MySQL compatibility interface that will help some clients to communicate with ClickHouse via MySQL protocol. [#10199](https://github.com/ClickHouse/ClickHouse/pull/10199) ([BohuTANG](https://github.com/BohuTANG)) +* Allow literals for GLOBAL IN (i.e. `SELECT * FROM remote('localhost', system.one) WHERE dummy global in (0)`) [#10196](https://github.com/ClickHouse/ClickHouse/pull/10196) ([Azat Khuzhin](https://github.com/azat)) +* Fix various small issues in interactive mode of clickhouse-client [#10194](https://github.com/ClickHouse/ClickHouse/pull/10194) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid superfluous dictionaries load (system.tables, DROP/SHOW CREATE TABLE) [#10164](https://github.com/ClickHouse/ClickHouse/pull/10164) ([Azat Khuzhin](https://github.com/azat)) +* Update to RWLock: timeout parameter for getLock() + implementation reworked to be phase fair [#10073](https://github.com/ClickHouse/ClickHouse/pull/10073) ([Alexander Kazakov](https://github.com/Akazz)) +* Enhanced compatibility with native mysql-connector-java(JDBC) [#10021](https://github.com/ClickHouse/ClickHouse/pull/10021) ([BohuTANG](https://github.com/BohuTANG)) +* The function `toString` is considered monotonic and can be used for index analysis even when applied in tautological cases with String or LowCardinality(String) argument. [#10110](https://github.com/ClickHouse/ClickHouse/pull/10110) ([Amos Bird](https://github.com/amosbird)) +* Add `ON CLUSTER` clause support to commands `{CREATE|DROP} USER/ROLE/ROW POLICY/SETTINGS PROFILE/QUOTA`, `GRANT`. [#9811](https://github.com/ClickHouse/ClickHouse/pull/9811) ([Vitaly Baranov](https://github.com/vitlibar)) +* Virtual hosted-style support for S3 URI [#9998](https://github.com/ClickHouse/ClickHouse/pull/9998) ([Pavel Kovalenko](https://github.com/Jokser)) +* Now layout type for dictionaries with no arguments can be specified without round brackets in dictionaries DDL-queries. Fixes [#10057](https://github.com/ClickHouse/ClickHouse/issues/10057). [#10064](https://github.com/ClickHouse/ClickHouse/pull/10064) ([alesapin](https://github.com/alesapin)) +* Add ability to use number ranges with leading zeros in filepath [#9989](https://github.com/ClickHouse/ClickHouse/pull/9989) ([Olga Khvostikova](https://github.com/stavrolia)) +* Better memory usage in CROSS JOIN. [#10029](https://github.com/ClickHouse/ClickHouse/pull/10029) ([Artem Zuikov](https://github.com/4ertus2)) +* Try to connect to all shards in cluster when getting structure of remote table and skip_unavailable_shards is set. [#7278](https://github.com/ClickHouse/ClickHouse/pull/7278) ([nvartolomei](https://github.com/nvartolomei)) +* Add `total_rows`/`total_bytes` into the `system.tables` table. [#9919](https://github.com/ClickHouse/ClickHouse/pull/9919) ([Azat Khuzhin](https://github.com/azat)) +* System log tables now use polymorpic parts by default. [#9905](https://github.com/ClickHouse/ClickHouse/pull/9905) ([Anton Popov](https://github.com/CurtizJ)) +* Add type column into system.settings/merge_tree_settings [#9909](https://github.com/ClickHouse/ClickHouse/pull/9909) ([Azat Khuzhin](https://github.com/azat)) +* Check for available CPU instructions at server startup as early as possible. [#9888](https://github.com/ClickHouse/ClickHouse/pull/9888) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `ORDER BY` stage from mutations because we read from a single ordered part in a single thread. Also add check that the rows in mutation are ordered by sorting key and this order is not violated. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)) +* Implement operator LIKE for FixedString at left hand side. This is needed to better support TPC-DS queries. [#9890](https://github.com/ClickHouse/ClickHouse/pull/9890) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `force_optimize_skip_unused_shards_no_nested` that will disable `force_optimize_skip_unused_shards` for nested Distributed table [#9812](https://github.com/ClickHouse/ClickHouse/pull/9812) ([Azat Khuzhin](https://github.com/azat)) +* Now columns size is calculated only once for MergeTree data parts. [#9827](https://github.com/ClickHouse/ClickHouse/pull/9827) ([alesapin](https://github.com/alesapin)) +* Evaluate constant expressions for `optimize_skip_unused_shards` (i.e. `SELECT * FROM foo_dist WHERE key=xxHash32(0)`) [#8846](https://github.com/ClickHouse/ClickHouse/pull/8846) ([Azat Khuzhin](https://github.com/azat)) +* Check for using `Date` or `DateTime` column from TTL expressions was removed. [#9967](https://github.com/ClickHouse/ClickHouse/pull/9967) ([Vladimir Chebotarev](https://github.com/excitoon)) +* DiskS3 hard links optimal implementation. [#9760](https://github.com/ClickHouse/ClickHouse/pull/9760) ([Pavel Kovalenko](https://github.com/Jokser)) +* If `set multiple_joins_rewriter_version = 2` enables second version of multiple JOIN rewrites that keeps not clashed column names as is. It supports multiple JOINs with `USING` and allow `select *` for JOINs with subqueries. [#9739](https://github.com/ClickHouse/ClickHouse/pull/9739) ([Artem Zuikov](https://github.com/4ertus2)) +* Implementation of "non-blocking" alter for StorageMergeTree [#9606](https://github.com/ClickHouse/ClickHouse/pull/9606) ([alesapin](https://github.com/alesapin)) +* Add MergeTree full support for DiskS3 [#9646](https://github.com/ClickHouse/ClickHouse/pull/9646) ([Pavel Kovalenko](https://github.com/Jokser)) +* Extend `splitByString` to support empty strings as separators. [#9742](https://github.com/ClickHouse/ClickHouse/pull/9742) ([hcz](https://github.com/hczhcz)) +* Add a `timestamp_ns` column to `system.trace_log`. It contains a high-definition timestamp of the trace event, and allows to build timelines of thread profiles ("flame charts"). [#9696](https://github.com/ClickHouse/ClickHouse/pull/9696) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* When the setting `send_logs_level` is enabled, avoid intermixing of log messages and query progress. [#9634](https://github.com/ClickHouse/ClickHouse/pull/9634) ([Azat Khuzhin](https://github.com/azat)) +* Added support of `MATERIALIZE TTL IN PARTITION`. [#9581](https://github.com/ClickHouse/ClickHouse/pull/9581) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Support complex types inside Avro nested fields [#10502](https://github.com/ClickHouse/ClickHouse/pull/10502) ([Andrew Onyshchuk](https://github.com/oandrew)) + +#### Performance Improvement +* Better insert logic for right table for Partial MergeJoin. [#10467](https://github.com/ClickHouse/ClickHouse/pull/10467) ([Artem Zuikov](https://github.com/4ertus2)) +* Improved performance of row-oriented formats (more than 10% for CSV and more than 35% for Avro in case of narrow tables). [#10503](https://github.com/ClickHouse/ClickHouse/pull/10503) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Improved performance of queries with explicitly defined sets at right side of IN operator and tuples on the left side. [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ)) +* Use less memory for hash table in HashJoin. [#10416](https://github.com/ClickHouse/ClickHouse/pull/10416) ([Artem Zuikov](https://github.com/4ertus2)) +* Special HashJoin over StorageDictionary. Allow rewrite `dictGet()` functions with JOINs. It's not backward incompatible itself but could uncover [#8400](https://github.com/ClickHouse/ClickHouse/issues/8400) on some installations. [#10133](https://github.com/ClickHouse/ClickHouse/pull/10133) ([Artem Zuikov](https://github.com/4ertus2)) +* Enable parallel insert of materialized view when its target table supports. [#10052](https://github.com/ClickHouse/ClickHouse/pull/10052) ([vxider](https://github.com/Vxider)) +* Improved performance of index analysis with monotonic functions. [#9607](https://github.com/ClickHouse/ClickHouse/pull/9607)[#10026](https://github.com/ClickHouse/ClickHouse/pull/10026) ([Anton Popov](https://github.com/CurtizJ)) +* Using SSE2 or SSE4.2 SIMD intrinsics to speed up tokenization in bloom filters. [#9968](https://github.com/ClickHouse/ClickHouse/pull/9968) ([Vasily Nemkov](https://github.com/Enmk)) +* Improved performance of queries with explicitly defined sets at right side of `IN` operator. This fixes performance regression in version 20.3. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740) ([Anton Popov](https://github.com/CurtizJ)) +* Now clickhouse-copier splits each partition in number of pieces and copies them independently. [#9075](https://github.com/ClickHouse/ClickHouse/pull/9075) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Adding more aggregation methods. For example TPC-H query 1 will now pick `FixedHashMap` and gets 25% performance gain [#9829](https://github.com/ClickHouse/ClickHouse/pull/9829) ([Amos Bird](https://github.com/amosbird)) +* Use single row counter for multiple streams in pre-limit transform. This helps to avoid uniting pipeline streams in queries with `limit` but without `order by` (like `select f(x) from (select x from t limit 1000000000)`) and use multiple threads for further processing. [#9602](https://github.com/ClickHouse/ClickHouse/pull/9602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Build/Testing/Packaging Improvement +* Use a fork of AWS SDK libraries from ClickHouse-Extras [#10527](https://github.com/ClickHouse/ClickHouse/pull/10527) ([Pavel Kovalenko](https://github.com/Jokser)) +* Add integration tests for new ALTER RENAME COLUMN query. [#10654](https://github.com/ClickHouse/ClickHouse/pull/10654) ([vzakaznikov](https://github.com/vzakaznikov)) +* Fix possible signed integer overflow in invocation of function `now64` with wrong arguments. This fixes [#8973](https://github.com/ClickHouse/ClickHouse/issues/8973) [#10511](https://github.com/ClickHouse/ClickHouse/pull/10511) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Split fuzzer and sanitizer configurations to make build config compatible with Oss-fuzz. [#10494](https://github.com/ClickHouse/ClickHouse/pull/10494) ([kyprizel](https://github.com/kyprizel)) +* Fixes for clang-tidy on clang-10. [#10420](https://github.com/ClickHouse/ClickHouse/pull/10420) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Display absolute paths in error messages. Otherwise KDevelop fails to navigate to correct file and opens a new file instead. [#10434](https://github.com/ClickHouse/ClickHouse/pull/10434) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `ASAN_OPTIONS` environment variable to investigate errors in CI stress tests with Address sanitizer. [#10440](https://github.com/ClickHouse/ClickHouse/pull/10440) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Enable ThinLTO for clang builds (experimental). [#10435](https://github.com/ClickHouse/ClickHouse/pull/10435) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove accidential dependency on Z3 that may be introduced if the system has Z3 solver installed. [#10426](https://github.com/ClickHouse/ClickHouse/pull/10426) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Move integration tests docker files to docker/ directory. [#10335](https://github.com/ClickHouse/ClickHouse/pull/10335) ([Ilya Yatsishin](https://github.com/qoega)) +* Allow to use `clang-10` in CI. It ensures that [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238) is fixed. [#10384](https://github.com/ClickHouse/ClickHouse/pull/10384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update OpenSSL to upstream master. Fixed the issue when TLS connections may fail with the message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error` and `SSL Exception: error:2400006E:random number generator::error retrieving entropy`. The issue was present in version 20.1. [#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix clang-10 build. [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238) [#10370](https://github.com/ClickHouse/ClickHouse/pull/10370) ([Amos Bird](https://github.com/amosbird)) +* Add performance test for [Parallel INSERT for materialized view](https://github.com/ClickHouse/ClickHouse/pull/10052). [#10345](https://github.com/ClickHouse/ClickHouse/pull/10345) ([vxider](https://github.com/Vxider)) +* Fix flaky test `test_settings_constraints_distributed.test_insert_clamps_settings`. [#10346](https://github.com/ClickHouse/ClickHouse/pull/10346) ([Vitaly Baranov](https://github.com/vitlibar)) +* Add util to test results upload in CI ClickHouse [#10330](https://github.com/ClickHouse/ClickHouse/pull/10330) ([Ilya Yatsishin](https://github.com/qoega)) +* Convert test results to JSONEachRow format in junit_to_html tool [#10323](https://github.com/ClickHouse/ClickHouse/pull/10323) ([Ilya Yatsishin](https://github.com/qoega)) +* Update cctz. [#10215](https://github.com/ClickHouse/ClickHouse/pull/10215) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow to create HTML report from the purest JUnit XML report. [#10247](https://github.com/ClickHouse/ClickHouse/pull/10247) ([Ilya Yatsishin](https://github.com/qoega)) +* Update the check for minimal compiler version. Fix the root cause of the issue [#10250](https://github.com/ClickHouse/ClickHouse/issues/10250) [#10256](https://github.com/ClickHouse/ClickHouse/pull/10256) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Initial support for live view tables over distributed [#10179](https://github.com/ClickHouse/ClickHouse/pull/10179) ([vzakaznikov](https://github.com/vzakaznikov)) +* Fix (false) MSan report in MergeTreeIndexFullText. The issue first appeared in [#9968](https://github.com/ClickHouse/ClickHouse/issues/9968). [#10801](https://github.com/ClickHouse/ClickHouse/pull/10801) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* clickhouse-docker-util [#10151](https://github.com/ClickHouse/ClickHouse/pull/10151) ([filimonov](https://github.com/filimonov)) +* Update pdqsort to recent version [#10171](https://github.com/ClickHouse/ClickHouse/pull/10171) ([Ivan](https://github.com/abyss7)) +* Update libdivide to v3.0 [#10169](https://github.com/ClickHouse/ClickHouse/pull/10169) ([Ivan](https://github.com/abyss7)) +* Add check with enabled polymorphic parts. [#10086](https://github.com/ClickHouse/ClickHouse/pull/10086) ([Anton Popov](https://github.com/CurtizJ)) +* Add cross-compile build for FreeBSD. This fixes [#9465](https://github.com/ClickHouse/ClickHouse/issues/9465) [#9643](https://github.com/ClickHouse/ClickHouse/pull/9643) ([Ivan](https://github.com/abyss7)) +* Add performance test for [#6924](https://github.com/ClickHouse/ClickHouse/issues/6924) [#6980](https://github.com/ClickHouse/ClickHouse/pull/6980) ([filimonov](https://github.com/filimonov)) +* Add support of `/dev/null` in the `File` engine for better performance testing [#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Bird](https://github.com/amosbird)) +* Move all folders inside /dbms one level up [#9974](https://github.com/ClickHouse/ClickHouse/pull/9974) ([Ivan](https://github.com/abyss7)) +* Add a test that checks that read from MergeTree with single thread is performed in order. Addition to [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670) [#9762](https://github.com/ClickHouse/ClickHouse/pull/9762) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix the `00964_live_view_watch_events_heartbeat.py` test to avoid race condition. [#9944](https://github.com/ClickHouse/ClickHouse/pull/9944) ([vzakaznikov](https://github.com/vzakaznikov)) +* Fix integration test `test_settings_constraints` [#9962](https://github.com/ClickHouse/ClickHouse/pull/9962) ([Vitaly Baranov](https://github.com/vitlibar)) +* Every function in its own file, part 12. [#9922](https://github.com/ClickHouse/ClickHouse/pull/9922) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added performance test for the case of extremely slow analysis of array of tuples. [#9872](https://github.com/ClickHouse/ClickHouse/pull/9872) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update zstd to 1.4.4. It has some minor improvements in performance and compression ratio. If you run replicas with different versions of ClickHouse you may see reasonable error messages `Data after merge is not byte-identical to data on another replicas.` with explanation. These messages are Ok and you should not worry. [#10663](https://github.com/ClickHouse/ClickHouse/pull/10663) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix TSan report in `system.stack_trace`. [#9832](https://github.com/ClickHouse/ClickHouse/pull/9832) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Removed dependency on `clock_getres`. [#9833](https://github.com/ClickHouse/ClickHouse/pull/9833) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added identifier names check with clang-tidy. [#9799](https://github.com/ClickHouse/ClickHouse/pull/9799) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update "builder" docker image. This image is not used in CI but is useful for developers. [#9809](https://github.com/ClickHouse/ClickHouse/pull/9809) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove old `performance-test` tool that is no longer used in CI. `clickhouse-performance-test` is great but now we are using way superior tool that is doing comparison testing with sophisticated statistical formulas to achieve confident results regardless to various changes in environment. [#9796](https://github.com/ClickHouse/ClickHouse/pull/9796) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added most of clang-static-analyzer checks. [#9765](https://github.com/ClickHouse/ClickHouse/pull/9765) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update Poco to 1.9.3 in preparation for MongoDB URI support. [#6892](https://github.com/ClickHouse/ClickHouse/pull/6892) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix build with `-DUSE_STATIC_LIBRARIES=0 -DENABLE_JEMALLOC=0` [#9651](https://github.com/ClickHouse/ClickHouse/pull/9651) ([Artem Zuikov](https://github.com/4ertus2)) +* For change log script, if merge commit was cherry-picked to release branch, take PR name from commit description. [#9708](https://github.com/ClickHouse/ClickHouse/pull/9708) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Support `vX.X-conflicts` tag in backport script. [#9705](https://github.com/ClickHouse/ClickHouse/pull/9705) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix `auto-label` for backporting script. [#9685](https://github.com/ClickHouse/ClickHouse/pull/9685) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Use libc++ in Darwin cross-build to make it consistent with native build. [#9665](https://github.com/ClickHouse/ClickHouse/pull/9665) ([Hui Wang](https://github.com/huiwang)) +* Fix flacky test `01017_uniqCombined_memory_usage`. Continuation of [#7236](https://github.com/ClickHouse/ClickHouse/issues/7236). [#9667](https://github.com/ClickHouse/ClickHouse/pull/9667) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix build for native macOS Clang compiler [#9649](https://github.com/ClickHouse/ClickHouse/pull/9649) ([Ivan](https://github.com/abyss7)) +* Allow to add various glitches around `pthread_mutex_lock`, `pthread_mutex_unlock` functions. [#9635](https://github.com/ClickHouse/ClickHouse/pull/9635) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add support for `clang-tidy` in `packager` script. [#9625](https://github.com/ClickHouse/ClickHouse/pull/9625) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add ability to use unbundled msgpack. [#10168](https://github.com/ClickHouse/ClickHouse/pull/10168) ([Azat Khuzhin](https://github.com/azat)) + + +## ClickHouse release v20.3 + + +### ClickHouse release v20.3.21.2-lts, 2020-11-02 + +#### Bug Fix + +* Fix dictGet in sharding_key (and similar places, i.e. when the function context is stored permanently). [#16205](https://github.com/ClickHouse/ClickHouse/pull/16205) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect empty result for query from `Distributed` table if query has `WHERE`, `PREWHERE` and `GLOBAL IN`. Fixes [#15792](https://github.com/ClickHouse/ClickHouse/issues/15792). [#15933](https://github.com/ClickHouse/ClickHouse/pull/15933) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix missing or excessive headers in `TSV/CSVWithNames` formats. This fixes [#12504](https://github.com/ClickHouse/ClickHouse/issues/12504). [#13343](https://github.com/ClickHouse/ClickHouse/pull/13343) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.3.20.6-lts, 2020-10-09 + +#### Bug Fix + +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15724](https://github.com/ClickHouse/ClickHouse/pull/15724), [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). +* Fix hang of queries with a lot of subqueries to same table of `MySQL` engine. Previously, if there were more than 16 subqueries to same `MySQL` table in query, it hang forever. [#15299](https://github.com/ClickHouse/ClickHouse/pull/15299) ([Anton Popov](https://github.com/CurtizJ)). +* Fix 'Unknown identifier' in GROUP BY when query has JOIN over Merge table. [#15242](https://github.com/ClickHouse/ClickHouse/pull/15242) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix to make predicate push down work when subquery contains finalizeAggregation function. Fixes [#14847](https://github.com/ClickHouse/ClickHouse/issues/14847). [#14937](https://github.com/ClickHouse/ClickHouse/pull/14937) ([filimonov](https://github.com/filimonov)). +* Concurrent `ALTER ... REPLACE/MOVE PARTITION ...` queries might cause deadlock. It's fixed. [#13626](https://github.com/ClickHouse/ClickHouse/pull/13626) ([tavplubix](https://github.com/tavplubix)). + + +### ClickHouse release v20.3.19.4-lts, 2020-09-18 + +#### Bug Fix + +* Fix rare error in `SELECT` queries when the queried column has `DEFAULT` expression which depends on the other column which also has `DEFAULT` and not present in select query and not exists on disk. Partially fixes [#14531](https://github.com/ClickHouse/ClickHouse/issues/14531). [#14845](https://github.com/ClickHouse/ClickHouse/pull/14845) ([alesapin](https://github.com/alesapin)). +* Fix bug when `ALTER UPDATE` mutation with Nullable column in assignment expression and constant value (like `UPDATE x = 42`) leads to incorrect value in column or segfault. Fixes [#13634](https://github.com/ClickHouse/ClickHouse/issues/13634), [#14045](https://github.com/ClickHouse/ClickHouse/issues/14045). [#14646](https://github.com/ClickHouse/ClickHouse/pull/14646) ([alesapin](https://github.com/alesapin)). +* Fix wrong Decimal multiplication result caused wrong decimal scale of result column. [#14603](https://github.com/ClickHouse/ClickHouse/pull/14603) ([Artem Zuikov](https://github.com/4ertus2)). + +#### Improvement + +* Support custom codecs in compact parts. [#12183](https://github.com/ClickHouse/ClickHouse/pull/12183) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.3.18.10-lts, 2020-09-08 + +#### Bug Fix + +* Stop query execution if exception happened in `PipelineExecutor` itself. This could prevent rare possible query hung. Continuation of [#14334](https://github.com/ClickHouse/ClickHouse/issues/14334). [#14402](https://github.com/ClickHouse/ClickHouse/pull/14402) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the behaviour when sometimes cache-dictionary returned default value instead of present value from source. [#13624](https://github.com/ClickHouse/ClickHouse/pull/13624) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix parsing row policies from users.xml when names of databases or tables contain dots. This fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779), [#12527](https://github.com/ClickHouse/ClickHouse/issues/12527). [#13199](https://github.com/ClickHouse/ClickHouse/pull/13199) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix CAST(Nullable(String), Enum()). [#12745](https://github.com/ClickHouse/ClickHouse/pull/12745) ([Azat Khuzhin](https://github.com/azat)). +* Fixed data race in `text_log`. It does not correspond to any real bug. [#9726](https://github.com/ClickHouse/ClickHouse/pull/9726) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Improvement + +* Fix wrong error for long queries. It was possible to get syntax error other than `Max query size exceeded` for correct query. [#13928](https://github.com/ClickHouse/ClickHouse/pull/13928) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Return NULL/zero when value is not parsed completely in parseDateTimeBestEffortOrNull/Zero functions. This fixes [#7876](https://github.com/ClickHouse/ClickHouse/issues/7876). [#11653](https://github.com/ClickHouse/ClickHouse/pull/11653) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement + +* Slightly optimize very short queries with LowCardinality. [#14129](https://github.com/ClickHouse/ClickHouse/pull/14129) ([Anton Popov](https://github.com/CurtizJ)). + +#### Build/Testing/Packaging Improvement + +* Fix UBSan report (adding zero to nullptr) in HashTable that appeared after migration to clang-10. [#10638](https://github.com/ClickHouse/ClickHouse/pull/10638) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.3.17.173-lts, 2020-08-15 + +#### Bug Fix + +* Fix crash in JOIN with StorageMerge and `set enable_optimize_predicate_expression=1`. [#13679](https://github.com/ClickHouse/ClickHouse/pull/13679) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix invalid return type for comparison of tuples with `NULL` elements. Fixes [#12461](https://github.com/ClickHouse/ClickHouse/issues/12461). [#13420](https://github.com/ClickHouse/ClickHouse/pull/13420) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix queries with constant columns and `ORDER BY` prefix of primary key. [#13396](https://github.com/ClickHouse/ClickHouse/pull/13396) ([Anton Popov](https://github.com/CurtizJ)). +* Return passed number for numbers with MSB set in roundUpToPowerOfTwoOrZero(). [#13234](https://github.com/ClickHouse/ClickHouse/pull/13234) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v20.3.16.165-lts 2020-08-10 + +#### Bug Fix + +* Fixed error in `parseDateTimeBestEffort` function when unix timestamp was passed as an argument. This fixes [#13362](https://github.com/ClickHouse/ClickHouse/issues/13362). [#13441](https://github.com/ClickHouse/ClickHouse/pull/13441) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potentially low performance and slightly incorrect result for `uniqExact`, `topK`, `sumDistinct` and similar aggregate functions called on Float types with `NaN` values. It also triggered assert in debug build. This fixes [#12491](https://github.com/ClickHouse/ClickHouse/issues/12491). [#13254](https://github.com/ClickHouse/ClickHouse/pull/13254) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function if with nullable constexpr as cond that is not literal NULL. Fixes [#12463](https://github.com/ClickHouse/ClickHouse/issues/12463). [#13226](https://github.com/ClickHouse/ClickHouse/pull/13226) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed assert in `arrayElement` function in case of array elements are Nullable and array subscript is also Nullable. This fixes [#12172](https://github.com/ClickHouse/ClickHouse/issues/12172). [#13224](https://github.com/ClickHouse/ClickHouse/pull/13224) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed unnecessary limiting for the number of threads for selects from local replica. [#12840](https://github.com/ClickHouse/ClickHouse/pull/12840) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible extra overflow row in data which could appear for queries `WITH TOTALS`. [#12747](https://github.com/ClickHouse/ClickHouse/pull/12747) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed performance with large tuples, which are interpreted as functions in `IN` section. The case when user write `WHERE x IN tuple(1, 2, ...)` instead of `WHERE x IN (1, 2, ...)` for some obscure reason. [#12700](https://github.com/ClickHouse/ClickHouse/pull/12700) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed memory tracking for input_format_parallel_parsing (by attaching thread to group). [#12672](https://github.com/ClickHouse/ClickHouse/pull/12672) ([Azat Khuzhin](https://github.com/azat)). +* Fixed [#12293](https://github.com/ClickHouse/ClickHouse/issues/12293) allow push predicate when subquery contains with clause. [#12663](https://github.com/ClickHouse/ClickHouse/pull/12663) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed [#10572](https://github.com/ClickHouse/ClickHouse/issues/10572) fix bloom filter index with const expression. [#12659](https://github.com/ClickHouse/ClickHouse/pull/12659) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed SIGSEGV in StorageKafka when broker is unavailable (and not only). [#12658](https://github.com/ClickHouse/ClickHouse/pull/12658) ([Azat Khuzhin](https://github.com/azat)). +* Fixed race condition in external dictionaries with cache layout which can lead server crash. [#12566](https://github.com/ClickHouse/ClickHouse/pull/12566) ([alesapin](https://github.com/alesapin)). +* Fixed bug which lead to broken old parts after `ALTER DELETE` query when `enable_mixed_granularity_parts=1`. Fixes [#12536](https://github.com/ClickHouse/ClickHouse/issues/12536). [#12543](https://github.com/ClickHouse/ClickHouse/pull/12543) ([alesapin](https://github.com/alesapin)). +* Better exception for function `in` with invalid number of arguments. [#12529](https://github.com/ClickHouse/ClickHouse/pull/12529) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed performance issue, while reading from compact parts. [#12492](https://github.com/ClickHouse/ClickHouse/pull/12492) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed the deadlock if `text_log` is enabled. [#12452](https://github.com/ClickHouse/ClickHouse/pull/12452) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault if StorageMerge. Closes [#12054](https://github.com/ClickHouse/ClickHouse/issues/12054). [#12401](https://github.com/ClickHouse/ClickHouse/pull/12401) ([tavplubix](https://github.com/tavplubix)). +* Fixed `TOTALS/ROLLUP/CUBE` for aggregate functions with `-State` and `Nullable` arguments. This fixes [#12163](https://github.com/ClickHouse/ClickHouse/issues/12163). [#12376](https://github.com/ClickHouse/ClickHouse/pull/12376) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed order of columns in `WITH FILL` modifier. Previously order of columns of `ORDER BY` statement wasn't respected. [#12306](https://github.com/ClickHouse/ClickHouse/pull/12306) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid "bad cast" exception when there is an expression that filters data by virtual columns (like `_table` in `Merge` tables) or by "index" columns in system tables such as filtering by database name when querying from `system.tables`, and this expression returns `Nullable` type. This fixes [#12166](https://github.com/ClickHouse/ClickHouse/issues/12166). [#12305](https://github.com/ClickHouse/ClickHouse/pull/12305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Show error after `TrieDictionary` failed to load. [#12290](https://github.com/ClickHouse/ClickHouse/pull/12290) ([Vitaly Baranov](https://github.com/vitlibar)). +* The function `arrayFill` worked incorrectly for empty arrays that may lead to crash. This fixes [#12263](https://github.com/ClickHouse/ClickHouse/issues/12263). [#12279](https://github.com/ClickHouse/ClickHouse/pull/12279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement conversions to the common type for `LowCardinality` types. This allows to execute UNION ALL of tables with columns of LowCardinality and other columns. This fixes [#8212](https://github.com/ClickHouse/ClickHouse/issues/8212). This fixes [#4342](https://github.com/ClickHouse/ClickHouse/issues/4342). [#12275](https://github.com/ClickHouse/ClickHouse/pull/12275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behaviour when during multiple sequential inserts in `StorageFile` header for some special types was written more than once. This fixed [#6155](https://github.com/ClickHouse/ClickHouse/issues/6155). [#12197](https://github.com/ClickHouse/ClickHouse/pull/12197) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed logical functions for UInt8 values when they are not equal to 0 or 1. [#12196](https://github.com/ClickHouse/ClickHouse/pull/12196) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed `dictGet` arguments check during GROUP BY injective functions elimination. [#12179](https://github.com/ClickHouse/ClickHouse/pull/12179) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong logic in `ALTER DELETE` that leads to deleting of records when condition evaluates to NULL. This fixes [#9088](https://github.com/ClickHouse/ClickHouse/issues/9088). This closes [#12106](https://github.com/ClickHouse/ClickHouse/issues/12106). [#12153](https://github.com/ClickHouse/ClickHouse/pull/12153) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed transform of query to send to external DBMS (e.g. MySQL, ODBC) in presense of aliases. This fixes [#12032](https://github.com/ClickHouse/ClickHouse/issues/12032). [#12151](https://github.com/ClickHouse/ClickHouse/pull/12151) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential overflow in integer division. This fixes [#12119](https://github.com/ClickHouse/ClickHouse/issues/12119). [#12140](https://github.com/ClickHouse/ClickHouse/pull/12140) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential infinite loop in `greatCircleDistance`, `geoDistance`. This fixes [#12117](https://github.com/ClickHouse/ClickHouse/issues/12117). [#12137](https://github.com/ClickHouse/ClickHouse/pull/12137) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid `There is no query` exception for materialized views with joins or with subqueries attached to system logs (system.query_log, metric_log, etc) or to engine=Buffer underlying table. [#12120](https://github.com/ClickHouse/ClickHouse/pull/12120) ([filimonov](https://github.com/filimonov)). +* Fixed performance for selects with `UNION` caused by wrong limit for the total number of threads. Fixes [#12030](https://github.com/ClickHouse/ClickHouse/issues/12030). [#12103](https://github.com/ClickHouse/ClickHouse/pull/12103) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed segfault with `-StateResample` combinators. [#12092](https://github.com/ClickHouse/ClickHouse/pull/12092) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed unnecessary limiting the number of threads for selects from `VIEW`. Fixes [#11937](https://github.com/ClickHouse/ClickHouse/issues/11937). [#12085](https://github.com/ClickHouse/ClickHouse/pull/12085) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible crash while using wrong type for `PREWHERE`. Fixes [#12053](https://github.com/ClickHouse/ClickHouse/issues/12053), [#12060](https://github.com/ClickHouse/ClickHouse/issues/12060). [#12060](https://github.com/ClickHouse/ClickHouse/pull/12060) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Expected single dictionary argument for function` for function `defaultValueOfArgumentType` with `LowCardinality` type. Fixes [#11808](https://github.com/ClickHouse/ClickHouse/issues/11808). [#12056](https://github.com/ClickHouse/ClickHouse/pull/12056) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Cannot capture column` for higher-order functions with `Tuple(LowCardinality)` argument. Fixes [#9766](https://github.com/ClickHouse/ClickHouse/issues/9766). [#12055](https://github.com/ClickHouse/ClickHouse/pull/12055) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Parse tables metadata in parallel when loading database. This fixes slow server startup when there are large number of tables. [#12045](https://github.com/ClickHouse/ClickHouse/pull/12045) ([tavplubix](https://github.com/tavplubix)). +* Make `topK` aggregate function return Enum for Enum types. This fixes [#3740](https://github.com/ClickHouse/ClickHouse/issues/3740). [#12043](https://github.com/ClickHouse/ClickHouse/pull/12043) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed constraints check if constraint is a constant expression. This fixes [#11360](https://github.com/ClickHouse/ClickHouse/issues/11360). [#12042](https://github.com/ClickHouse/ClickHouse/pull/12042) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect comparison of tuples with `Nullable` columns. Fixes [#11985](https://github.com/ClickHouse/ClickHouse/issues/11985). [#12039](https://github.com/ClickHouse/ClickHouse/pull/12039) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed wrong result and potential crash when invoking function `if` with arguments of type `FixedString` with different sizes. This fixes [#11362](https://github.com/ClickHouse/ClickHouse/issues/11362). [#12021](https://github.com/ClickHouse/ClickHouse/pull/12021) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* A query with function `neighbor` as the only returned expression may return empty result if the function is called with offset `-9223372036854775808`. This fixes [#11367](https://github.com/ClickHouse/ClickHouse/issues/11367). [#12019](https://github.com/ClickHouse/ClickHouse/pull/12019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential array size overflow in generateRandom that may lead to crash. This fixes [#11371](https://github.com/ClickHouse/ClickHouse/issues/11371). [#12013](https://github.com/ClickHouse/ClickHouse/pull/12013) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential floating point exception. This closes [#11378](https://github.com/ClickHouse/ClickHouse/issues/11378). [#12005](https://github.com/ClickHouse/ClickHouse/pull/12005) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong setting name in log message at server startup. [#11997](https://github.com/ClickHouse/ClickHouse/pull/11997) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Query parameter was not set` in `Values` format. Fixes [#11918](https://github.com/ClickHouse/ClickHouse/issues/11918). [#11936](https://github.com/ClickHouse/ClickHouse/pull/11936) ([tavplubix](https://github.com/tavplubix)). +* Keep aliases for substitutions in query (parametrized queries). This fixes [#11914](https://github.com/ClickHouse/ClickHouse/issues/11914). [#11916](https://github.com/ClickHouse/ClickHouse/pull/11916) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed potential floating point exception when parsing DateTime64. This fixes [#11374](https://github.com/ClickHouse/ClickHouse/issues/11374). [#11875](https://github.com/ClickHouse/ClickHouse/pull/11875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed memory accounting via `HTTP` interface (can be significant with `wait_end_of_query=1`). [#11840](https://github.com/ClickHouse/ClickHouse/pull/11840) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong result for `if()` with NULLs in condition. [#11807](https://github.com/ClickHouse/ClickHouse/pull/11807) ([Artem Zuikov](https://github.com/4ertus2)). +* Parse metadata stored in zookeeper before checking for equality. [#11739](https://github.com/ClickHouse/ClickHouse/pull/11739) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `LIMIT n WITH TIES` usage together with `ORDER BY` statement, which contains aliases. [#11689](https://github.com/ClickHouse/ClickHouse/pull/11689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix potential read of uninitialized memory in cache dictionary. [#10834](https://github.com/ClickHouse/ClickHouse/pull/10834) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvement + +* Index not used for IN operator with literals, performance regression introduced around v19.3. This fixes [#10574](https://github.com/ClickHouse/ClickHouse/issues/10574). [#12062](https://github.com/ClickHouse/ClickHouse/pull/12062) ([nvartolomei](https://github.com/nvartolomei)). + + +### ClickHouse release v20.3.12.112-lts 2020-06-25 + +#### Bug Fix + +* Fix rare crash caused by using `Nullable` column in prewhere condition. Continuation of [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix using too many threads for queries. [#11788](https://github.com/ClickHouse/ClickHouse/pull/11788) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Now replicated fetches will be cancelled during metadata alter. [#11744](https://github.com/ClickHouse/ClickHouse/pull/11744) ([alesapin](https://github.com/alesapin)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error which leads to an incorrect state of `system.mutations`. It may show that whole mutation is already done but the server still has `MUTATE_PART` tasks in the replication queue and tries to execute them. This fixes [#11611](https://github.com/ClickHouse/ClickHouse/issues/11611). [#11681](https://github.com/ClickHouse/ClickHouse/pull/11681) ([alesapin](https://github.com/alesapin)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove trivial count query optimization if row-level security is set. In previous versions the user get total count of records in a table instead filtered. This fixes [#11352](https://github.com/ClickHouse/ClickHouse/issues/11352). [#11644](https://github.com/ClickHouse/ClickHouse/pull/11644) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. (Probably it is connected with [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix error `Block structure mismatch` for queries with sampling reading from `Buffer` table. [#11602](https://github.com/ClickHouse/ClickHouse/pull/11602) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when exception.code() % 256 = 0. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* All queries in HTTP session have had the same query_id. It is fixed. [#11578](https://github.com/ClickHouse/ClickHouse/pull/11578) ([tavplubix](https://github.com/tavplubix)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix shard_num/replica_num for `` (breaks use_compact_format_in_distributed_parts_names). [#11528](https://github.com/ClickHouse/ClickHouse/pull/11528) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak when exception is thrown in the middle of aggregation with -State functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong results of distributed queries when alias could override qualified column name. Fixes [#9672](https://github.com/ClickHouse/ClickHouse/issues/9672) [#9714](https://github.com/ClickHouse/ClickHouse/issues/9714). [#9972](https://github.com/ClickHouse/ClickHouse/pull/9972) ([Artem Zuikov](https://github.com/4ertus2)). + + +### ClickHouse release v20.3.11.97-lts 2020-06-10 + +#### New Feature + +* Now ClickHouse controls timeouts of dictionary sources on its side. Two new settings added to cache dictionary configuration: `strict_max_lifetime_seconds`, which is `max_lifetime` by default and `query_wait_timeout_milliseconds`, which is one minute by default. The first settings is also useful with `allow_read_expired_keys` settings (to forbid reading very expired keys). [#10337](https://github.com/ClickHouse/ClickHouse/pull/10337) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix + +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix pointInPolygon with nan as point. Fixes [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Fix crash in JOIN over LowCarinality(T) and Nullable(T). [#11380](https://github.com/ClickHouse/ClickHouse/issues/11380). [#11414](https://github.com/ClickHouse/ClickHouse/pull/11414) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix error code for wrong `USING` key. [#11373](https://github.com/ClickHouse/ClickHouse/issues/11373). [#11404](https://github.com/ClickHouse/ClickHouse/pull/11404) ([Artem Zuikov](https://github.com/4ertus2)). +* Fixed geohashesInBox with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Better errors for `joinGet()` functions. [#11389](https://github.com/ClickHouse/ClickHouse/pull/11389) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove redundant lock during parts send in ReplicatedMergeTree. [#11354](https://github.com/ClickHouse/ClickHouse/pull/11354) ([alesapin](https://github.com/alesapin)). +* Fix support for `\G` (vertical output) in clickhouse-client in multiline mode. This closes [#9933](https://github.com/ClickHouse/ClickHouse/issues/9933). [#11350](https://github.com/ClickHouse/ClickHouse/pull/11350) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash in direct selects from StorageJoin (without JOIN) and wrong nullability. [#11340](https://github.com/ClickHouse/ClickHouse/pull/11340) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Now merges stopped before change metadata in `ALTER` queries. [#11335](https://github.com/ClickHouse/ClickHouse/pull/11335) ([alesapin](https://github.com/alesapin)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix visitParamExtractRaw when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash while reading malformed data in Protobuf format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed a bug when cache-dictionary could return default value instead of normal (when there are only expired keys). This affects only string fields. [#11233](https://github.com/ClickHouse/ClickHouse/pull/11233) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix error `Block structure mismatch in QueryPipeline` while reading from `VIEW` with constants in inner query. Fixes [#11181](https://github.com/ClickHouse/ClickHouse/issues/11181). [#11205](https://github.com/ClickHouse/ClickHouse/pull/11205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible exception `Invalid status for associated output`. [#11200](https://github.com/ClickHouse/ClickHouse/pull/11200) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed S3 globbing which could fail in case of more than 1000 keys and some backends. [#11179](https://github.com/ClickHouse/ClickHouse/pull/11179) ([Vladimir Chebotarev](https://github.com/excitoon)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Fix excessive reserving of threads for simple queries (optimization for reducing the number of threads, which was partly broken after changes in pipeline). [#11114](https://github.com/ClickHouse/ClickHouse/pull/11114) ([Azat Khuzhin](https://github.com/azat)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). +* Introduce commit retry logic to decrease the possibility of getting duplicates from Kafka in rare cases when offset commit was failed. [#9884](https://github.com/ClickHouse/ClickHouse/pull/9884) ([filimonov](https://github.com/filimonov)). + +#### Performance Improvement + +* Get dictionary and check access rights only once per each call of any function reading external dictionaries. [#10928](https://github.com/ClickHouse/ClickHouse/pull/10928) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement + +* Fix several flaky integration tests. [#11355](https://github.com/ClickHouse/ClickHouse/pull/11355) ([alesapin](https://github.com/alesapin)). + +### ClickHouse release v20.3.10.75-lts 2020-05-23 + +#### Bug Fix + +* Removed logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed `parseDateTime64BestEffort` argument resolution bugs. [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed incorrect raw data size in method `getRawData()`. [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fixed incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of `GROUP BY` result is large and aggregation is performed by a single `String` field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed backward compatibility with tuples in `Distributed` tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `SIGSEGV` in `StringHashTable` if such a key does not exist. [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Fixed columns order after `Block::sortColumns()`. [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fixed the issue with `ODBC` bridge when no quoting of identifiers is requested. Fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `UBSan` and `MSan` report in `DateLUT`. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed incorrect type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Fixed `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed combinator -`OrNull` and `-OrDefault` when combined with `-State`. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fixed crash in `generateRandom` with nested types. Fixes [#10583](https://github.com/ClickHouse/ClickHouse/issues/10583). [#10734](https://github.com/ClickHouse/ClickHouse/pull/10734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible buffer overflow in function `h3EdgeAngle`. [#10711](https://github.com/ClickHouse/ClickHouse/pull/10711) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed disappearing totals. Totals could have being filtered if query had had join or subquery with external where condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed multiple usages of `IN` operator with the identical set in one query. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed bug, which causes http requests stuck on client close when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. Fixes [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). +* Fixed order of parameters in `AggregateTransform` constructor. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). +* Fixed the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed possible incorrect number of rows for queries with `LIMIT`. Fixes [#10566](https://github.com/ClickHouse/ClickHouse/issues/10566), [#10709](https://github.com/ClickHouse/ClickHouse/issues/10709). [#10660](https://github.com/ClickHouse/ClickHouse/pull/10660) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed a bug which locks concurrent alters when table has a lot of parts. [#10659](https://github.com/ClickHouse/ClickHouse/pull/10659) ([alesapin](https://github.com/alesapin)). +* Fixed a bug when on `SYSTEM DROP DNS CACHE` query also drop caches, which are used to check if user is allowed to connect from some IP addresses. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `SELECT` of column `ALIAS` which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* Implemented comparison between DateTime64 and String values. [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed index corruption, which may occur in some cases after merge compact parts into another compact part. [#10531](https://github.com/ClickHouse/ClickHouse/pull/10531) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed the situation, when mutation finished all parts, but hung up in `is_done=0`. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)). +* Fixed overflow at beginning of unix epoch for timezones with fractional offset from `UTC`. This fixes [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed improper shutdown of `Distributed` storage. [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)). +* Fixed numeric overflow in `simpleLinearRegression` over large integers. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)). + + +#### Build/Testing/Packaging Improvement + +* Fix UBSan report in LZ4 library. [#10631](https://github.com/ClickHouse/ClickHouse/pull/10631) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix clang-10 build. [#10238](https://github.com/ClickHouse/ClickHouse/issues/10238). [#10370](https://github.com/ClickHouse/ClickHouse/pull/10370) ([Amos Bird](https://github.com/amosbird)). +* Added failing tests about `max_rows_to_sort` setting. [#10268](https://github.com/ClickHouse/ClickHouse/pull/10268) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added some improvements in printing diagnostic info in input formats. Fixes [#10204](https://github.com/ClickHouse/ClickHouse/issues/10204). [#10418](https://github.com/ClickHouse/ClickHouse/pull/10418) ([tavplubix](https://github.com/tavplubix)). +* Added CA certificates to clickhouse-server docker image. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)). + +#### Bug fix + +* Fix error `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). + + +### ClickHouse release v20.3.8.53, 2020-04-23 + +#### Bug Fix +* Fixed wrong behaviour of datetime functions for timezones that has altered between positive and negative offsets from UTC (e.g. Pacific/Kiritimati). This fixes [#7202](https://github.com/ClickHouse/ClickHouse/issues/7202) [#10369](https://github.com/ClickHouse/ClickHouse/pull/10369) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix possible segfault with `distributed_group_by_no_merge` enabled (introduced in 20.3.7.46 by [#10131](https://github.com/ClickHouse/ClickHouse/issues/10131)). [#10399](https://github.com/ClickHouse/ClickHouse/pull/10399) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix wrong flattening of `Array(Tuple(...))` data types. This fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259) [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Drop disks reservation in Aggregator. This fixes bug in disk space reservation, which may cause big external aggregation to fail even if it could be completed successfully [#10375](https://github.com/ClickHouse/ClickHouse/pull/10375) ([Azat Khuzhin](https://github.com/azat)) +* Fixed `DROP` vs `OPTIMIZE` race in `ReplicatedMergeTree`. `DROP` could left some garbage in replica path in ZooKeeper if there was concurrent `OPTIMIZE` query. [#10312](https://github.com/ClickHouse/ClickHouse/pull/10312) ([tavplubix](https://github.com/tavplubix)) +* Fix bug when server cannot attach table after column default was altered. [#10441](https://github.com/ClickHouse/ClickHouse/pull/10441) ([alesapin](https://github.com/alesapin)) +* Do not remove metadata directory when attach database fails before loading tables. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)) +* Fixed several bugs when some data was inserted with quorum, then deleted somehow (DROP PARTITION, TTL) and this leaded to the stuck of INSERTs or false-positive exceptions in SELECTs. This fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946) [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix possible `Pipeline stuck` error in `ConcatProcessor` which could have happened in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed wrong behavior in HashTable that caused compilation error when trying to read HashMap from buffer. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1)) +* Allow to use `count(*)` with multiple JOINs. Fixes [#9853](https://github.com/ClickHouse/ClickHouse/issues/9853) [#10291](https://github.com/ClickHouse/ClickHouse/pull/10291) ([Artem Zuikov](https://github.com/4ertus2)) +* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`, otherwise when both settings specified and there are no up-to-date replicas the query will fail (patch from @alex-zaitsev). Fixes: [#2564](https://github.com/ClickHouse/ClickHouse/issues/2564). [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)) +* Fix the issue when a query with ARRAY JOIN, ORDER BY and LIMIT may return incomplete result. This fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). Author: [Vadim Plakhtinskiy](https://github.com/VadimPlh). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Check the number and type of arguments when creating BloomFilter index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623) [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)) + +#### Performance Improvement +* Improved performance of queries with explicitly defined sets at right side of `IN` operator and tuples in the left side. This fixes performance regression in version 20.3. [#9740](https://github.com/ClickHouse/ClickHouse/pull/9740), [#10385](https://github.com/ClickHouse/ClickHouse/pull/10385) ([Anton Popov](https://github.com/CurtizJ)) + +### ClickHouse release v20.3.7.46, 2020-04-17 + +#### Bug Fix + +* Fix `Logical error: CROSS JOIN has expressions` error for queries with comma and names joins mix. [#10311](https://github.com/ClickHouse/ClickHouse/pull/10311) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix queries with `max_bytes_before_external_group_by`. [#10302](https://github.com/ClickHouse/ClickHouse/pull/10302) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix move-to-prewhere optimization in presense of arrayJoin functions (in certain cases). This fixes [#10092](https://github.com/ClickHouse/ClickHouse/issues/10092). [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the ability to relax the restriction on non-deterministic functions usage in mutations with `allow_nondeterministic_mutations` setting. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)). + +### ClickHouse release v20.3.6.40, 2020-04-16 + +#### New Feature + +* Added function `isConstant`. This function checks whether its argument is constant expression and returns 1 or 0. It is intended for development, debugging and demonstration purposes. [#10198](https://github.com/ClickHouse/ClickHouse/pull/10198) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix + +* Fix error `Pipeline stuck` with `max_rows_to_group_by` and `group_by_overflow_mode = 'break'`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix rare possible exception `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug where ClickHouse would throw "Unknown function lambda." error message when user tries to run ALTER UPDATE/DELETE on tables with ENGINE = Replicated*. Check for nondeterministic functions now handles lambda expressions correctly. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)). +* Fixed "generateRandom" function for Date type. This fixes [#9973](https://github.com/ClickHouse/ClickHouse/issues/9973). Fix an edge case when dates with year 2106 are inserted to MergeTree tables with old-style partitioning but partitions are named with year 1970. [#10218](https://github.com/ClickHouse/ClickHouse/pull/10218) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Convert types if the table definition of a View does not correspond to the SELECT query. This fixes [#10180](https://github.com/ClickHouse/ClickHouse/issues/10180) and [#10022](https://github.com/ClickHouse/ClickHouse/issues/10022). [#10217](https://github.com/ClickHouse/ClickHouse/pull/10217) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `parseDateTimeBestEffort` for strings in RFC-2822 when day of week is Tuesday or Thursday. This fixes [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082). [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix column names of constants inside JOIN that may clash with names of constants outside of JOIN. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible inifinite query execution when the query actually should stop on LIMIT, while reading from infinite source like `system.numbers` or `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix using the current database for access checking when the database isn't specified. [#10192](https://github.com/ClickHouse/ClickHouse/pull/10192) ([Vitaly Baranov](https://github.com/vitlibar)). +* Convert blocks if structure does not match on INSERT into Distributed(). [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible incorrect result for extremes in processors pipeline. [#10131](https://github.com/ClickHouse/ClickHouse/pull/10131) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix some kinds of alters with compact parts. [#10130](https://github.com/ClickHouse/ClickHouse/pull/10130) ([Anton Popov](https://github.com/CurtizJ)). +* Fix incorrect `index_granularity_bytes` check while creating new replica. Fixes [#10098](https://github.com/ClickHouse/ClickHouse/issues/10098). [#10121](https://github.com/ClickHouse/ClickHouse/pull/10121) ([alesapin](https://github.com/alesapin)). +* Fix SIGSEGV on INSERT into Distributed table when its structure differs from the underlying tables. [#10105](https://github.com/ClickHouse/ClickHouse/pull/10105) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible rows loss for queries with `JOIN` and `UNION ALL`. Fixes [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed replicated tables startup when updating from an old ClickHouse version where `/table/replicas/replica_name/metadata` node does not exist. Fixes [#10037](https://github.com/ClickHouse/ClickHouse/issues/10037). [#10095](https://github.com/ClickHouse/ClickHouse/pull/10095) ([alesapin](https://github.com/alesapin)). +* Add some arguments check and support identifier arguments for MySQL Database Engine. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)). +* Fix bug in clickhouse dictionary source from localhost clickhouse server. The bug may lead to memory corruption if types in dictionary and source are not compatible. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)). +* Fix bug in `CHECK TABLE` query when table contain skip indices. [#10068](https://github.com/ClickHouse/ClickHouse/pull/10068) ([alesapin](https://github.com/alesapin)). +* Fix error `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. It happened when setting `distributed_aggregation_memory_efficient` was enabled, and distributed query read aggregating data with different level from different shards (mixed single and two level aggregation). [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a segmentation fault that could occur in GROUP BY over string keys containing trailing zero bytes ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix the number of threads used for remote query execution (performance regression, since 20.3). This happened when query from `Distributed` table was executed simultaneously on local and remote shards. Fixes [#9965](https://github.com/ClickHouse/ClickHouse/issues/9965). [#9971](https://github.com/ClickHouse/ClickHouse/pull/9971) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug in which the necessary tables weren't retrieved at one of the processing stages of queries to some databases. Fixes [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)). +* Fix 'Not found column in block' error when `JOIN` appears with `TOTALS`. Fixes [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839). [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix a bug with `ON CLUSTER` DDL queries freezing on server startup. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)). +* Fix parsing multiple hosts set in the CREATE USER command, e.g. `CREATE USER user6 HOST NAME REGEXP 'lo.?*host', NAME REGEXP 'lo*host'`. [#9924](https://github.com/ClickHouse/ClickHouse/pull/9924) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `TRUNCATE` for Join table engine ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)). +* Fix "scalar does not exist" error in ALTERs ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)). +* Fix race condition between drop and optimize in `ReplicatedMergeTree`. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)). +* Fix error with qualified names in `distributed_product_mode='local'`. Fixes [#4756](https://github.com/ClickHouse/ClickHouse/issues/4756). [#9891](https://github.com/ClickHouse/ClickHouse/pull/9891) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix calculating grants for introspection functions from the setting 'allow_introspection_functions'. [#9840](https://github.com/ClickHouse/ClickHouse/pull/9840) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement + +* Fix integration test `test_settings_constraints`. [#9962](https://github.com/ClickHouse/ClickHouse/pull/9962) ([Vitaly Baranov](https://github.com/vitlibar)). +* Removed dependency on `clock_getres`. [#9833](https://github.com/ClickHouse/ClickHouse/pull/9833) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v20.3.5.21, 2020-03-27 + +#### Bug Fix + +* Fix 'Different expressions with the same alias' error when query has PREWHERE and WHERE on distributed table and `SET distributed_product_mode = 'local'`. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix mutations excessive memory consumption for tables with a composite primary key. This fixes [#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)). +* For INSERT queries shard now clamps the settings got from the initiator to the shard's constaints instead of throwing an exception. This fix allows to send INSERT queries to a shard with another constraints. This change improves fix [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix 'COMMA to CROSS JOIN rewriter is not enabled or cannot rewrite query' error in case of subqueries with COMMA JOIN out of tables lists (i.e. in WHERE). Fixes [#9782](https://github.com/ClickHouse/ClickHouse/issues/9782). [#9830](https://github.com/ClickHouse/ClickHouse/pull/9830) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix possible exception `Got 0 in totals chunk, expected 1` on client. It happened for queries with `JOIN` in case if right joined table had zero rows. Example: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. Fixes [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix SIGSEGV with optimize_skip_unused_shards when type cannot be converted. [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)). +* Fix broken `ALTER TABLE DELETE COLUMN` query for compact parts. [#9779](https://github.com/ClickHouse/ClickHouse/pull/9779) ([alesapin](https://github.com/alesapin)). +* Fix max_distributed_connections (w/ and w/o Processors). [#9673](https://github.com/ClickHouse/ClickHouse/pull/9673) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a few cases when timezone of the function argument wasn't used properly. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)). + +#### Improvement + +* Remove order by stage from mutations because we read from a single ordered part in a single thread. Also add check that the order of rows in mutation is ordered in sorting key order and this order is not violated. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.3.4.10, 2020-03-20 + +#### Bug Fix +* This release also contains all bug fixes from 20.1.8.41 +* Fix missing `rows_before_limit_at_least` for queries over http (with processors pipeline). This fixes [#9730](https://github.com/ClickHouse/ClickHouse/issues/9730). [#9757](https://github.com/ClickHouse/ClickHouse/pull/9757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + + +### ClickHouse release v20.3.3.6, 2020-03-17 + +#### Bug Fix +* This release also contains all bug fixes from 20.1.7.38 +* Fix bug in a replication that does not allow replication to work if the user has executed mutations on the previous version. This fixes [#9645](https://github.com/ClickHouse/ClickHouse/issues/9645). [#9652](https://github.com/ClickHouse/ClickHouse/pull/9652) ([alesapin](https://github.com/alesapin)). It makes version 20.3 backward compatible again. +* Add setting `use_compact_format_in_distributed_parts_names` which allows to write files for `INSERT` queries into `Distributed` table with more compact format. This fixes [#9647](https://github.com/ClickHouse/ClickHouse/issues/9647). [#9653](https://github.com/ClickHouse/ClickHouse/pull/9653) ([alesapin](https://github.com/alesapin)). It makes version 20.3 backward compatible again. + +### ClickHouse release v20.3.2.1, 2020-03-12 + +#### Backward Incompatible Change + +* Fixed the issue `file name too long` when sending data for `Distributed` tables for a large number of replicas. Fixed the issue that replica credentials were exposed in the server log. The format of directory name on disk was changed to `[shard{shard_index}[_replica{replica_index}]]`. [#8911](https://github.com/ClickHouse/ClickHouse/pull/8911) ([Mikhail Korotov](https://github.com/millb)) After you upgrade to the new version, you will not be able to downgrade without manual intervention, because old server version does not recognize the new directory format. If you want to downgrade, you have to manually rename the corresponding directories to the old format. This change is relevant only if you have used asynchronous `INSERT`s to `Distributed` tables. In the version 20.3.3 we will introduce a setting that will allow you to enable the new format gradually. +* Changed the format of replication log entries for mutation commands. You have to wait for old mutations to process before installing the new version. +* Implement simple memory profiler that dumps stacktraces to `system.trace_log` every N bytes over soft allocation limit [#8765](https://github.com/ClickHouse/ClickHouse/pull/8765) ([Ivan](https://github.com/abyss7)) [#9472](https://github.com/ClickHouse/ClickHouse/pull/9472) ([alexey-milovidov](https://github.com/alexey-milovidov)) The column of `system.trace_log` was renamed from `timer_type` to `trace_type`. This will require changes in third-party performance analysis and flamegraph processing tools. +* Use OS thread id everywhere instead of internal thread number. This fixes [#7477](https://github.com/ClickHouse/ClickHouse/issues/7477) Old `clickhouse-client` cannot receive logs that are send from the server when the setting `send_logs_level` is enabled, because the names and types of the structured log messages were changed. On the other hand, different server versions can send logs with different types to each other. When you don't use the `send_logs_level` setting, you should not care. [#8954](https://github.com/ClickHouse/ClickHouse/pull/8954) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `indexHint` function [#9542](https://github.com/ClickHouse/ClickHouse/pull/9542) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `findClusterIndex`, `findClusterValue` functions. This fixes [#8641](https://github.com/ClickHouse/ClickHouse/issues/8641). If you were using these functions, send an email to `clickhouse-feedback@yandex-team.com` [#9543](https://github.com/ClickHouse/ClickHouse/pull/9543) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now it's not allowed to create columns or add columns with `SELECT` subquery as default expression. [#9481](https://github.com/ClickHouse/ClickHouse/pull/9481) ([alesapin](https://github.com/alesapin)) +* Require aliases for subqueries in JOIN. [#9274](https://github.com/ClickHouse/ClickHouse/pull/9274) ([Artem Zuikov](https://github.com/4ertus2)) +* Improved `ALTER MODIFY/ADD` queries logic. Now you cannot `ADD` column without type, `MODIFY` default expression does not change type of column and `MODIFY` type does not loose default expression value. Fixes [#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). [#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) ([alesapin](https://github.com/alesapin)) +* Require server to be restarted to apply the changes in logging configuration. This is a temporary workaround to avoid the bug where the server logs to a deleted log file (see [#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* The setting `experimental_use_processors` is enabled by default. This setting enables usage of the new query pipeline. This is internal refactoring and we expect no visible changes. If you will see any issues, set it to back zero. [#8768](https://github.com/ClickHouse/ClickHouse/pull/8768) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### New Feature +* Add `Avro` and `AvroConfluent` input/output formats [#8571](https://github.com/ClickHouse/ClickHouse/pull/8571) ([Andrew Onyshchuk](https://github.com/oandrew)) [#8957](https://github.com/ClickHouse/ClickHouse/pull/8957) ([Andrew Onyshchuk](https://github.com/oandrew)) [#8717](https://github.com/ClickHouse/ClickHouse/pull/8717) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Multi-threaded and non-blocking updates of expired keys in `cache` dictionaries (with optional permission to read old ones). [#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add query `ALTER ... MATERIALIZE TTL`. It runs mutation that forces to remove expired data by TTL and recalculates meta-information about TTL in all parts. [#8775](https://github.com/ClickHouse/ClickHouse/pull/8775) ([Anton Popov](https://github.com/CurtizJ)) +* Switch from HashJoin to MergeJoin (on disk) if needed [#9082](https://github.com/ClickHouse/ClickHouse/pull/9082) ([Artem Zuikov](https://github.com/4ertus2)) +* Added `MOVE PARTITION` command for `ALTER TABLE` [#4729](https://github.com/ClickHouse/ClickHouse/issues/4729) [#6168](https://github.com/ClickHouse/ClickHouse/pull/6168) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Reloading storage configuration from configuration file on the fly. [#8594](https://github.com/ClickHouse/ClickHouse/pull/8594) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Allowed to change `storage_policy` to not less rich one. [#8107](https://github.com/ClickHouse/ClickHouse/pull/8107) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Added support for globs/wildcards for S3 storage and table function. [#8851](https://github.com/ClickHouse/ClickHouse/pull/8851) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Implement `bitAnd`, `bitOr`, `bitXor`, `bitNot` for `FixedString(N)` datatype. [#9091](https://github.com/ClickHouse/ClickHouse/pull/9091) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Added function `bitCount`. This fixes [#8702](https://github.com/ClickHouse/ClickHouse/issues/8702). [#8708](https://github.com/ClickHouse/ClickHouse/pull/8708) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#8749](https://github.com/ClickHouse/ClickHouse/pull/8749) ([ikopylov](https://github.com/ikopylov)) +* Add `generateRandom` table function to generate random rows with given schema. Allows to populate arbitrary test table with data. [#8994](https://github.com/ClickHouse/ClickHouse/pull/8994) ([Ilya Yatsishin](https://github.com/qoega)) +* `JSONEachRowFormat`: support special case when objects enclosed in top-level array. [#8860](https://github.com/ClickHouse/ClickHouse/pull/8860) ([Kruglov Pavel](https://github.com/Avogar)) +* Now it's possible to create a column with `DEFAULT` expression which depends on a column with default `ALIAS` expression. [#9489](https://github.com/ClickHouse/ClickHouse/pull/9489) ([alesapin](https://github.com/alesapin)) +* Allow to specify `--limit` more than the source data size in `clickhouse-obfuscator`. The data will repeat itself with different random seed. [#9155](https://github.com/ClickHouse/ClickHouse/pull/9155) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `groupArraySample` function (similar to `groupArray`) with reservior sampling algorithm. [#8286](https://github.com/ClickHouse/ClickHouse/pull/8286) ([Amos Bird](https://github.com/amosbird)) +* Now you can monitor the size of update queue in `cache`/`complex_key_cache` dictionaries via system metrics. [#9413](https://github.com/ClickHouse/ClickHouse/pull/9413) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Allow to use CRLF as a line separator in CSV output format with setting `output_format_csv_crlf_end_of_line` is set to 1 [#8934](https://github.com/ClickHouse/ClickHouse/pull/8934) [#8935](https://github.com/ClickHouse/ClickHouse/pull/8935) [#8963](https://github.com/ClickHouse/ClickHouse/pull/8963) ([Mikhail Korotov](https://github.com/millb)) +* Implement more functions of the [H3](https://github.com/uber/h3) API: `h3GetBaseCell`, `h3HexAreaM2`, `h3IndexesAreNeighbors`, `h3ToChildren`, `h3ToString` and `stringToH3` [#8938](https://github.com/ClickHouse/ClickHouse/pull/8938) ([Nico Mandery](https://github.com/nmandery)) +* New setting introduced: `max_parser_depth` to control maximum stack size and allow large complex queries. This fixes [#6681](https://github.com/ClickHouse/ClickHouse/issues/6681) and [#7668](https://github.com/ClickHouse/ClickHouse/issues/7668). [#8647](https://github.com/ClickHouse/ClickHouse/pull/8647) ([Maxim Smirnov](https://github.com/qMBQx8GH)) +* Add a setting `force_optimize_skip_unused_shards` setting to throw if skipping of unused shards is not possible [#8805](https://github.com/ClickHouse/ClickHouse/pull/8805) ([Azat Khuzhin](https://github.com/azat)) +* Allow to configure multiple disks/volumes for storing data for send in `Distributed` engine [#8756](https://github.com/ClickHouse/ClickHouse/pull/8756) ([Azat Khuzhin](https://github.com/azat)) +* Support storage policy (``) for storing temporary data. [#8750](https://github.com/ClickHouse/ClickHouse/pull/8750) ([Azat Khuzhin](https://github.com/azat)) +* Added `X-ClickHouse-Exception-Code` HTTP header that is set if exception was thrown before sending data. This implements [#4971](https://github.com/ClickHouse/ClickHouse/issues/4971). [#8786](https://github.com/ClickHouse/ClickHouse/pull/8786) ([Mikhail Korotov](https://github.com/millb)) +* Added function `ifNotFinite`. It is just a syntactic sugar: `ifNotFinite(x, y) = isFinite(x) ? x : y`. [#8710](https://github.com/ClickHouse/ClickHouse/pull/8710) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `last_successful_update_time` column in `system.dictionaries` table [#9394](https://github.com/ClickHouse/ClickHouse/pull/9394) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add `blockSerializedSize` function (size on disk without compression) [#8952](https://github.com/ClickHouse/ClickHouse/pull/8952) ([Azat Khuzhin](https://github.com/azat)) +* Add function `moduloOrZero` [#9358](https://github.com/ClickHouse/ClickHouse/pull/9358) ([hcz](https://github.com/hczhcz)) +* Added system tables `system.zeros` and `system.zeros_mt` as well as tale functions `zeros()` and `zeros_mt()`. Tables (and table functions) contain single column with name `zero` and type `UInt8`. This column contains zeros. It is needed for test purposes as the fastest method to generate many rows. This fixes [#6604](https://github.com/ClickHouse/ClickHouse/issues/6604) [#9593](https://github.com/ClickHouse/ClickHouse/pull/9593) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) + +#### Experimental Feature +* Add new compact format of parts in `MergeTree`-family tables in which all columns are stored in one file. It helps to increase performance of small and frequent inserts. The old format (one file per column) is now called wide. Data storing format is controlled by settings `min_bytes_for_wide_part` and `min_rows_for_wide_part`. [#8290](https://github.com/ClickHouse/ClickHouse/pull/8290) ([Anton Popov](https://github.com/CurtizJ)) +* Support for S3 storage for `Log`, `TinyLog` and `StripeLog` tables. [#8862](https://github.com/ClickHouse/ClickHouse/pull/8862) ([Pavel Kovalenko](https://github.com/Jokser)) + +#### Bug Fix +* Fixed inconsistent whitespaces in log messages. [#9322](https://github.com/ClickHouse/ClickHouse/pull/9322) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix bug in which arrays of unnamed tuples were flattened as Nested structures on table creation. [#8866](https://github.com/ClickHouse/ClickHouse/pull/8866) ([achulkov2](https://github.com/achulkov2)) +* Fixed the issue when "Too many open files" error may happen if there are too many files matching glob pattern in `File` table or `file` table function. Now files are opened lazily. This fixes [#8857](https://github.com/ClickHouse/ClickHouse/issues/8857) [#8861](https://github.com/ClickHouse/ClickHouse/pull/8861) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* DROP TEMPORARY TABLE now drops only temporary table. [#8907](https://github.com/ClickHouse/ClickHouse/pull/8907) ([Vitaly Baranov](https://github.com/vitlibar)) +* Remove outdated partition when we shutdown the server or DETACH/ATTACH a table. [#8602](https://github.com/ClickHouse/ClickHouse/pull/8602) ([Guillaume Tassery](https://github.com/YiuRULE)) +* For how the default disk calculates the free space from `data` subdirectory. Fixed the issue when the amount of free space is not calculated correctly if the `data` directory is mounted to a separate device (rare case). This fixes [#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) [#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) ([Mikhail Korotov](https://github.com/millb)) +* Allow comma (cross) join with IN () inside. [#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) ([Artem Zuikov](https://github.com/4ertus2)) +* Allow to rewrite CROSS to INNER JOIN if there's [NOT] LIKE operator in WHERE section. [#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix possible incorrect result after `GROUP BY` with enabled setting `distributed_aggregation_memory_efficient`. Fixes [#9134](https://github.com/ClickHouse/ClickHouse/issues/9134). [#9289](https://github.com/ClickHouse/ClickHouse/pull/9289) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Found keys were counted as missed in metrics of cache dictionaries. [#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix replication protocol incompatibility introduced in [#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) +* Fixed race condition on `queue_task_handle` at the startup of `ReplicatedMergeTree` tables. [#9552](https://github.com/ClickHouse/ClickHouse/pull/9552) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* The token `NOT` did not work in `SHOW TABLES NOT LIKE` query [#8727](https://github.com/ClickHouse/ClickHouse/issues/8727) [#8940](https://github.com/ClickHouse/ClickHouse/pull/8940) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added range check to function `h3EdgeLengthM`. Without this check, buffer overflow is possible. [#8945](https://github.com/ClickHouse/ClickHouse/pull/8945) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed up a bug in batched calculations of ternary logical OPs on multiple arguments (more than 10). [#8718](https://github.com/ClickHouse/ClickHouse/pull/8718) ([Alexander Kazakov](https://github.com/Akazz)) +* Fix error of PREWHERE optimization, which could lead to segfaults or `Inconsistent number of columns got from MergeTreeRangeReader` exception. [#9024](https://github.com/ClickHouse/ClickHouse/pull/9024) ([Anton Popov](https://github.com/CurtizJ)) +* Fix unexpected `Timeout exceeded while reading from socket` exception, which randomly happens on secure connection before timeout actually exceeded and when query profiler is enabled. Also add `connect_timeout_with_failover_secure_ms` settings (default 100ms), which is similar to `connect_timeout_with_failover_ms`, but is used for secure connections (because SSL handshake is slower, than ordinary TCP connection) [#9026](https://github.com/ClickHouse/ClickHouse/pull/9026) ([tavplubix](https://github.com/tavplubix)) +* Fix bug with mutations finalization, when mutation may hang in state with `parts_to_do=0` and `is_done=0`. [#9022](https://github.com/ClickHouse/ClickHouse/pull/9022) ([alesapin](https://github.com/alesapin)) +* Use new ANY JOIN logic with `partial_merge_join` setting. It's possible to make `ANY|ALL|SEMI LEFT` and `ALL INNER` joins with `partial_merge_join=1` now. [#8932](https://github.com/ClickHouse/ClickHouse/pull/8932) ([Artem Zuikov](https://github.com/4ertus2)) +* Shard now clamps the settings got from the initiator to the shard's constaints instead of throwing an exception. This fix allows to send queries to a shard with another constraints. [#9447](https://github.com/ClickHouse/ClickHouse/pull/9447) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fixed memory management problem in `MergeTreeReadPool`. [#8791](https://github.com/ClickHouse/ClickHouse/pull/8791) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix `toDecimal*OrNull()` functions family when called with string `e`. Fixes [#8312](https://github.com/ClickHouse/ClickHouse/issues/8312) [#8764](https://github.com/ClickHouse/ClickHouse/pull/8764) ([Artem Zuikov](https://github.com/4ertus2)) +* Make sure that `FORMAT Null` sends no data to the client. [#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Fix bug that timestamp in `LiveViewBlockInputStream` will not updated. `LIVE VIEW` is an experimental feature. [#8644](https://github.com/ClickHouse/ClickHouse/pull/8644) ([vxider](https://github.com/Vxider)) [#8625](https://github.com/ClickHouse/ClickHouse/pull/8625) ([vxider](https://github.com/Vxider)) +* Fixed `ALTER MODIFY TTL` wrong behavior which did not allow to delete old TTL expressions. [#8422](https://github.com/ClickHouse/ClickHouse/pull/8422) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fixed UBSan report in MergeTreeIndexSet. This fixes [#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) [#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed the behaviour of `match` and `extract` functions when haystack has zero bytes. The behaviour was wrong when haystack was constant. This fixes [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid throwing from destructor in Apache Avro 3rd-party library. [#9066](https://github.com/ClickHouse/ClickHouse/pull/9066) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Don't commit a batch polled from `Kafka` partially as it can lead to holes in data. [#8876](https://github.com/ClickHouse/ClickHouse/pull/8876) ([filimonov](https://github.com/filimonov)) +* Fix `joinGet` with nullable return types. [#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) [#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) ([Amos Bird](https://github.com/amosbird)) +* Fix data incompatibility when compressed with `T64` codec. [#9016](https://github.com/ClickHouse/ClickHouse/pull/9016) ([Artem Zuikov](https://github.com/4ertus2)) Fix data type ids in `T64` compression codec that leads to wrong (de)compression in affected versions. [#9033](https://github.com/ClickHouse/ClickHouse/pull/9033) ([Artem Zuikov](https://github.com/4ertus2)) +* Add setting `enable_early_constant_folding` and disable it in some cases that leads to errors. [#9010](https://github.com/ClickHouse/ClickHouse/pull/9010) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix pushdown predicate optimizer with VIEW and enable the test [#9011](https://github.com/ClickHouse/ClickHouse/pull/9011) ([Winter Zhang](https://github.com/zhang2014)) +* Fix segfault in `Merge` tables, that can happen when reading from `File` storages [#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) ([tavplubix](https://github.com/tavplubix)) +* Added a check for storage policy in `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE`. Otherwise it could make data of part inaccessible after restart and prevent ClickHouse to start. [#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix alters if there is TTL set for table. [#8800](https://github.com/ClickHouse/ClickHouse/pull/8800) ([Anton Popov](https://github.com/CurtizJ)) +* Fix race condition that can happen when `SYSTEM RELOAD ALL DICTIONARIES` is executed while some dictionary is being modified/added/removed. [#8801](https://github.com/ClickHouse/ClickHouse/pull/8801) ([Vitaly Baranov](https://github.com/vitlibar)) +* In previous versions `Memory` database engine use empty data path, so tables are created in `path` directory (e.g. `/var/lib/clickhouse/`), not in data directory of database (e.g. `/var/lib/clickhouse/db_name`). [#8753](https://github.com/ClickHouse/ClickHouse/pull/8753) ([tavplubix](https://github.com/tavplubix)) +* Fixed wrong log messages about missing default disk or policy. [#9530](https://github.com/ClickHouse/ClickHouse/pull/9530) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix not(has()) for the bloom_filter index of array types. [#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) +* Allow first column(s) in a table with `Log` engine be an alias [#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) ([Ivan](https://github.com/abyss7)) +* Fix order of ranges while reading from `MergeTree` table in one thread. It could lead to exceptions from `MergeTreeRangeReader` or wrong query results. [#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) ([Anton Popov](https://github.com/CurtizJ)) +* Make `reinterpretAsFixedString` to return `FixedString` instead of `String`. [#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) ([Andrew Onyshchuk](https://github.com/oandrew)) +* Avoid extremely rare cases when the user can get wrong error message (`Success` instead of detailed error description). [#9457](https://github.com/ClickHouse/ClickHouse/pull/9457) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Do not crash when using `Template` format with empty row template. [#8785](https://github.com/ClickHouse/ClickHouse/pull/8785) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Metadata files for system tables could be created in wrong place [#8653](https://github.com/ClickHouse/ClickHouse/pull/8653) ([tavplubix](https://github.com/tavplubix)) Fixes [#8581](https://github.com/ClickHouse/ClickHouse/issues/8581). +* Fix data race on exception_ptr in cache dictionary [#8303](https://github.com/ClickHouse/ClickHouse/issues/8303). [#9379](https://github.com/ClickHouse/ClickHouse/pull/9379) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Do not throw an exception for query `ATTACH TABLE IF NOT EXISTS`. Previously it was thrown if table already exists, despite the `IF NOT EXISTS` clause. [#8967](https://github.com/ClickHouse/ClickHouse/pull/8967) ([Anton Popov](https://github.com/CurtizJ)) +* Fixed missing closing paren in exception message. [#8811](https://github.com/ClickHouse/ClickHouse/pull/8811) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid message `Possible deadlock avoided` at the startup of clickhouse-client in interactive mode. [#9455](https://github.com/ClickHouse/ClickHouse/pull/9455) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed the issue when padding at the end of base64 encoded value can be malformed. Update base64 library. This fixes [#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), closes [#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Prevent losing data in `Kafka` in rare cases when exception happens after reading suffix but before commit. Fixes [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378) [#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) ([filimonov](https://github.com/filimonov)) +* Fixed exception in `DROP TABLE IF EXISTS` [#8663](https://github.com/ClickHouse/ClickHouse/pull/8663) ([Nikita Vasilev](https://github.com/nikvas0)) +* Fix crash when a user tries to `ALTER MODIFY SETTING` for old-formated `MergeTree` table engines family. [#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) +* Support for UInt64 numbers that don't fit in Int64 in JSON-related functions. Update SIMDJSON to master. This fixes [#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) [#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed execution of inversed predicates when non-strictly monotinic functional index is used. [#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) ([Alexander Kazakov](https://github.com/Akazz)) +* Don't try to fold `IN` constant in `GROUP BY` [#8868](https://github.com/ClickHouse/ClickHouse/pull/8868) ([Amos Bird](https://github.com/amosbird)) +* Fix bug in `ALTER DELETE` mutations which leads to index corruption. This fixes [#9019](https://github.com/ClickHouse/ClickHouse/issues/9019) and [#8982](https://github.com/ClickHouse/ClickHouse/issues/8982). Additionally fix extremely rare race conditions in `ReplicatedMergeTree` `ALTER` queries. [#9048](https://github.com/ClickHouse/ClickHouse/pull/9048) ([alesapin](https://github.com/alesapin)) +* When the setting `compile_expressions` is enabled, you can get `unexpected column` in `LLVMExecutableFunction` when we use `Nullable` type [#8910](https://github.com/ClickHouse/ClickHouse/pull/8910) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Multiple fixes for `Kafka` engine: 1) fix duplicates that were appearing during consumer group rebalance. 2) Fix rare 'holes' appeared when data were polled from several partitions with one poll and committed partially (now we always process / commit the whole polled block of messages). 3) Fix flushes by block size (before that only flushing by timeout was working properly). 4) better subscription procedure (with assignment feedback). 5) Make tests work faster (with default intervals and timeouts). Due to the fact that data was not flushed by block size before (as it should according to documentation), that PR may lead to some performance degradation with default settings (due to more often & tinier flushes which are less optimal). If you encounter the performance issue after that change - please increase `kafka_max_block_size` in the table to the bigger value ( for example `CREATE TABLE ...Engine=Kafka ... SETTINGS ... kafka_max_block_size=524288`). Fixes [#7259](https://github.com/ClickHouse/ClickHouse/issues/7259) [#8917](https://github.com/ClickHouse/ClickHouse/pull/8917) ([filimonov](https://github.com/filimonov)) +* Fix `Parameter out of bound` exception in some queries after PREWHERE optimizations. [#8914](https://github.com/ClickHouse/ClickHouse/pull/8914) ([Baudouin Giard](https://github.com/bgiard)) +* Fixed the case of mixed-constness of arguments of function `arrayZip`. [#8705](https://github.com/ClickHouse/ClickHouse/pull/8705) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* When executing `CREATE` query, fold constant expressions in storage engine arguments. Replace empty database name with current database. Fixes [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492) [#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) ([tavplubix](https://github.com/tavplubix)) +* Now it's not possible to create or add columns with simple cyclic aliases like `a DEFAULT b, b DEFAULT a`. [#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) +* Fixed a bug with double move which may corrupt original part. This is relevant if you use `ALTER TABLE MOVE` [#8680](https://github.com/ClickHouse/ClickHouse/pull/8680) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Allow `interval` identifier to correctly parse without backticks. Fixed issue when a query cannot be executed even if the `interval` identifier is enclosed in backticks or double quotes. This fixes [#9124](https://github.com/ClickHouse/ClickHouse/issues/9124). [#9142](https://github.com/ClickHouse/ClickHouse/pull/9142) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed fuzz test and incorrect behaviour of `bitTestAll`/`bitTestAny` functions. [#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix possible crash/wrong number of rows in `LIMIT n WITH TIES` when there are a lot of rows equal to n'th row. [#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) +* Fix mutations with parts written with enabled `insert_quorum`. [#9463](https://github.com/ClickHouse/ClickHouse/pull/9463) ([alesapin](https://github.com/alesapin)) +* Fix data race at destruction of `Poco::HTTPServer`. It could happen when server is started and immediately shut down. [#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +* Fix bug in which a misleading error message was shown when running `SHOW CREATE TABLE a_table_that_does_not_exist`. [#8899](https://github.com/ClickHouse/ClickHouse/pull/8899) ([achulkov2](https://github.com/achulkov2)) +* Fixed `Parameters are out of bound` exception in some rare cases when we have a constant in the `SELECT` clause when we have an `ORDER BY` and a `LIMIT` clause. [#8892](https://github.com/ClickHouse/ClickHouse/pull/8892) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Fix mutations finalization, when already done mutation can have status `is_done=0`. [#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) ([alesapin](https://github.com/alesapin)) +* Prevent from executing `ALTER ADD INDEX` for MergeTree tables with old syntax, because it does not work. [#8822](https://github.com/ClickHouse/ClickHouse/pull/8822) ([Mikhail Korotov](https://github.com/millb)) +* During server startup do not access table, which `LIVE VIEW` depends on, so server will be able to start. Also remove `LIVE VIEW` dependencies when detaching `LIVE VIEW`. `LIVE VIEW` is an experimental feature. [#8824](https://github.com/ClickHouse/ClickHouse/pull/8824) ([tavplubix](https://github.com/tavplubix)) +* Fix possible segfault in `MergeTreeRangeReader`, while executing `PREWHERE`. [#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) ([Anton Popov](https://github.com/CurtizJ)) +* Fix possible mismatched checksums with column TTLs. [#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +* Fixed a bug when parts were not being moved in background by TTL rules in case when there is only one volume. [#8672](https://github.com/ClickHouse/ClickHouse/pull/8672) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fixed the issue `Method createColumn() is not implemented for data type Set`. This fixes [#7799](https://github.com/ClickHouse/ClickHouse/issues/7799). [#8674](https://github.com/ClickHouse/ClickHouse/pull/8674) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now we will try finalize mutations more frequently. [#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) +* Fix `intDiv` by minus one constant [#9351](https://github.com/ClickHouse/ClickHouse/pull/9351) ([hcz](https://github.com/hczhcz)) +* Fix possible race condition in `BlockIO`. [#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix bug leading to server termination when trying to use / drop `Kafka` table created with wrong parameters. [#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) ([filimonov](https://github.com/filimonov)) +* Added workaround if OS returns wrong result for `timer_create` function. [#8837](https://github.com/ClickHouse/ClickHouse/pull/8837) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed error in usage of `min_marks_for_seek` parameter. Fixed the error message when there is no sharding key in Distributed table and we try to skip unused shards. [#8908](https://github.com/ClickHouse/ClickHouse/pull/8908) ([Azat Khuzhin](https://github.com/azat)) + +#### Improvement +* Implement `ALTER MODIFY/DROP` queries on top of mutations for `ReplicatedMergeTree*` engines family. Now `ALTERS` blocks only at the metadata update stage, and don't block after that. [#8701](https://github.com/ClickHouse/ClickHouse/pull/8701) ([alesapin](https://github.com/alesapin)) +* Add ability to rewrite CROSS to INNER JOINs with `WHERE` section containing unqialified names. [#9512](https://github.com/ClickHouse/ClickHouse/pull/9512) ([Artem Zuikov](https://github.com/4ertus2)) +* Make `SHOW TABLES` and `SHOW DATABASES` queries support the `WHERE` expressions and `FROM`/`IN` [#9076](https://github.com/ClickHouse/ClickHouse/pull/9076) ([sundyli](https://github.com/sundy-li)) +* Added a setting `deduplicate_blocks_in_dependent_materialized_views`. [#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) ([urykhy](https://github.com/urykhy)) +* After recent changes MySQL client started to print binary strings in hex thereby making them not readable ([#9032](https://github.com/ClickHouse/ClickHouse/issues/9032)). The workaround in ClickHouse is to mark string columns as UTF-8, which is not always, but usually the case. [#9079](https://github.com/ClickHouse/ClickHouse/pull/9079) ([Yuriy Baranov](https://github.com/yurriy)) +* Add support of String and FixedString keys for `sumMap` [#8903](https://github.com/ClickHouse/ClickHouse/pull/8903) ([Baudouin Giard](https://github.com/bgiard)) +* Support string keys in SummingMergeTree maps [#8933](https://github.com/ClickHouse/ClickHouse/pull/8933) ([Baudouin Giard](https://github.com/bgiard)) +* Signal termination of thread to the thread pool even if the thread has thrown exception [#8736](https://github.com/ClickHouse/ClickHouse/pull/8736) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +* Allow to set `query_id` in `clickhouse-benchmark` [#9416](https://github.com/ClickHouse/ClickHouse/pull/9416) ([Anton Popov](https://github.com/CurtizJ)) +* Don't allow strange expressions in `ALTER TABLE ... PARTITION partition` query. This addresses [#7192](https://github.com/ClickHouse/ClickHouse/issues/7192) [#8835](https://github.com/ClickHouse/ClickHouse/pull/8835) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* The table `system.table_engines` now provides information about feature support (like `supports_ttl` or `supports_sort_order`). [#8830](https://github.com/ClickHouse/ClickHouse/pull/8830) ([Max Akhmedov](https://github.com/zlobober)) +* Enable `system.metric_log` by default. It will contain rows with values of ProfileEvents, CurrentMetrics collected with "collect_interval_milliseconds" interval (one second by default). The table is very small (usually in order of megabytes) and collecting this data by default is reasonable. [#9225](https://github.com/ClickHouse/ClickHouse/pull/9225) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries. Fixes [#6964](https://github.com/ClickHouse/ClickHouse/issues/6964) [#8874](https://github.com/ClickHouse/ClickHouse/pull/8874) ([Ivan](https://github.com/abyss7)) +* Now temporary `LIVE VIEW` is created by `CREATE LIVE VIEW name WITH TIMEOUT [42] ...` instead of `CREATE TEMPORARY LIVE VIEW ...`, because the previous syntax was not consistent with `CREATE TEMPORARY TABLE ...` [#9131](https://github.com/ClickHouse/ClickHouse/pull/9131) ([tavplubix](https://github.com/tavplubix)) +* Add text_log.level configuration parameter to limit entries that goes to `system.text_log` table [#8809](https://github.com/ClickHouse/ClickHouse/pull/8809) ([Azat Khuzhin](https://github.com/azat)) +* Allow to put downloaded part to a disks/volumes according to TTL rules [#8598](https://github.com/ClickHouse/ClickHouse/pull/8598) ([Vladimir Chebotarev](https://github.com/excitoon)) +* For external MySQL dictionaries, allow to mutualize MySQL connection pool to "share" them among dictionaries. This option significantly reduces the number of connections to MySQL servers. [#9409](https://github.com/ClickHouse/ClickHouse/pull/9409) ([Clément Rodriguez](https://github.com/clemrodriguez)) +* Show nearest query execution time for quantiles in `clickhouse-benchmark` output instead of interpolated values. It's better to show values that correspond to the execution time of some queries. [#8712](https://github.com/ClickHouse/ClickHouse/pull/8712) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Possibility to add key & timestamp for the message when inserting data to Kafka. Fixes [#7198](https://github.com/ClickHouse/ClickHouse/issues/7198) [#8969](https://github.com/ClickHouse/ClickHouse/pull/8969) ([filimonov](https://github.com/filimonov)) +* If server is run from terminal, highlight thread number, query id and log priority by colors. This is for improved readability of correlated log messages for developers. [#8961](https://github.com/ClickHouse/ClickHouse/pull/8961) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better exception message while loading tables for `Ordinary` database. [#9527](https://github.com/ClickHouse/ClickHouse/pull/9527) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Implement `arraySlice` for arrays with aggregate function states. This fixes [#9388](https://github.com/ClickHouse/ClickHouse/issues/9388) [#9391](https://github.com/ClickHouse/ClickHouse/pull/9391) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Allow constant functions and constant arrays to be used on the right side of IN operator. [#8813](https://github.com/ClickHouse/ClickHouse/pull/8813) ([Anton Popov](https://github.com/CurtizJ)) +* If zookeeper exception has happened while fetching data for system.replicas, display it in a separate column. This implements [#9137](https://github.com/ClickHouse/ClickHouse/issues/9137) [#9138](https://github.com/ClickHouse/ClickHouse/pull/9138) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Atomically remove MergeTree data parts on destroy. [#8402](https://github.com/ClickHouse/ClickHouse/pull/8402) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Support row-level security for Distributed tables. [#8926](https://github.com/ClickHouse/ClickHouse/pull/8926) ([Ivan](https://github.com/abyss7)) +* Now we recognize suffix (like KB, KiB...) in settings values. [#8072](https://github.com/ClickHouse/ClickHouse/pull/8072) ([Mikhail Korotov](https://github.com/millb)) +* Prevent out of memory while constructing result of a large JOIN. [#8637](https://github.com/ClickHouse/ClickHouse/pull/8637) ([Artem Zuikov](https://github.com/4ertus2)) +* Added names of clusters to suggestions in interactive mode in `clickhouse-client`. [#8709](https://github.com/ClickHouse/ClickHouse/pull/8709) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Initialize query profiler for all threads in a group, e.g. it allows to fully profile insert-queries [#8820](https://github.com/ClickHouse/ClickHouse/pull/8820) ([Ivan](https://github.com/abyss7)) +* Added column `exception_code` in `system.query_log` table. [#8770](https://github.com/ClickHouse/ClickHouse/pull/8770) ([Mikhail Korotov](https://github.com/millb)) +* Enabled MySQL compatibility server on port `9004` in the default server configuration file. Fixed password generation command in the example in configuration. [#8771](https://github.com/ClickHouse/ClickHouse/pull/8771) ([Yuriy Baranov](https://github.com/yurriy)) +* Prevent abort on shutdown if the filesystem is readonly. This fixes [#9094](https://github.com/ClickHouse/ClickHouse/issues/9094) [#9100](https://github.com/ClickHouse/ClickHouse/pull/9100) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better exception message when length is required in HTTP POST query. [#9453](https://github.com/ClickHouse/ClickHouse/pull/9453) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `_path` and `_file` virtual columns to `HDFS` and `File` engines and `hdfs` and `file` table functions [#8489](https://github.com/ClickHouse/ClickHouse/pull/8489) ([Olga Khvostikova](https://github.com/stavrolia)) +* Fix error `Cannot find column` while inserting into `MATERIALIZED VIEW` in case if new column was added to view's internal table. [#8766](https://github.com/ClickHouse/ClickHouse/pull/8766) [#8788](https://github.com/ClickHouse/ClickHouse/pull/8788) ([vzakaznikov](https://github.com/vzakaznikov)) [#8788](https://github.com/ClickHouse/ClickHouse/issues/8788) [#8806](https://github.com/ClickHouse/ClickHouse/pull/8806) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#8803](https://github.com/ClickHouse/ClickHouse/pull/8803) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix progress over native client-server protocol, by send progress after final update (like logs). This may be relevant only to some third-party tools that are using native protocol. [#9495](https://github.com/ClickHouse/ClickHouse/pull/9495) ([Azat Khuzhin](https://github.com/azat)) +* Add a system metric tracking the number of client connections using MySQL protocol ([#9013](https://github.com/ClickHouse/ClickHouse/issues/9013)). [#9015](https://github.com/ClickHouse/ClickHouse/pull/9015) ([Eugene Klimov](https://github.com/Slach)) +* From now on, HTTP responses will have `X-ClickHouse-Timezone` header set to the same timezone value that `SELECT timezone()` would report. [#9493](https://github.com/ClickHouse/ClickHouse/pull/9493) ([Denis Glazachev](https://github.com/traceon)) + +#### Performance Improvement +* Improve performance of analysing index with IN [#9261](https://github.com/ClickHouse/ClickHouse/pull/9261) ([Anton Popov](https://github.com/CurtizJ)) +* Simpler and more efficient code in Logical Functions + code cleanups. A followup to [#8718](https://github.com/ClickHouse/ClickHouse/issues/8718) [#8728](https://github.com/ClickHouse/ClickHouse/pull/8728) ([Alexander Kazakov](https://github.com/Akazz)) +* Overall performance improvement (in range of 5%..200% for affected queries) by ensuring even more strict aliasing with C++20 features. [#9304](https://github.com/ClickHouse/ClickHouse/pull/9304) ([Amos Bird](https://github.com/amosbird)) +* More strict aliasing for inner loops of comparison functions. [#9327](https://github.com/ClickHouse/ClickHouse/pull/9327) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* More strict aliasing for inner loops of arithmetic functions. [#9325](https://github.com/ClickHouse/ClickHouse/pull/9325) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* A ~3 times faster implementation for ColumnVector::replicate(), via which ColumnConst::convertToFullColumn() is implemented. Also will be useful in tests when materializing constants. [#9293](https://github.com/ClickHouse/ClickHouse/pull/9293) ([Alexander Kazakov](https://github.com/Akazz)) +* Another minor performance improvement to `ColumnVector::replicate()` (this speeds up the `materialize` function and higher order functions) an even further improvement to [#9293](https://github.com/ClickHouse/ClickHouse/issues/9293) [#9442](https://github.com/ClickHouse/ClickHouse/pull/9442) ([Alexander Kazakov](https://github.com/Akazz)) +* Improved performance of `stochasticLinearRegression` aggregate function. This patch is contributed by Intel. [#8652](https://github.com/ClickHouse/ClickHouse/pull/8652) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improve performance of `reinterpretAsFixedString` function. [#9342](https://github.com/ClickHouse/ClickHouse/pull/9342) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Do not send blocks to client for `Null` format in processors pipeline. [#8797](https://github.com/ClickHouse/ClickHouse/pull/8797) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) [#8767](https://github.com/ClickHouse/ClickHouse/pull/8767) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +#### Build/Testing/Packaging Improvement +* Exception handling now works correctly on Windows Subsystem for Linux. See https://github.com/ClickHouse-Extras/libunwind/pull/3 This fixes [#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) +* Replace `readline` with `replxx` for interactive line editing in `clickhouse-client` [#8416](https://github.com/ClickHouse/ClickHouse/pull/8416) ([Ivan](https://github.com/abyss7)) +* Better build time and less template instantiations in FunctionsComparison. [#9324](https://github.com/ClickHouse/ClickHouse/pull/9324) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added integration with `clang-tidy` in CI. See also [#6044](https://github.com/ClickHouse/ClickHouse/issues/6044) [#9566](https://github.com/ClickHouse/ClickHouse/pull/9566) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now we link ClickHouse in CI using `lld` even for `gcc`. [#9049](https://github.com/ClickHouse/ClickHouse/pull/9049) ([alesapin](https://github.com/alesapin)) +* Allow to randomize thread scheduling and insert glitches when `THREAD_FUZZER_*` environment variables are set. This helps testing. [#9459](https://github.com/ClickHouse/ClickHouse/pull/9459) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enable secure sockets in stateless tests [#9288](https://github.com/ClickHouse/ClickHouse/pull/9288) ([tavplubix](https://github.com/tavplubix)) +* Make SPLIT_SHARED_LIBRARIES=OFF more robust [#9156](https://github.com/ClickHouse/ClickHouse/pull/9156) ([Azat Khuzhin](https://github.com/azat)) +* Make "performance_introspection_and_logging" test reliable to random server stuck. This may happen in CI environment. See also [#9515](https://github.com/ClickHouse/ClickHouse/issues/9515) [#9528](https://github.com/ClickHouse/ClickHouse/pull/9528) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Validate XML in style check. [#9550](https://github.com/ClickHouse/ClickHouse/pull/9550) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed race condition in test `00738_lock_for_inner_table`. This test relied on sleep. [#9555](https://github.com/ClickHouse/ClickHouse/pull/9555) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove performance tests of type `once`. This is needed to run all performance tests in statistical comparison mode (more reliable). [#9557](https://github.com/ClickHouse/ClickHouse/pull/9557) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added performance test for arithmetic functions. [#9326](https://github.com/ClickHouse/ClickHouse/pull/9326) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added performance test for `sumMap` and `sumMapWithOverflow` aggregate functions. Follow-up for [#8933](https://github.com/ClickHouse/ClickHouse/issues/8933) [#8947](https://github.com/ClickHouse/ClickHouse/pull/8947) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Ensure style of ErrorCodes by style check. [#9370](https://github.com/ClickHouse/ClickHouse/pull/9370) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add script for tests history. [#8796](https://github.com/ClickHouse/ClickHouse/pull/8796) ([alesapin](https://github.com/alesapin)) +* Add GCC warning `-Wsuggest-override` to locate and fix all places where `override` keyword must be used. [#8760](https://github.com/ClickHouse/ClickHouse/pull/8760) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +* Ignore weak symbol under Mac OS X because it must be defined [#9538](https://github.com/ClickHouse/ClickHouse/pull/9538) ([Deleted user](https://github.com/ghost)) +* Normalize running time of some queries in performance tests. This is done in preparation to run all the performance tests in comparison mode. [#9565](https://github.com/ClickHouse/ClickHouse/pull/9565) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix some tests to support pytest with query tests [#9062](https://github.com/ClickHouse/ClickHouse/pull/9062) ([Ivan](https://github.com/abyss7)) +* Enable SSL in build with MSan, so server will not fail at startup when running stateless tests [#9531](https://github.com/ClickHouse/ClickHouse/pull/9531) ([tavplubix](https://github.com/tavplubix)) +* Fix database substitution in test results [#9384](https://github.com/ClickHouse/ClickHouse/pull/9384) ([Ilya Yatsishin](https://github.com/qoega)) +* Build fixes for miscellaneous platforms [#9381](https://github.com/ClickHouse/ClickHouse/pull/9381) ([proller](https://github.com/proller)) [#8755](https://github.com/ClickHouse/ClickHouse/pull/8755) ([proller](https://github.com/proller)) [#8631](https://github.com/ClickHouse/ClickHouse/pull/8631) ([proller](https://github.com/proller)) +* Added disks section to stateless-with-coverage test docker image [#9213](https://github.com/ClickHouse/ClickHouse/pull/9213) ([Pavel Kovalenko](https://github.com/Jokser)) +* Get rid of in-source-tree files when building with GRPC [#9588](https://github.com/ClickHouse/ClickHouse/pull/9588) ([Amos Bird](https://github.com/amosbird)) +* Slightly faster build time by removing SessionCleaner from Context. Make the code of SessionCleaner more simple. [#9232](https://github.com/ClickHouse/ClickHouse/pull/9232) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Updated checking for hung queries in clickhouse-test script [#8858](https://github.com/ClickHouse/ClickHouse/pull/8858) ([Alexander Kazakov](https://github.com/Akazz)) +* Removed some useless files from repository. [#8843](https://github.com/ClickHouse/ClickHouse/pull/8843) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Changed type of math perftests from `once` to `loop`. [#8783](https://github.com/ClickHouse/ClickHouse/pull/8783) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Add docker image which allows to build interactive code browser HTML report for our codebase. [#8781](https://github.com/ClickHouse/ClickHouse/pull/8781) ([alesapin](https://github.com/alesapin)) See [Woboq Code Browser](https://clickhouse-test-reports.s3.yandex.net/codebrowser/ClickHouse/dbms/index.html) +* Suppress some test failures under MSan. [#8780](https://github.com/ClickHouse/ClickHouse/pull/8780) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Speedup "exception while insert" test. This test often time out in debug-with-coverage build. [#8711](https://github.com/ClickHouse/ClickHouse/pull/8711) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Updated `libcxx` and `libcxxabi` to master. In preparation to [#9304](https://github.com/ClickHouse/ClickHouse/issues/9304) [#9308](https://github.com/ClickHouse/ClickHouse/pull/9308) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix flacky test `00910_zookeeper_test_alter_compression_codecs`. [#9525](https://github.com/ClickHouse/ClickHouse/pull/9525) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Clean up duplicated linker flags. Make sure the linker won't look up an unexpected symbol. [#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Bird](https://github.com/amosbird)) +* Add `clickhouse-odbc` driver into test images. This allows to test interaction of ClickHouse with ClickHouse via its own ODBC driver. [#9348](https://github.com/ClickHouse/ClickHouse/pull/9348) ([filimonov](https://github.com/filimonov)) +* Fix several bugs in unit tests. [#9047](https://github.com/ClickHouse/ClickHouse/pull/9047) ([alesapin](https://github.com/alesapin)) +* Enable `-Wmissing-include-dirs` GCC warning to eliminate all non-existing includes - mostly as a result of CMake scripting errors [#8704](https://github.com/ClickHouse/ClickHouse/pull/8704) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +* Describe reasons if query profiler cannot work. This is intended for [#9049](https://github.com/ClickHouse/ClickHouse/issues/9049) [#9144](https://github.com/ClickHouse/ClickHouse/pull/9144) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update OpenSSL to upstream master. Fixed the issue when TLS connections may fail with the message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error` and `SSL Exception: error:2400006E:random number generator::error retrieving entropy`. The issue was present in version 20.1. [#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update Dockerfile for server [#8893](https://github.com/ClickHouse/ClickHouse/pull/8893) ([Ilya Mazaev](https://github.com/ne-ray)) +* Minor fixes in build-gcc-from-sources script [#8774](https://github.com/ClickHouse/ClickHouse/pull/8774) ([Michael Nacharov](https://github.com/mnach)) +* Replace `numbers` to `zeros` in perftests where `number` column is not used. This will lead to more clean test results. [#9600](https://github.com/ClickHouse/ClickHouse/pull/9600) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix stack overflow issue when using initializer_list in Column constructors. [#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Deleted user](https://github.com/ghost)) +* Upgrade librdkafka to v1.3.0. Enable bundled `rdkafka` and `gsasl` libraries on Mac OS X. [#9000](https://github.com/ClickHouse/ClickHouse/pull/9000) ([Andrew Onyshchuk](https://github.com/oandrew)) +* build fix on GCC 9.2.0 [#9306](https://github.com/ClickHouse/ClickHouse/pull/9306) ([vxider](https://github.com/Vxider)) + + +## ClickHouse release v20.1 + +### ClickHouse release v20.1.16.120-stable 2020-60-26 + +#### Bug Fix + +* Fix rare crash caused by using `Nullable` column in prewhere condition. Continuation of [#11608](https://github.com/ClickHouse/ClickHouse/issues/11608). [#11869](https://github.com/ClickHouse/ClickHouse/pull/11869) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Don't allow arrayJoin inside higher order functions. It was leading to broken protocol synchronization. This closes [#3933](https://github.com/ClickHouse/ClickHouse/issues/3933). [#11846](https://github.com/ClickHouse/ClickHouse/pull/11846) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix unexpected behaviour of queries like `SELECT *, xyz.*` which were success while an error expected. [#11753](https://github.com/ClickHouse/ClickHouse/pull/11753) ([hexiaoting](https://github.com/hexiaoting)). +* Fixed LOGICAL_ERROR caused by wrong type deduction of complex literals in Values input format. [#11732](https://github.com/ClickHouse/ClickHouse/pull/11732) ([tavplubix](https://github.com/tavplubix)). +* Fix `ORDER BY ... WITH FILL` over const columns. [#11697](https://github.com/ClickHouse/ClickHouse/pull/11697) ([Anton Popov](https://github.com/CurtizJ)). +* Pass proper timeouts when communicating with XDBC bridge. Recently timeouts were not respected when checking bridge liveness and receiving meta info. [#11690](https://github.com/ClickHouse/ClickHouse/pull/11690) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for regular expressions with case-insensitive flags. This fixes [#11101](https://github.com/ClickHouse/ClickHouse/issues/11101) and fixes [#11506](https://github.com/ClickHouse/ClickHouse/issues/11506). [#11649](https://github.com/ClickHouse/ClickHouse/pull/11649) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bloom filters for String (data skipping indices). [#11638](https://github.com/ClickHouse/ClickHouse/pull/11638) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare crash caused by using `Nullable` column in prewhere condition. (Probably it is connected with [#11572](https://github.com/ClickHouse/ClickHouse/issues/11572) somehow). [#11608](https://github.com/ClickHouse/ClickHouse/pull/11608) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong exit code of the clickhouse-client, when exception.code() % 256 = 0. [#11601](https://github.com/ClickHouse/ClickHouse/pull/11601) ([filimonov](https://github.com/filimonov)). +* Fix trivial error in log message about "Mark cache size was lowered" at server startup. This closes [#11399](https://github.com/ClickHouse/ClickHouse/issues/11399). [#11589](https://github.com/ClickHouse/ClickHouse/pull/11589) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now clickhouse-server docker container will prefer IPv6 checking server aliveness. [#11550](https://github.com/ClickHouse/ClickHouse/pull/11550) ([Ivan Starkov](https://github.com/istarkov)). +* Fix memory leak when exception is thrown in the middle of aggregation with -State functions. This fixes [#8995](https://github.com/ClickHouse/ClickHouse/issues/8995). [#11496](https://github.com/ClickHouse/ClickHouse/pull/11496) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix usage of primary key wrapped into a function with 'FINAL' modifier and 'ORDER BY' optimization. [#10715](https://github.com/ClickHouse/ClickHouse/pull/10715) ([Anton Popov](https://github.com/CurtizJ)). + + +### ClickHouse release v20.1.15.109-stable 2020-06-19 + +#### Bug Fix + +* Fix excess lock for structure during alter. [#11790](https://github.com/ClickHouse/ClickHouse/pull/11790) ([alesapin](https://github.com/alesapin)). + + +### ClickHouse release v20.1.14.107-stable 2020-06-11 + +#### Bug Fix + +* Fix error `Size of offsets does not match size of column` for queries with `PREWHERE column in (subquery)` and `ARRAY JOIN`. [#11580](https://github.com/ClickHouse/ClickHouse/pull/11580) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + + +### ClickHouse release v20.1.13.105-stable 2020-06-10 + +#### Bug Fix + +* Fix the error `Data compressed with different methods` that can happen if `min_bytes_to_use_direct_io` is enabled and PREWHERE is active and using SAMPLE or high number of threads. This fixes [#11539](https://github.com/ClickHouse/ClickHouse/issues/11539). [#11540](https://github.com/ClickHouse/ClickHouse/pull/11540) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix return compressed size for codecs. [#11448](https://github.com/ClickHouse/ClickHouse/pull/11448) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix server crash when a column has compression codec with non-literal arguments. Fixes [#11365](https://github.com/ClickHouse/ClickHouse/issues/11365). [#11431](https://github.com/ClickHouse/ClickHouse/pull/11431) ([alesapin](https://github.com/alesapin)). +* Fix pointInPolygon with nan as point. Fixes [#11375](https://github.com/ClickHouse/ClickHouse/issues/11375). [#11421](https://github.com/ClickHouse/ClickHouse/pull/11421) ([Alexey Ilyukhov](https://github.com/livace)). +* Fixed geohashesInBox with arguments outside of latitude/longitude range. [#11403](https://github.com/ClickHouse/ClickHouse/pull/11403) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix possible `Pipeline stuck` error for queries with external sort and limit. Fixes [#11359](https://github.com/ClickHouse/ClickHouse/issues/11359). [#11366](https://github.com/ClickHouse/ClickHouse/pull/11366) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in `quantilesExactWeightedArray`. [#11337](https://github.com/ClickHouse/ClickHouse/pull/11337) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Make writing to `MATERIALIZED VIEW` with setting `parallel_view_processing = 1` parallel again. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#11330](https://github.com/ClickHouse/ClickHouse/pull/11330) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix visitParamExtractRaw when extracted JSON has strings with unbalanced { or [. [#11318](https://github.com/ClickHouse/ClickHouse/pull/11318) ([Ewout](https://github.com/devwout)). +* Fix very rare race condition in ThreadPool. [#11314](https://github.com/ClickHouse/ClickHouse/pull/11314) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential uninitialized memory in conversion. Example: `SELECT toIntervalSecond(now64())`. [#11311](https://github.com/ClickHouse/ClickHouse/pull/11311) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the issue when index analysis cannot work if a table has Array column in primary key and if a query is filtering by this column with `empty` or `notEmpty` functions. This fixes [#11286](https://github.com/ClickHouse/ClickHouse/issues/11286). [#11303](https://github.com/ClickHouse/ClickHouse/pull/11303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug when query speed estimation can be incorrect and the limit of `min_execution_speed` may not work or work incorrectly if the query is throttled by `max_network_bandwidth`, `max_execution_speed` or `priority` settings. Change the default value of `timeout_before_checking_execution_speed` to non-zero, because otherwise the settings `min_execution_speed` and `max_execution_speed` have no effect. This fixes [#11297](https://github.com/ClickHouse/ClickHouse/issues/11297). This fixes [#5732](https://github.com/ClickHouse/ClickHouse/issues/5732). This fixes [#6228](https://github.com/ClickHouse/ClickHouse/issues/6228). Usability improvement: avoid concatenation of exception message with progress bar in `clickhouse-client`. [#11296](https://github.com/ClickHouse/ClickHouse/pull/11296) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash while reading malformed data in Protobuf format. This fixes [#5957](https://github.com/ClickHouse/ClickHouse/issues/5957), fixes [#11203](https://github.com/ClickHouse/ClickHouse/issues/11203). [#11258](https://github.com/ClickHouse/ClickHouse/pull/11258) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible error `Cannot capture column` for higher-order functions with `Array(Array(LowCardinality))` captured argument. [#11185](https://github.com/ClickHouse/ClickHouse/pull/11185) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* If data skipping index is dependent on columns that are going to be modified during background merge (for SummingMergeTree, AggregatingMergeTree as well as for TTL GROUP BY), it was calculated incorrectly. This issue is fixed by moving index calculation after merge so the index is calculated on merged data. [#11162](https://github.com/ClickHouse/ClickHouse/pull/11162) ([Azat Khuzhin](https://github.com/azat)). +* Remove logging from mutation finalization task if nothing was finalized. [#11109](https://github.com/ClickHouse/ClickHouse/pull/11109) ([alesapin](https://github.com/alesapin)). +* Fixed parseDateTime64BestEffort argument resolution bugs. [#10925](https://github.com/ClickHouse/ClickHouse/issues/10925). [#11038](https://github.com/ClickHouse/ClickHouse/pull/11038) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix incorrect raw data size in method getRawData(). [#10964](https://github.com/ClickHouse/ClickHouse/pull/10964) ([Igr](https://github.com/ObjatieGroba)). +* Fix backward compatibility with tuples in Distributed tables. [#10889](https://github.com/ClickHouse/ClickHouse/pull/10889) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SIGSEGV in StringHashTable (if such key does not exist). [#10870](https://github.com/ClickHouse/ClickHouse/pull/10870) ([Azat Khuzhin](https://github.com/azat)). +* Fixed bug in `ReplicatedMergeTree` which might cause some `ALTER` on `OPTIMIZE` query to hang waiting for some replica after it become inactive. [#10849](https://github.com/ClickHouse/ClickHouse/pull/10849) ([tavplubix](https://github.com/tavplubix)). +* Fix columns order after Block::sortColumns() (also add a test that shows that it affects some real use case - Buffer engine). [#10826](https://github.com/ClickHouse/ClickHouse/pull/10826) ([Azat Khuzhin](https://github.com/azat)). +* Fix the issue with ODBC bridge when no quoting of identifiers is requested. This fixes [#7984](https://github.com/ClickHouse/ClickHouse/issues/7984). [#10821](https://github.com/ClickHouse/ClickHouse/pull/10821) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix UBSan and MSan report in DateLUT. [#10798](https://github.com/ClickHouse/ClickHouse/pull/10798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* - Make use of `src_type` for correct type conversion in key conditions. Fixes [#6287](https://github.com/ClickHouse/ClickHouse/issues/6287). [#10791](https://github.com/ClickHouse/ClickHouse/pull/10791) ([Andrew Onyshchuk](https://github.com/oandrew)). +* Fix `parallel_view_processing` behavior. Now all insertions into `MATERIALIZED VIEW` without exception should be finished if exception happened. Fixes [#10241](https://github.com/ClickHouse/ClickHouse/issues/10241). [#10757](https://github.com/ClickHouse/ClickHouse/pull/10757) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix combinator -OrNull and -OrDefault when combined with -State. [#10741](https://github.com/ClickHouse/ClickHouse/pull/10741) ([hcz](https://github.com/hczhcz)). +* Fix disappearing totals. Totals could have being filtered if query had had join or subquery with external where condition. Fixes [#10674](https://github.com/ClickHouse/ClickHouse/issues/10674). [#10698](https://github.com/ClickHouse/ClickHouse/pull/10698) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix multiple usages of `IN` operator with the identical set in one query. [#10686](https://github.com/ClickHouse/ClickHouse/pull/10686) ([Anton Popov](https://github.com/CurtizJ)). +* Fix order of parameters in AggregateTransform constructor. [#10667](https://github.com/ClickHouse/ClickHouse/pull/10667) ([palasonic1](https://github.com/palasonic1)). +* Fix the lack of parallel execution of remote queries with `distributed_aggregation_memory_efficient` enabled. Fixes [#10655](https://github.com/ClickHouse/ClickHouse/issues/10655). [#10664](https://github.com/ClickHouse/ClickHouse/pull/10664) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix predicates optimization for distributed queries (`enable_optimize_predicate_expression=1`) for queries with `HAVING` section (i.e. when filtering on the server initiator is required), by preserving the order of expressions (and this is enough to fix), and also force aggregator use column names over indexes. Fixes: [#10613](https://github.com/ClickHouse/ClickHouse/issues/10613), [#11413](https://github.com/ClickHouse/ClickHouse/issues/11413). [#10621](https://github.com/ClickHouse/ClickHouse/pull/10621) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `the BloomFilter false positive must be a double number between 0 and 1` [#10551](https://github.com/ClickHouse/ClickHouse/issues/10551). [#10569](https://github.com/ClickHouse/ClickHouse/pull/10569) ([Winter Zhang](https://github.com/zhang2014)). +* Fix SELECT of column ALIAS which default expression type different from column type. [#10563](https://github.com/ClickHouse/ClickHouse/pull/10563) ([Azat Khuzhin](https://github.com/azat)). +* * Implemented comparison between DateTime64 and String values (just like for DateTime). [#10560](https://github.com/ClickHouse/ClickHouse/pull/10560) ([Vasily Nemkov](https://github.com/Enmk)). + + +### ClickHouse release v20.1.12.86, 2020-05-26 + +#### Bug Fix + +* Fixed incompatibility of two-level aggregation between versions 20.1 and earlier. This incompatibility happens when different versions of ClickHouse are used on initiator node and remote nodes and the size of GROUP BY result is large and aggregation is performed by a single String field. It leads to several unmerged rows for a single key in result. [#10952](https://github.com/ClickHouse/ClickHouse/pull/10952) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed data corruption for `LowCardinality(FixedString)` key column in `SummingMergeTree` which could have happened after merge. Fixes [#10489](https://github.com/ClickHouse/ClickHouse/issues/10489). [#10721](https://github.com/ClickHouse/ClickHouse/pull/10721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug, which causes http requests stuck on client close when `readonly=2` and `cancel_http_readonly_queries_on_client_close=1`. Fixes [#7939](https://github.com/ClickHouse/ClickHouse/issues/7939), [#7019](https://github.com/ClickHouse/ClickHouse/issues/7019), [#7736](https://github.com/ClickHouse/ClickHouse/issues/7736), [#7091](https://github.com/ClickHouse/ClickHouse/issues/7091). [#10684](https://github.com/ClickHouse/ClickHouse/pull/10684) ([tavplubix](https://github.com/tavplubix)). +* Fixed a bug when on `SYSTEM DROP DNS CACHE` query also drop caches, which are used to check if user is allowed to connect from some IP addresses. [#10608](https://github.com/ClickHouse/ClickHouse/pull/10608) ([tavplubix](https://github.com/tavplubix)). +* Fixed incorrect scalar results inside inner query of `MATERIALIZED VIEW` in case if this query contained dependent table. [#10603](https://github.com/ClickHouse/ClickHouse/pull/10603) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the situation when mutation finished all parts, but hung up in `is_done=0`. [#10526](https://github.com/ClickHouse/ClickHouse/pull/10526) ([alesapin](https://github.com/alesapin)). +* Fixed overflow at beginning of unix epoch for timezones with fractional offset from UTC. This fixes [#9335](https://github.com/ClickHouse/ClickHouse/issues/9335). [#10513](https://github.com/ClickHouse/ClickHouse/pull/10513) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed improper shutdown of Distributed storage. [#10491](https://github.com/ClickHouse/ClickHouse/pull/10491) ([Azat Khuzhin](https://github.com/azat)). +* Fixed numeric overflow in `simpleLinearRegression` over large integers. [#10474](https://github.com/ClickHouse/ClickHouse/pull/10474) ([hcz](https://github.com/hczhcz)). +* Fixed removing metadata directory when attach database fails. [#10442](https://github.com/ClickHouse/ClickHouse/pull/10442) ([Winter Zhang](https://github.com/zhang2014)). +* Added a check of number and type of arguments when creating `BloomFilter` index [#9623](https://github.com/ClickHouse/ClickHouse/issues/9623). [#10431](https://github.com/ClickHouse/ClickHouse/pull/10431) ([Winter Zhang](https://github.com/zhang2014)). +* Fixed the issue when a query with `ARRAY JOIN`, `ORDER BY` and `LIMIT` may return incomplete result. This fixes [#10226](https://github.com/ClickHouse/ClickHouse/issues/10226). [#10427](https://github.com/ClickHouse/ClickHouse/pull/10427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Prefer `fallback_to_stale_replicas` over `skip_unavailable_shards`. [#10422](https://github.com/ClickHouse/ClickHouse/pull/10422) ([Azat Khuzhin](https://github.com/azat)). +* Fixed wrong flattening of `Array(Tuple(...))` data types. This fixes [#10259](https://github.com/ClickHouse/ClickHouse/issues/10259). [#10390](https://github.com/ClickHouse/ClickHouse/pull/10390) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong behavior in `HashTable` that caused compilation error when trying to read HashMap from buffer. [#10386](https://github.com/ClickHouse/ClickHouse/pull/10386) ([palasonic1](https://github.com/palasonic1)). +* Fixed possible `Pipeline stuck` error in `ConcatProcessor` which could have happened in remote query. [#10381](https://github.com/ClickHouse/ClickHouse/pull/10381) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed error `Pipeline stuck` with `max_rows_to_group_by` and `group_by_overflow_mode = 'break'`. [#10279](https://github.com/ClickHouse/ClickHouse/pull/10279) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed several bugs when some data was inserted with quorum, then deleted somehow (DROP PARTITION, TTL) and this leaded to the stuck of INSERTs or false-positive exceptions in SELECTs. This fixes [#9946](https://github.com/ClickHouse/ClickHouse/issues/9946). [#10188](https://github.com/ClickHouse/ClickHouse/pull/10188) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed incompatibility when versions prior to 18.12.17 are used on remote servers and newer is used on initiating server, and GROUP BY both fixed and non-fixed keys, and when two-level group by method is activated. [#3254](https://github.com/ClickHouse/ClickHouse/pull/3254) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Build/Testing/Packaging Improvement + +* Added CA certificates to clickhouse-server docker image. [#10476](https://github.com/ClickHouse/ClickHouse/pull/10476) ([filimonov](https://github.com/filimonov)). + + +### ClickHouse release v20.1.10.70, 2020-04-17 + +#### Bug Fix + +* Fix rare possible exception `Cannot drain connections: cancel first`. [#10239](https://github.com/ClickHouse/ClickHouse/pull/10239) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug where ClickHouse would throw `'Unknown function lambda.'` error message when user tries to run `ALTER UPDATE/DELETE` on tables with `ENGINE = Replicated*`. Check for nondeterministic functions now handles lambda expressions correctly. [#10237](https://github.com/ClickHouse/ClickHouse/pull/10237) ([Alexander Kazakov](https://github.com/Akazz)). +* Fix `parseDateTimeBestEffort` for strings in RFC-2822 when day of week is Tuesday or Thursday. This fixes [#10082](https://github.com/ClickHouse/ClickHouse/issues/10082). [#10214](https://github.com/ClickHouse/ClickHouse/pull/10214) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix column names of constants inside `JOIN` that may clash with names of constants outside of `JOIN`. [#10207](https://github.com/ClickHouse/ClickHouse/pull/10207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible inifinite query execution when the query actually should stop on LIMIT, while reading from infinite source like `system.numbers` or `system.zeros`. [#10206](https://github.com/ClickHouse/ClickHouse/pull/10206) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix move-to-prewhere optimization in presense of `arrayJoin` functions (in certain cases). This fixes [#10092](https://github.com/ClickHouse/ClickHouse/issues/10092). [#10195](https://github.com/ClickHouse/ClickHouse/pull/10195) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add the ability to relax the restriction on non-deterministic functions usage in mutations with `allow_nondeterministic_mutations` setting. [#10186](https://github.com/ClickHouse/ClickHouse/pull/10186) ([filimonov](https://github.com/filimonov)). +* Convert blocks if structure does not match on `INSERT` into table with `Distributed` engine. [#10135](https://github.com/ClickHouse/ClickHouse/pull/10135) ([Azat Khuzhin](https://github.com/azat)). +* Fix `SIGSEGV` on `INSERT` into `Distributed` table when its structure differs from the underlying tables. [#10105](https://github.com/ClickHouse/ClickHouse/pull/10105) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible rows loss for queries with `JOIN` and `UNION ALL`. Fixes [#9826](https://github.com/ClickHouse/ClickHouse/issues/9826), [#10113](https://github.com/ClickHouse/ClickHouse/issues/10113). [#10099](https://github.com/ClickHouse/ClickHouse/pull/10099) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add arguments check and support identifier arguments for MySQL Database Engine. [#10077](https://github.com/ClickHouse/ClickHouse/pull/10077) ([Winter Zhang](https://github.com/zhang2014)). +* Fix bug in clickhouse dictionary source from localhost clickhouse server. The bug may lead to memory corruption if types in dictionary and source are not compatible. [#10071](https://github.com/ClickHouse/ClickHouse/pull/10071) ([alesapin](https://github.com/alesapin)). +* Fix error `Cannot clone block with columns because block has 0 columns ... While executing GroupingAggregatedTransform`. It happened when setting `distributed_aggregation_memory_efficient` was enabled, and distributed query read aggregating data with different level from different shards (mixed single and two level aggregation). [#10063](https://github.com/ClickHouse/ClickHouse/pull/10063) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a segmentation fault that could occur in `GROUP BY` over string keys containing trailing zero bytes ([#8636](https://github.com/ClickHouse/ClickHouse/issues/8636), [#8925](https://github.com/ClickHouse/ClickHouse/issues/8925)). [#10025](https://github.com/ClickHouse/ClickHouse/pull/10025) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix bug in which the necessary tables weren't retrieved at one of the processing stages of queries to some databases. Fixes [#9699](https://github.com/ClickHouse/ClickHouse/issues/9699). [#9949](https://github.com/ClickHouse/ClickHouse/pull/9949) ([achulkov2](https://github.com/achulkov2)). +* Fix `'Not found column in block'` error when `JOIN` appears with `TOTALS`. Fixes [#9839](https://github.com/ClickHouse/ClickHouse/issues/9839). [#9939](https://github.com/ClickHouse/ClickHouse/pull/9939) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix a bug with `ON CLUSTER` DDL queries freezing on server startup. [#9927](https://github.com/ClickHouse/ClickHouse/pull/9927) ([Gagan Arneja](https://github.com/garneja)). +* Fix `TRUNCATE` for Join table engine ([#9917](https://github.com/ClickHouse/ClickHouse/issues/9917)). [#9920](https://github.com/ClickHouse/ClickHouse/pull/9920) ([Amos Bird](https://github.com/amosbird)). +* Fix `'scalar does not exist'` error in ALTER queries ([#9878](https://github.com/ClickHouse/ClickHouse/issues/9878)). [#9904](https://github.com/ClickHouse/ClickHouse/pull/9904) ([Amos Bird](https://github.com/amosbird)). +* Fix race condition between drop and optimize in `ReplicatedMergeTree`. [#9901](https://github.com/ClickHouse/ClickHouse/pull/9901) ([alesapin](https://github.com/alesapin)). +* Fixed `DeleteOnDestroy` logic in `ATTACH PART` which could lead to automatic removal of attached part and added few tests. [#9410](https://github.com/ClickHouse/ClickHouse/pull/9410) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Build/Testing/Packaging Improvement + +* Fix unit test `collapsing_sorted_stream`. [#9367](https://github.com/ClickHouse/ClickHouse/pull/9367) ([Deleted user](https://github.com/ghost)). + +### ClickHouse release v20.1.9.54, 2020-03-28 + +#### Bug Fix + +* Fix `'Different expressions with the same alias'` error when query has `PREWHERE` and `WHERE` on distributed table and `SET distributed_product_mode = 'local'`. [#9871](https://github.com/ClickHouse/ClickHouse/pull/9871) ([Artem Zuikov](https://github.com/4ertus2)). +* Fix mutations excessive memory consumption for tables with a composite primary key. This fixes [#9850](https://github.com/ClickHouse/ClickHouse/issues/9850). [#9860](https://github.com/ClickHouse/ClickHouse/pull/9860) ([alesapin](https://github.com/alesapin)). +* For INSERT queries shard now clamps the settings got from the initiator to the shard's constaints instead of throwing an exception. This fix allows to send `INSERT` queries to a shard with another constraints. This change improves fix [#9447](https://github.com/ClickHouse/ClickHouse/issues/9447). [#9852](https://github.com/ClickHouse/ClickHouse/pull/9852) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible exception `Got 0 in totals chunk, expected 1` on client. It happened for queries with `JOIN` in case if right joined table had zero rows. Example: `select * from system.one t1 join system.one t2 on t1.dummy = t2.dummy limit 0 FORMAT TabSeparated;`. Fixes [#9777](https://github.com/ClickHouse/ClickHouse/issues/9777). [#9823](https://github.com/ClickHouse/ClickHouse/pull/9823) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `SIGSEGV` with `optimize_skip_unused_shards` when type cannot be converted. [#9804](https://github.com/ClickHouse/ClickHouse/pull/9804) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a few cases when timezone of the function argument wasn't used properly. [#9574](https://github.com/ClickHouse/ClickHouse/pull/9574) ([Vasily Nemkov](https://github.com/Enmk)). + +#### Improvement + +* Remove `ORDER BY` stage from mutations because we read from a single ordered part in a single thread. Also add check that the order of rows in mutation is ordered in sorting key order and this order is not violated. [#9886](https://github.com/ClickHouse/ClickHouse/pull/9886) ([alesapin](https://github.com/alesapin)). + +#### Build/Testing/Packaging Improvement + +* Clean up duplicated linker flags. Make sure the linker won't look up an unexpected symbol. [#9433](https://github.com/ClickHouse/ClickHouse/pull/9433) ([Amos Bird](https://github.com/amosbird)). + +### ClickHouse release v20.1.8.41, 2020-03-20 + +#### Bug Fix +* Fix possible permanent `Cannot schedule a task` error (due to unhandled exception in `ParallelAggregatingBlockInputStream::Handler::onFinish/onFinishThread`). This fixes [#6833](https://github.com/ClickHouse/ClickHouse/issues/6833). [#9154](https://github.com/ClickHouse/ClickHouse/pull/9154) ([Azat Khuzhin](https://github.com/azat)) +* Fix excessive memory consumption in `ALTER` queries (mutations). This fixes [#9533](https://github.com/ClickHouse/ClickHouse/issues/9533) and [#9670](https://github.com/ClickHouse/ClickHouse/issues/9670). [#9754](https://github.com/ClickHouse/ClickHouse/pull/9754) ([alesapin](https://github.com/alesapin)) +* Fix bug in backquoting in external dictionaries DDL. This fixes [#9619](https://github.com/ClickHouse/ClickHouse/issues/9619). [#9734](https://github.com/ClickHouse/ClickHouse/pull/9734) ([alesapin](https://github.com/alesapin)) + +### ClickHouse release v20.1.7.38, 2020-03-18 + +#### Bug Fix +* Fixed incorrect internal function names for `sumKahan` and `sumWithOverflow`. I lead to exception while using this functions in remote queries. [#9636](https://github.com/ClickHouse/ClickHouse/pull/9636) ([Azat Khuzhin](https://github.com/azat)). This issue was in all ClickHouse releases. +* Allow `ALTER ON CLUSTER` of `Distributed` tables with internal replication. This fixes [#3268](https://github.com/ClickHouse/ClickHouse/issues/3268). [#9617](https://github.com/ClickHouse/ClickHouse/pull/9617) ([shinoi2](https://github.com/shinoi2)). This issue was in all ClickHouse releases. +* Fix possible exceptions `Size of filter does not match size of column` and `Invalid number of rows in Chunk` in `MergeTreeRangeReader`. They could appear while executing `PREWHERE` in some cases. Fixes [#9132](https://github.com/ClickHouse/ClickHouse/issues/9132). [#9612](https://github.com/ClickHouse/ClickHouse/pull/9612) ([Anton Popov](https://github.com/CurtizJ)) +* Fixed the issue: timezone was not preserved if you write a simple arithmetic expression like `time + 1` (in contrast to an expression like `time + INTERVAL 1 SECOND`). This fixes [#5743](https://github.com/ClickHouse/ClickHouse/issues/5743). [#9323](https://github.com/ClickHouse/ClickHouse/pull/9323) ([alexey-milovidov](https://github.com/alexey-milovidov)). This issue was in all ClickHouse releases. +* Now it's not possible to create or add columns with simple cyclic aliases like `a DEFAULT b, b DEFAULT a`. [#9603](https://github.com/ClickHouse/ClickHouse/pull/9603) ([alesapin](https://github.com/alesapin)) +* Fixed the issue when padding at the end of base64 encoded value can be malformed. Update base64 library. This fixes [#9491](https://github.com/ClickHouse/ClickHouse/issues/9491), closes [#9492](https://github.com/ClickHouse/ClickHouse/issues/9492) [#9500](https://github.com/ClickHouse/ClickHouse/pull/9500) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix data race at destruction of `Poco::HTTPServer`. It could happen when server is started and immediately shut down. [#9468](https://github.com/ClickHouse/ClickHouse/pull/9468) ([Anton Popov](https://github.com/CurtizJ)) +* Fix possible crash/wrong number of rows in `LIMIT n WITH TIES` when there are a lot of rows equal to n'th row. [#9464](https://github.com/ClickHouse/ClickHouse/pull/9464) ([tavplubix](https://github.com/tavplubix)) +* Fix possible mismatched checksums with column TTLs. [#9451](https://github.com/ClickHouse/ClickHouse/pull/9451) ([Anton Popov](https://github.com/CurtizJ)) +* Fix crash when a user tries to `ALTER MODIFY SETTING` for old-formated `MergeTree` table engines family. [#9435](https://github.com/ClickHouse/ClickHouse/pull/9435) ([alesapin](https://github.com/alesapin)) +* Now we will try finalize mutations more frequently. [#9427](https://github.com/ClickHouse/ClickHouse/pull/9427) ([alesapin](https://github.com/alesapin)) +* Fix replication protocol incompatibility introduced in [#8598](https://github.com/ClickHouse/ClickHouse/issues/8598). [#9412](https://github.com/ClickHouse/ClickHouse/pull/9412) ([alesapin](https://github.com/alesapin)) +* Fix not(has()) for the bloom_filter index of array types. [#9407](https://github.com/ClickHouse/ClickHouse/pull/9407) ([achimbab](https://github.com/achimbab)) +* Fixed the behaviour of `match` and `extract` functions when haystack has zero bytes. The behaviour was wrong when haystack was constant. This fixes [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) [#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) ([alexey-milovidov](https://github.com/alexey-milovidov)) [#9345](https://github.com/ClickHouse/ClickHouse/pull/9345) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Build/Testing/Packaging Improvement + +* Exception handling now works correctly on Windows Subsystem for Linux. See https://github.com/ClickHouse-Extras/libunwind/pull/3 This fixes [#6480](https://github.com/ClickHouse/ClickHouse/issues/6480) [#9564](https://github.com/ClickHouse/ClickHouse/pull/9564) ([sobolevsv](https://github.com/sobolevsv)) + + +### ClickHouse release v20.1.6.30, 2020-03-05 + +#### Bug Fix + +* Fix data incompatibility when compressed with `T64` codec. +[#9039](https://github.com/ClickHouse/ClickHouse/pull/9039) [(abyss7)](https://github.com/abyss7) +* Fix order of ranges while reading from MergeTree table in one thread. Fixes [#8964](https://github.com/ClickHouse/ClickHouse/issues/8964). +[#9050](https://github.com/ClickHouse/ClickHouse/pull/9050) [(CurtizJ)](https://github.com/CurtizJ) +* Fix possible segfault in `MergeTreeRangeReader`, while executing `PREWHERE`. Fixes [#9064](https://github.com/ClickHouse/ClickHouse/issues/9064). +[#9106](https://github.com/ClickHouse/ClickHouse/pull/9106) [(CurtizJ)](https://github.com/CurtizJ) +* Fix `reinterpretAsFixedString` to return `FixedString` instead of `String`. +[#9052](https://github.com/ClickHouse/ClickHouse/pull/9052) [(oandrew)](https://github.com/oandrew) +* Fix `joinGet` with nullable return types. Fixes [#8919](https://github.com/ClickHouse/ClickHouse/issues/8919) +[#9014](https://github.com/ClickHouse/ClickHouse/pull/9014) [(amosbird)](https://github.com/amosbird) +* Fix fuzz test and incorrect behaviour of bitTestAll/bitTestAny functions. +[#9143](https://github.com/ClickHouse/ClickHouse/pull/9143) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fix the behaviour of match and extract functions when haystack has zero bytes. The behaviour was wrong when haystack was constant. Fixes [#9160](https://github.com/ClickHouse/ClickHouse/issues/9160) +[#9163](https://github.com/ClickHouse/ClickHouse/pull/9163) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fixed execution of inversed predicates when non-strictly monotinic functional index is used. Fixes [#9034](https://github.com/ClickHouse/ClickHouse/issues/9034) +[#9223](https://github.com/ClickHouse/ClickHouse/pull/9223) [(Akazz)](https://github.com/Akazz) +* Allow to rewrite `CROSS` to `INNER JOIN` if there's `[NOT] LIKE` operator in `WHERE` section. Fixes [#9191](https://github.com/ClickHouse/ClickHouse/issues/9191) +[#9229](https://github.com/ClickHouse/ClickHouse/pull/9229) [(4ertus2)](https://github.com/4ertus2) +* Allow first column(s) in a table with Log engine be an alias. +[#9231](https://github.com/ClickHouse/ClickHouse/pull/9231) [(abyss7)](https://github.com/abyss7) +* Allow comma join with `IN()` inside. Fixes [#7314](https://github.com/ClickHouse/ClickHouse/issues/7314). +[#9251](https://github.com/ClickHouse/ClickHouse/pull/9251) [(4ertus2)](https://github.com/4ertus2) +* Improve `ALTER MODIFY/ADD` queries logic. Now you cannot `ADD` column without type, `MODIFY` default expression does not change type of column and `MODIFY` type does not loose default expression value. Fixes [#8669](https://github.com/ClickHouse/ClickHouse/issues/8669). +[#9227](https://github.com/ClickHouse/ClickHouse/pull/9227) [(alesapin)](https://github.com/alesapin) +* Fix mutations finalization, when already done mutation can have status is_done=0. +[#9217](https://github.com/ClickHouse/ClickHouse/pull/9217) [(alesapin)](https://github.com/alesapin) +* Support "Processors" pipeline for system.numbers and system.numbers_mt. This also fixes the bug when `max_execution_time` is not respected. +[#7796](https://github.com/ClickHouse/ClickHouse/pull/7796) [(KochetovNicolai)](https://github.com/KochetovNicolai) +* Fix wrong counting of `DictCacheKeysRequestedFound` metric. +[#9411](https://github.com/ClickHouse/ClickHouse/pull/9411) [(nikitamikhaylov)](https://github.com/nikitamikhaylov) +* Added a check for storage policy in `ATTACH PARTITION FROM`, `REPLACE PARTITION`, `MOVE TO TABLE` which otherwise could make data of part inaccessible after restart and prevent ClickHouse to start. +[#9383](https://github.com/ClickHouse/ClickHouse/pull/9383) [(excitoon)](https://github.com/excitoon) +* Fixed UBSan report in `MergeTreeIndexSet`. This fixes [#9250](https://github.com/ClickHouse/ClickHouse/issues/9250) +[#9365](https://github.com/ClickHouse/ClickHouse/pull/9365) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fix possible datarace in BlockIO. +[#9356](https://github.com/ClickHouse/ClickHouse/pull/9356) [(KochetovNicolai)](https://github.com/KochetovNicolai) +* Support for `UInt64` numbers that don't fit in Int64 in JSON-related functions. Update `SIMDJSON` to master. This fixes [#9209](https://github.com/ClickHouse/ClickHouse/issues/9209) +[#9344](https://github.com/ClickHouse/ClickHouse/pull/9344) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* Fix the issue when the amount of free space is not calculated correctly if the data directory is mounted to a separate device. For default disk calculate the free space from data subdirectory. This fixes [#7441](https://github.com/ClickHouse/ClickHouse/issues/7441) +[#9257](https://github.com/ClickHouse/ClickHouse/pull/9257) [(millb)](https://github.com/millb) +* Fix the issue when TLS connections may fail with the message `OpenSSL SSL_read: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error and SSL Exception: error:2400006E:random number generator::error retrieving entropy.` Update OpenSSL to upstream master. +[#8956](https://github.com/ClickHouse/ClickHouse/pull/8956) [(alexey-milovidov)](https://github.com/alexey-milovidov) +* When executing `CREATE` query, fold constant expressions in storage engine arguments. Replace empty database name with current database. Fixes [#6508](https://github.com/ClickHouse/ClickHouse/issues/6508), [#3492](https://github.com/ClickHouse/ClickHouse/issues/3492). Also fix check for local address in ClickHouseDictionarySource. +[#9262](https://github.com/ClickHouse/ClickHouse/pull/9262) [(tabplubix)](https://github.com/tavplubix) +* Fix segfault in `StorageMerge`, which can happen when reading from StorageFile. +[#9387](https://github.com/ClickHouse/ClickHouse/pull/9387) [(tabplubix)](https://github.com/tavplubix) +* Prevent losing data in `Kafka` in rare cases when exception happens after reading suffix but before commit. Fixes [#9378](https://github.com/ClickHouse/ClickHouse/issues/9378). Related: [#7175](https://github.com/ClickHouse/ClickHouse/issues/7175) +[#9507](https://github.com/ClickHouse/ClickHouse/pull/9507) [(filimonov)](https://github.com/filimonov) +* Fix bug leading to server termination when trying to use / drop `Kafka` table created with wrong parameters. Fixes [#9494](https://github.com/ClickHouse/ClickHouse/issues/9494). Incorporates [#9507](https://github.com/ClickHouse/ClickHouse/issues/9507). +[#9513](https://github.com/ClickHouse/ClickHouse/pull/9513) [(filimonov)](https://github.com/filimonov) + +#### New Feature +* Add `deduplicate_blocks_in_dependent_materialized_views` option to control the behaviour of idempotent inserts into tables with materialized views. This new feature was added to the bugfix release by a special request from Altinity. +[#9070](https://github.com/ClickHouse/ClickHouse/pull/9070) [(urykhy)](https://github.com/urykhy) + +### ClickHouse release v20.1.2.4, 2020-01-22 + +#### Backward Incompatible Change +* Make the setting `merge_tree_uniform_read_distribution` obsolete. The server still recognizes this setting but it has no effect. [#8308](https://github.com/ClickHouse/ClickHouse/pull/8308) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Changed return type of the function `greatCircleDistance` to `Float32` because now the result of calculation is `Float32`. [#7993](https://github.com/ClickHouse/ClickHouse/pull/7993) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now it's expected that query parameters are represented in "escaped" format. For example, to pass string `ab` you have to write `a\tb` or `a\b` and respectively, `a%5Ctb` or `a%5C%09b` in URL. This is needed to add the possibility to pass NULL as `\N`. This fixes [#7488](https://github.com/ClickHouse/ClickHouse/issues/7488). [#8517](https://github.com/ClickHouse/ClickHouse/pull/8517) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enable `use_minimalistic_part_header_in_zookeeper` setting for `ReplicatedMergeTree` by default. This will significantly reduce amount of data stored in ZooKeeper. This setting is supported since version 19.1 and we already use it in production in multiple services without any issues for more than half a year. Disable this setting if you have a chance to downgrade to versions older than 19.1. [#6850](https://github.com/ClickHouse/ClickHouse/pull/6850) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Data skipping indices are production ready and enabled by default. The settings `allow_experimental_data_skipping_indices`, `allow_experimental_cross_to_join_conversion` and `allow_experimental_multiple_joins_emulation` are now obsolete and do nothing. [#7974](https://github.com/ClickHouse/ClickHouse/pull/7974) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add new `ANY JOIN` logic for `StorageJoin` consistent with `JOIN` operation. To upgrade without changes in behaviour you need add `SETTINGS any_join_distinct_right_table_keys = 1` to Engine Join tables metadata or recreate these tables after upgrade. [#8400](https://github.com/ClickHouse/ClickHouse/pull/8400) ([Artem Zuikov](https://github.com/4ertus2)) +* Require server to be restarted to apply the changes in logging configuration. This is a temporary workaround to avoid the bug where the server logs to a deleted log file (see [#8696](https://github.com/ClickHouse/ClickHouse/issues/8696)). [#8707](https://github.com/ClickHouse/ClickHouse/pull/8707) ([Alexander Kuzmenkov](https://github.com/akuzm)) + +#### New Feature +* Added information about part paths to `system.merges`. [#8043](https://github.com/ClickHouse/ClickHouse/pull/8043) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Add ability to execute `SYSTEM RELOAD DICTIONARY` query in `ON CLUSTER` mode. [#8288](https://github.com/ClickHouse/ClickHouse/pull/8288) ([Guillaume Tassery](https://github.com/YiuRULE)) +* Add ability to execute `CREATE DICTIONARY` queries in `ON CLUSTER` mode. [#8163](https://github.com/ClickHouse/ClickHouse/pull/8163) ([alesapin](https://github.com/alesapin)) +* Now user's profile in `users.xml` can inherit multiple profiles. [#8343](https://github.com/ClickHouse/ClickHouse/pull/8343) ([Mikhail f. Shiryaev](https://github.com/Felixoid)) +* Added `system.stack_trace` table that allows to look at stack traces of all server threads. This is useful for developers to introspect server state. This fixes [#7576](https://github.com/ClickHouse/ClickHouse/issues/7576). [#8344](https://github.com/ClickHouse/ClickHouse/pull/8344) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `DateTime64` datatype with configurable sub-second precision. [#7170](https://github.com/ClickHouse/ClickHouse/pull/7170) ([Vasily Nemkov](https://github.com/Enmk)) +* Add table function `clusterAllReplicas` which allows to query all the nodes in the cluster. [#8493](https://github.com/ClickHouse/ClickHouse/pull/8493) ([kiran sunkari](https://github.com/kiransunkari)) +* Add aggregate function `categoricalInformationValue` which calculates the information value of a discrete feature. [#8117](https://github.com/ClickHouse/ClickHouse/pull/8117) ([hcz](https://github.com/hczhcz)) +* Speed up parsing of data files in `CSV`, `TSV` and `JSONEachRow` format by doing it in parallel. [#7780](https://github.com/ClickHouse/ClickHouse/pull/7780) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Add function `bankerRound` which performs banker's rounding. [#8112](https://github.com/ClickHouse/ClickHouse/pull/8112) ([hcz](https://github.com/hczhcz)) +* Support more languages in embedded dictionary for region names: 'ru', 'en', 'ua', 'uk', 'by', 'kz', 'tr', 'de', 'uz', 'lv', 'lt', 'et', 'pt', 'he', 'vi'. [#8189](https://github.com/ClickHouse/ClickHouse/pull/8189) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improvements in consistency of `ANY JOIN` logic. Now `t1 ANY LEFT JOIN t2` equals `t2 ANY RIGHT JOIN t1`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +* Add setting `any_join_distinct_right_table_keys` which enables old behaviour for `ANY INNER JOIN`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +* Add new `SEMI` and `ANTI JOIN`. Old `ANY INNER JOIN` behaviour now available as `SEMI LEFT JOIN`. [#7665](https://github.com/ClickHouse/ClickHouse/pull/7665) ([Artem Zuikov](https://github.com/4ertus2)) +* Added `Distributed` format for `File` engine and `file` table function which allows to read from `.bin` files generated by asynchronous inserts into `Distributed` table. [#8535](https://github.com/ClickHouse/ClickHouse/pull/8535) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Add optional reset column argument for `runningAccumulate` which allows to reset aggregation results for each new key value. [#8326](https://github.com/ClickHouse/ClickHouse/pull/8326) ([Sergey Kononenko](https://github.com/kononencheg)) +* Add ability to use ClickHouse as Prometheus endpoint. [#7900](https://github.com/ClickHouse/ClickHouse/pull/7900) ([vdimir](https://github.com/Vdimir)) +* Add section `` in `config.xml` which restricts allowed hosts for remote table engines and table functions `URL`, `S3`, `HDFS`. [#7154](https://github.com/ClickHouse/ClickHouse/pull/7154) ([Mikhail Korotov](https://github.com/millb)) +* Added function `greatCircleAngle` which calculates the distance on a sphere in degrees. [#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Changed Earth radius to be consistent with H3 library. [#8105](https://github.com/ClickHouse/ClickHouse/pull/8105) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added `JSONCompactEachRow` and `JSONCompactEachRowWithNamesAndTypes` formats for input and output. [#7841](https://github.com/ClickHouse/ClickHouse/pull/7841) ([Mikhail Korotov](https://github.com/millb)) +* Added feature for file-related table engines and table functions (`File`, `S3`, `URL`, `HDFS`) which allows to read and write `gzip` files based on additional engine parameter or file extension. [#7840](https://github.com/ClickHouse/ClickHouse/pull/7840) ([Andrey Bodrov](https://github.com/apbodrov)) +* Added the `randomASCII(length)` function, generating a string with a random set of [ASCII](https://en.wikipedia.org/wiki/ASCII#Printable_characters) printable characters. [#8401](https://github.com/ClickHouse/ClickHouse/pull/8401) ([BayoNet](https://github.com/BayoNet)) +* Added function `JSONExtractArrayRaw` which returns an array on unparsed json array elements from `JSON` string. [#8081](https://github.com/ClickHouse/ClickHouse/pull/8081) ([Oleg Matrokhin](https://github.com/errx)) +* Add `arrayZip` function which allows to combine multiple arrays of equal lengths into one array of tuples. [#8149](https://github.com/ClickHouse/ClickHouse/pull/8149) ([Winter Zhang](https://github.com/zhang2014)) +* Add ability to move data between disks according to configured `TTL`-expressions for `*MergeTree` table engines family. [#8140](https://github.com/ClickHouse/ClickHouse/pull/8140) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Added new aggregate function `avgWeighted` which allows to calculate weighted average. [#7898](https://github.com/ClickHouse/ClickHouse/pull/7898) ([Andrey Bodrov](https://github.com/apbodrov)) +* Now parallel parsing is enabled by default for `TSV`, `TSKV`, `CSV` and `JSONEachRow` formats. [#7894](https://github.com/ClickHouse/ClickHouse/pull/7894) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Add several geo functions from `H3` library: `h3GetResolution`, `h3EdgeAngle`, `h3EdgeLength`, `h3IsValid` and `h3kRing`. [#8034](https://github.com/ClickHouse/ClickHouse/pull/8034) ([Konstantin Malanchev](https://github.com/hombit)) +* Added support for brotli (`br`) compression in file-related storages and table functions. This fixes [#8156](https://github.com/ClickHouse/ClickHouse/issues/8156). [#8526](https://github.com/ClickHouse/ClickHouse/pull/8526) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add `groupBit*` functions for the `SimpleAggregationFunction` type. [#8485](https://github.com/ClickHouse/ClickHouse/pull/8485) ([Guillaume Tassery](https://github.com/YiuRULE)) + +#### Bug Fix +* Fix rename of tables with `Distributed` engine. Fixes issue [#7868](https://github.com/ClickHouse/ClickHouse/issues/7868). [#8306](https://github.com/ClickHouse/ClickHouse/pull/8306) ([tavplubix](https://github.com/tavplubix)) +* Now dictionaries support `EXPRESSION` for attributes in arbitrary string in non-ClickHouse SQL dialect. [#8098](https://github.com/ClickHouse/ClickHouse/pull/8098) ([alesapin](https://github.com/alesapin)) +* Fix broken `INSERT SELECT FROM mysql(...)` query. This fixes [#8070](https://github.com/ClickHouse/ClickHouse/issues/8070) and [#7960](https://github.com/ClickHouse/ClickHouse/issues/7960). [#8234](https://github.com/ClickHouse/ClickHouse/pull/8234) ([tavplubix](https://github.com/tavplubix)) +* Fix error "Mismatch column sizes" when inserting default `Tuple` from `JSONEachRow`. This fixes [#5653](https://github.com/ClickHouse/ClickHouse/issues/5653). [#8606](https://github.com/ClickHouse/ClickHouse/pull/8606) ([tavplubix](https://github.com/tavplubix)) +* Now an exception will be thrown in case of using `WITH TIES` alongside `LIMIT BY`. Also add ability to use `TOP` with `LIMIT BY`. This fixes [#7472](https://github.com/ClickHouse/ClickHouse/issues/7472). [#7637](https://github.com/ClickHouse/ClickHouse/pull/7637) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix unintendent dependency from fresh glibc version in `clickhouse-odbc-bridge` binary. [#8046](https://github.com/ClickHouse/ClickHouse/pull/8046) ([Amos Bird](https://github.com/amosbird)) +* Fix bug in check function of `*MergeTree` engines family. Now it does not fail in case when we have equal amount of rows in last granule and last mark (non-final). [#8047](https://github.com/ClickHouse/ClickHouse/pull/8047) ([alesapin](https://github.com/alesapin)) +* Fix insert into `Enum*` columns after `ALTER` query, when underlying numeric type is equal to table specified type. This fixes [#7836](https://github.com/ClickHouse/ClickHouse/issues/7836). [#7908](https://github.com/ClickHouse/ClickHouse/pull/7908) ([Anton Popov](https://github.com/CurtizJ)) +* Allowed non-constant negative "size" argument for function `substring`. It was not allowed by mistake. This fixes [#4832](https://github.com/ClickHouse/ClickHouse/issues/4832). [#7703](https://github.com/ClickHouse/ClickHouse/pull/7703) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix parsing bug when wrong number of arguments passed to `(O|J)DBC` table engine. [#7709](https://github.com/ClickHouse/ClickHouse/pull/7709) ([alesapin](https://github.com/alesapin)) +* Using command name of the running clickhouse process when sending logs to syslog. In previous versions, empty string was used instead of command name. [#8460](https://github.com/ClickHouse/ClickHouse/pull/8460) ([Michael Nacharov](https://github.com/mnach)) +* Fix check of allowed hosts for `localhost`. This PR fixes the solution provided in [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241). [#8342](https://github.com/ClickHouse/ClickHouse/pull/8342) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix rare crash in `argMin` and `argMax` functions for long string arguments, when result is used in `runningAccumulate` function. This fixes [#8325](https://github.com/ClickHouse/ClickHouse/issues/8325) [#8341](https://github.com/ClickHouse/ClickHouse/pull/8341) ([dinosaur](https://github.com/769344359)) +* Fix memory overcommit for tables with `Buffer` engine. [#8345](https://github.com/ClickHouse/ClickHouse/pull/8345) ([Azat Khuzhin](https://github.com/azat)) +* Fixed potential bug in functions that can take `NULL` as one of the arguments and return non-NULL. [#8196](https://github.com/ClickHouse/ClickHouse/pull/8196) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better metrics calculations in thread pool for background processes for `MergeTree` table engines. [#8194](https://github.com/ClickHouse/ClickHouse/pull/8194) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix function `IN` inside `WHERE` statement when row-level table filter is present. Fixes [#6687](https://github.com/ClickHouse/ClickHouse/issues/6687) [#8357](https://github.com/ClickHouse/ClickHouse/pull/8357) ([Ivan](https://github.com/abyss7)) +* Now an exception is thrown if the integral value is not parsed completely for settings values. [#7678](https://github.com/ClickHouse/ClickHouse/pull/7678) ([Mikhail Korotov](https://github.com/millb)) +* Fix exception when aggregate function is used in query to distributed table with more than two local shards. [#8164](https://github.com/ClickHouse/ClickHouse/pull/8164) ([小路](https://github.com/nicelulu)) +* Now bloom filter can handle zero length arrays and does not perform redundant calculations. [#8242](https://github.com/ClickHouse/ClickHouse/pull/8242) ([achimbab](https://github.com/achimbab)) +* Fixed checking if a client host is allowed by matching the client host to `host_regexp` specified in `users.xml`. [#8241](https://github.com/ClickHouse/ClickHouse/pull/8241) ([Vitaly Baranov](https://github.com/vitlibar)) +* Relax ambiguous column check that leads to false positives in multiple `JOIN ON` section. [#8385](https://github.com/ClickHouse/ClickHouse/pull/8385) ([Artem Zuikov](https://github.com/4ertus2)) +* Fixed possible server crash (`std::terminate`) when the server cannot send or write data in `JSON` or `XML` format with values of `String` data type (that require `UTF-8` validation) or when compressing result data with Brotli algorithm or in some other rare cases. This fixes [#7603](https://github.com/ClickHouse/ClickHouse/issues/7603) [#8384](https://github.com/ClickHouse/ClickHouse/pull/8384) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix race condition in `StorageDistributedDirectoryMonitor` found by CI. This fixes [#8364](https://github.com/ClickHouse/ClickHouse/issues/8364). [#8383](https://github.com/ClickHouse/ClickHouse/pull/8383) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now background merges in `*MergeTree` table engines family preserve storage policy volume order more accurately. [#8549](https://github.com/ClickHouse/ClickHouse/pull/8549) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Now table engine `Kafka` works properly with `Native` format. This fixes [#6731](https://github.com/ClickHouse/ClickHouse/issues/6731) [#7337](https://github.com/ClickHouse/ClickHouse/issues/7337) [#8003](https://github.com/ClickHouse/ClickHouse/issues/8003). [#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +* Fixed formats with headers (like `CSVWithNames`) which were throwing exception about EOF for table engine `Kafka`. [#8016](https://github.com/ClickHouse/ClickHouse/pull/8016) ([filimonov](https://github.com/filimonov)) +* Fixed a bug with making set from subquery in right part of `IN` section. This fixes [#5767](https://github.com/ClickHouse/ClickHouse/issues/5767) and [#2542](https://github.com/ClickHouse/ClickHouse/issues/2542). [#7755](https://github.com/ClickHouse/ClickHouse/pull/7755) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix possible crash while reading from storage `File`. [#7756](https://github.com/ClickHouse/ClickHouse/pull/7756) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed reading of the files in `Parquet` format containing columns of type `list`. [#8334](https://github.com/ClickHouse/ClickHouse/pull/8334) ([maxulan](https://github.com/maxulan)) +* Fix error `Not found column` for distributed queries with `PREWHERE` condition dependent on sampling key if `max_parallel_replicas > 1`. [#7913](https://github.com/ClickHouse/ClickHouse/pull/7913) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix error `Not found column` if query used `PREWHERE` dependent on table's alias and the result set was empty because of primary key condition. [#7911](https://github.com/ClickHouse/ClickHouse/pull/7911) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed return type for functions `rand` and `randConstant` in case of `Nullable` argument. Now functions always return `UInt32` and never `Nullable(UInt32)`. [#8204](https://github.com/ClickHouse/ClickHouse/pull/8204) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Disabled predicate push-down for `WITH FILL` expression. This fixes [#7784](https://github.com/ClickHouse/ClickHouse/issues/7784). [#7789](https://github.com/ClickHouse/ClickHouse/pull/7789) ([Winter Zhang](https://github.com/zhang2014)) +* Fixed incorrect `count()` result for `SummingMergeTree` when `FINAL` section is used. [#3280](https://github.com/ClickHouse/ClickHouse/issues/3280) [#7786](https://github.com/ClickHouse/ClickHouse/pull/7786) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Fix possible incorrect result for constant functions from remote servers. It happened for queries with functions like `version()`, `uptime()`, etc. which returns different constant values for different servers. This fixes [#7666](https://github.com/ClickHouse/ClickHouse/issues/7666). [#7689](https://github.com/ClickHouse/ClickHouse/pull/7689) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix complicated bug in push-down predicate optimization which leads to wrong results. This fixes a lot of issues on push-down predicate optimization. [#8503](https://github.com/ClickHouse/ClickHouse/pull/8503) ([Winter Zhang](https://github.com/zhang2014)) +* Fix crash in `CREATE TABLE .. AS dictionary` query. [#8508](https://github.com/ClickHouse/ClickHouse/pull/8508) ([Azat Khuzhin](https://github.com/azat)) +* Several improvements ClickHouse grammar in `.g4` file. [#8294](https://github.com/ClickHouse/ClickHouse/pull/8294) ([taiyang-li](https://github.com/taiyang-li)) +* Fix bug that leads to crashes in `JOIN`s with tables with engine `Join`. This fixes [#7556](https://github.com/ClickHouse/ClickHouse/issues/7556) [#8254](https://github.com/ClickHouse/ClickHouse/issues/8254) [#7915](https://github.com/ClickHouse/ClickHouse/issues/7915) [#8100](https://github.com/ClickHouse/ClickHouse/issues/8100). [#8298](https://github.com/ClickHouse/ClickHouse/pull/8298) ([Artem Zuikov](https://github.com/4ertus2)) +* Fix redundant dictionaries reload on `CREATE DATABASE`. [#7916](https://github.com/ClickHouse/ClickHouse/pull/7916) ([Azat Khuzhin](https://github.com/azat)) +* Limit maximum number of streams for read from `StorageFile` and `StorageHDFS`. Fixes [#7650](https://github.com/ClickHouse/ClickHouse/issues/7650). [#7981](https://github.com/ClickHouse/ClickHouse/pull/7981) ([alesapin](https://github.com/alesapin)) +* Fix bug in `ALTER ... MODIFY ... CODEC` query, when user specify both default expression and codec. Fixes [8593](https://github.com/ClickHouse/ClickHouse/issues/8593). [#8614](https://github.com/ClickHouse/ClickHouse/pull/8614) ([alesapin](https://github.com/alesapin)) +* Fix error in background merge of columns with `SimpleAggregateFunction(LowCardinality)` type. [#8613](https://github.com/ClickHouse/ClickHouse/pull/8613) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fixed type check in function `toDateTime64`. [#8375](https://github.com/ClickHouse/ClickHouse/pull/8375) ([Vasily Nemkov](https://github.com/Enmk)) +* Now server do not crash on `LEFT` or `FULL JOIN` with and Join engine and unsupported `join_use_nulls` settings. [#8479](https://github.com/ClickHouse/ClickHouse/pull/8479) ([Artem Zuikov](https://github.com/4ertus2)) +* Now `DROP DICTIONARY IF EXISTS db.dict` query does not throw exception if `db` does not exist. [#8185](https://github.com/ClickHouse/ClickHouse/pull/8185) ([Vitaly Baranov](https://github.com/vitlibar)) +* Fix possible crashes in table functions (`file`, `mysql`, `remote`) caused by usage of reference to removed `IStorage` object. Fix incorrect parsing of columns specified at insertion into table function. [#7762](https://github.com/ClickHouse/ClickHouse/pull/7762) ([tavplubix](https://github.com/tavplubix)) +* Ensure network be up before starting `clickhouse-server`. This fixes [#7507](https://github.com/ClickHouse/ClickHouse/issues/7507). [#8570](https://github.com/ClickHouse/ClickHouse/pull/8570) ([Zhichang Yu](https://github.com/yuzhichang)) +* Fix timeouts handling for secure connections, so queries does not hang indefenitely. This fixes [#8126](https://github.com/ClickHouse/ClickHouse/issues/8126). [#8128](https://github.com/ClickHouse/ClickHouse/pull/8128) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `clickhouse-copier`'s redundant contention between concurrent workers. [#7816](https://github.com/ClickHouse/ClickHouse/pull/7816) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +* Now mutations does not skip attached parts, even if their mutation version were larger than current mutation version. [#7812](https://github.com/ClickHouse/ClickHouse/pull/7812) ([Zhichang Yu](https://github.com/yuzhichang)) [#8250](https://github.com/ClickHouse/ClickHouse/pull/8250) ([alesapin](https://github.com/alesapin)) +* Ignore redundant copies of `*MergeTree` data parts after move to another disk and server restart. [#7810](https://github.com/ClickHouse/ClickHouse/pull/7810) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix crash in `FULL JOIN` with `LowCardinality` in `JOIN` key. [#8252](https://github.com/ClickHouse/ClickHouse/pull/8252) ([Artem Zuikov](https://github.com/4ertus2)) +* Forbidden to use column name more than once in insert query like `INSERT INTO tbl (x, y, x)`. This fixes [#5465](https://github.com/ClickHouse/ClickHouse/issues/5465), [#7681](https://github.com/ClickHouse/ClickHouse/issues/7681). [#7685](https://github.com/ClickHouse/ClickHouse/pull/7685) ([alesapin](https://github.com/alesapin)) +* Added fallback for detection the number of physical CPU cores for unknown CPUs (using the number of logical CPU cores). This fixes [#5239](https://github.com/ClickHouse/ClickHouse/issues/5239). [#7726](https://github.com/ClickHouse/ClickHouse/pull/7726) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `There's no column` error for materialized and alias columns. [#8210](https://github.com/ClickHouse/ClickHouse/pull/8210) ([Artem Zuikov](https://github.com/4ertus2)) +* Fixed sever crash when `EXISTS` query was used without `TABLE` or `DICTIONARY` qualifier. Just like `EXISTS t`. This fixes [#8172](https://github.com/ClickHouse/ClickHouse/issues/8172). This bug was introduced in version 19.17. [#8213](https://github.com/ClickHouse/ClickHouse/pull/8213) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix rare bug with error `"Sizes of columns does not match"` that might appear when using `SimpleAggregateFunction` column. [#7790](https://github.com/ClickHouse/ClickHouse/pull/7790) ([Boris Granveaud](https://github.com/bgranvea)) +* Fix bug where user with empty `allow_databases` got access to all databases (and same for `allow_dictionaries`). [#7793](https://github.com/ClickHouse/ClickHouse/pull/7793) ([DeifyTheGod](https://github.com/DeifyTheGod)) +* Fix client crash when server already disconnected from client. [#8071](https://github.com/ClickHouse/ClickHouse/pull/8071) ([Azat Khuzhin](https://github.com/azat)) +* Fix `ORDER BY` behaviour in case of sorting by primary key prefix and non primary key suffix. [#7759](https://github.com/ClickHouse/ClickHouse/pull/7759) ([Anton Popov](https://github.com/CurtizJ)) +* Check if qualified column present in the table. This fixes [#6836](https://github.com/ClickHouse/ClickHouse/issues/6836). [#7758](https://github.com/ClickHouse/ClickHouse/pull/7758) ([Artem Zuikov](https://github.com/4ertus2)) +* Fixed behavior with `ALTER MOVE` ran immediately after merge finish moves superpart of specified. Fixes [#8103](https://github.com/ClickHouse/ClickHouse/issues/8103). [#8104](https://github.com/ClickHouse/ClickHouse/pull/8104) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix possible server crash while using `UNION` with different number of columns. Fixes [#7279](https://github.com/ClickHouse/ClickHouse/issues/7279). [#7929](https://github.com/ClickHouse/ClickHouse/pull/7929) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix size of result substring for function `substr` with negative size. [#8589](https://github.com/ClickHouse/ClickHouse/pull/8589) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now server does not execute part mutation in `MergeTree` if there are not enough free threads in background pool. [#8588](https://github.com/ClickHouse/ClickHouse/pull/8588) ([tavplubix](https://github.com/tavplubix)) +* Fix a minor typo on formatting `UNION ALL` AST. [#7999](https://github.com/ClickHouse/ClickHouse/pull/7999) ([litao91](https://github.com/litao91)) +* Fixed incorrect bloom filter results for negative numbers. This fixes [#8317](https://github.com/ClickHouse/ClickHouse/issues/8317). [#8566](https://github.com/ClickHouse/ClickHouse/pull/8566) ([Winter Zhang](https://github.com/zhang2014)) +* Fixed potential buffer overflow in decompress. Malicious user can pass fabricated compressed data that will cause read after buffer. This issue was found by Eldar Zaitov from Yandex information security team. [#8404](https://github.com/ClickHouse/ClickHouse/pull/8404) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix incorrect result because of integers overflow in `arrayIntersect`. [#7777](https://github.com/ClickHouse/ClickHouse/pull/7777) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now `OPTIMIZE TABLE` query will not wait for offline replicas to perform the operation. [#8314](https://github.com/ClickHouse/ClickHouse/pull/8314) ([javi santana](https://github.com/javisantana)) +* Fixed `ALTER TTL` parser for `Replicated*MergeTree` tables. [#8318](https://github.com/ClickHouse/ClickHouse/pull/8318) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix communication between server and client, so server read temporary tables info after query failure. [#8084](https://github.com/ClickHouse/ClickHouse/pull/8084) ([Azat Khuzhin](https://github.com/azat)) +* Fix `bitmapAnd` function error when intersecting an aggregated bitmap and a scalar bitmap. [#8082](https://github.com/ClickHouse/ClickHouse/pull/8082) ([Yue Huang](https://github.com/moon03432)) +* Refine the definition of `ZXid` according to the ZooKeeper Programmer's Guide which fixes bug in `clickhouse-cluster-copier`. [#8088](https://github.com/ClickHouse/ClickHouse/pull/8088) ([Ding Xiang Fei](https://github.com/dingxiangfei2009)) +* `odbc` table function now respects `external_table_functions_use_nulls` setting. [#7506](https://github.com/ClickHouse/ClickHouse/pull/7506) ([Vasily Nemkov](https://github.com/Enmk)) +* Fixed bug that lead to a rare data race. [#8143](https://github.com/ClickHouse/ClickHouse/pull/8143) ([Alexander Kazakov](https://github.com/Akazz)) +* Now `SYSTEM RELOAD DICTIONARY` reloads a dictionary completely, ignoring `update_field`. This fixes [#7440](https://github.com/ClickHouse/ClickHouse/issues/7440). [#8037](https://github.com/ClickHouse/ClickHouse/pull/8037) ([Vitaly Baranov](https://github.com/vitlibar)) +* Add ability to check if dictionary exists in create query. [#8032](https://github.com/ClickHouse/ClickHouse/pull/8032) ([alesapin](https://github.com/alesapin)) +* Fix `Float*` parsing in `Values` format. This fixes [#7817](https://github.com/ClickHouse/ClickHouse/issues/7817). [#7870](https://github.com/ClickHouse/ClickHouse/pull/7870) ([tavplubix](https://github.com/tavplubix)) +* Fix crash when we cannot reserve space in some background operations of `*MergeTree` table engines family. [#7873](https://github.com/ClickHouse/ClickHouse/pull/7873) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix crash of merge operation when table contains `SimpleAggregateFunction(LowCardinality)` column. This fixes [#8515](https://github.com/ClickHouse/ClickHouse/issues/8515). [#8522](https://github.com/ClickHouse/ClickHouse/pull/8522) ([Azat Khuzhin](https://github.com/azat)) +* Restore support of all ICU locales and add the ability to apply collations for constant expressions. Also add language name to `system.collations` table. [#8051](https://github.com/ClickHouse/ClickHouse/pull/8051) ([alesapin](https://github.com/alesapin)) +* Fix bug when external dictionaries with zero minimal lifetime (`LIFETIME(MIN 0 MAX N)`, `LIFETIME(N)`) don't update in background. [#7983](https://github.com/ClickHouse/ClickHouse/pull/7983) ([alesapin](https://github.com/alesapin)) +* Fix crash when external dictionary with ClickHouse source has subquery in query. [#8351](https://github.com/ClickHouse/ClickHouse/pull/8351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Fix incorrect parsing of file extension in table with engine `URL`. This fixes [#8157](https://github.com/ClickHouse/ClickHouse/issues/8157). [#8419](https://github.com/ClickHouse/ClickHouse/pull/8419) ([Andrey Bodrov](https://github.com/apbodrov)) +* Fix `CHECK TABLE` query for `*MergeTree` tables without key. Fixes [#7543](https://github.com/ClickHouse/ClickHouse/issues/7543). [#7979](https://github.com/ClickHouse/ClickHouse/pull/7979) ([alesapin](https://github.com/alesapin)) +* Fixed conversion of `Float64` to MySQL type. [#8079](https://github.com/ClickHouse/ClickHouse/pull/8079) ([Yuriy Baranov](https://github.com/yurriy)) +* Now if table was not completely dropped because of server crash, server will try to restore and load it. [#8176](https://github.com/ClickHouse/ClickHouse/pull/8176) ([tavplubix](https://github.com/tavplubix)) +* Fixed crash in table function `file` while inserting into file that does not exist. Now in this case file would be created and then insert would be processed. [#8177](https://github.com/ClickHouse/ClickHouse/pull/8177) ([Olga Khvostikova](https://github.com/stavrolia)) +* Fix rare deadlock which can happen when `trace_log` is in enabled. [#7838](https://github.com/ClickHouse/ClickHouse/pull/7838) ([filimonov](https://github.com/filimonov)) +* Add ability to work with different types besides `Date` in `RangeHashed` external dictionary created from DDL query. Fixes [7899](https://github.com/ClickHouse/ClickHouse/issues/7899). [#8275](https://github.com/ClickHouse/ClickHouse/pull/8275) ([alesapin](https://github.com/alesapin)) +* Fixes crash when `now64()` is called with result of another function. [#8270](https://github.com/ClickHouse/ClickHouse/pull/8270) ([Vasily Nemkov](https://github.com/Enmk)) +* Fixed bug with detecting client IP for connections through mysql wire protocol. [#7743](https://github.com/ClickHouse/ClickHouse/pull/7743) ([Dmitry Muzyka](https://github.com/dmitriy-myz)) +* Fix empty array handling in `arraySplit` function. This fixes [#7708](https://github.com/ClickHouse/ClickHouse/issues/7708). [#7747](https://github.com/ClickHouse/ClickHouse/pull/7747) ([hcz](https://github.com/hczhcz)) +* Fixed the issue when `pid-file` of another running `clickhouse-server` may be deleted. [#8487](https://github.com/ClickHouse/ClickHouse/pull/8487) ([Weiqing Xu](https://github.com/weiqxu)) +* Fix dictionary reload if it has `invalidate_query`, which stopped updates and some exception on previous update tries. [#8029](https://github.com/ClickHouse/ClickHouse/pull/8029) ([alesapin](https://github.com/alesapin)) +* Fixed error in function `arrayReduce` that may lead to "double free" and error in aggregate function combinator `Resample` that may lead to memory leak. Added aggregate function `aggThrow`. This function can be used for testing purposes. [#8446](https://github.com/ClickHouse/ClickHouse/pull/8446) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Improvement +* Improved logging when working with `S3` table engine. [#8251](https://github.com/ClickHouse/ClickHouse/pull/8251) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +* Printed help message when no arguments are passed when calling `clickhouse-local`. This fixes [#5335](https://github.com/ClickHouse/ClickHouse/issues/5335). [#8230](https://github.com/ClickHouse/ClickHouse/pull/8230) ([Andrey Nagorny](https://github.com/Melancholic)) +* Add setting `mutations_sync` which allows to wait `ALTER UPDATE/DELETE` queries synchronously. [#8237](https://github.com/ClickHouse/ClickHouse/pull/8237) ([alesapin](https://github.com/alesapin)) +* Allow to set up relative `user_files_path` in `config.xml` (in the way similar to `format_schema_path`). [#7632](https://github.com/ClickHouse/ClickHouse/pull/7632) ([hcz](https://github.com/hczhcz)) +* Add exception for illegal types for conversion functions with `-OrZero` postfix. [#7880](https://github.com/ClickHouse/ClickHouse/pull/7880) ([Andrey Konyaev](https://github.com/akonyaev90)) +* Simplify format of the header of data sending to a shard in a distributed query. [#8044](https://github.com/ClickHouse/ClickHouse/pull/8044) ([Vitaly Baranov](https://github.com/vitlibar)) +* `Live View` table engine refactoring. [#8519](https://github.com/ClickHouse/ClickHouse/pull/8519) ([vzakaznikov](https://github.com/vzakaznikov)) +* Add additional checks for external dictionaries created from DDL-queries. [#8127](https://github.com/ClickHouse/ClickHouse/pull/8127) ([alesapin](https://github.com/alesapin)) +* Fix error `Column ... already exists` while using `FINAL` and `SAMPLE` together, e.g. `select count() from table final sample 1/2`. Fixes [#5186](https://github.com/ClickHouse/ClickHouse/issues/5186). [#7907](https://github.com/ClickHouse/ClickHouse/pull/7907) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now table the first argument of `joinGet` function can be table identifier. [#7707](https://github.com/ClickHouse/ClickHouse/pull/7707) ([Amos Bird](https://github.com/amosbird)) +* Allow using `MaterializedView` with subqueries above `Kafka` tables. [#8197](https://github.com/ClickHouse/ClickHouse/pull/8197) ([filimonov](https://github.com/filimonov)) +* Now background moves between disks run it the seprate thread pool. [#7670](https://github.com/ClickHouse/ClickHouse/pull/7670) ([Vladimir Chebotarev](https://github.com/excitoon)) +* `SYSTEM RELOAD DICTIONARY` now executes synchronously. [#8240](https://github.com/ClickHouse/ClickHouse/pull/8240) ([Vitaly Baranov](https://github.com/vitlibar)) +* Stack traces now display physical addresses (offsets in object file) instead of virtual memory addresses (where the object file was loaded). That allows the use of `addr2line` when binary is position independent and ASLR is active. This fixes [#8360](https://github.com/ClickHouse/ClickHouse/issues/8360). [#8387](https://github.com/ClickHouse/ClickHouse/pull/8387) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Support new syntax for row-level security filters: `
    `. Fixes [#5779](https://github.com/ClickHouse/ClickHouse/issues/5779). [#8381](https://github.com/ClickHouse/ClickHouse/pull/8381) ([Ivan](https://github.com/abyss7)) +* Now `cityHash` function can work with `Decimal` and `UUID` types. Fixes [#5184](https://github.com/ClickHouse/ClickHouse/issues/5184). [#7693](https://github.com/ClickHouse/ClickHouse/pull/7693) ([Mikhail Korotov](https://github.com/millb)) +* Removed fixed index granularity (it was 1024) from system logs because it's obsolete after implementation of adaptive granularity. [#7698](https://github.com/ClickHouse/ClickHouse/pull/7698) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enabled MySQL compatibility server when ClickHouse is compiled without SSL. [#7852](https://github.com/ClickHouse/ClickHouse/pull/7852) ([Yuriy Baranov](https://github.com/yurriy)) +* Now server checksums distributed batches, which gives more verbose errors in case of corrupted data in batch. [#7914](https://github.com/ClickHouse/ClickHouse/pull/7914) ([Azat Khuzhin](https://github.com/azat)) +* Support `DROP DATABASE`, `DETACH TABLE`, `DROP TABLE` and `ATTACH TABLE` for `MySQL` database engine. [#8202](https://github.com/ClickHouse/ClickHouse/pull/8202) ([Winter Zhang](https://github.com/zhang2014)) +* Add authentication in S3 table function and table engine. [#7623](https://github.com/ClickHouse/ClickHouse/pull/7623) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Added check for extra parts of `MergeTree` at different disks, in order to not allow to miss data parts at undefined disks. [#8118](https://github.com/ClickHouse/ClickHouse/pull/8118) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Enable SSL support for Mac client and server. [#8297](https://github.com/ClickHouse/ClickHouse/pull/8297) ([Ivan](https://github.com/abyss7)) +* Now ClickHouse can work as MySQL federated server (see https://dev.mysql.com/doc/refman/5.7/en/federated-create-server.html). [#7717](https://github.com/ClickHouse/ClickHouse/pull/7717) ([Maxim Fedotov](https://github.com/MaxFedotov)) +* `clickhouse-client` now only enable `bracketed-paste` when multiquery is on and multiline is off. This fixes [#7757](https://github.com/ClickHouse/ClickHouse/issues/7757). [#7761](https://github.com/ClickHouse/ClickHouse/pull/7761) ([Amos Bird](https://github.com/amosbird)) +* Support `Array(Decimal)` in `if` function. [#7721](https://github.com/ClickHouse/ClickHouse/pull/7721) ([Artem Zuikov](https://github.com/4ertus2)) +* Support Decimals in `arrayDifference`, `arrayCumSum` and `arrayCumSumNegative` functions. [#7724](https://github.com/ClickHouse/ClickHouse/pull/7724) ([Artem Zuikov](https://github.com/4ertus2)) +* Added `lifetime` column to `system.dictionaries` table. [#6820](https://github.com/ClickHouse/ClickHouse/issues/6820) [#7727](https://github.com/ClickHouse/ClickHouse/pull/7727) ([kekekekule](https://github.com/kekekekule)) +* Improved check for existing parts on different disks for `*MergeTree` table engines. Addresses [#7660](https://github.com/ClickHouse/ClickHouse/issues/7660). [#8440](https://github.com/ClickHouse/ClickHouse/pull/8440) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Integration with `AWS SDK` for `S3` interactions which allows to use all S3 features out of the box. [#8011](https://github.com/ClickHouse/ClickHouse/pull/8011) ([Pavel Kovalenko](https://github.com/Jokser)) +* Added support for subqueries in `Live View` tables. [#7792](https://github.com/ClickHouse/ClickHouse/pull/7792) ([vzakaznikov](https://github.com/vzakaznikov)) +* Check for using `Date` or `DateTime` column from `TTL` expressions was removed. [#7920](https://github.com/ClickHouse/ClickHouse/pull/7920) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Information about disk was added to `system.detached_parts` table. [#7833](https://github.com/ClickHouse/ClickHouse/pull/7833) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Now settings `max_(table|partition)_size_to_drop` can be changed without a restart. [#7779](https://github.com/ClickHouse/ClickHouse/pull/7779) ([Grigory Pervakov](https://github.com/GrigoryPervakov)) +* Slightly better usability of error messages. Ask user not to remove the lines below `Stack trace:`. [#7897](https://github.com/ClickHouse/ClickHouse/pull/7897) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better reading messages from `Kafka` engine in various formats after [#7935](https://github.com/ClickHouse/ClickHouse/issues/7935). [#8035](https://github.com/ClickHouse/ClickHouse/pull/8035) ([Ivan](https://github.com/abyss7)) +* Better compatibility with MySQL clients which don't support `sha2_password` auth plugin. [#8036](https://github.com/ClickHouse/ClickHouse/pull/8036) ([Yuriy Baranov](https://github.com/yurriy)) +* Support more column types in MySQL compatibility server. [#7975](https://github.com/ClickHouse/ClickHouse/pull/7975) ([Yuriy Baranov](https://github.com/yurriy)) +* Implement `ORDER BY` optimization for `Merge`, `Buffer` and `Materilized View` storages with underlying `MergeTree` tables. [#8130](https://github.com/ClickHouse/ClickHouse/pull/8130) ([Anton Popov](https://github.com/CurtizJ)) +* Now we always use POSIX implementation of `getrandom` to have better compatibility with old kernels (< 3.17). [#7940](https://github.com/ClickHouse/ClickHouse/pull/7940) ([Amos Bird](https://github.com/amosbird)) +* Better check for valid destination in a move TTL rule. [#8410](https://github.com/ClickHouse/ClickHouse/pull/8410) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Better checks for broken insert batches for `Distributed` table engine. [#7933](https://github.com/ClickHouse/ClickHouse/pull/7933) ([Azat Khuzhin](https://github.com/azat)) +* Add column with array of parts name which mutations must process in future to `system.mutations` table. [#8179](https://github.com/ClickHouse/ClickHouse/pull/8179) ([alesapin](https://github.com/alesapin)) +* Parallel merge sort optimization for processors. [#8552](https://github.com/ClickHouse/ClickHouse/pull/8552) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* The settings `mark_cache_min_lifetime` is now obsolete and does nothing. In previous versions, mark cache can grow in memory larger than `mark_cache_size` to accomodate data within `mark_cache_min_lifetime` seconds. That was leading to confusion and higher memory usage than expected, that is especially bad on memory constrained systems. If you will see performance degradation after installing this release, you should increase the `mark_cache_size`. [#8484](https://github.com/ClickHouse/ClickHouse/pull/8484) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Preparation to use `tid` everywhere. This is needed for [#7477](https://github.com/ClickHouse/ClickHouse/issues/7477). [#8276](https://github.com/ClickHouse/ClickHouse/pull/8276) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +#### Performance Improvement +* Performance optimizations in processors pipeline. [#7988](https://github.com/ClickHouse/ClickHouse/pull/7988) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Non-blocking updates of expired keys in cache dictionaries (with permission to read old ones). [#8303](https://github.com/ClickHouse/ClickHouse/pull/8303) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Compile ClickHouse without `-fno-omit-frame-pointer` globally to spare one more register. [#8097](https://github.com/ClickHouse/ClickHouse/pull/8097) ([Amos Bird](https://github.com/amosbird)) +* Speedup `greatCircleDistance` function and add performance tests for it. [#7307](https://github.com/ClickHouse/ClickHouse/pull/7307) ([Olga Khvostikova](https://github.com/stavrolia)) +* Improved performance of function `roundDown`. [#8465](https://github.com/ClickHouse/ClickHouse/pull/8465) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improved performance of `max`, `min`, `argMin`, `argMax` for `DateTime64` data type. [#8199](https://github.com/ClickHouse/ClickHouse/pull/8199) ([Vasily Nemkov](https://github.com/Enmk)) +* Improved performance of sorting without a limit or with big limit and external sorting. [#8545](https://github.com/ClickHouse/ClickHouse/pull/8545) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improved performance of formatting floating point numbers up to 6 times. [#8542](https://github.com/ClickHouse/ClickHouse/pull/8542) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Improved performance of `modulo` function. [#7750](https://github.com/ClickHouse/ClickHouse/pull/7750) ([Amos Bird](https://github.com/amosbird)) +* Optimized `ORDER BY` and merging with single column key. [#8335](https://github.com/ClickHouse/ClickHouse/pull/8335) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Better implementation for `arrayReduce`, `-Array` and `-State` combinators. [#7710](https://github.com/ClickHouse/ClickHouse/pull/7710) ([Amos Bird](https://github.com/amosbird)) +* Now `PREWHERE` should be optimized to be at least as efficient as `WHERE`. [#7769](https://github.com/ClickHouse/ClickHouse/pull/7769) ([Amos Bird](https://github.com/amosbird)) +* Improve the way `round` and `roundBankers` handling negative numbers. [#8229](https://github.com/ClickHouse/ClickHouse/pull/8229) ([hcz](https://github.com/hczhcz)) +* Improved decoding performance of `DoubleDelta` and `Gorilla` codecs by roughly 30-40%. This fixes [#7082](https://github.com/ClickHouse/ClickHouse/issues/7082). [#8019](https://github.com/ClickHouse/ClickHouse/pull/8019) ([Vasily Nemkov](https://github.com/Enmk)) +* Improved performance of `base64` related functions. [#8444](https://github.com/ClickHouse/ClickHouse/pull/8444) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Added a function `geoDistance`. It is similar to `greatCircleDistance` but uses approximation to WGS-84 ellipsoid model. The performance of both functions are near the same. [#8086](https://github.com/ClickHouse/ClickHouse/pull/8086) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Faster `min` and `max` aggregation functions for `Decimal` data type. [#8144](https://github.com/ClickHouse/ClickHouse/pull/8144) ([Artem Zuikov](https://github.com/4ertus2)) +* Vectorize processing `arrayReduce`. [#7608](https://github.com/ClickHouse/ClickHouse/pull/7608) ([Amos Bird](https://github.com/amosbird)) +* `if` chains are now optimized as `multiIf`. [#8355](https://github.com/ClickHouse/ClickHouse/pull/8355) ([kamalov-ruslan](https://github.com/kamalov-ruslan)) +* Fix performance regression of `Kafka` table engine introduced in 19.15. This fixes [#7261](https://github.com/ClickHouse/ClickHouse/issues/7261). [#7935](https://github.com/ClickHouse/ClickHouse/pull/7935) ([filimonov](https://github.com/filimonov)) +* Removed "pie" code generation that `gcc` from Debian packages occasionally brings by default. [#8483](https://github.com/ClickHouse/ClickHouse/pull/8483) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Parallel parsing data formats [#6553](https://github.com/ClickHouse/ClickHouse/pull/6553) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)) +* Enable optimized parser of `Values` with expressions by default (`input_format_values_deduce_templates_of_expressions=1`). [#8231](https://github.com/ClickHouse/ClickHouse/pull/8231) ([tavplubix](https://github.com/tavplubix)) + +#### Build/Testing/Packaging Improvement +* Build fixes for `ARM` and in minimal mode. [#8304](https://github.com/ClickHouse/ClickHouse/pull/8304) ([proller](https://github.com/proller)) +* Add coverage file flush for `clickhouse-server` when std::atexit is not called. Also slightly improved logging in stateless tests with coverage. [#8267](https://github.com/ClickHouse/ClickHouse/pull/8267) ([alesapin](https://github.com/alesapin)) +* Update LLVM library in contrib. Avoid using LLVM from OS packages. [#8258](https://github.com/ClickHouse/ClickHouse/pull/8258) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make bundled `curl` build fully quiet. [#8232](https://github.com/ClickHouse/ClickHouse/pull/8232) [#8203](https://github.com/ClickHouse/ClickHouse/pull/8203) ([Pavel Kovalenko](https://github.com/Jokser)) +* Fix some `MemorySanitizer` warnings. [#8235](https://github.com/ClickHouse/ClickHouse/pull/8235) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Use `add_warning` and `no_warning` macros in `CMakeLists.txt`. [#8604](https://github.com/ClickHouse/ClickHouse/pull/8604) ([Ivan](https://github.com/abyss7)) +* Add support of Minio S3 Compatible object (https://min.io/) for better integration tests. [#7863](https://github.com/ClickHouse/ClickHouse/pull/7863) [#7875](https://github.com/ClickHouse/ClickHouse/pull/7875) ([Pavel Kovalenko](https://github.com/Jokser)) +* Imported `libc` headers to contrib. It allows to make builds more consistent across various systems (only for `x86_64-linux-gnu`). [#5773](https://github.com/ClickHouse/ClickHouse/pull/5773) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Remove `-fPIC` from some libraries. [#8464](https://github.com/ClickHouse/ClickHouse/pull/8464) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Clean `CMakeLists.txt` for curl. See https://github.com/ClickHouse/ClickHouse/pull/8011#issuecomment-569478910 [#8459](https://github.com/ClickHouse/ClickHouse/pull/8459) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Silent warnings in `CapNProto` library. [#8220](https://github.com/ClickHouse/ClickHouse/pull/8220) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Add performance tests for short string optimized hash tables. [#7679](https://github.com/ClickHouse/ClickHouse/pull/7679) ([Amos Bird](https://github.com/amosbird)) +* Now ClickHouse will build on `AArch64` even if `MADV_FREE` is not available. This fixes [#8027](https://github.com/ClickHouse/ClickHouse/issues/8027). [#8243](https://github.com/ClickHouse/ClickHouse/pull/8243) ([Amos Bird](https://github.com/amosbird)) +* Update `zlib-ng` to fix memory sanitizer problems. [#7182](https://github.com/ClickHouse/ClickHouse/pull/7182) [#8206](https://github.com/ClickHouse/ClickHouse/pull/8206) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Enable internal MySQL library on non-Linux system, because usage of OS packages is very fragile and usually does not work at all. This fixes [#5765](https://github.com/ClickHouse/ClickHouse/issues/5765). [#8426](https://github.com/ClickHouse/ClickHouse/pull/8426) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed build on some systems after enabling `libc++`. This supersedes [#8374](https://github.com/ClickHouse/ClickHouse/issues/8374). [#8380](https://github.com/ClickHouse/ClickHouse/pull/8380) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make `Field` methods more type-safe to find more errors. [#7386](https://github.com/ClickHouse/ClickHouse/pull/7386) [#8209](https://github.com/ClickHouse/ClickHouse/pull/8209) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Added missing files to the `libc-headers` submodule. [#8507](https://github.com/ClickHouse/ClickHouse/pull/8507) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix wrong `JSON` quoting in performance test output. [#8497](https://github.com/ClickHouse/ClickHouse/pull/8497) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Now stack trace is displayed for `std::exception` and `Poco::Exception`. In previous versions it was available only for `DB::Exception`. This improves diagnostics. [#8501](https://github.com/ClickHouse/ClickHouse/pull/8501) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Porting `clock_gettime` and `clock_nanosleep` for fresh glibc versions. [#8054](https://github.com/ClickHouse/ClickHouse/pull/8054) ([Amos Bird](https://github.com/amosbird)) +* Enable `part_log` in example config for developers. [#8609](https://github.com/ClickHouse/ClickHouse/pull/8609) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix async nature of reload in `01036_no_superfluous_dict_reload_on_create_database*`. [#8111](https://github.com/ClickHouse/ClickHouse/pull/8111) ([Azat Khuzhin](https://github.com/azat)) +* Fixed codec performance tests. [#8615](https://github.com/ClickHouse/ClickHouse/pull/8615) ([Vasily Nemkov](https://github.com/Enmk)) +* Add install scripts for `.tgz` build and documentation for them. [#8612](https://github.com/ClickHouse/ClickHouse/pull/8612) [#8591](https://github.com/ClickHouse/ClickHouse/pull/8591) ([alesapin](https://github.com/alesapin)) +* Removed old `ZSTD` test (it was created in year 2016 to reproduce the bug that pre 1.0 version of ZSTD has had). This fixes [#8618](https://github.com/ClickHouse/ClickHouse/issues/8618). [#8619](https://github.com/ClickHouse/ClickHouse/pull/8619) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed build on Mac OS Catalina. [#8600](https://github.com/ClickHouse/ClickHouse/pull/8600) ([meo](https://github.com/meob)) +* Increased number of rows in codec performance tests to make results noticeable. [#8574](https://github.com/ClickHouse/ClickHouse/pull/8574) ([Vasily Nemkov](https://github.com/Enmk)) +* In debug builds, treat `LOGICAL_ERROR` exceptions as assertion failures, so that they are easier to notice. [#8475](https://github.com/ClickHouse/ClickHouse/pull/8475) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Make formats-related performance test more deterministic. [#8477](https://github.com/ClickHouse/ClickHouse/pull/8477) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Update `lz4` to fix a MemorySanitizer failure. [#8181](https://github.com/ClickHouse/ClickHouse/pull/8181) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Suppress a known MemorySanitizer false positive in exception handling. [#8182](https://github.com/ClickHouse/ClickHouse/pull/8182) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Update `gcc` and `g++` to version 9 in `build/docker/build.sh` [#7766](https://github.com/ClickHouse/ClickHouse/pull/7766) ([TLightSky](https://github.com/tlightsky)) +* Add performance test case to test that `PREWHERE` is worse than `WHERE`. [#7768](https://github.com/ClickHouse/ClickHouse/pull/7768) ([Amos Bird](https://github.com/amosbird)) +* Progress towards fixing one flacky test. [#8621](https://github.com/ClickHouse/ClickHouse/pull/8621) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Avoid MemorySanitizer report for data from `libunwind`. [#8539](https://github.com/ClickHouse/ClickHouse/pull/8539) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Updated `libc++` to the latest version. [#8324](https://github.com/ClickHouse/ClickHouse/pull/8324) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Build ICU library from sources. This fixes [#6460](https://github.com/ClickHouse/ClickHouse/issues/6460). [#8219](https://github.com/ClickHouse/ClickHouse/pull/8219) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Switched from `libressl` to `openssl`. ClickHouse should support TLS 1.3 and SNI after this change. This fixes [#8171](https://github.com/ClickHouse/ClickHouse/issues/8171). [#8218](https://github.com/ClickHouse/ClickHouse/pull/8218) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fixed UBSan report when using `chacha20_poly1305` from SSL (happens on connect to https://yandex.ru/). [#8214](https://github.com/ClickHouse/ClickHouse/pull/8214) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix mode of default password file for `.deb` linux distros. [#8075](https://github.com/ClickHouse/ClickHouse/pull/8075) ([proller](https://github.com/proller)) +* Improved expression for getting `clickhouse-server` PID in `clickhouse-test`. [#8063](https://github.com/ClickHouse/ClickHouse/pull/8063) ([Alexander Kazakov](https://github.com/Akazz)) +* Updated contrib/googletest to v1.10.0. [#8587](https://github.com/ClickHouse/ClickHouse/pull/8587) ([Alexander Burmak](https://github.com/Alex-Burmak)) +* Fixed ThreadSaninitizer report in `base64` library. Also updated this library to the latest version, but it does not matter. This fixes [#8397](https://github.com/ClickHouse/ClickHouse/issues/8397). [#8403](https://github.com/ClickHouse/ClickHouse/pull/8403) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Fix `00600_replace_running_query` for processors. [#8272](https://github.com/ClickHouse/ClickHouse/pull/8272) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Remove support for `tcmalloc` to make `CMakeLists.txt` simpler. [#8310](https://github.com/ClickHouse/ClickHouse/pull/8310) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Release gcc builds now use `libc++` instead of `libstdc++`. Recently `libc++` was used only with clang. This will improve consistency of build configurations and portability. [#8311](https://github.com/ClickHouse/ClickHouse/pull/8311) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Enable ICU library for build with MemorySanitizer. [#8222](https://github.com/ClickHouse/ClickHouse/pull/8222) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Suppress warnings from `CapNProto` library. [#8224](https://github.com/ClickHouse/ClickHouse/pull/8224) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Removed special cases of code for `tcmalloc`, because it's no longer supported. [#8225](https://github.com/ClickHouse/ClickHouse/pull/8225) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* In CI coverage task, kill the server gracefully to allow it to save the coverage report. This fixes incomplete coverage reports we've been seeing lately. [#8142](https://github.com/ClickHouse/ClickHouse/pull/8142) ([alesapin](https://github.com/alesapin)) +* Performance tests for all codecs against `Float64` and `UInt64` values. [#8349](https://github.com/ClickHouse/ClickHouse/pull/8349) ([Vasily Nemkov](https://github.com/Enmk)) +* `termcap` is very much deprecated and lead to various problems (f.g. missing "up" cap and echoing `^J` instead of multi line) . Favor `terminfo` or bundled `ncurses`. [#7737](https://github.com/ClickHouse/ClickHouse/pull/7737) ([Amos Bird](https://github.com/amosbird)) +* Fix `test_storage_s3` integration test. [#7734](https://github.com/ClickHouse/ClickHouse/pull/7734) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Support `StorageFile(, null) ` to insert block into given format file without actually write to disk. This is required for performance tests. [#8455](https://github.com/ClickHouse/ClickHouse/pull/8455) ([Amos Bird](https://github.com/amosbird)) +* Added argument `--print-time` to functional tests which prints execution time per test. [#8001](https://github.com/ClickHouse/ClickHouse/pull/8001) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Added asserts to `KeyCondition` while evaluating RPN. This will fix warning from gcc-9. [#8279](https://github.com/ClickHouse/ClickHouse/pull/8279) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Dump cmake options in CI builds. [#8273](https://github.com/ClickHouse/ClickHouse/pull/8273) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Don't generate debug info for some fat libraries. [#8271](https://github.com/ClickHouse/ClickHouse/pull/8271) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Make `log_to_console.xml` always log to stderr, regardless of is it interactive or not. [#8395](https://github.com/ClickHouse/ClickHouse/pull/8395) ([Alexander Kuzmenkov](https://github.com/akuzm)) +* Removed some unused features from `clickhouse-performance-test` tool. [#8555](https://github.com/ClickHouse/ClickHouse/pull/8555) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Now we will also search for `lld-X` with corresponding `clang-X` version. [#8092](https://github.com/ClickHouse/ClickHouse/pull/8092) ([alesapin](https://github.com/alesapin)) +* Parquet build improvement. [#8421](https://github.com/ClickHouse/ClickHouse/pull/8421) ([maxulan](https://github.com/maxulan)) +* More GCC warnings [#8221](https://github.com/ClickHouse/ClickHouse/pull/8221) ([kreuzerkrieg](https://github.com/kreuzerkrieg)) +* Package for Arch Linux now allows to run ClickHouse server, and not only client. [#8534](https://github.com/ClickHouse/ClickHouse/pull/8534) ([Vladimir Chebotarev](https://github.com/excitoon)) +* Fix test with processors. Tiny performance fixes. [#7672](https://github.com/ClickHouse/ClickHouse/pull/7672) ([Nikolai Kochetov](https://github.com/KochetovNicolai)) +* Update contrib/protobuf. [#8256](https://github.com/ClickHouse/ClickHouse/pull/8256) ([Matwey V. Kornilov](https://github.com/matwey)) +* In preparation of switching to c++20 as a new year celebration. "May the C++ force be with ClickHouse." [#8447](https://github.com/ClickHouse/ClickHouse/pull/8447) ([Amos Bird](https://github.com/amosbird)) + +#### Experimental Feature +* Added experimental setting `min_bytes_to_use_mmap_io`. It allows to read big files without copying data from kernel to userspace. The setting is disabled by default. Recommended threshold is about 64 MB, because mmap/munmap is slow. [#8520](https://github.com/ClickHouse/ClickHouse/pull/8520) ([alexey-milovidov](https://github.com/alexey-milovidov)) +* Reworked quotas as a part of access control system. Added new table `system.quotas`, new functions `currentQuota`, `currentQuotaKey`, new SQL syntax `CREATE QUOTA`, `ALTER QUOTA`, `DROP QUOTA`, `SHOW QUOTA`. [#7257](https://github.com/ClickHouse/ClickHouse/pull/7257) ([Vitaly Baranov](https://github.com/vitlibar)) +* Allow skipping unknown settings with warnings instead of throwing exceptions. [#7653](https://github.com/ClickHouse/ClickHouse/pull/7653) ([Vitaly Baranov](https://github.com/vitlibar)) +* Reworked row policies as a part of access control system. Added new table `system.row_policies`, new function `currentRowPolicies()`, new SQL syntax `CREATE POLICY`, `ALTER POLICY`, `DROP POLICY`, `SHOW CREATE POLICY`, `SHOW POLICIES`. [#7808](https://github.com/ClickHouse/ClickHouse/pull/7808) ([Vitaly Baranov](https://github.com/vitlibar)) + +#### Security Fix +* Fixed the possibility of reading directories structure in tables with `File` table engine. This fixes [#8536](https://github.com/ClickHouse/ClickHouse/issues/8536). [#8537](https://github.com/ClickHouse/ClickHouse/pull/8537) ([alexey-milovidov](https://github.com/alexey-milovidov)) + +## [Changelog for 2019](./2019.md) diff --git a/docs/ja/whats-new/changelog/2021.md b/docs/ja/whats-new/changelog/2021.md new file mode 100644 index 00000000000..e3b471facac --- /dev/null +++ b/docs/ja/whats-new/changelog/2021.md @@ -0,0 +1,2055 @@ +--- +slug: /ja/whats-new/changelog/2021 +sidebar_position: 10 +sidebar_label: '2021' +title: 2021 Changelog +--- + +### ClickHouse release v21.12, 2021-12-15 + +#### Backward Incompatible Change + +* *A fix for a feature that previously had unwanted behaviour.* Do not allow direct select for Kafka/RabbitMQ/FileLog. Can be enabled by setting `stream_like_engine_allow_direct_select`. Direct select will be not allowed even if enabled by setting, in case there is an attached materialized view. For Kafka and RabbitMQ direct selectm if allowed, will not commit massages by default. To enable commits with direct select, user must use storage level setting `kafka{rabbitmq}_commit_on_select=1` (default `0`). [#31053](https://github.com/ClickHouse/ClickHouse/pull/31053) ([Kseniia Sumarokova](https://github.com/kssenii)). +* *A slight change in behaviour of a new function.* Return unquoted string in JSON_VALUE. Closes [#27965](https://github.com/ClickHouse/ClickHouse/issues/27965). [#31008](https://github.com/ClickHouse/ClickHouse/pull/31008) ([Kseniia Sumarokova](https://github.com/kssenii)). +* *Setting rename.* Add custom null representation support for TSV/CSV input formats. Fix deserialing Nullable(String) in TSV/CSV/JSONCompactStringsEachRow/JSONStringsEachRow input formats. Rename `output_format_csv_null_representation` and `output_format_tsv_null_representation` to `format_csv_null_representation` and `format_tsv_null_representation` accordingly. [#30497](https://github.com/ClickHouse/ClickHouse/pull/30497) ([Kruglov Pavel](https://github.com/Avogar)). +* *Further deprecation of already unused code.* This is relevant only for users of ClickHouse versions older than 20.6. A "leader election" mechanism is removed from `ReplicatedMergeTree`, because multiple leaders are supported since 20.6. If you are upgrading from an older version and some replica with an old version is a leader, then server will fail to start after upgrade. Stop replicas with old version to make new version start. After that it will not be possible to downgrade to version older than 20.6. [#32140](https://github.com/ClickHouse/ClickHouse/pull/32140) ([tavplubix](https://github.com/tavplubix)). + +#### New Feature + +* Implemented more of the ZooKeeper Four Letter Words commands in clickhouse-keeper: https://zookeeper.apache.org/doc/r3.4.8/zookeeperAdmin.html#sc_zkCommands. [#28981](https://github.com/ClickHouse/ClickHouse/pull/28981) ([JackyWoo](https://github.com/JackyWoo)). Now `clickhouse-keeper` is feature complete. +* Support for `Bool` data type. [#31072](https://github.com/ClickHouse/ClickHouse/pull/31072) ([kevin wan](https://github.com/MaxWk)). +* Support for `PARTITION BY` in File, URL, HDFS storages and with `INSERT INTO` table function. Closes [#30273](https://github.com/ClickHouse/ClickHouse/issues/30273). [#30690](https://github.com/ClickHouse/ClickHouse/pull/30690) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `CONSTRAINT ... ASSUME ...` (without checking during `INSERT`). Added query transformation to CNF (https://github.com/ClickHouse/ClickHouse/issues/11749) for more convenient optimization. Added simple query rewriting using constraints (only simple matching now, will be improved to support <,=,>... later). Added ability to replace heavy columns with light columns if it's possible. [#18787](https://github.com/ClickHouse/ClickHouse/pull/18787) ([Nikita Vasilev](https://github.com/nikvas0)). +* Basic access authentication for http/url functions. [#31648](https://github.com/ClickHouse/ClickHouse/pull/31648) ([michael1589](https://github.com/michael1589)). +* Support `INTERVAL` type in `STEP` clause for `WITH FILL` modifier. [#30927](https://github.com/ClickHouse/ClickHouse/pull/30927) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for parallel reading from multiple files and support globs in `FROM INFILE` clause. [#30135](https://github.com/ClickHouse/ClickHouse/pull/30135) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add support for `Identifier` table and database query parameters. Closes [#27226](https://github.com/ClickHouse/ClickHouse/issues/27226). [#28668](https://github.com/ClickHouse/ClickHouse/pull/28668) ([Nikolay Degterinsky](https://github.com/evillique)). +* *TLDR: Major improvements of completeness and consistency of text formats.* Refactor formats `TSV`, `TSVRaw`, `CSV` and `JSONCompactEachRow`, `JSONCompactStringsEachRow`, remove code duplication, add base interface for formats with `-WithNames` and `-WithNamesAndTypes` suffixes. Add formats `CSVWithNamesAndTypes`, `TSVRawWithNames`, `TSVRawWithNamesAndTypes`, `JSONCompactEachRowWIthNames`, `JSONCompactStringsEachRowWIthNames`, `RowBinaryWithNames`. Support parallel parsing for formats `TSVWithNamesAndTypes`, `TSVRaw(WithNames/WIthNamesAndTypes)`, `CSVWithNamesAndTypes`, `JSONCompactEachRow(WithNames/WIthNamesAndTypes)`, `JSONCompactStringsEachRow(WithNames/WIthNamesAndTypes)`. Support columns mapping and types checking for `RowBinaryWithNamesAndTypes` format. Add setting `input_format_with_types_use_header` which specify if we should check that types written in `WIthNamesAndTypes` format matches with table structure. Add setting `input_format_csv_empty_as_default` and use it in CSV format instead of `input_format_defaults_for_omitted_fields` (because this setting should not control `csv_empty_as_default`). Fix usage of setting `input_format_defaults_for_omitted_fields` (it was used only as `csv_empty_as_default`, but it should control calculation of default expressions for omitted fields). Fix Nullable input/output in `TSVRaw` format, make this format fully compatible with inserting into TSV. Fix inserting NULLs in `LowCardinality(Nullable)` when `input_format_null_as_default` is enabled (previously default values was inserted instead of actual NULLs). Fix strings deserialization in `JSONStringsEachRow`/`JSONCompactStringsEachRow` formats (strings were parsed just until first '\n' or '\t'). Add ability to use `Raw` escaping rule in Template input format. Add diagnostic info for JSONCompactEachRow(WithNames/WIthNamesAndTypes) input format. Fix bug with parallel parsing of `-WithNames` formats in case when setting `min_chunk_bytes_for_parallel_parsing` is less than bytes in a single row. [#30178](https://github.com/ClickHouse/ClickHouse/pull/30178) ([Kruglov Pavel](https://github.com/Avogar)). Allow to print/parse names and types of colums in `CustomSeparated` input/output format. Add formats `CustomSeparatedWithNames/WithNamesAndTypes` similar to `TSVWithNames/WithNamesAndTypes`. [#31434](https://github.com/ClickHouse/ClickHouse/pull/31434) ([Kruglov Pavel](https://github.com/Avogar)). +* Aliyun OSS Storage support. [#31286](https://github.com/ClickHouse/ClickHouse/pull/31286) ([cfcz48](https://github.com/cfcz48)). +* Exposes all settings of the global thread pool in the configuration file. [#31285](https://github.com/ClickHouse/ClickHouse/pull/31285) ([Tomáš Hromada](https://github.com/gyfis)). +* Introduced window functions `exponentialTimeDecayedSum`, `exponentialTimeDecayedMax`, `exponentialTimeDecayedCount` and `exponentialTimeDecayedAvg` which are more effective than `exponentialMovingAverage` for bigger windows. Also more use-cases were covered. [#29799](https://github.com/ClickHouse/ClickHouse/pull/29799) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add option to compress logs before writing them to a file using LZ4. Closes [#23860](https://github.com/ClickHouse/ClickHouse/issues/23860). [#29219](https://github.com/ClickHouse/ClickHouse/pull/29219) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support `JOIN ON 1 = 1` that have CROSS JOIN semantic. This closes [#25578](https://github.com/ClickHouse/ClickHouse/issues/25578). [#25894](https://github.com/ClickHouse/ClickHouse/pull/25894) ([Vladimir C](https://github.com/vdimir)). +* Add Map combinator for `Map` type. - Rename old `sum-, min-, max- Map` for mapped arrays to `sum-, min-, max- MappedArrays`. [#24539](https://github.com/ClickHouse/ClickHouse/pull/24539) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Make reading from HTTP retriable. Closes [#29696](https://github.com/ClickHouse/ClickHouse/issues/29696). [#29894](https://github.com/ClickHouse/ClickHouse/pull/29894) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Experimental Feature + +* `WINDOW VIEW` to enable stream processing in ClickHouse. [#8331](https://github.com/ClickHouse/ClickHouse/pull/8331) ([vxider](https://github.com/Vxider)). +* Drop support for using Ordinary databases with `MaterializedMySQL`. [#31292](https://github.com/ClickHouse/ClickHouse/pull/31292) ([Stig Bakken](https://github.com/stigsb)). +* Implement the commands BACKUP and RESTORE for the Log family. This feature is under development. [#30688](https://github.com/ClickHouse/ClickHouse/pull/30688) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Performance Improvement + +* Reduce memory usage when reading with `s3` / `url` / `hdfs` formats `Parquet`, `ORC`, `Arrow` (controlled by setting `input_format_allow_seeks`, enabled by default). Also add setting `remote_read_min_bytes_for_seek` to control seeks. Closes [#10461](https://github.com/ClickHouse/ClickHouse/issues/10461). Closes [#16857](https://github.com/ClickHouse/ClickHouse/issues/16857). [#30936](https://github.com/ClickHouse/ClickHouse/pull/30936) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add optimizations for constant conditions in JOIN ON, ref [#26928](https://github.com/ClickHouse/ClickHouse/issues/26928). [#27021](https://github.com/ClickHouse/ClickHouse/pull/27021) ([Vladimir C](https://github.com/vdimir)). +* Support parallel formatting for all text formats, except `JSONEachRowWithProgress` and `PrettyCompactMonoBlock`. [#31489](https://github.com/ClickHouse/ClickHouse/pull/31489) ([Kruglov Pavel](https://github.com/Avogar)). +* Speed up count over nullable columns. [#31806](https://github.com/ClickHouse/ClickHouse/pull/31806) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up `avg` and `sumCount` aggregate functions. [#31694](https://github.com/ClickHouse/ClickHouse/pull/31694) ([Raúl Marín](https://github.com/Algunenano)). +* Improve performance of JSON and XML output formats. [#31673](https://github.com/ClickHouse/ClickHouse/pull/31673) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of syncing data to block device. This closes [#31181](https://github.com/ClickHouse/ClickHouse/issues/31181). [#31229](https://github.com/ClickHouse/ClickHouse/pull/31229) ([zhanglistar](https://github.com/zhanglistar)). +* Fixing query performance issue in `LiveView` tables. Fixes [#30831](https://github.com/ClickHouse/ClickHouse/issues/30831). [#31006](https://github.com/ClickHouse/ClickHouse/pull/31006) ([vzakaznikov](https://github.com/vzakaznikov)). +* Speed up query parsing. [#31949](https://github.com/ClickHouse/ClickHouse/pull/31949) ([Raúl Marín](https://github.com/Algunenano)). +* Allow to split `GraphiteMergeTree` rollup rules for plain/tagged metrics (optional `rule_type` field). [#25122](https://github.com/ClickHouse/ClickHouse/pull/25122) ([Michail Safronov](https://github.com/msaf1980)). +* Remove excessive `DESC TABLE` requests for `remote()` (in case of `remote('127.1', system.one)` (i.e. identifier as the db.table instead of string) there was excessive `DESC TABLE` request). [#32019](https://github.com/ClickHouse/ClickHouse/pull/32019) ([Azat Khuzhin](https://github.com/azat)). +* Optimize function `tupleElement` to reading of subcolumn with enabled setting `optimize_functions_to_subcolumns`. [#31261](https://github.com/ClickHouse/ClickHouse/pull/31261) ([Anton Popov](https://github.com/CurtizJ)). +* Optimize function `mapContains` to reading of subcolumn `key` with enabled settings `optimize_functions_to_subcolumns`. [#31218](https://github.com/ClickHouse/ClickHouse/pull/31218) ([Anton Popov](https://github.com/CurtizJ)). +* Add settings `merge_tree_min_rows_for_concurrent_read_for_remote_filesystem` and `merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem`. [#30970](https://github.com/ClickHouse/ClickHouse/pull/30970) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Skipping mutations of different partitions in `StorageMergeTree`. [#21326](https://github.com/ClickHouse/ClickHouse/pull/21326) ([Vladimir Chebotarev](https://github.com/excitoon)). + +#### Improvement + +* Do not allow to drop a table or dictionary if some tables or dictionaries depend on it. [#30977](https://github.com/ClickHouse/ClickHouse/pull/30977) ([tavplubix](https://github.com/tavplubix)). +* Allow versioning of aggregate function states. Now we can introduce backward compatible changes in serialization format of aggregate function states. Closes [#12552](https://github.com/ClickHouse/ClickHouse/issues/12552). [#24820](https://github.com/ClickHouse/ClickHouse/pull/24820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support PostgreSQL style `ALTER MODIFY COLUMN` syntax. [#32003](https://github.com/ClickHouse/ClickHouse/pull/32003) ([SuperDJY](https://github.com/cmsxbc)). +* Added `update_field` support for `RangeHashedDictionary`, `ComplexKeyRangeHashedDictionary`. [#32185](https://github.com/ClickHouse/ClickHouse/pull/32185) ([Maksim Kita](https://github.com/kitaisreal)). +* The `murmurHash3_128` and `sipHash128` functions now accept an arbitrary number of arguments. This closes [#28774](https://github.com/ClickHouse/ClickHouse/issues/28774). [#28965](https://github.com/ClickHouse/ClickHouse/pull/28965) ([小路](https://github.com/nicelulu)). +* Support default expression for `HDFS` storage and optimize fetching when source is column oriented. [#32256](https://github.com/ClickHouse/ClickHouse/pull/32256) ([李扬](https://github.com/taiyang-li)). +* Improve the operation name of an opentelemetry span. [#32234](https://github.com/ClickHouse/ClickHouse/pull/32234) ([Frank Chen](https://github.com/FrankChen021)). +* Use `Content-Type: application/x-ndjson` (http://ndjson.org/) for output format `JSONEachRow`. [#32223](https://github.com/ClickHouse/ClickHouse/pull/32223) ([Dmitriy Dorofeev](https://github.com/deem0n)). +* Improve skipping unknown fields with quoted escaping rule in Template/CustomSeparated formats. Previously you could skip only quoted strings, now you can skip values with any type. [#32204](https://github.com/ClickHouse/ClickHouse/pull/32204) ([Kruglov Pavel](https://github.com/Avogar)). +* Now `clickhouse-keeper` refuses to start or apply configuration changes when they contain duplicated IDs or endpoints. Fixes [#31339](https://github.com/ClickHouse/ClickHouse/issues/31339). [#32121](https://github.com/ClickHouse/ClickHouse/pull/32121) ([alesapin](https://github.com/alesapin)). +* Set Content-Type in HTTP packets issued from URL engine. [#32113](https://github.com/ClickHouse/ClickHouse/pull/32113) ([Frank Chen](https://github.com/FrankChen021)). +* Return Content-Type as 'application/json' for `JSONEachRow` format if `output_format_json_array_of_rows` is enabled. [#32112](https://github.com/ClickHouse/ClickHouse/pull/32112) ([Frank Chen](https://github.com/FrankChen021)). +* Allow to parse `+` before `Float32`/`Float64` values. [#32079](https://github.com/ClickHouse/ClickHouse/pull/32079) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow a user configured `hdfs_replication` parameter for `DiskHDFS` and `StorageHDFS`. Closes [#32039](https://github.com/ClickHouse/ClickHouse/issues/32039). [#32049](https://github.com/ClickHouse/ClickHouse/pull/32049) ([leosunli](https://github.com/leosunli)). +* Added ClickHouse `exception` and `exception_code` fields to opentelemetry span log. [#32040](https://github.com/ClickHouse/ClickHouse/pull/32040) ([Frank Chen](https://github.com/FrankChen021)). +* Improve opentelemetry span log duration - it was is zero at the query level if there is a query exception. [#32038](https://github.com/ClickHouse/ClickHouse/pull/32038) ([Frank Chen](https://github.com/FrankChen021)). +* Fix the issue that `LowCardinality` of `Int256` cannot be created. [#31832](https://github.com/ClickHouse/ClickHouse/pull/31832) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Recreate `system.*_log` tables in case of different engine/partition_by. [#31824](https://github.com/ClickHouse/ClickHouse/pull/31824) ([Azat Khuzhin](https://github.com/azat)). +* `MaterializedMySQL`: Fix issue with table named 'table'. [#31781](https://github.com/ClickHouse/ClickHouse/pull/31781) ([Håvard Kvålen](https://github.com/havardk)). +* ClickHouse dictionary source: support predefined connections. Closes [#31705](https://github.com/ClickHouse/ClickHouse/issues/31705). [#31749](https://github.com/ClickHouse/ClickHouse/pull/31749) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to use predefined connections configuration for Kafka and RabbitMQ engines (the same way as for other integration table engines). [#31691](https://github.com/ClickHouse/ClickHouse/pull/31691) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Always re-render prompt while navigating history in clickhouse-client. This will improve usability of manipulating very long queries that don't fit on screen. [#31675](https://github.com/ClickHouse/ClickHouse/pull/31675) ([alexey-milovidov](https://github.com/alexey-milovidov)) (author: Amos Bird). +* Add key bindings for navigating through history (instead of lines/history). [#31641](https://github.com/ClickHouse/ClickHouse/pull/31641) ([Azat Khuzhin](https://github.com/azat)). +* Improve the `max_execution_time` checks. Fixed some cases when timeout checks do not happen and query could run too long. [#31636](https://github.com/ClickHouse/ClickHouse/pull/31636) ([Raúl Marín](https://github.com/Algunenano)). +* Better exception message when `users.xml` cannot be loaded due to bad password hash. This closes [#24126](https://github.com/ClickHouse/ClickHouse/issues/24126). [#31557](https://github.com/ClickHouse/ClickHouse/pull/31557) ([Vitaly Baranov](https://github.com/vitlibar)). +* Use shard and replica name from `Replicated` database arguments when expanding macros in `ReplicatedMergeTree` arguments if these macros are not defined in config. Closes [#31471](https://github.com/ClickHouse/ClickHouse/issues/31471). [#31488](https://github.com/ClickHouse/ClickHouse/pull/31488) ([tavplubix](https://github.com/tavplubix)). +* Better analysis for `min/max/count` projection. Now, with enabled `allow_experimental_projection_optimization`, virtual `min/max/count` projection can be used together with columns from partition key. [#31474](https://github.com/ClickHouse/ClickHouse/pull/31474) ([Amos Bird](https://github.com/amosbird)). +* Add `--pager` support for `clickhouse-local`. [#31457](https://github.com/ClickHouse/ClickHouse/pull/31457) ([Azat Khuzhin](https://github.com/azat)). +* Fix waiting of the editor during interactive query edition (`waitpid()` returns -1 on `SIGWINCH` and `EDITOR` and `clickhouse-local`/`clickhouse-client` works concurrently). [#31456](https://github.com/ClickHouse/ClickHouse/pull/31456) ([Azat Khuzhin](https://github.com/azat)). +* Throw an exception if there is some garbage after field in `JSONCompactStrings(EachRow)` format. [#31455](https://github.com/ClickHouse/ClickHouse/pull/31455) ([Kruglov Pavel](https://github.com/Avogar)). +* Default value of `http_send_timeout` and `http_receive_timeout` settings changed from 1800 (30 minutes) to 180 (3 minutes). [#31450](https://github.com/ClickHouse/ClickHouse/pull/31450) ([tavplubix](https://github.com/tavplubix)). +* `MaterializedMySQL` now handles `CREATE TABLE ... LIKE ...` DDL queries. [#31410](https://github.com/ClickHouse/ClickHouse/pull/31410) ([Stig Bakken](https://github.com/stigsb)). +* Return artificial create query when executing `show create table` on system's tables. [#31391](https://github.com/ClickHouse/ClickHouse/pull/31391) ([SuperDJY](https://github.com/cmsxbc)). +* Previously progress was shown only for `numbers` table function. Now for `numbers_mt` it is also shown. [#31318](https://github.com/ClickHouse/ClickHouse/pull/31318) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Initial user's roles are used now to find row policies, see [#31080](https://github.com/ClickHouse/ClickHouse/issues/31080). [#31262](https://github.com/ClickHouse/ClickHouse/pull/31262) ([Vitaly Baranov](https://github.com/vitlibar)). +* If some obsolete setting is changed - show warning in `system.warnings`. [#31252](https://github.com/ClickHouse/ClickHouse/pull/31252) ([tavplubix](https://github.com/tavplubix)). +* Improved backoff for background cleanup tasks in `MergeTree`. Settings `merge_tree_clear_old_temporary_directories_interval_seconds` and `merge_tree_clear_old_parts_interval_seconds` moved from users settings to merge tree settings. [#31180](https://github.com/ClickHouse/ClickHouse/pull/31180) ([tavplubix](https://github.com/tavplubix)). +* Now every replica will send to client only incremental information about profile events counters. [#31155](https://github.com/ClickHouse/ClickHouse/pull/31155) ([Dmitry Novik](https://github.com/novikd)). This makes `--hardware_utilization` option in `clickhouse-client` usable. +* Enable multiline editing in clickhouse-client by default. This addresses [#31121](https://github.com/ClickHouse/ClickHouse/issues/31121) . [#31123](https://github.com/ClickHouse/ClickHouse/pull/31123) ([Amos Bird](https://github.com/amosbird)). +* Function name normalization for `ALTER` queries. This helps avoid metadata mismatch between creating table with indices/projections and adding indices/projections via alter commands. This is a follow-up PR of https://github.com/ClickHouse/ClickHouse/pull/20174. Mark as improvements as there are no bug reports and the senario is somehow rare. [#31095](https://github.com/ClickHouse/ClickHouse/pull/31095) ([Amos Bird](https://github.com/amosbird)). +* Support `IF EXISTS` modifier for `RENAME DATABASE`/`TABLE`/`DICTIONARY` query. If this directive is used, one will not get an error if the DATABASE/TABLE/DICTIONARY to be renamed doesn't exist. [#31081](https://github.com/ClickHouse/ClickHouse/pull/31081) ([victorgao](https://github.com/kafka1991)). +* Cancel vertical merges when partition is dropped. This is a follow-up of https://github.com/ClickHouse/ClickHouse/pull/25684 and https://github.com/ClickHouse/ClickHouse/pull/30996. [#31057](https://github.com/ClickHouse/ClickHouse/pull/31057) ([Amos Bird](https://github.com/amosbird)). +* The local session inside a ClickHouse dictionary source won't send its events to the session log anymore. This fixes a possible deadlock (tsan alert) on shutdown. Also this PR fixes flaky `test_dictionaries_dependency_xml/`. [#31013](https://github.com/ClickHouse/ClickHouse/pull/31013) ([Vitaly Baranov](https://github.com/vitlibar)). +* Less locking in ALTER command. [#31010](https://github.com/ClickHouse/ClickHouse/pull/31010) ([Amos Bird](https://github.com/amosbird)). +* Fix `--verbose` option in clickhouse-local interactive mode and allow logging into file. [#30881](https://github.com/ClickHouse/ClickHouse/pull/30881) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `\l`, `\d`, `\c` commands in `clickhouse-client` like in MySQL and PostgreSQL. [#30876](https://github.com/ClickHouse/ClickHouse/pull/30876) ([Pavel Medvedev](https://github.com/pmed)). +* For clickhouse-local or clickhouse-client: if there is `--interactive` option with `--query` or `--queries-file`, then first execute them like in non-interactive and then start interactive mode. [#30851](https://github.com/ClickHouse/ClickHouse/pull/30851) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible "The local set of parts of X doesn't look like the set of parts in ZooKeeper" error (if DROP fails during removing znodes from zookeeper). [#30826](https://github.com/ClickHouse/ClickHouse/pull/30826) ([Azat Khuzhin](https://github.com/azat)). +* Avro format works against Kafka. Setting `output_format_avro_rows_in_file` added. [#30351](https://github.com/ClickHouse/ClickHouse/pull/30351) ([Ilya Golshtein](https://github.com/ilejn)). +* Allow to specify one or any number of PostgreSQL schemas for one `MaterializedPostgreSQL` database. Closes [#28901](https://github.com/ClickHouse/ClickHouse/issues/28901). Closes [#29324](https://github.com/ClickHouse/ClickHouse/issues/29324). [#28933](https://github.com/ClickHouse/ClickHouse/pull/28933) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Replaced default ports for clickhouse-keeper internal communication from 44444 to 9234. Fixes [#30879](https://github.com/ClickHouse/ClickHouse/issues/30879). [#31799](https://github.com/ClickHouse/ClickHouse/pull/31799) ([alesapin](https://github.com/alesapin)). +* Implement function transform with Decimal arguments. [#31839](https://github.com/ClickHouse/ClickHouse/pull/31839) ([李帅](https://github.com/loneylee)). +* Fix abort in debug server and `DB::Exception: std::out_of_range: basic_string` error in release server in case of bad hdfs url by adding additional check of hdfs url structure. [#31042](https://github.com/ClickHouse/ClickHouse/pull/31042) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible assert in `hdfs` table function/engine, add test. [#31036](https://github.com/ClickHouse/ClickHouse/pull/31036) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Bug Fixes + +* Fix group by / order by / limit by aliases with positional arguments enabled. Closes [#31173](https://github.com/ClickHouse/ClickHouse/issues/31173). [#31741](https://github.com/ClickHouse/ClickHouse/pull/31741) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix usage of `Buffer` table engine with type `Map`. Fixes [#30546](https://github.com/ClickHouse/ClickHouse/issues/30546). [#31742](https://github.com/ClickHouse/ClickHouse/pull/31742) ([Anton Popov](https://github.com/CurtizJ)). +* Fix reading from `MergeTree` tables with enabled `use_uncompressed_cache`. [#31826](https://github.com/ClickHouse/ClickHouse/pull/31826) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed the behavior when mutations that have nothing to do are stuck (with enabled setting `empty_result_for_aggregation_by_empty_set`). [#32358](https://github.com/ClickHouse/ClickHouse/pull/32358) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix skipping columns while writing protobuf. This PR fixes [#31160](https://github.com/ClickHouse/ClickHouse/issues/31160), see the comment [#31160](https://github.com/ClickHouse/ClickHouse/issues/31160)#issuecomment-980595318. [#31988](https://github.com/ClickHouse/ClickHouse/pull/31988) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix bug when remove unneeded columns in subquery. If there is an aggregation function in query without group by, do not remove if it is unneeded. [#32289](https://github.com/ClickHouse/ClickHouse/pull/32289) ([dongyifeng](https://github.com/dyf6372)). +* Quota limit was not reached, but the limit was exceeded. This PR fixes [#31174](https://github.com/ClickHouse/ClickHouse/issues/31174). [#31337](https://github.com/ClickHouse/ClickHouse/pull/31337) ([sunny](https://github.com/sunny19930321)). +* Fix SHOW GRANTS when partial revokes are used. This PR fixes [#31138](https://github.com/ClickHouse/ClickHouse/issues/31138). [#31249](https://github.com/ClickHouse/ClickHouse/pull/31249) ([Vitaly Baranov](https://github.com/vitlibar)). +* Memory amount was incorrectly estimated when ClickHouse is run in containers with cgroup limits. [#31157](https://github.com/ClickHouse/ClickHouse/pull/31157) ([Pavel Medvedev](https://github.com/pmed)). +* Fix `ALTER ... MATERIALIZE COLUMN ...` queries in case when data type of default expression is not equal to the data type of column. [#32348](https://github.com/ClickHouse/ClickHouse/pull/32348) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed crash with SIGFPE in aggregate function `avgWeighted` with `Decimal` argument. Fixes [#32053](https://github.com/ClickHouse/ClickHouse/issues/32053). [#32303](https://github.com/ClickHouse/ClickHouse/pull/32303) ([tavplubix](https://github.com/tavplubix)). +* Server might fail to start with `Cannot attach 1 tables due to cyclic dependencies` error if `Dictionary` table looks at XML-dictionary with the same name, it's fixed. Fixes [#31315](https://github.com/ClickHouse/ClickHouse/issues/31315). [#32288](https://github.com/ClickHouse/ClickHouse/pull/32288) ([tavplubix](https://github.com/tavplubix)). +* Fix parsing error while NaN deserializing for `Nullable(Float)` for `Quoted` escaping rule. [#32190](https://github.com/ClickHouse/ClickHouse/pull/32190) ([Kruglov Pavel](https://github.com/Avogar)). +* XML dictionaries: identifiers, used in table create query, can be qualified to `default_database` during upgrade to newer version. Closes [#31963](https://github.com/ClickHouse/ClickHouse/issues/31963). [#32187](https://github.com/ClickHouse/ClickHouse/pull/32187) ([Maksim Kita](https://github.com/kitaisreal)). +* Number of active replicas might be determined incorrectly when inserting with quorum if setting `replicated_can_become_leader` is disabled on some replicas. It's fixed. [#32157](https://github.com/ClickHouse/ClickHouse/pull/32157) ([tavplubix](https://github.com/tavplubix)). +* Dictionaries: fix cases when `{condition}` does not work for custom database queries. [#32117](https://github.com/ClickHouse/ClickHouse/pull/32117) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix `CAST` from `Nullable` with `cast_keep_nullable` (`PARAMETER_OUT_OF_BOUND` error before for i.e. `toUInt32OrDefault(toNullable(toUInt32(1)))`). [#32080](https://github.com/ClickHouse/ClickHouse/pull/32080) ([Azat Khuzhin](https://github.com/azat)). +* Fix CREATE TABLE of Join Storage in some obscure cases. Close [#31680](https://github.com/ClickHouse/ClickHouse/issues/31680). [#32066](https://github.com/ClickHouse/ClickHouse/pull/32066) ([SuperDJY](https://github.com/cmsxbc)). +* Fixed `Directory ... already exists and is not empty` error when detaching part. [#32063](https://github.com/ClickHouse/ClickHouse/pull/32063) ([tavplubix](https://github.com/tavplubix)). +* `MaterializedMySQL` (experimental feature): Fix misinterpretation of `DECIMAL` data from MySQL. [#31990](https://github.com/ClickHouse/ClickHouse/pull/31990) ([Håvard Kvålen](https://github.com/havardk)). +* `FileLog` (experimental feature) engine unnesessary created meta data directory when create table failed. Fix [#31962](https://github.com/ClickHouse/ClickHouse/issues/31962). [#31967](https://github.com/ClickHouse/ClickHouse/pull/31967) ([flynn](https://github.com/ucasfl)). +* Some `GET_PART` entry might hang in replication queue if part is lost on all replicas and there are no other parts in the same partition. It's fixed in cases when partition key contains only columns of integer types or `Date[Time]`. Fixes [#31485](https://github.com/ClickHouse/ClickHouse/issues/31485). [#31887](https://github.com/ClickHouse/ClickHouse/pull/31887) ([tavplubix](https://github.com/tavplubix)). +* Fix functions `empty` and `notEmpty` with arguments of `UUID` type. Fixes [#31819](https://github.com/ClickHouse/ClickHouse/issues/31819). [#31883](https://github.com/ClickHouse/ClickHouse/pull/31883) ([Anton Popov](https://github.com/CurtizJ)). +* Change configuration path from `keeper_server.session_timeout_ms` to `keeper_server.coordination_settings.session_timeout_ms` when constructing a `KeeperTCPHandler`. Same with `operation_timeout`. [#31859](https://github.com/ClickHouse/ClickHouse/pull/31859) ([JackyWoo](https://github.com/JackyWoo)). +* Fix invalid cast of Nullable type when nullable primary key is used. (Nullable primary key is a discouraged feature - please do not use). This fixes [#31075](https://github.com/ClickHouse/ClickHouse/issues/31075). [#31823](https://github.com/ClickHouse/ClickHouse/pull/31823) ([Amos Bird](https://github.com/amosbird)). +* Fix crash in recursive UDF in SQL. Closes [#30856](https://github.com/ClickHouse/ClickHouse/issues/30856). [#31820](https://github.com/ClickHouse/ClickHouse/pull/31820) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash when function `dictGet` with type is used for dictionary attribute when type is `Nullable`. Fixes [#30980](https://github.com/ClickHouse/ClickHouse/issues/30980). [#31800](https://github.com/ClickHouse/ClickHouse/pull/31800) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash with empty result of ODBC query (with some ODBC drivers). Closes [#31465](https://github.com/ClickHouse/ClickHouse/issues/31465). [#31766](https://github.com/ClickHouse/ClickHouse/pull/31766) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix disabling query profiler (In case of `query_profiler_real_time_period_ns>0`/`query_profiler_cpu_time_period_ns>0` query profiler can stayed enabled even after query finished). [#31740](https://github.com/ClickHouse/ClickHouse/pull/31740) ([Azat Khuzhin](https://github.com/azat)). +* Fixed rare segfault on concurrent `ATTACH PARTITION` queries. [#31738](https://github.com/ClickHouse/ClickHouse/pull/31738) ([tavplubix](https://github.com/tavplubix)). +* Fix race in JSONEachRowWithProgress output format when data and lines with progress are mixed in output. [#31736](https://github.com/ClickHouse/ClickHouse/pull/31736) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed `there are no such cluster here` error on execution of `ON CLUSTER` query if specified cluster name is name of `Replicated` database. [#31723](https://github.com/ClickHouse/ClickHouse/pull/31723) ([tavplubix](https://github.com/tavplubix)). +* Fix exception on some of the applications of `decrypt` function on Nullable columns. This closes [#31662](https://github.com/ClickHouse/ClickHouse/issues/31662). This closes [#31426](https://github.com/ClickHouse/ClickHouse/issues/31426). [#31707](https://github.com/ClickHouse/ClickHouse/pull/31707) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed function ngrams when string contains UTF-8 characters. [#31706](https://github.com/ClickHouse/ClickHouse/pull/31706) ([yandd](https://github.com/yandd)). +* Settings `input_format_allow_errors_num` and `input_format_allow_errors_ratio` did not work for parsing of domain types, such as `IPv4`, it's fixed. Fixes [#31686](https://github.com/ClickHouse/ClickHouse/issues/31686). [#31697](https://github.com/ClickHouse/ClickHouse/pull/31697) ([tavplubix](https://github.com/tavplubix)). +* Fixed null pointer exception in `MATERIALIZE COLUMN`. [#31679](https://github.com/ClickHouse/ClickHouse/pull/31679) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* `RENAME TABLE` query worked incorrectly on attempt to rename an DDL dictionary in `Ordinary` database, it's fixed. [#31638](https://github.com/ClickHouse/ClickHouse/pull/31638) ([tavplubix](https://github.com/tavplubix)). +* Implement `sparkbar` aggregate function as it was intended, see: [#26175](https://github.com/ClickHouse/ClickHouse/issues/26175)#issuecomment-960353867, [comment](https://github.com/ClickHouse/ClickHouse/issues/26175#issuecomment-961155065). [#31624](https://github.com/ClickHouse/ClickHouse/pull/31624) ([小路](https://github.com/nicelulu)). +* Fix invalid generated JSON when only column names contain invalid UTF-8 sequences. [#31534](https://github.com/ClickHouse/ClickHouse/pull/31534) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Disable `partial_merge_join_left_table_buffer_bytes` before bug in this optimization is fixed. See [#31009](https://github.com/ClickHouse/ClickHouse/issues/31009)). Remove redundant option `partial_merge_join_optimizations`. [#31528](https://github.com/ClickHouse/ClickHouse/pull/31528) ([Vladimir C](https://github.com/vdimir)). +* Fix progress for short `INSERT SELECT` queries. [#31510](https://github.com/ClickHouse/ClickHouse/pull/31510) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong behavior with group by and positional arguments. Closes [#31280](https://github.com/ClickHouse/ClickHouse/issues/31280)#issuecomment-968696186. [#31420](https://github.com/ClickHouse/ClickHouse/pull/31420) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Resolve `nullptr` in STS credentials provider for S3. [#31409](https://github.com/ClickHouse/ClickHouse/pull/31409) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Remove `notLike` function from index analysis, because it was wrong. [#31169](https://github.com/ClickHouse/ClickHouse/pull/31169) ([sundyli](https://github.com/sundy-li)). +* Fix bug in Keeper which can lead to inability to start when some coordination logs was lost and we have more fresh snapshot than our latest log. [#31150](https://github.com/ClickHouse/ClickHouse/pull/31150) ([alesapin](https://github.com/alesapin)). +* Rewrite right distributed table in local join. solves [#25809](https://github.com/ClickHouse/ClickHouse/issues/25809). [#31105](https://github.com/ClickHouse/ClickHouse/pull/31105) ([abel-cheng](https://github.com/abel-cheng)). +* Fix `Merge` table with aliases and where (it did not work before at all). Closes [#28802](https://github.com/ClickHouse/ClickHouse/issues/28802). [#31044](https://github.com/ClickHouse/ClickHouse/pull/31044) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix JSON_VALUE/JSON_QUERY with quoted identifiers. This allows to have spaces in json path. Closes [#30971](https://github.com/ClickHouse/ClickHouse/issues/30971). [#31003](https://github.com/ClickHouse/ClickHouse/pull/31003) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Using `formatRow` function with not row-oriented formats led to segfault. Don't allow to use this function with such formats (because it doesn't make sense). [#31001](https://github.com/ClickHouse/ClickHouse/pull/31001) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug which broke select queries if they happened after dropping materialized view. Found in [#30691](https://github.com/ClickHouse/ClickHouse/issues/30691). [#30997](https://github.com/ClickHouse/ClickHouse/pull/30997) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Skip `max_partition_size_to_drop check` in case of ATTACH PARTITION ... FROM and MOVE PARTITION ... [#30995](https://github.com/ClickHouse/ClickHouse/pull/30995) ([Amr Alaa](https://github.com/amralaa-MSFT)). +* Fix some corner cases with `INTERSECT` and `EXCEPT` operators. Closes [#30803](https://github.com/ClickHouse/ClickHouse/issues/30803). [#30965](https://github.com/ClickHouse/ClickHouse/pull/30965) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement + +* Fix incorrect filtering result on non-x86 builds. This closes [#31417](https://github.com/ClickHouse/ClickHouse/issues/31417). This closes [#31524](https://github.com/ClickHouse/ClickHouse/issues/31524). [#31574](https://github.com/ClickHouse/ClickHouse/pull/31574) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make ClickHouse build fully reproducible (byte identical on different machines). This closes [#22113](https://github.com/ClickHouse/ClickHouse/issues/22113). [#31899](https://github.com/ClickHouse/ClickHouse/pull/31899) ([alexey-milovidov](https://github.com/alexey-milovidov)). Remove filesystem path to the build directory from binaries to enable reproducible builds. This needed for [#22113](https://github.com/ClickHouse/ClickHouse/issues/22113). [#31838](https://github.com/ClickHouse/ClickHouse/pull/31838) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Use our own CMakeLists for `zlib-ng`, `cassandra`, `mariadb-connector-c` and `xz`, `re2`, `sentry`, `gsasl`, `arrow`, `protobuf`. This is needed for [#20151](https://github.com/ClickHouse/ClickHouse/issues/20151). Part of [#9226](https://github.com/ClickHouse/ClickHouse/issues/9226). A small step towards removal of annoying trash from the build system. [#30599](https://github.com/ClickHouse/ClickHouse/pull/30599) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Hermetic builds: use fixed version of libc and make sure that no source or binary files from the host OS are using during build. This closes [#27133](https://github.com/ClickHouse/ClickHouse/issues/27133). This closes [#21435](https://github.com/ClickHouse/ClickHouse/issues/21435). This closes [#30462](https://github.com/ClickHouse/ClickHouse/issues/30462). [#30011](https://github.com/ClickHouse/ClickHouse/pull/30011) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adding function `getFuzzerData()` to easily fuzz particular functions. This closes [#23227](https://github.com/ClickHouse/ClickHouse/issues/23227). [#27526](https://github.com/ClickHouse/ClickHouse/pull/27526) ([Alexey Boykov](https://github.com/mathalex)). +* More correct setting up capabilities inside Docker. [#31802](https://github.com/ClickHouse/ClickHouse/pull/31802) ([Constantine Peresypkin](https://github.com/pkit)). +* Enable clang `-fstrict-vtable-pointers`, `-fwhole-program-vtables` compile options. [#20151](https://github.com/ClickHouse/ClickHouse/pull/20151) ([Maksim Kita](https://github.com/kitaisreal)). +* Avoid downloading toolchain tarballs for cross-compiling for FreeBSD. [#31672](https://github.com/ClickHouse/ClickHouse/pull/31672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Initial support for risc-v. See development/build-cross-riscv for quirks and build command that was tested. [#31309](https://github.com/ClickHouse/ClickHouse/pull/31309) ([Vladimir Smirnov](https://github.com/Civil)). +* Support compile in arm machine with parameter "-DENABLE_TESTS=OFF". [#31007](https://github.com/ClickHouse/ClickHouse/pull/31007) ([zhanghuajie](https://github.com/zhanghuajieHIT)). + + +### ClickHouse release v21.11, 2021-11-09 + +#### Backward Incompatible Change + +* Change order of json_path and json arguments in SQL/JSON functions (to be consistent with the standard). Closes [#30449](https://github.com/ClickHouse/ClickHouse/issues/30449). [#30474](https://github.com/ClickHouse/ClickHouse/pull/30474) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove `MergeTree` table setting `write_final_mark`. It will be always `true`. [#30455](https://github.com/ClickHouse/ClickHouse/pull/30455) ([Kseniia Sumarokova](https://github.com/kssenii)). No actions required, all tables are compatible with the new version. +* Function `bayesAB` is removed. Please help to return this function back, refreshed. This closes [#26233](https://github.com/ClickHouse/ClickHouse/issues/26233). [#29934](https://github.com/ClickHouse/ClickHouse/pull/29934) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* This is relevant only if you already started using the experimental `clickhouse-keeper` support. Now ClickHouse Keeper snapshots compressed with `ZSTD` codec by default instead of custom ClickHouse LZ4 block compression. This behavior can be turned off with `compress_snapshots_with_zstd_format` coordination setting (must be equal on all quorum replicas). Backward incompatibility is quite rare and may happen only when new node will send snapshot (happens in case of recovery) to the old node which is unable to read snapshots in ZSTD format. [#29417](https://github.com/ClickHouse/ClickHouse/pull/29417) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* New asynchronous INSERT mode allows to accumulate inserted data and store it in a single batch in background. On client it can be enabled by setting `async_insert` for `INSERT` queries with data inlined in query or in separate buffer (e.g. for `INSERT` queries via HTTP protocol). If `wait_for_async_insert` is true (by default) the client will wait until data will be flushed to table. On server-side it controlled by the settings `async_insert_threads`, `async_insert_max_data_size` and `async_insert_busy_timeout_ms`. Implements [#18282](https://github.com/ClickHouse/ClickHouse/issues/18282). [#27537](https://github.com/ClickHouse/ClickHouse/pull/27537) ([Anton Popov](https://github.com/CurtizJ)). [#20557](https://github.com/ClickHouse/ClickHouse/pull/20557) ([Ivan](https://github.com/abyss7)). Notes on performance: with asynchronous inserts you can do up to around 10 000 individual INSERT queries per second, so it is still recommended to insert in batches if you want to achieve performance up to millions inserted rows per second. +* Add interactive mode for `clickhouse-local`. So, you can just run `clickhouse-local` to get a command line ClickHouse interface without connecting to a server and process data from files and external data sources. Also merge the code of `clickhouse-client` and `clickhouse-local` together. Closes [#7203](https://github.com/ClickHouse/ClickHouse/issues/7203). Closes [#25516](https://github.com/ClickHouse/ClickHouse/issues/25516). Closes [#22401](https://github.com/ClickHouse/ClickHouse/issues/22401). [#26231](https://github.com/ClickHouse/ClickHouse/pull/26231) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added support for executable (scriptable) user defined functions. These are UDFs that can be written in any programming language. [#28803](https://github.com/ClickHouse/ClickHouse/pull/28803) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow predefined connections to external data sources. This allows to avoid specifying credentials or addresses while using external data sources, they can be referenced by names instead. Closes [#28367](https://github.com/ClickHouse/ClickHouse/issues/28367). [#28577](https://github.com/ClickHouse/ClickHouse/pull/28577) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `INFORMATION_SCHEMA` database with `SCHEMATA`, `TABLES`, `VIEWS` and `COLUMNS` views to the corresponding tables in `system` database. Closes [#9770](https://github.com/ClickHouse/ClickHouse/issues/9770). [#28691](https://github.com/ClickHouse/ClickHouse/pull/28691) ([tavplubix](https://github.com/tavplubix)). +* Support `EXISTS (subquery)`. Closes [#6852](https://github.com/ClickHouse/ClickHouse/issues/6852). [#29731](https://github.com/ClickHouse/ClickHouse/pull/29731) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Session logging for audit. Logging all successful and failed login and logout events to a new `system.session_log` table. [#22415](https://github.com/ClickHouse/ClickHouse/pull/22415) ([Vasily Nemkov](https://github.com/Enmk)) ([Vitaly Baranov](https://github.com/vitlibar)). +* Support multidimensional cosine distance and euclidean distance functions; L1, L2, Lp, Linf distances and norms. Scalar product on tuples and various arithmetic operators on tuples. This fully closes [#4509](https://github.com/ClickHouse/ClickHouse/issues/4509) and even more. [#27933](https://github.com/ClickHouse/ClickHouse/pull/27933) ([Alexey Boykov](https://github.com/mathalex)). +* Add support for compression and decompression for `INTO OUTFILE` and `FROM INFILE` (with autodetect or with additional optional parameter). [#27135](https://github.com/ClickHouse/ClickHouse/pull/27135) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add CORS (Cross Origin Resource Sharing) support with HTTP `OPTIONS` request. It means, now Grafana will work with serverless requests without a kludges. Closes [#18693](https://github.com/ClickHouse/ClickHouse/issues/18693). [#29155](https://github.com/ClickHouse/ClickHouse/pull/29155) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Queries with JOIN ON now supports disjunctions (OR). [#21320](https://github.com/ClickHouse/ClickHouse/pull/21320) ([Ilya Golshtein](https://github.com/ilejn)). +* Added function `tokens`. That allow to split string into tokens using non-alpha numeric ASCII characters as separators. [#29981](https://github.com/ClickHouse/ClickHouse/pull/29981) ([Maksim Kita](https://github.com/kitaisreal)). Added function `ngrams` to extract ngrams from text. Closes [#29699](https://github.com/ClickHouse/ClickHouse/issues/29699). [#29738](https://github.com/ClickHouse/ClickHouse/pull/29738) ([Maksim Kita](https://github.com/kitaisreal)). +* Add functions for Unicode normalization: `normalizeUTF8NFC`, `normalizeUTF8NFD`, `normalizeUTF8NFKC`, `normalizeUTF8NFKD` functions. [#28633](https://github.com/ClickHouse/ClickHouse/pull/28633) ([darkkeks](https://github.com/darkkeks)). +* Streaming consumption of application log files in ClickHouse with `FileLog` table engine. It's like `Kafka` or `RabbitMQ` engine but for append-only and rotated logs in local filesystem. Closes [#6953](https://github.com/ClickHouse/ClickHouse/issues/6953). [#25969](https://github.com/ClickHouse/ClickHouse/pull/25969) ([flynn](https://github.com/ucasfl)) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `CapnProto` output format, refactor `CapnProto` input format. [#29291](https://github.com/ClickHouse/ClickHouse/pull/29291) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to write number in query as binary literal. Example `SELECT 0b001;`. [#29304](https://github.com/ClickHouse/ClickHouse/pull/29304) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `hashed_array` dictionary type. It saves memory when using dictionaries with multiple attributes. Closes [#30236](https://github.com/ClickHouse/ClickHouse/issues/30236). [#30242](https://github.com/ClickHouse/ClickHouse/pull/30242) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `JSONExtractKeys` function. [#30056](https://github.com/ClickHouse/ClickHouse/pull/30056) ([Vitaly](https://github.com/orloffv)). +* Add a function `getOSKernelVersion` - it returns a string with OS kernel version. [#29755](https://github.com/ClickHouse/ClickHouse/pull/29755) ([Memo](https://github.com/Joeywzr)). +* Added `MD4` and `SHA384` functions. MD4 is an obsolete and insecure hash function, it can be used only in rare cases when MD4 is already being used in some legacy system and you need to get exactly the same result. [#29602](https://github.com/ClickHouse/ClickHouse/pull/29602) ([Nikita Tikhomirov](https://github.com/NSTikhomirov)). +* HSTS can be enabled for ClickHouse HTTP server by setting `hsts_max_age` in configuration file with a positive number. [#29516](https://github.com/ClickHouse/ClickHouse/pull/29516) ([凌涛](https://github.com/lingtaolf)). +* Huawei OBS Storage support. Closes [#24294](https://github.com/ClickHouse/ClickHouse/issues/24294). [#29511](https://github.com/ClickHouse/ClickHouse/pull/29511) ([kevin wan](https://github.com/MaxWk)). +* New function `mapContainsKeyLike` to get the map that key matches a simple regular expression. [#29471](https://github.com/ClickHouse/ClickHouse/pull/29471) ([凌涛](https://github.com/lingtaolf)). New function `mapExtractKeyLike` to get the map only kept elements matched specified pattern. [#30793](https://github.com/ClickHouse/ClickHouse/pull/30793) ([凌涛](https://github.com/lingtaolf)). +* Implemented `ALTER TABLE x MODIFY COMMENT`. [#29264](https://github.com/ClickHouse/ClickHouse/pull/29264) ([Vasily Nemkov](https://github.com/Enmk)). +* Adds H3 inspection functions that are missing from ClickHouse but are available via the H3 api: https://h3geo.org/docs/api/inspection. [#29209](https://github.com/ClickHouse/ClickHouse/pull/29209) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow non-replicated ALTER TABLE FETCH and ATTACH in Replicated databases. [#29202](https://github.com/ClickHouse/ClickHouse/pull/29202) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Added a setting `output_format_csv_null_representation`: This is the same as `output_format_tsv_null_representation` but is for CSV output. [#29123](https://github.com/ClickHouse/ClickHouse/pull/29123) ([PHO](https://github.com/depressed-pho)). +* Added function `zookeeperSessionUptime()` which returns uptime of current ZooKeeper session in seconds. [#28983](https://github.com/ClickHouse/ClickHouse/pull/28983) ([tavplubix](https://github.com/tavplubix)). +* Implements the `h3ToGeoBoundary` function. [#28952](https://github.com/ClickHouse/ClickHouse/pull/28952) ([Ivan Veselov](https://github.com/fuzzERot)). +* Add aggregate function `exponentialMovingAverage` that can be used as window function. This closes [#27511](https://github.com/ClickHouse/ClickHouse/issues/27511). [#28914](https://github.com/ClickHouse/ClickHouse/pull/28914) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to include subcolumns of table columns into `DESCRIBE` query result (can be enabled by setting `describe_include_subcolumns`). [#28905](https://github.com/ClickHouse/ClickHouse/pull/28905) ([Anton Popov](https://github.com/CurtizJ)). +* `Executable`, `ExecutablePool` added option `send_chunk_header`. If this option is true then chunk rows_count with line break will be sent to client before chunk. [#28833](https://github.com/ClickHouse/ClickHouse/pull/28833) ([Maksim Kita](https://github.com/kitaisreal)). +* `tokenbf_v1` and `ngram` support Map with key of String of FixedSring type. It enhance data skipping in query with map key filter. ```sql CREATE TABLE map_tokenbf ( row_id UInt32, map Map(String, String), INDEX map_tokenbf map TYPE ngrambf_v1(4,256,2,0) GRANULARITY 1 ) Engine=MergeTree() Order by id ``` With table above, the query `select * from map_tokebf where map['K']='V'` will skip the granule that doesn't contain key `A` . Of course, how many rows will skipped is depended on the `granularity` and `index_granularity` you set. [#28511](https://github.com/ClickHouse/ClickHouse/pull/28511) ([凌涛](https://github.com/lingtaolf)). +* Send profile events from server to client. New packet type `ProfileEvents` was introduced. Closes [#26177](https://github.com/ClickHouse/ClickHouse/issues/26177). [#28364](https://github.com/ClickHouse/ClickHouse/pull/28364) ([Dmitry Novik](https://github.com/novikd)). +* Bit shift operations for `FixedString` and `String` data types. This closes [#27763](https://github.com/ClickHouse/ClickHouse/issues/27763). [#28325](https://github.com/ClickHouse/ClickHouse/pull/28325) ([小路](https://github.com/nicelulu)). +* Support adding / deleting tables to replication from PostgreSQL dynamically in database engine MaterializedPostgreSQL. Support alter for database settings. Closes [#27573](https://github.com/ClickHouse/ClickHouse/issues/27573). [#28301](https://github.com/ClickHouse/ClickHouse/pull/28301) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added function accurateCastOrDefault(x, T). Closes [#21330](https://github.com/ClickHouse/ClickHouse/issues/21330). Authors @taiyang-li. [#23028](https://github.com/ClickHouse/ClickHouse/pull/23028) ([Maksim Kita](https://github.com/kitaisreal)). +* Add Function `toUUIDOrDefault`, `toUInt8/16/32/64/256OrDefault`, `toInt8/16/32/64/128/256OrDefault`, which enables user defining default value(not null) when string parsing is failed. [#21330](https://github.com/ClickHouse/ClickHouse/pull/21330) ([taiyang-li](https://github.com/taiyang-li)). + +#### Performance Improvement + +* Background merges can be preempted by each other and they are scheduled with appropriate priorities. Now long running merges won't prevent short merges to proceed. This is needed for a better scheduling and controlling of merges execution. It reduces the chances to get "too many parts" error. [#22381](https://github.com/ClickHouse/ClickHouse/issues/22381). [#25165](https://github.com/ClickHouse/ClickHouse/pull/25165) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). Added an ability to execute more merges and mutations than the number of threads in background pool. Merges and mutations will be executed step by step according to their sizes (lower is more prioritized). The ratio of the number of tasks to threads to execute is controlled by a setting `background_merges_mutations_concurrency_ratio`, 2 by default. [#29140](https://github.com/ClickHouse/ClickHouse/pull/29140) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow to use asynchronous reads for remote filesystems. Lower the number of seeks while reading from remote filesystems. It improves performance tremendously and makes the experimental `web` and `s3` disks to work faster than EBS under certain conditions. [#29205](https://github.com/ClickHouse/ClickHouse/pull/29205) ([Kseniia Sumarokova](https://github.com/kssenii)). In the meantime, the `web` disk type (static dataset hosted on a web server) is graduated from being experimental to be production ready. +* Queries with `INTO OUTFILE` in `clickhouse-client` will use multiple threads. Fix the issue with flickering progress-bar when using `INTO OUTFILE`. This closes [#30873](https://github.com/ClickHouse/ClickHouse/issues/30873). This closes [#30872](https://github.com/ClickHouse/ClickHouse/issues/30872). [#30886](https://github.com/ClickHouse/ClickHouse/pull/30886) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reduce amount of redundant compressed data read from disk for some types `SELECT` queries (only for `MergeTree` engines family). [#30111](https://github.com/ClickHouse/ClickHouse/pull/30111) ([alesapin](https://github.com/alesapin)). +* Remove some redundant `seek` calls while reading compressed blocks in MergeTree table engines family. [#29766](https://github.com/ClickHouse/ClickHouse/pull/29766) ([alesapin](https://github.com/alesapin)). +* Make `url` table function to process multiple URLs in parallel. This closes [#29670](https://github.com/ClickHouse/ClickHouse/issues/29670) and closes [#29671](https://github.com/ClickHouse/ClickHouse/issues/29671). [#29673](https://github.com/ClickHouse/ClickHouse/pull/29673) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of aggregation in order of primary key (with enabled setting `optimize_aggregation_in_order`). [#30266](https://github.com/ClickHouse/ClickHouse/pull/30266) ([Anton Popov](https://github.com/CurtizJ)). +* Now clickhouse is using DNS cache while communicating with external S3. [#29999](https://github.com/ClickHouse/ClickHouse/pull/29999) ([alesapin](https://github.com/alesapin)). +* Add support for pushdown of `IS NULL`/`IS NOT NULL` to external databases (i.e. MySQL). [#29463](https://github.com/ClickHouse/ClickHouse/pull/29463) ([Azat Khuzhin](https://github.com/azat)). Transform `isNull`/`isNotNull` to `IS NULL`/`IS NOT NULL` (for external dbs, i.e. MySQL). [#29446](https://github.com/ClickHouse/ClickHouse/pull/29446) ([Azat Khuzhin](https://github.com/azat)). +* SELECT queries from Dictionary tables will use multiple threads. [#30500](https://github.com/ClickHouse/ClickHouse/pull/30500) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance for filtering (WHERE operation) of `Decimal` columns. [#30431](https://github.com/ClickHouse/ClickHouse/pull/30431) ([Jun Jin](https://github.com/vesslanjin)). +* Remove branchy code in filter operation with a better implementation with popcnt/ctz which have better performance. [#29881](https://github.com/ClickHouse/ClickHouse/pull/29881) ([Jun Jin](https://github.com/vesslanjin)). +* Improve filter bytemask generator (used for WHERE operator) function all in one with SSE/AVX2/AVX512 instructions. Note that by default ClickHouse is only using SSE, so it's only relevant for custom builds. [#30014](https://github.com/ClickHouse/ClickHouse/pull/30014) ([jasperzhu](https://github.com/jinjunzh)). [#30670](https://github.com/ClickHouse/ClickHouse/pull/30670) ([jasperzhu](https://github.com/jinjunzh)). +* Improve the performance of SUM aggregate function of Nullable floating point numbers. [#28906](https://github.com/ClickHouse/ClickHouse/pull/28906) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up part loading process with multiple disks are in use. The idea is similar to https://github.com/ClickHouse/ClickHouse/pull/16423 . Prod env shows improvement: 24 min -> 16 min . [#28363](https://github.com/ClickHouse/ClickHouse/pull/28363) ([Amos Bird](https://github.com/amosbird)). +* Reduce default settings for S3 multipart upload part size to lower memory usage. [#28679](https://github.com/ClickHouse/ClickHouse/pull/28679) ([ianton-ru](https://github.com/ianton-ru)). +* Speed up `bitmapAnd` function. [#28332](https://github.com/ClickHouse/ClickHouse/pull/28332) ([dddounaiking](https://github.com/OodounaikingoO)). +* Removed sub-optimal mutation notifications in `StorageMergeTree` when merges are still going. [#27552](https://github.com/ClickHouse/ClickHouse/pull/27552) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Attempt to improve performance of string comparison. [#28767](https://github.com/ClickHouse/ClickHouse/pull/28767) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Primary key index and partition filter can work in tuple. [#29281](https://github.com/ClickHouse/ClickHouse/pull/29281) ([凌涛](https://github.com/lingtaolf)). +* If query has multiple quantile aggregate functions with the same arguments but different level parameter, they will be fused together and executed in one pass if the setting `optimize_syntax_fuse_functions` is enabled. [#26657](https://github.com/ClickHouse/ClickHouse/pull/26657) ([hexiaoting](https://github.com/hexiaoting)). +* Now min-max aggregation over the first expression of primary key is optimized by projection. This is for [#329](https://github.com/ClickHouse/ClickHouse/issues/329). [#29918](https://github.com/ClickHouse/ClickHouse/pull/29918) ([Amos Bird](https://github.com/amosbird)). + +#### Experimental Feature + +* Add ability to change nodes configuration (in `.xml` file) for ClickHouse Keeper. [#30372](https://github.com/ClickHouse/ClickHouse/pull/30372) ([alesapin](https://github.com/alesapin)). +* Add `sparkbar` aggregate function. This closes [#26175](https://github.com/ClickHouse/ClickHouse/issues/26175). [#27481](https://github.com/ClickHouse/ClickHouse/pull/27481) ([小路](https://github.com/nicelulu)). Note: there is one flaw in this function, the behaviour will be changed in future releases. + +#### Improvement + +* Allow user to change log levels without restart. [#29586](https://github.com/ClickHouse/ClickHouse/pull/29586) ([Nikolay Degterinsky](https://github.com/evillique)). +* Multiple improvements for SQL UDF. Queries for manipulation of SQL User Defined Functions now support ON CLUSTER clause. Example `CREATE FUNCTION test_function ON CLUSTER 'cluster' AS x -> x + 1;`. Closes [#30666](https://github.com/ClickHouse/ClickHouse/issues/30666). [#30734](https://github.com/ClickHouse/ClickHouse/pull/30734) ([Maksim Kita](https://github.com/kitaisreal)). Support `CREATE OR REPLACE`, `CREATE IF NOT EXISTS` syntaxes. [#30454](https://github.com/ClickHouse/ClickHouse/pull/30454) ([Maksim Kita](https://github.com/kitaisreal)). Added DROP IF EXISTS support. Example `DROP FUNCTION IF EXISTS test_function`. [#30437](https://github.com/ClickHouse/ClickHouse/pull/30437) ([Maksim Kita](https://github.com/kitaisreal)). Support lambdas. Example `CREATE FUNCTION lambda_function AS x -> arrayMap(element -> element * 2, x);`. [#30435](https://github.com/ClickHouse/ClickHouse/pull/30435) ([Maksim Kita](https://github.com/kitaisreal)). Support SQL user defined functions for `clickhouse-local`. [#30179](https://github.com/ClickHouse/ClickHouse/pull/30179) ([Maksim Kita](https://github.com/kitaisreal)). +* Enable per-query memory profiler (set to `memory_profiler_step` = 4MiB) globally. [#29455](https://github.com/ClickHouse/ClickHouse/pull/29455) ([Azat Khuzhin](https://github.com/azat)). +* Added columns `data_compressed_bytes`, `data_uncompressed_bytes`, `marks_bytes` into `system.data_skipping_indices`. Added columns `secondary_indices_compressed_bytes`, `secondary_indices_uncompressed_bytes`, `secondary_indices_marks_bytes` into `system.parts`. Closes [#29697](https://github.com/ClickHouse/ClickHouse/issues/29697). [#29896](https://github.com/ClickHouse/ClickHouse/pull/29896) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `table` alias to system.tables and `database` alias to system.databases [#29677](https://github.com/ClickHouse/ClickHouse/issues/29677). [#29882](https://github.com/ClickHouse/ClickHouse/pull/29882) ([kevin wan](https://github.com/MaxWk)). +* Correctly resolve interdependencies between tables on server startup. Closes [#8004](https://github.com/ClickHouse/ClickHouse/issues/8004), closes [#15170](https://github.com/ClickHouse/ClickHouse/issues/15170). [#28373](https://github.com/ClickHouse/ClickHouse/pull/28373) ([tavplubix](https://github.com/tavplubix)). +* Avoid error "Division by zero" when denominator is Nullable in functions `divide`, `intDiv` and `modulo`. Closes [#22621](https://github.com/ClickHouse/ClickHouse/issues/22621). [#28352](https://github.com/ClickHouse/ClickHouse/pull/28352) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to parse values of `Date` data type in text formats as `YYYYMMDD` in addition to `YYYY-MM-DD`. This closes [#30870](https://github.com/ClickHouse/ClickHouse/issues/30870). [#30871](https://github.com/ClickHouse/ClickHouse/pull/30871) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Web UI: render bars in table cells. [#29792](https://github.com/ClickHouse/ClickHouse/pull/29792) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* User can now create dictionaries with comments: `CREATE DICTIONARY ... COMMENT 'vaue'` ... [#29899](https://github.com/ClickHouse/ClickHouse/pull/29899) ([Vasily Nemkov](https://github.com/Enmk)). Users now can set comments to database in `CREATE DATABASE` statement ... [#29429](https://github.com/ClickHouse/ClickHouse/pull/29429) ([Vasily Nemkov](https://github.com/Enmk)). +* Introduce `compiled_expression_cache_elements_size` setting. If you will ever want to use this setting, you will already know what it does. [#30667](https://github.com/ClickHouse/ClickHouse/pull/30667) ([Maksim Kita](https://github.com/kitaisreal)). +* clickhouse-format now supports option `--query`. In previous versions you have to pass the query to stdin. [#29325](https://github.com/ClickHouse/ClickHouse/pull/29325) ([凌涛](https://github.com/lingtaolf)). +* Support `ALTER TABLE` for tables in `Memory` databases. Memory databases are used in `clickhouse-local`. [#30866](https://github.com/ClickHouse/ClickHouse/pull/30866) ([tavplubix](https://github.com/tavplubix)). +* Arrays of all serializable types are now supported by `arrayStringConcat`. [#30840](https://github.com/ClickHouse/ClickHouse/pull/30840) ([Nickita Taranov](https://github.com/nickitat)). +* ClickHouse now will account docker/cgroups limitations to get system memory amount. See [#25662](https://github.com/ClickHouse/ClickHouse/issues/25662). [#30574](https://github.com/ClickHouse/ClickHouse/pull/30574) ([Pavel Medvedev](https://github.com/pmed)). +* Fetched table structure for PostgreSQL database is more reliable now. [#30477](https://github.com/ClickHouse/ClickHouse/pull/30477) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Full support of positional arguments in GROUP BY and ORDER BY. [#30433](https://github.com/ClickHouse/ClickHouse/pull/30433) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow extracting non-string element as string using JSONExtractString. This is for [pull/25452#issuecomment-927123287](https://github.com/ClickHouse/ClickHouse/pull/25452#issuecomment-927123287). [#30426](https://github.com/ClickHouse/ClickHouse/pull/30426) ([Amos Bird](https://github.com/amosbird)). +* Added an ability to use FINAL clause in SELECT queries from `GraphiteMergeTree`. [#30360](https://github.com/ClickHouse/ClickHouse/pull/30360) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Minor improvements in replica cloning and enqueuing fetch for broken parts, that should avoid extremely rare hanging of `GET_PART` entries in replication queue. [#30346](https://github.com/ClickHouse/ClickHouse/pull/30346) ([tavplubix](https://github.com/tavplubix)). +* Allow symlinks to files in `user_files` directory for file table function. [#30309](https://github.com/ClickHouse/ClickHouse/pull/30309) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed comparison of `Date32` with `Date`, `DateTime`, `DateTime64` and `String`. [#30219](https://github.com/ClickHouse/ClickHouse/pull/30219) ([liang.huang](https://github.com/lhuang09287750)). +* Allow to remove `SAMPLE BY` expression from `MergeTree` tables (`ALTER TABLE REMOVE SAMPLE BY`). [#30180](https://github.com/ClickHouse/ClickHouse/pull/30180) ([Anton Popov](https://github.com/CurtizJ)). +* Now `Keeper` (as part of `clickhouse-server`) will start asynchronously if it can connect to some other node. [#30170](https://github.com/ClickHouse/ClickHouse/pull/30170) ([alesapin](https://github.com/alesapin)). +* Now `clickhouse-client` supports native multi-line editing. [#30143](https://github.com/ClickHouse/ClickHouse/pull/30143) ([Amos Bird](https://github.com/amosbird)). +* `polygon` dictionaries (reverse geocoding): added support for reading the dictionary content with SELECT query method if setting `store_polygon_key_column` = true. Closes [#30090](https://github.com/ClickHouse/ClickHouse/issues/30090). [#30142](https://github.com/ClickHouse/ClickHouse/pull/30142) ([Maksim Kita](https://github.com/kitaisreal)). +* Add ClickHouse logo to Play UI. [#29674](https://github.com/ClickHouse/ClickHouse/pull/29674) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Better exception message while reading column from Arrow-supported formats like `Arrow`, `ArrowStream`, `Parquet` and `ORC`. This closes [#29926](https://github.com/ClickHouse/ClickHouse/issues/29926). [#29927](https://github.com/ClickHouse/ClickHouse/pull/29927) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix data-race between flush and startup in `Buffer` tables. This can appear in tests. [#29930](https://github.com/ClickHouse/ClickHouse/pull/29930) ([Azat Khuzhin](https://github.com/azat)). +* Fix `lock-order-inversion` between `DROP TABLE` for `DatabaseMemory` and `LiveView`. Live View is an experimental feature. Memory database is used in clickhouse-local. [#29929](https://github.com/ClickHouse/ClickHouse/pull/29929) ([Azat Khuzhin](https://github.com/azat)). +* Fix lock-order-inversion between periodic dictionary reload and config reload. [#29928](https://github.com/ClickHouse/ClickHouse/pull/29928) ([Azat Khuzhin](https://github.com/azat)). +* Update zoneinfo files to 2021c. [#29925](https://github.com/ClickHouse/ClickHouse/pull/29925) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add ability to configure retries and delays between them for `clickhouse-copier`. [#29921](https://github.com/ClickHouse/ClickHouse/pull/29921) ([Azat Khuzhin](https://github.com/azat)). +* Add `shutdown_wait_unfinished_queries` server setting to allowing waiting for running queries up to `shutdown_wait_unfinished` time. This is for [#24451](https://github.com/ClickHouse/ClickHouse/issues/24451). [#29914](https://github.com/ClickHouse/ClickHouse/pull/29914) ([Amos Bird](https://github.com/amosbird)). +* Add ability to trace peak memory usage (with new trace_type in `system.trace_log` - `MemoryPeak`). [#29858](https://github.com/ClickHouse/ClickHouse/pull/29858) ([Azat Khuzhin](https://github.com/azat)). +* PostgreSQL foreign tables: Added partitioned table prefix 'p' for the query for fetching replica identity index. [#29828](https://github.com/ClickHouse/ClickHouse/pull/29828) ([Shoh Jahon](https://github.com/Shohjahon)). +* Apply `max_untracked_memory`/`memory_profiler_step`/`memory_profiler_sample_probability` during mutate/merge to profile memory usage during merges. [#29681](https://github.com/ClickHouse/ClickHouse/pull/29681) ([Azat Khuzhin](https://github.com/azat)). +* Query obfuscator: `clickhouse-format --obfuscate` now works with more types of queries. [#29672](https://github.com/ClickHouse/ClickHouse/pull/29672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue: `clickhouse-format --obfuscate` cannot process queries with embedded dictionaries (functions `regionTo...`). [#29667](https://github.com/ClickHouse/ClickHouse/pull/29667) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect Nullable processing of JSON functions. This fixes [#29615](https://github.com/ClickHouse/ClickHouse/issues/29615) . Mark as improvement because https://github.com/ClickHouse/ClickHouse/pull/28012 is not released. [#29659](https://github.com/ClickHouse/ClickHouse/pull/29659) ([Amos Bird](https://github.com/amosbird)). +* Increase `listen_backlog` by default (to match default in newer linux kernel). [#29643](https://github.com/ClickHouse/ClickHouse/pull/29643) ([Azat Khuzhin](https://github.com/azat)). +* Reload dictionaries, models, user defined executable functions if servers config `dictionaries_config`, `models_config`, `user_defined_executable_functions_config` changes. Closes [#28142](https://github.com/ClickHouse/ClickHouse/issues/28142). [#29529](https://github.com/ClickHouse/ClickHouse/pull/29529) ([Maksim Kita](https://github.com/kitaisreal)). +* Get rid of pointless restriction on projection name. Now projection name can start with `tmp_`. [#29520](https://github.com/ClickHouse/ClickHouse/pull/29520) ([Amos Bird](https://github.com/amosbird)). +* Fixed `There is no query or query context has expired` error in mutations with nested subqueries. Do not allow subqueries in mutation if table is replicated and `allow_nondeterministic_mutations` setting is disabled. [#29495](https://github.com/ClickHouse/ClickHouse/pull/29495) ([tavplubix](https://github.com/tavplubix)). +* Apply config changes to `max_concurrent_queries` during runtime (no need to restart). [#29414](https://github.com/ClickHouse/ClickHouse/pull/29414) ([Raúl Marín](https://github.com/Algunenano)). +* Added setting `use_skip_indexes`. [#29405](https://github.com/ClickHouse/ClickHouse/pull/29405) ([Maksim Kita](https://github.com/kitaisreal)). +* Add support for `FREEZE`ing in-memory parts (for backups). [#29376](https://github.com/ClickHouse/ClickHouse/pull/29376) ([Mo Xuan](https://github.com/mo-avatar)). +* Pass through initial query_id for `clickhouse-benchmark` (previously if you run remote query via `clickhouse-benchmark`, queries on shards will not be linked to the initial query via `initial_query_id`). [#29364](https://github.com/ClickHouse/ClickHouse/pull/29364) ([Azat Khuzhin](https://github.com/azat)). +* Skip indexes `tokenbf_v1` and `ngrambf_v1`: added support for `Array` data type with key of `String` of `FixedString` type. [#29280](https://github.com/ClickHouse/ClickHouse/pull/29280) ([Maksim Kita](https://github.com/kitaisreal)). Skip indexes `tokenbf_v1` and `ngrambf_v1` added support for `Map` data type with key of `String` of `FixedString` type. Author @lingtaolf. [#29220](https://github.com/ClickHouse/ClickHouse/pull/29220) ([Maksim Kita](https://github.com/kitaisreal)). +* Function `has`: added support for `Map` data type. [#29267](https://github.com/ClickHouse/ClickHouse/pull/29267) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `compress_logs` settings for clickhouse-keeper which allow to compress clickhouse-keeper logs (for replicated state machine) in `ZSTD` . Implements: [#26977](https://github.com/ClickHouse/ClickHouse/issues/26977). [#29223](https://github.com/ClickHouse/ClickHouse/pull/29223) ([alesapin](https://github.com/alesapin)). +* Add a setting `external_table_strict_query` - it will force passing the whole WHERE expression in queries to foreign databases even if it is incompatible. [#29206](https://github.com/ClickHouse/ClickHouse/pull/29206) ([Azat Khuzhin](https://github.com/azat)). +* Disable projections when `ARRAY JOIN` is used. In previous versions projection analysis may break aliases in array join. [#29139](https://github.com/ClickHouse/ClickHouse/pull/29139) ([Amos Bird](https://github.com/amosbird)). +* Support more types in `MsgPack` input/output format. [#29077](https://github.com/ClickHouse/ClickHouse/pull/29077) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to input and output `LowCardinality` columns in `ORC` input/output format. [#29062](https://github.com/ClickHouse/ClickHouse/pull/29062) ([Kruglov Pavel](https://github.com/Avogar)). +* Select from `system.distributed_ddl_queue` might show incorrect values, it's fixed. [#29061](https://github.com/ClickHouse/ClickHouse/pull/29061) ([tavplubix](https://github.com/tavplubix)). +* Correct behaviour with unknown methods for HTTP connection. Solves [#29050](https://github.com/ClickHouse/ClickHouse/issues/29050). [#29057](https://github.com/ClickHouse/ClickHouse/pull/29057) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* `clickhouse-keeper`: Fix bug in `clickhouse-keeper-converter` which can lead to some data loss while restoring from ZooKeeper logs (not snapshot). [#29030](https://github.com/ClickHouse/ClickHouse/pull/29030) ([小路](https://github.com/nicelulu)). Fix bug in `clickhouse-keeper-converter` which can lead to incorrect ZooKeeper log deserialization. [#29071](https://github.com/ClickHouse/ClickHouse/pull/29071) ([小路](https://github.com/nicelulu)). +* Apply settings from `CREATE ... AS SELECT` queries (fixes: [#28810](https://github.com/ClickHouse/ClickHouse/issues/28810)). [#28962](https://github.com/ClickHouse/ClickHouse/pull/28962) ([Azat Khuzhin](https://github.com/azat)). +* Respect default database setting for ALTER TABLE ... ON CLUSTER ... REPLACE/MOVE PARTITION FROM/TO ... [#28955](https://github.com/ClickHouse/ClickHouse/pull/28955) ([anneji-dev](https://github.com/anneji-dev)). +* gRPC protocol: Allow change server-side compression from client. [#28953](https://github.com/ClickHouse/ClickHouse/pull/28953) ([Vitaly Baranov](https://github.com/vitlibar)). +* Skip "no data" exception when reading thermal sensors for asynchronous metrics. This closes [#28852](https://github.com/ClickHouse/ClickHouse/issues/28852). [#28882](https://github.com/ClickHouse/ClickHouse/pull/28882) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed logical race condition that might cause `Dictionary not found` error for existing dictionary in rare cases. [#28853](https://github.com/ClickHouse/ClickHouse/pull/28853) ([tavplubix](https://github.com/tavplubix)). +* Relax nested function for If-combinator check (but forbid nested identical combinators). [#28828](https://github.com/ClickHouse/ClickHouse/pull/28828) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible uncaught exception during server termination. [#28761](https://github.com/ClickHouse/ClickHouse/pull/28761) ([Azat Khuzhin](https://github.com/azat)). +* Forbid cleaning of tmp directories that can be used by an active mutation/merge if mutation/merge is extraordinarily long. [#28760](https://github.com/ClickHouse/ClickHouse/pull/28760) ([Azat Khuzhin](https://github.com/azat)). +* Allow optimization `optimize_arithmetic_operations_in_aggregate_functions = 1` when alias is used. [#28746](https://github.com/ClickHouse/ClickHouse/pull/28746) ([Amos Bird](https://github.com/amosbird)). +* Implement `detach_not_byte_identical_parts` setting for `ReplicatedMergeTree`, that will detach instead of remove not byte-identical parts (after mege/mutate). [#28708](https://github.com/ClickHouse/ClickHouse/pull/28708) ([Azat Khuzhin](https://github.com/azat)). +* Implement `max_suspicious_broken_parts_bytes` setting for `MergeTree` (to limit total size of all broken parts, default is `1GiB`). [#28707](https://github.com/ClickHouse/ClickHouse/pull/28707) ([Azat Khuzhin](https://github.com/azat)). +* Enable expanding macros in `RabbitMQ` table settings. [#28683](https://github.com/ClickHouse/ClickHouse/pull/28683) ([Vitaly Baranov](https://github.com/vitlibar)). +* Restore the possibility to read data of a table using the `Log` engine in multiple threads. [#28125](https://github.com/ClickHouse/ClickHouse/pull/28125) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix misbehavior of NULL column handling in JSON functions. This fixes [#27930](https://github.com/ClickHouse/ClickHouse/issues/27930). [#28012](https://github.com/ClickHouse/ClickHouse/pull/28012) ([Amos Bird](https://github.com/amosbird)). +* Allow to set the size of Mark/Uncompressed cache for skip indices separately from columns. [#27961](https://github.com/ClickHouse/ClickHouse/pull/27961) ([Amos Bird](https://github.com/amosbird)). +* Allow to mix JOIN with `USING` with other JOIN types. [#23881](https://github.com/ClickHouse/ClickHouse/pull/23881) ([darkkeks](https://github.com/darkkeks)). +* Update aws-sdk submodule for throttling in Yandex Cloud S3. [#30646](https://github.com/ClickHouse/ClickHouse/pull/30646) ([ianton-ru](https://github.com/ianton-ru)). +* Fix releasing query ID and session ID at the end of query processing while handing gRPC call. [#29954](https://github.com/ClickHouse/ClickHouse/pull/29954) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix shutdown of `AccessControlManager` to fix flaky test. [#29951](https://github.com/ClickHouse/ClickHouse/pull/29951) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix failed assertion in reading from `HDFS`. Update libhdfs3 library to be able to run in tests in debug. Closes [#29251](https://github.com/ClickHouse/ClickHouse/issues/29251). Closes [#27814](https://github.com/ClickHouse/ClickHouse/issues/27814). [#29276](https://github.com/ClickHouse/ClickHouse/pull/29276) ([Kseniia Sumarokova](https://github.com/kssenii)). + + +#### Build/Testing/Packaging Improvement + +* Add support for FreeBSD builds for Aarch64 machines. [#29952](https://github.com/ClickHouse/ClickHouse/pull/29952) ([MikaelUrankar](https://github.com/MikaelUrankar)). +* Recursive submodules are no longer needed for ClickHouse. [#30315](https://github.com/ClickHouse/ClickHouse/pull/30315) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse can be statically built with Musl. This is added as experiment, it does not support building `odbc-bridge`, `library-bridge`, integration with CatBoost and some libraries. [#30248](https://github.com/ClickHouse/ClickHouse/pull/30248) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable `Protobuf`, `Arrow`, `ORC`, `Parquet` for `AArch64` and `Darwin` (macOS) builds. This closes [#29248](https://github.com/ClickHouse/ClickHouse/issues/29248). This closes [#28018](https://github.com/ClickHouse/ClickHouse/issues/28018). [#30015](https://github.com/ClickHouse/ClickHouse/pull/30015) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add cross-build for PowerPC (powerpc64le). This closes [#9589](https://github.com/ClickHouse/ClickHouse/issues/9589). Enable support for interaction with MySQL for AArch64 and PowerPC. This closes [#26301](https://github.com/ClickHouse/ClickHouse/issues/26301). [#30010](https://github.com/ClickHouse/ClickHouse/pull/30010) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Leave only required files in cross-compile toolchains. Include them as submodules (earlier they were downloaded as tarballs). [#29974](https://github.com/ClickHouse/ClickHouse/pull/29974) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implemented structure-aware fuzzing approach in ClickHouse for select statement parser. [#30012](https://github.com/ClickHouse/ClickHouse/pull/30012) ([Paul](https://github.com/PaulCher)). +* Turning on experimental constexpr expressions evaluator for clang to speed up template code compilation. [#29668](https://github.com/ClickHouse/ClickHouse/pull/29668) ([myrrc](https://github.com/myrrc)). +* Add ability to compile using newer version fo glibc without using new symbols. [#29594](https://github.com/ClickHouse/ClickHouse/pull/29594) ([Azat Khuzhin](https://github.com/azat)). +* Reduce Debug build binary size by clang optimization option. [#28736](https://github.com/ClickHouse/ClickHouse/pull/28736) ([flynn](https://github.com/ucasfl)). +* Now all images for CI will be placed in the separate dockerhub repo. [#28656](https://github.com/ClickHouse/ClickHouse/pull/28656) ([alesapin](https://github.com/alesapin)). +* Improve support for build with clang-13. [#28046](https://github.com/ClickHouse/ClickHouse/pull/28046) ([Sergei Semin](https://github.com/syominsergey)). +* Add ability to print raw profile events to `clickhouse-client` (This can be useful for debugging and for testing). [#30064](https://github.com/ClickHouse/ClickHouse/pull/30064) ([Azat Khuzhin](https://github.com/azat)). +* Add time dependency for clickhouse-server unit (systemd and sysvinit init). [#28891](https://github.com/ClickHouse/ClickHouse/pull/28891) ([Azat Khuzhin](https://github.com/azat)). +* Reload stacktrace cache when symbol is reloaded. [#28137](https://github.com/ClickHouse/ClickHouse/pull/28137) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix + +* Functions for case-insensitive search in UTF-8 strings like `positionCaseInsensitiveUTF8` and `countSubstringsCaseInsensitiveUTF8` might find substrings that actually does not match in very rare cases, it's fixed. [#30663](https://github.com/ClickHouse/ClickHouse/pull/30663) ([tavplubix](https://github.com/tavplubix)). +* Fix reading from empty file on encrypted disk. [#30494](https://github.com/ClickHouse/ClickHouse/pull/30494) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix transformation of disjunctions chain to `IN` (controlled by settings `optimize_min_equality_disjunction_chain_length`) in distributed queries with settings `legacy_column_name_of_tuple_literal = 0`. [#28658](https://github.com/ClickHouse/ClickHouse/pull/28658) ([Anton Popov](https://github.com/CurtizJ)). +* Allow using a materialized column as the sharding key in a distributed table even if `insert_allow_materialized_columns=0`:. [#28637](https://github.com/ClickHouse/ClickHouse/pull/28637) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `ORDER BY ... WITH FILL` with set `TO` and `FROM` and no rows in result set. [#30888](https://github.com/ClickHouse/ClickHouse/pull/30888) ([Anton Popov](https://github.com/CurtizJ)). +* Fix set index not used in AND/OR expressions when there are more than two operands. This fixes [#30416](https://github.com/ClickHouse/ClickHouse/issues/30416) . [#30887](https://github.com/ClickHouse/ClickHouse/pull/30887) ([Amos Bird](https://github.com/amosbird)). +* Fix crash when projection with hashing function is materialized. This fixes [#30861](https://github.com/ClickHouse/ClickHouse/issues/30861) . The issue is similar to https://github.com/ClickHouse/ClickHouse/pull/28560 which is a lack of proper understanding of the invariant of header's emptyness. [#30877](https://github.com/ClickHouse/ClickHouse/pull/30877) ([Amos Bird](https://github.com/amosbird)). +* Fixed ambiguity when extracting auxiliary ZooKeeper name from ZooKeeper path in `ReplicatedMergeTree`. Previously server might fail to start with `Unknown auxiliary ZooKeeper name` if ZooKeeper path contains a colon. Fixes [#29052](https://github.com/ClickHouse/ClickHouse/issues/29052). Also it was allowed to specify ZooKeeper path that does not start with slash, but now it's deprecated and creation of new tables with such path is not allowed. Slashes and colons in auxiliary ZooKeeper names are not allowed too. [#30822](https://github.com/ClickHouse/ClickHouse/pull/30822) ([tavplubix](https://github.com/tavplubix)). +* Clean temporary directory when localBackup failed by some reason. [#30797](https://github.com/ClickHouse/ClickHouse/pull/30797) ([ianton-ru](https://github.com/ianton-ru)). +* Fixed a race condition between `REPLACE/MOVE PARTITION` and background merge in non-replicated `MergeTree` that might cause a part of moved/replaced data to remain in partition. Fixes [#29327](https://github.com/ClickHouse/ClickHouse/issues/29327). [#30717](https://github.com/ClickHouse/ClickHouse/pull/30717) ([tavplubix](https://github.com/tavplubix)). +* Fix PREWHERE with WHERE in case of always true PREWHERE. [#30668](https://github.com/ClickHouse/ClickHouse/pull/30668) ([Azat Khuzhin](https://github.com/azat)). +* Limit push down optimization could cause a error `Cannot find column`. Fixes [#30438](https://github.com/ClickHouse/ClickHouse/issues/30438). [#30562](https://github.com/ClickHouse/ClickHouse/pull/30562) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add missing parenthesis for `isNotNull`/`isNull` rewrites to `IS [NOT] NULL` (fixes queries that has something like `isNotNull(1)+isNotNull(2)`). [#30520](https://github.com/ClickHouse/ClickHouse/pull/30520) ([Azat Khuzhin](https://github.com/azat)). +* Fix deadlock on ALTER with scalar subquery to the same table, close [#30461](https://github.com/ClickHouse/ClickHouse/issues/30461). [#30492](https://github.com/ClickHouse/ClickHouse/pull/30492) ([Vladimir C](https://github.com/vdimir)). +* Fixed segfault which might happen if session expired during execution of REPLACE PARTITION. [#30432](https://github.com/ClickHouse/ClickHouse/pull/30432) ([tavplubix](https://github.com/tavplubix)). +* Queries with condition like `IN (subquery)` could return incorrect result in case if aggregate projection applied. Fixed creation of sets for projections. [#30310](https://github.com/ClickHouse/ClickHouse/pull/30310) ([Amos Bird](https://github.com/amosbird)). +* Fix column alias resolution of JOIN queries when projection is enabled. This fixes [#30146](https://github.com/ClickHouse/ClickHouse/issues/30146). [#30293](https://github.com/ClickHouse/ClickHouse/pull/30293) ([Amos Bird](https://github.com/amosbird)). +* Fix some deficiency in `replaceRegexpAll` function. [#30292](https://github.com/ClickHouse/ClickHouse/pull/30292) ([Memo](https://github.com/Joeywzr)). +* Fix ComplexKeyHashedDictionary, ComplexKeySparseHashedDictionary parsing `preallocate` option from layout config. [#30246](https://github.com/ClickHouse/ClickHouse/pull/30246) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix `[I]LIKE` function. Closes [#28661](https://github.com/ClickHouse/ClickHouse/issues/28661). [#30244](https://github.com/ClickHouse/ClickHouse/pull/30244) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix crash with shortcircuit and lowcardinality in multiIf. [#30243](https://github.com/ClickHouse/ClickHouse/pull/30243) ([Raúl Marín](https://github.com/Algunenano)). +* FlatDictionary, HashedDictionary fix bytes_allocated calculation for nullable attributes. [#30238](https://github.com/ClickHouse/ClickHouse/pull/30238) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow identifiers starting with numbers in multiple joins. [#30230](https://github.com/ClickHouse/ClickHouse/pull/30230) ([Vladimir C](https://github.com/vdimir)). +* Fix reading from `MergeTree` with `max_read_buffer_size = 0` (when the user wants to shoot himself in the foot) (can lead to exceptions `Can't adjust last granule`, `LOGICAL_ERROR`, or even data loss). [#30192](https://github.com/ClickHouse/ClickHouse/pull/30192) ([Azat Khuzhin](https://github.com/azat)). +* Fix `pread_fake_async`/`pread_threadpool` with `min_bytes_to_use_direct_io`. [#30191](https://github.com/ClickHouse/ClickHouse/pull/30191) ([Azat Khuzhin](https://github.com/azat)). +* Fix INSERT SELECT incorrectly fills MATERIALIZED column based of Nullable column. [#30189](https://github.com/ClickHouse/ClickHouse/pull/30189) ([Azat Khuzhin](https://github.com/azat)). +* Support nullable arguments in function `initializeAggregation`. [#30177](https://github.com/ClickHouse/ClickHouse/pull/30177) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Port is already connected` for queries with `GLOBAL IN` and `WITH TOTALS`. Only for 21.9 and 21.10. [#30086](https://github.com/ClickHouse/ClickHouse/pull/30086) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix race between MOVE PARTITION and merges/mutations for MergeTree. [#30074](https://github.com/ClickHouse/ClickHouse/pull/30074) ([Azat Khuzhin](https://github.com/azat)). +* Dropped `Memory` database might reappear after server restart, it's fixed ([#29795](https://github.com/ClickHouse/ClickHouse/issues/29795)). Also added `force_remove_data_recursively_on_drop` setting as a workaround for `Directory not empty` error when dropping `Ordinary` database (because it's not possible to remove data leftovers manually in cloud environment). [#30054](https://github.com/ClickHouse/ClickHouse/pull/30054) ([tavplubix](https://github.com/tavplubix)). +* Fix crash of sample by `tuple()`, closes [#30004](https://github.com/ClickHouse/ClickHouse/issues/30004). [#30016](https://github.com/ClickHouse/ClickHouse/pull/30016) ([flynn](https://github.com/ucasfl)). +* try to close issue: [#29965](https://github.com/ClickHouse/ClickHouse/issues/29965). [#29976](https://github.com/ClickHouse/ClickHouse/pull/29976) ([hexiaoting](https://github.com/hexiaoting)). +* Fix possible data-race between `FileChecker` and `StorageLog`/`StorageStripeLog`. [#29959](https://github.com/ClickHouse/ClickHouse/pull/29959) ([Azat Khuzhin](https://github.com/azat)). +* Fix data-race between `LogSink::writeMarks()` and `LogSource` in `StorageLog`. [#29946](https://github.com/ClickHouse/ClickHouse/pull/29946) ([Azat Khuzhin](https://github.com/azat)). +* Fix potential resource leak of the concurrent query limit of merge tree tables introduced in https://github.com/ClickHouse/ClickHouse/pull/19544. [#29879](https://github.com/ClickHouse/ClickHouse/pull/29879) ([Amos Bird](https://github.com/amosbird)). +* Fix system tables recreation check (fails to detect changes in enum values). [#29857](https://github.com/ClickHouse/ClickHouse/pull/29857) ([Azat Khuzhin](https://github.com/azat)). +* MaterializedMySQL: Fix an issue where if the connection to MySQL was lost, only parts of a transaction could be processed. [#29837](https://github.com/ClickHouse/ClickHouse/pull/29837) ([Håvard Kvålen](https://github.com/havardk)). +* Avoid `Timeout exceeded: elapsed 18446744073.709553 seconds` error that might happen in extremely rare cases, presumably due to some bug in kernel. Fixes [#29154](https://github.com/ClickHouse/ClickHouse/issues/29154). [#29811](https://github.com/ClickHouse/ClickHouse/pull/29811) ([tavplubix](https://github.com/tavplubix)). +* Fix bad cast in `ATTACH TABLE ... FROM 'path'` query when non-string literal is used instead of path. It may lead to reading of uninitialized memory. [#29790](https://github.com/ClickHouse/ClickHouse/pull/29790) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix concurrent access to `LowCardinality` during `GROUP BY` (in combination with `Buffer` tables it may lead to troubles). [#29782](https://github.com/ClickHouse/ClickHouse/pull/29782) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect `GROUP BY` (multiple rows with the same keys in result) in case of distributed query when shards had mixed versions `<= 21.3` and `>= 21.4`, `GROUP BY` key had several columns all with fixed size, and two-level aggregation was activated (see `group_by_two_level_threshold` and `group_by_two_level_threshold_bytes`). Fixes [#29580](https://github.com/ClickHouse/ClickHouse/issues/29580). [#29735](https://github.com/ClickHouse/ClickHouse/pull/29735) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed incorrect behaviour of setting `materialized_postgresql_tables_list` at server restart. Found in [#28529](https://github.com/ClickHouse/ClickHouse/issues/28529). [#29686](https://github.com/ClickHouse/ClickHouse/pull/29686) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Condition in filter predicate could be lost after push-down optimisation. [#29625](https://github.com/ClickHouse/ClickHouse/pull/29625) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix JIT expression compilation with aliases and short-circuit expression evaluation. Closes [#29403](https://github.com/ClickHouse/ClickHouse/issues/29403). [#29574](https://github.com/ClickHouse/ClickHouse/pull/29574) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix rare segfault in `ALTER MODIFY` query when using incorrect table identifier in `DEFAULT` expression like `x.y.z...` Fixes [#29184](https://github.com/ClickHouse/ClickHouse/issues/29184). [#29573](https://github.com/ClickHouse/ClickHouse/pull/29573) ([alesapin](https://github.com/alesapin)). +* Fix nullptr deference for `GROUP BY WITH TOTALS HAVING` (when the column from `HAVING` wasn't selected). [#29553](https://github.com/ClickHouse/ClickHouse/pull/29553) ([Azat Khuzhin](https://github.com/azat)). +* Avoid deadlocks when reading and writting on Join table engine tables at the same time. [#29544](https://github.com/ClickHouse/ClickHouse/pull/29544) ([Raúl Marín](https://github.com/Algunenano)). +* Fix bug in check `pathStartsWith` becuase there was bug with the usage of `std::mismatch`: ` The behavior is undefined if the second range is shorter than the first range.`. [#29531](https://github.com/ClickHouse/ClickHouse/pull/29531) ([Kseniia Sumarokova](https://github.com/kssenii)). +* In ODBC bridge add retries for error Invalid cursor state. It is a retriable error. Closes [#29473](https://github.com/ClickHouse/ClickHouse/issues/29473). [#29518](https://github.com/ClickHouse/ClickHouse/pull/29518) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed incorrect table name parsing on loading of `Lazy` database. Fixes [#29456](https://github.com/ClickHouse/ClickHouse/issues/29456). [#29476](https://github.com/ClickHouse/ClickHouse/pull/29476) ([tavplubix](https://github.com/tavplubix)). +* Fix possible `Block structure mismatch` for subqueries with pushed-down `HAVING` predicate. Fixes [#29010](https://github.com/ClickHouse/ClickHouse/issues/29010). [#29475](https://github.com/ClickHouse/ClickHouse/pull/29475) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix Logical error `Cannot capture columns` in functions greatest/least. Closes [#29334](https://github.com/ClickHouse/ClickHouse/issues/29334). [#29454](https://github.com/ClickHouse/ClickHouse/pull/29454) ([Kruglov Pavel](https://github.com/Avogar)). +* RocksDB table engine: fix race condition during multiple DB opening (and get back some tests that triggers the problem on CI). [#29393](https://github.com/ClickHouse/ClickHouse/pull/29393) ([Azat Khuzhin](https://github.com/azat)). +* Fix replicated access storage not shutting down cleanly when misconfigured. [#29388](https://github.com/ClickHouse/ClickHouse/pull/29388) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Remove window function `nth_value` as it is not memory-safe. This closes [#29347](https://github.com/ClickHouse/ClickHouse/issues/29347). [#29348](https://github.com/ClickHouse/ClickHouse/pull/29348) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix vertical merges of projection parts. This fixes [#29253](https://github.com/ClickHouse/ClickHouse/issues/29253) . This PR also fixes several projection merge/mutation issues introduced in https://github.com/ClickHouse/ClickHouse/pull/25165. [#29337](https://github.com/ClickHouse/ClickHouse/pull/29337) ([Amos Bird](https://github.com/amosbird)). +* Fix hanging DDL queries on Replicated database while adding a new replica. [#29328](https://github.com/ClickHouse/ClickHouse/pull/29328) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Fix connection timeouts (`send_timeout`/`receive_timeout`). [#29282](https://github.com/ClickHouse/ClickHouse/pull/29282) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible `Table columns structure in ZooKeeper is different from local table structure` exception while recreating or creating new replicas of `ReplicatedMergeTree`, when one of table columns have default expressions with case-insensitive functions. [#29266](https://github.com/ClickHouse/ClickHouse/pull/29266) ([Anton Popov](https://github.com/CurtizJ)). +* Send normal `Database doesn't exist error` (`UNKNOWN_DATABASE`) to the client (via TCP) instead of `Attempt to read after eof` (`ATTEMPT_TO_READ_AFTER_EOF`). [#29229](https://github.com/ClickHouse/ClickHouse/pull/29229) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault while inserting into column with type LowCardinality(Nullable) in Avro input format. [#29132](https://github.com/ClickHouse/ClickHouse/pull/29132) ([Kruglov Pavel](https://github.com/Avogar)). +* Do not allow to reuse previous credentials in case of inter-server secret (Before INSERT via Buffer/Kafka to Distributed table with interserver secret configured for that cluster, may re-use previously set user for that connection). [#29060](https://github.com/ClickHouse/ClickHouse/pull/29060) ([Azat Khuzhin](https://github.com/azat)). +* Handle `any_join_distinct_right_table_keys` when join with dictionary, close [#29007](https://github.com/ClickHouse/ClickHouse/issues/29007). [#29014](https://github.com/ClickHouse/ClickHouse/pull/29014) ([Vladimir C](https://github.com/vdimir)). +* Fix "Not found column ... in block" error, when join on alias column, close [#26980](https://github.com/ClickHouse/ClickHouse/issues/26980). [#29008](https://github.com/ClickHouse/ClickHouse/pull/29008) ([Vladimir C](https://github.com/vdimir)). +* Fix the number of threads used in `GLOBAL IN` subquery (it was executed in single threads since [#19414](https://github.com/ClickHouse/ClickHouse/issues/19414) bugfix). [#28997](https://github.com/ClickHouse/ClickHouse/pull/28997) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bad optimizations of ORDER BY if it contains WITH FILL. This closes [#28908](https://github.com/ClickHouse/ClickHouse/issues/28908). This closes [#26049](https://github.com/ClickHouse/ClickHouse/issues/26049). [#28910](https://github.com/ClickHouse/ClickHouse/pull/28910) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix higher-order array functions (`SIGSEGV` for `arrayCompact`/`ILLEGAL_COLUMN` for `arrayDifference`/`arrayCumSumNonNegative`) with consts. [#28904](https://github.com/ClickHouse/ClickHouse/pull/28904) ([Azat Khuzhin](https://github.com/azat)). +* Fix waiting for mutation with `mutations_sync=2`. [#28889](https://github.com/ClickHouse/ClickHouse/pull/28889) ([Azat Khuzhin](https://github.com/azat)). +* Fix queries to external databases (i.e. MySQL) with multiple columns in IN ( i.e. `(k,v) IN ((1, 2))` ). [#28888](https://github.com/ClickHouse/ClickHouse/pull/28888) ([Azat Khuzhin](https://github.com/azat)). +* Fix bug with `LowCardinality` in short-curcuit function evaluation. Closes [#28884](https://github.com/ClickHouse/ClickHouse/issues/28884). [#28887](https://github.com/ClickHouse/ClickHouse/pull/28887) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading of subcolumns from compact parts. [#28873](https://github.com/ClickHouse/ClickHouse/pull/28873) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed a race condition between `DROP PART` and `REPLACE/MOVE PARTITION` that might cause replicas to diverge in rare cases. [#28864](https://github.com/ClickHouse/ClickHouse/pull/28864) ([tavplubix](https://github.com/tavplubix)). +* Fix expressions compilation with short circuit evaluation. [#28821](https://github.com/ClickHouse/ClickHouse/pull/28821) ([Azat Khuzhin](https://github.com/azat)). +* Fix extremely rare case when ReplicatedMergeTree replicas can diverge after hard reboot of all replicas. The error looks like `Part ... intersects (previous|next) part ...`. [#28817](https://github.com/ClickHouse/ClickHouse/pull/28817) ([alesapin](https://github.com/alesapin)). +* Better check for connection usability and also catch any exception in `RabbitMQ` shutdown just in case. [#28797](https://github.com/ClickHouse/ClickHouse/pull/28797) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix benign race condition in ReplicatedMergeTreeQueue. Shouldn't be visible for user, but can lead to subtle bugs. [#28734](https://github.com/ClickHouse/ClickHouse/pull/28734) ([alesapin](https://github.com/alesapin)). +* Fix possible crash for `SELECT` with partially created aggregate projection in case of exception. [#28700](https://github.com/ClickHouse/ClickHouse/pull/28700) ([Amos Bird](https://github.com/amosbird)). +* Fix the coredump in the creation of distributed tables, when the parameters passed in are wrong. [#28686](https://github.com/ClickHouse/ClickHouse/pull/28686) ([Zhiyong Wang](https://github.com/ljcui)). +* Add Settings.Names, Settings.Values aliases for system.processes table. [#28685](https://github.com/ClickHouse/ClickHouse/pull/28685) ([Vitaly](https://github.com/orloffv)). +* Support for S2 Geometry library: Fix the number of arguments required by `s2RectAdd` and `s2RectContains` functions. [#28663](https://github.com/ClickHouse/ClickHouse/pull/28663) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix invalid constant type conversion when Nullable or LowCardinality primary key is used. [#28636](https://github.com/ClickHouse/ClickHouse/pull/28636) ([Amos Bird](https://github.com/amosbird)). +* Fix "Column is not under aggregate function and not in GROUP BY" with PREWHERE (Fixes: [#28461](https://github.com/ClickHouse/ClickHouse/issues/28461)). [#28502](https://github.com/ClickHouse/ClickHouse/pull/28502) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v21.10, 2021-10-16 + +#### Backward Incompatible Change + +* Now the following MergeTree table-level settings: `replicated_max_parallel_sends`, `replicated_max_parallel_sends_for_table`, `replicated_max_parallel_fetches`, `replicated_max_parallel_fetches_for_table` do nothing. They never worked well and were replaced with `max_replicated_fetches_network_bandwidth`, `max_replicated_sends_network_bandwidth` and `background_fetches_pool_size`. [#28404](https://github.com/ClickHouse/ClickHouse/pull/28404) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* Add feature for creating user-defined functions (UDF) as lambda expressions. Syntax `CREATE FUNCTION {function_name} as ({parameters}) -> {function core}`. Example `CREATE FUNCTION plus_one as (a) -> a + 1`. Authors @Realist007. [#27796](https://github.com/ClickHouse/ClickHouse/pull/27796) ([Maksim Kita](https://github.com/kitaisreal)) [#23978](https://github.com/ClickHouse/ClickHouse/pull/23978) ([Realist007](https://github.com/Realist007)). +* Added `Executable` storage engine and `executable` table function. It enables data processing with external scripts in streaming fashion. [#28102](https://github.com/ClickHouse/ClickHouse/pull/28102) ([Maksim Kita](https://github.com/kitaisreal)) ([ruct](https://github.com/ruct)). +* Added `ExecutablePool` storage engine. Similar to `Executable` but it's using a pool of long running processes. [#28518](https://github.com/ClickHouse/ClickHouse/pull/28518) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `ALTER TABLE ... MATERIALIZE COLUMN` query. [#27038](https://github.com/ClickHouse/ClickHouse/pull/27038) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Support for partitioned write into `s3` table function. [#23051](https://github.com/ClickHouse/ClickHouse/pull/23051) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Support `lz4` compression format (in addition to `gz`, `bz2`, `xz`, `zstd`) for data import / export. [#25310](https://github.com/ClickHouse/ClickHouse/pull/25310) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow positional arguments under setting `enable_positional_arguments`. Closes [#2592](https://github.com/ClickHouse/ClickHouse/issues/2592). [#27530](https://github.com/ClickHouse/ClickHouse/pull/27530) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Accept user settings related to file formats in `SETTINGS` clause in `CREATE` query for s3 tables. This closes [#27580](https://github.com/ClickHouse/ClickHouse/issues/27580). [#28037](https://github.com/ClickHouse/ClickHouse/pull/28037) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow SSL connection for `RabbitMQ` engine. [#28365](https://github.com/ClickHouse/ClickHouse/pull/28365) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `getServerPort` function to allow getting server port. When the port is not used by the server, throw an exception. [#27900](https://github.com/ClickHouse/ClickHouse/pull/27900) ([Amos Bird](https://github.com/amosbird)). +* Add conversion functions between "snowflake id" and `DateTime`, `DateTime64`. See [#27058](https://github.com/ClickHouse/ClickHouse/issues/27058). [#27704](https://github.com/ClickHouse/ClickHouse/pull/27704) ([jasine](https://github.com/jasine)). +* Add function `SHA512`. [#27830](https://github.com/ClickHouse/ClickHouse/pull/27830) ([zhanglistar](https://github.com/zhanglistar)). +* Add `log_queries_probability` setting that allows user to write to query_log only a sample of queries. Closes [#16609](https://github.com/ClickHouse/ClickHouse/issues/16609). [#27527](https://github.com/ClickHouse/ClickHouse/pull/27527) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Experimental Feature + +* `web` type of disks to store readonly tables on web server in form of static files. See [#23982](https://github.com/ClickHouse/ClickHouse/issues/23982). [#25251](https://github.com/ClickHouse/ClickHouse/pull/25251) ([Kseniia Sumarokova](https://github.com/kssenii)). This is mostly needed to faciliate testing of operation on shared storage and for easy importing of datasets. Not recommended to use before release 21.11. +* Added new commands `BACKUP` and `RESTORE`. [#21945](https://github.com/ClickHouse/ClickHouse/pull/21945) ([Vitaly Baranov](https://github.com/vitlibar)). This is under development and not intended to be used in current version. + +#### Performance Improvement + +* Speed up `sumIf` and `countIf` aggregation functions. [#28272](https://github.com/ClickHouse/ClickHouse/pull/28272) ([Raúl Marín](https://github.com/Algunenano)). +* Create virtual projection for `minmax` indices. Now, when `allow_experimental_projection_optimization` is enabled, queries will use minmax index instead of reading the data when possible. [#26286](https://github.com/ClickHouse/ClickHouse/pull/26286) ([Amos Bird](https://github.com/amosbird)). +* Introducing two checks in `sequenceMatch` and `sequenceCount` that allow for early exit when some deterministic part of the sequence pattern is missing from the events list. This change unlocks many queries that would previously fail due to reaching operations cap, and generally speeds up the pipeline. [#27729](https://github.com/ClickHouse/ClickHouse/pull/27729) ([Jakub Kuklis](https://github.com/jkuklis)). +* Enhance primary key analysis with always monotonic information of binary functions, notably non-zero constant division. [#28302](https://github.com/ClickHouse/ClickHouse/pull/28302) ([Amos Bird](https://github.com/amosbird)). +* Make `hasAll` filter condition leverage bloom filter data-skipping indexes. [#27984](https://github.com/ClickHouse/ClickHouse/pull/27984) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Speed up data parts loading by delaying table startup process. [#28313](https://github.com/ClickHouse/ClickHouse/pull/28313) ([Amos Bird](https://github.com/amosbird)). +* Fixed possible excessive number of conditions moved from `WHERE` to `PREWHERE` (optimization controlled by settings `optimize_move_to_prewhere`). [#28139](https://github.com/ClickHouse/ClickHouse/pull/28139) ([lthaooo](https://github.com/lthaooo)). +* Enable `optimize_distributed_group_by_sharding_key` by default. [#28105](https://github.com/ClickHouse/ClickHouse/pull/28105) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Check cluster name before creating `Distributed` table, do not allow to create a table with incorrect cluster name. Fixes [#27832](https://github.com/ClickHouse/ClickHouse/issues/27832). [#27927](https://github.com/ClickHouse/ClickHouse/pull/27927) ([tavplubix](https://github.com/tavplubix)). +* Add aggregate function `quantileBFloat16Weighted` similarly to other quantile...Weighted functions. This closes [#27745](https://github.com/ClickHouse/ClickHouse/issues/27745). [#27758](https://github.com/ClickHouse/ClickHouse/pull/27758) ([Ivan Novitskiy](https://github.com/RedClusive)). +* Allow to create dictionaries with empty attributes list. [#27905](https://github.com/ClickHouse/ClickHouse/pull/27905) ([Maksim Kita](https://github.com/kitaisreal)). +* Add interactive documentation in `clickhouse-client` about how to reset the password. This is useful in scenario when user has installed ClickHouse, set up the password and instantly forget it. See [#27750](https://github.com/ClickHouse/ClickHouse/issues/27750). [#27903](https://github.com/ClickHouse/ClickHouse/pull/27903) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support the case when the data is enclosed in array in `JSONAsString` input format. Closes [#25517](https://github.com/ClickHouse/ClickHouse/issues/25517). [#25633](https://github.com/ClickHouse/ClickHouse/pull/25633) ([Kruglov Pavel](https://github.com/Avogar)). +* Add new column `last_queue_update_exception` to `system.replicas` table. [#26843](https://github.com/ClickHouse/ClickHouse/pull/26843) ([nvartolomei](https://github.com/nvartolomei)). +* Support reconnections on failover for `MaterializedPostgreSQL` tables. Closes [#28529](https://github.com/ClickHouse/ClickHouse/issues/28529). [#28614](https://github.com/ClickHouse/ClickHouse/pull/28614) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Generate a unique server UUID on first server start. [#20089](https://github.com/ClickHouse/ClickHouse/pull/20089) ([Bharat Nallan](https://github.com/bharatnc)). +* Introduce `connection_wait_timeout` (default to 5 seconds, 0 - do not wait) setting for `MySQL` engine. [#28474](https://github.com/ClickHouse/ClickHouse/pull/28474) ([Azat Khuzhin](https://github.com/azat)). +* Do not allow creating `MaterializedPostgreSQL` with bad arguments. Closes [#28423](https://github.com/ClickHouse/ClickHouse/issues/28423). [#28430](https://github.com/ClickHouse/ClickHouse/pull/28430) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Use real tmp file instead of predefined "rows_sources" for vertical merges. This avoids generating garbage directories in tmp disks. [#28299](https://github.com/ClickHouse/ClickHouse/pull/28299) ([Amos Bird](https://github.com/amosbird)). +* Added `libhdfs3_conf` in server config instead of export env `LIBHDFS3_CONF` in clickhouse-server.service. This is for configuration of interaction with HDFS. [#28268](https://github.com/ClickHouse/ClickHouse/pull/28268) ([Zhichang Yu](https://github.com/yuzhichang)). +* Fix removing of parts in a Temporary state which can lead to an unexpected exception (`Part %name% doesn't exist`). Fixes [#23661](https://github.com/ClickHouse/ClickHouse/issues/23661). [#28221](https://github.com/ClickHouse/ClickHouse/pull/28221) [#28221](https://github.com/ClickHouse/ClickHouse/issues/28221)) ([Azat Khuzhin](https://github.com/azat)). +* Fix `zookeeper_log.address` (before the first patch in this PR the address was always `::`) and reduce number of calls `getpeername(2)` for this column (since each time entry for `zookeeper_log` is added `getpeername()` is called, cache this address in the zookeeper client to avoid this). [#28212](https://github.com/ClickHouse/ClickHouse/pull/28212) ([Azat Khuzhin](https://github.com/azat)). +* Support implicit conversions between index in operator `[]` and key of type `Map` (e.g. different `Int` types, `String` and `FixedString`). [#28096](https://github.com/ClickHouse/ClickHouse/pull/28096) ([Anton Popov](https://github.com/CurtizJ)). +* Support `ON CONFLICT` clause when inserting into PostgreSQL table engine or table function. Closes [#27727](https://github.com/ClickHouse/ClickHouse/issues/27727). [#28081](https://github.com/ClickHouse/ClickHouse/pull/28081) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Lower restrictions for `Enum` data type to allow attaching compatible data. Closes [#26672](https://github.com/ClickHouse/ClickHouse/issues/26672). [#28028](https://github.com/ClickHouse/ClickHouse/pull/28028) ([Dmitry Novik](https://github.com/novikd)). +* Add a setting `empty_result_for_aggregation_by_constant_keys_on_empty_set` to control the behavior of grouping by constant keys on empty set. This is to bring back the old baviour of [#6842](https://github.com/ClickHouse/ClickHouse/issues/6842). [#27932](https://github.com/ClickHouse/ClickHouse/pull/27932) ([Amos Bird](https://github.com/amosbird)). +* Added `replication_wait_for_inactive_replica_timeout` setting. It allows to specify how long to wait for inactive replicas to execute `ALTER`/`OPTIMZE`/`TRUNCATE` query (default is 120 seconds). If `replication_alter_partitions_sync` is 2 and some replicas are not active for more than `replication_wait_for_inactive_replica_timeout` seconds, then `UNFINISHED` will be thrown. [#27931](https://github.com/ClickHouse/ClickHouse/pull/27931) ([tavplubix](https://github.com/tavplubix)). +* Support lambda argument for `APPLY` column transformer which allows applying functions with more than one argument. This is for [#27877](https://github.com/ClickHouse/ClickHouse/issues/27877). [#27901](https://github.com/ClickHouse/ClickHouse/pull/27901) ([Amos Bird](https://github.com/amosbird)). +* Enable `tcp_keep_alive_timeout` by default. [#27882](https://github.com/ClickHouse/ClickHouse/pull/27882) ([Azat Khuzhin](https://github.com/azat)). +* Improve remote query cancelation (in case of remote server abnormaly terminated). [#27881](https://github.com/ClickHouse/ClickHouse/pull/27881) ([Azat Khuzhin](https://github.com/azat)). +* Use Multipart copy upload for large S3 objects. [#27858](https://github.com/ClickHouse/ClickHouse/pull/27858) ([ianton-ru](https://github.com/ianton-ru)). +* Allow symlink traversal for library dictionaty path. [#27815](https://github.com/ClickHouse/ClickHouse/pull/27815) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now `ALTER MODIFY COLUM` `T` to `Nullable(T)` doesn't require mutation. [#27787](https://github.com/ClickHouse/ClickHouse/pull/27787) ([victorgao](https://github.com/kafka1991)). +* Don't silently ignore errors and don't count delays in `ReadBufferFromS3`. [#27484](https://github.com/ClickHouse/ClickHouse/pull/27484) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Improve `ALTER ... MATERIALIZE TTL` by recalculating metadata only without actual TTL action. [#27019](https://github.com/ClickHouse/ClickHouse/pull/27019) ([lthaooo](https://github.com/lthaooo)). +* Allow reading the list of custom top level domains without a new line at EOF. [#28213](https://github.com/ClickHouse/ClickHouse/pull/28213) ([Azat Khuzhin](https://github.com/azat)). + +#### Bug Fix + +* Fix cases, when reading compressed data from `carbon-clickhouse` fails with 'attempt to read after end of file'. Closes [#26149](https://github.com/ClickHouse/ClickHouse/issues/26149). [#28150](https://github.com/ClickHouse/ClickHouse/pull/28150) ([FArthur-cmd](https://github.com/FArthur-cmd)). +* Fix checking access grants when executing `GRANT WITH REPLACE` statement with `ON CLUSTER` clause. This PR improves fix [#27001](https://github.com/ClickHouse/ClickHouse/pull/27701). [#27983](https://github.com/ClickHouse/ClickHouse/pull/27983) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow selecting with `extremes = 1` from a column of the type `LowCardinality(UUID)`. [#27918](https://github.com/ClickHouse/ClickHouse/pull/27918) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix PostgreSQL-style cast (`::` operator) with negative numbers. [#27876](https://github.com/ClickHouse/ClickHouse/pull/27876) ([Anton Popov](https://github.com/CurtizJ)). +* After [#26864](https://github.com/ClickHouse/ClickHouse/pull/26864). Fix shutdown of `NamedSessionStorage`: session contexts stored in `NamedSessionStorage` are now destroyed before destroying the global context. [#27875](https://github.com/ClickHouse/ClickHouse/pull/27875) ([Vitaly Baranov](https://github.com/vitlibar)). +* Bugfix for `windowFunnel` "strict" mode. This fixes [#27469](https://github.com/ClickHouse/ClickHouse/issues/27469). [#27563](https://github.com/ClickHouse/ClickHouse/pull/27563) ([achimbab](https://github.com/achimbab)). +* Fix infinite loop while reading truncated `bzip2` archive. [#28543](https://github.com/ClickHouse/ClickHouse/pull/28543) ([Azat Khuzhin](https://github.com/azat)). +* Fix UUID overlap in `DROP TABLE` for internal DDL from `MaterializedMySQL`. MaterializedMySQL is an experimental feature. [#28533](https://github.com/ClickHouse/ClickHouse/pull/28533) ([Azat Khuzhin](https://github.com/azat)). +* Fix `There is no subcolumn` error, while select from tables, which have `Nested` columns and scalar columns with dot in name and the same prefix as `Nested` (e.g. `n.id UInt32, n.arr1 Array(UInt64), n.arr2 Array(UInt64)`). [#28531](https://github.com/ClickHouse/ClickHouse/pull/28531) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug which can lead to error `Existing table metadata in ZooKeeper differs in sorting key expression.` after ALTER of `ReplicatedVersionedCollapsingMergeTree`. Fixes [#28515](https://github.com/ClickHouse/ClickHouse/issues/28515). [#28528](https://github.com/ClickHouse/ClickHouse/pull/28528) ([alesapin](https://github.com/alesapin)). +* Fixed possible ZooKeeper watches leak (minor issue) on background processing of distributed DDL queue. Closes [#26036](https://github.com/ClickHouse/ClickHouse/issues/26036). [#28446](https://github.com/ClickHouse/ClickHouse/pull/28446) ([tavplubix](https://github.com/tavplubix)). +* Fix missing quoting of table names in `MaterializedPostgreSQL` engine. Closes [#28316](https://github.com/ClickHouse/ClickHouse/issues/28316). [#28433](https://github.com/ClickHouse/ClickHouse/pull/28433) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix the wrong behaviour of non joined rows from nullable column. Close [#27691](https://github.com/ClickHouse/ClickHouse/issues/27691). [#28349](https://github.com/ClickHouse/ClickHouse/pull/28349) ([vdimir](https://github.com/vdimir)). +* Fix NOT-IN index optimization when not all key columns are used. This fixes [#28120](https://github.com/ClickHouse/ClickHouse/issues/28120). [#28315](https://github.com/ClickHouse/ClickHouse/pull/28315) ([Amos Bird](https://github.com/amosbird)). +* Fix intersecting parts due to new part had been replaced with an empty part. [#28310](https://github.com/ClickHouse/ClickHouse/pull/28310) ([Azat Khuzhin](https://github.com/azat)). +* Fix inconsistent result in queries with `ORDER BY` and `Merge` tables with enabled setting `optimize_read_in_order`. [#28266](https://github.com/ClickHouse/ClickHouse/pull/28266) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible read of uninitialized memory for queries with `Nullable(LowCardinality)` type and the setting `extremes` set to 1. Fixes [#28165](https://github.com/ClickHouse/ClickHouse/issues/28165). [#28205](https://github.com/ClickHouse/ClickHouse/pull/28205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Multiple small fixes for projections. See detailed description in the PR. [#28178](https://github.com/ClickHouse/ClickHouse/pull/28178) ([Amos Bird](https://github.com/amosbird)). +* Fix extremely rare segfaults on shutdown due to incorrect order of context/config reloader shutdown. [#28088](https://github.com/ClickHouse/ClickHouse/pull/28088) ([nvartolomei](https://github.com/nvartolomei)). +* Fix handling null value with type of `Nullable(String)` in function `JSONExtract`. This fixes [#27929](https://github.com/ClickHouse/ClickHouse/issues/27929) and [#27930](https://github.com/ClickHouse/ClickHouse/issues/27930). This was introduced in https://github.com/ClickHouse/ClickHouse/pull/25452 . [#27939](https://github.com/ClickHouse/ClickHouse/pull/27939) ([Amos Bird](https://github.com/amosbird)). +* Multiple fixes for the new `clickhouse-keeper` tool. Fix a rare bug in `clickhouse-keeper` when the client can receive a watch response before request-response. [#28197](https://github.com/ClickHouse/ClickHouse/pull/28197) ([alesapin](https://github.com/alesapin)). Fix incorrect behavior in `clickhouse-keeper` when list watches (`getChildren`) triggered with `set` requests for children. [#28190](https://github.com/ClickHouse/ClickHouse/pull/28190) ([alesapin](https://github.com/alesapin)). Fix rare case when changes of `clickhouse-keeper` settings may lead to lost logs and server hung. [#28360](https://github.com/ClickHouse/ClickHouse/pull/28360) ([alesapin](https://github.com/alesapin)). Fix bug in `clickhouse-keeper` which can lead to endless logs when `rotate_logs_interval` decreased. [#28152](https://github.com/ClickHouse/ClickHouse/pull/28152) ([alesapin](https://github.com/alesapin)). + +#### Build/Testing/Packaging Improvement + +* Enable Thread Fuzzer in Stress Test. Thread Fuzzer is ClickHouse feature that allows to test more permutations of thread scheduling and discover more potential issues. This closes [#9813](https://github.com/ClickHouse/ClickHouse/issues/9813). This closes [#9814](https://github.com/ClickHouse/ClickHouse/issues/9814). This closes [#9515](https://github.com/ClickHouse/ClickHouse/issues/9515). This closes [#9516](https://github.com/ClickHouse/ClickHouse/issues/9516). [#27538](https://github.com/ClickHouse/ClickHouse/pull/27538) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add new log level `test` for testing environments. It is even more verbose than the default `trace`. [#28559](https://github.com/ClickHouse/ClickHouse/pull/28559) ([alesapin](https://github.com/alesapin)). +* Print out git status information at CMake configure stage. [#28047](https://github.com/ClickHouse/ClickHouse/pull/28047) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Temporarily switched ubuntu apt repository to mirror ru.archive.ubuntu.com as the default one (archive.ubuntu.com) is not responding from our CI. [#28016](https://github.com/ClickHouse/ClickHouse/pull/28016) ([Ilya Yatsishin](https://github.com/qoega)). + + + +### ClickHouse release v21.9, 2021-09-09 + +#### Backward Incompatible Change + +* Do not output trailing zeros in text representation of `Decimal` types. Example: `1.23` will be printed instead of `1.230000` for decimal with scale 6. This closes [#15794](https://github.com/ClickHouse/ClickHouse/issues/15794). It may introduce slight incompatibility if your applications somehow relied on the trailing zeros. Serialization in output formats can be controlled with the setting `output_format_decimal_trailing_zeros`. Implementation of `toString` and casting to String is changed unconditionally. [#27680](https://github.com/ClickHouse/ClickHouse/pull/27680) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do not allow to apply parametric aggregate function with `-Merge` combinator to aggregate function state if state was produced by aggregate function with different parameters. For example, state of `fooState(42)(x)` cannot be finalized with `fooMerge(s)` or `fooMerge(123)(s)`, parameters must be specified explicitly like `fooMerge(42)(s)` and must be equal. It does not affect some special aggregate functions like `quantile` and `sequence*` that use parameters for finalization only. [#26847](https://github.com/ClickHouse/ClickHouse/pull/26847) ([tavplubix](https://github.com/tavplubix)). +* Under clickhouse-local, always treat local addresses with a port as remote. [#26736](https://github.com/ClickHouse/ClickHouse/pull/26736) ([Raúl Marín](https://github.com/Algunenano)). +* Fix the issue that in case of some sophisticated query with column aliases identical to the names of expressions, bad cast may happen. This fixes [#25447](https://github.com/ClickHouse/ClickHouse/issues/25447). This fixes [#26914](https://github.com/ClickHouse/ClickHouse/issues/26914). This fix may introduce backward incompatibility: if there are different expressions with identical names, exception will be thrown. It may break some rare cases when `enable_optimize_predicate_expression` is set. [#26639](https://github.com/ClickHouse/ClickHouse/pull/26639) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now, scalar subquery always returns `Nullable` result if it's type can be `Nullable`. It is needed because in case of empty subquery it's result should be `Null`. Previously, it was possible to get error about incompatible types (type deduction does not execute scalar subquery, and it could use not-nullable type). Scalar subquery with empty result which can't be converted to `Nullable` (like `Array` or `Tuple`) now throws error. Fixes [#25411](https://github.com/ClickHouse/ClickHouse/issues/25411). [#26423](https://github.com/ClickHouse/ClickHouse/pull/26423) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Introduce syntax for here documents. Example `SELECT $doc$ VALUE $doc$`. [#26671](https://github.com/ClickHouse/ClickHouse/pull/26671) ([Maksim Kita](https://github.com/kitaisreal)). This change is backward incompatible if in query there are identifiers that contain `$` [#28768](https://github.com/ClickHouse/ClickHouse/issues/28768). +* Now indices can handle Nullable types, including `isNull` and `isNotNull`. [#12433](https://github.com/ClickHouse/ClickHouse/pull/12433) and [#12455](https://github.com/ClickHouse/ClickHouse/pull/12455) ([Amos Bird](https://github.com/amosbird)) and [#27250](https://github.com/ClickHouse/ClickHouse/pull/27250) ([Azat Khuzhin](https://github.com/azat)). But this was done with on-disk format changes, and even though new server can read old data, old server cannot. Also, in case you have `MINMAX` data skipping indices, you may get `Data after mutation/merge is not byte-identical` error, since new index will have `.idx2` extension while before it was `.idx`. That said, that you should not delay updating all existing replicas, in this case, otherwise, if old replica (<21.9) will download data from new replica with 21.9+ it will not be able to apply index for downloaded part. + +#### New Feature + +* Implementation of short circuit function evaluation, closes [#12587](https://github.com/ClickHouse/ClickHouse/issues/12587). Add settings `short_circuit_function_evaluation` to configure short circuit function evaluation. [#23367](https://github.com/ClickHouse/ClickHouse/pull/23367) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for INTERSECT, EXCEPT, ANY, ALL operators. [#24757](https://github.com/ClickHouse/ClickHouse/pull/24757) ([Kirill Ershov](https://github.com/zdikov)). ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for encryption at the virtual file system level (data encryption at rest) using AES-CTR algorithm. [#24206](https://github.com/ClickHouse/ClickHouse/pull/24206) ([Latysheva Alexandra](https://github.com/alexelex)). ([Vitaly Baranov](https://github.com/vitlibar)) [#26733](https://github.com/ClickHouse/ClickHouse/pull/26733) [#26377](https://github.com/ClickHouse/ClickHouse/pull/26377) [#26465](https://github.com/ClickHouse/ClickHouse/pull/26465). +* Added natural language processing (NLP) functions for tokenization, stemming, lemmatizing and search in synonyms extensions. [#24997](https://github.com/ClickHouse/ClickHouse/pull/24997) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added integration with S2 geometry library. [#24980](https://github.com/ClickHouse/ClickHouse/pull/24980) ([Andr0901](https://github.com/Andr0901)). ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add SQLite table engine, table function, database engine. [#24194](https://github.com/ClickHouse/ClickHouse/pull/24194) ([Arslan Gumerov](https://github.com/g-arslan)). ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added support for custom query for `MySQL`, `PostgreSQL`, `ClickHouse`, `JDBC`, `Cassandra` dictionary source. Closes [#1270](https://github.com/ClickHouse/ClickHouse/issues/1270). [#26995](https://github.com/ClickHouse/ClickHouse/pull/26995) ([Maksim Kita](https://github.com/kitaisreal)). +* Add shared (replicated) storage of user, roles, row policies, quotas and settings profiles through ZooKeeper. [#27426](https://github.com/ClickHouse/ClickHouse/pull/27426) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Add compression for `INTO OUTFILE` that automatically choose compression algorithm. Closes [#3473](https://github.com/ClickHouse/ClickHouse/issues/3473). [#27134](https://github.com/ClickHouse/ClickHouse/pull/27134) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add `INSERT ... FROM INFILE` similarly to `SELECT ... INTO OUTFILE`. [#27655](https://github.com/ClickHouse/ClickHouse/pull/27655) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Added `complex_key_range_hashed` dictionary. Closes [#22029](https://github.com/ClickHouse/ClickHouse/issues/22029). [#27629](https://github.com/ClickHouse/ClickHouse/pull/27629) ([Maksim Kita](https://github.com/kitaisreal)). +* Support expressions in JOIN ON section. Close [#21868](https://github.com/ClickHouse/ClickHouse/issues/21868). [#24420](https://github.com/ClickHouse/ClickHouse/pull/24420) ([Vladimir C](https://github.com/vdimir)). +* When client connects to server, it receives information about all warnings that are already were collected by server. (It can be disabled by using option `--no-warnings`). Add `system.warnings` table to collect warnings about server configuration. [#26246](https://github.com/ClickHouse/ClickHouse/pull/26246) ([Filatenkov Artur](https://github.com/FArthur-cmd)). [#26282](https://github.com/ClickHouse/ClickHouse/pull/26282) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Allow using constant expressions from with and select in aggregate function parameters. Close [#10945](https://github.com/ClickHouse/ClickHouse/issues/10945). [#27531](https://github.com/ClickHouse/ClickHouse/pull/27531) ([abel-cheng](https://github.com/abel-cheng)). +* Add `tupleToNameValuePairs`, a function that turns a named tuple into an array of pairs. [#27505](https://github.com/ClickHouse/ClickHouse/pull/27505) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Add support for `bzip2` compression method for import/export. Closes [#22428](https://github.com/ClickHouse/ClickHouse/issues/22428). [#27377](https://github.com/ClickHouse/ClickHouse/pull/27377) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added `bitmapSubsetOffsetLimit(bitmap, offset, cardinality_limit)` function. It creates a subset of bitmap limit the results to `cardinality_limit` with offset of `offset`. [#27234](https://github.com/ClickHouse/ClickHouse/pull/27234) ([DHBin](https://github.com/DHBin)). +* Add column `default_database` to `system.users`. [#27054](https://github.com/ClickHouse/ClickHouse/pull/27054) ([kevin wan](https://github.com/MaxWk)). +* Supported `cluster` macros inside table functions 'cluster' and 'clusterAllReplicas'. [#26913](https://github.com/ClickHouse/ClickHouse/pull/26913) ([polyprogrammist](https://github.com/PolyProgrammist)). +* Add new functions `currentRoles()`, `enabledRoles()`, `defaultRoles()`. [#26780](https://github.com/ClickHouse/ClickHouse/pull/26780) ([Vitaly Baranov](https://github.com/vitlibar)). +* New functions `currentProfiles()`, `enabledProfiles()`, `defaultProfiles()`. [#26714](https://github.com/ClickHouse/ClickHouse/pull/26714) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add functions that return (initial_)query_id of the current query. This closes [#23682](https://github.com/ClickHouse/ClickHouse/issues/23682). [#26410](https://github.com/ClickHouse/ClickHouse/pull/26410) ([Alexey Boykov](https://github.com/mathalex)). +* Add `REPLACE GRANT` feature. [#26384](https://github.com/ClickHouse/ClickHouse/pull/26384) ([Caspian](https://github.com/Cas-pian)). +* `EXPLAIN` query now has `EXPLAIN ESTIMATE ...` mode that will show information about read rows, marks and parts from MergeTree tables. Closes [#23941](https://github.com/ClickHouse/ClickHouse/issues/23941). [#26131](https://github.com/ClickHouse/ClickHouse/pull/26131) ([fastio](https://github.com/fastio)). +* Added `system.zookeeper_log` table. All actions of ZooKeeper client are logged into this table. Implements [#25449](https://github.com/ClickHouse/ClickHouse/issues/25449). [#26129](https://github.com/ClickHouse/ClickHouse/pull/26129) ([tavplubix](https://github.com/tavplubix)). +* Zero-copy replication for `ReplicatedMergeTree` over `HDFS` storage. [#25918](https://github.com/ClickHouse/ClickHouse/pull/25918) ([Zhichang Yu](https://github.com/yuzhichang)). +* Allow to insert Nested type as array of structs in `Arrow`, `ORC` and `Parquet` input format. [#25902](https://github.com/ClickHouse/ClickHouse/pull/25902) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a new datatype `Date32` (store data as Int32), support date range same with `DateTime64` support load parquet date32 to ClickHouse `Date32` Add new function `toDate32` like `toDate`. [#25774](https://github.com/ClickHouse/ClickHouse/pull/25774) ([LiuNeng](https://github.com/liuneng1994)). +* Allow setting default database for users. [#25268](https://github.com/ClickHouse/ClickHouse/issues/25268). [#25687](https://github.com/ClickHouse/ClickHouse/pull/25687) ([kevin wan](https://github.com/MaxWk)). +* Add an optional parameter to `MongoDB` engine to accept connection string options and support SSL connection. Closes [#21189](https://github.com/ClickHouse/ClickHouse/issues/21189). Closes [#21041](https://github.com/ClickHouse/ClickHouse/issues/21041). [#22045](https://github.com/ClickHouse/ClickHouse/pull/22045) ([Omar Bazaraa](https://github.com/OmarBazaraa)). + +#### Experimental Feature + +* Added a compression codec `AES_128_GCM_SIV` which encrypts columns instead of compressing them. [#19896](https://github.com/ClickHouse/ClickHouse/pull/19896) ([PHO](https://github.com/depressed-pho)). Will be rewritten, do not use. +* Rename `MaterializeMySQL` to `MaterializedMySQL`. [#26822](https://github.com/ClickHouse/ClickHouse/pull/26822) ([tavplubix](https://github.com/tavplubix)). + +#### Performance Improvement + +* Improve the performance of fast queries when `max_execution_time = 0` by reducing the number of `clock_gettime` system calls. [#27325](https://github.com/ClickHouse/ClickHouse/pull/27325) ([filimonov](https://github.com/filimonov)). +* Specialize date time related comparison to achieve better performance. This fixes [#27083](https://github.com/ClickHouse/ClickHouse/issues/27083) . [#27122](https://github.com/ClickHouse/ClickHouse/pull/27122) ([Amos Bird](https://github.com/amosbird)). +* Share file descriptors in concurrent reads of the same files. There is no noticeable performance difference on Linux. But the number of opened files will be significantly (10..100 times) lower on typical servers and it makes operations easier. See [#26214](https://github.com/ClickHouse/ClickHouse/issues/26214). [#26768](https://github.com/ClickHouse/ClickHouse/pull/26768) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve latency of short queries, that require reading from tables with large number of columns. [#26371](https://github.com/ClickHouse/ClickHouse/pull/26371) ([Anton Popov](https://github.com/CurtizJ)). +* Don't build sets for indices when analyzing a query. [#26365](https://github.com/ClickHouse/ClickHouse/pull/26365) ([Raúl Marín](https://github.com/Algunenano)). +* Vectorize the SUM of Nullable integer types with native representation ([David Manzanares](https://github.com/davidmanzanares), [Raúl Marín](https://github.com/Algunenano)). [#26248](https://github.com/ClickHouse/ClickHouse/pull/26248) ([Raúl Marín](https://github.com/Algunenano)). +* Compile expressions involving columns with `Enum` types. [#26237](https://github.com/ClickHouse/ClickHouse/pull/26237) ([Maksim Kita](https://github.com/kitaisreal)). +* Compile aggregate functions `groupBitOr`, `groupBitAnd`, `groupBitXor`. [#26161](https://github.com/ClickHouse/ClickHouse/pull/26161) ([Maksim Kita](https://github.com/kitaisreal)). +* Improved memory usage with better block size prediction when reading empty DEFAULT columns. Closes [#17317](https://github.com/ClickHouse/ClickHouse/issues/17317). [#25917](https://github.com/ClickHouse/ClickHouse/pull/25917) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Reduce memory usage and number of read rows in queries with `ORDER BY primary_key`. [#25721](https://github.com/ClickHouse/ClickHouse/pull/25721) ([Anton Popov](https://github.com/CurtizJ)). +* Enable `distributed_push_down_limit` by default. [#27104](https://github.com/ClickHouse/ClickHouse/pull/27104) ([Azat Khuzhin](https://github.com/azat)). +* Make `toTimeZone` monotonicity when timeZone is a constant value to support partition puring when use sql like:. [#26261](https://github.com/ClickHouse/ClickHouse/pull/26261) ([huangzhaowei](https://github.com/SaintBacchus)). + +#### Improvement + +* Mark window functions as ready for general use. Remove the `allow_experimental_window_functions` setting. [#27184](https://github.com/ClickHouse/ClickHouse/pull/27184) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Improve compatibility with non-whole-minute timezone offsets. [#27080](https://github.com/ClickHouse/ClickHouse/pull/27080) ([Raúl Marín](https://github.com/Algunenano)). +* If file descriptor in `File` table is regular file - allow to read multiple times from it. It allows `clickhouse-local` to read multiple times from stdin (with multiple SELECT queries or subqueries) if stdin is a regular file like `clickhouse-local --query "SELECT * FROM table UNION ALL SELECT * FROM table" ... < file`. This closes [#11124](https://github.com/ClickHouse/ClickHouse/issues/11124). Co-authored with ([alexey-milovidov](https://github.com/alexey-milovidov)). [#25960](https://github.com/ClickHouse/ClickHouse/pull/25960) ([BoloniniD](https://github.com/BoloniniD)). +* Remove duplicate index analysis and avoid possible invalid limit checks during projection analysis. [#27742](https://github.com/ClickHouse/ClickHouse/pull/27742) ([Amos Bird](https://github.com/amosbird)). +* Enable query parameters to be passed in the body of HTTP requests. [#27706](https://github.com/ClickHouse/ClickHouse/pull/27706) ([Hermano Lustosa](https://github.com/hllustosa)). +* Disallow `arrayJoin` on partition expressions. [#27648](https://github.com/ClickHouse/ClickHouse/pull/27648) ([Raúl Marín](https://github.com/Algunenano)). +* Log client IP address if authentication fails. [#27514](https://github.com/ClickHouse/ClickHouse/pull/27514) ([Misko Lee](https://github.com/imiskolee)). +* Use bytes instead of strings for binary data in the GRPC protocol. [#27431](https://github.com/ClickHouse/ClickHouse/pull/27431) ([Vitaly Baranov](https://github.com/vitlibar)). +* Send response with error message if HTTP port is not set and user tries to send HTTP request to TCP port. [#27385](https://github.com/ClickHouse/ClickHouse/pull/27385) ([Braulio Valdivielso Martínez](https://github.com/BraulioVM)). +* Add `_CAST` function for internal usage, which will not preserve type nullability, but non-internal cast will preserve according to setting `cast_keep_nullable`. Closes [#12636](https://github.com/ClickHouse/ClickHouse/issues/12636). [#27382](https://github.com/ClickHouse/ClickHouse/pull/27382) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add setting `log_formatted_queries` to log additional formatted query into `system.query_log`. It's useful for normalized query analysis because functions like `normalizeQuery` and `normalizeQueryKeepNames` don't parse/format queries in order to achieve better performance. [#27380](https://github.com/ClickHouse/ClickHouse/pull/27380) ([Amos Bird](https://github.com/amosbird)). +* Add two settings `max_hyperscan_regexp_length` and `max_hyperscan_regexp_total_length` to prevent huge regexp being used in hyperscan related functions, such as `multiMatchAny`. [#27378](https://github.com/ClickHouse/ClickHouse/pull/27378) ([Amos Bird](https://github.com/amosbird)). +* Memory consumed by bitmap aggregate functions now is taken into account for memory limits. This closes [#26555](https://github.com/ClickHouse/ClickHouse/issues/26555). [#27252](https://github.com/ClickHouse/ClickHouse/pull/27252) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add 10 seconds cache for S3 proxy resolver. [#27216](https://github.com/ClickHouse/ClickHouse/pull/27216) ([ianton-ru](https://github.com/ianton-ru)). +* Split global mutex into individual regexp construction. This helps avoid huge regexp construction blocking other related threads. [#27211](https://github.com/ClickHouse/ClickHouse/pull/27211) ([Amos Bird](https://github.com/amosbird)). +* Support schema for PostgreSQL database engine. Closes [#27166](https://github.com/ClickHouse/ClickHouse/issues/27166). [#27198](https://github.com/ClickHouse/ClickHouse/pull/27198) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Track memory usage in clickhouse-client. [#27191](https://github.com/ClickHouse/ClickHouse/pull/27191) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Try recording `query_kind` in `system.query_log` even when query fails to start. [#27182](https://github.com/ClickHouse/ClickHouse/pull/27182) ([Amos Bird](https://github.com/amosbird)). +* Added columns `replica_is_active` that maps replica name to is replica active status to table `system.replicas`. Closes [#27138](https://github.com/ClickHouse/ClickHouse/issues/27138). [#27180](https://github.com/ClickHouse/ClickHouse/pull/27180) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to pass query settings via server URI in Web UI. [#27177](https://github.com/ClickHouse/ClickHouse/pull/27177) ([kolsys](https://github.com/kolsys)). +* Add a new metric called `MaxPushedDDLEntryID` which is the maximum ddl entry id that current node push to zookeeper. [#27174](https://github.com/ClickHouse/ClickHouse/pull/27174) ([Fuwang Hu](https://github.com/fuwhu)). +* Improved the existence condition judgment and empty string node judgment when `clickhouse-keeper` creates znode. [#27125](https://github.com/ClickHouse/ClickHouse/pull/27125) ([小路](https://github.com/nicelulu)). +* Merge JOIN correctly handles empty set in the right. [#27078](https://github.com/ClickHouse/ClickHouse/pull/27078) ([Vladimir C](https://github.com/vdimir)). +* Now functions can be shard-level constants, which means if it's executed in the context of some distributed table, it generates a normal column, otherwise it produces a constant value. Notable functions are: `hostName()`, `tcpPort()`, `version()`, `buildId()`, `uptime()`, etc. [#27020](https://github.com/ClickHouse/ClickHouse/pull/27020) ([Amos Bird](https://github.com/amosbird)). +* Updated `extractAllGroupsHorizontal` - upper limit on the number of matches per row can be set via optional third argument. [#26961](https://github.com/ClickHouse/ClickHouse/pull/26961) ([Vasily Nemkov](https://github.com/Enmk)). +* Expose `RocksDB` statistics via system.rocksdb table. Read rocksdb options from ClickHouse config (`rocksdb...` keys). NOTE: ClickHouse does not rely on RocksDB, it is just one of the additional integration storage engines. [#26821](https://github.com/ClickHouse/ClickHouse/pull/26821) ([Azat Khuzhin](https://github.com/azat)). +* Less verbose internal RocksDB logs. NOTE: ClickHouse does not rely on RocksDB, it is just one of the additional integration storage engines. This closes [#26252](https://github.com/ClickHouse/ClickHouse/issues/26252). [#26789](https://github.com/ClickHouse/ClickHouse/pull/26789) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Changing default roles affects new sessions only. [#26759](https://github.com/ClickHouse/ClickHouse/pull/26759) ([Vitaly Baranov](https://github.com/vitlibar)). +* Watchdog is disabled in docker by default. Fix for not handling ctrl+c. [#26757](https://github.com/ClickHouse/ClickHouse/pull/26757) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* `SET PROFILE` now applies constraints too if they're set for a passed profile. [#26730](https://github.com/ClickHouse/ClickHouse/pull/26730) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve handling of `KILL QUERY` requests. [#26675](https://github.com/ClickHouse/ClickHouse/pull/26675) ([Raúl Marín](https://github.com/Algunenano)). +* `mapPopulatesSeries` function supports `Map` type. [#26663](https://github.com/ClickHouse/ClickHouse/pull/26663) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Fix excessive (x2) connect attempts with `skip_unavailable_shards`. [#26658](https://github.com/ClickHouse/ClickHouse/pull/26658) ([Azat Khuzhin](https://github.com/azat)). +* Avoid hanging `clickhouse-benchmark` if connection fails (i.e. on EMFILE). [#26656](https://github.com/ClickHouse/ClickHouse/pull/26656) ([Azat Khuzhin](https://github.com/azat)). +* Allow more threads to be used by the Kafka engine. [#26642](https://github.com/ClickHouse/ClickHouse/pull/26642) ([feihengye](https://github.com/feihengye)). +* Add round-robin support for `clickhouse-benchmark` (it does not differ from the regular multi host/port run except for statistics report). [#26607](https://github.com/ClickHouse/ClickHouse/pull/26607) ([Azat Khuzhin](https://github.com/azat)). +* Executable dictionaries (`executable`, `executable_pool`) enable creation with DDL query using `clickhouse-local`. Closes [#22355](https://github.com/ClickHouse/ClickHouse/issues/22355). [#26510](https://github.com/ClickHouse/ClickHouse/pull/26510) ([Maksim Kita](https://github.com/kitaisreal)). +* Set client query kind for `mysql` and `postgresql` compatibility protocol handlers. [#26498](https://github.com/ClickHouse/ClickHouse/pull/26498) ([anneji-dev](https://github.com/anneji-dev)). +* Apply `LIMIT` on the shards for queries like `SELECT * FROM dist ORDER BY key LIMIT 10` w/ `distributed_push_down_limit=1`. Avoid running `Distinct`/`LIMIT BY` steps for queries like `SELECT DISTINCT shading_key FROM dist ORDER BY key`. Now `distributed_push_down_limit` is respected by `optimize_distributed_group_by_sharding_key` optimization. [#26466](https://github.com/ClickHouse/ClickHouse/pull/26466) ([Azat Khuzhin](https://github.com/azat)). +* Updated protobuf to 3.17.3. Changelogs are available on https://github.com/protocolbuffers/protobuf/releases. [#26424](https://github.com/ClickHouse/ClickHouse/pull/26424) ([Ilya Yatsishin](https://github.com/qoega)). +* Enable `use_hedged_requests` setting that allows to mitigate tail latencies on large clusters. [#26380](https://github.com/ClickHouse/ClickHouse/pull/26380) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve behaviour with non-existing host in user allowed host list. [#26368](https://github.com/ClickHouse/ClickHouse/pull/26368) ([ianton-ru](https://github.com/ianton-ru)). +* Add ability to set `Distributed` directory monitor settings via CREATE TABLE (i.e. `CREATE TABLE dist (key Int) Engine=Distributed(cluster, db, table) SETTINGS monitor_batch_inserts=1` and similar). [#26336](https://github.com/ClickHouse/ClickHouse/pull/26336) ([Azat Khuzhin](https://github.com/azat)). +* Save server address in history URLs in web UI if it differs from the origin of web UI. This closes [#26044](https://github.com/ClickHouse/ClickHouse/issues/26044). [#26322](https://github.com/ClickHouse/ClickHouse/pull/26322) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add events to profile calls to `sleep` / `sleepEachRow`. [#26320](https://github.com/ClickHouse/ClickHouse/pull/26320) ([Raúl Marín](https://github.com/Algunenano)). +* Allow to reuse connections of shards among different clusters. It also avoids creating new connections when using `cluster` table function. [#26318](https://github.com/ClickHouse/ClickHouse/pull/26318) ([Amos Bird](https://github.com/amosbird)). +* Control the execution period of clear old temporary directories by parameter with default value. [#26212](https://github.com/ClickHouse/ClickHouse/issues/26212). [#26313](https://github.com/ClickHouse/ClickHouse/pull/26313) ([fastio](https://github.com/fastio)). +* Add a setting `function_range_max_elements_in_block` to tune the safety threshold for data volume generated by function `range`. This closes [#26303](https://github.com/ClickHouse/ClickHouse/issues/26303). [#26305](https://github.com/ClickHouse/ClickHouse/pull/26305) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check hash function at table creation, not at sampling. Add settings for MergeTree, if someone create a table with incorrect sampling column but sampling never be used, disable this settings for starting the server without exception. [#26256](https://github.com/ClickHouse/ClickHouse/pull/26256) ([zhaoyu](https://github.com/zxc111)). +* Added `output_format_avro_string_column_pattern` setting to put specified String columns to Avro as string instead of default bytes. Implements [#22414](https://github.com/ClickHouse/ClickHouse/issues/22414). [#26245](https://github.com/ClickHouse/ClickHouse/pull/26245) ([Ilya Golshtein](https://github.com/ilejn)). +* Add information about column sizes in `system.columns` table for `Log` and `TinyLog` tables. This closes [#9001](https://github.com/ClickHouse/ClickHouse/issues/9001). [#26241](https://github.com/ClickHouse/ClickHouse/pull/26241) ([Nikolay Degterinsky](https://github.com/evillique)). +* Don't throw exception when querying `system.detached_parts` table if there is custom disk configuration and `detached` directory does not exist on some disks. This closes [#26078](https://github.com/ClickHouse/ClickHouse/issues/26078). [#26236](https://github.com/ClickHouse/ClickHouse/pull/26236) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check for non-deterministic functions in keys, including constant expressions like `now()`, `today()`. This closes [#25875](https://github.com/ClickHouse/ClickHouse/issues/25875). This closes [#11333](https://github.com/ClickHouse/ClickHouse/issues/11333). [#26235](https://github.com/ClickHouse/ClickHouse/pull/26235) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* convert timestamp and timestamptz data types to `DateTime64` in PostgreSQL table engine. [#26234](https://github.com/ClickHouse/ClickHouse/pull/26234) ([jasine](https://github.com/jasine)). +* Apply aggressive IN index analysis for projections so that better projection candidate can be selected. [#26218](https://github.com/ClickHouse/ClickHouse/pull/26218) ([Amos Bird](https://github.com/amosbird)). +* Remove GLOBAL keyword for IN when scalar function is passed. In previous versions, if user specified `GLOBAL IN f(x)` exception was thrown. [#26217](https://github.com/ClickHouse/ClickHouse/pull/26217) ([Amos Bird](https://github.com/amosbird)). +* Add error id (like `BAD_ARGUMENTS`) to exception messages. This closes [#25862](https://github.com/ClickHouse/ClickHouse/issues/25862). [#26172](https://github.com/ClickHouse/ClickHouse/pull/26172) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect output with --progress option for clickhouse-local. Progress bar will be cleared once it gets to 100% - same as it is done for clickhouse-client. Closes [#17484](https://github.com/ClickHouse/ClickHouse/issues/17484). [#26128](https://github.com/ClickHouse/ClickHouse/pull/26128) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `merge_selecting_sleep_ms` setting. [#26120](https://github.com/ClickHouse/ClickHouse/pull/26120) ([lthaooo](https://github.com/lthaooo)). +* Remove complicated usage of Linux AIO with one block readahead and replace it with plain simple synchronous IO with O_DIRECT. In previous versions, the setting `min_bytes_to_use_direct_io` may not work correctly if `max_threads` is greater than one. Reading with direct IO (that is disabled by default for queries and enabled by default for large merges) will work in less efficient way. This closes [#25997](https://github.com/ClickHouse/ClickHouse/issues/25997). [#26003](https://github.com/ClickHouse/ClickHouse/pull/26003) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Flush `Distributed` table on `REPLACE TABLE` query. Resolves [#24566](https://github.com/ClickHouse/ClickHouse/issues/24566) - Do not replace (or create) table on `[CREATE OR] REPLACE TABLE ... AS SELECT` query if insertion into new table fails. Resolves [#23175](https://github.com/ClickHouse/ClickHouse/issues/23175). [#25895](https://github.com/ClickHouse/ClickHouse/pull/25895) ([tavplubix](https://github.com/tavplubix)). +* Add `views` column to system.query_log containing the names of the (materialized or live) views executed by the query. Adds a new log table (`system.query_views_log`) that contains information about each view executed during a query. Modifies view execution: When an exception is thrown while executing a view, any view that has already startedwill continue running until it finishes. This used to be the behaviour under parallel_view_processing=true and now it's always the same behaviour. - Dependent views now report reading progress to the context. [#25714](https://github.com/ClickHouse/ClickHouse/pull/25714) ([Raúl Marín](https://github.com/Algunenano)). +* Do connection draining asynchonously upon finishing executing distributed queries. A new server setting is added `max_threads_for_connection_collector` which specifies the number of workers to recycle connections in background. If the pool is full, connection will be drained synchronously but a bit different than before: It's drained after we send EOS to client, query will succeed immediately after receiving enough data, and any exception will be logged instead of throwing to the client. Added setting `drain_timeout` (3 seconds by default). Connection draining will disconnect upon timeout. [#25674](https://github.com/ClickHouse/ClickHouse/pull/25674) ([Amos Bird](https://github.com/amosbird)). +* Support for multiple includes in configuration. It is possible to include users configuration, remote servers configuration from multiple sources. Simply place `` element with `from_zk`, `from_env` or `incl` attribute and it will be replaced with the substitution. [#24404](https://github.com/ClickHouse/ClickHouse/pull/24404) ([nvartolomei](https://github.com/nvartolomei)). +* Fix multiple block insertion into distributed table with `insert_distributed_one_random_shard = 1`. This is a marginal feature. Mark as improvement. [#23140](https://github.com/ClickHouse/ClickHouse/pull/23140) ([Amos Bird](https://github.com/amosbird)). +* Support `LowCardinality` and `FixedString` keys/values for `Map` type. [#21543](https://github.com/ClickHouse/ClickHouse/pull/21543) ([hexiaoting](https://github.com/hexiaoting)). +* Enable reloading of local disk config. [#19526](https://github.com/ClickHouse/ClickHouse/pull/19526) ([taiyang-li](https://github.com/taiyang-li)). + +#### Bug Fix + +* Fix a couple of bugs that may cause replicas to diverge. [#27808](https://github.com/ClickHouse/ClickHouse/pull/27808) ([tavplubix](https://github.com/tavplubix)). +* Fix a rare bug in `DROP PART` which can lead to the error `Unexpected merged part intersects drop range`. [#27807](https://github.com/ClickHouse/ClickHouse/pull/27807) ([alesapin](https://github.com/alesapin)). +* Prevent crashes for some formats when NULL (tombstone) message was coming from Kafka. Closes [#19255](https://github.com/ClickHouse/ClickHouse/issues/19255). [#27794](https://github.com/ClickHouse/ClickHouse/pull/27794) ([filimonov](https://github.com/filimonov)). +* Fix column filtering with union distinct in subquery. Closes [#27578](https://github.com/ClickHouse/ClickHouse/issues/27578). [#27689](https://github.com/ClickHouse/ClickHouse/pull/27689) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bad type cast when functions like `arrayHas` are applied to arrays of LowCardinality of Nullable of different non-numeric types like `DateTime` and `DateTime64`. In previous versions bad cast occurs. In new version it will lead to exception. This closes [#26330](https://github.com/ClickHouse/ClickHouse/issues/26330). [#27682](https://github.com/ClickHouse/ClickHouse/pull/27682) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix postgresql table function resulting in non-closing connections. Closes [#26088](https://github.com/ClickHouse/ClickHouse/issues/26088). [#27662](https://github.com/ClickHouse/ClickHouse/pull/27662) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed another case of `Unexpected merged part ... intersecting drop range ...` error. [#27656](https://github.com/ClickHouse/ClickHouse/pull/27656) ([tavplubix](https://github.com/tavplubix)). +* Fix an error with aliased column in `Distributed` table. [#27652](https://github.com/ClickHouse/ClickHouse/pull/27652) ([Vladimir C](https://github.com/vdimir)). +* After setting `max_memory_usage*` to non-zero value it was not possible to reset it back to 0 (unlimited). It's fixed. [#27638](https://github.com/ClickHouse/ClickHouse/pull/27638) ([tavplubix](https://github.com/tavplubix)). +* Fixed underflow of the time value when constructing it from components. Closes [#27193](https://github.com/ClickHouse/ClickHouse/issues/27193). [#27605](https://github.com/ClickHouse/ClickHouse/pull/27605) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix crash during projection materialization when some parts contain missing columns. This fixes [#27512](https://github.com/ClickHouse/ClickHouse/issues/27512). [#27528](https://github.com/ClickHouse/ClickHouse/pull/27528) ([Amos Bird](https://github.com/amosbird)). +* fix metric `BackgroundMessageBrokerSchedulePoolTask`, maybe mistyped. [#27452](https://github.com/ClickHouse/ClickHouse/pull/27452) ([Ben](https://github.com/benbiti)). +* Fix distributed queries with zero shards and aggregation. [#27427](https://github.com/ClickHouse/ClickHouse/pull/27427) ([Azat Khuzhin](https://github.com/azat)). +* Compatibility when `/proc/meminfo` does not contain KB suffix. [#27361](https://github.com/ClickHouse/ClickHouse/pull/27361) ([Mike Kot](https://github.com/myrrc)). +* Fix incorrect result for query with row-level security, PREWHERE and LowCardinality filter. Fixes [#27179](https://github.com/ClickHouse/ClickHouse/issues/27179). [#27329](https://github.com/ClickHouse/ClickHouse/pull/27329) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed incorrect validation of partition id for MergeTree tables that created with old syntax. [#27328](https://github.com/ClickHouse/ClickHouse/pull/27328) ([tavplubix](https://github.com/tavplubix)). +* Fix MySQL protocol when using parallel formats (CSV / TSV). [#27326](https://github.com/ClickHouse/ClickHouse/pull/27326) ([Raúl Marín](https://github.com/Algunenano)). +* Fix `Cannot find column` error for queries with sampling. Was introduced in [#24574](https://github.com/ClickHouse/ClickHouse/issues/24574). Fixes [#26522](https://github.com/ClickHouse/ClickHouse/issues/26522). [#27301](https://github.com/ClickHouse/ClickHouse/pull/27301) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix errors like `Expected ColumnLowCardinality, gotUInt8` or `Bad cast from type DB::ColumnVector to DB::ColumnLowCardinality` for some queries with `LowCardinality` in `PREWHERE`. And more importantly, fix the lack of whitespace in the error message. Fixes [#23515](https://github.com/ClickHouse/ClickHouse/issues/23515). [#27298](https://github.com/ClickHouse/ClickHouse/pull/27298) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `distributed_group_by_no_merge = 2` with `distributed_push_down_limit = 1` or `optimize_distributed_group_by_sharding_key = 1` with `LIMIT BY` and `LIMIT OFFSET`. [#27249](https://github.com/ClickHouse/ClickHouse/pull/27249) ([Azat Khuzhin](https://github.com/azat)). These are obscure combination of settings that no one is using. +* Fix mutation stuck on invalid partitions in non-replicated MergeTree. [#27248](https://github.com/ClickHouse/ClickHouse/pull/27248) ([Azat Khuzhin](https://github.com/azat)). +* In case of ambiguity, lambda functions prefer its arguments to other aliases or identifiers. [#27235](https://github.com/ClickHouse/ClickHouse/pull/27235) ([Raúl Marín](https://github.com/Algunenano)). +* Fix column structure in merge join, close [#27091](https://github.com/ClickHouse/ClickHouse/issues/27091). [#27217](https://github.com/ClickHouse/ClickHouse/pull/27217) ([Vladimir C](https://github.com/vdimir)). +* In rare cases `system.detached_parts` table might contain incorrect information for some parts, it's fixed. Fixes [#27114](https://github.com/ClickHouse/ClickHouse/issues/27114). [#27183](https://github.com/ClickHouse/ClickHouse/pull/27183) ([tavplubix](https://github.com/tavplubix)). +* Fix uninitialized memory in functions `multiSearch*` with empty array, close [#27169](https://github.com/ClickHouse/ClickHouse/issues/27169). [#27181](https://github.com/ClickHouse/ClickHouse/pull/27181) ([Vladimir C](https://github.com/vdimir)). +* Fix synchronization in GRPCServer. This PR fixes [#27024](https://github.com/ClickHouse/ClickHouse/issues/27024). [#27064](https://github.com/ClickHouse/ClickHouse/pull/27064) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `cache`, `complex_key_cache`, `ssd_cache`, `complex_key_ssd_cache` configuration parsing. Options `allow_read_expired_keys`, `max_update_queue_size`, `update_queue_push_timeout_milliseconds`, `query_wait_timeout_milliseconds` were not parsed for dictionaries with non `cache` type. [#27032](https://github.com/ClickHouse/ClickHouse/pull/27032) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible mutation stack due to race with DROP_RANGE. [#27002](https://github.com/ClickHouse/ClickHouse/pull/27002) ([Azat Khuzhin](https://github.com/azat)). +* Now partition ID in queries like `ALTER TABLE ... PARTITION ID xxx` validates for correctness. Fixes [#25718](https://github.com/ClickHouse/ClickHouse/issues/25718). [#26963](https://github.com/ClickHouse/ClickHouse/pull/26963) ([alesapin](https://github.com/alesapin)). +* Fix "Unknown column name" error with multiple JOINs in some cases, close [#26899](https://github.com/ClickHouse/ClickHouse/issues/26899). [#26957](https://github.com/ClickHouse/ClickHouse/pull/26957) ([Vladimir C](https://github.com/vdimir)). +* Fix reading of custom TLDs (stops processing with lower buffer or bigger file). [#26948](https://github.com/ClickHouse/ClickHouse/pull/26948) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `Missing columns: 'xxx'` when `DEFAULT` column references other non materialized column without `DEFAULT` expression. Fixes [#26591](https://github.com/ClickHouse/ClickHouse/issues/26591). [#26900](https://github.com/ClickHouse/ClickHouse/pull/26900) ([alesapin](https://github.com/alesapin)). +* Fix loading of dictionary keys in `library-bridge` for `library` dictionary source. [#26834](https://github.com/ClickHouse/ClickHouse/pull/26834) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Aggregate function parameters might be lost when applying some combinators causing exceptions like `Conversion from AggregateFunction(topKArray, Array(String)) to AggregateFunction(topKArray(10), Array(String)) is not supported`. It's fixed. Fixes [#26196](https://github.com/ClickHouse/ClickHouse/issues/26196) and [#26433](https://github.com/ClickHouse/ClickHouse/issues/26433). [#26814](https://github.com/ClickHouse/ClickHouse/pull/26814) ([tavplubix](https://github.com/tavplubix)). +* Add `event_time_microseconds` value for `REMOVE_PART` in `system.part_log`. In previous versions is was not set. [#26720](https://github.com/ClickHouse/ClickHouse/pull/26720) ([Azat Khuzhin](https://github.com/azat)). +* Do not remove data on ReplicatedMergeTree table shutdown to avoid creating data to metadata inconsistency. [#26716](https://github.com/ClickHouse/ClickHouse/pull/26716) ([nvartolomei](https://github.com/nvartolomei)). +* Sometimes `SET ROLE` could work incorrectly, this PR fixes that. [#26707](https://github.com/ClickHouse/ClickHouse/pull/26707) ([Vitaly Baranov](https://github.com/vitlibar)). +* Some fixes for parallel formatting (https://github.com/ClickHouse/ClickHouse/issues/26694). [#26703](https://github.com/ClickHouse/ClickHouse/pull/26703) ([Raúl Marín](https://github.com/Algunenano)). +* Fix potential nullptr dereference in window functions. This fixes [#25276](https://github.com/ClickHouse/ClickHouse/issues/25276). [#26668](https://github.com/ClickHouse/ClickHouse/pull/26668) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix clickhouse-client history file conversion (when upgrading from the format of 3 years old version of clickhouse-client) if file is empty. [#26589](https://github.com/ClickHouse/ClickHouse/pull/26589) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect function names of groupBitmapAnd/Or/Xor (can be displayed in some occasions). This fixes. [#26557](https://github.com/ClickHouse/ClickHouse/pull/26557) ([Amos Bird](https://github.com/amosbird)). +* Update `chown` cmd check in clickhouse-server docker entrypoint. It fixes the bug that cluster pod restart failed (or timeout) on kubernetes. [#26545](https://github.com/ClickHouse/ClickHouse/pull/26545) ([Ky Li](https://github.com/Kylinrix)). +* Fix crash in `RabbitMQ` shutdown in case `RabbitMQ` setup was not started. Closes [#26504](https://github.com/ClickHouse/ClickHouse/issues/26504). [#26529](https://github.com/ClickHouse/ClickHouse/pull/26529) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix issues with `CREATE DICTIONARY` query if dictionary name or database name was quoted. Closes [#26491](https://github.com/ClickHouse/ClickHouse/issues/26491). [#26508](https://github.com/ClickHouse/ClickHouse/pull/26508) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix broken column name resolution after rewriting column aliases. This fixes [#26432](https://github.com/ClickHouse/ClickHouse/issues/26432). [#26475](https://github.com/ClickHouse/ClickHouse/pull/26475) ([Amos Bird](https://github.com/amosbird)). +* Fix some fuzzed msan crash. Fixes [#22517](https://github.com/ClickHouse/ClickHouse/issues/22517). [#26428](https://github.com/ClickHouse/ClickHouse/pull/26428) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix infinite non joined block stream in `partial_merge_join` close [#26325](https://github.com/ClickHouse/ClickHouse/issues/26325). [#26374](https://github.com/ClickHouse/ClickHouse/pull/26374) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash when login as dropped user. This PR fixes [#26073](https://github.com/ClickHouse/ClickHouse/issues/26073). [#26363](https://github.com/ClickHouse/ClickHouse/pull/26363) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `optimize_distributed_group_by_sharding_key` for multiple columns (leads to incorrect result w/ `optimize_skip_unused_shards=1`/`allow_nondeterministic_optimize_skip_unused_shards=1` and multiple columns in sharding key expression). [#26353](https://github.com/ClickHouse/ClickHouse/pull/26353) ([Azat Khuzhin](https://github.com/azat)). +* Fixed rare bug in lost replica recovery that may cause replicas to diverge. [#26321](https://github.com/ClickHouse/ClickHouse/pull/26321) ([tavplubix](https://github.com/tavplubix)). +* Fix zstd decompression (for import/export in zstd framing format that is unrelated to tables data) in case there are escape sequences at the end of internal buffer. Closes [#26013](https://github.com/ClickHouse/ClickHouse/issues/26013). [#26314](https://github.com/ClickHouse/ClickHouse/pull/26314) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix logical error on join with totals, close [#26017](https://github.com/ClickHouse/ClickHouse/issues/26017). [#26250](https://github.com/ClickHouse/ClickHouse/pull/26250) ([Vladimir C](https://github.com/vdimir)). +* Remove excessive newline in `thread_name` column in `system.stack_trace` table. This fixes [#24124](https://github.com/ClickHouse/ClickHouse/issues/24124). [#26210](https://github.com/ClickHouse/ClickHouse/pull/26210) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential crash if more than one `untuple` expression is used. [#26179](https://github.com/ClickHouse/ClickHouse/pull/26179) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Don't throw exception in `toString` for Nullable Enum if Enum does not have a value for zero, close [#25806](https://github.com/ClickHouse/ClickHouse/issues/25806). [#26123](https://github.com/ClickHouse/ClickHouse/pull/26123) ([Vladimir C](https://github.com/vdimir)). +* Fixed incorrect `sequence_id` in MySQL protocol packets that ClickHouse sends on exception during query execution. It might cause MySQL client to reset connection to ClickHouse server. Fixes [#21184](https://github.com/ClickHouse/ClickHouse/issues/21184). [#26051](https://github.com/ClickHouse/ClickHouse/pull/26051) ([tavplubix](https://github.com/tavplubix)). +* Fix for the case that `cutToFirstSignificantSubdomainCustom()`/`cutToFirstSignificantSubdomainCustomWithWWW()`/`firstSignificantSubdomainCustom()` returns incorrect type for consts, and hence `optimize_skip_unused_shards` does not work:. [#26041](https://github.com/ClickHouse/ClickHouse/pull/26041) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible mismatched header when using normal projection with prewhere. This fixes [#26020](https://github.com/ClickHouse/ClickHouse/issues/26020). [#26038](https://github.com/ClickHouse/ClickHouse/pull/26038) ([Amos Bird](https://github.com/amosbird)). +* Fix sharding_key from column w/o function for remote() (before `select * from remote('127.1', system.one, dummy)` leads to `Unknown column: dummy, there are only columns .` error). [#25824](https://github.com/ClickHouse/ClickHouse/pull/25824) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Not found column ...` and `Missing column ...` errors when selecting from `MaterializeMySQL`. Fixes [#23708](https://github.com/ClickHouse/ClickHouse/issues/23708), [#24830](https://github.com/ClickHouse/ClickHouse/issues/24830), [#25794](https://github.com/ClickHouse/ClickHouse/issues/25794). [#25822](https://github.com/ClickHouse/ClickHouse/pull/25822) ([tavplubix](https://github.com/tavplubix)). +* Fix `optimize_skip_unused_shards_rewrite_in` for non-UInt64 types (may select incorrect shards eventually or throw `Cannot infer type of an empty tuple` or `Function tuple requires at least one argument`). [#25798](https://github.com/ClickHouse/ClickHouse/pull/25798) ([Azat Khuzhin](https://github.com/azat)). + +#### Build/Testing/Packaging Improvement + +* Now we ran stateful and stateless tests in random timezones. Fixes [#12439](https://github.com/ClickHouse/ClickHouse/issues/12439). Reading String as DateTime and writing DateTime as String in Protobuf format now respect timezone. Reading UInt16 as DateTime in Arrow and Parquet formats now treat it as Date and then converts to DateTime with respect to DateTime's timezone, because Date is serialized in Arrow and Parquet as UInt16. GraphiteMergeTree now respect time zone for rounding of times. Fixes [#5098](https://github.com/ClickHouse/ClickHouse/issues/5098). Author: @alexey-milovidov. [#15408](https://github.com/ClickHouse/ClickHouse/pull/15408) ([alesapin](https://github.com/alesapin)). +* `clickhouse-test` supports SQL tests with [Jinja2](https://jinja.palletsprojects.com/en/3.0.x/templates/#synopsis) templates. [#26579](https://github.com/ClickHouse/ClickHouse/pull/26579) ([Vladimir C](https://github.com/vdimir)). +* Add support for build with `clang-13`. This closes [#27705](https://github.com/ClickHouse/ClickHouse/issues/27705). [#27714](https://github.com/ClickHouse/ClickHouse/pull/27714) ([alexey-milovidov](https://github.com/alexey-milovidov)). [#27777](https://github.com/ClickHouse/ClickHouse/pull/27777) ([Sergei Semin](https://github.com/syominsergey)) +* Add CMake options to build with or without specific CPU instruction set. This is for [#17469](https://github.com/ClickHouse/ClickHouse/issues/17469) and [#27509](https://github.com/ClickHouse/ClickHouse/issues/27509). [#27508](https://github.com/ClickHouse/ClickHouse/pull/27508) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix linking of auxiliar programs when using dynamic libraries. [#26958](https://github.com/ClickHouse/ClickHouse/pull/26958) ([Raúl Marín](https://github.com/Algunenano)). +* Update RocksDB to `2021-07-16` master. [#26411](https://github.com/ClickHouse/ClickHouse/pull/26411) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release v21.8, 2021-08-12 + +#### Upgrade Notes +* New version is using `Map` data type for system logs tables (`system.query_log`, `system.query_thread_log`, `system.processes`, `system.opentelemetry_span_log`). These tables will be auto-created with new data types. Virtual columns are created to support old queries. Closes [#18698](https://github.com/ClickHouse/ClickHouse/issues/18698). [#23934](https://github.com/ClickHouse/ClickHouse/pull/23934), [#25773](https://github.com/ClickHouse/ClickHouse/pull/25773) ([hexiaoting](https://github.com/hexiaoting), [sundy-li](https://github.com/sundy-li), [Maksim Kita](https://github.com/kitaisreal)). If you want to *downgrade* from version 21.8 to older versions, you will need to cleanup system tables with logs manually. Look at `/var/lib/clickhouse/data/system/*_log`. + +#### New Features + +* Add support for a part of SQL/JSON standard. [#24148](https://github.com/ClickHouse/ClickHouse/pull/24148) ([l1tsolaiki](https://github.com/l1tsolaiki), [Kseniia Sumarokova](https://github.com/kssenii)). +* Collect common system metrics (in `system.asynchronous_metrics` and `system.asynchronous_metric_log`) on CPU usage, disk usage, memory usage, IO, network, files, load average, CPU frequencies, thermal sensors, EDAC counters, system uptime; also added metrics about the scheduling jitter and the time spent collecting the metrics. It works similar to `atop` in ClickHouse and allows access to monitoring data even if you have no additional tools installed. Close [#9430](https://github.com/ClickHouse/ClickHouse/issues/9430). [#24416](https://github.com/ClickHouse/ClickHouse/pull/24416) ([alexey-milovidov](https://github.com/alexey-milovidov), [Yegor Levankov](https://github.com/elevankoff)). +* Add MaterializedPostgreSQL table engine and database engine. This database engine allows replicating a whole database or any subset of database tables. [#20470](https://github.com/ClickHouse/ClickHouse/pull/20470) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add new functions `leftPad()`, `rightPad()`, `leftPadUTF8()`, `rightPadUTF8()`. [#26075](https://github.com/ClickHouse/ClickHouse/pull/26075) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add the `FIRST` keyword to the `ADD INDEX` command to be able to add the index at the beginning of the indices list. [#25904](https://github.com/ClickHouse/ClickHouse/pull/25904) ([xjewer](https://github.com/xjewer)). +* Introduce `system.data_skipping_indices` table containing information about existing data skipping indices. Close [#7659](https://github.com/ClickHouse/ClickHouse/issues/7659). [#25693](https://github.com/ClickHouse/ClickHouse/pull/25693) ([Dmitry Novik](https://github.com/novikd)). +* Add `bin`/`unbin` functions. [#25609](https://github.com/ClickHouse/ClickHouse/pull/25609) ([zhaoyu](https://github.com/zxc111)). +* Support `Map` and `UInt128`, `Int128`, `UInt256`, `Int256` types in `mapAdd` and `mapSubtract` functions. [#25596](https://github.com/ClickHouse/ClickHouse/pull/25596) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `DISTINCT ON (columns)` expression, close [#25404](https://github.com/ClickHouse/ClickHouse/issues/25404). [#25589](https://github.com/ClickHouse/ClickHouse/pull/25589) ([Zijie Lu](https://github.com/TszKitLo40)). +* Add an ability to reset a custom setting to default and remove it from the table's metadata. It allows rolling back the change without knowing the system/config's default. Closes [#14449](https://github.com/ClickHouse/ClickHouse/issues/14449). [#17769](https://github.com/ClickHouse/ClickHouse/pull/17769) ([xjewer](https://github.com/xjewer)). +* Render pipelines as graphs in Web UI if `EXPLAIN PIPELINE graph = 1` query is submitted. [#26067](https://github.com/ClickHouse/ClickHouse/pull/26067) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Performance Improvements + +* Compile aggregate functions. Use option `compile_aggregate_expressions` to enable it. [#24789](https://github.com/ClickHouse/ClickHouse/pull/24789) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve latency of short queries that require reading from tables with many columns. [#26371](https://github.com/ClickHouse/ClickHouse/pull/26371) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvements + +* Use `Map` data type for system logs tables (`system.query_log`, `system.query_thread_log`, `system.processes`, `system.opentelemetry_span_log`). These tables will be auto-created with new data types. Virtual columns are created to support old queries. Closes [#18698](https://github.com/ClickHouse/ClickHouse/issues/18698). [#23934](https://github.com/ClickHouse/ClickHouse/pull/23934), [#25773](https://github.com/ClickHouse/ClickHouse/pull/25773) ([hexiaoting](https://github.com/hexiaoting), [sundy-li](https://github.com/sundy-li), [Maksim Kita](https://github.com/kitaisreal)). +* For a dictionary with a complex key containing only one attribute, allow not wrapping the key expression in tuple for functions `dictGet`, `dictHas`. [#26130](https://github.com/ClickHouse/ClickHouse/pull/26130) ([Maksim Kita](https://github.com/kitaisreal)). +* Implement function `bin`/`hex` from `AggregateFunction` states. [#26094](https://github.com/ClickHouse/ClickHouse/pull/26094) ([zhaoyu](https://github.com/zxc111)). +* Support arguments of `UUID` type for `empty` and `notEmpty` functions. `UUID` is empty if it is all zeros (nil UUID). Closes [#3446](https://github.com/ClickHouse/ClickHouse/issues/3446). [#25974](https://github.com/ClickHouse/ClickHouse/pull/25974) ([zhaoyu](https://github.com/zxc111)). +* Add support for `SET SQL_SELECT_LIMIT` in MySQL protocol. Closes [#17115](https://github.com/ClickHouse/ClickHouse/issues/17115). [#25972](https://github.com/ClickHouse/ClickHouse/pull/25972) ([Kseniia Sumarokova](https://github.com/kssenii)). +* More instrumentation for network interaction: add counters for recv/send bytes; add gauges for recvs/sends. Added missing documentation. Close [#5897](https://github.com/ClickHouse/ClickHouse/issues/5897). [#25962](https://github.com/ClickHouse/ClickHouse/pull/25962) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add setting `optimize_move_to_prewhere_if_final`. If query has `FINAL`, the optimization `move_to_prewhere` will be enabled only if both `optimize_move_to_prewhere` and `optimize_move_to_prewhere_if_final` are enabled. Closes [#8684](https://github.com/ClickHouse/ClickHouse/issues/8684). [#25940](https://github.com/ClickHouse/ClickHouse/pull/25940) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow complex quoted identifiers of JOINed tables. Close [#17861](https://github.com/ClickHouse/ClickHouse/issues/17861). [#25924](https://github.com/ClickHouse/ClickHouse/pull/25924) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add support for Unicode (e.g. Chinese, Cyrillic) components in `Nested` data types. Close [#25594](https://github.com/ClickHouse/ClickHouse/issues/25594). [#25923](https://github.com/ClickHouse/ClickHouse/pull/25923) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow `quantiles*` functions to work with `aggregate_functions_null_for_empty`. Close [#25892](https://github.com/ClickHouse/ClickHouse/issues/25892). [#25919](https://github.com/ClickHouse/ClickHouse/pull/25919) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow parameters for parametric aggregate functions to be arbitrary constant expressions (e.g., `1 + 2`), not just literals. It also allows using the query parameters (in parameterized queries like `{param:UInt8}`) inside parametric aggregate functions. Closes [#11607](https://github.com/ClickHouse/ClickHouse/issues/11607). [#25910](https://github.com/ClickHouse/ClickHouse/pull/25910) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correctly throw the exception on the attempt to parse an invalid `Date`. Closes [#6481](https://github.com/ClickHouse/ClickHouse/issues/6481). [#25909](https://github.com/ClickHouse/ClickHouse/pull/25909) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support for multiple includes in configuration. It is possible to include users configuration, remote server configuration from multiple sources. Simply place `` element with `from_zk`, `from_env` or `incl` attribute, and it will be replaced with the substitution. [#24404](https://github.com/ClickHouse/ClickHouse/pull/24404) ([nvartolomei](https://github.com/nvartolomei)). +* Support for queries with a column named `"null"` (it must be specified in back-ticks or double quotes) and `ON CLUSTER`. Closes [#24035](https://github.com/ClickHouse/ClickHouse/issues/24035). [#25907](https://github.com/ClickHouse/ClickHouse/pull/25907) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `LowCardinality`, `Decimal`, and `UUID` for `JSONExtract`. Closes [#24606](https://github.com/ClickHouse/ClickHouse/issues/24606). [#25900](https://github.com/ClickHouse/ClickHouse/pull/25900) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Convert history file from `readline` format to `replxx` format. [#25888](https://github.com/ClickHouse/ClickHouse/pull/25888) ([Azat Khuzhin](https://github.com/azat)). +* Fix an issue which can lead to intersecting parts after `DROP PART` or background deletion of an empty part. [#25884](https://github.com/ClickHouse/ClickHouse/pull/25884) ([alesapin](https://github.com/alesapin)). +* Better handling of lost parts for `ReplicatedMergeTree` tables. Fixes rare inconsistencies in `ReplicationQueue`. Fixes [#10368](https://github.com/ClickHouse/ClickHouse/issues/10368). [#25820](https://github.com/ClickHouse/ClickHouse/pull/25820) ([alesapin](https://github.com/alesapin)). +* Allow starting clickhouse-client with unreadable working directory. [#25817](https://github.com/ClickHouse/ClickHouse/pull/25817) ([ianton-ru](https://github.com/ianton-ru)). +* Fix "No available columns" error for `Merge` storage. [#25801](https://github.com/ClickHouse/ClickHouse/pull/25801) ([Azat Khuzhin](https://github.com/azat)). +* MySQL Engine now supports the exchange of column comments between MySQL and ClickHouse. [#25795](https://github.com/ClickHouse/ClickHouse/pull/25795) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Fix inconsistent behaviour of `GROUP BY` constant on empty set. Closes [#6842](https://github.com/ClickHouse/ClickHouse/issues/6842). [#25786](https://github.com/ClickHouse/ClickHouse/pull/25786) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Cancel already running merges in partition on `DROP PARTITION` and `TRUNCATE` for `ReplicatedMergeTree`. Resolves [#17151](https://github.com/ClickHouse/ClickHouse/issues/17151). [#25684](https://github.com/ClickHouse/ClickHouse/pull/25684) ([tavplubix](https://github.com/tavplubix)). +* Support ENUM` data type for MaterializeMySQL. [#25676](https://github.com/ClickHouse/ClickHouse/pull/25676) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Support materialized and aliased columns in JOIN, close [#13274](https://github.com/ClickHouse/ClickHouse/issues/13274). [#25634](https://github.com/ClickHouse/ClickHouse/pull/25634) ([Vladimir C](https://github.com/vdimir)). +* Fix possible logical race condition between `ALTER TABLE ... DETACH` and background merges. [#25605](https://github.com/ClickHouse/ClickHouse/pull/25605) ([Azat Khuzhin](https://github.com/azat)). +* Make `NetworkReceiveElapsedMicroseconds` metric to correctly include the time spent waiting for data from the client to `INSERT`. Close [#9958](https://github.com/ClickHouse/ClickHouse/issues/9958). [#25602](https://github.com/ClickHouse/ClickHouse/pull/25602) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `TRUNCATE TABLE` for S3 and HDFS. Close [#25530](https://github.com/ClickHouse/ClickHouse/issues/25530). [#25550](https://github.com/ClickHouse/ClickHouse/pull/25550) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support for dynamic reloading of config to change number of threads in pool for background jobs execution (merges, mutations, fetches). [#25548](https://github.com/ClickHouse/ClickHouse/pull/25548) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow extracting of non-string element as string using `JSONExtract`. This is for [#25414](https://github.com/ClickHouse/ClickHouse/issues/25414). [#25452](https://github.com/ClickHouse/ClickHouse/pull/25452) ([Amos Bird](https://github.com/amosbird)). +* Support regular expression in `Database` argument for `StorageMerge`. Close [#776](https://github.com/ClickHouse/ClickHouse/issues/776). [#25064](https://github.com/ClickHouse/ClickHouse/pull/25064) ([flynn](https://github.com/ucasfl)). +* Web UI: if the value looks like a URL, automatically generate a link. [#25965](https://github.com/ClickHouse/ClickHouse/pull/25965) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `sudo service clickhouse-server start` to work on systems with `systemd` like Centos 8. Close [#14298](https://github.com/ClickHouse/ClickHouse/issues/14298). Close [#17799](https://github.com/ClickHouse/ClickHouse/issues/17799). [#25921](https://github.com/ClickHouse/ClickHouse/pull/25921) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fixes + +* Fix incorrect `SET ROLE` in some cases. [#26707](https://github.com/ClickHouse/ClickHouse/pull/26707) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix potential `nullptr` dereference in window functions. Fix [#25276](https://github.com/ClickHouse/ClickHouse/issues/25276). [#26668](https://github.com/ClickHouse/ClickHouse/pull/26668) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix incorrect function names of `groupBitmapAnd/Or/Xor`. Fix [#26557](https://github.com/ClickHouse/ClickHouse/pull/26557) ([Amos Bird](https://github.com/amosbird)). +* Fix crash in RabbitMQ shutdown in case RabbitMQ setup was not started. Closes [#26504](https://github.com/ClickHouse/ClickHouse/issues/26504). [#26529](https://github.com/ClickHouse/ClickHouse/pull/26529) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix issues with `CREATE DICTIONARY` query if dictionary name or database name was quoted. Closes [#26491](https://github.com/ClickHouse/ClickHouse/issues/26491). [#26508](https://github.com/ClickHouse/ClickHouse/pull/26508) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix broken name resolution after rewriting column aliases. Fix [#26432](https://github.com/ClickHouse/ClickHouse/issues/26432). [#26475](https://github.com/ClickHouse/ClickHouse/pull/26475) ([Amos Bird](https://github.com/amosbird)). +* Fix infinite non-joined block stream in `partial_merge_join` close [#26325](https://github.com/ClickHouse/ClickHouse/issues/26325). [#26374](https://github.com/ClickHouse/ClickHouse/pull/26374) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash when login as dropped user. Fix [#26073](https://github.com/ClickHouse/ClickHouse/issues/26073). [#26363](https://github.com/ClickHouse/ClickHouse/pull/26363) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `optimize_distributed_group_by_sharding_key` for multiple columns (leads to incorrect result w/ `optimize_skip_unused_shards=1`/`allow_nondeterministic_optimize_skip_unused_shards=1` and multiple columns in sharding key expression). [#26353](https://github.com/ClickHouse/ClickHouse/pull/26353) ([Azat Khuzhin](https://github.com/azat)). +* `CAST` from `Date` to `DateTime` (or `DateTime64`) was not using the timezone of the `DateTime` type. It can also affect the comparison between `Date` and `DateTime`. Inference of the common type for `Date` and `DateTime` also was not using the corresponding timezone. It affected the results of function `if` and array construction. Closes [#24128](https://github.com/ClickHouse/ClickHouse/issues/24128). [#24129](https://github.com/ClickHouse/ClickHouse/pull/24129) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed rare bug in lost replica recovery that may cause replicas to diverge. [#26321](https://github.com/ClickHouse/ClickHouse/pull/26321) ([tavplubix](https://github.com/tavplubix)). +* Fix zstd decompression in case there are escape sequences at the end of internal buffer. Closes [#26013](https://github.com/ClickHouse/ClickHouse/issues/26013). [#26314](https://github.com/ClickHouse/ClickHouse/pull/26314) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix logical error on join with totals, close [#26017](https://github.com/ClickHouse/ClickHouse/issues/26017). [#26250](https://github.com/ClickHouse/ClickHouse/pull/26250) ([Vladimir C](https://github.com/vdimir)). +* Remove excessive newline in `thread_name` column in `system.stack_trace` table. Fix [#24124](https://github.com/ClickHouse/ClickHouse/issues/24124). [#26210](https://github.com/ClickHouse/ClickHouse/pull/26210) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `joinGet` with `LowCarinality` columns, close [#25993](https://github.com/ClickHouse/ClickHouse/issues/25993). [#26118](https://github.com/ClickHouse/ClickHouse/pull/26118) ([Vladimir C](https://github.com/vdimir)). +* Fix possible crash in `pointInPolygon` if the setting `validate_polygons` is turned off. [#26113](https://github.com/ClickHouse/ClickHouse/pull/26113) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix throwing exception when iterate over non-existing remote directory. [#26087](https://github.com/ClickHouse/ClickHouse/pull/26087) ([ianton-ru](https://github.com/ianton-ru)). +* Fix rare server crash because of `abort` in ZooKeeper client. Fixes [#25813](https://github.com/ClickHouse/ClickHouse/issues/25813). [#26079](https://github.com/ClickHouse/ClickHouse/pull/26079) ([alesapin](https://github.com/alesapin)). +* Fix wrong thread count estimation for right subquery join in some cases. Close [#24075](https://github.com/ClickHouse/ClickHouse/issues/24075). [#26052](https://github.com/ClickHouse/ClickHouse/pull/26052) ([Vladimir C](https://github.com/vdimir)). +* Fixed incorrect `sequence_id` in MySQL protocol packets that ClickHouse sends on exception during query execution. It might cause MySQL client to reset connection to ClickHouse server. Fixes [#21184](https://github.com/ClickHouse/ClickHouse/issues/21184). [#26051](https://github.com/ClickHouse/ClickHouse/pull/26051) ([tavplubix](https://github.com/tavplubix)). +* Fix possible mismatched header when using normal projection with `PREWHERE`. Fix [#26020](https://github.com/ClickHouse/ClickHouse/issues/26020). [#26038](https://github.com/ClickHouse/ClickHouse/pull/26038) ([Amos Bird](https://github.com/amosbird)). +* Fix formatting of type `Map` with integer keys to `JSON`. [#25982](https://github.com/ClickHouse/ClickHouse/pull/25982) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible deadlock during query profiler stack unwinding. Fix [#25968](https://github.com/ClickHouse/ClickHouse/issues/25968). [#25970](https://github.com/ClickHouse/ClickHouse/pull/25970) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash on call `dictGet()` with bad arguments. [#25913](https://github.com/ClickHouse/ClickHouse/pull/25913) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `scram-sha-256` authentication for PostgreSQL engines. Closes [#24516](https://github.com/ClickHouse/ClickHouse/issues/24516). [#25906](https://github.com/ClickHouse/ClickHouse/pull/25906) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix extremely long backoff for background tasks when the background pool is full. Fixes [#25836](https://github.com/ClickHouse/ClickHouse/issues/25836). [#25893](https://github.com/ClickHouse/ClickHouse/pull/25893) ([alesapin](https://github.com/alesapin)). +* Fix ARM exception handling with non default page size. Fixes [#25512](https://github.com/ClickHouse/ClickHouse/issues/25512), [#25044](https://github.com/ClickHouse/ClickHouse/issues/25044), [#24901](https://github.com/ClickHouse/ClickHouse/issues/24901), [#23183](https://github.com/ClickHouse/ClickHouse/issues/23183), [#20221](https://github.com/ClickHouse/ClickHouse/issues/20221), [#19703](https://github.com/ClickHouse/ClickHouse/issues/19703), [#19028](https://github.com/ClickHouse/ClickHouse/issues/19028), [#18391](https://github.com/ClickHouse/ClickHouse/issues/18391), [#18121](https://github.com/ClickHouse/ClickHouse/issues/18121), [#17994](https://github.com/ClickHouse/ClickHouse/issues/17994), [#12483](https://github.com/ClickHouse/ClickHouse/issues/12483). [#25854](https://github.com/ClickHouse/ClickHouse/pull/25854) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix sharding_key from column w/o function for `remote()` (before `select * from remote('127.1', system.one, dummy)` leads to `Unknown column: dummy, there are only columns .` error). [#25824](https://github.com/ClickHouse/ClickHouse/pull/25824) ([Azat Khuzhin](https://github.com/azat)). +* Fixed `Not found column ...` and `Missing column ...` errors when selecting from `MaterializeMySQL`. Fixes [#23708](https://github.com/ClickHouse/ClickHouse/issues/23708), [#24830](https://github.com/ClickHouse/ClickHouse/issues/24830), [#25794](https://github.com/ClickHouse/ClickHouse/issues/25794). [#25822](https://github.com/ClickHouse/ClickHouse/pull/25822) ([tavplubix](https://github.com/tavplubix)). +* Fix `optimize_skip_unused_shards_rewrite_in` for non-UInt64 types (may select incorrect shards eventually or throw `Cannot infer type of an empty tuple` or `Function tuple requires at least one argument`). [#25798](https://github.com/ClickHouse/ClickHouse/pull/25798) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare bug with `DROP PART` query for `ReplicatedMergeTree` tables which can lead to error message `Unexpected merged part intersecting drop range`. [#25783](https://github.com/ClickHouse/ClickHouse/pull/25783) ([alesapin](https://github.com/alesapin)). +* Fix bug in `TTL` with `GROUP BY` expression which refuses to execute `TTL` after first execution in part. [#25743](https://github.com/ClickHouse/ClickHouse/pull/25743) ([alesapin](https://github.com/alesapin)). +* Allow StorageMerge to access tables with aliases. Closes [#6051](https://github.com/ClickHouse/ClickHouse/issues/6051). [#25694](https://github.com/ClickHouse/ClickHouse/pull/25694) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix slow dict join in some cases, close [#24209](https://github.com/ClickHouse/ClickHouse/issues/24209). [#25618](https://github.com/ClickHouse/ClickHouse/pull/25618) ([Vladimir C](https://github.com/vdimir)). +* Fix `ALTER MODIFY COLUMN` of columns, which participates in TTL expressions. [#25554](https://github.com/ClickHouse/ClickHouse/pull/25554) ([Anton Popov](https://github.com/CurtizJ)). +* Fix assertion in `PREWHERE` with non-UInt8 type, close [#19589](https://github.com/ClickHouse/ClickHouse/issues/19589). [#25484](https://github.com/ClickHouse/ClickHouse/pull/25484) ([Vladimir C](https://github.com/vdimir)). +* Fix some fuzzed msan crash. Fixes [#22517](https://github.com/ClickHouse/ClickHouse/issues/22517). [#26428](https://github.com/ClickHouse/ClickHouse/pull/26428) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update `chown` cmd check in `clickhouse-server` docker entrypoint. It fixes error 'cluster pod restart failed (or timeout)' on kubernetes. [#26545](https://github.com/ClickHouse/ClickHouse/pull/26545) ([Ky Li](https://github.com/Kylinrix)). + + +### ClickHouse release v21.7, 2021-07-09 + +#### Backward Incompatible Change + +* Improved performance of queries with explicitly defined large sets. Added compatibility setting `legacy_column_name_of_tuple_literal`. It makes sense to set it to `true`, while doing rolling update of cluster from version lower than 21.7 to any higher version. Otherwise distributed queries with explicitly defined sets at `IN` clause may fail during update. [#25371](https://github.com/ClickHouse/ClickHouse/pull/25371) ([Anton Popov](https://github.com/CurtizJ)). +* Forward/backward incompatible change of maximum buffer size in clickhouse-keeper (an experimental alternative to ZooKeeper). Better to do it now (before production), than later. [#25421](https://github.com/ClickHouse/ClickHouse/pull/25421) ([alesapin](https://github.com/alesapin)). + +#### New Feature + +* Support configuration in YAML format as alternative to XML. This closes [#3607](https://github.com/ClickHouse/ClickHouse/issues/3607). [#21858](https://github.com/ClickHouse/ClickHouse/pull/21858) ([BoloniniD](https://github.com/BoloniniD)). +* Provides a way to restore replicated table when the data is (possibly) present, but the ZooKeeper metadata is lost. Resolves [#13458](https://github.com/ClickHouse/ClickHouse/issues/13458). [#13652](https://github.com/ClickHouse/ClickHouse/pull/13652) ([Mike Kot](https://github.com/myrrc)). +* Support structs and maps in Arrow/Parquet/ORC and dictionaries in Arrow input/output formats. Present new setting `output_format_arrow_low_cardinality_as_dictionary`. [#24341](https://github.com/ClickHouse/ClickHouse/pull/24341) ([Kruglov Pavel](https://github.com/Avogar)). +* Added support for `Array` type in dictionaries. [#25119](https://github.com/ClickHouse/ClickHouse/pull/25119) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `bitPositionsToArray`. Closes [#23792](https://github.com/ClickHouse/ClickHouse/issues/23792). Author [Kevin Wan] (@MaxWk). [#25394](https://github.com/ClickHouse/ClickHouse/pull/25394) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dateName` to return names like 'Friday' or 'April'. Author [Daniil Kondratyev] (@dankondr). [#25372](https://github.com/ClickHouse/ClickHouse/pull/25372) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `toJSONString` function to serialize columns to their JSON representations. [#25164](https://github.com/ClickHouse/ClickHouse/pull/25164) ([Amos Bird](https://github.com/amosbird)). +* Now `query_log` has two new columns: `initial_query_start_time`, `initial_query_start_time_microsecond` that record the starting time of a distributed query if any. [#25022](https://github.com/ClickHouse/ClickHouse/pull/25022) ([Amos Bird](https://github.com/amosbird)). +* Add aggregate function `segmentLengthSum`. [#24250](https://github.com/ClickHouse/ClickHouse/pull/24250) ([flynn](https://github.com/ucasfl)). +* Add a new boolean setting `prefer_global_in_and_join` which defaults all IN/JOIN as GLOBAL IN/JOIN. [#23434](https://github.com/ClickHouse/ClickHouse/pull/23434) ([Amos Bird](https://github.com/amosbird)). +* Support `ALTER DELETE` queries for `Join` table engine. [#23260](https://github.com/ClickHouse/ClickHouse/pull/23260) ([foolchi](https://github.com/foolchi)). +* Add `quantileBFloat16` aggregate function as well as the corresponding `quantilesBFloat16` and `medianBFloat16`. It is very simple and fast quantile estimator with relative error not more than 0.390625%. This closes [#16641](https://github.com/ClickHouse/ClickHouse/issues/16641). [#23204](https://github.com/ClickHouse/ClickHouse/pull/23204) ([Ivan Novitskiy](https://github.com/RedClusive)). +* Implement `sequenceNextNode()` function useful for `flow analysis`. [#19766](https://github.com/ClickHouse/ClickHouse/pull/19766) ([achimbab](https://github.com/achimbab)). + +#### Experimental Feature + +* Add support for virtual filesystem over HDFS. [#11058](https://github.com/ClickHouse/ClickHouse/pull/11058) ([overshov](https://github.com/overshov)) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now clickhouse-keeper (an experimental alternative to ZooKeeper) supports ZooKeeper-like `digest` ACLs. [#24448](https://github.com/ClickHouse/ClickHouse/pull/24448) ([alesapin](https://github.com/alesapin)). + +#### Performance Improvement + +* Added optimization that transforms some functions to reading of subcolumns to reduce amount of read data. E.g., statement `col IS NULL` is transformed to reading of subcolumn `col.null`. Optimization can be enabled by setting `optimize_functions_to_subcolumns` which is currently off by default. [#24406](https://github.com/ClickHouse/ClickHouse/pull/24406) ([Anton Popov](https://github.com/CurtizJ)). +* Rewrite more columns to possible alias expressions. This may enable better optimization, such as projections. [#24405](https://github.com/ClickHouse/ClickHouse/pull/24405) ([Amos Bird](https://github.com/amosbird)). +* Index of type `bloom_filter` can be used for expressions with `hasAny` function with constant arrays. This closes: [#24291](https://github.com/ClickHouse/ClickHouse/issues/24291). [#24900](https://github.com/ClickHouse/ClickHouse/pull/24900) ([Vasily Nemkov](https://github.com/Enmk)). +* Add exponential backoff to reschedule read attempt in case RabbitMQ queues are empty. (ClickHouse has support for importing data from RabbitMQ). Closes [#24340](https://github.com/ClickHouse/ClickHouse/issues/24340). [#24415](https://github.com/ClickHouse/ClickHouse/pull/24415) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement + +* Allow to limit bandwidth for replication. Add two Replicated\*MergeTree settings: `max_replicated_fetches_network_bandwidth` and `max_replicated_sends_network_bandwidth` which allows to limit maximum speed of replicated fetches/sends for table. Add two server-wide settings (in `default` user profile): `max_replicated_fetches_network_bandwidth_for_server` and `max_replicated_sends_network_bandwidth_for_server` which limit maximum speed of replication for all tables. The settings are not followed perfectly accurately. Turned off by default. Fixes [#1821](https://github.com/ClickHouse/ClickHouse/issues/1821). [#24573](https://github.com/ClickHouse/ClickHouse/pull/24573) ([alesapin](https://github.com/alesapin)). +* Resource constraints and isolation for ODBC and Library bridges. Use separate `clickhouse-bridge` group and user for bridge processes. Set oom_score_adj so the bridges will be first subjects for OOM killer. Set set maximum RSS to 1 GiB. Closes [#23861](https://github.com/ClickHouse/ClickHouse/issues/23861). [#25280](https://github.com/ClickHouse/ClickHouse/pull/25280) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add standalone `clickhouse-keeper` symlink to the main `clickhouse` binary. Now it's possible to run coordination without the main clickhouse server. [#24059](https://github.com/ClickHouse/ClickHouse/pull/24059) ([alesapin](https://github.com/alesapin)). +* Use global settings for query to `VIEW`. Fixed the behavior when queries to `VIEW` use local settings, that leads to errors if setting on `CREATE VIEW` and `SELECT` were different. As for now, `VIEW` won't use these modified settings, but you can still pass additional settings in `SETTINGS` section of `CREATE VIEW` query. Close [#20551](https://github.com/ClickHouse/ClickHouse/issues/20551). [#24095](https://github.com/ClickHouse/ClickHouse/pull/24095) ([Vladimir](https://github.com/vdimir)). +* On server start, parts with incorrect partition ID would not be ever removed, but always detached. [#25070](https://github.com/ClickHouse/ClickHouse/issues/25070). [#25166](https://github.com/ClickHouse/ClickHouse/pull/25166) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Increase size of background schedule pool to 128 (`background_schedule_pool_size` setting). It allows avoiding replication queue hung on slow zookeeper connection. [#25072](https://github.com/ClickHouse/ClickHouse/pull/25072) ([alesapin](https://github.com/alesapin)). +* Add merge tree setting `max_parts_to_merge_at_once` which limits the number of parts that can be merged in the background at once. Doesn't affect `OPTIMIZE FINAL` query. Fixes [#1820](https://github.com/ClickHouse/ClickHouse/issues/1820). [#24496](https://github.com/ClickHouse/ClickHouse/pull/24496) ([alesapin](https://github.com/alesapin)). +* Allow `NOT IN` operator to be used in partition pruning. [#24894](https://github.com/ClickHouse/ClickHouse/pull/24894) ([Amos Bird](https://github.com/amosbird)). +* Recognize IPv4 addresses like `127.0.1.1` as local. This is controversial and closes [#23504](https://github.com/ClickHouse/ClickHouse/issues/23504). Michael Filimonov will test this feature. [#24316](https://github.com/ClickHouse/ClickHouse/pull/24316) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* ClickHouse database created with MaterializeMySQL (it is an experimental feature) now contains all column comments from the MySQL database that materialized. [#25199](https://github.com/ClickHouse/ClickHouse/pull/25199) ([Storozhuk Kostiantyn](https://github.com/sand6255)). +* Add settings (`connection_auto_close`/`connection_max_tries`/`connection_pool_size`) for MySQL storage engine. [#24146](https://github.com/ClickHouse/ClickHouse/pull/24146) ([Azat Khuzhin](https://github.com/azat)). +* Improve startup time of Distributed engine. [#25663](https://github.com/ClickHouse/ClickHouse/pull/25663) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for Distributed tables. Drop replicas from dirname for internal_replication=true (allows INSERT into Distributed with cluster from any number of replicas, before only 15 replicas was supported, everything more will fail with ENAMETOOLONG while creating directory for async blocks). [#25513](https://github.com/ClickHouse/ClickHouse/pull/25513) ([Azat Khuzhin](https://github.com/azat)). +* Added support `Interval` type for `LowCardinality`. It is needed for intermediate values of some expressions. Closes [#21730](https://github.com/ClickHouse/ClickHouse/issues/21730). [#25410](https://github.com/ClickHouse/ClickHouse/pull/25410) ([Vladimir](https://github.com/vdimir)). +* Add `==` operator on time conditions for `sequenceMatch` and `sequenceCount` functions. For eg: sequenceMatch('(?1)(?t==1)(?2)')(time, data = 1, data = 2). [#25299](https://github.com/ClickHouse/ClickHouse/pull/25299) ([Christophe Kalenzaga](https://github.com/mga-chka)). +* Add settings `http_max_fields`, `http_max_field_name_size`, `http_max_field_value_size`. [#25296](https://github.com/ClickHouse/ClickHouse/pull/25296) ([Ivan](https://github.com/abyss7)). +* Add support for function `if` with `Decimal` and `Int` types on its branches. This closes [#20549](https://github.com/ClickHouse/ClickHouse/issues/20549). This closes [#10142](https://github.com/ClickHouse/ClickHouse/issues/10142). [#25283](https://github.com/ClickHouse/ClickHouse/pull/25283) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update prompt in `clickhouse-client` and display a message when reconnecting. This closes [#10577](https://github.com/ClickHouse/ClickHouse/issues/10577). [#25281](https://github.com/ClickHouse/ClickHouse/pull/25281) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correct memory tracking in aggregate function `topK`. This closes [#25259](https://github.com/ClickHouse/ClickHouse/issues/25259). [#25260](https://github.com/ClickHouse/ClickHouse/pull/25260) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `topLevelDomain` for IDN hosts (i.e. `example.рф`), before it returns empty string for such hosts. [#25103](https://github.com/ClickHouse/ClickHouse/pull/25103) ([Azat Khuzhin](https://github.com/azat)). +* Detect Linux kernel version at runtime (for worked nested epoll, that is required for `async_socket_for_remote`/`use_hedged_requests`, otherwise remote queries may stuck). [#25067](https://github.com/ClickHouse/ClickHouse/pull/25067) ([Azat Khuzhin](https://github.com/azat)). +* For distributed query, when `optimize_skip_unused_shards=1`, allow to skip shard with condition like `(sharding key) IN (one-element-tuple)`. (Tuples with many elements were supported. Tuple with single element did not work because it is parsed as literal). [#24930](https://github.com/ClickHouse/ClickHouse/pull/24930) ([Amos Bird](https://github.com/amosbird)). +* Improved log messages of S3 errors, no more double whitespaces in case of empty keys and buckets. [#24897](https://github.com/ClickHouse/ClickHouse/pull/24897) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Some queries require multi-pass semantic analysis. Try reusing built sets for `IN` in this case. [#24874](https://github.com/ClickHouse/ClickHouse/pull/24874) ([Amos Bird](https://github.com/amosbird)). +* Respect `max_distributed_connections` for `insert_distributed_sync` (otherwise for huge clusters and sync insert it may run out of `max_thread_pool_size`). [#24754](https://github.com/ClickHouse/ClickHouse/pull/24754) ([Azat Khuzhin](https://github.com/azat)). +* Avoid hiding errors like `Limit for rows or bytes to read exceeded` for scalar subqueries. [#24545](https://github.com/ClickHouse/ClickHouse/pull/24545) ([nvartolomei](https://github.com/nvartolomei)). +* Make String-to-Int parser stricter so that `toInt64('+')` will throw. [#24475](https://github.com/ClickHouse/ClickHouse/pull/24475) ([Amos Bird](https://github.com/amosbird)). +* If `SSD_CACHE` is created with DDL query, it can be created only inside `user_files` directory. [#24466](https://github.com/ClickHouse/ClickHouse/pull/24466) ([Maksim Kita](https://github.com/kitaisreal)). +* PostgreSQL support for specifying non default schema for insert queries. Closes [#24149](https://github.com/ClickHouse/ClickHouse/issues/24149). [#24413](https://github.com/ClickHouse/ClickHouse/pull/24413) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix IPv6 addresses resolving (i.e. fixes `select * from remote('[::1]', system.one)`). [#24319](https://github.com/ClickHouse/ClickHouse/pull/24319) ([Azat Khuzhin](https://github.com/azat)). +* Fix trailing whitespaces in FROM clause with subqueries in multiline mode, and also changes the output of the queries slightly in a more human friendly way. [#24151](https://github.com/ClickHouse/ClickHouse/pull/24151) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for Distributed tables. Add ability to split distributed batch on failures (i.e. due to memory limits, corruptions), under `distributed_directory_monitor_split_batch_on_failure` (OFF by default). [#23864](https://github.com/ClickHouse/ClickHouse/pull/23864) ([Azat Khuzhin](https://github.com/azat)). +* Handle column name clashes for `Join` table engine. Closes [#20309](https://github.com/ClickHouse/ClickHouse/issues/20309). [#23769](https://github.com/ClickHouse/ClickHouse/pull/23769) ([Vladimir](https://github.com/vdimir)). +* Display progress for `File` table engine in `clickhouse-local` and on INSERT query in `clickhouse-client` when data is passed to stdin. Closes [#18209](https://github.com/ClickHouse/ClickHouse/issues/18209). [#23656](https://github.com/ClickHouse/ClickHouse/pull/23656) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Bugfixes and improvements of `clickhouse-copier`. Allow to copy tables with different (but compatible schemas). Closes [#9159](https://github.com/ClickHouse/ClickHouse/issues/9159). Added test to copy ReplacingMergeTree. Closes [#22711](https://github.com/ClickHouse/ClickHouse/issues/22711). Support TTL on columns and Data Skipping Indices. It simply removes it to create internal Distributed table (underlying table will have TTL and skipping indices). Closes [#19384](https://github.com/ClickHouse/ClickHouse/issues/19384). Allow to copy MATERIALIZED and ALIAS columns. There are some cases in which it could be helpful (e.g. if this column is in PRIMARY KEY). Now it could be allowed by setting `allow_to_copy_alias_and_materialized_columns` property to true in task configuration. Closes [#9177](https://github.com/ClickHouse/ClickHouse/issues/9177). Closes [#11007] (https://github.com/ClickHouse/ClickHouse/issues/11007). Closes [#9514](https://github.com/ClickHouse/ClickHouse/issues/9514). Added a property `allow_to_drop_target_partitions` in task configuration to drop partition in original table before moving helping tables. Closes [#20957](https://github.com/ClickHouse/ClickHouse/issues/20957). Get rid of `OPTIMIZE DEDUPLICATE` query. This hack was needed, because `ALTER TABLE MOVE PARTITION` was retried many times and plain MergeTree tables don't have deduplication. Closes [#17966](https://github.com/ClickHouse/ClickHouse/issues/17966). Write progress to ZooKeeper node on path `task_path + /status` in JSON format. Closes [#20955](https://github.com/ClickHouse/ClickHouse/issues/20955). Support for ReplicatedTables without arguments. Closes [#24834](https://github.com/ClickHouse/ClickHouse/issues/24834) .[#23518](https://github.com/ClickHouse/ClickHouse/pull/23518) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added sleep with backoff between read retries from S3. [#23461](https://github.com/ClickHouse/ClickHouse/pull/23461) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Respect `insert_allow_materialized_columns` (allows materialized columns) for INSERT into `Distributed` table. [#23349](https://github.com/ClickHouse/ClickHouse/pull/23349) ([Azat Khuzhin](https://github.com/azat)). +* Add ability to push down LIMIT for distributed queries. [#23027](https://github.com/ClickHouse/ClickHouse/pull/23027) ([Azat Khuzhin](https://github.com/azat)). +* Fix zero-copy replication with several S3 volumes (Fixes [#22679](https://github.com/ClickHouse/ClickHouse/issues/22679)). [#22864](https://github.com/ClickHouse/ClickHouse/pull/22864) ([ianton-ru](https://github.com/ianton-ru)). +* Resolve the actual port number bound when a user requests any available port from the operating system to show it in the log message. [#25569](https://github.com/ClickHouse/ClickHouse/pull/25569) ([bnaecker](https://github.com/bnaecker)). +* Fixed case, when sometimes conversion of postgres arrays resulted in String data type, not n-dimensional array, because `attndims` works incorrectly in some cases. Closes [#24804](https://github.com/ClickHouse/ClickHouse/issues/24804). [#25538](https://github.com/ClickHouse/ClickHouse/pull/25538) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix convertion of DateTime with timezone for MySQL, PostgreSQL, ODBC. Closes [#5057](https://github.com/ClickHouse/ClickHouse/issues/5057). [#25528](https://github.com/ClickHouse/ClickHouse/pull/25528) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Distinguish KILL MUTATION for different tables (fixes unexpected `Cancelled mutating parts` error). [#25025](https://github.com/ClickHouse/ClickHouse/pull/25025) ([Azat Khuzhin](https://github.com/azat)). +* Allow to declare S3 disk at root of bucket (S3 virtual filesystem is an experimental feature under development). [#24898](https://github.com/ClickHouse/ClickHouse/pull/24898) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Enable reading of subcolumns (e.g. components of Tuples) for distributed tables. [#24472](https://github.com/ClickHouse/ClickHouse/pull/24472) ([Anton Popov](https://github.com/CurtizJ)). +* A feature for MySQL compatibility protocol: make `user` function to return correct output. Closes [#25697](https://github.com/ClickHouse/ClickHouse/pull/25697). [#25697](https://github.com/ClickHouse/ClickHouse/pull/25697) ([sundyli](https://github.com/sundy-li)). + +#### Bug Fix + +* Improvement for backward compatibility. Use old modulo function version when used in partition key. Closes [#23508](https://github.com/ClickHouse/ClickHouse/issues/23508). [#24157](https://github.com/ClickHouse/ClickHouse/pull/24157) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix extremely rare bug on low-memory servers which can lead to the inability to perform merges without restart. Possibly fixes [#24603](https://github.com/ClickHouse/ClickHouse/issues/24603). [#24872](https://github.com/ClickHouse/ClickHouse/pull/24872) ([alesapin](https://github.com/alesapin)). +* Fix extremely rare error `Tagging already tagged part` in replication queue during concurrent `alter move/replace partition`. Possibly fixes [#22142](https://github.com/ClickHouse/ClickHouse/issues/22142). [#24961](https://github.com/ClickHouse/ClickHouse/pull/24961) ([alesapin](https://github.com/alesapin)). +* Fix potential crash when calculating aggregate function states by aggregation of aggregate function states of other aggregate functions (not a practical use case). See [#24523](https://github.com/ClickHouse/ClickHouse/issues/24523). [#25015](https://github.com/ClickHouse/ClickHouse/pull/25015) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed the behavior when query `SYSTEM RESTART REPLICA` or `SYSTEM SYNC REPLICA` does not finish. This was detected on server with extremely low amount of RAM. [#24457](https://github.com/ClickHouse/ClickHouse/pull/24457) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix bug which can lead to ZooKeeper client hung inside clickhouse-server. [#24721](https://github.com/ClickHouse/ClickHouse/pull/24721) ([alesapin](https://github.com/alesapin)). +* If ZooKeeper connection was lost and replica was cloned after restoring the connection, its replication queue might contain outdated entries. Fixed failed assertion when replication queue contains intersecting virtual parts. It may rarely happen if some data part was lost. Print error in log instead of terminating. [#24777](https://github.com/ClickHouse/ClickHouse/pull/24777) ([tavplubix](https://github.com/tavplubix)). +* Fix lost `WHERE` condition in expression-push-down optimization of query plan (setting `query_plan_filter_push_down = 1` by default). Fixes [#25368](https://github.com/ClickHouse/ClickHouse/issues/25368). [#25370](https://github.com/ClickHouse/ClickHouse/pull/25370) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which can lead to intersecting parts after merges with TTL: `Part all_40_40_0 is covered by all_40_40_1 but should be merged into all_40_41_1. This shouldn't happen often.`. [#25549](https://github.com/ClickHouse/ClickHouse/pull/25549) ([alesapin](https://github.com/alesapin)). +* On ZooKeeper connection loss `ReplicatedMergeTree` table might wait for background operations to complete before trying to reconnect. It's fixed, now background operations are stopped forcefully. [#25306](https://github.com/ClickHouse/ClickHouse/pull/25306) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Key expression contains comparison between inconvertible types` for queries with `ARRAY JOIN` in case if array is used in primary key. Fixes [#8247](https://github.com/ClickHouse/ClickHouse/issues/8247). [#25546](https://github.com/ClickHouse/ClickHouse/pull/25546) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong totals for query `WITH TOTALS` and `WITH FILL`. Fixes [#20872](https://github.com/ClickHouse/ClickHouse/issues/20872). [#25539](https://github.com/ClickHouse/ClickHouse/pull/25539) ([Anton Popov](https://github.com/CurtizJ)). +* Fix data race when querying `system.clusters` while reloading the cluster configuration at the same time. [#25737](https://github.com/ClickHouse/ClickHouse/pull/25737) ([Amos Bird](https://github.com/amosbird)). +* Fixed `No such file or directory` error on moving `Distributed` table between databases. Fixes [#24971](https://github.com/ClickHouse/ClickHouse/issues/24971). [#25667](https://github.com/ClickHouse/ClickHouse/pull/25667) ([tavplubix](https://github.com/tavplubix)). +* `REPLACE PARTITION` might be ignored in rare cases if the source partition was empty. It's fixed. Fixes [#24869](https://github.com/ClickHouse/ClickHouse/issues/24869). [#25665](https://github.com/ClickHouse/ClickHouse/pull/25665) ([tavplubix](https://github.com/tavplubix)). +* Fixed a bug in `Replicated` database engine that might rarely cause some replica to skip enqueued DDL query. [#24805](https://github.com/ClickHouse/ClickHouse/pull/24805) ([tavplubix](https://github.com/tavplubix)). +* Fix null pointer dereference in `EXPLAIN AST` without query. [#25631](https://github.com/ClickHouse/ClickHouse/pull/25631) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix waiting of automatic dropping of empty parts. It could lead to full filling of background pool and stuck of replication. [#23315](https://github.com/ClickHouse/ClickHouse/pull/23315) ([Anton Popov](https://github.com/CurtizJ)). +* Fix restore of a table stored in S3 virtual filesystem (it is an experimental feature not ready for production). [#25601](https://github.com/ClickHouse/ClickHouse/pull/25601) ([ianton-ru](https://github.com/ianton-ru)). +* Fix nullptr dereference in `Arrow` format when using `Decimal256`. Add `Decimal256` support for `Arrow` format. [#25531](https://github.com/ClickHouse/ClickHouse/pull/25531) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix excessive underscore before the names of the preprocessed configuration files. [#25431](https://github.com/ClickHouse/ClickHouse/pull/25431) ([Vitaly Baranov](https://github.com/vitlibar)). +* A fix for `clickhouse-copier` tool: Fix segfault when sharding_key is absent in task config for copier. [#25419](https://github.com/ClickHouse/ClickHouse/pull/25419) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `REPLACE` column transformer when used in DDL by correctly quoting the formated query. This fixes [#23925](https://github.com/ClickHouse/ClickHouse/issues/23925). [#25391](https://github.com/ClickHouse/ClickHouse/pull/25391) ([Amos Bird](https://github.com/amosbird)). +* Fix the possibility of non-deterministic behaviour of the `quantileDeterministic` function and similar. This closes [#20480](https://github.com/ClickHouse/ClickHouse/issues/20480). [#25313](https://github.com/ClickHouse/ClickHouse/pull/25313) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `SimpleAggregateFunction(LowCardinality)` for `SummingMergeTree`. Fixes [#25134](https://github.com/ClickHouse/ClickHouse/issues/25134). [#25300](https://github.com/ClickHouse/ClickHouse/pull/25300) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix logical error with exception message "Cannot sum Array/Tuple in min/maxMap". [#25298](https://github.com/ClickHouse/ClickHouse/pull/25298) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix error `Bad cast from type DB::ColumnLowCardinality to DB::ColumnVector` for queries where `LowCardinality` argument was used for IN (this bug appeared in 21.6). Fixes [#25187](https://github.com/ClickHouse/ClickHouse/issues/25187). [#25290](https://github.com/ClickHouse/ClickHouse/pull/25290) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix incorrect behaviour of `joinGetOrNull` with not-nullable columns. This fixes [#24261](https://github.com/ClickHouse/ClickHouse/issues/24261). [#25288](https://github.com/ClickHouse/ClickHouse/pull/25288) ([Amos Bird](https://github.com/amosbird)). +* Fix incorrect behaviour and UBSan report in big integers. In previous versions `CAST(1e19 AS UInt128)` returned zero. [#25279](https://github.com/ClickHouse/ClickHouse/pull/25279) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed an error which occurred while inserting a subset of columns using CSVWithNames format. Fixes [#25129](https://github.com/ClickHouse/ClickHouse/issues/25129). [#25169](https://github.com/ClickHouse/ClickHouse/pull/25169) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do not use table's projection for `SELECT` with `FINAL`. It is not supported yet. [#25163](https://github.com/ClickHouse/ClickHouse/pull/25163) ([Amos Bird](https://github.com/amosbird)). +* Fix possible parts loss after updating up to 21.5 in case table used `UUID` in partition key. (It is not recommended to use `UUID` in partition key). Fixes [#25070](https://github.com/ClickHouse/ClickHouse/issues/25070). [#25127](https://github.com/ClickHouse/ClickHouse/pull/25127) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in query with cross join and `joined_subquery_requires_alias = 0`. Fixes [#24011](https://github.com/ClickHouse/ClickHouse/issues/24011). [#25082](https://github.com/ClickHouse/ClickHouse/pull/25082) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug with constant maps in mapContains function that lead to error `empty column was returned by function mapContains`. Closes [#25077](https://github.com/ClickHouse/ClickHouse/issues/25077). [#25080](https://github.com/ClickHouse/ClickHouse/pull/25080) ([Kruglov Pavel](https://github.com/Avogar)). +* Remove possibility to create tables with columns referencing themselves like `a UInt32 ALIAS a + 1` or `b UInt32 MATERIALIZED b`. Fixes [#24910](https://github.com/ClickHouse/ClickHouse/issues/24910), [#24292](https://github.com/ClickHouse/ClickHouse/issues/24292). [#25059](https://github.com/ClickHouse/ClickHouse/pull/25059) ([alesapin](https://github.com/alesapin)). +* Fix wrong result when using aggregate projection with *not empty* `GROUP BY` key to execute query with `GROUP BY` by *empty* key. [#25055](https://github.com/ClickHouse/ClickHouse/pull/25055) ([Amos Bird](https://github.com/amosbird)). +* Fix serialization of splitted nested messages in Protobuf format. This PR fixes [#24647](https://github.com/ClickHouse/ClickHouse/issues/24647). [#25000](https://github.com/ClickHouse/ClickHouse/pull/25000) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix limit/offset settings for distributed queries (ignore on the remote nodes). [#24940](https://github.com/ClickHouse/ClickHouse/pull/24940) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible heap-buffer-overflow in `Arrow` format. [#24922](https://github.com/ClickHouse/ClickHouse/pull/24922) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed possible error 'Cannot read from istream at offset 0' when reading a file from DiskS3 (S3 virtual filesystem is an experimental feature under development that should not be used in production). [#24885](https://github.com/ClickHouse/ClickHouse/pull/24885) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix "Missing columns" exception when joining Distributed Materialized View. [#24870](https://github.com/ClickHouse/ClickHouse/pull/24870) ([Azat Khuzhin](https://github.com/azat)). +* Allow `NULL` values in postgresql compatibility protocol. Closes [#22622](https://github.com/ClickHouse/ClickHouse/issues/22622). [#24857](https://github.com/ClickHouse/ClickHouse/pull/24857) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug when exception `Mutation was killed` can be thrown to the client on mutation wait when mutation not loaded into memory yet. [#24809](https://github.com/ClickHouse/ClickHouse/pull/24809) ([alesapin](https://github.com/alesapin)). +* Fixed bug in deserialization of random generator state with might cause some data types such as `AggregateFunction(groupArraySample(N), T))` to behave in a non-deterministic way. [#24538](https://github.com/ClickHouse/ClickHouse/pull/24538) ([tavplubix](https://github.com/tavplubix)). +* Disallow building uniqXXXXStates of other aggregation states. [#24523](https://github.com/ClickHouse/ClickHouse/pull/24523) ([Raúl Marín](https://github.com/Algunenano)). Then allow it back by actually eliminating the root cause of the related issue. ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix usage of tuples in `CREATE .. AS SELECT` queries. [#24464](https://github.com/ClickHouse/ClickHouse/pull/24464) ([Anton Popov](https://github.com/CurtizJ)). +* Fix computation of total bytes in `Buffer` table. In current ClickHouse version total_writes.bytes counter decreases too much during the buffer flush. It leads to counter overflow and totalBytes return something around 17.44 EB some time after the flush. [#24450](https://github.com/ClickHouse/ClickHouse/pull/24450) ([DimasKovas](https://github.com/DimasKovas)). +* Fix incorrect information about the monotonicity of toWeek function. This fixes [#24422](https://github.com/ClickHouse/ClickHouse/issues/24422) . This bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/5212 , and was exposed later by smarter partition pruner. [#24446](https://github.com/ClickHouse/ClickHouse/pull/24446) ([Amos Bird](https://github.com/amosbird)). +* When user authentication is managed by LDAP. Fixed potential deadlock that can happen during LDAP role (re)mapping, when LDAP group is mapped to a nonexistent local role. [#24431](https://github.com/ClickHouse/ClickHouse/pull/24431) ([Denis Glazachev](https://github.com/traceon)). +* In "multipart/form-data" message consider the CRLF preceding a boundary as part of it. Fixes [#23905](https://github.com/ClickHouse/ClickHouse/issues/23905). [#24399](https://github.com/ClickHouse/ClickHouse/pull/24399) ([Ivan](https://github.com/abyss7)). +* Fix drop partition with intersect fake parts. In rare cases there might be parts with mutation version greater than current block number. [#24321](https://github.com/ClickHouse/ClickHouse/pull/24321) ([Amos Bird](https://github.com/amosbird)). +* Fixed a bug in moving Materialized View from Ordinary to Atomic database (`RENAME TABLE` query). Now inner table is moved to new database together with Materialized View. Fixes [#23926](https://github.com/ClickHouse/ClickHouse/issues/23926). [#24309](https://github.com/ClickHouse/ClickHouse/pull/24309) ([tavplubix](https://github.com/tavplubix)). +* Allow empty HTTP headers. Fixes [#23901](https://github.com/ClickHouse/ClickHouse/issues/23901). [#24285](https://github.com/ClickHouse/ClickHouse/pull/24285) ([Ivan](https://github.com/abyss7)). +* Correct processing of mutations (ALTER UPDATE/DELETE) in Memory tables. Closes [#24274](https://github.com/ClickHouse/ClickHouse/issues/24274). [#24275](https://github.com/ClickHouse/ClickHouse/pull/24275) ([flynn](https://github.com/ucasfl)). +* Make column LowCardinality property in JOIN output the same as in the input, close [#23351](https://github.com/ClickHouse/ClickHouse/issues/23351), close [#20315](https://github.com/ClickHouse/ClickHouse/issues/20315). [#24061](https://github.com/ClickHouse/ClickHouse/pull/24061) ([Vladimir](https://github.com/vdimir)). +* A fix for Kafka tables. Fix the bug in failover behavior when Engine = Kafka was not able to start consumption if the same consumer had an empty assignment previously. Closes [#21118](https://github.com/ClickHouse/ClickHouse/issues/21118). [#21267](https://github.com/ClickHouse/ClickHouse/pull/21267) ([filimonov](https://github.com/filimonov)). + +#### Build/Testing/Packaging Improvement + +* Add `darwin-aarch64` (Mac M1 / Apple Silicon) builds in CI [#25560](https://github.com/ClickHouse/ClickHouse/pull/25560) ([Ivan](https://github.com/abyss7)) and put the links to the docs and website ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Adds cross-platform embedding of binary resources into executables. It works on Illumos. [#25146](https://github.com/ClickHouse/ClickHouse/pull/25146) ([bnaecker](https://github.com/bnaecker)). +* Add join related options to stress tests to improve fuzzing. [#25200](https://github.com/ClickHouse/ClickHouse/pull/25200) ([Vladimir](https://github.com/vdimir)). +* Enable build with s3 module in osx [#25217](https://github.com/ClickHouse/ClickHouse/issues/25217). [#25218](https://github.com/ClickHouse/ClickHouse/pull/25218) ([kevin wan](https://github.com/MaxWk)). +* Add integration test cases to cover JDBC bridge. [#25047](https://github.com/ClickHouse/ClickHouse/pull/25047) ([Zhichun Wu](https://github.com/zhicwu)). +* Integration tests configuration has special treatment for dictionaries. Removed remaining dictionaries manual setup. [#24728](https://github.com/ClickHouse/ClickHouse/pull/24728) ([Ilya Yatsishin](https://github.com/qoega)). +* Add libfuzzer tests for YAMLParser class. [#24480](https://github.com/ClickHouse/ClickHouse/pull/24480) ([BoloniniD](https://github.com/BoloniniD)). +* Ubuntu 20.04 is now used to run integration tests, docker-compose version used to run integration tests is updated to 1.28.2. Environment variables now take effect on docker-compose. Rework test_dictionaries_all_layouts_separate_sources to allow parallel run. [#20393](https://github.com/ClickHouse/ClickHouse/pull/20393) ([Ilya Yatsishin](https://github.com/qoega)). +* Fix TOCTOU error in installation script. [#25277](https://github.com/ClickHouse/ClickHouse/pull/25277) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release 21.6, 2021-06-05 + +#### Backward Incompatible Change +* uniqState / uniqHLL12State / uniqCombinedState / uniqCombined64State produce incompatible states with `UUID` type. [#33607](https://github.com/ClickHouse/ClickHouse/issues/33607). + +#### Upgrade Notes + +* `zstd` compression library is updated to v1.5.0. You may get messages about "checksum does not match" in replication. These messages are expected due to update of compression algorithm and you can ignore them. These messages are informational and do not indicate any kinds of undesired behaviour. +* The setting `compile_expressions` is enabled by default. Although it has been heavily tested on variety of scenarios, if you find some undesired behaviour on your servers, you can try turning this setting off. +* Values of `UUID` type cannot be compared with integer. For example, instead of writing `uuid != 0` type `uuid != '00000000-0000-0000-0000-000000000000'`. + +#### New Feature + +* Add Postgres-like cast operator (`::`). E.g.: `[1, 2]::Array(UInt8)`, `0.1::Decimal(4, 4)`, `number::UInt16`. [#23871](https://github.com/ClickHouse/ClickHouse/pull/23871) ([Anton Popov](https://github.com/CurtizJ)). +* Make big integers production ready. Add support for `UInt128` data type. Fix known issues with the `Decimal256` data type. Support big integers in dictionaries. Support `gcd`/`lcm` functions for big integers. Support big integers in array search and conditional functions. Support `LowCardinality(UUID)`. Support big integers in `generateRandom` table function and `clickhouse-obfuscator`. Fix error with returning `UUID` from scalar subqueries. This fixes [#7834](https://github.com/ClickHouse/ClickHouse/issues/7834). This fixes [#23936](https://github.com/ClickHouse/ClickHouse/issues/23936). This fixes [#4176](https://github.com/ClickHouse/ClickHouse/issues/4176). This fixes [#24018](https://github.com/ClickHouse/ClickHouse/issues/24018). Backward incompatible change: values of `UUID` type cannot be compared with integer. For example, instead of writing `uuid != 0` type `uuid != '00000000-0000-0000-0000-000000000000'`. [#23631](https://github.com/ClickHouse/ClickHouse/pull/23631) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `Array` data type for inserting and selecting data in `Arrow`, `Parquet` and `ORC` formats. [#21770](https://github.com/ClickHouse/ClickHouse/pull/21770) ([taylor12805](https://github.com/taylor12805)). +* Implement table comments. Closes [#23225](https://github.com/ClickHouse/ClickHouse/issues/23225). [#23548](https://github.com/ClickHouse/ClickHouse/pull/23548) ([flynn](https://github.com/ucasFL)). +* Support creating dictionaries with DDL queries in `clickhouse-local`. Closes [#22354](https://github.com/ClickHouse/ClickHouse/issues/22354). Added support for `DETACH DICTIONARY PERMANENTLY`. Added support for `EXCHANGE DICTIONARIES` for `Atomic` database engine. Added support for moving dictionaries between databases using `RENAME DICTIONARY`. [#23436](https://github.com/ClickHouse/ClickHouse/pull/23436) ([Maksim Kita](https://github.com/kitaisreal)). +* Add aggregate function `uniqTheta` to support [Theta Sketch](https://datasketches.apache.org/docs/Theta/ThetaSketchFramework.html) in ClickHouse. [#23894](https://github.com/ClickHouse/ClickHouse/pull/23894). [#22609](https://github.com/ClickHouse/ClickHouse/pull/22609) ([Ping Yu](https://github.com/pingyu)). +* Add function `splitByRegexp`. [#24077](https://github.com/ClickHouse/ClickHouse/pull/24077) ([abel-cheng](https://github.com/abel-cheng)). +* Add function `arrayProduct` which accept an array as the parameter, and return the product of all the elements in array. Closes [#21613](https://github.com/ClickHouse/ClickHouse/issues/21613). [#23782](https://github.com/ClickHouse/ClickHouse/pull/23782) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `thread_name` column in `system.stack_trace`. This closes [#23256](https://github.com/ClickHouse/ClickHouse/issues/23256). [#24124](https://github.com/ClickHouse/ClickHouse/pull/24124) ([abel-cheng](https://github.com/abel-cheng)). +* If `insert_null_as_default` = 1, insert default values instead of NULL in `INSERT ... SELECT` and `INSERT ... SELECT ... UNION ALL ...` queries. Closes [#22832](https://github.com/ClickHouse/ClickHouse/issues/22832). [#23524](https://github.com/ClickHouse/ClickHouse/pull/23524) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for progress indication in `clickhouse-local` with `--progress` option. [#23196](https://github.com/ClickHouse/ClickHouse/pull/23196) ([Egor Savin](https://github.com/Amesaru)). +* Add support for HTTP compression (determined by `Content-Encoding` HTTP header) in `http` dictionary source. This fixes [#8912](https://github.com/ClickHouse/ClickHouse/issues/8912). [#23946](https://github.com/ClickHouse/ClickHouse/pull/23946) ([FArthur-cmd](https://github.com/FArthur-cmd)). +* Added `SYSTEM QUERY RELOAD MODEL`, `SYSTEM QUERY RELOAD MODELS`. Closes [#18722](https://github.com/ClickHouse/ClickHouse/issues/18722). [#23182](https://github.com/ClickHouse/ClickHouse/pull/23182) ([Maksim Kita](https://github.com/kitaisreal)). +* Add setting `json` (boolean, 0 by default) for `EXPLAIN PLAN` query. When enabled, query output will be a single `JSON` row. It is recommended to use `TSVRaw` format to avoid unnecessary escaping. [#23082](https://github.com/ClickHouse/ClickHouse/pull/23082) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add setting `indexes` (boolean, disabled by default) to `EXPLAIN PIPELINE` query. When enabled, shows used indexes, number of filtered parts and granules for every index applied. Supported for `MergeTree*` tables. [#22352](https://github.com/ClickHouse/ClickHouse/pull/22352) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* LDAP: implemented user DN detection functionality to use when mapping Active Directory groups to ClickHouse roles. [#22228](https://github.com/ClickHouse/ClickHouse/pull/22228) ([Denis Glazachev](https://github.com/traceon)). +* New aggregate function `deltaSumTimestamp` for summing the difference between consecutive rows while maintaining ordering during merge by storing timestamps. [#21888](https://github.com/ClickHouse/ClickHouse/pull/21888) ([Russ Frank](https://github.com/rf)). +* Added less secure IMDS credentials provider for S3 which works under docker correctly. [#21852](https://github.com/ClickHouse/ClickHouse/pull/21852) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add back `indexHint` function. This is for [#21238](https://github.com/ClickHouse/ClickHouse/issues/21238). This reverts [#9542](https://github.com/ClickHouse/ClickHouse/pull/9542). This fixes [#9540](https://github.com/ClickHouse/ClickHouse/issues/9540). [#21304](https://github.com/ClickHouse/ClickHouse/pull/21304) ([Amos Bird](https://github.com/amosbird)). + +#### Experimental Feature + +* Add `PROJECTION` support for `MergeTree*` tables. [#20202](https://github.com/ClickHouse/ClickHouse/pull/20202) ([Amos Bird](https://github.com/amosbird)). + +#### Performance Improvement + +* Enable `compile_expressions` setting by default. When this setting enabled, compositions of simple functions and operators will be compiled to native code with LLVM at runtime. [#8482](https://github.com/ClickHouse/ClickHouse/pull/8482) ([Maksim Kita](https://github.com/kitaisreal), [alexey-milovidov](https://github.com/alexey-milovidov)). Note: if you feel in trouble, turn this option off. +* Update `re2` library. Performance of regular expressions matching is improved. Also this PR adds compatibility with gcc-11. [#24196](https://github.com/ClickHouse/ClickHouse/pull/24196) ([Raúl Marín](https://github.com/Algunenano)). +* ORC input format reading by stripe instead of reading entire table into memory by once which is cost memory when file size is huge. [#23102](https://github.com/ClickHouse/ClickHouse/pull/23102) ([Chao Ma](https://github.com/godliness)). +* Fusion of aggregate functions `sum`, `count` and `avg` in a query into single aggregate function. The optimization is controlled with the `optimize_fuse_sum_count_avg` setting. This is implemented with a new aggregate function `sumCount`. This function returns a tuple of two fields: `sum` and `count`. [#21337](https://github.com/ClickHouse/ClickHouse/pull/21337) ([hexiaoting](https://github.com/hexiaoting)). +* Update `zstd` to v1.5.0. The performance of compression is improved for single digits percentage. [#24135](https://github.com/ClickHouse/ClickHouse/pull/24135) ([Raúl Marín](https://github.com/Algunenano)). Note: you may get messages about "checksum does not match" in replication. These messages are expected due to update of compression algorithm and you can ignore them. +* Improved performance of `Buffer` tables: do not acquire lock for total_bytes/total_rows for `Buffer` engine. [#24066](https://github.com/ClickHouse/ClickHouse/pull/24066) ([Azat Khuzhin](https://github.com/azat)). +* Preallocate support for hashed/sparse_hashed dictionaries is returned. [#23979](https://github.com/ClickHouse/ClickHouse/pull/23979) ([Azat Khuzhin](https://github.com/azat)). +* Enable `async_socket_for_remote` by default (lower amount of threads in querying Distributed tables with large fanout). [#23683](https://github.com/ClickHouse/ClickHouse/pull/23683) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +#### Improvement + +* Add `_partition_value` virtual column to MergeTree table family. It can be used to prune partition in a deterministic way. It's needed to implement partition matcher for mutations. [#23673](https://github.com/ClickHouse/ClickHouse/pull/23673) ([Amos Bird](https://github.com/amosbird)). +* Added `region` parameter for S3 storage and disk. [#23846](https://github.com/ClickHouse/ClickHouse/pull/23846) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Allow configuring different log levels for different logging channels. Closes [#19569](https://github.com/ClickHouse/ClickHouse/issues/19569). [#23857](https://github.com/ClickHouse/ClickHouse/pull/23857) ([filimonov](https://github.com/filimonov)). +* Keep default timezone on `DateTime` operations if it was not provided explicitly. For example, if you add one second to a value of `DateTime` type without timezone it will remain `DateTime` without timezone. In previous versions the value of default timezone was placed to the returned data type explicitly so it becomes DateTime('something'). This closes [#4854](https://github.com/ClickHouse/ClickHouse/issues/4854). [#23392](https://github.com/ClickHouse/ClickHouse/pull/23392) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow user to specify empty string instead of database name for `MySQL` storage. Default database will be used for queries. In previous versions it was working for SELECT queries and not support for INSERT was also added. This closes [#19281](https://github.com/ClickHouse/ClickHouse/issues/19281). This can be useful working with `Sphinx` or other MySQL-compatible foreign databases. [#23319](https://github.com/ClickHouse/ClickHouse/pull/23319) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `quantile(s)TDigest`. Added special handling of singleton centroids according to tdunning/t-digest 3.2+. Also a bug with over-compression of centroids in implementation of earlier version of the algorithm was fixed. [#23314](https://github.com/ClickHouse/ClickHouse/pull/23314) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Function `now64` now supports optional timezone argument. [#24091](https://github.com/ClickHouse/ClickHouse/pull/24091) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix the case when a progress bar in interactive mode in clickhouse-client that appear in the middle of the data may rewrite some parts of visible data in terminal. This closes [#19283](https://github.com/ClickHouse/ClickHouse/issues/19283). [#23050](https://github.com/ClickHouse/ClickHouse/pull/23050) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix crash when memory allocation fails in simdjson. https://github.com/simdjson/simdjson/pull/1567 . Mark as improvement because it's a very rare bug. [#24147](https://github.com/ClickHouse/ClickHouse/pull/24147) ([Amos Bird](https://github.com/amosbird)). +* Preserve dictionaries until storage shutdown (this will avoid possible `external dictionary 'DICT' not found` errors at server shutdown during final flush of the `Buffer` engine). [#24068](https://github.com/ClickHouse/ClickHouse/pull/24068) ([Azat Khuzhin](https://github.com/azat)). +* Flush `Buffer` tables before shutting down tables (within one database), to avoid discarding blocks due to underlying table had been already detached (and `Destination table default.a_data_01870 doesn't exist. Block of data is discarded` error in the log). [#24067](https://github.com/ClickHouse/ClickHouse/pull/24067) ([Azat Khuzhin](https://github.com/azat)). +* Now `prefer_column_name_to_alias = 1` will also favor column names for `group by`, `having` and `order by`. This fixes [#23882](https://github.com/ClickHouse/ClickHouse/issues/23882). [#24022](https://github.com/ClickHouse/ClickHouse/pull/24022) ([Amos Bird](https://github.com/amosbird)). +* Add support for `ORDER BY WITH FILL` with `DateTime64`. [#24016](https://github.com/ClickHouse/ClickHouse/pull/24016) ([kevin wan](https://github.com/MaxWk)). +* Enable `DateTime64` to be a version column in `ReplacingMergeTree`. [#23992](https://github.com/ClickHouse/ClickHouse/pull/23992) ([kevin wan](https://github.com/MaxWk)). +* Log information about OS name, kernel version and CPU architecture on server startup. [#23988](https://github.com/ClickHouse/ClickHouse/pull/23988) ([Azat Khuzhin](https://github.com/azat)). +* Support specifying table schema for `postgresql` dictionary source. Closes [#23958](https://github.com/ClickHouse/ClickHouse/issues/23958). [#23980](https://github.com/ClickHouse/ClickHouse/pull/23980) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add hints for names of `Enum` elements (suggest names in case of typos). Closes [#17112](https://github.com/ClickHouse/ClickHouse/issues/17112). [#23919](https://github.com/ClickHouse/ClickHouse/pull/23919) ([flynn](https://github.com/ucasFL)). +* Measure found rate (the percentage for which the value was found) for dictionaries (see `found_rate` in `system.dictionaries`). [#23916](https://github.com/ClickHouse/ClickHouse/pull/23916) ([Azat Khuzhin](https://github.com/azat)). +* Allow to add specific queue settings via table settng `rabbitmq_queue_settings_list`. (Closes [#23737](https://github.com/ClickHouse/ClickHouse/issues/23737) and [#23918](https://github.com/ClickHouse/ClickHouse/issues/23918)). Allow user to control all RabbitMQ setup: if table setting `rabbitmq_queue_consume` is set to `1` - RabbitMQ table engine will only connect to specified queue and will not perform any RabbitMQ consumer-side setup like declaring exchange, queues, bindings. (Closes [#21757](https://github.com/ClickHouse/ClickHouse/issues/21757)). Add proper cleanup when RabbitMQ table is dropped - delete queues, which the table has declared and all bound exchanges - if they were created by the table. [#23887](https://github.com/ClickHouse/ClickHouse/pull/23887) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `broken_data_files`/`broken_data_compressed_bytes` into `system.distribution_queue`. Add metric for number of files for asynchronous insertion into Distributed tables that has been marked as broken (`BrokenDistributedFilesToInsert`). [#23885](https://github.com/ClickHouse/ClickHouse/pull/23885) ([Azat Khuzhin](https://github.com/azat)). +* Querying `system.tables` does not go to ZooKeeper anymore. [#23793](https://github.com/ClickHouse/ClickHouse/pull/23793) ([Fuwang Hu](https://github.com/fuwhu)). +* Respect `lock_acquire_timeout_for_background_operations` for `OPTIMIZE` queries. [#23623](https://github.com/ClickHouse/ClickHouse/pull/23623) ([Azat Khuzhin](https://github.com/azat)). +* Possibility to change `S3` disk settings in runtime via new `SYSTEM RESTART DISK` SQL command. [#23429](https://github.com/ClickHouse/ClickHouse/pull/23429) ([Pavel Kovalenko](https://github.com/Jokser)). +* If user applied a misconfiguration by mistakenly setting `max_distributed_connections` to value zero, every query to a `Distributed` table will throw exception with a message containing "logical error". But it's really an expected behaviour, not a logical error, so the exception message was slightly incorrect. It also triggered checks in our CI enviroment that ensures that no logical errors ever happen. Instead we will treat `max_distributed_connections` misconfigured to zero as the minimum possible value (one). [#23348](https://github.com/ClickHouse/ClickHouse/pull/23348) ([Azat Khuzhin](https://github.com/azat)). +* Disable `min_bytes_to_use_mmap_io` by default. [#23322](https://github.com/ClickHouse/ClickHouse/pull/23322) ([Azat Khuzhin](https://github.com/azat)). +* Support `LowCardinality` nullability with `join_use_nulls`, close [#15101](https://github.com/ClickHouse/ClickHouse/issues/15101). [#23237](https://github.com/ClickHouse/ClickHouse/pull/23237) ([vdimir](https://github.com/vdimir)). +* Added possibility to restore `MergeTree` parts to `detached` directory for `S3` disk. [#23112](https://github.com/ClickHouse/ClickHouse/pull/23112) ([Pavel Kovalenko](https://github.com/Jokser)). +* Retries on HTTP connection drops in S3. [#22988](https://github.com/ClickHouse/ClickHouse/pull/22988) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add settings `external_storage_max_read_rows` and `external_storage_max_read_rows` for MySQL table engine, dictionary source and MaterializeMySQL minor data fetches. [#22697](https://github.com/ClickHouse/ClickHouse/pull/22697) ([TCeason](https://github.com/TCeason)). +* `MaterializeMySQL` (experimental feature): Previously, MySQL 5.7.9 was not supported due to SQL incompatibility. Now leave MySQL parameter verification to the MaterializeMySQL. [#23413](https://github.com/ClickHouse/ClickHouse/pull/23413) ([TCeason](https://github.com/TCeason)). +* Enable reading of subcolumns for distributed tables. [#24472](https://github.com/ClickHouse/ClickHouse/pull/24472) ([Anton Popov](https://github.com/CurtizJ)). +* Fix usage of tuples in `CREATE .. AS SELECT` queries. [#24464](https://github.com/ClickHouse/ClickHouse/pull/24464) ([Anton Popov](https://github.com/CurtizJ)). +* Support for `Parquet` format in `Kafka` tables. [#23412](https://github.com/ClickHouse/ClickHouse/pull/23412) ([Chao Ma](https://github.com/godliness)). + +#### Bug Fix + +* Use old modulo function version when used in partition key and primary key. Closes [#23508](https://github.com/ClickHouse/ClickHouse/issues/23508). [#24157](https://github.com/ClickHouse/ClickHouse/pull/24157) ([Kseniia Sumarokova](https://github.com/kssenii)). It was a source of backward incompatibility in previous releases. +* Fixed the behavior when query `SYSTEM RESTART REPLICA` or `SYSTEM SYNC REPLICA` is being processed infinitely. This was detected on server with extremely little amount of RAM. [#24457](https://github.com/ClickHouse/ClickHouse/pull/24457) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix incorrect monotonicity of `toWeek` function. This fixes [#24422](https://github.com/ClickHouse/ClickHouse/issues/24422) . This bug was introduced in [#5212](https://github.com/ClickHouse/ClickHouse/pull/5212), and was exposed later by smarter partition pruner. [#24446](https://github.com/ClickHouse/ClickHouse/pull/24446) ([Amos Bird](https://github.com/amosbird)). +* Fix drop partition with intersect fake parts. In rare cases there might be parts with mutation version greater than current block number. [#24321](https://github.com/ClickHouse/ClickHouse/pull/24321) ([Amos Bird](https://github.com/amosbird)). +* Fixed a bug in moving Materialized View from Ordinary to Atomic database (`RENAME TABLE` query). Now inner table is moved to new database together with Materialized View. Fixes [#23926](https://github.com/ClickHouse/ClickHouse/issues/23926). [#24309](https://github.com/ClickHouse/ClickHouse/pull/24309) ([tavplubix](https://github.com/tavplubix)). +* Allow empty HTTP headers in client requests. Fixes [#23901](https://github.com/ClickHouse/ClickHouse/issues/23901). [#24285](https://github.com/ClickHouse/ClickHouse/pull/24285) ([Ivan](https://github.com/abyss7)). +* Set `max_threads = 1` to fix mutation fail of `Memory` tables. Closes [#24274](https://github.com/ClickHouse/ClickHouse/issues/24274). [#24275](https://github.com/ClickHouse/ClickHouse/pull/24275) ([flynn](https://github.com/ucasFL)). +* Fix typo in implementation of `Memory` tables, this bug was introduced at [#15127](https://github.com/ClickHouse/ClickHouse/issues/15127). Closes [#24192](https://github.com/ClickHouse/ClickHouse/issues/24192). [#24193](https://github.com/ClickHouse/ClickHouse/pull/24193) ([张中南](https://github.com/plugine)). +* Fix abnormal server termination due to `HDFS` becoming not accessible during query execution. Closes [#24117](https://github.com/ClickHouse/ClickHouse/issues/24117). [#24191](https://github.com/ClickHouse/ClickHouse/pull/24191) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix crash on updating of `Nested` column with const condition. [#24183](https://github.com/ClickHouse/ClickHouse/pull/24183) ([hexiaoting](https://github.com/hexiaoting)). +* Fix race condition which could happen in RBAC under a heavy load. This PR fixes [#24090](https://github.com/ClickHouse/ClickHouse/issues/24090), [#24134](https://github.com/ClickHouse/ClickHouse/issues/24134),. [#24176](https://github.com/ClickHouse/ClickHouse/pull/24176) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a rare bug that could lead to a partially initialized table that can serve write requests (insert/alter/so on). Now such tables will be in readonly mode. [#24122](https://github.com/ClickHouse/ClickHouse/pull/24122) ([alesapin](https://github.com/alesapin)). +* Fix an issue: `EXPLAIN PIPELINE` with `SELECT xxx FINAL` showed a wrong pipeline. ([hexiaoting](https://github.com/hexiaoting)). +* Fixed using const `DateTime` value vs `DateTime64` column in `WHERE`. [#24100](https://github.com/ClickHouse/ClickHouse/pull/24100) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix crash in merge JOIN, closes [#24010](https://github.com/ClickHouse/ClickHouse/issues/24010). [#24013](https://github.com/ClickHouse/ClickHouse/pull/24013) ([vdimir](https://github.com/vdimir)). +* Some `ALTER PARTITION` queries might cause `Part A intersects previous part B` and `Unexpected merged part C intersecting drop range D` errors in replication queue. It's fixed. Fixes [#23296](https://github.com/ClickHouse/ClickHouse/issues/23296). [#23997](https://github.com/ClickHouse/ClickHouse/pull/23997) ([tavplubix](https://github.com/tavplubix)). +* Fix SIGSEGV for external GROUP BY and overflow row (i.e. queries like `SELECT FROM GROUP BY WITH TOTALS SETTINGS max_bytes_before_external_group_by>0, max_rows_to_group_by>0, group_by_overflow_mode='any', totals_mode='before_having'`). [#23962](https://github.com/ClickHouse/ClickHouse/pull/23962) ([Azat Khuzhin](https://github.com/azat)). +* Fix keys metrics accounting for `CACHE` dictionary with duplicates in the source (leads to `DictCacheKeysRequestedMiss` overflows). [#23929](https://github.com/ClickHouse/ClickHouse/pull/23929) ([Azat Khuzhin](https://github.com/azat)). +* Fix implementation of connection pool of `PostgreSQL` engine. Closes [#23897](https://github.com/ClickHouse/ClickHouse/issues/23897). [#23909](https://github.com/ClickHouse/ClickHouse/pull/23909) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix `distributed_group_by_no_merge = 2` with `GROUP BY` and aggregate function wrapped into regular function (had been broken in [#23546](https://github.com/ClickHouse/ClickHouse/issues/23546)). Throw exception in case of someone trying to use `distributed_group_by_no_merge = 2` with window functions. Disable `optimize_distributed_group_by_sharding_key` for queries with window functions. [#23906](https://github.com/ClickHouse/ClickHouse/pull/23906) ([Azat Khuzhin](https://github.com/azat)). +* A fix for `s3` table function: better handling of HTTP errors. Response bodies of HTTP errors were being ignored earlier. [#23844](https://github.com/ClickHouse/ClickHouse/pull/23844) ([Vladimir Chebotarev](https://github.com/excitoon)). +* A fix for `s3` table function: better handling of URI's. Fixed an incompatibility with URLs containing `+` symbol, data with such keys could not be read previously. [#23822](https://github.com/ClickHouse/ClickHouse/pull/23822) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix error `Can't initialize pipeline with empty pipe` for queries with `GLOBAL IN/JOIN` and `use_hedged_requests`. Fixes [#23431](https://github.com/ClickHouse/ClickHouse/issues/23431). [#23805](https://github.com/ClickHouse/ClickHouse/pull/23805) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `CLEAR COLUMN` does not work when it is referenced by materialized view. Close [#23764](https://github.com/ClickHouse/ClickHouse/issues/23764). [#23781](https://github.com/ClickHouse/ClickHouse/pull/23781) ([flynn](https://github.com/ucasFL)). +* Fix heap use after free when reading from HDFS if `Values` format is used. [#23761](https://github.com/ClickHouse/ClickHouse/pull/23761) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid possible "Cannot schedule a task" error (in case some exception had been occurred) on INSERT into Distributed. [#23744](https://github.com/ClickHouse/ClickHouse/pull/23744) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a bug in recovery of staled `ReplicatedMergeTree` replica. Some metadata updates could be ignored by staled replica if `ALTER` query was executed during downtime of the replica. [#23742](https://github.com/ClickHouse/ClickHouse/pull/23742) ([tavplubix](https://github.com/tavplubix)). +* Fix a bug with `Join` and `WITH TOTALS`, close [#17718](https://github.com/ClickHouse/ClickHouse/issues/17718). [#23549](https://github.com/ClickHouse/ClickHouse/pull/23549) ([vdimir](https://github.com/vdimir)). +* Fix possible `Block structure mismatch` error for queries with `UNION` which could possibly happen after filter-pushdown optimization. Fixes [#23029](https://github.com/ClickHouse/ClickHouse/issues/23029). [#23359](https://github.com/ClickHouse/ClickHouse/pull/23359) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add type conversion when the setting `optimize_skip_unused_shards_rewrite_in` is enabled. This fixes MSan report. [#23219](https://github.com/ClickHouse/ClickHouse/pull/23219) ([Azat Khuzhin](https://github.com/azat)). +* Add a missing check when updating nested subcolumns, close issue: [#22353](https://github.com/ClickHouse/ClickHouse/issues/22353). [#22503](https://github.com/ClickHouse/ClickHouse/pull/22503) ([hexiaoting](https://github.com/hexiaoting)). + +#### Build/Testing/Packaging Improvement + +* Support building on Illumos. [#24144](https://github.com/ClickHouse/ClickHouse/pull/24144). Adds support for building on Solaris-derived operating systems. [#23746](https://github.com/ClickHouse/ClickHouse/pull/23746) ([bnaecker](https://github.com/bnaecker)). +* Add more benchmarks for hash tables, including the Swiss Table from Google (that appeared to be slower than ClickHouse hash map in our specific usage scenario). [#24111](https://github.com/ClickHouse/ClickHouse/pull/24111) ([Maksim Kita](https://github.com/kitaisreal)). +* Update librdkafka 1.6.0-RC3 to 1.6.1. [#23874](https://github.com/ClickHouse/ClickHouse/pull/23874) ([filimonov](https://github.com/filimonov)). +* Always enable `asynchronous-unwind-tables` explicitly. It may fix query profiler on AArch64. [#23602](https://github.com/ClickHouse/ClickHouse/pull/23602) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid possible build dependency on locale and filesystem order. This allows reproducible builds. [#23600](https://github.com/ClickHouse/ClickHouse/pull/23600) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove a source of nondeterminism from build. Now builds at different point of time will produce byte-identical binaries. Partially addressed [#22113](https://github.com/ClickHouse/ClickHouse/issues/22113). [#23559](https://github.com/ClickHouse/ClickHouse/pull/23559) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add simple tool for benchmarking (Zoo)Keeper. [#23038](https://github.com/ClickHouse/ClickHouse/pull/23038) ([alesapin](https://github.com/alesapin)). + + +## ClickHouse release 21.5, 2021-05-20 + +#### Backward Incompatible Change + +* Change comparison of integers and floating point numbers when integer is not exactly representable in the floating point data type. In new version comparison will return false as the rounding error will occur. Example: `9223372036854775808.0 != 9223372036854775808`, because the number `9223372036854775808` is not representable as floating point number exactly (and `9223372036854775808.0` is rounded to `9223372036854776000.0`). But in previous version the comparison will return as the numbers are equal, because if the floating point number `9223372036854776000.0` get converted back to UInt64, it will yield `9223372036854775808`. For the reference, the Python programming language also treats these numbers as equal. But this behaviour was dependend on CPU model (different results on AMD64 and AArch64 for some out-of-range numbers), so we make the comparison more precise. It will treat int and float numbers equal only if int is represented in floating point type exactly. [#22595](https://github.com/ClickHouse/ClickHouse/pull/22595) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove support for `argMin` and `argMax` for single `Tuple` argument. The code was not memory-safe. The feature was added by mistake and it is confusing for people. These functions can be reintroduced under different names later. This fixes [#22384](https://github.com/ClickHouse/ClickHouse/issues/22384) and reverts [#17359](https://github.com/ClickHouse/ClickHouse/issues/17359). [#23393](https://github.com/ClickHouse/ClickHouse/pull/23393) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Added functions `dictGetChildren(dictionary, key)`, `dictGetDescendants(dictionary, key, level)`. Function `dictGetChildren` return all children as an array if indexes. It is a inverse transformation for `dictGetHierarchy`. Function `dictGetDescendants` return all descendants as if `dictGetChildren` was applied `level` times recursively. Zero `level` value is equivalent to infinity. Improved performance of `dictGetHierarchy`, `dictIsIn` functions. Closes [#14656](https://github.com/ClickHouse/ClickHouse/issues/14656). [#22096](https://github.com/ClickHouse/ClickHouse/pull/22096) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dictGetOrNull`. It works like `dictGet`, but return `Null` in case key was not found in dictionary. Closes [#22375](https://github.com/ClickHouse/ClickHouse/issues/22375). [#22413](https://github.com/ClickHouse/ClickHouse/pull/22413) ([Maksim Kita](https://github.com/kitaisreal)). +* Added a table function `s3Cluster`, which allows to process files from `s3` in parallel on every node of a specified cluster. [#22012](https://github.com/ClickHouse/ClickHouse/pull/22012) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added support for replicas and shards in MySQL/PostgreSQL table engine / table function. You can write `SELECT * FROM mysql('host{1,2}-{1|2}', ...)`. Closes [#20969](https://github.com/ClickHouse/ClickHouse/issues/20969). [#22217](https://github.com/ClickHouse/ClickHouse/pull/22217) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `ALTER TABLE ... FETCH PART ...` query. It's similar to `FETCH PARTITION`, but fetches only one part. [#22706](https://github.com/ClickHouse/ClickHouse/pull/22706) ([turbo jason](https://github.com/songenjie)). +* Added a setting `max_distributed_depth` that limits the depth of recursive queries to `Distributed` tables. Closes [#20229](https://github.com/ClickHouse/ClickHouse/issues/20229). [#21942](https://github.com/ClickHouse/ClickHouse/pull/21942) ([flynn](https://github.com/ucasFL)). + +#### Performance Improvement + +* Improved performance of `intDiv` by dynamic dispatch for AVX2. This closes [#22314](https://github.com/ClickHouse/ClickHouse/issues/22314). [#23000](https://github.com/ClickHouse/ClickHouse/pull/23000) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improved performance of reading from `ArrowStream` input format for sources other then local file (e.g. URL). [#22673](https://github.com/ClickHouse/ClickHouse/pull/22673) ([nvartolomei](https://github.com/nvartolomei)). +* Disabled compression by default when interacting with localhost (with clickhouse-client or server to server with distributed queries) via native protocol. It may improve performance of some import/export operations. This closes [#22234](https://github.com/ClickHouse/ClickHouse/issues/22234). [#22237](https://github.com/ClickHouse/ClickHouse/pull/22237) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Exclude values that does not belong to the shard from right part of IN section for distributed queries (under `optimize_skip_unused_shards_rewrite_in`, enabled by default, since it still requires `optimize_skip_unused_shards`). [#21511](https://github.com/ClickHouse/ClickHouse/pull/21511) ([Azat Khuzhin](https://github.com/azat)). +* Improved performance of reading a subset of columns with File-like table engine and column-oriented format like Parquet, Arrow or ORC. This closes [#issue:20129](https://github.com/ClickHouse/ClickHouse/issues/20129). [#21302](https://github.com/ClickHouse/ClickHouse/pull/21302) ([keenwolf](https://github.com/keen-wolf)). +* Allow to move more conditions to `PREWHERE` as it was before version 21.1 (adjustment of internal heuristics). Insufficient number of moved condtions could lead to worse performance. [#23397](https://github.com/ClickHouse/ClickHouse/pull/23397) ([Anton Popov](https://github.com/CurtizJ)). +* Improved performance of ODBC connections and fixed all the outstanding issues from the backlog. Using `nanodbc` library instead of `Poco::ODBC`. Closes [#9678](https://github.com/ClickHouse/ClickHouse/issues/9678). Add support for DateTime64 and Decimal* for ODBC table engine. Closes [#21961](https://github.com/ClickHouse/ClickHouse/issues/21961). Fixed issue with cyrillic text being truncated. Closes [#16246](https://github.com/ClickHouse/ClickHouse/issues/16246). Added connection pools for odbc bridge. [#21972](https://github.com/ClickHouse/ClickHouse/pull/21972) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement + +* Increase `max_uri_size` (the maximum size of URL in HTTP interface) to 1 MiB by default. This closes [#21197](https://github.com/ClickHouse/ClickHouse/issues/21197). [#22997](https://github.com/ClickHouse/ClickHouse/pull/22997) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Set `background_fetches_pool_size` to `8` that is better for production usage with frequent small insertions or slow ZooKeeper cluster. [#22945](https://github.com/ClickHouse/ClickHouse/pull/22945) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* FlatDictionary added `initial_array_size`, `max_array_size` options. [#22521](https://github.com/ClickHouse/ClickHouse/pull/22521) ([Maksim Kita](https://github.com/kitaisreal)). +* Add new setting `non_replicated_deduplication_window` for non-replicated MergeTree inserts deduplication. [#22514](https://github.com/ClickHouse/ClickHouse/pull/22514) ([alesapin](https://github.com/alesapin)). +* Update paths to the `CatBoost` model configs in config reloading. [#22434](https://github.com/ClickHouse/ClickHouse/pull/22434) ([Kruglov Pavel](https://github.com/Avogar)). +* Added `Decimal256` type support in dictionaries. `Decimal256` is experimental feature. Closes [#20979](https://github.com/ClickHouse/ClickHouse/issues/20979). [#22960](https://github.com/ClickHouse/ClickHouse/pull/22960) ([Maksim Kita](https://github.com/kitaisreal)). +* Enabled `async_socket_for_remote` by default (using less amount of OS threads for distributed queries). [#23683](https://github.com/ClickHouse/ClickHouse/pull/23683) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed `quantile(s)TDigest`. Added special handling of singleton centroids according to tdunning/t-digest 3.2+. Also a bug with over-compression of centroids in implementation of earlier version of the algorithm was fixed. [#23314](https://github.com/ClickHouse/ClickHouse/pull/23314) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Make function name `unhex` case insensitive for compatibility with MySQL. [#23229](https://github.com/ClickHouse/ClickHouse/pull/23229) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Implement functions `arrayHasAny`, `arrayHasAll`, `has`, `indexOf`, `countEqual` for generic case when types of array elements are different. In previous versions the functions `arrayHasAny`, `arrayHasAll` returned false and `has`, `indexOf`, `countEqual` thrown exception. Also add support for `Decimal` and big integer types in functions `has` and similar. This closes [#20272](https://github.com/ClickHouse/ClickHouse/issues/20272). [#23044](https://github.com/ClickHouse/ClickHouse/pull/23044) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Raised the threshold on max number of matches in result of the function `extractAllGroupsHorizontal`. [#23036](https://github.com/ClickHouse/ClickHouse/pull/23036) ([Vasily Nemkov](https://github.com/Enmk)). +* Do not perform `optimize_skip_unused_shards` for cluster with one node. [#22999](https://github.com/ClickHouse/ClickHouse/pull/22999) ([Azat Khuzhin](https://github.com/azat)). +* Added ability to run clickhouse-keeper (experimental drop-in replacement to ZooKeeper) with SSL. Config settings `keeper_server.tcp_port_secure` can be used for secure interaction between client and keeper-server. `keeper_server.raft_configuration.secure` can be used to enable internal secure communication between nodes. [#22992](https://github.com/ClickHouse/ClickHouse/pull/22992) ([alesapin](https://github.com/alesapin)). +* Added ability to flush buffer only in background for `Buffer` tables. [#22986](https://github.com/ClickHouse/ClickHouse/pull/22986) ([Azat Khuzhin](https://github.com/azat)). +* When selecting from MergeTree table with NULL in WHERE condition, in rare cases, exception was thrown. This closes [#20019](https://github.com/ClickHouse/ClickHouse/issues/20019). [#22978](https://github.com/ClickHouse/ClickHouse/pull/22978) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error handling in Poco HTTP Client for AWS. [#22973](https://github.com/ClickHouse/ClickHouse/pull/22973) ([kreuzerkrieg](https://github.com/kreuzerkrieg)). +* Respect `max_part_removal_threads` for `ReplicatedMergeTree`. [#22971](https://github.com/ClickHouse/ClickHouse/pull/22971) ([Azat Khuzhin](https://github.com/azat)). +* Fix obscure corner case of MergeTree settings inactive_parts_to_throw_insert = 0 with inactive_parts_to_delay_insert > 0. [#22947](https://github.com/ClickHouse/ClickHouse/pull/22947) ([Azat Khuzhin](https://github.com/azat)). +* `dateDiff` now works with `DateTime64` arguments (even for values outside of `DateTime` range) [#22931](https://github.com/ClickHouse/ClickHouse/pull/22931) ([Vasily Nemkov](https://github.com/Enmk)). +* MaterializeMySQL (experimental feature): added an ability to replicate MySQL databases containing views without failing. This is accomplished by ignoring the views. [#22760](https://github.com/ClickHouse/ClickHouse/pull/22760) ([Christian](https://github.com/cfroystad)). +* Allow RBAC row policy via postgresql protocol. Closes [#22658](https://github.com/ClickHouse/ClickHouse/issues/22658). PostgreSQL protocol is enabled in configuration by default. [#22755](https://github.com/ClickHouse/ClickHouse/pull/22755) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add metric to track how much time is spend during waiting for Buffer layer lock. [#22725](https://github.com/ClickHouse/ClickHouse/pull/22725) ([Azat Khuzhin](https://github.com/azat)). +* Allow to use CTE in VIEW definition. This closes [#22491](https://github.com/ClickHouse/ClickHouse/issues/22491). [#22657](https://github.com/ClickHouse/ClickHouse/pull/22657) ([Amos Bird](https://github.com/amosbird)). +* Clear the rest of the screen and show cursor in `clickhouse-client` if previous program has left garbage in terminal. This closes [#16518](https://github.com/ClickHouse/ClickHouse/issues/16518). [#22634](https://github.com/ClickHouse/ClickHouse/pull/22634) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make `round` function to behave consistently on non-x86_64 platforms. Rounding half to nearest even (Banker's rounding) is used. [#22582](https://github.com/ClickHouse/ClickHouse/pull/22582) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correctly check structure of blocks of data that are sending by Distributed tables. [#22325](https://github.com/ClickHouse/ClickHouse/pull/22325) ([Azat Khuzhin](https://github.com/azat)). +* Allow publishing Kafka errors to a virtual column of Kafka engine, controlled by the `kafka_handle_error_mode` setting. [#21850](https://github.com/ClickHouse/ClickHouse/pull/21850) ([fastio](https://github.com/fastio)). +* Add aliases `simpleJSONExtract/simpleJSONHas` to `visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}`. Fixes [#21383](https://github.com/ClickHouse/ClickHouse/issues/21383). [#21519](https://github.com/ClickHouse/ClickHouse/pull/21519) ([fastio](https://github.com/fastio)). +* Add `clickhouse-library-bridge` for library dictionary source. Closes [#9502](https://github.com/ClickHouse/ClickHouse/issues/9502). [#21509](https://github.com/ClickHouse/ClickHouse/pull/21509) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Forbid to drop a column if it's referenced by materialized view. Closes [#21164](https://github.com/ClickHouse/ClickHouse/issues/21164). [#21303](https://github.com/ClickHouse/ClickHouse/pull/21303) ([flynn](https://github.com/ucasFL)). +* Support dynamic interserver credentials (rotating credentials without downtime). [#14113](https://github.com/ClickHouse/ClickHouse/pull/14113) ([johnskopis](https://github.com/johnskopis)). +* Add support for Kafka storage with `Arrow` and `ArrowStream` format messages. [#23415](https://github.com/ClickHouse/ClickHouse/pull/23415) ([Chao Ma](https://github.com/godliness)). +* Fixed missing semicolon in exception message. The user may find this exception message unpleasant to read. [#23208](https://github.com/ClickHouse/ClickHouse/pull/23208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed missing whitespace in some exception messages about `LowCardinality` type. [#23207](https://github.com/ClickHouse/ClickHouse/pull/23207) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Some values were formatted with alignment in center in table cells in `Markdown` format. Not anymore. [#23096](https://github.com/ClickHouse/ClickHouse/pull/23096) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove non-essential details from suggestions in clickhouse-client. This closes [#22158](https://github.com/ClickHouse/ClickHouse/issues/22158). [#23040](https://github.com/ClickHouse/ClickHouse/pull/23040) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Correct calculation of `bytes_allocated` field in system.dictionaries for sparse_hashed dictionaries. [#22867](https://github.com/ClickHouse/ClickHouse/pull/22867) ([Azat Khuzhin](https://github.com/azat)). +* Fixed approximate total rows accounting for reverse reading from MergeTree. [#22726](https://github.com/ClickHouse/ClickHouse/pull/22726) ([Azat Khuzhin](https://github.com/azat)). +* Fix the case when it was possible to configure dictionary with clickhouse source that was looking to itself that leads to infinite loop. Closes [#14314](https://github.com/ClickHouse/ClickHouse/issues/14314). [#22479](https://github.com/ClickHouse/ClickHouse/pull/22479) ([Maksim Kita](https://github.com/kitaisreal)). + +#### Bug Fix + +* Multiple fixes for hedged requests. Fixed an error `Can't initialize pipeline with empty pipe` for queries with `GLOBAL IN/JOIN` when the setting `use_hedged_requests` is enabled. Fixes [#23431](https://github.com/ClickHouse/ClickHouse/issues/23431). [#23805](https://github.com/ClickHouse/ClickHouse/pull/23805) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). Fixed a race condition in hedged connections which leads to crash. This fixes [#22161](https://github.com/ClickHouse/ClickHouse/issues/22161). [#22443](https://github.com/ClickHouse/ClickHouse/pull/22443) ([Kruglov Pavel](https://github.com/Avogar)). Fix possible crash in case if `unknown packet` was received from remote query (with `async_socket_for_remote` enabled). Fixes [#21167](https://github.com/ClickHouse/ClickHouse/issues/21167). [#23309](https://github.com/ClickHouse/ClickHouse/pull/23309) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed the behavior when disabling `input_format_with_names_use_header ` setting discards all the input with CSVWithNames format. This fixes [#22406](https://github.com/ClickHouse/ClickHouse/issues/22406). [#23202](https://github.com/ClickHouse/ClickHouse/pull/23202) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed remote JDBC bridge timeout connection issue. Closes [#9609](https://github.com/ClickHouse/ClickHouse/issues/9609). [#23771](https://github.com/ClickHouse/ClickHouse/pull/23771) ([Maksim Kita](https://github.com/kitaisreal), [alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix the logic of initial load of `complex_key_hashed` if `update_field` is specified. Closes [#23800](https://github.com/ClickHouse/ClickHouse/issues/23800). [#23824](https://github.com/ClickHouse/ClickHouse/pull/23824) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed crash when `PREWHERE` and row policy filter are both in effect with empty result. [#23763](https://github.com/ClickHouse/ClickHouse/pull/23763) ([Amos Bird](https://github.com/amosbird)). +* Avoid possible "Cannot schedule a task" error (in case some exception had been occurred) on INSERT into Distributed. [#23744](https://github.com/ClickHouse/ClickHouse/pull/23744) ([Azat Khuzhin](https://github.com/azat)). +* Added an exception in case of completely the same values in both samples in aggregate function `mannWhitneyUTest`. This fixes [#23646](https://github.com/ClickHouse/ClickHouse/issues/23646). [#23654](https://github.com/ClickHouse/ClickHouse/pull/23654) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed server fault when inserting data through HTTP caused an exception. This fixes [#23512](https://github.com/ClickHouse/ClickHouse/issues/23512). [#23643](https://github.com/ClickHouse/ClickHouse/pull/23643) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fixed misinterpretation of some `LIKE` expressions with escape sequences. [#23610](https://github.com/ClickHouse/ClickHouse/pull/23610) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed restart / stop command hanging. Closes [#20214](https://github.com/ClickHouse/ClickHouse/issues/20214). [#23552](https://github.com/ClickHouse/ClickHouse/pull/23552) ([filimonov](https://github.com/filimonov)). +* Fixed `COLUMNS` matcher in case of multiple JOINs in select query. Closes [#22736](https://github.com/ClickHouse/ClickHouse/issues/22736). [#23501](https://github.com/ClickHouse/ClickHouse/pull/23501) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed a crash when modifying column's default value when a column itself is used as `ReplacingMergeTree`'s parameter. [#23483](https://github.com/ClickHouse/ClickHouse/pull/23483) ([hexiaoting](https://github.com/hexiaoting)). +* Fixed corner cases in vertical merges with `ReplacingMergeTree`. In rare cases they could lead to fails of merges with exceptions like `Incomplete granules are not allowed while blocks are granules size`. [#23459](https://github.com/ClickHouse/ClickHouse/pull/23459) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed bug that does not allow cast from empty array literal, to array with dimensions greater than 1, e.g. `CAST([] AS Array(Array(String)))`. Closes [#14476](https://github.com/ClickHouse/ClickHouse/issues/14476). [#23456](https://github.com/ClickHouse/ClickHouse/pull/23456) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed a bug when `deltaSum` aggregate function produced incorrect result after resetting the counter. [#23437](https://github.com/ClickHouse/ClickHouse/pull/23437) ([Russ Frank](https://github.com/rf)). +* Fixed `Cannot unlink file` error on unsuccessful creation of ReplicatedMergeTree table with multidisk configuration. This closes [#21755](https://github.com/ClickHouse/ClickHouse/issues/21755). [#23433](https://github.com/ClickHouse/ClickHouse/pull/23433) ([tavplubix](https://github.com/tavplubix)). +* Fixed incompatible constant expression generation during partition pruning based on virtual columns. This fixes https://github.com/ClickHouse/ClickHouse/pull/21401#discussion_r611888913. [#23366](https://github.com/ClickHouse/ClickHouse/pull/23366) ([Amos Bird](https://github.com/amosbird)). +* Fixed a crash when setting join_algorithm is set to 'auto' and Join is performed with a Dictionary. Close [#23002](https://github.com/ClickHouse/ClickHouse/issues/23002). [#23312](https://github.com/ClickHouse/ClickHouse/pull/23312) ([Vladimir](https://github.com/vdimir)). +* Don't relax NOT conditions during partition pruning. This fixes [#23305](https://github.com/ClickHouse/ClickHouse/issues/23305) and [#21539](https://github.com/ClickHouse/ClickHouse/issues/21539). [#23310](https://github.com/ClickHouse/ClickHouse/pull/23310) ([Amos Bird](https://github.com/amosbird)). +* Fixed very rare race condition on background cleanup of old blocks. It might cause a block not to be deduplicated if it's too close to the end of deduplication window. [#23301](https://github.com/ClickHouse/ClickHouse/pull/23301) ([tavplubix](https://github.com/tavplubix)). +* Fixed very rare (distributed) race condition between creation and removal of ReplicatedMergeTree tables. It might cause exceptions like `node doesn't exist` on attempt to create replicated table. Fixes [#21419](https://github.com/ClickHouse/ClickHouse/issues/21419). [#23294](https://github.com/ClickHouse/ClickHouse/pull/23294) ([tavplubix](https://github.com/tavplubix)). +* Fixed simple key dictionary from DDL creation if primary key is not first attribute. Fixes [#23236](https://github.com/ClickHouse/ClickHouse/issues/23236). [#23262](https://github.com/ClickHouse/ClickHouse/pull/23262) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed reading from ODBC when there are many long column names in a table. Closes [#8853](https://github.com/ClickHouse/ClickHouse/issues/8853). [#23215](https://github.com/ClickHouse/ClickHouse/pull/23215) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MaterializeMySQL (experimental feature): fixed `Not found column` error when selecting from `MaterializeMySQL` with condition on key column. Fixes [#22432](https://github.com/ClickHouse/ClickHouse/issues/22432). [#23200](https://github.com/ClickHouse/ClickHouse/pull/23200) ([tavplubix](https://github.com/tavplubix)). +* Correct aliases handling if subquery was optimized to constant. Fixes [#22924](https://github.com/ClickHouse/ClickHouse/issues/22924). Fixes [#10401](https://github.com/ClickHouse/ClickHouse/issues/10401). [#23191](https://github.com/ClickHouse/ClickHouse/pull/23191) ([Maksim Kita](https://github.com/kitaisreal)). +* Server might fail to start if `data_type_default_nullable` setting is enabled in default profile, it's fixed. Fixes [#22573](https://github.com/ClickHouse/ClickHouse/issues/22573). [#23185](https://github.com/ClickHouse/ClickHouse/pull/23185) ([tavplubix](https://github.com/tavplubix)). +* Fixed a crash on shutdown which happened because of wrong accounting of current connections. [#23154](https://github.com/ClickHouse/ClickHouse/pull/23154) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed `Table .inner_id... doesn't exist` error when selecting from Materialized View after detaching it from Atomic database and attaching back. [#23047](https://github.com/ClickHouse/ClickHouse/pull/23047) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot find column in ActionsDAG result` which may happen if subquery uses `untuple`. Fixes [#22290](https://github.com/ClickHouse/ClickHouse/issues/22290). [#22991](https://github.com/ClickHouse/ClickHouse/pull/22991) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix usage of constant columns of type `Map` with nullable values. [#22939](https://github.com/ClickHouse/ClickHouse/pull/22939) ([Anton Popov](https://github.com/CurtizJ)). +* fixed `formatDateTime()` on `DateTime64` and "%C" format specifier fixed `toDateTime64()` for large values and non-zero scale. [#22937](https://github.com/ClickHouse/ClickHouse/pull/22937) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed a crash when using `mannWhitneyUTest` and `rankCorr` with window functions. This fixes [#22728](https://github.com/ClickHouse/ClickHouse/issues/22728). [#22876](https://github.com/ClickHouse/ClickHouse/pull/22876) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* LIVE VIEW (experimental feature): fixed possible hanging in concurrent DROP/CREATE of TEMPORARY LIVE VIEW in `TemporaryLiveViewCleaner`, [see](https://gist.github.com/vzakaznikov/0c03195960fc86b56bfe2bc73a90019e). [#22858](https://github.com/ClickHouse/ClickHouse/pull/22858) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed pushdown of `HAVING` in case, when filter column is used in aggregation. [#22763](https://github.com/ClickHouse/ClickHouse/pull/22763) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed possible hangs in Zookeeper requests in case of OOM exception. Fixes [#22438](https://github.com/ClickHouse/ClickHouse/issues/22438). [#22684](https://github.com/ClickHouse/ClickHouse/pull/22684) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed wait for mutations on several replicas for ReplicatedMergeTree table engines. Previously, mutation/alter query may finish before mutation actually executed on other replicas. [#22669](https://github.com/ClickHouse/ClickHouse/pull/22669) ([alesapin](https://github.com/alesapin)). +* Fixed exception for Log with nested types without columns in the SELECT clause. [#22654](https://github.com/ClickHouse/ClickHouse/pull/22654) ([Azat Khuzhin](https://github.com/azat)). +* Fix unlimited wait for auxiliary AWS requests. [#22594](https://github.com/ClickHouse/ClickHouse/pull/22594) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fixed a crash when client closes connection very early [#22579](https://github.com/ClickHouse/ClickHouse/issues/22579). [#22591](https://github.com/ClickHouse/ClickHouse/pull/22591) ([nvartolomei](https://github.com/nvartolomei)). +* `Map` data type (experimental feature): fixed an incorrect formatting of function `map` in distributed queries. [#22588](https://github.com/ClickHouse/ClickHouse/pull/22588) ([foolchi](https://github.com/foolchi)). +* Fixed deserialization of empty string without newline at end of TSV format. This closes [#20244](https://github.com/ClickHouse/ClickHouse/issues/20244). Possible workaround without version update: set `input_format_null_as_default` to zero. It was zero in old versions. [#22527](https://github.com/ClickHouse/ClickHouse/pull/22527) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed wrong cast of a column of `LowCardinality` type in Merge Join algorithm. Close [#22386](https://github.com/ClickHouse/ClickHouse/issues/22386), close [#22388](https://github.com/ClickHouse/ClickHouse/issues/22388). [#22510](https://github.com/ClickHouse/ClickHouse/pull/22510) ([Vladimir](https://github.com/vdimir)). +* Buffer overflow (on read) was possible in `tokenbf_v1` full text index. The excessive bytes are not used but the read operation may lead to crash in rare cases. This closes [#19233](https://github.com/ClickHouse/ClickHouse/issues/19233). [#22421](https://github.com/ClickHouse/ClickHouse/pull/22421) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do not limit HTTP chunk size. Fixes [#21907](https://github.com/ClickHouse/ClickHouse/issues/21907). [#22322](https://github.com/ClickHouse/ClickHouse/pull/22322) ([Ivan](https://github.com/abyss7)). +* Fixed a bug, which leads to underaggregation of data in case of enabled `optimize_aggregation_in_order` and many parts in table. Slightly improve performance of aggregation with enabled `optimize_aggregation_in_order`. [#21889](https://github.com/ClickHouse/ClickHouse/pull/21889) ([Anton Popov](https://github.com/CurtizJ)). +* Check if table function view is used as a column. This complements #20350. [#21465](https://github.com/ClickHouse/ClickHouse/pull/21465) ([Amos Bird](https://github.com/amosbird)). +* Fix "unknown column" error for tables with `Merge` engine in queris with `JOIN` and aggregation. Closes [#18368](https://github.com/ClickHouse/ClickHouse/issues/18368), close [#22226](https://github.com/ClickHouse/ClickHouse/issues/22226). [#21370](https://github.com/ClickHouse/ClickHouse/pull/21370) ([Vladimir](https://github.com/vdimir)). +* Fixed name clashes in pushdown optimization. It caused incorrect `WHERE` filtration after FULL JOIN. Close [#20497](https://github.com/ClickHouse/ClickHouse/issues/20497). [#20622](https://github.com/ClickHouse/ClickHouse/pull/20622) ([Vladimir](https://github.com/vdimir)). +* Fixed very rare bug when quorum insert with `quorum_parallel=1` is not really "quorum" because of deduplication. [#18215](https://github.com/ClickHouse/ClickHouse/pull/18215) ([filimonov](https://github.com/filimonov) - reported, [alesapin](https://github.com/alesapin) - fixed). + +#### Build/Testing/Packaging Improvement + +* Run stateless tests in parallel in CI. [#22300](https://github.com/ClickHouse/ClickHouse/pull/22300) ([alesapin](https://github.com/alesapin)). +* Simplify debian packages. This fixes [#21698](https://github.com/ClickHouse/ClickHouse/issues/21698). [#22976](https://github.com/ClickHouse/ClickHouse/pull/22976) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added support for ClickHouse build on Apple M1. [#21639](https://github.com/ClickHouse/ClickHouse/pull/21639) ([changvvb](https://github.com/changvvb)). +* Fixed ClickHouse Keeper build for macOS. [#22860](https://github.com/ClickHouse/ClickHouse/pull/22860) ([alesapin](https://github.com/alesapin)). +* Fixed some tests on AArch64 platform. [#22596](https://github.com/ClickHouse/ClickHouse/pull/22596) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Added function alignment for possibly better performance. [#21431](https://github.com/ClickHouse/ClickHouse/pull/21431) ([Danila Kutenin](https://github.com/danlark1)). +* Adjust some tests to output identical results on amd64 and aarch64 (qemu). The result was depending on implementation specific CPU behaviour. [#22590](https://github.com/ClickHouse/ClickHouse/pull/22590) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow query profiling only on x86_64. See [#15174](https://github.com/ClickHouse/ClickHouse/issues/15174#issuecomment-812954965) and [#15638](https://github.com/ClickHouse/ClickHouse/issues/15638#issuecomment-703805337). This closes [#15638](https://github.com/ClickHouse/ClickHouse/issues/15638). [#22580](https://github.com/ClickHouse/ClickHouse/pull/22580) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow building with unbundled xz (lzma) using `USE_INTERNAL_XZ_LIBRARY=OFF` CMake option. [#22571](https://github.com/ClickHouse/ClickHouse/pull/22571) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Enable bundled `openldap` on `ppc64le` [#22487](https://github.com/ClickHouse/ClickHouse/pull/22487) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Disable incompatible libraries (platform specific typically) on `ppc64le` [#22475](https://github.com/ClickHouse/ClickHouse/pull/22475) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Add Jepsen test in CI for clickhouse Keeper. [#22373](https://github.com/ClickHouse/ClickHouse/pull/22373) ([alesapin](https://github.com/alesapin)). +* Build `jemalloc` with support for [heap profiling](https://github.com/jemalloc/jemalloc/wiki/Use-Case%3A-Heap-Profiling). [#22834](https://github.com/ClickHouse/ClickHouse/pull/22834) ([nvartolomei](https://github.com/nvartolomei)). +* Avoid UB in `*Log` engines for rwlock unlock due to unlock from another thread. [#22583](https://github.com/ClickHouse/ClickHouse/pull/22583) ([Azat Khuzhin](https://github.com/azat)). +* Fixed UB by unlocking the rwlock of the TinyLog from the same thread. [#22560](https://github.com/ClickHouse/ClickHouse/pull/22560) ([Azat Khuzhin](https://github.com/azat)). + + +## ClickHouse release 21.4 + +### ClickHouse release 21.4.1 2021-04-12 + +#### Backward Incompatible Change + +* The `toStartOfIntervalFunction` will align hour intervals to the midnight (in previous versions they were aligned to the start of unix epoch). For example, `toStartOfInterval(x, INTERVAL 11 HOUR)` will split every day into three intervals: `00:00:00..10:59:59`, `11:00:00..21:59:59` and `22:00:00..23:59:59`. This behaviour is more suited for practical needs. This closes [#9510](https://github.com/ClickHouse/ClickHouse/issues/9510). [#22060](https://github.com/ClickHouse/ClickHouse/pull/22060) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `Age` and `Precision` in graphite rollup configs should increase from retention to retention. Now it's checked and the wrong config raises an exception. [#21496](https://github.com/ClickHouse/ClickHouse/pull/21496) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix `cutToFirstSignificantSubdomainCustom()`/`firstSignificantSubdomainCustom()` returning wrong result for 3+ level domains present in custom top-level domain list. For input domains matching these custom top-level domains, the third-level domain was considered to be the first significant one. This is now fixed. This change may introduce incompatibility if the function is used in e.g. the sharding key. [#21946](https://github.com/ClickHouse/ClickHouse/pull/21946) ([Azat Khuzhin](https://github.com/azat)). +* Column `keys` in table `system.dictionaries` was replaced to columns `key.names` and `key.types`. Columns `key.names`, `key.types`, `attribute.names`, `attribute.types` from `system.dictionaries` table does not require dictionary to be loaded. [#21884](https://github.com/ClickHouse/ClickHouse/pull/21884) ([Maksim Kita](https://github.com/kitaisreal)). +* Now replicas that are processing the `ALTER TABLE ATTACH PART[ITION]` command search in their `detached/` folders before fetching the data from other replicas. As an implementation detail, a new command `ATTACH_PART` is introduced in the replicated log. Parts are searched and compared by their checksums. [#18978](https://github.com/ClickHouse/ClickHouse/pull/18978) ([Mike Kot](https://github.com/myrrc)). **Note**: + * `ATTACH PART[ITION]` queries may not work during cluster upgrade. + * It's not possible to rollback to older ClickHouse version after executing `ALTER ... ATTACH` query in new version as the old servers would fail to pass the `ATTACH_PART` entry in the replicated log. +* In this version, empty `` will block all access to remote hosts while in previous versions it did nothing. If you want to keep old behaviour and you have empty `remote_url_allow_hosts` element in configuration file, remove it. [#20058](https://github.com/ClickHouse/ClickHouse/pull/20058) ([Vladimir Chebotarev](https://github.com/excitoon)). + + +#### New Feature + +* Extended range of `DateTime64` to support dates from year 1925 to 2283. Improved support of `DateTime` around zero date (`1970-01-01`). [#9404](https://github.com/ClickHouse/ClickHouse/pull/9404) ([alexey-milovidov](https://github.com/alexey-milovidov), [Vasily Nemkov](https://github.com/Enmk)). Not every time and date functions are working for extended range of dates. +* Added support of Kerberos authentication for preconfigured users and HTTP requests (GSS-SPNEGO). [#14995](https://github.com/ClickHouse/ClickHouse/pull/14995) ([Denis Glazachev](https://github.com/traceon)). +* Add `prefer_column_name_to_alias` setting to use original column names instead of aliases. it is needed to be more compatible with common databases' aliasing rules. This is for [#9715](https://github.com/ClickHouse/ClickHouse/issues/9715) and [#9887](https://github.com/ClickHouse/ClickHouse/issues/9887). [#22044](https://github.com/ClickHouse/ClickHouse/pull/22044) ([Amos Bird](https://github.com/amosbird)). +* Added functions `dictGetChildren(dictionary, key)`, `dictGetDescendants(dictionary, key, level)`. Function `dictGetChildren` return all children as an array if indexes. It is a inverse transformation for `dictGetHierarchy`. Function `dictGetDescendants` return all descendants as if `dictGetChildren` was applied `level` times recursively. Zero `level` value is equivalent to infinity. Closes [#14656](https://github.com/ClickHouse/ClickHouse/issues/14656). [#22096](https://github.com/ClickHouse/ClickHouse/pull/22096) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `executable_pool` dictionary source. Close [#14528](https://github.com/ClickHouse/ClickHouse/issues/14528). [#21321](https://github.com/ClickHouse/ClickHouse/pull/21321) ([Maksim Kita](https://github.com/kitaisreal)). +* Added table function `dictionary`. It works the same way as `Dictionary` engine. Closes [#21560](https://github.com/ClickHouse/ClickHouse/issues/21560). [#21910](https://github.com/ClickHouse/ClickHouse/pull/21910) ([Maksim Kita](https://github.com/kitaisreal)). +* Support `Nullable` type for `PolygonDictionary` attribute. [#21890](https://github.com/ClickHouse/ClickHouse/pull/21890) ([Maksim Kita](https://github.com/kitaisreal)). +* Functions `dictGet`, `dictHas` use current database name if it is not specified for dictionaries created with DDL. Closes [#21632](https://github.com/ClickHouse/ClickHouse/issues/21632). [#21859](https://github.com/ClickHouse/ClickHouse/pull/21859) ([Maksim Kita](https://github.com/kitaisreal)). +* Added function `dictGetOrNull`. It works like `dictGet`, but return `Null` in case key was not found in dictionary. Closes [#22375](https://github.com/ClickHouse/ClickHouse/issues/22375). [#22413](https://github.com/ClickHouse/ClickHouse/pull/22413) ([Maksim Kita](https://github.com/kitaisreal)). +* Added async update in `ComplexKeyCache`, `SSDCache`, `SSDComplexKeyCache` dictionaries. Added support for `Nullable` type in `Cache`, `ComplexKeyCache`, `SSDCache`, `SSDComplexKeyCache` dictionaries. Added support for multiple attributes fetch with `dictGet`, `dictGetOrDefault` functions. Fixes [#21517](https://github.com/ClickHouse/ClickHouse/issues/21517). [#20595](https://github.com/ClickHouse/ClickHouse/pull/20595) ([Maksim Kita](https://github.com/kitaisreal)). +* Support `dictHas` function for `RangeHashedDictionary`. Fixes [#6680](https://github.com/ClickHouse/ClickHouse/issues/6680). [#19816](https://github.com/ClickHouse/ClickHouse/pull/19816) ([Maksim Kita](https://github.com/kitaisreal)). +* Add function `timezoneOf` that returns the timezone name of `DateTime` or `DateTime64` data types. This does not close [#9959](https://github.com/ClickHouse/ClickHouse/issues/9959). Fix inconsistencies in function names: add aliases `timezone` and `timeZone` as well as `toTimezone` and `toTimeZone` and `timezoneOf` and `timeZoneOf`. [#22001](https://github.com/ClickHouse/ClickHouse/pull/22001) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add new optional clause `GRANTEES` for `CREATE/ALTER USER` commands. It specifies users or roles which are allowed to receive grants from this user on condition this user has also all required access granted with grant option. By default `GRANTEES ANY` is used which means a user with grant option can grant to anyone. Syntax: `CREATE USER ... GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]`. [#21641](https://github.com/ClickHouse/ClickHouse/pull/21641) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add new column `slowdowns_count` to `system.clusters`. When using hedged requests, it shows how many times we switched to another replica because this replica was responding slowly. Also show actual value of `errors_count` in `system.clusters`. [#21480](https://github.com/ClickHouse/ClickHouse/pull/21480) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `_partition_id` virtual column for `MergeTree*` engines. Allow to prune partitions by `_partition_id`. Add `partitionID()` function to calculate partition id string. [#21401](https://github.com/ClickHouse/ClickHouse/pull/21401) ([Amos Bird](https://github.com/amosbird)). +* Add function `isIPAddressInRange` to test if an IPv4 or IPv6 address is contained in a given CIDR network prefix. [#21329](https://github.com/ClickHouse/ClickHouse/pull/21329) ([PHO](https://github.com/depressed-pho)). +* Added new SQL command `ALTER TABLE 'table_name' UNFREEZE [PARTITION 'part_expr'] WITH NAME 'backup_name'`. This command is needed to properly remove 'freezed' partitions from all disks. [#21142](https://github.com/ClickHouse/ClickHouse/pull/21142) ([Pavel Kovalenko](https://github.com/Jokser)). +* Supports implicit key type conversion for JOIN. [#19885](https://github.com/ClickHouse/ClickHouse/pull/19885) ([Vladimir](https://github.com/vdimir)). + +#### Experimental Feature + +* Support `RANGE OFFSET` frame (for window functions) for floating point types. Implement `lagInFrame`/`leadInFrame` window functions, which are analogous to `lag`/`lead`, but respect the window frame. They are identical when the frame is `between unbounded preceding and unbounded following`. This closes [#5485](https://github.com/ClickHouse/ClickHouse/issues/5485). [#21895](https://github.com/ClickHouse/ClickHouse/pull/21895) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Zero-copy replication for `ReplicatedMergeTree` over S3 storage. [#16240](https://github.com/ClickHouse/ClickHouse/pull/16240) ([ianton-ru](https://github.com/ianton-ru)). +* Added possibility to migrate existing S3 disk to the schema with backup-restore capabilities. [#22070](https://github.com/ClickHouse/ClickHouse/pull/22070) ([Pavel Kovalenko](https://github.com/Jokser)). + +#### Performance Improvement + +* Supported parallel formatting in `clickhouse-local` and everywhere else. [#21630](https://github.com/ClickHouse/ClickHouse/pull/21630) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Support parallel parsing for `CSVWithNames` and `TSVWithNames` formats. This closes [#21085](https://github.com/ClickHouse/ClickHouse/issues/21085). [#21149](https://github.com/ClickHouse/ClickHouse/pull/21149) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Enable read with mmap IO for file ranges from 64 MiB (the settings `min_bytes_to_use_mmap_io`). It may lead to moderate performance improvement. [#22326](https://github.com/ClickHouse/ClickHouse/pull/22326) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add cache for files read with `min_bytes_to_use_mmap_io` setting. It makes significant (2x and more) performance improvement when the value of the setting is small by avoiding frequent mmap/munmap calls and the consequent page faults. Note that mmap IO has major drawbacks that makes it less reliable in production (e.g. hung or SIGBUS on faulty disks; less controllable memory usage). Nevertheless it is good in benchmarks. [#22206](https://github.com/ClickHouse/ClickHouse/pull/22206) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid unnecessary data copy when using codec `NONE`. Please note that codec `NONE` is mostly useless - it's recommended to always use compression (`LZ4` is by default). Despite the common belief, disabling compression may not improve performance (the opposite effect is possible). The `NONE` codec is useful in some cases: - when data is uncompressable; - for synthetic benchmarks. [#22145](https://github.com/ClickHouse/ClickHouse/pull/22145) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Faster `GROUP BY` with small `max_rows_to_group_by` and `group_by_overflow_mode='any'`. [#21856](https://github.com/ClickHouse/ClickHouse/pull/21856) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Optimize performance of queries like `SELECT ... FINAL ... WHERE`. Now in queries with `FINAL` it's allowed to move to `PREWHERE` columns, which are in sorting key. [#21830](https://github.com/ClickHouse/ClickHouse/pull/21830) ([foolchi](https://github.com/foolchi)). +* Improved performance by replacing `memcpy` to another implementation. This closes [#18583](https://github.com/ClickHouse/ClickHouse/issues/18583). [#21520](https://github.com/ClickHouse/ClickHouse/pull/21520) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of aggregation in order of sorting key (with enabled setting `optimize_aggregation_in_order`). [#19401](https://github.com/ClickHouse/ClickHouse/pull/19401) ([Anton Popov](https://github.com/CurtizJ)). + +#### Improvement + +* Add connection pool for PostgreSQL table/database engine and dictionary source. Should fix [#21444](https://github.com/ClickHouse/ClickHouse/issues/21444). [#21839](https://github.com/ClickHouse/ClickHouse/pull/21839) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support non-default table schema for postgres storage/table-function. Closes [#21701](https://github.com/ClickHouse/ClickHouse/issues/21701). [#21711](https://github.com/ClickHouse/ClickHouse/pull/21711) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support replicas priority for postgres dictionary source. [#21710](https://github.com/ClickHouse/ClickHouse/pull/21710) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Introduce a new merge tree setting `min_bytes_to_rebalance_partition_over_jbod` which allows assigning new parts to different disks of a JBOD volume in a balanced way. [#16481](https://github.com/ClickHouse/ClickHouse/pull/16481) ([Amos Bird](https://github.com/amosbird)). +* Added `Grant`, `Revoke` and `System` values of `query_kind` column for corresponding queries in `system.query_log`. [#21102](https://github.com/ClickHouse/ClickHouse/pull/21102) ([Vasily Nemkov](https://github.com/Enmk)). +* Allow customizing timeouts for HTTP connections used for replication independently from other HTTP timeouts. [#20088](https://github.com/ClickHouse/ClickHouse/pull/20088) ([nvartolomei](https://github.com/nvartolomei)). +* Better exception message in client in case of exception while server is writing blocks. In previous versions client may get misleading message like `Data compressed with different methods`. [#22427](https://github.com/ClickHouse/ClickHouse/pull/22427) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix error `Directory tmp_fetch_XXX already exists` which could happen after failed fetch part. Delete temporary fetch directory if it already exists. Fixes [#14197](https://github.com/ClickHouse/ClickHouse/issues/14197). [#22411](https://github.com/ClickHouse/ClickHouse/pull/22411) ([nvartolomei](https://github.com/nvartolomei)). +* Fix MSan report for function `range` with `UInt256` argument (support for large integers is experimental). This closes [#22157](https://github.com/ClickHouse/ClickHouse/issues/22157). [#22387](https://github.com/ClickHouse/ClickHouse/pull/22387) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `current_database` column to `system.processes` table. It contains the current database of the query. [#22365](https://github.com/ClickHouse/ClickHouse/pull/22365) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add case-insensitive history search/navigation and subword movement features to `clickhouse-client`. [#22105](https://github.com/ClickHouse/ClickHouse/pull/22105) ([Amos Bird](https://github.com/amosbird)). +* If tuple of NULLs, e.g. `(NULL, NULL)` is on the left hand side of `IN` operator with tuples of non-NULLs on the right hand side, e.g. `SELECT (NULL, NULL) IN ((0, 0), (3, 1))` return 0 instead of throwing an exception about incompatible types. The expression may also appear due to optimization of something like `SELECT (NULL, NULL) = (8, 0) OR (NULL, NULL) = (3, 2) OR (NULL, NULL) = (0, 0) OR (NULL, NULL) = (3, 1)`. This closes [#22017](https://github.com/ClickHouse/ClickHouse/issues/22017). [#22063](https://github.com/ClickHouse/ClickHouse/pull/22063) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update used version of simdjson to 0.9.1. This fixes [#21984](https://github.com/ClickHouse/ClickHouse/issues/21984). [#22057](https://github.com/ClickHouse/ClickHouse/pull/22057) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added case insensitive aliases for `CONNECTION_ID()` and `VERSION()` functions. This fixes [#22028](https://github.com/ClickHouse/ClickHouse/issues/22028). [#22042](https://github.com/ClickHouse/ClickHouse/pull/22042) ([Eugene Klimov](https://github.com/Slach)). +* Add option `strict_increase` to `windowFunnel` function to calculate each event once (resolve [#21835](https://github.com/ClickHouse/ClickHouse/issues/21835)). [#22025](https://github.com/ClickHouse/ClickHouse/pull/22025) ([Vladimir](https://github.com/vdimir)). +* If partition key of a `MergeTree` table does not include `Date` or `DateTime` columns but includes exactly one `DateTime64` column, expose its values in the `min_time` and `max_time` columns in `system.parts` and `system.parts_columns` tables. Add `min_time` and `max_time` columns to `system.parts_columns` table (these was inconsistency to the `system.parts` table). This closes [#18244](https://github.com/ClickHouse/ClickHouse/issues/18244). [#22011](https://github.com/ClickHouse/ClickHouse/pull/22011) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Supported `replication_alter_partitions_sync=1` setting in `clickhouse-copier` for moving partitions from helping table to destination. Decreased default timeouts. Fixes [#21911](https://github.com/ClickHouse/ClickHouse/issues/21911). [#21912](https://github.com/ClickHouse/ClickHouse/pull/21912) ([turbo jason](https://github.com/songenjie)). +* Show path to data directory of `EmbeddedRocksDB` tables in system tables. [#21903](https://github.com/ClickHouse/ClickHouse/pull/21903) ([tavplubix](https://github.com/tavplubix)). +* Add profile event `HedgedRequestsChangeReplica`, change read data timeout from sec to ms. [#21886](https://github.com/ClickHouse/ClickHouse/pull/21886) ([Kruglov Pavel](https://github.com/Avogar)). +* DiskS3 (experimental feature under development). Fixed bug with the impossibility to move directory if the destination is not empty and cache disk is used. [#21837](https://github.com/ClickHouse/ClickHouse/pull/21837) ([Pavel Kovalenko](https://github.com/Jokser)). +* Better formatting for `Array` and `Map` data types in Web UI. [#21798](https://github.com/ClickHouse/ClickHouse/pull/21798) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update clusters only if their configurations were updated. [#21685](https://github.com/ClickHouse/ClickHouse/pull/21685) ([Kruglov Pavel](https://github.com/Avogar)). +* Propagate query and session settings for distributed DDL queries. Set `distributed_ddl_entry_format_version` to 2 to enable this. Added `distributed_ddl_output_mode` setting. Supported modes: `none`, `throw` (default), `null_status_on_timeout` and `never_throw`. Miscellaneous fixes and improvements for `Replicated` database engine. [#21535](https://github.com/ClickHouse/ClickHouse/pull/21535) ([tavplubix](https://github.com/tavplubix)). +* If `PODArray` was instantiated with element size that is neither a fraction or a multiple of 16, buffer overflow was possible. No bugs in current releases exist. [#21533](https://github.com/ClickHouse/ClickHouse/pull/21533) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `last_error_time`/`last_error_message`/`last_error_stacktrace`/`remote` columns for `system.errors`. [#21529](https://github.com/ClickHouse/ClickHouse/pull/21529) ([Azat Khuzhin](https://github.com/azat)). +* Add aliases `simpleJSONExtract/simpleJSONHas` to `visitParam/visitParamExtract{UInt, Int, Bool, Float, Raw, String}`. Fixes #21383. [#21519](https://github.com/ClickHouse/ClickHouse/pull/21519) ([fastio](https://github.com/fastio)). +* Add setting `optimize_skip_unused_shards_limit` to limit the number of sharding key values for `optimize_skip_unused_shards`. [#21512](https://github.com/ClickHouse/ClickHouse/pull/21512) ([Azat Khuzhin](https://github.com/azat)). +* Improve `clickhouse-format` to not throw exception when there are extra spaces or comment after the last query, and throw exception early with readable message when format `ASTInsertQuery` with data . [#21311](https://github.com/ClickHouse/ClickHouse/pull/21311) ([flynn](https://github.com/ucasFL)). +* Improve support of integer keys in data type `Map`. [#21157](https://github.com/ClickHouse/ClickHouse/pull/21157) ([Anton Popov](https://github.com/CurtizJ)). +* MaterializeMySQL: attempt to reconnect to MySQL if the connection is lost. [#20961](https://github.com/ClickHouse/ClickHouse/pull/20961) ([Håvard Kvålen](https://github.com/havardk)). +* Support more cases to rewrite `CROSS JOIN` to `INNER JOIN`. [#20392](https://github.com/ClickHouse/ClickHouse/pull/20392) ([Vladimir](https://github.com/vdimir)). +* Do not create empty parts on INSERT when `optimize_on_insert` setting enabled. Fixes [#20304](https://github.com/ClickHouse/ClickHouse/issues/20304). [#20387](https://github.com/ClickHouse/ClickHouse/pull/20387) ([Kruglov Pavel](https://github.com/Avogar)). +* `MaterializeMySQL`: add minmax skipping index for `_version` column. [#20382](https://github.com/ClickHouse/ClickHouse/pull/20382) ([Stig Bakken](https://github.com/stigsb)). +* Add option `--backslash` for `clickhouse-format`, which can add a backslash at the end of each line of the formatted query. [#21494](https://github.com/ClickHouse/ClickHouse/pull/21494) ([flynn](https://github.com/ucasFL)). +* Now clickhouse will not throw `LOGICAL_ERROR` exception when we try to mutate the already covered part. Fixes [#22013](https://github.com/ClickHouse/ClickHouse/issues/22013). [#22291](https://github.com/ClickHouse/ClickHouse/pull/22291) ([alesapin](https://github.com/alesapin)). + +#### Bug Fix + +* Remove socket from epoll before cancelling packet receiver in `HedgedConnections` to prevent possible race. Fixes [#22161](https://github.com/ClickHouse/ClickHouse/issues/22161). [#22443](https://github.com/ClickHouse/ClickHouse/pull/22443) ([Kruglov Pavel](https://github.com/Avogar)). +* Add (missing) memory accounting in parallel parsing routines. In previous versions OOM was possible when the resultset contains very large blocks of data. This closes [#22008](https://github.com/ClickHouse/ClickHouse/issues/22008). [#22425](https://github.com/ClickHouse/ClickHouse/pull/22425) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix exception which may happen when `SELECT` has constant `WHERE` condition and source table has columns which names are digits. [#22270](https://github.com/ClickHouse/ClickHouse/pull/22270) ([LiuNeng](https://github.com/liuneng1994)). +* Fix query cancellation with `use_hedged_requests=0` and `async_socket_for_remote=1`. [#22183](https://github.com/ClickHouse/ClickHouse/pull/22183) ([Azat Khuzhin](https://github.com/azat)). +* Fix uncaught exception in `InterserverIOHTTPHandler`. [#22146](https://github.com/ClickHouse/ClickHouse/pull/22146) ([Azat Khuzhin](https://github.com/azat)). +* Fix docker entrypoint in case `http_port` is not in the config. [#22132](https://github.com/ClickHouse/ClickHouse/pull/22132) ([Ewout](https://github.com/devwout)). +* Fix error `Invalid number of rows in Chunk` in `JOIN` with `TOTALS` and `arrayJoin`. Closes [#19303](https://github.com/ClickHouse/ClickHouse/issues/19303). [#22129](https://github.com/ClickHouse/ClickHouse/pull/22129) ([Vladimir](https://github.com/vdimir)). +* Fix the background thread pool name which used to poll message from Kafka. The Kafka engine with the broken thread pool will not consume the message from message queue. [#22122](https://github.com/ClickHouse/ClickHouse/pull/22122) ([fastio](https://github.com/fastio)). +* Fix waiting for `OPTIMIZE` and `ALTER` queries for `ReplicatedMergeTree` table engines. Now the query will not hang when the table was detached or restarted. [#22118](https://github.com/ClickHouse/ClickHouse/pull/22118) ([alesapin](https://github.com/alesapin)). +* Disable `async_socket_for_remote`/`use_hedged_requests` for buggy Linux kernels. [#22109](https://github.com/ClickHouse/ClickHouse/pull/22109) ([Azat Khuzhin](https://github.com/azat)). +* Docker entrypoint: avoid chown of `.` in case when `LOG_PATH` is empty. Closes [#22100](https://github.com/ClickHouse/ClickHouse/issues/22100). [#22102](https://github.com/ClickHouse/ClickHouse/pull/22102) ([filimonov](https://github.com/filimonov)). +* The function `decrypt` was lacking a check for the minimal size of data encrypted in `AEAD` mode. This closes [#21897](https://github.com/ClickHouse/ClickHouse/issues/21897). [#22064](https://github.com/ClickHouse/ClickHouse/pull/22064) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* In rare case, merge for `CollapsingMergeTree` may create granule with `index_granularity + 1` rows. Because of this, internal check, added in [#18928](https://github.com/ClickHouse/ClickHouse/issues/18928) (affects 21.2 and 21.3), may fail with error `Incomplete granules are not allowed while blocks are granules size`. This error did not allow parts to merge. [#21976](https://github.com/ClickHouse/ClickHouse/pull/21976) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Reverted [#15454](https://github.com/ClickHouse/ClickHouse/issues/15454) that may cause significant increase in memory usage while loading external dictionaries of hashed type. This closes [#21935](https://github.com/ClickHouse/ClickHouse/issues/21935). [#21948](https://github.com/ClickHouse/ClickHouse/pull/21948) ([Maksim Kita](https://github.com/kitaisreal)). +* Prevent hedged connections overlaps (`Unknown packet 9 from server` error). [#21941](https://github.com/ClickHouse/ClickHouse/pull/21941) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading the HTTP POST request with "multipart/form-data" content type in some cases. [#21936](https://github.com/ClickHouse/ClickHouse/pull/21936) ([Ivan](https://github.com/abyss7)). +* Fix wrong `ORDER BY` results when a query contains window functions, and optimization for reading in primary key order is applied. Fixes [#21828](https://github.com/ClickHouse/ClickHouse/issues/21828). [#21915](https://github.com/ClickHouse/ClickHouse/pull/21915) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Fix deadlock in first catboost model execution. Closes [#13832](https://github.com/ClickHouse/ClickHouse/issues/13832). [#21844](https://github.com/ClickHouse/ClickHouse/pull/21844) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix incorrect query result (and possible crash) which could happen when `WHERE` or `HAVING` condition is pushed before `GROUP BY`. Fixes [#21773](https://github.com/ClickHouse/ClickHouse/issues/21773). [#21841](https://github.com/ClickHouse/ClickHouse/pull/21841) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Better error handling and logging in `WriteBufferFromS3`. [#21836](https://github.com/ClickHouse/ClickHouse/pull/21836) ([Pavel Kovalenko](https://github.com/Jokser)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. This is a follow-up fix of [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) . Can only reproduced in production env. [#21818](https://github.com/ClickHouse/ClickHouse/pull/21818) ([Amos Bird](https://github.com/amosbird)). +* Fix scalar subquery index analysis. This fixes [#21717](https://github.com/ClickHouse/ClickHouse/issues/21717) , which was introduced in [#18896](https://github.com/ClickHouse/ClickHouse/pull/18896). [#21766](https://github.com/ClickHouse/ClickHouse/pull/21766) ([Amos Bird](https://github.com/amosbird)). +* Fix bug for `ReplicatedMerge` table engines when `ALTER MODIFY COLUMN` query doesn't change the type of `Decimal` column if its size (32 bit or 64 bit) doesn't change. [#21728](https://github.com/ClickHouse/ClickHouse/pull/21728) ([alesapin](https://github.com/alesapin)). +* Fix possible infinite waiting when concurrent `OPTIMIZE` and `DROP` are run for `ReplicatedMergeTree`. [#21716](https://github.com/ClickHouse/ClickHouse/pull/21716) ([Azat Khuzhin](https://github.com/azat)). +* Fix function `arrayElement` with type `Map` for constant integer arguments. [#21699](https://github.com/ClickHouse/ClickHouse/pull/21699) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SIGSEGV on not existing attributes from `ip_trie` with `access_to_key_from_attributes`. [#21692](https://github.com/ClickHouse/ClickHouse/pull/21692) ([Azat Khuzhin](https://github.com/azat)). +* Server now start accepting connections only after `DDLWorker` and dictionaries initialization. [#21676](https://github.com/ClickHouse/ClickHouse/pull/21676) ([Azat Khuzhin](https://github.com/azat)). +* Add type conversion for keys of tables of type `Join` (previously led to SIGSEGV). [#21646](https://github.com/ClickHouse/ClickHouse/pull/21646) ([Azat Khuzhin](https://github.com/azat)). +* Fix distributed requests cancellation (for example simple select from multiple shards with limit, i.e. `select * from remote('127.{2,3}', system.numbers) limit 100`) with `async_socket_for_remote=1`. [#21643](https://github.com/ClickHouse/ClickHouse/pull/21643) ([Azat Khuzhin](https://github.com/azat)). +* Fix `fsync_part_directory` for horizontal merge. [#21642](https://github.com/ClickHouse/ClickHouse/pull/21642) ([Azat Khuzhin](https://github.com/azat)). +* Remove unknown columns from joined table in `WHERE` for queries to external database engines (MySQL, PostgreSQL). close [#14614](https://github.com/ClickHouse/ClickHouse/issues/14614), close [#19288](https://github.com/ClickHouse/ClickHouse/issues/19288) (dup), close [#19645](https://github.com/ClickHouse/ClickHouse/issues/19645) (dup). [#21640](https://github.com/ClickHouse/ClickHouse/pull/21640) ([Vladimir](https://github.com/vdimir)). +* `std::terminate` was called if there is an error writing data into s3. [#21624](https://github.com/ClickHouse/ClickHouse/pull/21624) ([Vladimir](https://github.com/vdimir)). +* Fix possible error `Cannot find column` when `optimize_skip_unused_shards` is enabled and zero shards are used. [#21579](https://github.com/ClickHouse/ClickHouse/pull/21579) ([Azat Khuzhin](https://github.com/azat)). +* In case if query has constant `WHERE` condition, and setting `optimize_skip_unused_shards` enabled, all shards may be skipped and query could return incorrect empty result. [#21550](https://github.com/ClickHouse/ClickHouse/pull/21550) ([Amos Bird](https://github.com/amosbird)). +* Fix table function `clusterAllReplicas` returns wrong `_shard_num`. close [#21481](https://github.com/ClickHouse/ClickHouse/issues/21481). [#21498](https://github.com/ClickHouse/ClickHouse/pull/21498) ([flynn](https://github.com/ucasFL)). +* Fix that S3 table holds old credentials after config update. [#21457](https://github.com/ClickHouse/ClickHouse/pull/21457) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Fixed race on SSL object inside `SecureSocket` in Poco. [#21456](https://github.com/ClickHouse/ClickHouse/pull/21456) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `Avro` format parsing for `Kafka`. Fixes [#21437](https://github.com/ClickHouse/ClickHouse/issues/21437). [#21438](https://github.com/ClickHouse/ClickHouse/pull/21438) ([Ilya Golshtein](https://github.com/ilejn)). +* Fix receive and send timeouts and non-blocking read in secure socket. [#21429](https://github.com/ClickHouse/ClickHouse/pull/21429) ([Kruglov Pavel](https://github.com/Avogar)). +* `force_drop_table` flag didn't work for `MATERIALIZED VIEW`, it's fixed. Fixes [#18943](https://github.com/ClickHouse/ClickHouse/issues/18943). [#20626](https://github.com/ClickHouse/ClickHouse/pull/20626) ([tavplubix](https://github.com/tavplubix)). +* Fix name clashes in `PredicateRewriteVisitor`. It caused incorrect `WHERE` filtration after full join. Close [#20497](https://github.com/ClickHouse/ClickHouse/issues/20497). [#20622](https://github.com/ClickHouse/ClickHouse/pull/20622) ([Vladimir](https://github.com/vdimir)). + +#### Build/Testing/Packaging Improvement + +* Add [Jepsen](https://github.com/jepsen-io/jepsen) tests for ClickHouse Keeper. [#21677](https://github.com/ClickHouse/ClickHouse/pull/21677) ([alesapin](https://github.com/alesapin)). +* Run stateless tests in parallel in CI. Depends on [#22181](https://github.com/ClickHouse/ClickHouse/issues/22181). [#22300](https://github.com/ClickHouse/ClickHouse/pull/22300) ([alesapin](https://github.com/alesapin)). +* Enable status check for [SQLancer](https://github.com/sqlancer/sqlancer) CI run. [#22015](https://github.com/ClickHouse/ClickHouse/pull/22015) ([Ilya Yatsishin](https://github.com/qoega)). +* Multiple preparations for PowerPC builds: Enable the bundled openldap on `ppc64le`. [#22487](https://github.com/ClickHouse/ClickHouse/pull/22487) ([Kfir Itzhak](https://github.com/mastertheknife)). Enable compiling on `ppc64le` with Clang. [#22476](https://github.com/ClickHouse/ClickHouse/pull/22476) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix compiling boost on `ppc64le`. [#22474](https://github.com/ClickHouse/ClickHouse/pull/22474) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix CMake error about internal CMake variable `CMAKE_ASM_COMPILE_OBJECT` not set on `ppc64le`. [#22469](https://github.com/ClickHouse/ClickHouse/pull/22469) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix Fedora/RHEL/CentOS not finding `libclang_rt.builtins` on `ppc64le`. [#22458](https://github.com/ClickHouse/ClickHouse/pull/22458) ([Kfir Itzhak](https://github.com/mastertheknife)). Enable building with `jemalloc` on `ppc64le`. [#22447](https://github.com/ClickHouse/ClickHouse/pull/22447) ([Kfir Itzhak](https://github.com/mastertheknife)). Fix ClickHouse's config embedding and cctz's timezone embedding on `ppc64le`. [#22445](https://github.com/ClickHouse/ClickHouse/pull/22445) ([Kfir Itzhak](https://github.com/mastertheknife)). Fixed compiling on `ppc64le` and use the correct instruction pointer register on `ppc64le`. [#22430](https://github.com/ClickHouse/ClickHouse/pull/22430) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Re-enable the S3 (AWS) library on `aarch64`. [#22484](https://github.com/ClickHouse/ClickHouse/pull/22484) ([Kfir Itzhak](https://github.com/mastertheknife)). +* Add `tzdata` to Docker containers because reading `ORC` formats requires it. This closes [#14156](https://github.com/ClickHouse/ClickHouse/issues/14156). [#22000](https://github.com/ClickHouse/ClickHouse/pull/22000) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Introduce 2 arguments for `clickhouse-server` image Dockerfile: `deb_location` & `single_binary_location`. [#21977](https://github.com/ClickHouse/ClickHouse/pull/21977) ([filimonov](https://github.com/filimonov)). +* Allow to use clang-tidy with release builds by enabling assertions if it is used. [#21914](https://github.com/ClickHouse/ClickHouse/pull/21914) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add llvm-12 binaries name to search in cmake scripts. Implicit constants conversions to mute clang warnings. Updated submodules to build with CMake 3.19. Mute recursion in macro expansion in `readpassphrase` library. Deprecated `-fuse-ld` changed to `--ld-path` for clang. [#21597](https://github.com/ClickHouse/ClickHouse/pull/21597) ([Ilya Yatsishin](https://github.com/qoega)). +* Updating `docker/test/testflows/runner/dockerd-entrypoint.sh` to use Yandex dockerhub-proxy, because Docker Hub has enabled very restrictive rate limits [#21551](https://github.com/ClickHouse/ClickHouse/pull/21551) ([vzakaznikov](https://github.com/vzakaznikov)). +* Fix macOS shared lib build. [#20184](https://github.com/ClickHouse/ClickHouse/pull/20184) ([nvartolomei](https://github.com/nvartolomei)). +* Add `ctime` option to `zookeeper-dump-tree`. It allows to dump node creation time. [#21842](https://github.com/ClickHouse/ClickHouse/pull/21842) ([Ilya](https://github.com/HumanUser)). + + +## ClickHouse release 21.3 (LTS) + +### ClickHouse release v21.3, 2021-03-12 + +#### Backward Incompatible Change + +* Now it's not allowed to create MergeTree tables in old syntax with table TTL because it's just ignored. Attach of old tables is still possible. [#20282](https://github.com/ClickHouse/ClickHouse/pull/20282) ([alesapin](https://github.com/alesapin)). +* Now all case-insensitive function names will be rewritten to their canonical representations. This is needed for projection query routing (the upcoming feature). [#20174](https://github.com/ClickHouse/ClickHouse/pull/20174) ([Amos Bird](https://github.com/amosbird)). +* Fix creation of `TTL` in cases, when its expression is a function and it is the same as `ORDER BY` key. Now it's allowed to set custom aggregation to primary key columns in `TTL` with `GROUP BY`. Backward incompatible: For primary key columns, which are not in `GROUP BY` and aren't set explicitly now is applied function `any` instead of `max`, when TTL is expired. Also if you use TTL with `WHERE` or `GROUP BY` you can see exceptions at merges, while making rolling update. [#15450](https://github.com/ClickHouse/ClickHouse/pull/15450) ([Anton Popov](https://github.com/CurtizJ)). + +#### New Feature + +* Add file engine settings: `engine_file_empty_if_not_exists` and `engine_file_truncate_on_insert`. [#20620](https://github.com/ClickHouse/ClickHouse/pull/20620) ([M0r64n](https://github.com/M0r64n)). +* Add aggregate function `deltaSum` for summing the differences between consecutive rows. [#20057](https://github.com/ClickHouse/ClickHouse/pull/20057) ([Russ Frank](https://github.com/rf)). +* New `event_time_microseconds` column in `system.part_log` table. [#20027](https://github.com/ClickHouse/ClickHouse/pull/20027) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `timezoneOffset(datetime)` function which will give the offset from UTC in seconds. This close [#issue:19850](https://github.com/ClickHouse/ClickHouse/issues/19850). [#19962](https://github.com/ClickHouse/ClickHouse/pull/19962) ([keenwolf](https://github.com/keen-wolf)). +* Add setting `insert_shard_id` to support insert data into specific shard from distributed table. [#19961](https://github.com/ClickHouse/ClickHouse/pull/19961) ([flynn](https://github.com/ucasFL)). +* Function `reinterpretAs` updated to support big integers. Fixes [#19691](https://github.com/ClickHouse/ClickHouse/issues/19691). [#19858](https://github.com/ClickHouse/ClickHouse/pull/19858) ([Maksim Kita](https://github.com/kitaisreal)). +* Added Server Side Encryption Customer Keys (the `x-amz-server-side-encryption-customer-(key/md5)` header) support in S3 client. See [the link](https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html). Closes [#19428](https://github.com/ClickHouse/ClickHouse/issues/19428). [#19748](https://github.com/ClickHouse/ClickHouse/pull/19748) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Added `implicit_key` option for `executable` dictionary source. It allows to avoid printing key for every record if records comes in the same order as the input keys. Implements [#14527](https://github.com/ClickHouse/ClickHouse/issues/14527). [#19677](https://github.com/ClickHouse/ClickHouse/pull/19677) ([Maksim Kita](https://github.com/kitaisreal)). +* Add quota type `query_selects` and `query_inserts`. [#19603](https://github.com/ClickHouse/ClickHouse/pull/19603) ([JackyWoo](https://github.com/JackyWoo)). +* Add function `extractTextFromHTML` [#19600](https://github.com/ClickHouse/ClickHouse/pull/19600) ([zlx19950903](https://github.com/zlx19950903)), ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Tables with `MergeTree*` engine now have two new table-level settings for query concurrency control. Setting `max_concurrent_queries` limits the number of concurrently executed queries which are related to this table. Setting `min_marks_to_honor_max_concurrent_queries` tells to apply previous setting only if query reads at least this number of marks. [#19544](https://github.com/ClickHouse/ClickHouse/pull/19544) ([Amos Bird](https://github.com/amosbird)). +* Added `file` function to read file from user_files directory as a String. This is different from the `file` table function. This implements [#issue:18851](https://github.com/ClickHouse/ClickHouse/issues/18851). [#19204](https://github.com/ClickHouse/ClickHouse/pull/19204) ([keenwolf](https://github.com/keen-wolf)). + +#### Experimental feature + +* Add experimental `Replicated` database engine. It replicates DDL queries across multiple hosts. [#16193](https://github.com/ClickHouse/ClickHouse/pull/16193) ([tavplubix](https://github.com/tavplubix)). +* Introduce experimental support for window functions, enabled with `allow_experimental_window_functions = 1`. This is a preliminary, alpha-quality implementation that is not suitable for production use and will change in backward-incompatible ways in future releases. Please see [the documentation](https://github.com/ClickHouse/ClickHouse/blob/master/docs/en/sql-reference/window-functions/index.md#experimental-window-functions) for the list of supported features. [#20337](https://github.com/ClickHouse/ClickHouse/pull/20337) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Add the ability to backup/restore metadata files for DiskS3. [#18377](https://github.com/ClickHouse/ClickHouse/pull/18377) ([Pavel Kovalenko](https://github.com/Jokser)). + +#### Performance Improvement + +* Hedged requests for remote queries. When setting `use_hedged_requests` enabled (off by default), allow to establish many connections with different replicas for query. New connection is enabled in case existent connection(s) with replica(s) were not established within `hedged_connection_timeout` or no data was received within `receive_data_timeout`. Query uses the first connection which send non empty progress packet (or data packet, if `allow_changing_replica_until_first_data_packet`); other connections are cancelled. Queries with `max_parallel_replicas > 1` are supported. [#19291](https://github.com/ClickHouse/ClickHouse/pull/19291) ([Kruglov Pavel](https://github.com/Avogar)). This allows to significantly reduce tail latencies on very large clusters. +* Added support for `PREWHERE` (and enable the corresponding optimization) when tables have row-level security expressions specified. [#19576](https://github.com/ClickHouse/ClickHouse/pull/19576) ([Denis Glazachev](https://github.com/traceon)). +* The setting `distributed_aggregation_memory_efficient` is enabled by default. It will lower memory usage and improve performance of distributed queries. [#20599](https://github.com/ClickHouse/ClickHouse/pull/20599) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of GROUP BY multiple fixed size keys. [#20472](https://github.com/ClickHouse/ClickHouse/pull/20472) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of aggregate functions by more strict aliasing. [#19946](https://github.com/ClickHouse/ClickHouse/pull/19946) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Speed up reading from `Memory` tables in extreme cases (when reading speed is in order of 50 GB/sec) by simplification of pipeline and (consequently) less lock contention in pipeline scheduling. [#20468](https://github.com/ClickHouse/ClickHouse/pull/20468) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Partially reimplement HTTP server to make it making less copies of incoming and outgoing data. It gives up to 1.5 performance improvement on inserting long records over HTTP. [#19516](https://github.com/ClickHouse/ClickHouse/pull/19516) ([Ivan](https://github.com/abyss7)). +* Add `compress` setting for `Memory` tables. If it's enabled the table will use less RAM. On some machines and datasets it can also work faster on SELECT, but it is not always the case. This closes [#20093](https://github.com/ClickHouse/ClickHouse/issues/20093). Note: there are reasons why Memory tables can work slower than MergeTree: (1) lack of compression (2) static size of blocks (3) lack of indices and prewhere... [#20168](https://github.com/ClickHouse/ClickHouse/pull/20168) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Slightly better code in aggregation. [#20978](https://github.com/ClickHouse/ClickHouse/pull/20978) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add back `intDiv`/`modulo` specializations for better performance. This fixes [#21293](https://github.com/ClickHouse/ClickHouse/issues/21293) . The regression was introduced in https://github.com/ClickHouse/ClickHouse/pull/18145 . [#21307](https://github.com/ClickHouse/ClickHouse/pull/21307) ([Amos Bird](https://github.com/amosbird)). +* Do not squash blocks too much on INSERT SELECT if inserting into Memory table. In previous versions inefficient data representation was created in Memory table after INSERT SELECT. This closes [#13052](https://github.com/ClickHouse/ClickHouse/issues/13052). [#20169](https://github.com/ClickHouse/ClickHouse/pull/20169) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix at least one case when DataType parser may have exponential complexity (found by fuzzer). This closes [#20096](https://github.com/ClickHouse/ClickHouse/issues/20096). [#20132](https://github.com/ClickHouse/ClickHouse/pull/20132) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Parallelize SELECT with FINAL for single part with level > 0 when `do_not_merge_across_partitions_select_final` setting is 1. [#19375](https://github.com/ClickHouse/ClickHouse/pull/19375) ([Kruglov Pavel](https://github.com/Avogar)). +* Fill only requested columns when querying `system.parts` and `system.parts_columns`. Closes [#19570](https://github.com/ClickHouse/ClickHouse/issues/19570). [#21035](https://github.com/ClickHouse/ClickHouse/pull/21035) ([Anmol Arora](https://github.com/anmolarora)). +* Perform algebraic optimizations of arithmetic expressions inside `avg` aggregate function. close [#20092](https://github.com/ClickHouse/ClickHouse/issues/20092). [#20183](https://github.com/ClickHouse/ClickHouse/pull/20183) ([flynn](https://github.com/ucasFL)). + +#### Improvement + +* Case-insensitive compression methods for table functions. Also fixed LZMA compression method which was checked in upper case. [#21416](https://github.com/ClickHouse/ClickHouse/pull/21416) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add two settings to delay or throw error during insertion when there are too many inactive parts. This is useful when server fails to clean up parts quickly enough. [#20178](https://github.com/ClickHouse/ClickHouse/pull/20178) ([Amos Bird](https://github.com/amosbird)). +* Provide better compatibility for mysql clients. 1. mysql jdbc 2. mycli. [#21367](https://github.com/ClickHouse/ClickHouse/pull/21367) ([Amos Bird](https://github.com/amosbird)). +* Forbid to drop a column if it's referenced by materialized view. Closes [#21164](https://github.com/ClickHouse/ClickHouse/issues/21164). [#21303](https://github.com/ClickHouse/ClickHouse/pull/21303) ([flynn](https://github.com/ucasFL)). +* MySQL dictionary source will now retry unexpected connection failures (Lost connection to MySQL server during query) which sometimes happen on SSL/TLS connections. [#21237](https://github.com/ClickHouse/ClickHouse/pull/21237) ([Alexander Kazakov](https://github.com/Akazz)). +* Usability improvement: more consistent `DateTime64` parsing: recognize the case when unix timestamp with subsecond resolution is specified as scaled integer (like `1111111111222` instead of `1111111111.222`). This closes [#13194](https://github.com/ClickHouse/ClickHouse/issues/13194). [#21053](https://github.com/ClickHouse/ClickHouse/pull/21053) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Do only merging of sorted blocks on initiator with distributed_group_by_no_merge. [#20882](https://github.com/ClickHouse/ClickHouse/pull/20882) ([Azat Khuzhin](https://github.com/azat)). +* When loading config for mysql source ClickHouse will now randomize the list of replicas with the same priority to ensure the round-robin logics of picking mysql endpoint. This closes [#20629](https://github.com/ClickHouse/ClickHouse/issues/20629). [#20632](https://github.com/ClickHouse/ClickHouse/pull/20632) ([Alexander Kazakov](https://github.com/Akazz)). +* Function 'reinterpretAs(x, Type)' renamed into 'reinterpret(x, Type)'. [#20611](https://github.com/ClickHouse/ClickHouse/pull/20611) ([Maksim Kita](https://github.com/kitaisreal)). +* Support vhost for RabbitMQ engine [#20576](https://github.com/ClickHouse/ClickHouse/issues/20576). [#20596](https://github.com/ClickHouse/ClickHouse/pull/20596) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improved serialization for data types combined of Arrays and Tuples. Improved matching enum data types to protobuf enum type. Fixed serialization of the `Map` data type. Omitted values are now set by default. [#20506](https://github.com/ClickHouse/ClickHouse/pull/20506) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed race between execution of distributed DDL tasks and cleanup of DDL queue. Now DDL task cannot be removed from ZooKeeper if there are active workers. Fixes [#20016](https://github.com/ClickHouse/ClickHouse/issues/20016). [#20448](https://github.com/ClickHouse/ClickHouse/pull/20448) ([tavplubix](https://github.com/tavplubix)). +* Make FQDN and other DNS related functions work correctly in alpine images. [#20336](https://github.com/ClickHouse/ClickHouse/pull/20336) ([filimonov](https://github.com/filimonov)). +* Do not allow early constant folding of explicitly forbidden functions. [#20303](https://github.com/ClickHouse/ClickHouse/pull/20303) ([Azat Khuzhin](https://github.com/azat)). +* Implicit conversion from integer to Decimal type might succeeded if integer value doe not fit into Decimal type. Now it throws `ARGUMENT_OUT_OF_BOUND`. [#20232](https://github.com/ClickHouse/ClickHouse/pull/20232) ([tavplubix](https://github.com/tavplubix)). +* Lockless `SYSTEM FLUSH DISTRIBUTED`. [#20215](https://github.com/ClickHouse/ClickHouse/pull/20215) ([Azat Khuzhin](https://github.com/azat)). +* Normalize count(constant), sum(1) to count(). This is needed for projection query routing. [#20175](https://github.com/ClickHouse/ClickHouse/pull/20175) ([Amos Bird](https://github.com/amosbird)). +* Support all native integer types in bitmap functions. [#20171](https://github.com/ClickHouse/ClickHouse/pull/20171) ([Amos Bird](https://github.com/amosbird)). +* Updated `CacheDictionary`, `ComplexCacheDictionary`, `SSDCacheDictionary`, `SSDComplexKeyDictionary` to use LRUHashMap as underlying index. [#20164](https://github.com/ClickHouse/ClickHouse/pull/20164) ([Maksim Kita](https://github.com/kitaisreal)). +* The setting `access_management` is now configurable on startup by providing `CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT`, defaults to disabled (`0`) which was the prior value. [#20139](https://github.com/ClickHouse/ClickHouse/pull/20139) ([Marquitos](https://github.com/sonirico)). +* Fix toDateTime64(toDate()/toDateTime()) for DateTime64 - Implement DateTime64 clamping to match DateTime behaviour. [#20131](https://github.com/ClickHouse/ClickHouse/pull/20131) ([Azat Khuzhin](https://github.com/azat)). +* Quota improvements: SHOW TABLES is now considered as one query in the quota calculations, not two queries. SYSTEM queries now consume quota. Fix calculation of interval's end in quota consumption. [#20106](https://github.com/ClickHouse/ClickHouse/pull/20106) ([Vitaly Baranov](https://github.com/vitlibar)). +* Supports `path IN (set)` expressions for `system.zookeeper` table. [#20105](https://github.com/ClickHouse/ClickHouse/pull/20105) ([小路](https://github.com/nicelulu)). +* Show full details of `MaterializeMySQL` tables in `system.tables`. [#20051](https://github.com/ClickHouse/ClickHouse/pull/20051) ([Stig Bakken](https://github.com/stigsb)). +* Fix data race in executable dictionary that was possible only on misuse (when the script returns data ignoring its input). [#20045](https://github.com/ClickHouse/ClickHouse/pull/20045) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The value of MYSQL_OPT_RECONNECT option can now be controlled by "opt_reconnect" parameter in the config section of mysql replica. [#19998](https://github.com/ClickHouse/ClickHouse/pull/19998) ([Alexander Kazakov](https://github.com/Akazz)). +* If user calls `JSONExtract` function with `Float32` type requested, allow inaccurate conversion to the result type. For example the number `0.1` in JSON is double precision and is not representable in Float32, but the user still wants to get it. Previous versions return 0 for non-Nullable type and NULL for Nullable type to indicate that conversion is imprecise. The logic was 100% correct but it was surprising to users and leading to questions. This closes [#13962](https://github.com/ClickHouse/ClickHouse/issues/13962). [#19960](https://github.com/ClickHouse/ClickHouse/pull/19960) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add conversion of block structure for INSERT into Distributed tables if it does not match. [#19947](https://github.com/ClickHouse/ClickHouse/pull/19947) ([Azat Khuzhin](https://github.com/azat)). +* Improvement for the `system.distributed_ddl_queue` table. Initialize MaxDDLEntryID to the last value after restarting. Before this PR, MaxDDLEntryID will remain zero until a new DDLTask is processed. [#19924](https://github.com/ClickHouse/ClickHouse/pull/19924) ([Amos Bird](https://github.com/amosbird)). +* Show `MaterializeMySQL` tables in `system.parts`. [#19770](https://github.com/ClickHouse/ClickHouse/pull/19770) ([Stig Bakken](https://github.com/stigsb)). +* Add separate config directive for `Buffer` profile. [#19721](https://github.com/ClickHouse/ClickHouse/pull/19721) ([Azat Khuzhin](https://github.com/azat)). +* Move conditions that are not related to JOIN to WHERE clause. [#18720](https://github.com/ClickHouse/ClickHouse/issues/18720). [#19685](https://github.com/ClickHouse/ClickHouse/pull/19685) ([hexiaoting](https://github.com/hexiaoting)). +* Add ability to throttle INSERT into Distributed based on amount of pending bytes for async send (`bytes_to_delay_insert`/`max_delay_to_insert` and `bytes_to_throw_insert` settings for `Distributed` engine has been added). [#19673](https://github.com/ClickHouse/ClickHouse/pull/19673) ([Azat Khuzhin](https://github.com/azat)). +* Fix some rare cases when write errors can be ignored in destructors. [#19451](https://github.com/ClickHouse/ClickHouse/pull/19451) ([Azat Khuzhin](https://github.com/azat)). +* Print inline frames in stack traces for fatal errors. [#19317](https://github.com/ClickHouse/ClickHouse/pull/19317) ([Ivan](https://github.com/abyss7)). + +#### Bug Fix + +* Fix redundant reconnects to ZooKeeper and the possibility of two active sessions for a single clickhouse server. Both problems introduced in #14678. [#21264](https://github.com/ClickHouse/ClickHouse/pull/21264) ([alesapin](https://github.com/alesapin)). +* Fix error `Bad cast from type ... to DB::ColumnLowCardinality` while inserting into table with `LowCardinality` column from `Values` format. Fixes #21140 [#21357](https://github.com/ClickHouse/ClickHouse/pull/21357) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a deadlock in `ALTER DELETE` mutations for non replicated MergeTree table engines when the predicate contains the table itself. Fixes [#20558](https://github.com/ClickHouse/ClickHouse/issues/20558). [#21477](https://github.com/ClickHouse/ClickHouse/pull/21477) ([alesapin](https://github.com/alesapin)). +* Fix SIGSEGV for distributed queries on failures. [#21434](https://github.com/ClickHouse/ClickHouse/pull/21434) ([Azat Khuzhin](https://github.com/azat)). +* Now `ALTER MODIFY COLUMN` queries will correctly affect changes in partition key, skip indices, TTLs, and so on. Fixes [#13675](https://github.com/ClickHouse/ClickHouse/issues/13675). [#21334](https://github.com/ClickHouse/ClickHouse/pull/21334) ([alesapin](https://github.com/alesapin)). +* Fix bug with `join_use_nulls` and joining `TOTALS` from subqueries. This closes [#19362](https://github.com/ClickHouse/ClickHouse/issues/19362) and [#21137](https://github.com/ClickHouse/ClickHouse/issues/21137). [#21248](https://github.com/ClickHouse/ClickHouse/pull/21248) ([vdimir](https://github.com/vdimir)). +* Fix crash in `EXPLAIN` for query with `UNION`. Fixes [#20876](https://github.com/ClickHouse/ClickHouse/issues/20876), [#21170](https://github.com/ClickHouse/ClickHouse/issues/21170). [#21246](https://github.com/ClickHouse/ClickHouse/pull/21246) ([flynn](https://github.com/ucasFL)). +* Now mutations allowed only for table engines that support them (MergeTree family, Memory, MaterializedView). Other engines will report a more clear error. Fixes [#21168](https://github.com/ClickHouse/ClickHouse/issues/21168). [#21183](https://github.com/ClickHouse/ClickHouse/pull/21183) ([alesapin](https://github.com/alesapin)). +* Fixes [#21112](https://github.com/ClickHouse/ClickHouse/issues/21112). Fixed bug that could cause duplicates with insert query (if one of the callbacks came a little too late). [#21138](https://github.com/ClickHouse/ClickHouse/pull/21138) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix `input_format_null_as_default` take effective when types are nullable. This fixes [#21116](https://github.com/ClickHouse/ClickHouse/issues/21116) . [#21121](https://github.com/ClickHouse/ClickHouse/pull/21121) ([Amos Bird](https://github.com/amosbird)). +* fix bug related to cast Tuple to Map. Closes [#21029](https://github.com/ClickHouse/ClickHouse/issues/21029). [#21120](https://github.com/ClickHouse/ClickHouse/pull/21120) ([hexiaoting](https://github.com/hexiaoting)). +* Fix the metadata leak when the Replicated*MergeTree with custom (non default) ZooKeeper cluster is dropped. [#21119](https://github.com/ClickHouse/ClickHouse/pull/21119) ([fastio](https://github.com/fastio)). +* Fix type mismatch issue when using LowCardinality keys in joinGet. This fixes [#21114](https://github.com/ClickHouse/ClickHouse/issues/21114). [#21117](https://github.com/ClickHouse/ClickHouse/pull/21117) ([Amos Bird](https://github.com/amosbird)). +* fix default_replica_path and default_replica_name values are useless on Replicated(*)MergeTree engine when the engine needs specify other parameters. [#21060](https://github.com/ClickHouse/ClickHouse/pull/21060) ([mxzlxy](https://github.com/mxzlxy)). +* Out of bound memory access was possible when formatting specifically crafted out of range value of type `DateTime64`. This closes [#20494](https://github.com/ClickHouse/ClickHouse/issues/20494). This closes [#20543](https://github.com/ClickHouse/ClickHouse/issues/20543). [#21023](https://github.com/ClickHouse/ClickHouse/pull/21023) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Block parallel insertions into storage join. [#21009](https://github.com/ClickHouse/ClickHouse/pull/21009) ([vdimir](https://github.com/vdimir)). +* Fixed behaviour, when `ALTER MODIFY COLUMN` created mutation, that will knowingly fail. [#21007](https://github.com/ClickHouse/ClickHouse/pull/21007) ([Anton Popov](https://github.com/CurtizJ)). +* Closes [#9969](https://github.com/ClickHouse/ClickHouse/issues/9969). Fixed Brotli http compression error, which reproduced for large data sizes, slightly complicated structure and with json output format. Update Brotli to the latest version to include the "fix rare access to uninitialized data in ring-buffer". [#20991](https://github.com/ClickHouse/ClickHouse/pull/20991) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix 'Empty task was returned from async task queue' on query cancellation. [#20881](https://github.com/ClickHouse/ClickHouse/pull/20881) ([Azat Khuzhin](https://github.com/azat)). +* `USE database;` query did not work when using MySQL 5.7 client to connect to ClickHouse server, it's fixed. Fixes [#18926](https://github.com/ClickHouse/ClickHouse/issues/18926). [#20878](https://github.com/ClickHouse/ClickHouse/pull/20878) ([tavplubix](https://github.com/tavplubix)). +* Fix usage of `-Distinct` combinator with `-State` combinator in aggregate functions. [#20866](https://github.com/ClickHouse/ClickHouse/pull/20866) ([Anton Popov](https://github.com/CurtizJ)). +* Fix subquery with union distinct and limit clause. close [#20597](https://github.com/ClickHouse/ClickHouse/issues/20597). [#20610](https://github.com/ClickHouse/ClickHouse/pull/20610) ([flynn](https://github.com/ucasFL)). +* Fixed inconsistent behavior of dictionary in case of queries where we look for absent keys in dictionary. [#20578](https://github.com/ClickHouse/ClickHouse/pull/20578) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix the number of threads for scalar subqueries and subqueries for index (after [#19007](https://github.com/ClickHouse/ClickHouse/issues/19007) single thread was always used). Fixes [#20457](https://github.com/ClickHouse/ClickHouse/issues/20457), [#20512](https://github.com/ClickHouse/ClickHouse/issues/20512). [#20550](https://github.com/ClickHouse/ClickHouse/pull/20550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash which could happen if unknown packet was received from remove query (was introduced in [#17868](https://github.com/ClickHouse/ClickHouse/issues/17868)). [#20547](https://github.com/ClickHouse/ClickHouse/pull/20547) ([Azat Khuzhin](https://github.com/azat)). +* Add proper checks while parsing directory names for async INSERT (fixes SIGSEGV). [#20498](https://github.com/ClickHouse/ClickHouse/pull/20498) ([Azat Khuzhin](https://github.com/azat)). +* Fix function `transform` does not work properly for floating point keys. Closes [#20460](https://github.com/ClickHouse/ClickHouse/issues/20460). [#20479](https://github.com/ClickHouse/ClickHouse/pull/20479) ([flynn](https://github.com/ucasFL)). +* Fix infinite loop when propagating WITH aliases to subqueries. This fixes [#20388](https://github.com/ClickHouse/ClickHouse/issues/20388). [#20476](https://github.com/ClickHouse/ClickHouse/pull/20476) ([Amos Bird](https://github.com/amosbird)). +* Fix abnormal server termination when http client goes away. [#20464](https://github.com/ClickHouse/ClickHouse/pull/20464) ([Azat Khuzhin](https://github.com/azat)). +* Fix `LOGICAL_ERROR` for `join_use_nulls=1` when JOIN contains const from SELECT. [#20461](https://github.com/ClickHouse/ClickHouse/pull/20461) ([Azat Khuzhin](https://github.com/azat)). +* Check if table function `view` is used in expression list and throw an error. This fixes [#20342](https://github.com/ClickHouse/ClickHouse/issues/20342). [#20350](https://github.com/ClickHouse/ClickHouse/pull/20350) ([Amos Bird](https://github.com/amosbird)). +* Avoid invalid dereference in RANGE_HASHED() dictionary. [#20345](https://github.com/ClickHouse/ClickHouse/pull/20345) ([Azat Khuzhin](https://github.com/azat)). +* Fix null dereference with `join_use_nulls=1`. [#20344](https://github.com/ClickHouse/ClickHouse/pull/20344) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect result of binary operations between two constant decimals of different scale. Fixes [#20283](https://github.com/ClickHouse/ClickHouse/issues/20283). [#20339](https://github.com/ClickHouse/ClickHouse/pull/20339) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix too often retries of failed background tasks for `ReplicatedMergeTree` table engines family. This could lead to too verbose logging and increased CPU load. Fixes [#20203](https://github.com/ClickHouse/ClickHouse/issues/20203). [#20335](https://github.com/ClickHouse/ClickHouse/pull/20335) ([alesapin](https://github.com/alesapin)). +* Restrict to `DROP` or `RENAME` version column of `*CollapsingMergeTree` and `ReplacingMergeTree` table engines. [#20300](https://github.com/ClickHouse/ClickHouse/pull/20300) ([alesapin](https://github.com/alesapin)). +* Fixed the behavior when in case of broken JSON we tried to read the whole file into memory which leads to exception from the allocator. Fixes [#19719](https://github.com/ClickHouse/ClickHouse/issues/19719). [#20286](https://github.com/ClickHouse/ClickHouse/pull/20286) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix exception during vertical merge for `MergeTree` table engines family which don't allow to perform vertical merges. Fixes [#20259](https://github.com/ClickHouse/ClickHouse/issues/20259). [#20279](https://github.com/ClickHouse/ClickHouse/pull/20279) ([alesapin](https://github.com/alesapin)). +* Fix rare server crash on config reload during the shutdown. Fixes [#19689](https://github.com/ClickHouse/ClickHouse/issues/19689). [#20224](https://github.com/ClickHouse/ClickHouse/pull/20224) ([alesapin](https://github.com/alesapin)). +* Fix CTE when using in INSERT SELECT. This fixes [#20187](https://github.com/ClickHouse/ClickHouse/issues/20187), fixes [#20195](https://github.com/ClickHouse/ClickHouse/issues/20195). [#20211](https://github.com/ClickHouse/ClickHouse/pull/20211) ([Amos Bird](https://github.com/amosbird)). +* Fixes [#19314](https://github.com/ClickHouse/ClickHouse/issues/19314). [#20156](https://github.com/ClickHouse/ClickHouse/pull/20156) ([Ivan](https://github.com/abyss7)). +* fix toMinute function to handle special timezone correctly. [#20149](https://github.com/ClickHouse/ClickHouse/pull/20149) ([keenwolf](https://github.com/keen-wolf)). +* Fix server crash after query with `if` function with `Tuple` type of then/else branches result. `Tuple` type must contain `Array` or another complex type. Fixes [#18356](https://github.com/ClickHouse/ClickHouse/issues/18356). [#20133](https://github.com/ClickHouse/ClickHouse/pull/20133) ([alesapin](https://github.com/alesapin)). +* The `MongoDB` table engine now establishes connection only when it's going to read data. `ATTACH TABLE` won't try to connect anymore. [#20110](https://github.com/ClickHouse/ClickHouse/pull/20110) ([Vitaly Baranov](https://github.com/vitlibar)). +* Bugfix in StorageJoin. [#20079](https://github.com/ClickHouse/ClickHouse/pull/20079) ([vdimir](https://github.com/vdimir)). +* Fix the case when calculating modulo of division of negative number by small divisor, the resulting data type was not large enough to accomodate the negative result. This closes [#20052](https://github.com/ClickHouse/ClickHouse/issues/20052). [#20067](https://github.com/ClickHouse/ClickHouse/pull/20067) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* MaterializeMySQL: Fix replication for statements that update several tables. [#20066](https://github.com/ClickHouse/ClickHouse/pull/20066) ([Håvard Kvålen](https://github.com/havardk)). +* Prevent "Connection refused" in docker during initialization script execution. [#20012](https://github.com/ClickHouse/ClickHouse/pull/20012) ([filimonov](https://github.com/filimonov)). +* `EmbeddedRocksDB` is an experimental storage. Fix the issue with lack of proper type checking. Simplified code. This closes [#19967](https://github.com/ClickHouse/ClickHouse/issues/19967). [#19972](https://github.com/ClickHouse/ClickHouse/pull/19972) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix a segfault in function `fromModifiedJulianDay` when the argument type is `Nullable(T)` for any integral types other than Int32. [#19959](https://github.com/ClickHouse/ClickHouse/pull/19959) ([PHO](https://github.com/depressed-pho)). +* BloomFilter index crash fix. Fixes [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). +* Deadlock was possible if system.text_log is enabled. This fixes [#19874](https://github.com/ClickHouse/ClickHouse/issues/19874). [#19875](https://github.com/ClickHouse/ClickHouse/pull/19875) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix starting the server with tables having default expressions containing dictGet(). Allow getting return type of dictGet() without loading dictionary. [#19805](https://github.com/ClickHouse/ClickHouse/pull/19805) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix clickhouse-client abort exception while executing only `select`. [#19790](https://github.com/ClickHouse/ClickHouse/pull/19790) ([taiyang-li](https://github.com/taiyang-li)). +* Fix a bug that moving pieces to destination table may failed in case of launching multiple clickhouse-copiers. [#19743](https://github.com/ClickHouse/ClickHouse/pull/19743) ([madianjun](https://github.com/mdianjun)). +* Background thread which executes `ON CLUSTER` queries might hang waiting for dropped replicated table to do something. It's fixed. [#19684](https://github.com/ClickHouse/ClickHouse/pull/19684) ([yiguolei](https://github.com/yiguolei)). + +#### Build/Testing/Packaging Improvement + +* Allow to build ClickHouse with AVX-2 enabled globally. It gives slight performance benefits on modern CPUs. Not recommended for production and will not be supported as official build for now. [#20180](https://github.com/ClickHouse/ClickHouse/pull/20180) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix some of the issues found by Coverity. See [#19964](https://github.com/ClickHouse/ClickHouse/issues/19964). [#20010](https://github.com/ClickHouse/ClickHouse/pull/20010) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to start up with modified binary under gdb. In previous version if you set up breakpoint in gdb before start, server will refuse to start up due to failed integrity check. [#21258](https://github.com/ClickHouse/ClickHouse/pull/21258) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add a test for different compression methods in Kafka. [#21111](https://github.com/ClickHouse/ClickHouse/pull/21111) ([filimonov](https://github.com/filimonov)). +* Fixed port clash from test_storage_kerberized_hdfs test. [#19974](https://github.com/ClickHouse/ClickHouse/pull/19974) ([Ilya Yatsishin](https://github.com/qoega)). +* Print `stdout` and `stderr` to log when failed to start docker in integration tests. Before this PR there was a very short error message in this case which didn't help to investigate the problems. [#20631](https://github.com/ClickHouse/ClickHouse/pull/20631) ([Vitaly Baranov](https://github.com/vitlibar)). + + +## ClickHouse release 21.2 + +### ClickHouse release v21.2.2.8-stable, 2021-02-07 + +#### Backward Incompatible Change + +* Bitwise functions (`bitAnd`, `bitOr`, etc) are forbidden for floating point arguments. Now you have to do explicit cast to integer. [#19853](https://github.com/ClickHouse/ClickHouse/pull/19853) ([Azat Khuzhin](https://github.com/azat)). +* Forbid `lcm`/`gcd` for floats. [#19532](https://github.com/ClickHouse/ClickHouse/pull/19532) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory tracking for `OPTIMIZE TABLE`/merges; account query memory limits and sampling for `OPTIMIZE TABLE`/merges. [#18772](https://github.com/ClickHouse/ClickHouse/pull/18772) ([Azat Khuzhin](https://github.com/azat)). +* Disallow floating point column as partition key, see [#18421](https://github.com/ClickHouse/ClickHouse/issues/18421#event-4147046255). [#18464](https://github.com/ClickHouse/ClickHouse/pull/18464) ([hexiaoting](https://github.com/hexiaoting)). +* Excessive parenthesis in type definitions no longer supported, example: `Array((UInt8))`. + +#### New Feature + +* Added `PostgreSQL` table engine (both select/insert, with support for multidimensional arrays), also as table function. Added `PostgreSQL` dictionary source. Added `PostgreSQL` database engine. [#18554](https://github.com/ClickHouse/ClickHouse/pull/18554) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Data type `Nested` now supports arbitrary levels of nesting. Introduced subcolumns of complex types, such as `size0` in `Array`, `null` in `Nullable`, names of `Tuple` elements, which can be read without reading of whole column. [#17310](https://github.com/ClickHouse/ClickHouse/pull/17310) ([Anton Popov](https://github.com/CurtizJ)). +* Added `Nullable` support for `FlatDictionary`, `HashedDictionary`, `ComplexKeyHashedDictionary`, `DirectDictionary`, `ComplexKeyDirectDictionary`, `RangeHashedDictionary`. [#18236](https://github.com/ClickHouse/ClickHouse/pull/18236) ([Maksim Kita](https://github.com/kitaisreal)). +* Adds a new table called `system.distributed_ddl_queue` that displays the queries in the DDL worker queue. [#17656](https://github.com/ClickHouse/ClickHouse/pull/17656) ([Bharat Nallan](https://github.com/bharatnc)). +* Added support of mapping LDAP group names, and attribute values in general, to local roles for users from ldap user directories. [#17211](https://github.com/ClickHouse/ClickHouse/pull/17211) ([Denis Glazachev](https://github.com/traceon)). +* Support insert into table function `cluster`, and for both table functions `remote` and `cluster`, support distributing data across nodes by specify sharding key. Close [#16752](https://github.com/ClickHouse/ClickHouse/issues/16752). [#18264](https://github.com/ClickHouse/ClickHouse/pull/18264) ([flynn](https://github.com/ucasFL)). +* Add function `decodeXMLComponent` to decode characters for XML. Example: `SELECT decodeXMLComponent('Hello,"world"!')` [#17659](https://github.com/ClickHouse/ClickHouse/issues/17659). [#18542](https://github.com/ClickHouse/ClickHouse/pull/18542) ([nauta](https://github.com/nautaa)). +* Added functions `parseDateTimeBestEffortUSOrZero`, `parseDateTimeBestEffortUSOrNull`. [#19712](https://github.com/ClickHouse/ClickHouse/pull/19712) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `sign` math function. [#19527](https://github.com/ClickHouse/ClickHouse/pull/19527) ([flynn](https://github.com/ucasFL)). +* Add information about used features (functions, table engines, etc) into system.query_log. [#18495](https://github.com/ClickHouse/ClickHouse/issues/18495). [#19371](https://github.com/ClickHouse/ClickHouse/pull/19371) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Function `formatDateTime` support the `%Q` modification to format date to quarter. [#19224](https://github.com/ClickHouse/ClickHouse/pull/19224) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Support MetaKey+Enter hotkey binding in play UI. [#19012](https://github.com/ClickHouse/ClickHouse/pull/19012) ([sundyli](https://github.com/sundy-li)). +* Add three functions for map data type: 1. `mapContains(map, key)` to check weather map.keys include the second parameter key. 2. `mapKeys(map)` return all the keys in Array format 3. `mapValues(map)` return all the values in Array format. [#18788](https://github.com/ClickHouse/ClickHouse/pull/18788) ([hexiaoting](https://github.com/hexiaoting)). +* Add `log_comment` setting related to [#18494](https://github.com/ClickHouse/ClickHouse/issues/18494). [#18549](https://github.com/ClickHouse/ClickHouse/pull/18549) ([Zijie Lu](https://github.com/TszKitLo40)). +* Add support of tuple argument to `argMin` and `argMax` functions. [#17359](https://github.com/ClickHouse/ClickHouse/pull/17359) ([Ildus Kurbangaliev](https://github.com/ildus)). +* Support `EXISTS VIEW` syntax. [#18552](https://github.com/ClickHouse/ClickHouse/pull/18552) ([Du Chuan](https://github.com/spongedu)). +* Add `SELECT ALL` syntax. closes [#18706](https://github.com/ClickHouse/ClickHouse/issues/18706). [#18723](https://github.com/ClickHouse/ClickHouse/pull/18723) ([flynn](https://github.com/ucasFL)). + +#### Performance Improvement + +* Faster parts removal by lowering the number of `stat` syscalls. This returns the optimization that existed while ago. More safe interface of `IDisk`. This closes [#19065](https://github.com/ClickHouse/ClickHouse/issues/19065). [#19086](https://github.com/ClickHouse/ClickHouse/pull/19086) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Aliases declared in `WITH` statement are properly used in index analysis. Queries like `WITH column AS alias SELECT ... WHERE alias = ...` may use index now. [#18896](https://github.com/ClickHouse/ClickHouse/pull/18896) ([Amos Bird](https://github.com/amosbird)). +* Add `optimize_alias_column_prediction` (on by default), that will: - Respect aliased columns in WHERE during partition pruning and skipping data using secondary indexes; - Respect aliased columns in WHERE for trivial count queries for optimize_trivial_count; - Respect aliased columns in GROUP BY/ORDER BY for optimize_aggregation_in_order/optimize_read_in_order. [#16995](https://github.com/ClickHouse/ClickHouse/pull/16995) ([sundyli](https://github.com/sundy-li)). +* Speed up aggregate function `sum`. Improvement only visible on synthetic benchmarks and not very practical. [#19216](https://github.com/ClickHouse/ClickHouse/pull/19216) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update libc++ and use another ABI to provide better performance. [#18914](https://github.com/ClickHouse/ClickHouse/pull/18914) ([Danila Kutenin](https://github.com/danlark1)). +* Rewrite `sumIf()` and `sum(if())` function to `countIf()` function when logically equivalent. [#17041](https://github.com/ClickHouse/ClickHouse/pull/17041) ([flynn](https://github.com/ucasFL)). +* Use a connection pool for S3 connections, controlled by the `s3_max_connections` settings. [#13405](https://github.com/ClickHouse/ClickHouse/pull/13405) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add support for zstd long option for better compression of string columns to save space. [#17184](https://github.com/ClickHouse/ClickHouse/pull/17184) ([ygrek](https://github.com/ygrek)). +* Slightly improve server latency by removing access to configuration on every connection. [#19863](https://github.com/ClickHouse/ClickHouse/pull/19863) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reduce lock contention for multiple layers of the `Buffer` engine. [#19379](https://github.com/ClickHouse/ClickHouse/pull/19379) ([Azat Khuzhin](https://github.com/azat)). +* Support splitting `Filter` step of query plan into `Expression + Filter` pair. Together with `Expression + Expression` merging optimization ([#17458](https://github.com/ClickHouse/ClickHouse/issues/17458)) it may delay execution for some expressions after `Filter` step. [#19253](https://github.com/ClickHouse/ClickHouse/pull/19253) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +#### Improvement + +* `SELECT count() FROM table` now can be executed if only one any column can be selected from the `table`. This PR fixes [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). +* Set charset to `utf8mb4` when interacting with remote MySQL servers. Fixes [#19795](https://github.com/ClickHouse/ClickHouse/issues/19795). [#19800](https://github.com/ClickHouse/ClickHouse/pull/19800) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `S3` table function now supports `auto` compression mode (autodetect). This closes [#18754](https://github.com/ClickHouse/ClickHouse/issues/18754). [#19793](https://github.com/ClickHouse/ClickHouse/pull/19793) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Correctly output infinite arguments for `formatReadableTimeDelta` function. In previous versions, there was implicit conversion to implementation specific integer value. [#19791](https://github.com/ClickHouse/ClickHouse/pull/19791) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Table function `S3` will use global region if the region can't be determined exactly. This closes [#10998](https://github.com/ClickHouse/ClickHouse/issues/10998). [#19750](https://github.com/ClickHouse/ClickHouse/pull/19750) ([Vladimir Chebotarev](https://github.com/excitoon)). +* In distributed queries if the setting `async_socket_for_remote` is enabled, it was possible to get stack overflow at least in debug build configuration if very deeply nested data type is used in table (e.g. `Array(Array(Array(...more...)))`). This fixes [#19108](https://github.com/ClickHouse/ClickHouse/issues/19108). This change introduces minor backward incompatibility: excessive parenthesis in type definitions no longer supported, example: `Array((UInt8))`. [#19736](https://github.com/ClickHouse/ClickHouse/pull/19736) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add separate pool for message brokers (RabbitMQ and Kafka). [#19722](https://github.com/ClickHouse/ClickHouse/pull/19722) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare `max_number_of_merges_with_ttl_in_pool` limit overrun (more merges with TTL can be assigned) for non-replicated MergeTree. [#19708](https://github.com/ClickHouse/ClickHouse/pull/19708) ([alesapin](https://github.com/alesapin)). +* Dictionary: better error message during attribute parsing. [#19678](https://github.com/ClickHouse/ClickHouse/pull/19678) ([Maksim Kita](https://github.com/kitaisreal)). +* Add an option to disable validation of checksums on reading. Should never be used in production. Please do not expect any benefits in disabling it. It may only be used for experiments and benchmarks. The setting only applicable for tables of MergeTree family. Checksums are always validated for other table engines and when receiving data over network. In my observations there is no performance difference or it is less than 0.5%. [#19588](https://github.com/ClickHouse/ClickHouse/pull/19588) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support constant result in function `multiIf`. [#19533](https://github.com/ClickHouse/ClickHouse/pull/19533) ([Maksim Kita](https://github.com/kitaisreal)). +* Enable function length/empty/notEmpty for datatype Map, which returns keys number in Map. [#19530](https://github.com/ClickHouse/ClickHouse/pull/19530) ([taiyang-li](https://github.com/taiyang-li)). +* Add `--reconnect` option to `clickhouse-benchmark`. When this option is specified, it will reconnect before every request. This is needed for testing. [#19872](https://github.com/ClickHouse/ClickHouse/pull/19872) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support using the new location of `.debug` file. This fixes [#19348](https://github.com/ClickHouse/ClickHouse/issues/19348). [#19520](https://github.com/ClickHouse/ClickHouse/pull/19520) ([Amos Bird](https://github.com/amosbird)). +* `toIPv6` function parses `IPv4` addresses. [#19518](https://github.com/ClickHouse/ClickHouse/pull/19518) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `http_referer` field to `system.query_log`, `system.processes`, etc. This closes [#19389](https://github.com/ClickHouse/ClickHouse/issues/19389). [#19390](https://github.com/ClickHouse/ClickHouse/pull/19390) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve MySQL compatibility by making more functions case insensitive and adding aliases. [#19387](https://github.com/ClickHouse/ClickHouse/pull/19387) ([Daniil Kondratyev](https://github.com/dankondr)). +* Add metrics for MergeTree parts (Wide/Compact/InMemory) types. [#19381](https://github.com/ClickHouse/ClickHouse/pull/19381) ([Azat Khuzhin](https://github.com/azat)). +* Allow docker to be executed with arbitrary uid. [#19374](https://github.com/ClickHouse/ClickHouse/pull/19374) ([filimonov](https://github.com/filimonov)). +* Fix wrong alignment of values of `IPv4` data type in Pretty formats. They were aligned to the right, not to the left. This closes [#19184](https://github.com/ClickHouse/ClickHouse/issues/19184). [#19339](https://github.com/ClickHouse/ClickHouse/pull/19339) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow change `max_server_memory_usage` without restart. This closes [#18154](https://github.com/ClickHouse/ClickHouse/issues/18154). [#19186](https://github.com/ClickHouse/ClickHouse/pull/19186) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* The exception when function `bar` is called with certain NaN argument may be slightly misleading in previous versions. This fixes [#19088](https://github.com/ClickHouse/ClickHouse/issues/19088). [#19107](https://github.com/ClickHouse/ClickHouse/pull/19107) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Explicitly set uid / gid of clickhouse user & group to the fixed values (101) in clickhouse-server images. [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). +* Fixed `PeekableReadBuffer: Memory limit exceed` error when inserting data with huge strings. Fixes [#18690](https://github.com/ClickHouse/ClickHouse/issues/18690). [#18979](https://github.com/ClickHouse/ClickHouse/pull/18979) ([tavplubix](https://github.com/tavplubix)). +* Docker image: several improvements for clickhouse-server entrypoint. [#18954](https://github.com/ClickHouse/ClickHouse/pull/18954) ([filimonov](https://github.com/filimonov)). +* Add `normalizeQueryKeepNames` and `normalizedQueryHashKeepNames` to normalize queries without masking long names with `?`. This helps better analyze complex query logs. [#18910](https://github.com/ClickHouse/ClickHouse/pull/18910) ([Amos Bird](https://github.com/amosbird)). +* Check per-block checksum of the distributed batch on the sender before sending (without reading the file twice, the checksums will be verified while reading), this will avoid stuck of the INSERT on the receiver (on truncated .bin file on the sender). Avoid reading .bin files twice for batched INSERT (it was required to calculate rows/bytes to take squashing into account, now this information included into the header, backward compatible is preserved). [#18853](https://github.com/ClickHouse/ClickHouse/pull/18853) ([Azat Khuzhin](https://github.com/azat)). +* Fix issues with RIGHT and FULL JOIN of tables with aggregate function states. In previous versions exception about `cloneResized` method was thrown. [#18818](https://github.com/ClickHouse/ClickHouse/pull/18818) ([templarzq](https://github.com/templarzq)). +* Added prefix-based S3 endpoint settings. [#18812](https://github.com/ClickHouse/ClickHouse/pull/18812) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add [UInt8, UInt16, UInt32, UInt64] arguments types support for bitmapTransform, bitmapSubsetInRange, bitmapSubsetLimit, bitmapContains functions. This closes [#18713](https://github.com/ClickHouse/ClickHouse/issues/18713). [#18791](https://github.com/ClickHouse/ClickHouse/pull/18791) ([sundyli](https://github.com/sundy-li)). +* Allow CTE (Common Table Expressions) to be further aliased. Propagate CSE (Common Subexpressions Elimination) to subqueries in the same level when `enable_global_with_statement = 1`. This fixes [#17378](https://github.com/ClickHouse/ClickHouse/issues/17378) . This fixes https://github.com/ClickHouse/ClickHouse/pull/16575#issuecomment-753416235 . [#18684](https://github.com/ClickHouse/ClickHouse/pull/18684) ([Amos Bird](https://github.com/amosbird)). +* Update librdkafka to v1.6.0-RC2. Fixes [#18668](https://github.com/ClickHouse/ClickHouse/issues/18668). [#18671](https://github.com/ClickHouse/ClickHouse/pull/18671) ([filimonov](https://github.com/filimonov)). +* In case of unexpected exceptions automatically restart background thread which is responsible for execution of distributed DDL queries. Fixes [#17991](https://github.com/ClickHouse/ClickHouse/issues/17991). [#18285](https://github.com/ClickHouse/ClickHouse/pull/18285) ([徐炘](https://github.com/weeds085490)). +* Updated AWS C++ SDK in order to utilize global regions in S3. [#17870](https://github.com/ClickHouse/ClickHouse/pull/17870) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Added support for `WITH ... [AND] [PERIODIC] REFRESH [interval_in_sec]` clause when creating `LIVE VIEW` tables. [#14822](https://github.com/ClickHouse/ClickHouse/pull/14822) ([vzakaznikov](https://github.com/vzakaznikov)). +* Restrict `MODIFY TTL` queries for `MergeTree` tables created in old syntax. Previously the query succeeded, but actually it had no effect. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). + +#### Bug Fix + +* Fix index analysis of binary functions with constant argument which leads to wrong query results. This fixes [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). +* Fix starting the server with tables having default expressions containing dictGet(). Allow getting return type of dictGet() without loading dictionary. [#19805](https://github.com/ClickHouse/ClickHouse/pull/19805) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix server crash after query with `if` function with `Tuple` type of then/else branches result. `Tuple` type must contain `Array` or another complex type. Fixes [#18356](https://github.com/ClickHouse/ClickHouse/issues/18356). [#20133](https://github.com/ClickHouse/ClickHouse/pull/20133) ([alesapin](https://github.com/alesapin)). +* `MaterializeMySQL` (experimental feature): Fix replication for statements that update several tables. [#20066](https://github.com/ClickHouse/ClickHouse/pull/20066) ([Håvard Kvålen](https://github.com/havardk)). +* Prevent "Connection refused" in docker during initialization script execution. [#20012](https://github.com/ClickHouse/ClickHouse/pull/20012) ([filimonov](https://github.com/filimonov)). +* `EmbeddedRocksDB` is an experimental storage. Fix the issue with lack of proper type checking. Simplified code. This closes [#19967](https://github.com/ClickHouse/ClickHouse/issues/19967). [#19972](https://github.com/ClickHouse/ClickHouse/pull/19972) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix a segfault in function `fromModifiedJulianDay` when the argument type is `Nullable(T)` for any integral types other than Int32. [#19959](https://github.com/ClickHouse/ClickHouse/pull/19959) ([PHO](https://github.com/depressed-pho)). +* The function `greatCircleAngle` returned inaccurate results in previous versions. This closes [#19769](https://github.com/ClickHouse/ClickHouse/issues/19769). [#19789](https://github.com/ClickHouse/ClickHouse/pull/19789) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix rare bug when some replicated operations (like mutation) cannot process some parts after data corruption. Fixes [#19593](https://github.com/ClickHouse/ClickHouse/issues/19593). [#19702](https://github.com/ClickHouse/ClickHouse/pull/19702) ([alesapin](https://github.com/alesapin)). +* Background thread which executes `ON CLUSTER` queries might hang waiting for dropped replicated table to do something. It's fixed. [#19684](https://github.com/ClickHouse/ClickHouse/pull/19684) ([yiguolei](https://github.com/yiguolei)). +* Fix wrong deserialization of columns description. It makes INSERT into a table with a column named `\` impossible. [#19479](https://github.com/ClickHouse/ClickHouse/pull/19479) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Mark distributed batch as broken in case of empty data block in one of files. [#19449](https://github.com/ClickHouse/ClickHouse/pull/19449) ([Azat Khuzhin](https://github.com/azat)). +* Fixed very rare bug that might cause mutation to hang after `DROP/DETACH/REPLACE/MOVE PARTITION`. It was partially fixed by [#15537](https://github.com/ClickHouse/ClickHouse/issues/15537) for the most cases. [#19443](https://github.com/ClickHouse/ClickHouse/pull/19443) ([tavplubix](https://github.com/tavplubix)). +* Fix possible error `Extremes transform was already added to pipeline`. Fixes [#14100](https://github.com/ClickHouse/ClickHouse/issues/14100). [#19430](https://github.com/ClickHouse/ClickHouse/pull/19430) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix default value in join types with non-zero default (e.g. some Enums). Closes [#18197](https://github.com/ClickHouse/ClickHouse/issues/18197). [#19360](https://github.com/ClickHouse/ClickHouse/pull/19360) ([vdimir](https://github.com/vdimir)). +* Do not mark file for distributed send as broken on EOF. [#19290](https://github.com/ClickHouse/ClickHouse/pull/19290) ([Azat Khuzhin](https://github.com/azat)). +* Fix leaking of pipe fd for `async_socket_for_remote`. [#19153](https://github.com/ClickHouse/ClickHouse/pull/19153) ([Azat Khuzhin](https://github.com/azat)). +* Fix infinite reading from file in `ORC` format (was introduced in [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580)). Fixes [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix issue in merge tree data writer which can lead to marks with bigger size than fixed granularity size. Fixes [#18913](https://github.com/ClickHouse/ClickHouse/issues/18913). [#19123](https://github.com/ClickHouse/ClickHouse/pull/19123) ([alesapin](https://github.com/alesapin)). +* Fix startup bug when clickhouse was not able to read compression codec from `LowCardinality(Nullable(...))` and throws exception `Attempt to read after EOF`. Fixes [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). +* Simplify the implementation of `tupleHammingDistance`. Support for tuples of any equal length. Fixes [#19029](https://github.com/ClickHouse/ClickHouse/issues/19029). [#19084](https://github.com/ClickHouse/ClickHouse/pull/19084) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Make sure `groupUniqArray` returns correct type for argument of Enum type. This closes [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible error `Expected single dictionary argument for function` if use function `ignore` with `LowCardinality` argument. Fixes [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inserting of `LowCardinality` column to table with `TinyLog` engine. Fixes [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix minor issue in JOIN: Join tries to materialize const columns, but our code waits for them in other places. [#18982](https://github.com/ClickHouse/ClickHouse/pull/18982) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Disable `optimize_move_functions_out_of_any` because optimization is not always correct. This closes [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). This closes [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible exception `QueryPipeline stream: different number of columns` caused by merging of query plan's `Expression` steps. Fixes [#18190](https://github.com/ClickHouse/ClickHouse/issues/18190). [#18980](https://github.com/ClickHouse/ClickHouse/pull/18980) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed very rare deadlock at shutdown. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). +* Fixed rare crashes when server run out of memory. [#18976](https://github.com/ClickHouse/ClickHouse/pull/18976) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect behavior when `ALTER TABLE ... DROP PART 'part_name'` query removes all deduplication blocks for the whole partition. Fixes [#18874](https://github.com/ClickHouse/ClickHouse/issues/18874). [#18969](https://github.com/ClickHouse/ClickHouse/pull/18969) ([alesapin](https://github.com/alesapin)). +* Fixed issue [#18894](https://github.com/ClickHouse/ClickHouse/issues/18894) Add a check to avoid exception when long column alias('table.column' style, usually auto-generated by BI tools like Looker) equals to long table name. [#18968](https://github.com/ClickHouse/ClickHouse/pull/18968) ([Daniel Qin](https://github.com/mathfool)). +* Fix error `Task was not found in task queue` (possible only for remote queries, with `async_socket_for_remote = 1`). [#18964](https://github.com/ClickHouse/ClickHouse/pull/18964) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug when mutation with some escaped text (like `ALTER ... UPDATE e = CAST('foo', 'Enum8(\'foo\' = 1')` serialized incorrectly. Fixes [#18878](https://github.com/ClickHouse/ClickHouse/issues/18878). [#18944](https://github.com/ClickHouse/ClickHouse/pull/18944) ([alesapin](https://github.com/alesapin)). +* ATTACH PARTITION will reset mutations. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). +* Fix issue with `bitmapOrCardinality` that may lead to nullptr dereference. This closes [#18911](https://github.com/ClickHouse/ClickHouse/issues/18911). [#18912](https://github.com/ClickHouse/ClickHouse/pull/18912) ([sundyli](https://github.com/sundy-li)). +* Fixed `Attempt to read after eof` error when trying to `CAST` `NULL` from `Nullable(String)` to `Nullable(Decimal(P, S))`. Now function `CAST` returns `NULL` when it cannot parse decimal from nullable string. Fixes [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). +* Fix data type convert issue for MySQL engine. [#18124](https://github.com/ClickHouse/ClickHouse/pull/18124) ([bo zeng](https://github.com/mis98zb)). +* Fix clickhouse-client abort exception while executing only `select`. [#19790](https://github.com/ClickHouse/ClickHouse/pull/19790) ([taiyang-li](https://github.com/taiyang-li)). + + +#### Build/Testing/Packaging Improvement + +* Run [SQLancer](https://twitter.com/RiggerManuel/status/1352345625480884228) (logical SQL fuzzer) in CI. [#19006](https://github.com/ClickHouse/ClickHouse/pull/19006) ([Ilya Yatsishin](https://github.com/qoega)). +* Query Fuzzer will fuzz newly added tests more extensively. This closes [#18916](https://github.com/ClickHouse/ClickHouse/issues/18916). [#19185](https://github.com/ClickHouse/ClickHouse/pull/19185) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Integrate with [Big List of Naughty Strings](https://github.com/minimaxir/big-list-of-naughty-strings/) for better fuzzing. [#19480](https://github.com/ClickHouse/ClickHouse/pull/19480) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add integration tests run with MSan. [#18974](https://github.com/ClickHouse/ClickHouse/pull/18974) ([alesapin](https://github.com/alesapin)). +* Fixed MemorySanitizer errors in cyrus-sasl and musl. [#19821](https://github.com/ClickHouse/ClickHouse/pull/19821) ([Ilya Yatsishin](https://github.com/qoega)). +* Insuffiient arguments check in `positionCaseInsensitiveUTF8` function triggered address sanitizer. [#19720](https://github.com/ClickHouse/ClickHouse/pull/19720) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove --project-directory for docker-compose in integration test. Fix logs formatting from docker container. [#19706](https://github.com/ClickHouse/ClickHouse/pull/19706) ([Ilya Yatsishin](https://github.com/qoega)). +* Made generation of macros.xml easier for integration tests. No more excessive logging from dicttoxml. dicttoxml project is not active for 5+ years. [#19697](https://github.com/ClickHouse/ClickHouse/pull/19697) ([Ilya Yatsishin](https://github.com/qoega)). +* Allow to explicitly enable or disable watchdog via environment variable `CLICKHOUSE_WATCHDOG_ENABLE`. By default it is enabled if server is not attached to terminal. [#19522](https://github.com/ClickHouse/ClickHouse/pull/19522) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow building ClickHouse with Kafka support on arm64. [#19369](https://github.com/ClickHouse/ClickHouse/pull/19369) ([filimonov](https://github.com/filimonov)). +* Allow building librdkafka without ssl. [#19337](https://github.com/ClickHouse/ClickHouse/pull/19337) ([filimonov](https://github.com/filimonov)). +* Restore Kafka input in FreeBSD builds. [#18924](https://github.com/ClickHouse/ClickHouse/pull/18924) ([Alexandre Snarskii](https://github.com/snar)). +* Fix potential nullptr dereference in table function `VALUES`. [#19357](https://github.com/ClickHouse/ClickHouse/pull/19357) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Avoid UBSan reports in `arrayElement` function, `substring` and `arraySum`. Fixes [#19305](https://github.com/ClickHouse/ClickHouse/issues/19305). Fixes [#19287](https://github.com/ClickHouse/ClickHouse/issues/19287). This closes [#19336](https://github.com/ClickHouse/ClickHouse/issues/19336). [#19347](https://github.com/ClickHouse/ClickHouse/pull/19347) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +## ClickHouse release 21.1 + +### ClickHouse release v21.1.3.32-stable, 2021-02-03 + +#### Bug Fix + +* BloomFilter index crash fix. Fixes [#19757](https://github.com/ClickHouse/ClickHouse/issues/19757). [#19884](https://github.com/ClickHouse/ClickHouse/pull/19884) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash when pushing down predicates to union distinct subquery. This fixes [#19855](https://github.com/ClickHouse/ClickHouse/issues/19855). [#19861](https://github.com/ClickHouse/ClickHouse/pull/19861) ([Amos Bird](https://github.com/amosbird)). +* Fix filtering by UInt8 greater than 127. [#19799](https://github.com/ClickHouse/ClickHouse/pull/19799) ([Anton Popov](https://github.com/CurtizJ)). +* In previous versions, unusual arguments for function arrayEnumerateUniq may cause crash or infinite loop. This closes [#19787](https://github.com/ClickHouse/ClickHouse/issues/19787). [#19788](https://github.com/ClickHouse/ClickHouse/pull/19788) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed stack overflow when using accurate comparison of arithmetic type with string type. [#19773](https://github.com/ClickHouse/ClickHouse/pull/19773) ([tavplubix](https://github.com/tavplubix)). +* Fix crash when nested column name was used in `WHERE` or `PREWHERE`. Fixes [#19755](https://github.com/ClickHouse/ClickHouse/issues/19755). [#19763](https://github.com/ClickHouse/ClickHouse/pull/19763) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a segmentation fault in `bitmapAndnot` function. Fixes [#19668](https://github.com/ClickHouse/ClickHouse/issues/19668). [#19713](https://github.com/ClickHouse/ClickHouse/pull/19713) ([Maksim Kita](https://github.com/kitaisreal)). +* Some functions with big integers may cause segfault. Big integers is experimental feature. This closes [#19667](https://github.com/ClickHouse/ClickHouse/issues/19667). [#19672](https://github.com/ClickHouse/ClickHouse/pull/19672) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix wrong result of function `neighbor` for `LowCardinality` argument. Fixes [#10333](https://github.com/ClickHouse/ClickHouse/issues/10333). [#19617](https://github.com/ClickHouse/ClickHouse/pull/19617) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix use-after-free of the CompressedWriteBuffer in Connection after disconnect. [#19599](https://github.com/ClickHouse/ClickHouse/pull/19599) ([Azat Khuzhin](https://github.com/azat)). +* `DROP/DETACH TABLE table ON CLUSTER cluster SYNC` query might hang, it's fixed. Fixes [#19568](https://github.com/ClickHouse/ClickHouse/issues/19568). [#19572](https://github.com/ClickHouse/ClickHouse/pull/19572) ([tavplubix](https://github.com/tavplubix)). +* Query CREATE DICTIONARY id expression fix. [#19571](https://github.com/ClickHouse/ClickHouse/pull/19571) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix SIGSEGV with merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read=0/UINT64_MAX. [#19528](https://github.com/ClickHouse/ClickHouse/pull/19528) ([Azat Khuzhin](https://github.com/azat)). +* Buffer overflow (on memory read) was possible if `addMonth` function was called with specifically crafted arguments. This fixes [#19441](https://github.com/ClickHouse/ClickHouse/issues/19441). This fixes [#19413](https://github.com/ClickHouse/ClickHouse/issues/19413). [#19472](https://github.com/ClickHouse/ClickHouse/pull/19472) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Uninitialized memory read was possible in encrypt/decrypt functions if empty string was passed as IV. This closes [#19391](https://github.com/ClickHouse/ClickHouse/issues/19391). [#19397](https://github.com/ClickHouse/ClickHouse/pull/19397) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible buffer overflow in Uber H3 library. See https://github.com/uber/h3/issues/392. This closes [#19219](https://github.com/ClickHouse/ClickHouse/issues/19219). [#19383](https://github.com/ClickHouse/ClickHouse/pull/19383) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix system.parts _state column (LOGICAL_ERROR when querying this column, due to incorrect order). [#19346](https://github.com/ClickHouse/ClickHouse/pull/19346) ([Azat Khuzhin](https://github.com/azat)). +* Fixed possible wrong result or segfault on aggregation when Materialized View and its target table have different structure. Fixes [#18063](https://github.com/ClickHouse/ClickHouse/issues/18063). [#19322](https://github.com/ClickHouse/ClickHouse/pull/19322) ([tavplubix](https://github.com/tavplubix)). +* Fix error `Cannot convert column now64() because it is constant but values of constants are different in source and result`. Continuation of [#7156](https://github.com/ClickHouse/ClickHouse/issues/7156). [#19316](https://github.com/ClickHouse/ClickHouse/pull/19316) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug when concurrent `ALTER` and `DROP` queries may hang while processing ReplicatedMergeTree table. [#19237](https://github.com/ClickHouse/ClickHouse/pull/19237) ([alesapin](https://github.com/alesapin)). +* Fixed `There is no checkpoint` error when inserting data through http interface using `Template` or `CustomSeparated` format. Fixes [#19021](https://github.com/ClickHouse/ClickHouse/issues/19021). [#19072](https://github.com/ClickHouse/ClickHouse/pull/19072) ([tavplubix](https://github.com/tavplubix)). +* Disable constant folding for subqueries on the analysis stage, when the result cannot be calculated. [#18446](https://github.com/ClickHouse/ClickHouse/pull/18446) ([Azat Khuzhin](https://github.com/azat)). +* Mutation might hang waiting for some non-existent part after `MOVE` or `REPLACE PARTITION` or, in rare cases, after `DETACH` or `DROP PARTITION`. It's fixed. [#15537](https://github.com/ClickHouse/ClickHouse/pull/15537) ([tavplubix](https://github.com/tavplubix)). + + + +### ClickHouse release v21.1.2.15-stable 2021-01-18 + +#### Backward Incompatible Change + +* The setting `input_format_null_as_default` is enabled by default. [#17525](https://github.com/ClickHouse/ClickHouse/pull/17525) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Check settings constraints for profile settings from config. Server will fail to start if users.xml contain settings that do not meet corresponding constraints. [#18486](https://github.com/ClickHouse/ClickHouse/pull/18486) ([tavplubix](https://github.com/tavplubix)). +* Restrict `ALTER MODIFY SETTING` from changing storage settings that affects data parts (`write_final_mark` and `enable_mixed_granularity_parts`). [#18306](https://github.com/ClickHouse/ClickHouse/pull/18306) ([Amos Bird](https://github.com/amosbird)). +* Set `insert_quorum_parallel` to 1 by default. It is significantly more convenient to use than "sequential" quorum inserts. But if you rely to sequential consistency, you should set the setting back to zero. [#17567](https://github.com/ClickHouse/ClickHouse/pull/17567) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Remove `sumburConsistentHash` function. This closes [#18120](https://github.com/ClickHouse/ClickHouse/issues/18120). [#18656](https://github.com/ClickHouse/ClickHouse/pull/18656) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Removed aggregate functions `timeSeriesGroupSum`, `timeSeriesGroupRateSum` because a friend of mine said they never worked. This fixes [#16869](https://github.com/ClickHouse/ClickHouse/issues/16869). If you have luck using these functions, write a email to feedback@clickhouse.com. [#17423](https://github.com/ClickHouse/ClickHouse/pull/17423) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Prohibit toUnixTimestamp(Date()) (before it just returns UInt16 representation of Date). [#17376](https://github.com/ClickHouse/ClickHouse/pull/17376) ([Azat Khuzhin](https://github.com/azat)). +* Allow using extended integer types (`Int128`, `Int256`, `UInt256`) in `avg` and `avgWeighted` functions. Also allow using different types (integer, decimal, floating point) for value and for weight in `avgWeighted` function. This is a backward-incompatible change: now the `avg` and `avgWeighted` functions always return `Float64` (as documented). Before this change the return type for `Decimal` arguments was also `Decimal`. [#15419](https://github.com/ClickHouse/ClickHouse/pull/15419) ([Mike](https://github.com/myrrc)). +* Expression `toUUID(N)` no longer works. Replace with `toUUID('00000000-0000-0000-0000-000000000000')`. This change is motivated by non-obvious results of `toUUID(N)` where N is non zero. +* SSL Certificates with incorrect "key usage" are rejected. In previous versions they are used to work. See [#19262](https://github.com/ClickHouse/ClickHouse/issues/19262). +* `incl` references to substitutions file (`/etc/metrika.xml`) were removed from the default config (``, ``, ``, ``, ``). If you were using substitutions file and were relying on those implicit references, you should put them back manually and explicitly by adding corresponding sections with `incl="..."` attributes before the update. See [#18740](https://github.com/ClickHouse/ClickHouse/pull/18740) ([alexey-milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Implement gRPC protocol in ClickHouse. [#15111](https://github.com/ClickHouse/ClickHouse/pull/15111) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow to use multiple zookeeper clusters. [#17070](https://github.com/ClickHouse/ClickHouse/pull/17070) ([fastio](https://github.com/fastio)). +* Implemented `REPLACE TABLE` and `CREATE OR REPLACE TABLE` queries. [#18521](https://github.com/ClickHouse/ClickHouse/pull/18521) ([tavplubix](https://github.com/tavplubix)). +* Implement `UNION DISTINCT` and treat the plain `UNION` clause as `UNION DISTINCT` by default. Add a setting `union_default_mode` that allows to treat it as `UNION ALL` or require explicit mode specification. [#16338](https://github.com/ClickHouse/ClickHouse/pull/16338) ([flynn](https://github.com/ucasFL)). +* Added function `accurateCastOrNull`. This closes [#10290](https://github.com/ClickHouse/ClickHouse/issues/10290). Add type conversions in `x IN (subquery)` expressions. This closes [#10266](https://github.com/ClickHouse/ClickHouse/issues/10266). [#16724](https://github.com/ClickHouse/ClickHouse/pull/16724) ([Maksim Kita](https://github.com/kitaisreal)). +* IP Dictionary supports `IPv4` / `IPv6` types directly. [#17571](https://github.com/ClickHouse/ClickHouse/pull/17571) ([vdimir](https://github.com/vdimir)). +* IP Dictionary supports key fetching. Resolves [#18241](https://github.com/ClickHouse/ClickHouse/issues/18241). [#18480](https://github.com/ClickHouse/ClickHouse/pull/18480) ([vdimir](https://github.com/vdimir)). +* Add `*.zst` compression/decompression support for data import and export. It enables using `*.zst` in `file()` function and `Content-encoding: zstd` in HTTP client. This closes [#16791 ](https://github.com/ClickHouse/ClickHouse/issues/16791). [#17144](https://github.com/ClickHouse/ClickHouse/pull/17144) ([Abi Palagashvili](https://github.com/fibersel)). +* Added `mannWitneyUTest`, `studentTTest` and `welchTTest` aggregate functions. Refactored `rankCorr` a bit. [#16883](https://github.com/ClickHouse/ClickHouse/pull/16883) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add functions `countMatches`/`countMatchesCaseInsensitive`. [#17459](https://github.com/ClickHouse/ClickHouse/pull/17459) ([Azat Khuzhin](https://github.com/azat)). +* Implement `countSubstrings()`/`countSubstringsCaseInsensitive()`/`countSubstringsCaseInsensitiveUTF8()` (Count the number of substring occurrences). [#17347](https://github.com/ClickHouse/ClickHouse/pull/17347) ([Azat Khuzhin](https://github.com/azat)). +* Add information about used databases, tables and columns in system.query_log. Add `query_kind` and `normalized_query_hash` fields. [#17726](https://github.com/ClickHouse/ClickHouse/pull/17726) ([Amos Bird](https://github.com/amosbird)). +* Add a setting `optimize_on_insert`. When enabled, do the same transformation for INSERTed block of data as if merge was done on this block (e.g. Replacing, Collapsing, Aggregating...). This setting is enabled by default. This can influence Materialized View and MaterializeMySQL behaviour (see detailed description). This closes [#10683](https://github.com/ClickHouse/ClickHouse/issues/10683). [#16954](https://github.com/ClickHouse/ClickHouse/pull/16954) ([Kruglov Pavel](https://github.com/Avogar)). +* Kerberos Authenticaiton for HDFS. [#16621](https://github.com/ClickHouse/ClickHouse/pull/16621) ([Ilya Golshtein](https://github.com/ilejn)). +* Support `SHOW SETTINGS` statement to show parameters in system.settings. `SHOW CHANGED SETTINGS` and `LIKE/ILIKE` clause are also supported. [#18056](https://github.com/ClickHouse/ClickHouse/pull/18056) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Function `position` now supports `POSITION(needle IN haystack)` synax for SQL compatibility. This closes [#18701](https://github.com/ClickHouse/ClickHouse/issues/18701). ... [#18779](https://github.com/ClickHouse/ClickHouse/pull/18779) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Now we have a new storage setting `max_partitions_to_read` for tables in the MergeTree family. It limits the max number of partitions that can be accessed in one query. A user setting `force_max_partition_limit` is also added to enforce this constraint. [#18712](https://github.com/ClickHouse/ClickHouse/pull/18712) ([Amos Bird](https://github.com/amosbird)). +* Add `query_id` column to `system.part_log` for inserted parts. Closes [#10097](https://github.com/ClickHouse/ClickHouse/issues/10097). [#18644](https://github.com/ClickHouse/ClickHouse/pull/18644) ([flynn](https://github.com/ucasFL)). +* Allow create table as select with columns specification. Example `CREATE TABLE t1 (x String) ENGINE = Memory AS SELECT 1;`. [#18060](https://github.com/ClickHouse/ClickHouse/pull/18060) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `arrayMin`, `arrayMax`, `arrayAvg` aggregation functions. [#18032](https://github.com/ClickHouse/ClickHouse/pull/18032) ([Maksim Kita](https://github.com/kitaisreal)). +* Implemented `ATTACH TABLE name FROM 'path/to/data/' (col1 Type1, ...` query. It creates new table with provided structure and attaches table data from provided directory in `user_files`. [#17903](https://github.com/ClickHouse/ClickHouse/pull/17903) ([tavplubix](https://github.com/tavplubix)). +* Add mutation support for StorageMemory. This closes [#9117](https://github.com/ClickHouse/ClickHouse/issues/9117). [#15127](https://github.com/ClickHouse/ClickHouse/pull/15127) ([flynn](https://github.com/ucasFL)). +* Support syntax `EXISTS DATABASE name`. [#18458](https://github.com/ClickHouse/ClickHouse/pull/18458) ([Du Chuan](https://github.com/spongedu)). +* Support builtin function `isIPv4String` && `isIPv6String` like [MySQL](https://github.com/ClickHouse/ClickHouse/compare/master...spongedu:support_is_ipv4?expand=1). [#18349](https://github.com/ClickHouse/ClickHouse/pull/18349) ([Du Chuan](https://github.com/spongedu)). +* Add a new setting `insert_distributed_one_random_shard = 1` to allow insertion into multi-sharded distributed table without any distributed key. [#18294](https://github.com/ClickHouse/ClickHouse/pull/18294) ([Amos Bird](https://github.com/amosbird)). +* Add settings `min_compress_block_size` and `max_compress_block_size` to MergeTreeSettings, which have higher priority than the global settings and take effect when they are set. close [13890](https://github.com/ClickHouse/ClickHouse/issues/13890). [#17867](https://github.com/ClickHouse/ClickHouse/pull/17867) ([flynn](https://github.com/ucasFL)). +* Add support for 64bit roaring bitmaps. [#17858](https://github.com/ClickHouse/ClickHouse/pull/17858) ([Andy Yang](https://github.com/andyyzh)). +* Extended `OPTIMIZE ... DEDUPLICATE` syntax to allow explicit (or implicit with asterisk/column transformers) list of columns to check for duplicates on. ... [#17846](https://github.com/ClickHouse/ClickHouse/pull/17846) ([Vasily Nemkov](https://github.com/Enmk)). +* Added functions `toModifiedJulianDay`, `fromModifiedJulianDay`, `toModifiedJulianDayOrNull`, and `fromModifiedJulianDayOrNull`. These functions convert between Proleptic Gregorian calendar date and Modified Julian Day number. [#17750](https://github.com/ClickHouse/ClickHouse/pull/17750) ([PHO](https://github.com/depressed-pho)). +* Add ability to use custom TLD list: added functions `firstSignificantSubdomainCustom`, `cutToFirstSignificantSubdomainCustom`. [#17748](https://github.com/ClickHouse/ClickHouse/pull/17748) ([Azat Khuzhin](https://github.com/azat)). +* Add support for `PROXYv1` protocol to wrap native TCP interface. Allow quotas to be keyed by proxy-forwarded IP address (applied for `PROXYv1` address and for `X-Forwarded-For` from HTTP interface). This is useful when you provide access to ClickHouse only via trusted proxy (e.g. CloudFlare) but want to account user resources by their original IP addresses. This fixes [#17268](https://github.com/ClickHouse/ClickHouse/issues/17268). [#17707](https://github.com/ClickHouse/ClickHouse/pull/17707) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now clickhouse-client supports opening `EDITOR` to edit commands. `Alt-Shift-E`. [#17665](https://github.com/ClickHouse/ClickHouse/pull/17665) ([Amos Bird](https://github.com/amosbird)). +* Add function `encodeXMLComponent` to escape characters to place string into XML text node or attribute. [#17659](https://github.com/ClickHouse/ClickHouse/pull/17659) ([nauta](https://github.com/nautaa)). +* Introduce `DETACH TABLE/VIEW ... PERMANENTLY` syntax, so that after restarting the table does not reappear back automatically on restart (only by explicit request). The table can still be attached back using the short syntax ATTACH TABLE. Implements [#5555](https://github.com/ClickHouse/ClickHouse/issues/5555). Fixes [#13850](https://github.com/ClickHouse/ClickHouse/issues/13850). [#17642](https://github.com/ClickHouse/ClickHouse/pull/17642) ([filimonov](https://github.com/filimonov)). +* Add asynchronous metrics on total amount of rows, bytes and parts in MergeTree tables. This fix [#11714](https://github.com/ClickHouse/ClickHouse/issues/11714). [#17639](https://github.com/ClickHouse/ClickHouse/pull/17639) ([flynn](https://github.com/ucasFL)). +* Add settings `limit` and `offset` for out-of-SQL pagination: [#16176](https://github.com/ClickHouse/ClickHouse/issues/16176) They are useful for building APIs. These two settings will affect SELECT query as if it is added like `select * from (your_original_select_query) t limit xxx offset xxx;`. [#17633](https://github.com/ClickHouse/ClickHouse/pull/17633) ([hexiaoting](https://github.com/hexiaoting)). +* Provide a new aggregator combinator : `-SimpleState` to build `SimpleAggregateFunction` types via query. It's useful for defining MaterializedView of AggregatingMergeTree engine, and will benefit projections too. [#16853](https://github.com/ClickHouse/ClickHouse/pull/16853) ([Amos Bird](https://github.com/amosbird)). +* Added `queries-file` parameter for `clickhouse-client` and `clickhouse-local`. [#15930](https://github.com/ClickHouse/ClickHouse/pull/15930) ([Maksim Kita](https://github.com/kitaisreal)). +* Added `query` parameter for `clickhouse-benchmark`. [#17832](https://github.com/ClickHouse/ClickHouse/pull/17832) ([Maksim Kita](https://github.com/kitaisreal)). +* `EXPLAIN AST` now support queries other then `SELECT`. [#18136](https://github.com/ClickHouse/ClickHouse/pull/18136) ([taiyang-li](https://github.com/taiyang-li)). + + +#### Experimental Feature + +* Added functions for calculation of minHash and simHash of text n-grams and shingles. They are intended for semi-duplicate search. Also functions `bitHammingDistance` and `tupleHammingDistance` are added. [#7649](https://github.com/ClickHouse/ClickHouse/pull/7649) ([flynn](https://github.com/ucasFL)). +* Add new data type `Map`. See [#1841](https://github.com/ClickHouse/ClickHouse/issues/1841). First version for Map only supports `String` type of key and value. [#15806](https://github.com/ClickHouse/ClickHouse/pull/15806) ([hexiaoting](https://github.com/hexiaoting)). +* Implement alternative SQL parser based on ANTLR4 runtime and generated from EBNF grammar. [#11298](https://github.com/ClickHouse/ClickHouse/pull/11298) ([Ivan](https://github.com/abyss7)). + + +#### Performance Improvement + +* New IP Dictionary implementation with lower memory consumption, improved performance for some cases, and fixed bugs. [#16804](https://github.com/ClickHouse/ClickHouse/pull/16804) ([vdimir](https://github.com/vdimir)). +* Parallel formatting for data export. [#11617](https://github.com/ClickHouse/ClickHouse/pull/11617) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* LDAP integration: Added `verification_cooldown` parameter in LDAP server connection configuration to allow caching of successful "bind" attempts for configurable period of time. [#15988](https://github.com/ClickHouse/ClickHouse/pull/15988) ([Denis Glazachev](https://github.com/traceon)). +* Add `--no-system-table` option for `clickhouse-local` to run without system tables. This avoids initialization of `DateLUT` that may take noticeable amount of time (tens of milliseconds) at startup. [#18899](https://github.com/ClickHouse/ClickHouse/pull/18899) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Replace `PODArray` with `PODArrayWithStackMemory` in `AggregateFunctionWindowFunnelData` to improve `windowFunnel` function performance. [#18817](https://github.com/ClickHouse/ClickHouse/pull/18817) ([flynn](https://github.com/ucasFL)). +* Don't send empty blocks to shards on synchronous INSERT into Distributed table. This closes [#14571](https://github.com/ClickHouse/ClickHouse/issues/14571). [#18775](https://github.com/ClickHouse/ClickHouse/pull/18775) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimized read for StorageMemory. [#18052](https://github.com/ClickHouse/ClickHouse/pull/18052) ([Maksim Kita](https://github.com/kitaisreal)). +* Using Dragonbox algorithm for float to string conversion instead of ryu. This improves performance of float to string conversion significantly. [#17831](https://github.com/ClickHouse/ClickHouse/pull/17831) ([Maksim Kita](https://github.com/kitaisreal)). +* Speedup `IPv6CIDRToRange` implementation. [#17569](https://github.com/ClickHouse/ClickHouse/pull/17569) ([vdimir](https://github.com/vdimir)). +* Add `remerge_sort_lowered_memory_bytes_ratio` setting (If memory usage after remerge does not reduced by this ratio, remerge will be disabled). [#17539](https://github.com/ClickHouse/ClickHouse/pull/17539) ([Azat Khuzhin](https://github.com/azat)). +* Improve performance of AggregatingMergeTree with SimpleAggregateFunction(String) in PK. [#17109](https://github.com/ClickHouse/ClickHouse/pull/17109) ([Azat Khuzhin](https://github.com/azat)). +* Now the `-If` combinator is devirtualized, and `count` is properly vectorized. It is for [this PR](https://github.com/ClickHouse/ClickHouse/pull/17041). [#17043](https://github.com/ClickHouse/ClickHouse/pull/17043) ([Amos Bird](https://github.com/amosbird)). +* Fix performance of reading from `Merge` tables over huge number of `MergeTree` tables. Fixes [#7748](https://github.com/ClickHouse/ClickHouse/issues/7748). [#16988](https://github.com/ClickHouse/ClickHouse/pull/16988) ([Anton Popov](https://github.com/CurtizJ)). +* Improved performance of function `repeat`. [#16937](https://github.com/ClickHouse/ClickHouse/pull/16937) ([satanson](https://github.com/satanson)). +* Slightly improved performance of float parsing. [#16809](https://github.com/ClickHouse/ClickHouse/pull/16809) ([Maksim Kita](https://github.com/kitaisreal)). +* Add possibility to skip merged partitions for `OPTIMIZE TABLE ... FINAL`. [#15939](https://github.com/ClickHouse/ClickHouse/pull/15939) ([Kruglov Pavel](https://github.com/Avogar)). +* Integrate with [fast_float from Daniel Lemire](https://github.com/lemire/fast_float) to parse floating point numbers. [#16787](https://github.com/ClickHouse/ClickHouse/pull/16787) ([Maksim Kita](https://github.com/kitaisreal)). It is not enabled, because performance its performance is still lower than rough float parser in ClickHouse. +* Fix max_distributed_connections (affects `prefer_localhost_replica = 1` and `max_threads != max_distributed_connections`). [#17848](https://github.com/ClickHouse/ClickHouse/pull/17848) ([Azat Khuzhin](https://github.com/azat)). +* Adaptive choice of single/multi part upload when sending data to S3. Single part upload is controlled by a new setting `max_single_part_upload_size`. [#17934](https://github.com/ClickHouse/ClickHouse/pull/17934) ([Pavel Kovalenko](https://github.com/Jokser)). +* Support for async tasks in `PipelineExecutor`. Initial support of async sockets for remote queries. [#17868](https://github.com/ClickHouse/ClickHouse/pull/17868) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow to use `optimize_move_to_prewhere` optimization with compact parts, when sizes of columns are unknown. [#17330](https://github.com/ClickHouse/ClickHouse/pull/17330) ([Anton Popov](https://github.com/CurtizJ)). + + +#### Improvement + +* Avoid deadlock when executing INSERT SELECT into itself from a table with `TinyLog` or `Log` table engines. This closes [#6802](https://github.com/ClickHouse/ClickHouse/issues/6802). This closes [#18691](https://github.com/ClickHouse/ClickHouse/issues/18691). This closes [#16812](https://github.com/ClickHouse/ClickHouse/issues/16812). This closes [#14570](https://github.com/ClickHouse/ClickHouse/issues/14570). [#15260](https://github.com/ClickHouse/ClickHouse/pull/15260) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support `SHOW CREATE VIEW name` syntax like [MySQL](https://dev.mysql.com/doc/refman/5.7/en/show-create-view.html). [#18095](https://github.com/ClickHouse/ClickHouse/pull/18095) ([Du Chuan](https://github.com/spongedu)). +* All queries of type `Decimal * Float` or vice versa are allowed, including aggregate ones (e.g. `SELECT sum(decimal_field * 1.1)` or `SELECT dec_col * float_col`), the result type is Float32 or Float64. [#18145](https://github.com/ClickHouse/ClickHouse/pull/18145) ([Mike](https://github.com/myrrc)). +* Improved minimal Web UI: add history; add sharing support; avoid race condition of different requests; add request in-flight and ready indicators; add favicon; detect Ctrl+Enter if textarea is not in focus. [#17293](https://github.com/ClickHouse/ClickHouse/pull/17293) [#17770](https://github.com/ClickHouse/ClickHouse/pull/17770) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* clickhouse-server didn't send `close` request to ZooKeeper server. [#16837](https://github.com/ClickHouse/ClickHouse/pull/16837) ([alesapin](https://github.com/alesapin)). +* Avoid server abnormal termination in case of too low memory limits (`max_memory_usage = 1` / `max_untracked_memory = 1`). [#17453](https://github.com/ClickHouse/ClickHouse/pull/17453) ([Azat Khuzhin](https://github.com/azat)). +* Fix non-deterministic result of `windowFunnel` function in case of same timestamp for different events. [#18884](https://github.com/ClickHouse/ClickHouse/pull/18884) ([Fuwang Hu](https://github.com/fuwhu)). +* Docker: Explicitly set uid / gid of clickhouse user & group to the fixed values (101) in clickhouse-server Docker images. [#19096](https://github.com/ClickHouse/ClickHouse/pull/19096) ([filimonov](https://github.com/filimonov)). +* Asynchronous INSERTs to `Distributed` tables: Two new settings (by analogy with MergeTree family) has been added: - `fsync_after_insert` - Do fsync for every inserted. Will decreases performance of inserts. - `fsync_directories` - Do fsync for temporary directory (that is used for async INSERT only) after all operations (writes, renames, etc.). [#18864](https://github.com/ClickHouse/ClickHouse/pull/18864) ([Azat Khuzhin](https://github.com/azat)). +* `SYSTEM KILL` command started to work in Docker. This closes [#18847](https://github.com/ClickHouse/ClickHouse/issues/18847). [#18848](https://github.com/ClickHouse/ClickHouse/pull/18848) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Expand macros in the zk path when executing `FETCH PARTITION`. [#18839](https://github.com/ClickHouse/ClickHouse/pull/18839) ([fastio](https://github.com/fastio)). +* Apply `ALTER TABLE ON CLUSTER MODIFY SETTING ...` to all replicas. Because we don't replicate such alter commands. [#18789](https://github.com/ClickHouse/ClickHouse/pull/18789) ([Amos Bird](https://github.com/amosbird)). +* Allow column transformer `EXCEPT` to accept a string as regular expression matcher. This resolves [#18685](https://github.com/ClickHouse/ClickHouse/issues/18685) . [#18699](https://github.com/ClickHouse/ClickHouse/pull/18699) ([Amos Bird](https://github.com/amosbird)). +* Fix SimpleAggregateFunction in SummingMergeTree. Now it works like AggregateFunction. In previous versions values were summed together regardless to the aggregate function. This fixes [#18564](https://github.com/ClickHouse/ClickHouse/issues/18564) . [#8052](https://github.com/ClickHouse/ClickHouse/issues/8052). [#18637](https://github.com/ClickHouse/ClickHouse/pull/18637) ([Amos Bird](https://github.com/amosbird)). Another fix of using `SimpleAggregateFunction` in `SummingMergeTree`. This fixes [#18676](https://github.com/ClickHouse/ClickHouse/issues/18676) . [#18677](https://github.com/ClickHouse/ClickHouse/pull/18677) ([Amos Bird](https://github.com/amosbird)). +* Fixed assertion error inside allocator in case when last argument of function bar is NaN. Now simple ClickHouse's exception is being thrown. This fixes [#17876](https://github.com/ClickHouse/ClickHouse/issues/17876). [#18520](https://github.com/ClickHouse/ClickHouse/pull/18520) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix usability issue: no newline after exception message in some tools. [#18444](https://github.com/ClickHouse/ClickHouse/pull/18444) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add ability to modify primary and partition key column type from `LowCardinality(Type)` to `Type` and vice versa. Also add an ability to modify primary key column type from `EnumX ` to `IntX` type. Fixes [#5604](https://github.com/ClickHouse/ClickHouse/issues/5604). [#18362](https://github.com/ClickHouse/ClickHouse/pull/18362) ([alesapin](https://github.com/alesapin)). +* Implement `untuple` field access. [#18133](https://github.com/ClickHouse/ClickHouse/issues/18133). [#18309](https://github.com/ClickHouse/ClickHouse/pull/18309) ([hexiaoting](https://github.com/hexiaoting)). +* Allow to parse Array fields from CSV if it is represented as a string containing array that was serialized as nested CSV. Example: `"[""Hello"", ""world"", ""42"""" TV""]"` will parse as `['Hello', 'world', '42" TV']`. Allow to parse array in CSV in a string without enclosing braces. Example: `"'Hello', 'world', '42"" TV'"` will parse as `['Hello', 'world', '42" TV']`. [#18271](https://github.com/ClickHouse/ClickHouse/pull/18271) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make better adaptive granularity calculation for merge tree wide parts. [#18223](https://github.com/ClickHouse/ClickHouse/pull/18223) ([alesapin](https://github.com/alesapin)). +* Now `clickhouse install` could work on Mac. The problem was that there is no procfs on this platform. [#18201](https://github.com/ClickHouse/ClickHouse/pull/18201) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Better hints for `SHOW ...` query syntax. [#18183](https://github.com/ClickHouse/ClickHouse/pull/18183) ([Du Chuan](https://github.com/spongedu)). +* Array aggregation `arrayMin`, `arrayMax`, `arraySum`, `arrayAvg` support for `Int128`, `Int256`, `UInt256`. [#18147](https://github.com/ClickHouse/ClickHouse/pull/18147) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `disk` to Set and Join storage settings. [#18112](https://github.com/ClickHouse/ClickHouse/pull/18112) ([Grigory Pervakov](https://github.com/GrigoryPervakov)). +* Access control: Now table function `merge()` requires current user to have `SELECT` privilege on each table it receives data from. This PR fixes [#16964](https://github.com/ClickHouse/ClickHouse/issues/16964). [#18104](https://github.com/ClickHouse/ClickHouse/pull/18104) [#17983](https://github.com/ClickHouse/ClickHouse/pull/17983) ([Vitaly Baranov](https://github.com/vitlibar)). +* Temporary tables are visible in the system tables `system.tables` and `system.columns` now only in those session where they have been created. The internal database `_temporary_and_external_tables` is now hidden in those system tables; temporary tables are shown as tables with empty database with the `is_temporary` flag set instead. [#18014](https://github.com/ClickHouse/ClickHouse/pull/18014) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix clickhouse-client rendering issue when the size of terminal window changes. [#18009](https://github.com/ClickHouse/ClickHouse/pull/18009) ([Amos Bird](https://github.com/amosbird)). +* Decrease log verbosity of the events when the client drops the connection from Warning to Information. [#18005](https://github.com/ClickHouse/ClickHouse/pull/18005) ([filimonov](https://github.com/filimonov)). +* Forcibly removing empty or bad metadata files from filesystem for DiskS3. S3 is an experimental feature. [#17935](https://github.com/ClickHouse/ClickHouse/pull/17935) ([Pavel Kovalenko](https://github.com/Jokser)). +* Access control: `allow_introspection_functions=0` prohibits usage of introspection functions but doesn't prohibit giving grants for them anymore (the grantee will need to set `allow_introspection_functions=1` for himself to be able to use that grant). Similarly `allow_ddl=0` prohibits usage of DDL commands but doesn't prohibit giving grants for them anymore. [#17908](https://github.com/ClickHouse/ClickHouse/pull/17908) ([Vitaly Baranov](https://github.com/vitlibar)). +* Usability improvement: hints for column names. [#17112](https://github.com/ClickHouse/ClickHouse/issues/17112). [#17857](https://github.com/ClickHouse/ClickHouse/pull/17857) ([fastio](https://github.com/fastio)). +* Add diagnostic information when two merge tables try to read each other's data. [#17854](https://github.com/ClickHouse/ClickHouse/pull/17854) ([徐炘](https://github.com/weeds085490)). +* Let the possibility to override timeout value for running script using the ClickHouse docker image. [#17818](https://github.com/ClickHouse/ClickHouse/pull/17818) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Check system log tables' engine definition grammar to prevent some configuration errors. Notes that this grammar check is not semantical, that means such mistakes as non-existent columns / expression functions would be not found out util the table is created. [#17739](https://github.com/ClickHouse/ClickHouse/pull/17739) ([Du Chuan](https://github.com/spongedu)). +* Removed exception throwing at `RabbitMQ` table initialization if there was no connection (it will be reconnecting in the background). [#17709](https://github.com/ClickHouse/ClickHouse/pull/17709) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Do not ignore server memory limits during Buffer flush. [#17646](https://github.com/ClickHouse/ClickHouse/pull/17646) ([Azat Khuzhin](https://github.com/azat)). +* Switch to patched version of RocksDB (from ClickHouse-Extras) to fix use-after-free error. [#17643](https://github.com/ClickHouse/ClickHouse/pull/17643) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added an offset to exception message for parallel parsing. This fixes [#17457](https://github.com/ClickHouse/ClickHouse/issues/17457). [#17641](https://github.com/ClickHouse/ClickHouse/pull/17641) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Don't throw "Too many parts" error in the middle of INSERT query. [#17566](https://github.com/ClickHouse/ClickHouse/pull/17566) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow query parameters in UPDATE statement of ALTER query. Fixes [#10976](https://github.com/ClickHouse/ClickHouse/issues/10976). [#17563](https://github.com/ClickHouse/ClickHouse/pull/17563) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Query obfuscator: avoid usage of some SQL keywords for identifier names. [#17526](https://github.com/ClickHouse/ClickHouse/pull/17526) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Export current max ddl entry executed by DDLWorker via server metric. It's useful to check if DDLWorker hangs somewhere. [#17464](https://github.com/ClickHouse/ClickHouse/pull/17464) ([Amos Bird](https://github.com/amosbird)). +* Export asynchronous metrics of all servers current threads. It's useful to track down issues like [this](https://github.com/ClickHouse-Extras/poco/pull/28). [#17463](https://github.com/ClickHouse/ClickHouse/pull/17463) ([Amos Bird](https://github.com/amosbird)). +* Include dynamic columns like MATERIALIZED / ALIAS for wildcard query when settings `asterisk_include_materialized_columns` and `asterisk_include_alias_columns` are turned on. [#17462](https://github.com/ClickHouse/ClickHouse/pull/17462) ([Ken Chen](https://github.com/chenziliang)). +* Allow specifying [TTL](https://clickhouse.com/docs/ja/engines/table-engines/mergetree-family/mergetree/#mergetree-table-ttl) to remove old entries from [system log tables](https://clickhouse.com/docs/ja/operations/system-tables/), using the `` attribute in `config.xml`. [#17438](https://github.com/ClickHouse/ClickHouse/pull/17438) ([Du Chuan](https://github.com/spongedu)). +* Now queries coming to the server via MySQL and PostgreSQL protocols have distinctive interface types (which can be seen in the `interface` column of the table`system.query_log`): `4` for MySQL, and `5` for PostgreSQL, instead of formerly used `1` which is now used for the native protocol only. [#17437](https://github.com/ClickHouse/ClickHouse/pull/17437) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix parsing of SETTINGS clause of the `INSERT ... SELECT ... SETTINGS` query. [#17414](https://github.com/ClickHouse/ClickHouse/pull/17414) ([Azat Khuzhin](https://github.com/azat)). +* Correctly account memory in RadixSort. [#17412](https://github.com/ClickHouse/ClickHouse/pull/17412) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add eof check in `receiveHello` in server to prevent getting `Attempt to read after eof` exception. [#17365](https://github.com/ClickHouse/ClickHouse/pull/17365) ([Kruglov Pavel](https://github.com/Avogar)). +* Avoid possible stack overflow in bigint conversion. Big integers are experimental. [#17269](https://github.com/ClickHouse/ClickHouse/pull/17269) ([flynn](https://github.com/ucasFL)). +* Now `set` indices will work with `GLOBAL IN`. This fixes [#17232](https://github.com/ClickHouse/ClickHouse/issues/17232) , [#5576](https://github.com/ClickHouse/ClickHouse/issues/5576) . [#17253](https://github.com/ClickHouse/ClickHouse/pull/17253) ([Amos Bird](https://github.com/amosbird)). +* Add limit for http redirects in request to S3 storage (`s3_max_redirects`). [#17220](https://github.com/ClickHouse/ClickHouse/pull/17220) ([ianton-ru](https://github.com/ianton-ru)). +* When `-OrNull` combinator combined `-If`, `-Merge`, `-MergeState`, `-State` combinators, we should put `-OrNull` in front. [#16935](https://github.com/ClickHouse/ClickHouse/pull/16935) ([flynn](https://github.com/ucasFL)). +* Support HTTP proxy and HTTPS S3 endpoint configuration. [#16861](https://github.com/ClickHouse/ClickHouse/pull/16861) ([Pavel Kovalenko](https://github.com/Jokser)). +* Added proper authentication using environment, `~/.aws` and `AssumeRole` for S3 client. [#16856](https://github.com/ClickHouse/ClickHouse/pull/16856) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Add more OpenTelemetry spans. Add an example of how to export the span data to Zipkin. [#16535](https://github.com/ClickHouse/ClickHouse/pull/16535) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Cache dictionaries: Completely eliminate callbacks and locks for acquiring them. Keys are not divided into "not found" and "expired", but stored in the same map during query. [#14958](https://github.com/ClickHouse/ClickHouse/pull/14958) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix never worked `fsync_part_directory`/`fsync_after_insert`/`in_memory_parts_insert_sync` (experimental feature). [#18845](https://github.com/ClickHouse/ClickHouse/pull/18845) ([Azat Khuzhin](https://github.com/azat)). +* Allow using `Atomic` engine for nested database of `MaterializeMySQL` engine. [#14849](https://github.com/ClickHouse/ClickHouse/pull/14849) ([tavplubix](https://github.com/tavplubix)). + + +#### Bug Fix + +* Fix the issue when server can stop accepting connections in very rare cases. [#17542](https://github.com/ClickHouse/ClickHouse/pull/17542) (Amos Bird, [alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix index analysis of binary functions with constant argument which leads to wrong query results. This fixes [#18364](https://github.com/ClickHouse/ClickHouse/issues/18364). [#18373](https://github.com/ClickHouse/ClickHouse/pull/18373) ([Amos Bird](https://github.com/amosbird)). +* Fix possible wrong index analysis when the types of the index comparison are different. This fixes [#17122](https://github.com/ClickHouse/ClickHouse/issues/17122). [#17145](https://github.com/ClickHouse/ClickHouse/pull/17145) ([Amos Bird](https://github.com/amosbird)). +* Disable write with AIO during merges because it can lead to extremely rare data corruption of primary key columns during merge. [#18481](https://github.com/ClickHouse/ClickHouse/pull/18481) ([alesapin](https://github.com/alesapin)). +* Restrict merges from wide to compact parts. In case of vertical merge it led to broken result part. [#18381](https://github.com/ClickHouse/ClickHouse/pull/18381) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible incomplete query result while reading from `MergeTree*` in case of read backoff (message ` MergeTreeReadPool: Will lower number of threads` in logs). Was introduced in [#16423](https://github.com/ClickHouse/ClickHouse/issues/16423). Fixes [#18137](https://github.com/ClickHouse/ClickHouse/issues/18137). [#18216](https://github.com/ClickHouse/ClickHouse/pull/18216) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix use after free bug in `rocksdb` library. [#18862](https://github.com/ClickHouse/ClickHouse/pull/18862) ([sundyli](https://github.com/sundy-li)). +* Fix infinite reading from file in `ORC` format (was introduced in [#10580](https://github.com/ClickHouse/ClickHouse/issues/10580)). Fixes [#19095](https://github.com/ClickHouse/ClickHouse/issues/19095). [#19134](https://github.com/ClickHouse/ClickHouse/pull/19134) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug in merge tree data writer which can lead to marks with bigger size than fixed granularity size. Fixes [#18913](https://github.com/ClickHouse/ClickHouse/issues/18913). [#19123](https://github.com/ClickHouse/ClickHouse/pull/19123) ([alesapin](https://github.com/alesapin)). +* Fix startup bug when clickhouse was not able to read compression codec from `LowCardinality(Nullable(...))` and throws exception `Attempt to read after EOF`. Fixes [#18340](https://github.com/ClickHouse/ClickHouse/issues/18340). [#19101](https://github.com/ClickHouse/ClickHouse/pull/19101) ([alesapin](https://github.com/alesapin)). +* Restrict `MODIFY TTL` queries for `MergeTree` tables created in old syntax. Previously the query succeeded, but actually it had no effect. [#19064](https://github.com/ClickHouse/ClickHouse/pull/19064) ([Anton Popov](https://github.com/CurtizJ)). +* Make sure `groupUniqArray` returns correct type for argument of Enum type. This closes [#17875](https://github.com/ClickHouse/ClickHouse/issues/17875). [#19019](https://github.com/ClickHouse/ClickHouse/pull/19019) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible error `Expected single dictionary argument for function` if use function `ignore` with `LowCardinality` argument. Fixes [#14275](https://github.com/ClickHouse/ClickHouse/issues/14275). [#19016](https://github.com/ClickHouse/ClickHouse/pull/19016) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inserting of `LowCardinality` column to table with `TinyLog` engine. Fixes [#18629](https://github.com/ClickHouse/ClickHouse/issues/18629). [#19010](https://github.com/ClickHouse/ClickHouse/pull/19010) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Join tries to materialize const columns, but our code wants them in other places. [#18982](https://github.com/ClickHouse/ClickHouse/pull/18982) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Disable `optimize_move_functions_out_of_any` because optimization is not always correct. This closes [#18051](https://github.com/ClickHouse/ClickHouse/issues/18051). This closes [#18973](https://github.com/ClickHouse/ClickHouse/issues/18973). [#18981](https://github.com/ClickHouse/ClickHouse/pull/18981) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix possible exception `QueryPipeline stream: different number of columns` caused by merging of query plan's `Expression` steps. Fixes [#18190](https://github.com/ClickHouse/ClickHouse/issues/18190). [#18980](https://github.com/ClickHouse/ClickHouse/pull/18980) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed very rare deadlock at shutdown. [#18977](https://github.com/ClickHouse/ClickHouse/pull/18977) ([tavplubix](https://github.com/tavplubix)). +* Fix incorrect behavior when `ALTER TABLE ... DROP PART 'part_name'` query removes all deduplication blocks for the whole partition. Fixes [#18874](https://github.com/ClickHouse/ClickHouse/issues/18874). [#18969](https://github.com/ClickHouse/ClickHouse/pull/18969) ([alesapin](https://github.com/alesapin)). +* Attach partition should reset the mutation. [#18804](https://github.com/ClickHouse/ClickHouse/issues/18804). [#18935](https://github.com/ClickHouse/ClickHouse/pull/18935) ([fastio](https://github.com/fastio)). +* Fix issue with `bitmapOrCardinality` that may lead to nullptr dereference. This closes [#18911](https://github.com/ClickHouse/ClickHouse/issues/18911). [#18912](https://github.com/ClickHouse/ClickHouse/pull/18912) ([sundyli](https://github.com/sundy-li)). +* Fix possible hang at shutdown in `clickhouse-local`. This fixes [#18891](https://github.com/ClickHouse/ClickHouse/issues/18891). [#18893](https://github.com/ClickHouse/ClickHouse/pull/18893) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Queries for external databases (MySQL, ODBC, JDBC) were incorrectly rewritten if there was an expression in form of `x IN table`. This fixes [#9756](https://github.com/ClickHouse/ClickHouse/issues/9756). [#18876](https://github.com/ClickHouse/ClickHouse/pull/18876) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix *If combinator with unary function and Nullable types. [#18806](https://github.com/ClickHouse/ClickHouse/pull/18806) ([Azat Khuzhin](https://github.com/azat)). +* Fix the issue that asynchronous distributed INSERTs can be rejected by the server if the setting `network_compression_method` is globally set to non-default value. This fixes [#18741](https://github.com/ClickHouse/ClickHouse/issues/18741). [#18776](https://github.com/ClickHouse/ClickHouse/pull/18776) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed `Attempt to read after eof` error when trying to `CAST` `NULL` from `Nullable(String)` to `Nullable(Decimal(P, S))`. Now function `CAST` returns `NULL` when it cannot parse decimal from nullable string. Fixes [#7690](https://github.com/ClickHouse/ClickHouse/issues/7690). [#18718](https://github.com/ClickHouse/ClickHouse/pull/18718) ([Winter Zhang](https://github.com/zhang2014)). +* Fix minor issue with logging. [#18717](https://github.com/ClickHouse/ClickHouse/pull/18717) ([sundyli](https://github.com/sundy-li)). +* Fix removing of empty parts in `ReplicatedMergeTree` tables, created with old syntax. Fixes [#18582](https://github.com/ClickHouse/ClickHouse/issues/18582). [#18614](https://github.com/ClickHouse/ClickHouse/pull/18614) ([Anton Popov](https://github.com/CurtizJ)). +* Fix previous bug when date overflow with different values. Strict Date value limit to "2106-02-07", cast date > "2106-02-07" to value 0. [#18565](https://github.com/ClickHouse/ClickHouse/pull/18565) ([hexiaoting](https://github.com/hexiaoting)). +* Add FixedString data type support for replication from MySQL. Replication from MySQL is an experimental feature. This patch fixes [#18450](https://github.com/ClickHouse/ClickHouse/issues/18450) Also fixes [#6556](https://github.com/ClickHouse/ClickHouse/issues/6556). [#18553](https://github.com/ClickHouse/ClickHouse/pull/18553) ([awesomeleo](https://github.com/awesomeleo)). +* Fix possible `Pipeline stuck` error while using `ORDER BY` after subquery with `RIGHT` or `FULL` join. [#18550](https://github.com/ClickHouse/ClickHouse/pull/18550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug which may lead to `ALTER` queries hung after corresponding mutation kill. Found by thread fuzzer. [#18518](https://github.com/ClickHouse/ClickHouse/pull/18518) ([alesapin](https://github.com/alesapin)). +* Proper support for 12AM in `parseDateTimeBestEffort` function. This fixes [#18402](https://github.com/ClickHouse/ClickHouse/issues/18402). [#18449](https://github.com/ClickHouse/ClickHouse/pull/18449) ([vladimir-golovchenko](https://github.com/vladimir-golovchenko)). +* Fixed `value is too short` error when executing `toType(...)` functions (`toDate`, `toUInt32`, etc) with argument of type `Nullable(String)`. Now such functions return `NULL` on parsing errors instead of throwing exception. Fixes [#7673](https://github.com/ClickHouse/ClickHouse/issues/7673). [#18445](https://github.com/ClickHouse/ClickHouse/pull/18445) ([tavplubix](https://github.com/tavplubix)). +* Fix the unexpected behaviour of `SHOW TABLES`. [#18431](https://github.com/ClickHouse/ClickHouse/pull/18431) ([fastio](https://github.com/fastio)). +* Fix -SimpleState combinator generates incompatible arugment type and return type. [#18404](https://github.com/ClickHouse/ClickHouse/pull/18404) ([Amos Bird](https://github.com/amosbird)). +* Fix possible race condition in concurrent usage of `Set` or `Join` tables and selects from `system.tables`. [#18385](https://github.com/ClickHouse/ClickHouse/pull/18385) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix filling table `system.settings_profile_elements`. This PR fixes [#18231](https://github.com/ClickHouse/ClickHouse/issues/18231). [#18379](https://github.com/ClickHouse/ClickHouse/pull/18379) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix possible crashes in aggregate functions with combinator `Distinct`, while using two-level aggregation. Fixes [#17682](https://github.com/ClickHouse/ClickHouse/issues/17682). [#18365](https://github.com/ClickHouse/ClickHouse/pull/18365) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed issue when `clickhouse-odbc-bridge` process is unreachable by server on machines with dual IPv4/IPv6 stack; Fixed issue when ODBC dictionary updates are performed using malformed queries and/or cause crashes of the odbc-bridge process; Possibly closes [#14489](https://github.com/ClickHouse/ClickHouse/issues/14489). [#18278](https://github.com/ClickHouse/ClickHouse/pull/18278) ([Denis Glazachev](https://github.com/traceon)). +* Access control: `SELECT count() FROM table` now can be executed if the user has access to at least single column from a table. This PR fixes [#10639](https://github.com/ClickHouse/ClickHouse/issues/10639). [#18233](https://github.com/ClickHouse/ClickHouse/pull/18233) ([Vitaly Baranov](https://github.com/vitlibar)). +* Access control: `SELECT JOIN` now requires the `SELECT` privilege on each of the joined tables. This PR fixes [#17654](https://github.com/ClickHouse/ClickHouse/issues/17654). [#18232](https://github.com/ClickHouse/ClickHouse/pull/18232) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix key comparison between Enum and Int types. This fixes [#17989](https://github.com/ClickHouse/ClickHouse/issues/17989). [#18214](https://github.com/ClickHouse/ClickHouse/pull/18214) ([Amos Bird](https://github.com/amosbird)). +* Replication from MySQL (experimental feature). Fixes [#18186](https://github.com/ClickHouse/ClickHouse/issues/18186) Fixes [#16372](https://github.com/ClickHouse/ClickHouse/issues/16372) Fix unique key convert issue in MaterializeMySQL database engine. [#18211](https://github.com/ClickHouse/ClickHouse/pull/18211) ([Winter Zhang](https://github.com/zhang2014)). +* Fix inconsistency for queries with both `WITH FILL` and `WITH TIES` [#17466](https://github.com/ClickHouse/ClickHouse/issues/17466). [#18188](https://github.com/ClickHouse/ClickHouse/pull/18188) ([hexiaoting](https://github.com/hexiaoting)). +* Fix inserting a row with default value in case of parsing error in the last column. Fixes [#17712](https://github.com/ClickHouse/ClickHouse/issues/17712). [#18182](https://github.com/ClickHouse/ClickHouse/pull/18182) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix `Unknown setting profile` error on attempt to set settings profile. [#18167](https://github.com/ClickHouse/ClickHouse/pull/18167) ([tavplubix](https://github.com/tavplubix)). +* Fix error when query `MODIFY COLUMN ... REMOVE TTL` doesn't actually remove column TTL. [#18130](https://github.com/ClickHouse/ClickHouse/pull/18130) ([alesapin](https://github.com/alesapin)). +* Fixed `std::out_of_range: basic_string` in S3 URL parsing. [#18059](https://github.com/ClickHouse/ClickHouse/pull/18059) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix comparison of `DateTime64` and `Date`. Fixes [#13804](https://github.com/ClickHouse/ClickHouse/issues/13804) and [#11222](https://github.com/ClickHouse/ClickHouse/issues/11222). ... [#18050](https://github.com/ClickHouse/ClickHouse/pull/18050) ([Vasily Nemkov](https://github.com/Enmk)). +* Replication from MySQL (experimental feature): Fixes [#15187](https://github.com/ClickHouse/ClickHouse/issues/15187) Fixes [#17912](https://github.com/ClickHouse/ClickHouse/issues/17912) support convert MySQL prefix index for MaterializeMySQL. [#17944](https://github.com/ClickHouse/ClickHouse/pull/17944) ([Winter Zhang](https://github.com/zhang2014)). +* When server log rotation was configured using `logger.size` parameter with numeric value larger than 2^32, the logs were not rotated properly. This is fixed. [#17905](https://github.com/ClickHouse/ClickHouse/pull/17905) ([Alexander Kuzmenkov](https://github.com/akuzm)). +* Trivial query optimization was producing wrong result if query contains ARRAY JOIN (so query is actually non trivial). [#17887](https://github.com/ClickHouse/ClickHouse/pull/17887) ([sundyli](https://github.com/sundy-li)). +* Fix possible segfault in `topK` aggregate function. This closes [#17404](https://github.com/ClickHouse/ClickHouse/issues/17404). [#17845](https://github.com/ClickHouse/ClickHouse/pull/17845) ([Maksim Kita](https://github.com/kitaisreal)). +* WAL (experimental feature): Do not restore parts from WAL if `in_memory_parts_enable_wal` is disabled. [#17802](https://github.com/ClickHouse/ClickHouse/pull/17802) ([detailyang](https://github.com/detailyang)). +* Exception message about max table size to drop was displayed incorrectly. [#17764](https://github.com/ClickHouse/ClickHouse/pull/17764) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed possible segfault when there is not enough space when inserting into `Distributed` table. [#17737](https://github.com/ClickHouse/ClickHouse/pull/17737) ([tavplubix](https://github.com/tavplubix)). +* Fixed problem when ClickHouse fails to resume connection to MySQL servers. [#17681](https://github.com/ClickHouse/ClickHouse/pull/17681) ([Alexander Kazakov](https://github.com/Akazz)). +* Windows: Fixed `Function not implemented` error when executing `RENAME` query in `Atomic` database with ClickHouse running on Windows Subsystem for Linux. Fixes [#17661](https://github.com/ClickHouse/ClickHouse/issues/17661). [#17664](https://github.com/ClickHouse/ClickHouse/pull/17664) ([tavplubix](https://github.com/tavplubix)). +* In might be determined incorrectly if cluster is circular- (cross-) replicated or not when executing `ON CLUSTER` query due to race condition when `pool_size` > 1. It's fixed. [#17640](https://github.com/ClickHouse/ClickHouse/pull/17640) ([tavplubix](https://github.com/tavplubix)). +* Fix empty `system.stack_trace` table when server is running in daemon mode. [#17630](https://github.com/ClickHouse/ClickHouse/pull/17630) ([Amos Bird](https://github.com/amosbird)). +* Exception `fmt::v7::format_error` can be logged in background for MergeTree tables. This fixes [#17613](https://github.com/ClickHouse/ClickHouse/issues/17613). [#17615](https://github.com/ClickHouse/ClickHouse/pull/17615) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* When clickhouse-client is used in interactive mode with multiline queries, single line comment was erronously extended till the end of query. This fixes [#13654](https://github.com/ClickHouse/ClickHouse/issues/13654). [#17565](https://github.com/ClickHouse/ClickHouse/pull/17565) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix alter query hang when the corresponding mutation was killed on the different replica. Fixes [#16953](https://github.com/ClickHouse/ClickHouse/issues/16953). [#17499](https://github.com/ClickHouse/ClickHouse/pull/17499) ([alesapin](https://github.com/alesapin)). +* Fix issue with memory accounting when mark cache size was underestimated by clickhouse. It may happen when there are a lot of tiny files with marks. [#17496](https://github.com/ClickHouse/ClickHouse/pull/17496) ([alesapin](https://github.com/alesapin)). +* Fix `ORDER BY` with enabled setting `optimize_redundant_functions_in_order_by`. [#17471](https://github.com/ClickHouse/ClickHouse/pull/17471) ([Anton Popov](https://github.com/CurtizJ)). +* Fix duplicates after `DISTINCT` which were possible because of incorrect optimization. Fixes [#17294](https://github.com/ClickHouse/ClickHouse/issues/17294). [#17296](https://github.com/ClickHouse/ClickHouse/pull/17296) ([li chengxiang](https://github.com/chengxianglibra)). [#17439](https://github.com/ClickHouse/ClickHouse/pull/17439) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed high CPU usage in background tasks of *MergeTree tables. [#17416](https://github.com/ClickHouse/ClickHouse/pull/17416) ([tavplubix](https://github.com/tavplubix)). +* Fix possible crash while reading from `JOIN` table with `LowCardinality` types. Fixes [#17228](https://github.com/ClickHouse/ClickHouse/issues/17228). [#17397](https://github.com/ClickHouse/ClickHouse/pull/17397) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Replication from MySQL (experimental feature): Fixes [#16835](https://github.com/ClickHouse/ClickHouse/issues/16835) try fix miss match header with MySQL SHOW statement. [#17366](https://github.com/ClickHouse/ClickHouse/pull/17366) ([Winter Zhang](https://github.com/zhang2014)). +* Fix nondeterministic functions with predicate optimizer. This fixes [#17244](https://github.com/ClickHouse/ClickHouse/issues/17244). [#17273](https://github.com/ClickHouse/ClickHouse/pull/17273) ([Winter Zhang](https://github.com/zhang2014)). +* Fix possible `Unexpected packet Data received from client` error for Distributed queries with `LIMIT`. [#17254](https://github.com/ClickHouse/ClickHouse/pull/17254) ([Azat Khuzhin](https://github.com/azat)). +* Fix set index invalidation when there are const columns in the subquery. This fixes [#17246](https://github.com/ClickHouse/ClickHouse/issues/17246). [#17249](https://github.com/ClickHouse/ClickHouse/pull/17249) ([Amos Bird](https://github.com/amosbird)). +* clickhouse-copier: Fix for non-partitioned tables [#15235](https://github.com/ClickHouse/ClickHouse/issues/15235). [#17248](https://github.com/ClickHouse/ClickHouse/pull/17248) ([Qi Chen](https://github.com/kaka11chen)). +* Fixed possible not-working mutations for parts stored on S3 disk (experimental feature). [#17227](https://github.com/ClickHouse/ClickHouse/pull/17227) ([Pavel Kovalenko](https://github.com/Jokser)). +* Bug fix for funciton `fuzzBits`, related issue: [#16980](https://github.com/ClickHouse/ClickHouse/issues/16980). [#17051](https://github.com/ClickHouse/ClickHouse/pull/17051) ([hexiaoting](https://github.com/hexiaoting)). +* Fix `optimize_distributed_group_by_sharding_key` for query with OFFSET only. [#16996](https://github.com/ClickHouse/ClickHouse/pull/16996) ([Azat Khuzhin](https://github.com/azat)). +* Fix queries from `Merge` tables over `Distributed` tables with JOINs. [#16993](https://github.com/ClickHouse/ClickHouse/pull/16993) ([Azat Khuzhin](https://github.com/azat)). +* Fix order by optimization with monotonic functions. Fixes [#16107](https://github.com/ClickHouse/ClickHouse/issues/16107). [#16956](https://github.com/ClickHouse/ClickHouse/pull/16956) ([Anton Popov](https://github.com/CurtizJ)). +* Fix incorrect comparison of types `DateTime64` with different scales. Fixes [#16655](https://github.com/ClickHouse/ClickHouse/issues/16655) ... [#16952](https://github.com/ClickHouse/ClickHouse/pull/16952) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix optimization of group by with enabled setting `optimize_aggregators_of_group_by_keys` and joins. Fixes [#12604](https://github.com/ClickHouse/ClickHouse/issues/12604). [#16951](https://github.com/ClickHouse/ClickHouse/pull/16951) ([Anton Popov](https://github.com/CurtizJ)). +* Minor fix in SHOW ACCESS query. [#16866](https://github.com/ClickHouse/ClickHouse/pull/16866) ([tavplubix](https://github.com/tavplubix)). +* Fix the behaviour with enabled `optimize_trivial_count_query` setting with partition predicate. [#16767](https://github.com/ClickHouse/ClickHouse/pull/16767) ([Azat Khuzhin](https://github.com/azat)). +* Return number of affected rows for INSERT queries via MySQL wire protocol. Previously ClickHouse used to always return 0, it's fixed. Fixes [#16605](https://github.com/ClickHouse/ClickHouse/issues/16605). [#16715](https://github.com/ClickHouse/ClickHouse/pull/16715) ([Winter Zhang](https://github.com/zhang2014)). +* Fix inconsistent behavior caused by `select_sequential_consistency` for optimized trivial count query and system tables. [#16309](https://github.com/ClickHouse/ClickHouse/pull/16309) ([Hao Chen](https://github.com/haoch)). +* Throw error when `REPLACE` column transformer operates on non existing column. [#16183](https://github.com/ClickHouse/ClickHouse/pull/16183) ([hexiaoting](https://github.com/hexiaoting)). +* Throw exception in case of not equi-join ON expression in RIGH|FULL JOIN. [#15162](https://github.com/ClickHouse/ClickHouse/pull/15162) ([Artem Zuikov](https://github.com/4ertus2)). + + +#### Build/Testing/Packaging Improvement + +* Add simple integrity check for ClickHouse binary. It allows to detect corruption due to faulty hardware (bit rot on storage media or bit flips in RAM). [#18811](https://github.com/ClickHouse/ClickHouse/pull/18811) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Change `OpenSSL` to `BoringSSL`. It allows to avoid issues with sanitizers. This fixes [#12490](https://github.com/ClickHouse/ClickHouse/issues/12490). This fixes [#17502](https://github.com/ClickHouse/ClickHouse/issues/17502). This fixes [#12952](https://github.com/ClickHouse/ClickHouse/issues/12952). [#18129](https://github.com/ClickHouse/ClickHouse/pull/18129) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Simplify `Sys/V` init script. It was not working on Ubuntu 12.04 or older. [#17428](https://github.com/ClickHouse/ClickHouse/pull/17428) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Multiple improvements in `./clickhouse install` script. [#17421](https://github.com/ClickHouse/ClickHouse/pull/17421) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now ClickHouse can pretend to be a fake ZooKeeper. Currently, storage implementation is just stored in-memory hash-table, and server partially support ZooKeeper protocol. [#16877](https://github.com/ClickHouse/ClickHouse/pull/16877) ([alesapin](https://github.com/alesapin)). +* Fix dead list watches removal for TestKeeperStorage (a mock for ZooKeeper). [#18065](https://github.com/ClickHouse/ClickHouse/pull/18065) ([alesapin](https://github.com/alesapin)). +* Add `SYSTEM SUSPEND` command for fault injection. It can be used to faciliate failover tests. This closes [#15979](https://github.com/ClickHouse/ClickHouse/issues/15979). [#18850](https://github.com/ClickHouse/ClickHouse/pull/18850) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Generate build id when ClickHouse is linked with `lld`. It's appeared that `lld` does not generate it by default on my machine. Build id is used for crash reports and introspection. [#18808](https://github.com/ClickHouse/ClickHouse/pull/18808) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix shellcheck errors in style check. [#18566](https://github.com/ClickHouse/ClickHouse/pull/18566) ([Ilya Yatsishin](https://github.com/qoega)). +* Update timezones info to 2020e. [#18531](https://github.com/ClickHouse/ClickHouse/pull/18531) ([alesapin](https://github.com/alesapin)). +* Fix codespell warnings. Split style checks into separate parts. Update style checks docker image. [#18463](https://github.com/ClickHouse/ClickHouse/pull/18463) ([Ilya Yatsishin](https://github.com/qoega)). +* Automated check for leftovers of conflict markers in docs. [#18332](https://github.com/ClickHouse/ClickHouse/pull/18332) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable Thread Fuzzer for stateless tests flaky check. [#18299](https://github.com/ClickHouse/ClickHouse/pull/18299) ([alesapin](https://github.com/alesapin)). +* Do not use non thread-safe function `strerror`. [#18204](https://github.com/ClickHouse/ClickHouse/pull/18204) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Update `anchore/scan-action@main` workflow action (was moved from `master` to `main`). [#18192](https://github.com/ClickHouse/ClickHouse/pull/18192) ([Stig Bakken](https://github.com/stigsb)). +* Now `clickhouse-test` does DROP/CREATE databases with a timeout. [#18098](https://github.com/ClickHouse/ClickHouse/pull/18098) ([alesapin](https://github.com/alesapin)). +* Enable experimental support for Pytest framework for stateless tests. [#17902](https://github.com/ClickHouse/ClickHouse/pull/17902) ([Ivan](https://github.com/abyss7)). +* Now we use the fresh docker daemon version in integration tests. [#17671](https://github.com/ClickHouse/ClickHouse/pull/17671) ([alesapin](https://github.com/alesapin)). +* Send info about official build, memory, cpu and free disk space to Sentry if it is enabled. Sentry is opt-in feature to help ClickHouse developers. This closes [#17279](https://github.com/ClickHouse/ClickHouse/issues/17279). [#17543](https://github.com/ClickHouse/ClickHouse/pull/17543) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* There was an uninitialized variable in the code of clickhouse-copier. [#17363](https://github.com/ClickHouse/ClickHouse/pull/17363) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix [one MSan report](https://clickhouse-test-reports.s3.yandex.net/17309/065cd002578f2e8228f12a2744bd40c970065e0c/stress_test_(memory)/stderr.log) from [#17309](https://github.com/ClickHouse/ClickHouse/issues/17309). [#17344](https://github.com/ClickHouse/ClickHouse/pull/17344) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix for the issue with IPv6 in Arrow Flight library. See [the comments](https://github.com/ClickHouse/ClickHouse/pull/16243#issuecomment-720830294) for details. [#16664](https://github.com/ClickHouse/ClickHouse/pull/16664) ([Zhanna](https://github.com/FawnD2)). +* Add a library that replaces some `libc` functions to traps that will terminate the process. [#16366](https://github.com/ClickHouse/ClickHouse/pull/16366) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Provide diagnostics in server logs in case of stack overflow, send error message to clickhouse-client. This closes [#14840](https://github.com/ClickHouse/ClickHouse/issues/14840). [#16346](https://github.com/ClickHouse/ClickHouse/pull/16346) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Now we can run almost all stateless functional tests in parallel. [#15236](https://github.com/ClickHouse/ClickHouse/pull/15236) ([alesapin](https://github.com/alesapin)). +* Fix corruption in `librdkafka` snappy decompression (was a problem only for gcc10 builds, but official builds uses clang already, so at least recent official releases are not affected). [#18053](https://github.com/ClickHouse/ClickHouse/pull/18053) ([Azat Khuzhin](https://github.com/azat)). +* If server was terminated by OOM killer, print message in log. [#13516](https://github.com/ClickHouse/ClickHouse/pull/13516) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* PODArray: Avoid call to memcpy with (nullptr, 0) arguments (Fix UBSan report). This fixes [#18525](https://github.com/ClickHouse/ClickHouse/issues/18525). [#18526](https://github.com/ClickHouse/ClickHouse/pull/18526) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor improvement for path concatenation of zookeeper paths inside DDLWorker. [#17767](https://github.com/ClickHouse/ClickHouse/pull/17767) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow to reload symbols from debug file. This PR also fixes a build-id issue. [#17637](https://github.com/ClickHouse/ClickHouse/pull/17637) ([Amos Bird](https://github.com/amosbird)). + + +## [Changelog for 2020](./2020.md) diff --git a/docs/ja/whats-new/changelog/2022.md b/docs/ja/whats-new/changelog/2022.md new file mode 100644 index 00000000000..d152d23616b --- /dev/null +++ b/docs/ja/whats-new/changelog/2022.md @@ -0,0 +1,1837 @@ +--- +slug: /ja/whats-new/changelog/2022 +sidebar_position: 9 +sidebar_label: 2022 +title: 2022 Changelog +--- + +### ClickHouse release 22.12, 2022-12-15 + +:::warning + +This release contains a faulty systemd service comment that might break the ClickHouse installation on upgrade for some Linux distributions. The systemd service changes the directory owner permissions on `/run/systemd`, causing all subsequent systemd operations to fail. It is advised that you skip upgrading to this version and instead upgrade to a newer version of ClickHouse. + +Refer to this issue on GitHub for more details: https://github.com/ClickHouse/ClickHouse/issues/48285 + +::: + +#### Upgrade Notes +* Fixed backward incompatibility in (de)serialization of states of `min`, `max`, `any*`, `argMin`, `argMax` aggregate functions with `String` argument. The incompatibility affects 22.9, 22.10 and 22.11 branches (fixed since 22.9.6, 22.10.4 and 22.11.2 correspondingly). Some minor releases of 22.3, 22.7 and 22.8 branches are also affected: 22.3.13...22.3.14 (fixed since 22.3.15), 22.8.6...22.8.9 (fixed since 22.8.10), 22.7.6 and newer (will not be fixed in 22.7, we recommend upgrading from 22.7.* to 22.8.10 or newer). This release note does not concern users that have never used affected versions. Incompatible versions append an extra `'\0'` to strings when reading states of the aggregate functions mentioned above. For example, if an older version saved state of `anyState('foobar')` to `state_column` then the incompatible version will print `'foobar\0'` on `anyMerge(state_column)`. Also incompatible versions write states of the aggregate functions without trailing `'\0'`. Newer versions (that have the fix) can correctly read data written by all versions including incompatible versions, except one corner case. If an incompatible version saved a state with a string that actually ends with null character, then newer version will trim trailing `'\0'` when reading state of affected aggregate function. For example, if an incompatible version saved state of `anyState('abrac\0dabra\0')` to `state_column` then newer versions will print `'abrac\0dabra'` on `anyMerge(state_column)`. The issue also affects distributed queries when an incompatible version works in a cluster together with older or newer versions. [#43038](https://github.com/ClickHouse/ClickHouse/pull/43038) ([Alexander Tokmakov](https://github.com/tavplubix), [Raúl Marín](https://github.com/Algunenano)). Note: all the official ClickHouse builds already include the patches. This is not necessarily true for unofficial third-party builds that should be avoided. + +#### New Feature +* Add `BSONEachRow` input/output format. In this format, ClickHouse formats/parses each row as a separate BSON document and each column is formatted/parsed as a single BSON field with the column name as the key. [#42033](https://github.com/ClickHouse/ClickHouse/pull/42033) ([mark-polokhov](https://github.com/mark-polokhov)). +* Add `grace_hash` JOIN algorithm, it can be enabled with `SET join_algorithm = 'grace_hash'`. [#38191](https://github.com/ClickHouse/ClickHouse/pull/38191) ([BigRedEye](https://github.com/BigRedEye), [Vladimir C](https://github.com/vdimir)). +* Allow configuring password complexity rules and checks for creating and changing users. [#43719](https://github.com/ClickHouse/ClickHouse/pull/43719) ([Nikolay Degterinsky](https://github.com/evillique)). +* Mask sensitive information in logs; mask secret parts in the output of queries `SHOW CREATE TABLE` and `SELECT FROM system.tables`. Also resolves [#41418](https://github.com/ClickHouse/ClickHouse/issues/41418). [#43227](https://github.com/ClickHouse/ClickHouse/pull/43227) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add `GROUP BY ALL` syntax: [#37631](https://github.com/ClickHouse/ClickHouse/issues/37631). [#42265](https://github.com/ClickHouse/ClickHouse/pull/42265) ([刘陶峰](https://github.com/taofengliu)). +* Add `FROM table SELECT column` syntax. [#41095](https://github.com/ClickHouse/ClickHouse/pull/41095) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added function `concatWithSeparator` and `concat_ws` as an alias for Spark SQL compatibility. A function `concatWithSeparatorAssumeInjective` added as a variant to enable GROUP BY optimization, similarly to `concatAssumeInjective`. [#43749](https://github.com/ClickHouse/ClickHouse/pull/43749) ([李扬](https://github.com/taiyang-li)). +* Added `multiplyDecimal` and `divideDecimal` functions for decimal operations with fixed precision. [#42438](https://github.com/ClickHouse/ClickHouse/pull/42438) ([Andrey Zvonov](https://github.com/zvonand)). +* Added `system.moves` table with list of currently moving parts. [#42660](https://github.com/ClickHouse/ClickHouse/pull/42660) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for embedded Prometheus endpoint for ClickHouse Keeper. [#43087](https://github.com/ClickHouse/ClickHouse/pull/43087) ([Antonio Andelic](https://github.com/antonio2368)). +* Support numeric literals with `_` as the separator, for example, `1_000_000`. [#43925](https://github.com/ClickHouse/ClickHouse/pull/43925) ([jh0x](https://github.com/jh0x)). +* Added possibility to use an array as a second parameter for `cutURLParameter` function. It will cut multiple parameters. Close [#6827](https://github.com/ClickHouse/ClickHouse/issues/6827). [#43788](https://github.com/ClickHouse/ClickHouse/pull/43788) ([Roman Vasin](https://github.com/rvasin)). +* Add a column with the expression of the index in the `system.data_skipping_indices` table. [#43308](https://github.com/ClickHouse/ClickHouse/pull/43308) ([Guillaume Tassery](https://github.com/YiuRULE)). +* Add column `engine_full` to system table `databases` so that users can access the entire engine definition of a database via system tables. [#43468](https://github.com/ClickHouse/ClickHouse/pull/43468) ([凌涛](https://github.com/lingtaolf)). +* New hash function [xxh3](https://github.com/Cyan4973/xxHash) added. Also, the performance of `xxHash32` and `xxHash64` are improved on ARM thanks to a library update. [#43411](https://github.com/ClickHouse/ClickHouse/pull/43411) ([Nikita Taranov](https://github.com/nickitat)). +* Added support to define constraints for merge tree settings. For example you can forbid overriding the `storage_policy` by users. [#43903](https://github.com/ClickHouse/ClickHouse/pull/43903) ([Sergei Trifonov](https://github.com/serxa)). +* Add a new setting `input_format_json_read_objects_as_strings` that allows the parsing of nested JSON objects into Strings in all JSON input formats. This setting is disabled by default. [#44052](https://github.com/ClickHouse/ClickHouse/pull/44052) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Experimental Feature +* Support deduplication for asynchronous inserts. Before this change, async inserts did not support deduplication, because multiple small inserts coexisted in one inserted batch. Closes [#38075](https://github.com/ClickHouse/ClickHouse/issues/38075). [#43304](https://github.com/ClickHouse/ClickHouse/pull/43304) ([Han Fei](https://github.com/hanfei1991)). +* Add support for cosine distance for the experimental Annoy (vector similarity search) index. [#42778](https://github.com/ClickHouse/ClickHouse/pull/42778) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add `CREATE / ALTER / DROP NAMED COLLECTION` queries. [#43252](https://github.com/ClickHouse/ClickHouse/pull/43252) ([Kseniia Sumarokova](https://github.com/kssenii)). This feature is under development and the queries are not effective as of version 22.12. This changelog entry is added only to avoid confusion. Restrict default access to named collections to the user defined in config. This requires that `show_named_collections = 1` is set to be able to see them. [#43325](https://github.com/ClickHouse/ClickHouse/pull/43325) ([Kseniia Sumarokova](https://github.com/kssenii)). The `system.named_collections` table is introduced [#43147](https://github.com/ClickHouse/ClickHouse/pull/43147) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Performance Improvement +* Add settings `max_streams_for_merge_tree_reading` and `allow_asynchronous_read_from_io_pool_for_merge_tree`. Setting `max_streams_for_merge_tree_reading` limits the number of reading streams for MergeTree tables. Setting `allow_asynchronous_read_from_io_pool_for_merge_tree` enables a background I/O pool to read from `MergeTree` tables. This may increase performance for I/O bound queries if used together with `max_streams_to_max_threads_ratio` or `max_streams_for_merge_tree_reading`. [#43260](https://github.com/ClickHouse/ClickHouse/pull/43260) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). This improves performance up to 100 times in case of high latency storage, low number of CPU and high number of data parts. +* Settings `merge_tree_min_rows_for_concurrent_read_for_remote_filesystem/merge_tree_min_bytes_for_concurrent_read_for_remote_filesystem` did not respect adaptive granularity. Fat rows did not decrease the number of read rows (as it was done for `merge_tree_min_rows_for_concurrent_read/merge_tree_min_bytes_for_concurrent_read`, which could lead to high memory usage when using remote filesystems. [#43965](https://github.com/ClickHouse/ClickHouse/pull/43965) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Optimized the number of list requests to ZooKeeper or ClickHouse Keeper when selecting a part to merge. Previously it could produce thousands of requests in some cases. Fixes [#43647](https://github.com/ClickHouse/ClickHouse/issues/43647). [#43675](https://github.com/ClickHouse/ClickHouse/pull/43675) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Optimization is getting skipped now if `max_size_to_preallocate_for_aggregation` has too small a value. The default value of this setting increased to `10^8`. [#43945](https://github.com/ClickHouse/ClickHouse/pull/43945) ([Nikita Taranov](https://github.com/nickitat)). +* Speed-up server shutdown by avoiding cleaning up of old data parts. Because it is unnecessary after https://github.com/ClickHouse/ClickHouse/pull/41145. [#43760](https://github.com/ClickHouse/ClickHouse/pull/43760) ([Sema Checherinda](https://github.com/CheSema)). +* Merging on initiator now uses the same memory bound approach as merging of local aggregation results if `enable_memory_bound_merging_of_aggregation_results` is set. [#40879](https://github.com/ClickHouse/ClickHouse/pull/40879) ([Nikita Taranov](https://github.com/nickitat)). +* Keeper improvement: try syncing logs to disk in parallel with replication. [#43450](https://github.com/ClickHouse/ClickHouse/pull/43450) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper improvement: requests are batched more often. The batching can be controlled with the new setting `max_requests_quick_batch_size`. [#43686](https://github.com/ClickHouse/ClickHouse/pull/43686) ([Antonio Andelic](https://github.com/antonio2368)). + +#### Improvement +* Implement referential dependencies and use them to create tables in the correct order while restoring from a backup. [#43834](https://github.com/ClickHouse/ClickHouse/pull/43834) ([Vitaly Baranov](https://github.com/vitlibar)). +* Substitute UDFs in `CREATE` query to avoid failures during loading at startup. Additionally, UDFs can now be used as `DEFAULT` expressions for columns. [#43539](https://github.com/ClickHouse/ClickHouse/pull/43539) ([Antonio Andelic](https://github.com/antonio2368)). +* Change how the following queries delete parts: TRUNCATE TABLE, ALTER TABLE DROP PART, ALTER TABLE DROP PARTITION. Now, these queries make empty parts which cover the old parts. This makes the TRUNCATE query work without a followedexclusive lock which means concurrent reads aren't locked. Also achieved durability in all those queries. If the request succeeds, then no resurrected parts appear later. Note that atomicity is achieved only with transaction scope. [#41145](https://github.com/ClickHouse/ClickHouse/pull/41145) ([Sema Checherinda](https://github.com/CheSema)). +* `SET param_x` query no longer requires manual string serialization for the value of the parameter. For example, query `SET param_a = '[\'a\', \'b\']'` can now be written like `SET param_a = ['a', 'b']`. [#41874](https://github.com/ClickHouse/ClickHouse/pull/41874) ([Nikolay Degterinsky](https://github.com/evillique)). +* Show read rows in the progress indication while reading from STDIN from client. Closes [#43423](https://github.com/ClickHouse/ClickHouse/issues/43423). [#43442](https://github.com/ClickHouse/ClickHouse/pull/43442) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Show progress bar while reading from s3 table function / engine. [#43454](https://github.com/ClickHouse/ClickHouse/pull/43454) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Progress bar will show both read and written rows. [#43496](https://github.com/ClickHouse/ClickHouse/pull/43496) ([Ilya Yatsishin](https://github.com/qoega)). +* `filesystemAvailable` and related functions support one optional argument with disk name, and change `filesystemFree` to `filesystemUnreserved`. Closes [#35076](https://github.com/ClickHouse/ClickHouse/issues/35076). [#42064](https://github.com/ClickHouse/ClickHouse/pull/42064) ([flynn](https://github.com/ucasfl)). +* Integration with LDAP: increased the default value of search_limit to 256, and added LDAP server config option to change that to an arbitrary value. Closes: [#42276](https://github.com/ClickHouse/ClickHouse/issues/42276). [#42461](https://github.com/ClickHouse/ClickHouse/pull/42461) ([Vasily Nemkov](https://github.com/Enmk)). +* Allow the removal of sensitive information (see the `query_masking_rules` in the configuration file) from the exception messages as well. Resolves [#41418](https://github.com/ClickHouse/ClickHouse/issues/41418). [#42940](https://github.com/ClickHouse/ClickHouse/pull/42940) ([filimonov](https://github.com/filimonov)). +* Support queries like `SHOW FULL TABLES ...` for MySQL compatibility. [#43910](https://github.com/ClickHouse/ClickHouse/pull/43910) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Keeper improvement: Add 4lw command `rqld` which can manually assign a node as leader. [#43026](https://github.com/ClickHouse/ClickHouse/pull/43026) ([JackyWoo](https://github.com/JackyWoo)). +* Apply connection timeout settings for Distributed async INSERT from the query. [#43156](https://github.com/ClickHouse/ClickHouse/pull/43156) ([Azat Khuzhin](https://github.com/azat)). +* The `unhex` function now supports `FixedString` arguments. [issue42369](https://github.com/ClickHouse/ClickHouse/issues/42369). [#43207](https://github.com/ClickHouse/ClickHouse/pull/43207) ([DR](https://github.com/freedomDR)). +* Priority is given to deleting completely expired parts according to the TTL rules, see [#42869](https://github.com/ClickHouse/ClickHouse/issues/42869). [#43222](https://github.com/ClickHouse/ClickHouse/pull/43222) ([zhongyuankai](https://github.com/zhongyuankai)). +* More precise and reactive CPU load indication in clickhouse-client. [#43307](https://github.com/ClickHouse/ClickHouse/pull/43307) ([Sergei Trifonov](https://github.com/serxa)). +* Support reading of subcolumns of nested types from storage `S3` and table function `s3` with formats `Parquet`, `Arrow` and `ORC`. [#43329](https://github.com/ClickHouse/ClickHouse/pull/43329) ([chen](https://github.com/xiedeyantu)). +* Add `table_uuid` column to the `system.parts` table. [#43404](https://github.com/ClickHouse/ClickHouse/pull/43404) ([Azat Khuzhin](https://github.com/azat)). +* Added client option to display the number of locally processed rows in non-interactive mode (`--print-num-processed-rows`). [#43407](https://github.com/ClickHouse/ClickHouse/pull/43407) ([jh0x](https://github.com/jh0x)). +* Implement `aggregation-in-order` optimization on top of a query plan. It is enabled by default (but works only together with `optimize_aggregation_in_order`, which is disabled by default). Set `query_plan_aggregation_in_order = 0` to use the previous AST-based version. [#43592](https://github.com/ClickHouse/ClickHouse/pull/43592) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Allow to collect profile events with `trace_type = 'ProfileEvent'` to `system.trace_log` on each increment with current stack, profile event name and value of the increment. It can be enabled by the setting `trace_profile_events` and used to investigate performance of queries. [#43639](https://github.com/ClickHouse/ClickHouse/pull/43639) ([Anton Popov](https://github.com/CurtizJ)). +* Add a new setting `input_format_max_binary_string_size` to limit string size in RowBinary format. [#43842](https://github.com/ClickHouse/ClickHouse/pull/43842) ([Kruglov Pavel](https://github.com/Avogar)). +* When ClickHouse requests a remote HTTP server, and it returns an error, the numeric HTTP code was not displayed correctly in the exception message. Closes [#43919](https://github.com/ClickHouse/ClickHouse/issues/43919). [#43920](https://github.com/ClickHouse/ClickHouse/pull/43920) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Correctly report errors in queries even when multiple JOINs optimization is taking place. [#43583](https://github.com/ClickHouse/ClickHouse/pull/43583) ([Salvatore](https://github.com/tbsal)). + +#### Build/Testing/Packaging Improvement + +* Systemd integration now correctly notifies systemd that the service is really started and is ready to serve requests. [#43400](https://github.com/ClickHouse/ClickHouse/pull/43400) ([Коренберг Марк](https://github.com/socketpair)). +* Added the option to build ClickHouse with OpenSSL using the [OpenSSL FIPS Module](https://www.openssl.org/docs/man3.0/man7/fips_module.html). This build type has not been tested to validate security and is not supported. [#43991](https://github.com/ClickHouse/ClickHouse/pull/43991) ([Boris Kuschel](https://github.com/bkuschel)). +* Upgrade to the new `DeflateQpl` compression codec which has been implemented in a previous PR (details: https://github.com/ClickHouse/ClickHouse/pull/39494). This patch improves codec on below aspects: 1. QPL v0.2.0 to QPL v0.3.0 [Intel® Query Processing Library (QPL)](https://github.com/intel/qpl) 2. Improve CMake file for fixing QPL build issues for QPL v0.3.0. 3. Link the QPL library with libaccel-config at build time instead of runtime loading on QPL v0.2.0 (dlopen) 4. Fixed log print issue in CompressionCodecDeflateQpl.cpp. [#44024](https://github.com/ClickHouse/ClickHouse/pull/44024) ([jasperzhu](https://github.com/jinjunzh)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Fixed bug which could lead to deadlock while using asynchronous inserts. [#43233](https://github.com/ClickHouse/ClickHouse/pull/43233) ([Anton Popov](https://github.com/CurtizJ)). +* Fix some incorrect logic in AST level optimization `optimize_normalize_count_variants`. [#43873](https://github.com/ClickHouse/ClickHouse/pull/43873) ([Duc Canh Le](https://github.com/canhld94)). +* Fix a case when mutations are not making progress when checksums do not match between replicas (e.g. caused by a change in data format on an upgrade). [#36877](https://github.com/ClickHouse/ClickHouse/pull/36877) ([nvartolomei](https://github.com/nvartolomei)). +* Fix the `skip_unavailable_shards` optimization which did not work with the `hdfsCluster` table function. [#43236](https://github.com/ClickHouse/ClickHouse/pull/43236) ([chen](https://github.com/xiedeyantu)). +* Fix `s3` support for the `?` wildcard. Closes [#42731](https://github.com/ClickHouse/ClickHouse/issues/42731). [#43253](https://github.com/ClickHouse/ClickHouse/pull/43253) ([chen](https://github.com/xiedeyantu)). +* Fix functions `arrayFirstOrNull` and `arrayLastOrNull` or null when the array contains `Nullable` elements. [#43274](https://github.com/ClickHouse/ClickHouse/pull/43274) ([Duc Canh Le](https://github.com/canhld94)). +* Fix incorrect `UserTimeMicroseconds`/`SystemTimeMicroseconds` accounting related to Kafka tables. [#42791](https://github.com/ClickHouse/ClickHouse/pull/42791) ([Azat Khuzhin](https://github.com/azat)). +* Do not suppress exceptions in `web` disks. Fix retries for the `web` disk. [#42800](https://github.com/ClickHouse/ClickHouse/pull/42800) ([Azat Khuzhin](https://github.com/azat)). +* Fixed (logical) race condition between inserts and dropping materialized views. A race condition happened when a Materialized View was dropped at the same time as an INSERT, where the MVs were present as a dependency of the insert at the begining of the execution, but the table has been dropped by the time the insert chain tries to access it, producing either an `UNKNOWN_TABLE` or `TABLE_IS_DROPPED` exception, and stopping the insertion. After this change, we avoid these exceptions and just continue with the insert if the dependency is gone. [#43161](https://github.com/ClickHouse/ClickHouse/pull/43161) ([AlfVII](https://github.com/AlfVII)). +* Fix undefined behavior in the `quantiles` function, which might lead to uninitialized memory. Found by fuzzer. This closes [#44066](https://github.com/ClickHouse/ClickHouse/issues/44066). [#44067](https://github.com/ClickHouse/ClickHouse/pull/44067) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Additional check on zero uncompressed size is added to `CompressionCodecDelta`. [#43255](https://github.com/ClickHouse/ClickHouse/pull/43255) ([Nikita Taranov](https://github.com/nickitat)). +* Flatten arrays from Parquet to avoid an issue with inconsistent data in arrays. These incorrect files can be generated by Apache Iceberg. [#43297](https://github.com/ClickHouse/ClickHouse/pull/43297) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix bad cast from `LowCardinality` column when using short circuit function execution. [#43311](https://github.com/ClickHouse/ClickHouse/pull/43311) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed queries with `SAMPLE BY` with prewhere optimization on tables using `Merge` engine. [#43315](https://github.com/ClickHouse/ClickHouse/pull/43315) ([Antonio Andelic](https://github.com/antonio2368)). +* Check and compare the content of the `format_version` file in `MergeTreeData` so that tables can be loaded even if the storage policy was changed. [#43328](https://github.com/ClickHouse/ClickHouse/pull/43328) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible (very unlikely) "No column to rollback" logical error during INSERT into `Buffer` tables. [#43336](https://github.com/ClickHouse/ClickHouse/pull/43336) ([Azat Khuzhin](https://github.com/azat)). +* Fix a bug that allowed the parser to parse an unlimited amount of round brackets into one function if `allow_function_parameters` is set. [#43350](https://github.com/ClickHouse/ClickHouse/pull/43350) ([Nikolay Degterinsky](https://github.com/evillique)). +* `MaterializeMySQL` (experimental feature) support DDL: `drop table t1, t2` and compatible with most of MySQL DROP DDL. [#43366](https://github.com/ClickHouse/ClickHouse/pull/43366) ([zzsmdfj](https://github.com/zzsmdfj)). +* `session_log` (experimental feature): Fixed the inability to log in (because of failure to create the session_log entry) in a very rare case of messed up setting profiles. [#42641](https://github.com/ClickHouse/ClickHouse/pull/42641) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix possible `Cannot create non-empty column with type Nothing` in functions `if`/`multiIf`. Closes [#43356](https://github.com/ClickHouse/ClickHouse/issues/43356). [#43368](https://github.com/ClickHouse/ClickHouse/pull/43368) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a bug when a row level filter uses the default value of a column. [#43387](https://github.com/ClickHouse/ClickHouse/pull/43387) ([Alexander Gololobov](https://github.com/davenger)). +* Query with `DISTINCT` + `LIMIT BY` + `LIMIT` can return fewer rows than expected. Fixes [#43377](https://github.com/ClickHouse/ClickHouse/issues/43377). [#43410](https://github.com/ClickHouse/ClickHouse/pull/43410) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix `sumMap` for `Nullable(Decimal(...))`. [#43414](https://github.com/ClickHouse/ClickHouse/pull/43414) ([Azat Khuzhin](https://github.com/azat)). +* Fix `date_diff` for hour/minute on macOS. Close [#42742](https://github.com/ClickHouse/ClickHouse/issues/42742). [#43466](https://github.com/ClickHouse/ClickHouse/pull/43466) ([zzsmdfj](https://github.com/zzsmdfj)). +* Fix incorrect memory accounting because of merges/mutations. [#43516](https://github.com/ClickHouse/ClickHouse/pull/43516) ([Azat Khuzhin](https://github.com/azat)). +* Fixed primary key analysis with conditions involving `toString(enum)`. [#43596](https://github.com/ClickHouse/ClickHouse/pull/43596) ([Nikita Taranov](https://github.com/nickitat)). This error has been found by @tisonkun. +* Ensure consistency when `clickhouse-copier` updates status and `attach_is_done` in Keeper after partition attach is done. [#43602](https://github.com/ClickHouse/ClickHouse/pull/43602) ([lzydmxy](https://github.com/lzydmxy)). +* During the recovery of a lost replica of a `Replicated` database (experimental feature), there could a situation where we need to atomically swap two table names (use EXCHANGE). Previously we tried to use two RENAME queries, which was obviously failing and moreover, failed the whole recovery process of the database replica. [#43628](https://github.com/ClickHouse/ClickHouse/pull/43628) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix the case when the `s3Cluster` function throws `NOT_FOUND_COLUMN_IN_BLOCK` error. Closes [#43534](https://github.com/ClickHouse/ClickHouse/issues/43534). [#43629](https://github.com/ClickHouse/ClickHouse/pull/43629) ([chen](https://github.com/xiedeyantu)). +* Fix possible logical error `Array sizes mismatched` while parsing JSON object with arrays with same key names but with different nesting level. Closes [#43569](https://github.com/ClickHouse/ClickHouse/issues/43569). [#43693](https://github.com/ClickHouse/ClickHouse/pull/43693) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed possible exception in the case of distributed `GROUP BY` with an `ALIAS` column among aggregation keys. [#43709](https://github.com/ClickHouse/ClickHouse/pull/43709) ([Nikita Taranov](https://github.com/nickitat)). +* Fix bug which can lead to broken projections if zero-copy replication (experimental feature) is enabled and used. [#43764](https://github.com/ClickHouse/ClickHouse/pull/43764) ([alesapin](https://github.com/alesapin)). +* Fix using multipart upload for very large S3 objects in AWS S3. [#43824](https://github.com/ClickHouse/ClickHouse/pull/43824) ([ianton-ru](https://github.com/ianton-ru)). +* Fixed `ALTER ... RESET SETTING` with `ON CLUSTER`. It could have been applied to one replica only. Fixes [#43843](https://github.com/ClickHouse/ClickHouse/issues/43843). [#43848](https://github.com/ClickHouse/ClickHouse/pull/43848) ([Elena Torró](https://github.com/elenatorro)). +* Fix a logical error in JOIN with `Join` table engine at right hand side, if `USING` is being used. [#43963](https://github.com/ClickHouse/ClickHouse/pull/43963) ([Vladimir C](https://github.com/vdimir)). Fix a bug with wrong order of keys in `Join` table engine. [#44012](https://github.com/ClickHouse/ClickHouse/pull/44012) ([Vladimir C](https://github.com/vdimir)). +* Keeper fix: throw if the interserver port for Raft is already in use. [#43984](https://github.com/ClickHouse/ClickHouse/pull/43984) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix ORDER BY positional argument (example: `ORDER BY 1, 2`) in case of unneeded columns pruning from subqueries. Closes [#43964](https://github.com/ClickHouse/ClickHouse/issues/43964). [#43987](https://github.com/ClickHouse/ClickHouse/pull/43987) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed exception when a subquery contains HAVING but doesn't contain an actual aggregation. [#44051](https://github.com/ClickHouse/ClickHouse/pull/44051) ([Nikita Taranov](https://github.com/nickitat)). +* Fix race in s3 multipart upload. This race could cause the error `Part number must be an integer between 1 and 10000, inclusive. (S3_ERROR)` while restoring from a backup. [#44065](https://github.com/ClickHouse/ClickHouse/pull/44065) ([Vitaly Baranov](https://github.com/vitlibar)). + +### ClickHouse release 22.11, 2022-11-17 + +#### Backward Incompatible Change +* `JSONExtract` family of functions will now attempt to coerce to the requested type. [#41502](https://github.com/ClickHouse/ClickHouse/pull/41502) ([Márcio Martins](https://github.com/marcioapm)). + +#### New Feature +* Adds support for retries during INSERTs into ReplicatedMergeTree when a session with ClickHouse Keeper is lost. Apart from fault tolerance, it aims to provide better user experience, - avoid returning a user an error during insert if keeper is restarted (for example, due to upgrade). [#42607](https://github.com/ClickHouse/ClickHouse/pull/42607) ([Igor Nikonov](https://github.com/devcrafter)). +* Add `Hudi` and `DeltaLake` table engines, read-only, only for tables on S3. [#41054](https://github.com/ClickHouse/ClickHouse/pull/41054) ([Daniil Rubin](https://github.com/rubin-do), [Kseniia Sumarokova](https://github.com/kssenii)). +* Add table function `hudi` and `deltaLake`. [#43080](https://github.com/ClickHouse/ClickHouse/pull/43080) ([flynn](https://github.com/ucasfl)). +* Support for composite time intervals. 1. Add, subtract and negate operations are now available on Intervals. In the case where the types of Intervals are different, they will be transformed into the Tuple of those types. 2. A tuple of intervals can be added to or subtracted from a Date/DateTime field. 3. Added parsing of Intervals with different types, for example: `INTERVAL '1 HOUR 1 MINUTE 1 SECOND'`. [#42195](https://github.com/ClickHouse/ClickHouse/pull/42195) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added `**` glob support for recursive directory traversal of the filesystem and S3. Resolves [#36316](https://github.com/ClickHouse/ClickHouse/issues/36316). [#42376](https://github.com/ClickHouse/ClickHouse/pull/42376) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Introduce `s3_plain` disk type for write-once-read-many operations. Implement `ATTACH` of `MergeTree` table for `s3_plain` disk. [#42628](https://github.com/ClickHouse/ClickHouse/pull/42628) ([Azat Khuzhin](https://github.com/azat)). +* Added applied row-level policies to `system.query_log`. [#39819](https://github.com/ClickHouse/ClickHouse/pull/39819) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Add four-letter command `csnp` for manually creating snapshots in ClickHouse Keeper. Additionally, `lgif` was added to get Raft information for a specific node (e.g. index of last created snapshot, last committed log index). [#41766](https://github.com/ClickHouse/ClickHouse/pull/41766) ([JackyWoo](https://github.com/JackyWoo)). +* Add function `ascii` like in Apache Spark: https://spark.apache.org/docs/latest/api/sql/#ascii. [#42670](https://github.com/ClickHouse/ClickHouse/pull/42670) ([李扬](https://github.com/taiyang-li)). +* Add function `pmod` which returns non-negative result based on modulo. [#42755](https://github.com/ClickHouse/ClickHouse/pull/42755) ([李扬](https://github.com/taiyang-li)). +* Add function `formatReadableDecimalSize`. [#42774](https://github.com/ClickHouse/ClickHouse/pull/42774) ([Alejandro](https://github.com/alexon1234)). +* Add function `randCanonical`, which is similar to the `rand` function in Apache Spark or Impala. The function generates pseudo random results with independent and identically distributed uniformly distributed values in [0, 1). [#43124](https://github.com/ClickHouse/ClickHouse/pull/43124) ([李扬](https://github.com/taiyang-li)). +* Add function `displayName`, closes [#36770](https://github.com/ClickHouse/ClickHouse/issues/36770). [#37681](https://github.com/ClickHouse/ClickHouse/pull/37681) ([hongbin](https://github.com/xlwh)). +* Add `min_age_to_force_merge_on_partition_only` setting to optimize old parts for the entire partition only. [#42659](https://github.com/ClickHouse/ClickHouse/pull/42659) ([Antonio Andelic](https://github.com/antonio2368)). +* Add generic implementation for arbitrary structured named collections, access type and `system.named_collections`. [#43147](https://github.com/ClickHouse/ClickHouse/pull/43147) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Performance Improvement +* `match` function can use the index if it's a condition on string prefix. This closes [#37333](https://github.com/ClickHouse/ClickHouse/issues/37333). [#42458](https://github.com/ClickHouse/ClickHouse/pull/42458) ([clarkcaoliu](https://github.com/Clark0)). +* Speed up AND and OR operators when they are sequenced. [#42214](https://github.com/ClickHouse/ClickHouse/pull/42214) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Support parallel parsing for `LineAsString` input format. This improves performance just slightly. This closes [#42502](https://github.com/ClickHouse/ClickHouse/issues/42502). [#42780](https://github.com/ClickHouse/ClickHouse/pull/42780) ([Kruglov Pavel](https://github.com/Avogar)). +* ClickHouse Keeper performance improvement: improve commit performance for cases when many different nodes have uncommitted states. This should help with cases when a follower node can't sync fast enough. [#42926](https://github.com/ClickHouse/ClickHouse/pull/42926) ([Antonio Andelic](https://github.com/antonio2368)). +* A condition like `NOT LIKE 'prefix%'` can use the primary index. [#42209](https://github.com/ClickHouse/ClickHouse/pull/42209) ([Duc Canh Le](https://github.com/canhld94)). + +#### Experimental Feature +* Support type `Object` inside other types, e.g. `Array(JSON)`. [#36969](https://github.com/ClickHouse/ClickHouse/pull/36969) ([Anton Popov](https://github.com/CurtizJ)). +* Ignore MySQL binlog SAVEPOINT event for MaterializedMySQL. [#42931](https://github.com/ClickHouse/ClickHouse/pull/42931) ([zzsmdfj](https://github.com/zzsmdfj)). Handle (ignore) SAVEPOINT queries in MaterializedMySQL. [#43086](https://github.com/ClickHouse/ClickHouse/pull/43086) ([Stig Bakken](https://github.com/stigsb)). + +#### Improvement +* Trivial queries with small LIMIT will properly determine the number of estimated rows to read, so that the threshold will be checked properly. Closes [#7071](https://github.com/ClickHouse/ClickHouse/issues/7071). [#42580](https://github.com/ClickHouse/ClickHouse/pull/42580) ([Han Fei](https://github.com/hanfei1991)). +* Add support for interactive parameters in INSERT VALUES queries. [#43077](https://github.com/ClickHouse/ClickHouse/pull/43077) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added new field `allow_readonly` in `system.table_functions` to allow using table functions in readonly mode. Resolves [#42414](https://github.com/ClickHouse/ClickHouse/issues/42414) Implementation: * Added a new field allow_readonly to table system.table_functions. * Updated to use new field allow_readonly to allow using table functions in readonly mode. Testing: * Added a test for filesystem tests/queries/0_stateless/02473_functions_in_readonly_mode.sh Documentation: * Updated the english documentation for Table Functions. [#42708](https://github.com/ClickHouse/ClickHouse/pull/42708) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* The `system.asynchronous_metrics` gets embedded documentation. This documentation is also exported to Prometheus. Fixed an error with the metrics about `cache` disks - they were calculated only for one arbitrary cache disk instead all of them. This closes [#7644](https://github.com/ClickHouse/ClickHouse/issues/7644). [#43194](https://github.com/ClickHouse/ClickHouse/pull/43194) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Throttling algorithm changed to token bucket. [#42665](https://github.com/ClickHouse/ClickHouse/pull/42665) ([Sergei Trifonov](https://github.com/serxa)). +* Mask passwords and secret keys both in `system.query_log` and `/var/log/clickhouse-server/*.log` and also in error messages. [#42484](https://github.com/ClickHouse/ClickHouse/pull/42484) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove covered parts for fetched part (to avoid possible replication delay grows). [#39737](https://github.com/ClickHouse/ClickHouse/pull/39737) ([Azat Khuzhin](https://github.com/azat)). +* If `/dev/tty` is available, the progress in clickhouse-client and clickhouse-local will be rendered directly to the terminal, without writing to STDERR. It allows getting progress even if STDERR is redirected to a file, and the file will not be polluted by terminal escape sequences. The progress can be disabled by `--progress false`. This closes [#32238](https://github.com/ClickHouse/ClickHouse/issues/32238). [#42003](https://github.com/ClickHouse/ClickHouse/pull/42003) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add support for `FixedString` input to base64 coding functions. [#42285](https://github.com/ClickHouse/ClickHouse/pull/42285) ([ltrk2](https://github.com/ltrk2)). +* Add columns `bytes_on_disk` and `path` to `system.detached_parts`. Closes [#42264](https://github.com/ClickHouse/ClickHouse/issues/42264). [#42303](https://github.com/ClickHouse/ClickHouse/pull/42303) ([chen](https://github.com/xiedeyantu)). +* Improve using structure from insertion table in table functions, now setting `use_structure_from_insertion_table_in_table_functions` has new possible value - `2` that means that ClickHouse will try to determine if we can use structure from insertion table or not automatically. Closes [#40028](https://github.com/ClickHouse/ClickHouse/issues/40028). [#42320](https://github.com/ClickHouse/ClickHouse/pull/42320) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix no progress indication on INSERT FROM INFILE. Closes [#42548](https://github.com/ClickHouse/ClickHouse/issues/42548). [#42634](https://github.com/ClickHouse/ClickHouse/pull/42634) ([chen](https://github.com/xiedeyantu)). +* Refactor function `tokens` to enable max tokens returned for related functions (disabled by default). [#42673](https://github.com/ClickHouse/ClickHouse/pull/42673) ([李扬](https://github.com/taiyang-li)). +* Allow to use `Date32` arguments for `formatDateTime` and `FROM_UNIXTIME` functions. [#42737](https://github.com/ClickHouse/ClickHouse/pull/42737) ([Roman Vasin](https://github.com/rvasin)). +* Update tzdata to 2022f. Mexico will no longer observe DST except near the US border: https://www.timeanddate.com/news/time/mexico-abolishes-dst-2022.html. Chihuahua moves to year-round UTC-6 on 2022-10-30. Fiji no longer observes DST. See https://github.com/google/cctz/pull/235 and https://bugs.launchpad.net/ubuntu/+source/tzdata/+bug/1995209. [#42796](https://github.com/ClickHouse/ClickHouse/pull/42796) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `FailedAsyncInsertQuery` event metric for async inserts. [#42814](https://github.com/ClickHouse/ClickHouse/pull/42814) ([Krzysztof Góralski](https://github.com/kgoralski)). +* Implement `read-in-order` optimization on top of query plan. It is enabled by default. Set `query_plan_read_in_order = 0` to use previous AST-based version. [#42829](https://github.com/ClickHouse/ClickHouse/pull/42829) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Increase the size of upload part exponentially for backup to S3 to avoid errors about max 10 000 parts limit of the multipart upload to s3. [#42833](https://github.com/ClickHouse/ClickHouse/pull/42833) ([Vitaly Baranov](https://github.com/vitlibar)). +* When the merge task is continuously busy and the disk space is insufficient, the completely expired parts cannot be selected and dropped, resulting in insufficient disk space. My idea is that when the entire Part expires, there is no need for additional disk space to guarantee, ensure the normal execution of TTL. [#42869](https://github.com/ClickHouse/ClickHouse/pull/42869) ([zhongyuankai](https://github.com/zhongyuankai)). +* Add `oss` function and `OSS` table engine (this is convenient for users). oss is fully compatible with s3. [#43155](https://github.com/ClickHouse/ClickHouse/pull/43155) ([zzsmdfj](https://github.com/zzsmdfj)). +* Improve error reporting in the collection of OS-related info for the `system.asynchronous_metrics` table. [#43192](https://github.com/ClickHouse/ClickHouse/pull/43192) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Modify the `INFORMATION_SCHEMA` tables in a way so that ClickHouse can connect to itself using the MySQL compatibility protocol. Add columns instead of aliases (related to [#9769](https://github.com/ClickHouse/ClickHouse/issues/9769)). It will improve the compatibility with various MySQL clients. [#43198](https://github.com/ClickHouse/ClickHouse/pull/43198) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Add some functions for compatibility with PowerBI, when it connects using MySQL protocol [#42612](https://github.com/ClickHouse/ClickHouse/pull/42612) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Better usability for Dashboard on changes [#42872](https://github.com/ClickHouse/ClickHouse/pull/42872) ([Vladimir C](https://github.com/vdimir)). + +#### Build/Testing/Packaging Improvement +* Run SQLancer for each pull request and commit to master. [SQLancer](https://github.com/sqlancer/sqlancer) is an OpenSource fuzzer that focuses on automatic detection of logical bugs. [#42397](https://github.com/ClickHouse/ClickHouse/pull/42397) ([Ilya Yatsishin](https://github.com/qoega)). +* Update to latest zlib-ng. [#42463](https://github.com/ClickHouse/ClickHouse/pull/42463) ([Boris Kuschel](https://github.com/bkuschel)). +* Add support for testing ClickHouse server with Jepsen. By the way, we already have support for testing ClickHouse Keeper with Jepsen. This pull request extends it to Replicated tables. [#42619](https://github.com/ClickHouse/ClickHouse/pull/42619) ([Antonio Andelic](https://github.com/antonio2368)). +* Use https://github.com/matus-chochlik/ctcache for clang-tidy results caching. [#42913](https://github.com/ClickHouse/ClickHouse/pull/42913) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Before the fix, the user-defined config was preserved by RPM in `$file.rpmsave`. The PR fixes it and won't replace the user's files from packages. [#42936](https://github.com/ClickHouse/ClickHouse/pull/42936) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove some libraries from Ubuntu Docker image. [#42622](https://github.com/ClickHouse/ClickHouse/pull/42622) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Updated normaliser to clone the alias ast. Resolves [#42452](https://github.com/ClickHouse/ClickHouse/issues/42452) Implementation: * Updated QueryNormalizer to clone alias ast, when its replaced. Previously just assigning the same leads to exception in LogicalExpressinsOptimizer as it would be the same parent being inserted again. * This bug is not seen with new analyser (allow_experimental_analyzer), so no changes for it. I added a test for the same. [#42827](https://github.com/ClickHouse/ClickHouse/pull/42827) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix race for backup of tables in `Lazy` databases. [#43104](https://github.com/ClickHouse/ClickHouse/pull/43104) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix for `skip_unavailable_shards`: it did not work with the `s3Cluster` table function. [#43131](https://github.com/ClickHouse/ClickHouse/pull/43131) ([chen](https://github.com/xiedeyantu)). +* Fix schema inference in `s3Cluster` and improvement in `hdfsCluster`. [#41979](https://github.com/ClickHouse/ClickHouse/pull/41979) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix retries while reading from URL table engines / table function. (retriable errors could be retries more times than needed, non-retriable errors resulted in failed assertion in code). [#42224](https://github.com/ClickHouse/ClickHouse/pull/42224) ([Kseniia Sumarokova](https://github.com/kssenii)). +* A segmentation fault related to DNS & c-ares has been reported and fixed. [#42234](https://github.com/ClickHouse/ClickHouse/pull/42234) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix `LOGICAL_ERROR` `Arguments of 'plus' have incorrect data types` which may happen in PK analysis (monotonicity check). Fix invalid PK analysis for monotonic binary functions with first constant argument. [#42410](https://github.com/ClickHouse/ClickHouse/pull/42410) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix incorrect key analysis when key types cannot be inside Nullable. This fixes [#42456](https://github.com/ClickHouse/ClickHouse/issues/42456). [#42469](https://github.com/ClickHouse/ClickHouse/pull/42469) ([Amos Bird](https://github.com/amosbird)). +* Fix typo in a setting name that led to bad usage of schema inference cache while using setting `input_format_csv_use_best_effort_in_schema_inference`. Closes [#41735](https://github.com/ClickHouse/ClickHouse/issues/41735). [#42536](https://github.com/ClickHouse/ClickHouse/pull/42536) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix creating a Set with wrong header when data type is LowCardinality. Closes [#42460](https://github.com/ClickHouse/ClickHouse/issues/42460). [#42579](https://github.com/ClickHouse/ClickHouse/pull/42579) ([flynn](https://github.com/ucasfl)). +* `(U)Int128` and `(U)Int256` values were correctly checked in `PREWHERE`. [#42605](https://github.com/ClickHouse/ClickHouse/pull/42605) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix a bug in functions parser that could have led to a segmentation fault. [#42724](https://github.com/ClickHouse/ClickHouse/pull/42724) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix the locking in `truncate table`. [#42728](https://github.com/ClickHouse/ClickHouse/pull/42728) ([flynn](https://github.com/ucasfl)). +* Fix possible crash in `web` disks when file does not exist (or `OPTIMIZE TABLE FINAL`, that also can got the same error eventually). [#42767](https://github.com/ClickHouse/ClickHouse/pull/42767) ([Azat Khuzhin](https://github.com/azat)). +* Fix `auth_type` mapping in `system.session_log`, by including `SSL_CERTIFICATE` for the enum values. [#42782](https://github.com/ClickHouse/ClickHouse/pull/42782) ([Miel Donkers](https://github.com/mdonkers)). +* Fix stack-use-after-return under ASAN build in the Create User query parser. [#42804](https://github.com/ClickHouse/ClickHouse/pull/42804) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix `lowerUTF8`/`upperUTF8` in case of symbol was in between 16-byte boundary (very frequent case of you have strings > 16 bytes long). [#42812](https://github.com/ClickHouse/ClickHouse/pull/42812) ([Azat Khuzhin](https://github.com/azat)). +* Additional bound check was added to LZ4 decompression routine to fix misbehaviour in case of malformed input. [#42868](https://github.com/ClickHouse/ClickHouse/pull/42868) ([Nikita Taranov](https://github.com/nickitat)). +* Fix rare possible hang on query cancellation. [#42874](https://github.com/ClickHouse/ClickHouse/pull/42874) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect behavior with multiple disjuncts in hash join, close [#42832](https://github.com/ClickHouse/ClickHouse/issues/42832). [#42876](https://github.com/ClickHouse/ClickHouse/pull/42876) ([Vladimir C](https://github.com/vdimir)). +* A null pointer will be generated when select if as from ‘three table join’ , For example, this SQL query: [#42883](https://github.com/ClickHouse/ClickHouse/pull/42883) ([zzsmdfj](https://github.com/zzsmdfj)). +* Fix memory sanitizer report in Cluster Discovery, close [#42763](https://github.com/ClickHouse/ClickHouse/issues/42763). [#42905](https://github.com/ClickHouse/ClickHouse/pull/42905) ([Vladimir C](https://github.com/vdimir)). +* Improve DateTime schema inference in case of empty string. [#42911](https://github.com/ClickHouse/ClickHouse/pull/42911) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare NOT_FOUND_COLUMN_IN_BLOCK error when projection is possible to use but there is no projection available. This fixes [#42771](https://github.com/ClickHouse/ClickHouse/issues/42771) . The bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/25563. [#42938](https://github.com/ClickHouse/ClickHouse/pull/42938) ([Amos Bird](https://github.com/amosbird)). +* Fix ATTACH TABLE in `PostgreSQL` database engine if the table contains DATETIME data type. Closes [#42817](https://github.com/ClickHouse/ClickHouse/issues/42817). [#42960](https://github.com/ClickHouse/ClickHouse/pull/42960) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix lambda parsing. Closes [#41848](https://github.com/ClickHouse/ClickHouse/issues/41848). [#42979](https://github.com/ClickHouse/ClickHouse/pull/42979) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix incorrect key analysis when nullable keys appear in the middle of a hyperrectangle. This fixes [#43111](https://github.com/ClickHouse/ClickHouse/issues/43111) . [#43133](https://github.com/ClickHouse/ClickHouse/pull/43133) ([Amos Bird](https://github.com/amosbird)). +* Fix several buffer over-reads in deserialization of carefully crafted aggregate function states. [#43159](https://github.com/ClickHouse/ClickHouse/pull/43159) ([Raúl Marín](https://github.com/Algunenano)). +* Fix function `if` in case of NULL and const Nullable arguments. Closes [#43069](https://github.com/ClickHouse/ClickHouse/issues/43069). [#43178](https://github.com/ClickHouse/ClickHouse/pull/43178) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix decimal math overflow in parsing DateTime with the 'best effort' algorithm. Closes [#43061](https://github.com/ClickHouse/ClickHouse/issues/43061). [#43180](https://github.com/ClickHouse/ClickHouse/pull/43180) ([Kruglov Pavel](https://github.com/Avogar)). +* The `indent` field produced by the `git-import` tool was miscalculated. See https://clickhouse.com/docs/ja/getting-started/example-datasets/github/. [#43191](https://github.com/ClickHouse/ClickHouse/pull/43191) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fixed unexpected behaviour of `Interval` types with subquery and casting. [#43193](https://github.com/ClickHouse/ClickHouse/pull/43193) ([jh0x](https://github.com/jh0x)). + +### ClickHouse release 22.10, 2022-10-25 + +#### Backward Incompatible Change +* Rename cache commands: `show caches` -> `show filesystem caches`, `describe cache` -> `describe filesystem cache`. [#41508](https://github.com/ClickHouse/ClickHouse/pull/41508) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove support for the `WITH TIMEOUT` section for `LIVE VIEW`. This closes [#40557](https://github.com/ClickHouse/ClickHouse/issues/40557). [#42173](https://github.com/ClickHouse/ClickHouse/pull/42173) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove support for the `{database}` macro from the client's prompt. It was displayed incorrectly if the database was unspecified and it was not updated on `USE` statements. This closes [#25891](https://github.com/ClickHouse/ClickHouse/issues/25891). [#42508](https://github.com/ClickHouse/ClickHouse/pull/42508) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Composable protocol configuration is added. Now different protocols can be set up with different listen hosts. Protocol wrappers such as PROXYv1 can be set up over any other protocols (TCP, TCP secure, MySQL, Postgres). [#41198](https://github.com/ClickHouse/ClickHouse/pull/41198) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add `S3` as a new type of the destination of backups. Support BACKUP to S3 with as-is path/data structure. [#42333](https://github.com/ClickHouse/ClickHouse/pull/42333) ([Vitaly Baranov](https://github.com/vitlibar)), [#42232](https://github.com/ClickHouse/ClickHouse/pull/42232) ([Azat Khuzhin](https://github.com/azat)). +* Added functions (`randUniform`, `randNormal`, `randLogNormal`, `randExponential`, `randChiSquared`, `randStudentT`, `randFisherF`, `randBernoulli`, `randBinomial`, `randNegativeBinomial`, `randPoisson`) to generate random values according to the specified distributions. This closes [#21834](https://github.com/ClickHouse/ClickHouse/issues/21834). [#42411](https://github.com/ClickHouse/ClickHouse/pull/42411) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* An improvement for ClickHouse Keeper: add support for uploading snapshots to S3. S3 information can be defined inside `keeper_server.s3_snapshot`. [#41342](https://github.com/ClickHouse/ClickHouse/pull/41342) ([Antonio Andelic](https://github.com/antonio2368)). +* Added an aggregate function `analysisOfVariance` (`anova`) to perform a statistical test over several groups of normally distributed observations to find out whether all groups have the same mean or not. Original PR [#37872](https://github.com/ClickHouse/ClickHouse/issues/37872). [#42131](https://github.com/ClickHouse/ClickHouse/pull/42131) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Support limiting of temporary data stored on disk using settings `max_temporary_data_on_disk_size_for_user`/`max_temporary_data_on_disk_size_for_query` . [#40893](https://github.com/ClickHouse/ClickHouse/pull/40893) ([Vladimir C](https://github.com/vdimir)). +* Add setting `format_json_object_each_row_column_for_object_name` to write/parse object name as column value in JSONObjectEachRow format. [#41703](https://github.com/ClickHouse/ClickHouse/pull/41703) ([Kruglov Pavel](https://github.com/Avogar)). +* Add BLAKE3 hash-function to SQL. [#33435](https://github.com/ClickHouse/ClickHouse/pull/33435) ([BoloniniD](https://github.com/BoloniniD)). +* The function `javaHash` has been extended to integers. [#41131](https://github.com/ClickHouse/ClickHouse/pull/41131) ([JackyWoo](https://github.com/JackyWoo)). +* Add OpenTelemetry support to ON CLUSTER DDL (require `distributed_ddl_entry_format_version` to be set to 4). [#41484](https://github.com/ClickHouse/ClickHouse/pull/41484) ([Frank Chen](https://github.com/FrankChen021)). +* Added system table `asynchronous_insert_log`. It contains information about asynchronous inserts (including results of queries in fire-and-forget mode (with `wait_for_async_insert=0`)) for better introspection. [#42040](https://github.com/ClickHouse/ClickHouse/pull/42040) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for methods `lz4`, `bz2`, `snappy` in HTTP's `Accept-Encoding` which is a non-standard extension to HTTP protocol. [#42071](https://github.com/ClickHouse/ClickHouse/pull/42071) ([Nikolay Degterinsky](https://github.com/evillique)). +* Adds Morton Coding (ZCurve) encode/decode functions. [#41753](https://github.com/ClickHouse/ClickHouse/pull/41753) ([Constantine Peresypkin](https://github.com/pkit)). +* Add support for `SET setting_name = DEFAULT`. [#42187](https://github.com/ClickHouse/ClickHouse/pull/42187) ([Filatenkov Artur](https://github.com/FArthur-cmd)). + +#### Experimental Feature +* Added new infrastructure for query analysis and planning under the `allow_experimental_analyzer` setting. [#31796](https://github.com/ClickHouse/ClickHouse/pull/31796) ([Maksim Kita](https://github.com/kitaisreal)). +* Initial implementation of Kusto Query Language. Please don't use it. [#37961](https://github.com/ClickHouse/ClickHouse/pull/37961) ([Yong Wang](https://github.com/kashwy)). + +#### Performance Improvement +* Relax the "Too many parts" threshold. This closes [#6551](https://github.com/ClickHouse/ClickHouse/issues/6551). Now ClickHouse will allow more parts in a partition if the average part size is large enough (at least 10 GiB). This allows to have up to petabytes of data in a single partition of a single table on a single server, which is possible using disk shelves or object storage. [#42002](https://github.com/ClickHouse/ClickHouse/pull/42002) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Implement operator precedence element parser to make the required stack size smaller. [#34892](https://github.com/ClickHouse/ClickHouse/pull/34892) ([Nikolay Degterinsky](https://github.com/evillique)). +* DISTINCT in order optimization leverage sorting properties of data streams. This improvement will enable reading in order for DISTINCT if applicable (before it was necessary to provide ORDER BY for columns in DISTINCT). [#41014](https://github.com/ClickHouse/ClickHouse/pull/41014) ([Igor Nikonov](https://github.com/devcrafter)). +* ColumnVector: optimize UInt8 index with AVX512VBMI. [#41247](https://github.com/ClickHouse/ClickHouse/pull/41247) ([Guo Wangyang](https://github.com/guowangy)). +* Optimize the lock contentions for `ThreadGroupStatus::mutex`. The performance experiments of **SSB** (Star Schema Benchmark) on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) shows that this change could bring a **2.95x** improvement of the geomean of all subcases' QPS. [#41675](https://github.com/ClickHouse/ClickHouse/pull/41675) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Add `ldapr` capabilities to AArch64 builds. This is supported from Graviton 2+, Azure and GCP instances. Only appeared in clang-15 [not so long ago](https://github.com/llvm/llvm-project/commit/9609b5daffe9fd28d83d83da895abc5113f76c24). [#41778](https://github.com/ClickHouse/ClickHouse/pull/41778) ([Daniel Kutenin](https://github.com/danlark1)). +* Improve performance when comparing strings and one argument is an empty constant string. [#41870](https://github.com/ClickHouse/ClickHouse/pull/41870) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize `insertFrom` of ColumnAggregateFunction to share Aggregate State in some cases. [#41960](https://github.com/ClickHouse/ClickHouse/pull/41960) ([flynn](https://github.com/ucasfl)). +* Make writing to `azure_blob_storage` disks faster (respect `max_single_part_upload_size` instead of writing a block per each buffer size). Inefficiency mentioned in [#41754](https://github.com/ClickHouse/ClickHouse/issues/41754). [#42041](https://github.com/ClickHouse/ClickHouse/pull/42041) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make thread ids in the process list and query_log unique to avoid waste. [#42180](https://github.com/ClickHouse/ClickHouse/pull/42180) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support skipping cache completely (both download to cache and reading cached data) in case the requested read range exceeds the threshold defined by cache setting `bypass_cache_threashold`, requires to be enabled with `enable_bypass_cache_with_threshold`). [#42418](https://github.com/ClickHouse/ClickHouse/pull/42418) ([Han Shukai](https://github.com/KinderRiven)). This helps on slow local disks. + +#### Improvement +* Add setting `allow_implicit_no_password`: in combination with `allow_no_password` it forbids creating a user with no password unless `IDENTIFIED WITH no_password` is explicitly specified. [#41341](https://github.com/ClickHouse/ClickHouse/pull/41341) ([Nikolay Degterinsky](https://github.com/evillique)). +* Embedded Keeper will always start in the background allowing ClickHouse to start without achieving quorum. [#40991](https://github.com/ClickHouse/ClickHouse/pull/40991) ([Antonio Andelic](https://github.com/antonio2368)). +* Made reestablishing a new connection to ZooKeeper more reactive in case of expiration of the previous one. Previously there was a task which spawns every minute by default and thus a table could be in readonly state for about this time. [#41092](https://github.com/ClickHouse/ClickHouse/pull/41092) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now projections can be used with zero copy replication (zero-copy replication is a non-production feature). [#41147](https://github.com/ClickHouse/ClickHouse/pull/41147) ([alesapin](https://github.com/alesapin)). +* Support expression `(EXPLAIN SELECT ...)` in a subquery. Queries like `SELECT * FROM (EXPLAIN PIPELINE SELECT col FROM TABLE ORDER BY col)` became valid. [#40630](https://github.com/ClickHouse/ClickHouse/pull/40630) ([Vladimir C](https://github.com/vdimir)). +* Allow changing `async_insert_max_data_size` or `async_insert_busy_timeout_ms` in scope of query. E.g. user wants to insert data rarely and she doesn't have access to the server config to tune default settings. [#40668](https://github.com/ClickHouse/ClickHouse/pull/40668) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Improvements for reading from remote filesystems, made threadpool size for reads/writes configurable. Closes [#41070](https://github.com/ClickHouse/ClickHouse/issues/41070). [#41011](https://github.com/ClickHouse/ClickHouse/pull/41011) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support all combinators combination in WindowTransform/arratReduce*/initializeAggregation/aggregate functions versioning. Previously combinators like `ForEach/Resample/Map` didn't work in these places, using them led to exception like`State function ... inserts results into non-state column`. [#41107](https://github.com/ClickHouse/ClickHouse/pull/41107) ([Kruglov Pavel](https://github.com/Avogar)). +* Add function `tryDecrypt` that returns NULL when decrypt fails (e.g. decrypt with incorrect key) instead of throwing an exception. [#41206](https://github.com/ClickHouse/ClickHouse/pull/41206) ([Duc Canh Le](https://github.com/canhld94)). +* Add the `unreserved_space` column to the `system.disks` table to check how much space is not taken by reservations per disk. [#41254](https://github.com/ClickHouse/ClickHouse/pull/41254) ([filimonov](https://github.com/filimonov)). +* Support s3 authorization headers in table function arguments. [#41261](https://github.com/ClickHouse/ClickHouse/pull/41261) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for MultiRead in Keeper and internal ZooKeeper client (this is an extension to ZooKeeper protocol, only available in ClickHouse Keeper). [#41410](https://github.com/ClickHouse/ClickHouse/pull/41410) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for decimal type comparing with floating point literal in IN operator. [#41544](https://github.com/ClickHouse/ClickHouse/pull/41544) ([liang.huang](https://github.com/lhuang09287750)). +* Allow readable size values (like `1TB`) in cache config. [#41688](https://github.com/ClickHouse/ClickHouse/pull/41688) ([Kseniia Sumarokova](https://github.com/kssenii)). +* ClickHouse could cache stale DNS entries for some period of time (15 seconds by default) until the cache won't be updated asynchronously. During these periods ClickHouse can nevertheless try to establish a connection and produce errors. This behavior is fixed. [#41707](https://github.com/ClickHouse/ClickHouse/pull/41707) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add interactive history search with fzf-like utility (fzf/sk) for `clickhouse-client`/`clickhouse-local` (note you can use `FZF_DEFAULT_OPTS`/`SKIM_DEFAULT_OPTIONS` to additionally configure the behavior). [#41730](https://github.com/ClickHouse/ClickHouse/pull/41730) ([Azat Khuzhin](https://github.com/azat)). +* Only allow clients connecting to a secure server with an invalid certificate only to proceed with the '--accept-certificate' flag. [#41743](https://github.com/ClickHouse/ClickHouse/pull/41743) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add function `tryBase58Decode`, similar to the existing function `tryBase64Decode`. [#41824](https://github.com/ClickHouse/ClickHouse/pull/41824) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve feedback when replacing partition with different primary key. Fixes [#34798](https://github.com/ClickHouse/ClickHouse/issues/34798). [#41838](https://github.com/ClickHouse/ClickHouse/pull/41838) ([Salvatore](https://github.com/tbsal)). +* Fix parallel parsing: segmentator now checks `max_block_size`. This fixed memory overallocation in case of parallel parsing and small LIMIT. [#41852](https://github.com/ClickHouse/ClickHouse/pull/41852) ([Vitaly Baranov](https://github.com/vitlibar)). +* Don't add "TABLE_IS_DROPPED" exception to `system.errors` if it's happened during SELECT from a system table and was ignored. [#41908](https://github.com/ClickHouse/ClickHouse/pull/41908) ([AlfVII](https://github.com/AlfVII)). +* Improve option `enable_extended_results_for_datetime_functions` to return results of type DateTime64 for functions `toStartOfDay`, `toStartOfHour`, `toStartOfFifteenMinutes`, `toStartOfTenMinutes`, `toStartOfFiveMinutes`, `toStartOfMinute` and `timeSlot`. [#41910](https://github.com/ClickHouse/ClickHouse/pull/41910) ([Roman Vasin](https://github.com/rvasin)). +* Improve `DateTime` type inference for text formats. Now it respects setting `date_time_input_format` and doesn't try to infer datetimes from numbers as timestamps. Closes [#41389](https://github.com/ClickHouse/ClickHouse/issues/41389) Closes [#42206](https://github.com/ClickHouse/ClickHouse/issues/42206). [#41912](https://github.com/ClickHouse/ClickHouse/pull/41912) ([Kruglov Pavel](https://github.com/Avogar)). +* Remove confusing warning when inserting with `perform_ttl_move_on_insert` = false. [#41980](https://github.com/ClickHouse/ClickHouse/pull/41980) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow user to write `countState(*)` similar to `count(*)`. This closes [#9338](https://github.com/ClickHouse/ClickHouse/issues/9338). [#41983](https://github.com/ClickHouse/ClickHouse/pull/41983) ([Amos Bird](https://github.com/amosbird)). +* Fix `rankCorr` size overflow. [#42020](https://github.com/ClickHouse/ClickHouse/pull/42020) ([Duc Canh Le](https://github.com/canhld94)). +* Added an option to specify an arbitrary string as an environment name in the Sentry's config for more handy reports. [#42037](https://github.com/ClickHouse/ClickHouse/pull/42037) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix parsing out-of-range Date from CSV. [#42044](https://github.com/ClickHouse/ClickHouse/pull/42044) ([Andrey Zvonov](https://github.com/zvonand)). +* `parseDataTimeBestEffort` now supports comma between date and time. Closes [#42038](https://github.com/ClickHouse/ClickHouse/issues/42038). [#42049](https://github.com/ClickHouse/ClickHouse/pull/42049) ([flynn](https://github.com/ucasfl)). +* Improved stale replica recovery process for `ReplicatedMergeTree`. If a lost replica has some parts which are absent from a healthy replica, but these parts should appear in the future according to the replication queue of the healthy replica, then the lost replica will keep such parts instead of detaching them. [#42134](https://github.com/ClickHouse/ClickHouse/pull/42134) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add a possibility to use `Date32` arguments for date_diff function. Fix issue in date_diff function when using DateTime64 arguments with a start date before Unix epoch and end date after Unix epoch. [#42308](https://github.com/ClickHouse/ClickHouse/pull/42308) ([Roman Vasin](https://github.com/rvasin)). +* When uploading big parts to Minio, 'Complete Multipart Upload' can take a long time. Minio sends heartbeats every 10 seconds (see https://github.com/minio/minio/pull/7198). But clickhouse times out earlier, because the default send/receive timeout is [set](https://github.com/ClickHouse/ClickHouse/blob/cc24fcd6d5dfb67f5f66f5483e986bd1010ad9cf/src/IO/S3/PocoHTTPClient.cpp#L123) to 5 seconds. [#42321](https://github.com/ClickHouse/ClickHouse/pull/42321) ([filimonov](https://github.com/filimonov)). +* Fix rarely invalid cast of aggregate state types with complex types such as Decimal. This fixes [#42408](https://github.com/ClickHouse/ClickHouse/issues/42408). [#42417](https://github.com/ClickHouse/ClickHouse/pull/42417) ([Amos Bird](https://github.com/amosbird)). +* Allow to use `Date32` arguments for `dateName` function. [#42554](https://github.com/ClickHouse/ClickHouse/pull/42554) ([Roman Vasin](https://github.com/rvasin)). +* Now filters with NULL literals will be used during index analysis. [#34063](https://github.com/ClickHouse/ClickHouse/issues/34063). [#41842](https://github.com/ClickHouse/ClickHouse/pull/41842) ([Amos Bird](https://github.com/amosbird)). +* Merge parts if every part in the range is older than a certain threshold. The threshold can be set by using `min_age_to_force_merge_seconds`. This closes [#35836](https://github.com/ClickHouse/ClickHouse/issues/35836). [#42423](https://github.com/ClickHouse/ClickHouse/pull/42423) ([Antonio Andelic](https://github.com/antonio2368)). This is continuation of [#39550i](https://github.com/ClickHouse/ClickHouse/pull/39550) by [@fastio](https://github.com/fastio) who implemented most of the logic. +* Added new infrastructure for query analysis and planning under `allow_experimental_analyzer` setting. [#31796](https://github.com/ClickHouse/ClickHouse/pull/31796) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve the time to recover lost keeper connections. [#42541](https://github.com/ClickHouse/ClickHouse/pull/42541) ([Raúl Marín](https://github.com/Algunenano)). + +#### Build/Testing/Packaging Improvement +* Add fuzzer for table definitions [#40096](https://github.com/ClickHouse/ClickHouse/pull/40096) ([Anton Popov](https://github.com/CurtizJ)). This represents the biggest advancement for ClickHouse testing in this year so far. +* Beta version of the ClickHouse Cloud service is released: [https://clickhouse.cloud/](https://clickhouse.cloud/). It provides the easiest way to use ClickHouse (even slightly easier than the single-command installation). +* Added support of WHERE clause generation to AST Fuzzer and possibility to add or remove ORDER BY and WHERE clause. [#38519](https://github.com/ClickHouse/ClickHouse/pull/38519) ([Ilya Yatsishin](https://github.com/qoega)). +* Aarch64 binaries now require at least ARMv8.2, released in 2016. Most notably, this enables use of ARM LSE, i.e. native atomic operations. Also, CMake build option "NO_ARMV81_OR_HIGHER" has been added to allow compilation of binaries for older ARMv8.0 hardware, e.g. Raspberry Pi 4. [#41610](https://github.com/ClickHouse/ClickHouse/pull/41610) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow building ClickHouse with Musl (small changes after it was already supported but broken). [#41987](https://github.com/ClickHouse/ClickHouse/pull/41987) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add the `$CLICKHOUSE_CRONFILE` file checking to avoid running the `sed` command to get the file not found error on install. [#42081](https://github.com/ClickHouse/ClickHouse/pull/42081) ([Chun-Sheng, Li](https://github.com/peter279k)). +* Update cctz to `2022e` to support the new timezone changes. Palestine transitions are now Saturdays at 02:00. Simplify three Ukraine zones into one. Jordan and Syria switch from +02/+03 with DST to year-round +03. (https://data.iana.org/time-zones/tzdb/NEWS). This closes [#42252](https://github.com/ClickHouse/ClickHouse/issues/42252). [#42327](https://github.com/ClickHouse/ClickHouse/pull/42327) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#42273](https://github.com/ClickHouse/ClickHouse/pull/42273) ([Dom Del Nano](https://github.com/ddelnano)). +* Add Rust code support into ClickHouse with BLAKE3 hash-function library as an example. [#33435](https://github.com/ClickHouse/ClickHouse/pull/33435) ([BoloniniD](https://github.com/BoloniniD)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Choose correct aggregation method for `LowCardinality` with big integer types. [#42342](https://github.com/ClickHouse/ClickHouse/pull/42342) ([Duc Canh Le](https://github.com/canhld94)). +* Several fixes for `web` disk. [#41652](https://github.com/ClickHouse/ClickHouse/pull/41652) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixes an issue that causes docker run to fail if `https_port` is not present in config. [#41693](https://github.com/ClickHouse/ClickHouse/pull/41693) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Mutations were not cancelled properly on server shutdown or `SYSTEM STOP MERGES` query and cancellation might take long time, it's fixed. [#41699](https://github.com/ClickHouse/ClickHouse/pull/41699) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix wrong result of queries with `ORDER BY` or `GROUP BY` by columns from prefix of sorting key, wrapped into monotonic functions, with enable "read in order" optimization (settings `optimize_read_in_order` and `optimize_aggregation_in_order`). [#41701](https://github.com/ClickHouse/ClickHouse/pull/41701) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible crash in `SELECT` from `Merge` table with enabled `optimize_monotonous_functions_in_order_by` setting. Fixes [#41269](https://github.com/ClickHouse/ClickHouse/issues/41269). [#41740](https://github.com/ClickHouse/ClickHouse/pull/41740) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed "Part ... intersects part ..." error that might happen in extremely rare cases if replica was restarted just after detaching some part as broken. [#41741](https://github.com/ClickHouse/ClickHouse/pull/41741) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Don't allow to create or alter merge tree tables with column name `_row_exists`, which is reserved for lightweight delete. Fixed [#41716](https://github.com/ClickHouse/ClickHouse/issues/41716). [#41763](https://github.com/ClickHouse/ClickHouse/pull/41763) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix a bug that CORS headers are missing in some HTTP responses. [#41792](https://github.com/ClickHouse/ClickHouse/pull/41792) ([Frank Chen](https://github.com/FrankChen021)). +* 22.9 might fail to startup `ReplicatedMergeTree` table if that table was created by 20.3 or older version and was never altered, it's fixed. Fixes [#41742](https://github.com/ClickHouse/ClickHouse/issues/41742). [#41796](https://github.com/ClickHouse/ClickHouse/pull/41796) ([Alexander Tokmakov](https://github.com/tavplubix)). +* When the batch sending fails for some reason, it cannot be automatically recovered, and if it is not processed in time, it will lead to accumulation, and the printed error message will become longer and longer, which will cause the http thread to block. [#41813](https://github.com/ClickHouse/ClickHouse/pull/41813) ([zhongyuankai](https://github.com/zhongyuankai)). +* Fix compact parts with compressed marks setting. Fixes [#41783](https://github.com/ClickHouse/ClickHouse/issues/41783) and [#41746](https://github.com/ClickHouse/ClickHouse/issues/41746). [#41823](https://github.com/ClickHouse/ClickHouse/pull/41823) ([alesapin](https://github.com/alesapin)). +* Old versions of Replicated database don't have a special marker in [Zoo]Keeper. We need to check only whether the node contains come obscure data instead of special mark. [#41875](https://github.com/ClickHouse/ClickHouse/pull/41875) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix possible exception in fs cache. [#41884](https://github.com/ClickHouse/ClickHouse/pull/41884) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix `use_environment_credentials` for s3 table function. [#41970](https://github.com/ClickHouse/ClickHouse/pull/41970) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed "Directory already exists and is not empty" error on detaching broken part that might prevent `ReplicatedMergeTree` table from starting replication. Fixes [#40957](https://github.com/ClickHouse/ClickHouse/issues/40957). [#41981](https://github.com/ClickHouse/ClickHouse/pull/41981) ([Alexander Tokmakov](https://github.com/tavplubix)). +* `toDateTime64` now returns the same output with negative integer and float arguments. [#42025](https://github.com/ClickHouse/ClickHouse/pull/42025) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix write into `azure_blob_storage`. Partially closes [#41754](https://github.com/ClickHouse/ClickHouse/issues/41754). [#42034](https://github.com/ClickHouse/ClickHouse/pull/42034) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix the `bzip2` decoding issue for specific `bzip2` files. [#42046](https://github.com/ClickHouse/ClickHouse/pull/42046) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix SQL function `toLastDayOfMonth` with setting "enable_extended_results_for_datetime_functions = 1" at the beginning of the extended range (January 1900). - Fix SQL function "toRelativeWeekNum()" with setting "enable_extended_results_for_datetime_functions = 1" at the end of extended range (December 2299). - Improve the performance of for SQL functions "toISOYear()", "toFirstDayNumOfISOYearIndex()" and "toYearWeekOfNewyearMode()" by avoiding unnecessary index arithmetics. [#42084](https://github.com/ClickHouse/ClickHouse/pull/42084) ([Roman Vasin](https://github.com/rvasin)). +* The maximum size of fetches for each table accidentally was set to 8 while the pool size could be bigger. Now the maximum size of fetches for table is equal to the pool size. [#42090](https://github.com/ClickHouse/ClickHouse/pull/42090) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* A table might be shut down and a dictionary might be detached before checking if can be dropped without breaking dependencies between table, it's fixed. Fixes [#41982](https://github.com/ClickHouse/ClickHouse/issues/41982). [#42106](https://github.com/ClickHouse/ClickHouse/pull/42106) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix bad inefficiency of `remote_filesystem_read_method=read` with filesystem cache. Closes [#42125](https://github.com/ClickHouse/ClickHouse/issues/42125). [#42129](https://github.com/ClickHouse/ClickHouse/pull/42129) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible timeout exception for distributed queries with use_hedged_requests = 0. [#42130](https://github.com/ClickHouse/ClickHouse/pull/42130) ([Azat Khuzhin](https://github.com/azat)). +* Fixed a minor bug inside function `runningDifference` in case of using it with `Date32` type. Previously `Date` was used and it may cause some logical errors like `Bad cast from type DB::ColumnVector to DB::ColumnVector'`. [#42143](https://github.com/ClickHouse/ClickHouse/pull/42143) ([Alfred Xu](https://github.com/sperlingxx)). +* Fix reusing of files > 4GB from base backup. [#42146](https://github.com/ClickHouse/ClickHouse/pull/42146) ([Azat Khuzhin](https://github.com/azat)). +* DISTINCT in order fails with LOGICAL_ERROR if first column in sorting key contains function. [#42186](https://github.com/ClickHouse/ClickHouse/pull/42186) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix a bug with projections and the `aggregate_functions_null_for_empty` setting. This bug is very rare and appears only if you enable the `aggregate_functions_null_for_empty` setting in the server's config. This closes [#41647](https://github.com/ClickHouse/ClickHouse/issues/41647). [#42198](https://github.com/ClickHouse/ClickHouse/pull/42198) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix read from `Buffer` tables with read in order desc. [#42236](https://github.com/ClickHouse/ClickHouse/pull/42236) ([Duc Canh Le](https://github.com/canhld94)). +* Fix a bug which prevents ClickHouse to start when `background_pool_size setting` is set on default profile but `background_merges_mutations_concurrency_ratio` is not. [#42315](https://github.com/ClickHouse/ClickHouse/pull/42315) ([nvartolomei](https://github.com/nvartolomei)). +* `ALTER UPDATE` of attached part (with columns different from table schema) could create an invalid `columns.txt` metadata on disk. Reading from such part could fail with errors or return invalid data. Fixes [#42161](https://github.com/ClickHouse/ClickHouse/issues/42161). [#42319](https://github.com/ClickHouse/ClickHouse/pull/42319) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Setting `additional_table_filters` were not applied to `Distributed` storage. Fixes [#41692](https://github.com/ClickHouse/ClickHouse/issues/41692). [#42322](https://github.com/ClickHouse/ClickHouse/pull/42322) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a data race in query finish/cancel. This closes [#42346](https://github.com/ClickHouse/ClickHouse/issues/42346). [#42362](https://github.com/ClickHouse/ClickHouse/pull/42362) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* This reverts [#40217](https://github.com/ClickHouse/ClickHouse/issues/40217) which introduced a regression in date/time functions. [#42367](https://github.com/ClickHouse/ClickHouse/pull/42367) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix assert cast in join on falsy condition, Close [#42380](https://github.com/ClickHouse/ClickHouse/issues/42380). [#42407](https://github.com/ClickHouse/ClickHouse/pull/42407) ([Vladimir C](https://github.com/vdimir)). +* Fix buffer overflow in the processing of Decimal data types. This closes [#42451](https://github.com/ClickHouse/ClickHouse/issues/42451). [#42465](https://github.com/ClickHouse/ClickHouse/pull/42465) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `AggregateFunctionQuantile` now correctly works with UInt128 columns. Previously, the quantile state interpreted `UInt128` columns as `Int128` which could have led to incorrect results. [#42473](https://github.com/ClickHouse/ClickHouse/pull/42473) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix bad_cast assert during INSERT into `Annoy` indexes over non-Float32 columns. `Annoy` indices is an experimental feature. [#42485](https://github.com/ClickHouse/ClickHouse/pull/42485) ([Robert Schulze](https://github.com/rschu1ze)). +* Arithmetic operator with Date or DateTime and 128 or 256-bit integer was referencing uninitialized memory. [#42453](https://github.com/ClickHouse/ClickHouse/issues/42453). [#42573](https://github.com/ClickHouse/ClickHouse/pull/42573) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix unexpected table loading error when partition key contains alias function names during server upgrade. [#36379](https://github.com/ClickHouse/ClickHouse/pull/36379) ([Amos Bird](https://github.com/amosbird)). + +### ClickHouse release 22.9, 2022-09-22 + +#### Backward Incompatible Change +* Upgrade from 20.3 and older to 22.9 and newer should be done through an intermediate version if there are any `ReplicatedMergeTree` tables, otherwise server with the new version will not start. [#40641](https://github.com/ClickHouse/ClickHouse/pull/40641) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Remove the functions `accurate_Cast` and `accurate_CastOrNull` (they are different to `accurateCast` and `accurateCastOrNull` by underscore in the name and they are not affected by the value of `cast_keep_nullable` setting). These functions were undocumented, untested, unused, and unneeded. They appeared to be alive due to code generalization. [#40682](https://github.com/ClickHouse/ClickHouse/pull/40682) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to ensure that every new table function will be documented. See [#40649](https://github.com/ClickHouse/ClickHouse/issues/40649). Rename table function `MeiliSearch` to `meilisearch`. [#40709](https://github.com/ClickHouse/ClickHouse/pull/40709) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to ensure that every new function will be documented. See [#40649](https://github.com/ClickHouse/ClickHouse/pull/40649). The functions `lemmatize`, `synonyms`, `stem` were case-insensitive by mistake. Now they are case-sensitive. [#40711](https://github.com/ClickHouse/ClickHouse/pull/40711) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* For security and stability reasons, catboost models are no longer evaluated within the ClickHouse server. Instead, the evaluation is now + done in the clickhouse-library-bridge, a separate process that loads the catboost library and communicates with the server process via + HTTP. [#40897](https://github.com/ClickHouse/ClickHouse/pull/40897) ([Robert Schulze](https://github.com/rschu1ze)). +* Make interpretation of YAML configs to be more conventional. [#41044](https://github.com/ClickHouse/ClickHouse/pull/41044) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### New Feature +* Support `insert_quorum = 'auto'` to use majority number. [#39970](https://github.com/ClickHouse/ClickHouse/pull/39970) ([Sachin](https://github.com/SachinSetiya)). +* Add embedded dashboards to ClickHouse server. This is a demo project about how to achieve 90% results with 1% effort using ClickHouse features. [#40461](https://github.com/ClickHouse/ClickHouse/pull/40461) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added new settings constraint writability kind `changeable_in_readonly`. [#40631](https://github.com/ClickHouse/ClickHouse/pull/40631) ([Sergei Trifonov](https://github.com/serxa)). +* Add support for `INTERSECT DISTINCT` and `EXCEPT DISTINCT`. [#40792](https://github.com/ClickHouse/ClickHouse/pull/40792) ([Duc Canh Le](https://github.com/canhld94)). +* Add new input/output format `JSONObjectEachRow` - Support import for formats `JSON/JSONCompact/JSONColumnsWithMetadata`. Add new setting `input_format_json_validate_types_from_metadata` that controls whether we should check if data types from metadata match data types from the header. - Add new setting `input_format_json_validate_utf8`, when it's enabled, all `JSON` formats will validate UTF-8 sequences. It will be disabled by default. Note that this setting doesn't influence output formats `JSON/JSONCompact/JSONColumnsWithMetadata`, they always validate utf8 sequences (this exception was made because of compatibility reasons). - Add new setting `input_format_json_read_numbers_as_strings ` that allows to parse numbers in String column, the setting is disabled by default. - Add new setting `output_format_json_quote_decimals` that allows to output decimals in double quotes, disabled by default. - Allow to parse decimals in double quotes during data import. [#40910](https://github.com/ClickHouse/ClickHouse/pull/40910) ([Kruglov Pavel](https://github.com/Avogar)). +* Query parameters supported in DESCRIBE TABLE query. [#40952](https://github.com/ClickHouse/ClickHouse/pull/40952) ([Nikita Taranov](https://github.com/nickitat)). +* Add support to Parquet Time32/64 by converting it into DateTime64. Parquet time32/64 represents time elapsed since midnight, while DateTime32/64 represents an actual unix timestamp. Conversion simply offsets from `0`. [#41333](https://github.com/ClickHouse/ClickHouse/pull/41333) ([Arthur Passos](https://github.com/arthurpassos)). +* Implement set operations on Apache Datasketches. [#39919](https://github.com/ClickHouse/ClickHouse/pull/39919) ([Fangyuan Deng](https://github.com/pzhdfy)). Note: there is no point of using Apache Datasketches, they are inferiour than ClickHouse and only make sense for integration with other systems. +* Allow recording errors to specified file while reading text formats (`CSV`, `TSV`). [#40516](https://github.com/ClickHouse/ClickHouse/pull/40516) ([zjial](https://github.com/zjial)). + +#### Experimental Feature + +* Add ANN (approximate nearest neighbor) index based on `Annoy`. [#40818](https://github.com/ClickHouse/ClickHouse/pull/40818) ([Filatenkov Artur](https://github.com/FArthur-cmd)). [#37215](https://github.com/ClickHouse/ClickHouse/pull/37215) ([VVMak](https://github.com/VVMak)). +* Add new storage engine `KeeperMap`, that uses ClickHouse Keeper or ZooKeeper as a key-value store. [#39976](https://github.com/ClickHouse/ClickHouse/pull/39976) ([Antonio Andelic](https://github.com/antonio2368)). This storage engine is intended to store a small amount of metadata. +* Improvement for in-memory data parts: remove completely processed WAL files. [#40592](https://github.com/ClickHouse/ClickHouse/pull/40592) ([Azat Khuzhin](https://github.com/azat)). + +#### Performance Improvement +* Implement compression of marks and primary key. Close [#34437](https://github.com/ClickHouse/ClickHouse/issues/34437). [#37693](https://github.com/ClickHouse/ClickHouse/pull/37693) ([zhongyuankai](https://github.com/zhongyuankai)). +* Allow to load marks with threadpool in advance. Regulated by setting `load_marks_asynchronously` (default: 0). [#40821](https://github.com/ClickHouse/ClickHouse/pull/40821) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Virtual filesystem over s3 will use random object names split into multiple path prefixes for better performance on AWS. [#40968](https://github.com/ClickHouse/ClickHouse/pull/40968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Account `max_block_size` value while producing single-level aggregation results. Allows to execute following query plan steps using more threads. [#39138](https://github.com/ClickHouse/ClickHouse/pull/39138) ([Nikita Taranov](https://github.com/nickitat)). +* Software prefetching is used in aggregation to speed up operations with hash tables. Controlled by the setting `enable_software_prefetch_in_aggregation`, enabled by default. [#39304](https://github.com/ClickHouse/ClickHouse/pull/39304) ([Nikita Taranov](https://github.com/nickitat)). +* Better support of `optimize_read_in_order` in case when some of sorting key columns are always constant after applying `WHERE` clause. E.g. query like `SELECT ... FROM table WHERE a = 'x' ORDER BY a, b`, where `table` has storage definition: `MergeTree ORDER BY (a, b)`. [#38715](https://github.com/ClickHouse/ClickHouse/pull/38715) ([Anton Popov](https://github.com/CurtizJ)). +* Filter joined streams for `full_sorting_join` by each other before sorting. [#39418](https://github.com/ClickHouse/ClickHouse/pull/39418) ([Vladimir C](https://github.com/vdimir)). +* LZ4 decompression optimised by skipping empty literals processing. [#40142](https://github.com/ClickHouse/ClickHouse/pull/40142) ([Nikita Taranov](https://github.com/nickitat)). +* Speedup backup process using native `copy` when possible instead of copying through `clickhouse-server` memory. [#40395](https://github.com/ClickHouse/ClickHouse/pull/40395) ([alesapin](https://github.com/alesapin)). +* Do not obtain storage snapshot for each INSERT block (slightly improves performance). [#40638](https://github.com/ClickHouse/ClickHouse/pull/40638) ([Azat Khuzhin](https://github.com/azat)). +* Implement batch processing for aggregate functions with multiple nullable arguments. [#41058](https://github.com/ClickHouse/ClickHouse/pull/41058) ([Raúl Marín](https://github.com/Algunenano)). +* Speed up reading UniquesHashSet (`uniqState` from disk for example). [#41089](https://github.com/ClickHouse/ClickHouse/pull/41089) ([Raúl Marín](https://github.com/Algunenano)). +* Fixed high memory usage while executing mutations of compact parts in tables with huge number of columns. [#41122](https://github.com/ClickHouse/ClickHouse/pull/41122) ([lthaooo](https://github.com/lthaooo)). +* Enable the vectorscan library on ARM, this speeds up regexp evaluation. [#41033](https://github.com/ClickHouse/ClickHouse/pull/41033) ([Robert Schulze](https://github.com/rschu1ze)). +* Upgrade vectorscan to 5.4.8 which has many performance optimizations to speed up regexp evaluation. [#41270](https://github.com/ClickHouse/ClickHouse/pull/41270) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix incorrect fallback to skip the local filesystem cache for VFS (like S3) which happened on very high concurrency level. [#40420](https://github.com/ClickHouse/ClickHouse/pull/40420) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If row policy filter is always false, return empty result immediately without reading any data. This closes [#24012](https://github.com/ClickHouse/ClickHouse/issues/24012). [#40740](https://github.com/ClickHouse/ClickHouse/pull/40740) ([Amos Bird](https://github.com/amosbird)). +* Parallel hash JOIN for Float data types might be suboptimal. Make it better. [#41183](https://github.com/ClickHouse/ClickHouse/pull/41183) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* During startup and ATTACH call, `ReplicatedMergeTree` tables will be readonly until the ZooKeeper connection is made and the setup is finished. [#40148](https://github.com/ClickHouse/ClickHouse/pull/40148) ([Antonio Andelic](https://github.com/antonio2368)). +* Add `enable_extended_results_for_datetime_functions` option to return results of type Date32 for functions toStartOfYear, toStartOfISOYear, toStartOfQuarter, toStartOfMonth, toStartOfWeek, toMonday and toLastDayOfMonth when argument is Date32 or DateTime64, otherwise results of Date type are returned. For compatibility reasons default value is ‘0’. [#41214](https://github.com/ClickHouse/ClickHouse/pull/41214) ([Roman Vasin](https://github.com/rvasin)). +* For security and stability reasons, CatBoost models are no longer evaluated within the ClickHouse server. Instead, the evaluation is now done in the clickhouse-library-bridge, a separate process that loads the catboost library and communicates with the server process via HTTP. Function `modelEvaluate()` was replaced by `catboostEvaluate()`. [#40897](https://github.com/ClickHouse/ClickHouse/pull/40897) ([Robert Schulze](https://github.com/rschu1ze)). [#39629](https://github.com/ClickHouse/ClickHouse/pull/39629) ([Robert Schulze](https://github.com/rschu1ze)). +* Add more metrics for on-disk temporary data, close [#40206](https://github.com/ClickHouse/ClickHouse/issues/40206). [#40239](https://github.com/ClickHouse/ClickHouse/pull/40239) ([Vladimir C](https://github.com/vdimir)). +* Add config option `warning_supress_regexp`, close [#40330](https://github.com/ClickHouse/ClickHouse/issues/40330). [#40548](https://github.com/ClickHouse/ClickHouse/pull/40548) ([Vladimir C](https://github.com/vdimir)). +* Add setting to disable limit on kafka_num_consumers. Closes [#40331](https://github.com/ClickHouse/ClickHouse/issues/40331). [#40670](https://github.com/ClickHouse/ClickHouse/pull/40670) ([Kruglov Pavel](https://github.com/Avogar)). +* Support `SETTINGS` in `DELETE ...` query. [#41533](https://github.com/ClickHouse/ClickHouse/pull/41533) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Detailed S3 profile events `DiskS3*` per S3 API call split for S3 ObjectStorage. [#41532](https://github.com/ClickHouse/ClickHouse/pull/41532) ([Sergei Trifonov](https://github.com/serxa)). +* Two new metrics in `system.asynchronous_metrics`. `NumberOfDetachedParts` and `NumberOfDetachedByUserParts`. [#40779](https://github.com/ClickHouse/ClickHouse/pull/40779) ([Sema Checherinda](https://github.com/CheSema)). +* Allow CONSTRAINTs for ODBC and JDBC tables. [#34551](https://github.com/ClickHouse/ClickHouse/pull/34551) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Don't print `SETTINGS` more than once during query formatting if it didn't appear multiple times in the original query. [#38900](https://github.com/ClickHouse/ClickHouse/pull/38900) ([Raúl Marín](https://github.com/Algunenano)). +* Improve the tracing (OpenTelemetry) context propagation across threads. [#39010](https://github.com/ClickHouse/ClickHouse/pull/39010) ([Frank Chen](https://github.com/FrankChen021)). +* ClickHouse Keeper: add listeners for `interserver_listen_host` only in Keeper if specified. [#39973](https://github.com/ClickHouse/ClickHouse/pull/39973) ([Antonio Andelic](https://github.com/antonio2368)). +* Improve recovery of Replicated user access storage after errors. [#39977](https://github.com/ClickHouse/ClickHouse/pull/39977) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for TTL in `EmbeddedRocksDB`. [#39986](https://github.com/ClickHouse/ClickHouse/pull/39986) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Add schema inference to `clickhouse-obfuscator`, so the `--structure` argument is no longer required. [#40120](https://github.com/ClickHouse/ClickHouse/pull/40120) ([Nikolay Degterinsky](https://github.com/evillique)). +* Improve and fix dictionaries in `Arrow` format. [#40173](https://github.com/ClickHouse/ClickHouse/pull/40173) ([Kruglov Pavel](https://github.com/Avogar)). +* More natural conversion of `Date32`, `DateTime64`, `Date` to narrower types: upper or lower normal value is considered when out of normal range. [#40217](https://github.com/ClickHouse/ClickHouse/pull/40217) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix the case when `Merge` table over `View` cannot use index. [#40233](https://github.com/ClickHouse/ClickHouse/pull/40233) ([Duc Canh Le](https://github.com/canhld94)). +* Custom key names for JSON server logs. [#40251](https://github.com/ClickHouse/ClickHouse/pull/40251) ([Mallik Hassan](https://github.com/SadiHassan)). +* It is now possible to set a custom error code for the exception thrown by function `throwIf`. [#40319](https://github.com/ClickHouse/ClickHouse/pull/40319) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve schema inference cache, respect format settings that can change the schema. [#40414](https://github.com/ClickHouse/ClickHouse/pull/40414) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow parsing `Date` as `DateTime` and `DateTime64`. This implements the enhancement proposed in [#36949](https://github.com/ClickHouse/ClickHouse/issues/36949). [#40474](https://github.com/ClickHouse/ClickHouse/pull/40474) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow conversion from `String` with `DateTime64` like `2022-08-22 01:02:03.456` to `Date` and `Date32`. Allow conversion from String with DateTime like `2022-08-22 01:02:03` to `Date32`. This closes [#39598](https://github.com/ClickHouse/ClickHouse/issues/39598). [#40475](https://github.com/ClickHouse/ClickHouse/pull/40475) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better support for nested data structures in Parquet format [#40485](https://github.com/ClickHouse/ClickHouse/pull/40485) ([Arthur Passos](https://github.com/arthurpassos)). +* Support reading Array(Record) into flatten nested table in Avro. [#40534](https://github.com/ClickHouse/ClickHouse/pull/40534) ([Kruglov Pavel](https://github.com/Avogar)). +* Add read-only support for `EmbeddedRocksDB`. [#40543](https://github.com/ClickHouse/ClickHouse/pull/40543) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Validate the compression method parameter of URL table engine. [#40600](https://github.com/ClickHouse/ClickHouse/pull/40600) ([Frank Chen](https://github.com/FrankChen021)). +* Better format detection for url table function/engine in presence of a query string after a file name. Closes [#40315](https://github.com/ClickHouse/ClickHouse/issues/40315). [#40636](https://github.com/ClickHouse/ClickHouse/pull/40636) ([Kruglov Pavel](https://github.com/Avogar)). +* Disable projection when grouping set is used. It generated wrong result. This fixes [#40635](https://github.com/ClickHouse/ClickHouse/issues/40635). [#40726](https://github.com/ClickHouse/ClickHouse/pull/40726) ([Amos Bird](https://github.com/amosbird)). +* Fix incorrect format of `APPLY` column transformer which can break metadata if used in table definition. This fixes [#37590](https://github.com/ClickHouse/ClickHouse/issues/37590). [#40727](https://github.com/ClickHouse/ClickHouse/pull/40727) ([Amos Bird](https://github.com/amosbird)). +* Support the `%z` descriptor for formatting the timezone offset in `formatDateTime`. [#40736](https://github.com/ClickHouse/ClickHouse/pull/40736) ([Cory Levy](https://github.com/LevyCory)). +* The interactive mode in `clickhouse-client` now interprets `.` and `/` as "run the last command". [#40750](https://github.com/ClickHouse/ClickHouse/pull/40750) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix issue with passing MySQL timeouts for MySQL database engine and MySQL table function. Closes [#34168](https://github.com/ClickHouse/ClickHouse/issues/34168). [#40751](https://github.com/ClickHouse/ClickHouse/pull/40751) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Create status file for filesystem cache directory to make sure that cache directories are not shared between different servers or caches. [#40820](https://github.com/ClickHouse/ClickHouse/pull/40820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add support for `DELETE` and `UPDATE` for `EmbeddedRocksDB` storage. [#40853](https://github.com/ClickHouse/ClickHouse/pull/40853) ([Antonio Andelic](https://github.com/antonio2368)). +* ClickHouse Keeper: fix shutdown during long commit and increase allowed request size. [#40941](https://github.com/ClickHouse/ClickHouse/pull/40941) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix race in WriteBufferFromS3, add TSA annotations. [#40950](https://github.com/ClickHouse/ClickHouse/pull/40950) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Grouping sets with group_by_use_nulls should only convert key columns to nullable. [#40997](https://github.com/ClickHouse/ClickHouse/pull/40997) ([Duc Canh Le](https://github.com/canhld94)). +* Improve the observability of INSERT on distributed table. [#41034](https://github.com/ClickHouse/ClickHouse/pull/41034) ([Frank Chen](https://github.com/FrankChen021)). +* More low-level metrics for S3 interaction. [#41039](https://github.com/ClickHouse/ClickHouse/pull/41039) ([mateng915](https://github.com/mateng0915)). +* Support relative path in Location header after HTTP redirect. Closes [#40985](https://github.com/ClickHouse/ClickHouse/issues/40985). [#41162](https://github.com/ClickHouse/ClickHouse/pull/41162) ([Kruglov Pavel](https://github.com/Avogar)). +* Apply changes to HTTP handlers on fly without server restart. [#41177](https://github.com/ClickHouse/ClickHouse/pull/41177) ([Azat Khuzhin](https://github.com/azat)). +* ClickHouse Keeper: properly close active sessions during shutdown. [#41215](https://github.com/ClickHouse/ClickHouse/pull/41215) ([Antonio Andelic](https://github.com/antonio2368)). This lowers the period of "table is read-only" errors. +* Add ability to automatically comment SQL queries in clickhouse-client/local (with `Alt-#`, like in readline). [#41224](https://github.com/ClickHouse/ClickHouse/pull/41224) ([Azat Khuzhin](https://github.com/azat)). +* Fix incompatibility of cache after switching setting `do_no_evict_index_and_mark_files` from 1 to 0, 0 to 1. [#41330](https://github.com/ClickHouse/ClickHouse/pull/41330) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add a setting `allow_suspicious_fixed_string_types` to prevent users from creating columns of type FixedString with size > 256. [#41495](https://github.com/ClickHouse/ClickHouse/pull/41495) ([Duc Canh Le](https://github.com/canhld94)). +* Add `has_lightweight_delete` to system.parts. [#41564](https://github.com/ClickHouse/ClickHouse/pull/41564) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement +* Enforce documentation for every setting. [#40644](https://github.com/ClickHouse/ClickHouse/pull/40644) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every current metric. [#40645](https://github.com/ClickHouse/ClickHouse/pull/40645) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every profile event counter. Write the documentation where it was missing. [#40646](https://github.com/ClickHouse/ClickHouse/pull/40646) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow minimal `clickhouse-local` build by correcting some dependencies. [#40460](https://github.com/ClickHouse/ClickHouse/pull/40460) ([Alexey Milovidov](https://github.com/alexey-milovidov)). It is less than 50 MiB. +* Calculate and report SQL function coverage in tests. [#40593](https://github.com/ClickHouse/ClickHouse/issues/40593). [#40647](https://github.com/ClickHouse/ClickHouse/pull/40647) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enforce documentation for every MergeTree setting. [#40648](https://github.com/ClickHouse/ClickHouse/pull/40648) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A prototype of embedded reference documentation for high-level uniform server components. [#40649](https://github.com/ClickHouse/ClickHouse/pull/40649) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* We will check all queries from the changed perf tests to ensure that all changed queries were tested. [#40322](https://github.com/ClickHouse/ClickHouse/pull/40322) ([Nikita Taranov](https://github.com/nickitat)). +* Fix TGZ packages. [#40681](https://github.com/ClickHouse/ClickHouse/pull/40681) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix debug symbols. [#40873](https://github.com/ClickHouse/ClickHouse/pull/40873) ([Azat Khuzhin](https://github.com/azat)). +* Extended the CI configuration to create a x86 SSE2-only build. Useful for old or embedded hardware. [#40999](https://github.com/ClickHouse/ClickHouse/pull/40999) ([Robert Schulze](https://github.com/rschu1ze)). +* Switch to llvm/clang 15. [#41046](https://github.com/ClickHouse/ClickHouse/pull/41046) ([Azat Khuzhin](https://github.com/azat)). +* Continuation of [#40938](https://github.com/ClickHouse/ClickHouse/issues/40938). Fix ODR violation for `Loggers` class. Fixes [#40398](https://github.com/ClickHouse/ClickHouse/issues/40398), [#40937](https://github.com/ClickHouse/ClickHouse/issues/40937). [#41060](https://github.com/ClickHouse/ClickHouse/pull/41060) ([Dmitry Novik](https://github.com/novikd)). +* Add macOS binaries to GitHub release assets, it fixes [#37718](https://github.com/ClickHouse/ClickHouse/issues/37718). [#41088](https://github.com/ClickHouse/ClickHouse/pull/41088) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* The c-ares library is now bundled with ClickHouse's build system. [#41239](https://github.com/ClickHouse/ClickHouse/pull/41239) ([Robert Schulze](https://github.com/rschu1ze)). +* Get rid of `dlopen` from the main ClickHouse code. It remains in the library-bridge and odbc-bridge. [#41428](https://github.com/ClickHouse/ClickHouse/pull/41428) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Don't allow `dlopen` in the main ClickHouse binary, because it is harmful and insecure. We don't use it. But it can be used by some libraries for the implementation of "plugins". We absolutely discourage the ancient technique of loading 3rd-party uncontrolled dangerous libraries into the process address space, because it is insane. [#41429](https://github.com/ClickHouse/ClickHouse/pull/41429) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `source` field to deb packages, update `nfpm`. [#41531](https://github.com/ClickHouse/ClickHouse/pull/41531) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Support for DWARF-5 in the in-house DWARF parser. [#40710](https://github.com/ClickHouse/ClickHouse/pull/40710) ([Azat Khuzhin](https://github.com/azat)). +* Add fault injection in ZooKeeper client for testing [#30498](https://github.com/ClickHouse/ClickHouse/pull/30498) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add stateless tests with s3 storage with debug and tsan [#35262](https://github.com/ClickHouse/ClickHouse/pull/35262) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Trying stress on top of S3 [#36837](https://github.com/ClickHouse/ClickHouse/pull/36837) ([alesapin](https://github.com/alesapin)). +* Enable `concurrency-mt-unsafe` in `clang-tidy` [#40224](https://github.com/ClickHouse/ClickHouse/pull/40224) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix + +* Fix potential dataloss due to [a bug in AWS SDK](https://github.com/aws/aws-sdk-cpp/issues/658). Bug can be triggered only when clickhouse is used over S3. [#40506](https://github.com/ClickHouse/ClickHouse/pull/40506) ([alesapin](https://github.com/alesapin)). This bug has been open for 5 years in AWS SDK and is closed after our report. +* Malicious data in Native format might cause a crash. [#41441](https://github.com/ClickHouse/ClickHouse/pull/41441) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The aggregate function `categorialInformationValue` was having incorrectly defined properties, which might cause a null pointer dereferencing at runtime. This closes [#41443](https://github.com/ClickHouse/ClickHouse/issues/41443). [#41449](https://github.com/ClickHouse/ClickHouse/pull/41449) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Writing data in Apache `ORC` format might lead to a buffer overrun. [#41458](https://github.com/ClickHouse/ClickHouse/pull/41458) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix memory safety issues with functions `encrypt` and `contingency` if Array of Nullable is used as an argument. This fixes [#41004](https://github.com/ClickHouse/ClickHouse/issues/41004). [#40195](https://github.com/ClickHouse/ClickHouse/pull/40195) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix bugs in MergeJoin when 'not_processed' is not null. [#40335](https://github.com/ClickHouse/ClickHouse/pull/40335) ([liql2007](https://github.com/liql2007)). +* Fix incorrect result in case of decimal precision loss in IN operator, ref [#41125](https://github.com/ClickHouse/ClickHouse/issues/41125). [#41130](https://github.com/ClickHouse/ClickHouse/pull/41130) ([Vladimir C](https://github.com/vdimir)). +* Fix filling of missed `Nested` columns with multiple levels. [#37152](https://github.com/ClickHouse/ClickHouse/pull/37152) ([Anton Popov](https://github.com/CurtizJ)). +* Fix SYSTEM UNFREEZE query for Ordinary (deprecated) database. Fix for https://github.com/ClickHouse/ClickHouse/pull/36424. [#38262](https://github.com/ClickHouse/ClickHouse/pull/38262) ([Vadim Volodin](https://github.com/PolyProgrammist)). +* Fix unused unknown columns introduced by WITH statement. This fixes [#37812](https://github.com/ClickHouse/ClickHouse/issues/37812) . [#39131](https://github.com/ClickHouse/ClickHouse/pull/39131) ([Amos Bird](https://github.com/amosbird)). +* Fix query analysis for ORDER BY in presence of window functions. Fixes [#38741](https://github.com/ClickHouse/ClickHouse/issues/38741) Fixes [#24892](https://github.com/ClickHouse/ClickHouse/issues/24892). [#39354](https://github.com/ClickHouse/ClickHouse/pull/39354) ([Dmitry Novik](https://github.com/novikd)). +* Fixed `Unknown identifier (aggregate-function)` exception which appears when a user tries to calculate WINDOW ORDER BY/PARTITION BY expressions over aggregate functions. [#39762](https://github.com/ClickHouse/ClickHouse/pull/39762) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Limit number of analyze for one query with setting `max_analyze_depth`. It prevents exponential blow up of analysis time for queries with extraordinarily large number of subqueries. [#40334](https://github.com/ClickHouse/ClickHouse/pull/40334) ([Vladimir C](https://github.com/vdimir)). +* Fix rare bug with column TTL for MergeTree engines family: In case of repeated vertical merge the error `Cannot unlink file ColumnName.bin ... No such file or directory.` could happen. [#40346](https://github.com/ClickHouse/ClickHouse/pull/40346) ([alesapin](https://github.com/alesapin)). +* Use DNS entries for both IPv4 and IPv6 if present. [#40353](https://github.com/ClickHouse/ClickHouse/pull/40353) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to read snappy compressed files from Hadoop. [#40482](https://github.com/ClickHouse/ClickHouse/pull/40482) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash while parsing values of type `Object` (experimental feature) that contains arrays of variadic dimension. [#40483](https://github.com/ClickHouse/ClickHouse/pull/40483) ([Duc Canh Le](https://github.com/canhld94)). +* Fix settings `input_format_tsv_skip_first_lines`. [#40491](https://github.com/ClickHouse/ClickHouse/pull/40491) ([mini4](https://github.com/mini4)). +* Fix bug (race condition) when starting up MaterializedPostgreSQL database/table engine. [#40262](https://github.com/ClickHouse/ClickHouse/issues/40262). Fix error with reaching limit of relcache_callback_list slots. [#40511](https://github.com/ClickHouse/ClickHouse/pull/40511) ([Maksim Buren](https://github.com/maks-buren630501)). +* Fix possible error 'Decimal math overflow' while parsing DateTime64. [#40546](https://github.com/ClickHouse/ClickHouse/pull/40546) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix vertical merge of parts with lightweight deleted rows. [#40559](https://github.com/ClickHouse/ClickHouse/pull/40559) ([Alexander Gololobov](https://github.com/davenger)). +* Fix segment fault when writing data to URL table engine if it enables compression. [#40565](https://github.com/ClickHouse/ClickHouse/pull/40565) ([Frank Chen](https://github.com/FrankChen021)). +* Fix possible logical error `'Invalid Field get from type UInt64 to type String'` in arrayElement function with Map. [#40572](https://github.com/ClickHouse/ClickHouse/pull/40572) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible race in filesystem cache. [#40586](https://github.com/ClickHouse/ClickHouse/pull/40586) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Removed skipping of mutations in unaffected partitions of `MergeTree` tables, because this feature never worked correctly and might cause resurrection of finished mutations. [#40589](https://github.com/ClickHouse/ClickHouse/pull/40589) ([Alexander Tokmakov](https://github.com/tavplubix)). +* The clickhouse server will crash if we add a grpc port which has been occupied to the configuration in runtime. [#40597](https://github.com/ClickHouse/ClickHouse/pull/40597) ([何李夫](https://github.com/helifu)). +* Fix `base58Encode / base58Decode` handling leading 0 / '1'. [#40620](https://github.com/ClickHouse/ClickHouse/pull/40620) ([Andrey Zvonov](https://github.com/zvonand)). +* keeper-fix: fix race in accessing logs while snapshot is being installed. [#40627](https://github.com/ClickHouse/ClickHouse/pull/40627) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix short circuit execution of toFixedString function. Solves (partially) [#40622](https://github.com/ClickHouse/ClickHouse/issues/40622). [#40628](https://github.com/ClickHouse/ClickHouse/pull/40628) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes SQLite int8 column conversion to int64 column in ClickHouse. Fixes [#40639](https://github.com/ClickHouse/ClickHouse/issues/40639). [#40642](https://github.com/ClickHouse/ClickHouse/pull/40642) ([Barum Rho](https://github.com/barumrho)). +* Fix stack overflow in recursive `Buffer` tables. This closes [#40637](https://github.com/ClickHouse/ClickHouse/issues/40637). [#40643](https://github.com/ClickHouse/ClickHouse/pull/40643) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* During insertion of a new query to the `ProcessList` allocations happen. If we reach the memory limit during these allocations we can not use `OvercommitTracker`, because `ProcessList::mutex` is already acquired. Fixes [#40611](https://github.com/ClickHouse/ClickHouse/issues/40611). [#40677](https://github.com/ClickHouse/ClickHouse/pull/40677) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR with max_read_buffer_size=0 during reading marks. [#40705](https://github.com/ClickHouse/ClickHouse/pull/40705) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak while pushing to MVs w/o query context (from Kafka/...). [#40732](https://github.com/ClickHouse/ClickHouse/pull/40732) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible error Attempt to read after eof in CSV schema inference. [#40746](https://github.com/ClickHouse/ClickHouse/pull/40746) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix logical error in write-through cache "File segment completion can be done only by downloader". Closes [#40748](https://github.com/ClickHouse/ClickHouse/issues/40748). [#40759](https://github.com/ClickHouse/ClickHouse/pull/40759) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Make the result of GROUPING function the same as in SQL and other DBMS. [#40762](https://github.com/ClickHouse/ClickHouse/pull/40762) ([Dmitry Novik](https://github.com/novikd)). +* In [#40595](https://github.com/ClickHouse/ClickHouse/issues/40595) it was reported that the `host_regexp` functionality was not working properly with a name to address resolution in `/etc/hosts`. It's fixed. [#40769](https://github.com/ClickHouse/ClickHouse/pull/40769) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix incremental backups for Log family. [#40827](https://github.com/ClickHouse/ClickHouse/pull/40827) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix extremely rare bug which can lead to potential data loss in zero-copy replication. [#40844](https://github.com/ClickHouse/ClickHouse/pull/40844) ([alesapin](https://github.com/alesapin)). +* Fix key condition analyzing crashes when same set expression built from different column(s). [#40850](https://github.com/ClickHouse/ClickHouse/pull/40850) ([Duc Canh Le](https://github.com/canhld94)). +* Fix nested JSON Objects schema inference. [#40851](https://github.com/ClickHouse/ClickHouse/pull/40851) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix 3-digit prefix directory for filesystem cache files not being deleted if empty. Closes [#40797](https://github.com/ClickHouse/ClickHouse/issues/40797). [#40867](https://github.com/ClickHouse/ClickHouse/pull/40867) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix uncaught DNS_ERROR on failed connection to replicas. [#40881](https://github.com/ClickHouse/ClickHouse/pull/40881) ([Robert Coelho](https://github.com/coelho)). +* Fix bug when removing unneeded columns in subquery. [#40884](https://github.com/ClickHouse/ClickHouse/pull/40884) ([luocongkai](https://github.com/TKaxe)). +* Fix extra memory allocation for remote read buffers. [#40896](https://github.com/ClickHouse/ClickHouse/pull/40896) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed a behaviour when user with explicitly revoked grant for dropping databases can still drop it. [#40906](https://github.com/ClickHouse/ClickHouse/pull/40906) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* A fix for ClickHouse Keeper: correctly compare paths in write requests to Keeper internal system node paths. [#40918](https://github.com/ClickHouse/ClickHouse/pull/40918) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix deadlock in WriteBufferFromS3. [#40943](https://github.com/ClickHouse/ClickHouse/pull/40943) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix access rights for `DESCRIBE TABLE url()` and some other `DESCRIBE TABLE ()`. [#40975](https://github.com/ClickHouse/ClickHouse/pull/40975) ([Vitaly Baranov](https://github.com/vitlibar)). +* Remove wrong parser logic for `WITH GROUPING SETS` which may lead to nullptr dereference. [#41049](https://github.com/ClickHouse/ClickHouse/pull/41049) ([Duc Canh Le](https://github.com/canhld94)). +* A fix for ClickHouse Keeper: fix possible segfault during Keeper shutdown. [#41075](https://github.com/ClickHouse/ClickHouse/pull/41075) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfaults, use-heap-after-free and memory leak in aggregate function combinators. Closes [#40848](https://github.com/ClickHouse/ClickHouse/issues/40848). [#41083](https://github.com/ClickHouse/ClickHouse/pull/41083) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix query_views_log with Window views. [#41132](https://github.com/ClickHouse/ClickHouse/pull/41132) ([Raúl Marín](https://github.com/Algunenano)). +* Disables optimize_monotonous_functions_in_order_by by default, mitigates: [#40094](https://github.com/ClickHouse/ClickHouse/issues/40094). [#41136](https://github.com/ClickHouse/ClickHouse/pull/41136) ([Denny Crane](https://github.com/den-crane)). +* Fixed "possible deadlock avoided" error on automatic conversion of database engine from Ordinary to Atomic. [#41146](https://github.com/ClickHouse/ClickHouse/pull/41146) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix SIGSEGV in SortedBlocksWriter in case of empty block (possible to get with `optimize_aggregation_in_order` and `join_algorithm=auto`). [#41154](https://github.com/ClickHouse/ClickHouse/pull/41154) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect query result when trivial count optimization is in effect with array join. This fixes [#39431](https://github.com/ClickHouse/ClickHouse/issues/39431). [#41158](https://github.com/ClickHouse/ClickHouse/pull/41158) ([Denny Crane](https://github.com/den-crane)). +* Fix stack-use-after-return in GetPriorityForLoadBalancing::getPriorityFunc(). [#41159](https://github.com/ClickHouse/ClickHouse/pull/41159) ([Azat Khuzhin](https://github.com/azat)). +* Fix positional arguments exception Positional argument out of bounds. Closes [#40634](https://github.com/ClickHouse/ClickHouse/issues/40634). [#41189](https://github.com/ClickHouse/ClickHouse/pull/41189) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix background clean up of broken detached parts. [#41190](https://github.com/ClickHouse/ClickHouse/pull/41190) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix exponential query rewrite in case of lots of cross joins with where, close [#21557](https://github.com/ClickHouse/ClickHouse/issues/21557). [#41223](https://github.com/ClickHouse/ClickHouse/pull/41223) ([Vladimir C](https://github.com/vdimir)). +* Fix possible logical error in write-through cache, which happened because not all types of exception were handled as needed. Closes [#41208](https://github.com/ClickHouse/ClickHouse/issues/41208). [#41232](https://github.com/ClickHouse/ClickHouse/pull/41232) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix String log entry in system.filesystem_cache_log. [#41233](https://github.com/ClickHouse/ClickHouse/pull/41233) ([jmimbrero](https://github.com/josemimbrero-tinybird)). +* Queries with `OFFSET` clause in subquery and `WHERE` clause in outer query might return incorrect result, it's fixed. Fixes [#40416](https://github.com/ClickHouse/ClickHouse/issues/40416). [#41280](https://github.com/ClickHouse/ClickHouse/pull/41280) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible wrong query result with `query_plan_optimize_primary_key` enabled. Fixes [#40599](https://github.com/ClickHouse/ClickHouse/issues/40599). [#41281](https://github.com/ClickHouse/ClickHouse/pull/41281) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not allow invalid sequences influence other rows in lowerUTF8/upperUTF8. [#41286](https://github.com/ClickHouse/ClickHouse/pull/41286) ([Azat Khuzhin](https://github.com/azat)). +* Fix `ALTER
    ADD COLUMN` queries with columns of type `Object`. [#41290](https://github.com/ClickHouse/ClickHouse/pull/41290) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed "No node" error when selecting from `system.distributed_ddl_queue` when there's no `distributed_ddl.path` in config. Fixes [#41096](https://github.com/ClickHouse/ClickHouse/issues/41096). [#41296](https://github.com/ClickHouse/ClickHouse/pull/41296) ([young scott](https://github.com/young-scott)). +* Fix incorrect logical error `Expected relative path` in disk object storage. Related to [#41246](https://github.com/ClickHouse/ClickHouse/issues/41246). [#41297](https://github.com/ClickHouse/ClickHouse/pull/41297) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add column type check before UUID insertion in MsgPack format. [#41309](https://github.com/ClickHouse/ClickHouse/pull/41309) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible crash after inserting asynchronously (with enabled setting `async_insert`) malformed data to columns of type `Object`. It could happen, if JSONs in all batches of async inserts were invalid and could not be parsed. [#41336](https://github.com/ClickHouse/ClickHouse/pull/41336) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible deadlock with async_socket_for_remote/use_hedged_requests and parallel KILL. [#41343](https://github.com/ClickHouse/ClickHouse/pull/41343) ([Azat Khuzhin](https://github.com/azat)). +* Disables optimize_rewrite_sum_if_to_count_if by default, mitigates: [#38605](https://github.com/ClickHouse/ClickHouse/issues/38605) [#38683](https://github.com/ClickHouse/ClickHouse/issues/38683). [#41388](https://github.com/ClickHouse/ClickHouse/pull/41388) ([Denny Crane](https://github.com/den-crane)). +* Since 22.8 `ON CLUSTER` clause is ignored if database is `Replicated` and cluster name and database name are the same. Because of this `DROP PARTITION ON CLUSTER` worked unexpected way with `Replicated`. It's fixed, now `ON CLUSTER` clause is ignored only for queries that are replicated on database level. Fixes [#41299](https://github.com/ClickHouse/ClickHouse/issues/41299). [#41390](https://github.com/ClickHouse/ClickHouse/pull/41390) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible hung/deadlock on query cancellation (`KILL QUERY` or server shutdown). [#41467](https://github.com/ClickHouse/ClickHouse/pull/41467) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible server crash when using the JBOD feature. This fixes [#41365](https://github.com/ClickHouse/ClickHouse/issues/41365). [#41483](https://github.com/ClickHouse/ClickHouse/pull/41483) ([Amos Bird](https://github.com/amosbird)). +* Fix conversion from nullable fixed string to string. [#41541](https://github.com/ClickHouse/ClickHouse/pull/41541) ([Duc Canh Le](https://github.com/canhld94)). +* Prevent crash when passing wrong aggregation states to groupBitmap*. [#41563](https://github.com/ClickHouse/ClickHouse/pull/41563) ([Raúl Marín](https://github.com/Algunenano)). +* Queries with `ORDER BY` and `1500 <= LIMIT <= max_block_size` could return incorrect result with missing rows from top. Fixes [#41182](https://github.com/ClickHouse/ClickHouse/issues/41182). [#41576](https://github.com/ClickHouse/ClickHouse/pull/41576) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix read bytes/rows in X-ClickHouse-Summary with materialized views. [#41586](https://github.com/ClickHouse/ClickHouse/pull/41586) ([Raúl Marín](https://github.com/Algunenano)). +* Fix possible `pipeline stuck` exception for queries with `OFFSET`. The error was found with `enable_optimize_predicate_expression = 0` and always false condition in `WHERE`. Fixes [#41383](https://github.com/ClickHouse/ClickHouse/issues/41383). [#41588](https://github.com/ClickHouse/ClickHouse/pull/41588) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +### ClickHouse release 22.8, 2022-08-18 + +#### Backward Incompatible Change +* Extended range of `Date32` and `DateTime64` to support dates from the year 1900 to 2299. In previous versions, the supported interval was only from the year 1925 to 2283. The implementation is using the proleptic Gregorian calendar (which is conformant with [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601):2004 (clause 3.2.1 The Gregorian calendar)) instead of accounting for historical transitions from the Julian to the Gregorian calendar. This change affects implementation-specific behavior for out-of-range arguments. E.g. if in previous versions the value of `1899-01-01` was clamped to `1925-01-01`, in the new version it will be clamped to `1900-01-01`. It changes the behavior of rounding with `toStartOfInterval` if you pass `INTERVAL 3 QUARTER` up to one quarter because the intervals are counted from an implementation-specific point of time. Closes [#28216](https://github.com/ClickHouse/ClickHouse/issues/28216), improves [#38393](https://github.com/ClickHouse/ClickHouse/issues/38393). [#39425](https://github.com/ClickHouse/ClickHouse/pull/39425) ([Roman Vasin](https://github.com/rvasin)). +* Now, all relevant dictionary sources respect `remote_url_allow_hosts` setting. It was already done for HTTP, Cassandra, Redis. Added ClickHouse, MongoDB, MySQL, PostgreSQL. Host is checked only for dictionaries created from DDL. [#39184](https://github.com/ClickHouse/ClickHouse/pull/39184) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Prebuilt ClickHouse x86 binaries now require support for AVX instructions, i.e. a CPU not older than Intel Sandy Bridge / AMD Bulldozer, both released in 2011. [#39000](https://github.com/ClickHouse/ClickHouse/pull/39000) ([Robert Schulze](https://github.com/rschu1ze)). +* Make the remote filesystem cache composable, allow not to evict certain files (regarding idx, mrk, ..), delete old cache version. Now it is possible to configure cache over Azure blob storage disk, over Local disk, over StaticWeb disk, etc. This PR is marked backward incompatible because cache configuration changes and in order for cache to work need to update the config file. Old cache will still be used with new configuration. The server will startup fine with the old cache configuration. Closes https://github.com/ClickHouse/ClickHouse/issues/36140. Closes https://github.com/ClickHouse/ClickHouse/issues/37889. ([Kseniia Sumarokova](https://github.com/kssenii)). [#36171](https://github.com/ClickHouse/ClickHouse/pull/36171)) + +#### New Feature +* Support SQL standard DELETE FROM syntax on merge tree tables and lightweight delete implementation for merge tree families. [#37893](https://github.com/ClickHouse/ClickHouse/pull/37893) ([Jianmei Zhang](https://github.com/zhangjmruc)) ([Alexander Gololobov](https://github.com/davenger)). Note: this new feature does not make ClickHouse an HTAP DBMS. +* Query parameters can be set in interactive mode as `SET param_abc = 'def'` and transferred via the native protocol as settings. [#39906](https://github.com/ClickHouse/ClickHouse/pull/39906) ([Nikita Taranov](https://github.com/nickitat)). +* Quota key can be set in the native protocol ([Yakov Olkhovsky](https://github.com/ClickHouse/ClickHouse/pull/39874)). +* Added a setting `exact_rows_before_limit` (0/1). When enabled, ClickHouse will provide exact value for `rows_before_limit_at_least` statistic, but with the cost that the data before limit will have to be read completely. This closes [#6613](https://github.com/ClickHouse/ClickHouse/issues/6613). [#25333](https://github.com/ClickHouse/ClickHouse/pull/25333) ([kevin wan](https://github.com/MaxWk)). +* Added support for parallel distributed insert select with `s3Cluster` table function into tables with `Distributed` and `Replicated` engine [#34670](https://github.com/ClickHouse/ClickHouse/issues/34670). [#39107](https://github.com/ClickHouse/ClickHouse/pull/39107) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add new settings to control schema inference from text formats: - `input_format_try_infer_dates` - try infer dates from strings. - `input_format_try_infer_datetimes` - try infer datetimes from strings. - `input_format_try_infer_integers` - try infer `Int64` instead of `Float64`. - `input_format_json_try_infer_numbers_from_strings` - try infer numbers from json strings in JSON formats. [#39186](https://github.com/ClickHouse/ClickHouse/pull/39186) ([Kruglov Pavel](https://github.com/Avogar)). +* An option to provide JSON formatted log output. The purpose is to allow easier ingestion and query in log analysis tools. [#39277](https://github.com/ClickHouse/ClickHouse/pull/39277) ([Mallik Hassan](https://github.com/SadiHassan)). +* Add function `nowInBlock` which allows getting the current time during long-running and continuous queries. Closes [#39522](https://github.com/ClickHouse/ClickHouse/issues/39522). Notes: there are no functions `now64InBlock` neither `todayInBlock`. [#39533](https://github.com/ClickHouse/ClickHouse/pull/39533) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to specify settings for an `executable()` table function. [#39681](https://github.com/ClickHouse/ClickHouse/pull/39681) ([Constantine Peresypkin](https://github.com/pkit)). +* Implemented automatic conversion of database engine from `Ordinary` to `Atomic`. Create empty `convert_ordinary_to_atomic` file in `flags` directory and all `Ordinary` databases will be converted automatically on next server start. Resolves [#39546](https://github.com/ClickHouse/ClickHouse/issues/39546). [#39933](https://github.com/ClickHouse/ClickHouse/pull/39933) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Support `SELECT ... INTO OUTFILE '...' AND STDOUT`. [#37490](https://github.com/ClickHouse/ClickHouse/issues/37490). [#39054](https://github.com/ClickHouse/ClickHouse/pull/39054) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add formats `PrettyMonoBlock`, `PrettyNoEscapesMonoBlock`, `PrettyCompactNoEscapes`, `PrettyCompactNoEscapesMonoBlock`, `PrettySpaceNoEscapes`, `PrettySpaceMonoBlock`, `PrettySpaceNoEscapesMonoBlock`. [#39646](https://github.com/ClickHouse/ClickHouse/pull/39646) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Performance Improvement +* Improved memory usage during memory efficient merging of aggregation results. [#39429](https://github.com/ClickHouse/ClickHouse/pull/39429) ([Nikita Taranov](https://github.com/nickitat)). +* Added concurrency control logic to limit total number of concurrent threads created by queries. [#37558](https://github.com/ClickHouse/ClickHouse/pull/37558) ([Sergei Trifonov](https://github.com/serxa)). Add `concurrent_threads_soft_limit parameter` to increase performance in case of high QPS by means of limiting total number of threads for all queries. [#37285](https://github.com/ClickHouse/ClickHouse/pull/37285) ([Roman Vasin](https://github.com/rvasin)). +* Add `SLRU` cache policy for uncompressed cache and marks cache. ([Kseniia Sumarokova](https://github.com/kssenii)). [#34651](https://github.com/ClickHouse/ClickHouse/pull/34651) ([alexX512](https://github.com/alexX512)). Decoupling local cache function and cache algorithm [#38048](https://github.com/ClickHouse/ClickHouse/pull/38048) ([Han Shukai](https://github.com/KinderRiven)). +* Intel® In-Memory Analytics Accelerator (Intel® IAA) is a hardware accelerator available in the upcoming generation of Intel® Xeon® Scalable processors ("Sapphire Rapids"). Its goal is to speed up common operations in analytics like data (de)compression and filtering. ClickHouse gained the new "DeflateQpl" compression codec which utilizes the Intel® IAA offloading technology to provide a high-performance DEFLATE implementation. The codec uses the [Intel® Query Processing Library (QPL)](https://github.com/intel/qpl) which abstracts access to the hardware accelerator, respectively to a software fallback in case the hardware accelerator is not available. DEFLATE provides in general higher compression rates than ClickHouse's LZ4 default codec, and as a result, offers less disk I/O and lower main memory consumption. [#36654](https://github.com/ClickHouse/ClickHouse/pull/36654) ([jasperzhu](https://github.com/jinjunzh)). [#39494](https://github.com/ClickHouse/ClickHouse/pull/39494) ([Robert Schulze](https://github.com/rschu1ze)). +* `DISTINCT` in order with `ORDER BY`: Deduce way to sort based on input stream sort description. Skip sorting if input stream is already sorted. [#38719](https://github.com/ClickHouse/ClickHouse/pull/38719) ([Igor Nikonov](https://github.com/devcrafter)). Improve memory usage (significantly) and query execution time + use `DistinctSortedChunkTransform` for final distinct when `DISTINCT` columns match `ORDER BY` columns, but rename to `DistinctSortedStreamTransform` in `EXPLAIN PIPELINE` → this improves memory usage significantly + remove unnecessary allocations in hot loop in `DistinctSortedChunkTransform`. [#39432](https://github.com/ClickHouse/ClickHouse/pull/39432) ([Igor Nikonov](https://github.com/devcrafter)). Use `DistinctSortedTransform` only when sort description is applicable to DISTINCT columns, otherwise fall back to ordinary DISTINCT implementation + it allows making less checks during `DistinctSortedTransform` execution. [#39528](https://github.com/ClickHouse/ClickHouse/pull/39528) ([Igor Nikonov](https://github.com/devcrafter)). Fix: `DistinctSortedTransform` didn't take advantage of sorting. It never cleared HashSet since clearing_columns were detected incorrectly (always empty). So, it basically worked as ordinary `DISTINCT` (`DistinctTransform`). The fix reduces memory usage significantly. [#39538](https://github.com/ClickHouse/ClickHouse/pull/39538) ([Igor Nikonov](https://github.com/devcrafter)). +* Use local node as first priority to get structure of remote table when executing `cluster` and similar table functions. [#39440](https://github.com/ClickHouse/ClickHouse/pull/39440) ([Mingliang Pan](https://github.com/liangliangpan)). +* Optimize filtering by numeric columns with AVX512VBMI2 compress store. [#39633](https://github.com/ClickHouse/ClickHouse/pull/39633) ([Guo Wangyang](https://github.com/guowangy)). For systems with AVX512 VBMI2, this PR improves performance by ca. 6% for SSB benchmark queries queries 3.1, 3.2 and 3.3 (SF=100). Tested on Intel Icelake Xeon 8380 * 2 socket. [#40033](https://github.com/ClickHouse/ClickHouse/pull/40033) ([Robert Schulze](https://github.com/rschu1ze)). +* Optimize index analysis with functional expressions in multi-thread scenario. [#39812](https://github.com/ClickHouse/ClickHouse/pull/39812) ([Guo Wangyang](https://github.com/guowangy)). +* Optimizations for complex queries: Don't visit the AST for UDFs if none are registered. [#40069](https://github.com/ClickHouse/ClickHouse/pull/40069) ([Raúl Marín](https://github.com/Algunenano)). Optimize CurrentMemoryTracker alloc and free. [#40078](https://github.com/ClickHouse/ClickHouse/pull/40078) ([Raúl Marín](https://github.com/Algunenano)). +* Improved Base58 encoding/decoding. [#39292](https://github.com/ClickHouse/ClickHouse/pull/39292) ([Andrey Zvonov](https://github.com/zvonand)). +* Improve bytes to bits mask transform for SSE/AVX/AVX512. [#39586](https://github.com/ClickHouse/ClickHouse/pull/39586) ([Guo Wangyang](https://github.com/guowangy)). + +#### Improvement +* Normalize `AggregateFunction` types and state representations because optimizations like [#35788](https://github.com/ClickHouse/ClickHouse/pull/35788) will treat `count(not null columns)` as `count()`, which might confuses distributed interpreters with the following error : `Conversion from AggregateFunction(count) to AggregateFunction(count, Int64) is not supported`. [#39420](https://github.com/ClickHouse/ClickHouse/pull/39420) ([Amos Bird](https://github.com/amosbird)). The functions with identical states can be used in materialized views interchangeably. +* Rework and simplify the `system.backups` table, remove the `internal` column, allow user to set the ID of operation, add columns `num_files`, `uncompressed_size`, `compressed_size`, `start_time`, `end_time`. [#39503](https://github.com/ClickHouse/ClickHouse/pull/39503) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improved structure of DDL query result table for `Replicated` database (separate columns with shard and replica name, more clear status) - `CREATE TABLE ... ON CLUSTER` queries can be normalized on initiator first if `distributed_ddl_entry_format_version` is set to 3 (default value). It means that `ON CLUSTER` queries may not work if initiator does not belong to the cluster that specified in query. Fixes [#37318](https://github.com/ClickHouse/ClickHouse/issues/37318), [#39500](https://github.com/ClickHouse/ClickHouse/issues/39500) - Ignore `ON CLUSTER` clause if database is `Replicated` and cluster name equals to database name. Related to [#35570](https://github.com/ClickHouse/ClickHouse/issues/35570) - Miscellaneous minor fixes for `Replicated` database engine - Check metadata consistency when starting up `Replicated` database, start replica recovery in case of mismatch of local metadata and metadata in Keeper. Resolves [#24880](https://github.com/ClickHouse/ClickHouse/issues/24880). [#37198](https://github.com/ClickHouse/ClickHouse/pull/37198) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add result_rows and result_bytes to progress reports (`X-ClickHouse-Summary`). [#39567](https://github.com/ClickHouse/ClickHouse/pull/39567) ([Raúl Marín](https://github.com/Algunenano)). +* Improve primary key analysis for MergeTree. [#25563](https://github.com/ClickHouse/ClickHouse/pull/25563) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* `timeSlots` now works with DateTime64; subsecond duration and slot size available when working with DateTime64. [#37951](https://github.com/ClickHouse/ClickHouse/pull/37951) ([Andrey Zvonov](https://github.com/zvonand)). +* Added support of `LEFT SEMI` and `LEFT ANTI` direct join with `EmbeddedRocksDB` tables. [#38956](https://github.com/ClickHouse/ClickHouse/pull/38956) ([Vladimir C](https://github.com/vdimir)). +* Add profile events for fsync operations. [#39179](https://github.com/ClickHouse/ClickHouse/pull/39179) ([Azat Khuzhin](https://github.com/azat)). +* Add the second argument to the ordinary function `file(path[, default])`, which function returns in the case when a file does not exists. [#39218](https://github.com/ClickHouse/ClickHouse/pull/39218) ([Nikolay Degterinsky](https://github.com/evillique)). +* Some small fixes for reading via http, allow to retry partial content in case if 200 OK. [#39244](https://github.com/ClickHouse/ClickHouse/pull/39244) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support queries `CREATE TEMPORARY TABLE ... () AS ...`. [#39462](https://github.com/ClickHouse/ClickHouse/pull/39462) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support of `!`/`*` (exclamation/asterisk) in custom TLDs (`cutToFirstSignificantSubdomainCustom()`/`cutToFirstSignificantSubdomainCustomWithWWW()`/`firstSignificantSubdomainCustom()`). [#39496](https://github.com/ClickHouse/ClickHouse/pull/39496) ([Azat Khuzhin](https://github.com/azat)). +* Add support for TLS connections to NATS. Implements [#39525](https://github.com/ClickHouse/ClickHouse/issues/39525). [#39527](https://github.com/ClickHouse/ClickHouse/pull/39527) ([Constantine Peresypkin](https://github.com/pkit)). +* `clickhouse-obfuscator` (a tool for database obfuscation for testing and load generation) now has the new `--save` and `--load` parameters to work with pre-trained models. This closes [#39534](https://github.com/ClickHouse/ClickHouse/issues/39534). [#39541](https://github.com/ClickHouse/ClickHouse/pull/39541) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect behavior of log rotation during restart. [#39558](https://github.com/ClickHouse/ClickHouse/pull/39558) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix building aggregate projections when external aggregation is on. Mark as improvement because the case is rare and there exists easy workaround to fix it via changing settings. This fixes [#39667](https://github.com/ClickHouse/ClickHouse/issues/39667) . [#39671](https://github.com/ClickHouse/ClickHouse/pull/39671) ([Amos Bird](https://github.com/amosbird)). +* Allow to execute hash functions with arguments of type `Map`. [#39685](https://github.com/ClickHouse/ClickHouse/pull/39685) ([Anton Popov](https://github.com/CurtizJ)). +* Add a configuration parameter to hide addresses in stack traces. It may improve security a little but generally, it is harmful and should not be used. [#39690](https://github.com/ClickHouse/ClickHouse/pull/39690) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Change the prefix size of AggregateFunctionDistinct to make sure nested function data memory segment is aligned. [#39696](https://github.com/ClickHouse/ClickHouse/pull/39696) ([Pxl](https://github.com/BiteTheDDDDt)). +* Properly escape credentials passed to the `clickhouse-diagnostic` tool. [#39707](https://github.com/ClickHouse/ClickHouse/pull/39707) ([Dale McDiarmid](https://github.com/gingerwizard)). +* ClickHouse Keeper improvement: create a snapshot on exit. It can be controlled with the config `keeper_server.create_snapshot_on_exit`, `true` by default. [#39755](https://github.com/ClickHouse/ClickHouse/pull/39755) ([Antonio Andelic](https://github.com/antonio2368)). +* Support primary key analysis for `row_policy_filter` and `additional_filter`. It also helps fix issues like [#37454](https://github.com/ClickHouse/ClickHouse/issues/37454) . [#39826](https://github.com/ClickHouse/ClickHouse/pull/39826) ([Amos Bird](https://github.com/amosbird)). +* Fix two usability issues in Play UI: - it was non-pixel-perfect on iPad due to parasitic border radius and margins; - the progress indication did not display after the first query. This closes [#39957](https://github.com/ClickHouse/ClickHouse/issues/39957). This closes [#39960](https://github.com/ClickHouse/ClickHouse/issues/39960). [#39961](https://github.com/ClickHouse/ClickHouse/pull/39961) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: add row numbers; add cell selection on click; add hysteresis for table cells. [#39962](https://github.com/ClickHouse/ClickHouse/pull/39962) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: recognize tab key in textarea, but at the same time don't mess up with tab navigation. [#40053](https://github.com/ClickHouse/ClickHouse/pull/40053) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The client will show server-side elapsed time. This is important for the performance comparison of ClickHouse services in remote datacenters. This closes [#38070](https://github.com/ClickHouse/ClickHouse/issues/38070). See also [this](https://github.com/ClickHouse/ClickBench/blob/main/hardware/benchmark-cloud.sh#L37) for motivation. [#39968](https://github.com/ClickHouse/ClickHouse/pull/39968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Adds `parseDateTime64BestEffortUS`, `parseDateTime64BestEffortUSOrNull`, `parseDateTime64BestEffortUSOrZero` functions, closing [#37492](https://github.com/ClickHouse/ClickHouse/issues/37492). [#40015](https://github.com/ClickHouse/ClickHouse/pull/40015) ([Tanya Bragin](https://github.com/tbragin)). +* Extend the `system.processors_profile_log` with more information such as input rows. [#40121](https://github.com/ClickHouse/ClickHouse/pull/40121) ([Amos Bird](https://github.com/amosbird)). +* Display server-side time in `clickhouse-benchmark` by default if it is available (since ClickHouse version 22.8). This is needed to correctly compare the performance of clouds. This behavior can be changed with the new `--client-side-time` command line option. Change the `--randomize` command line option from `--randomize 1` to the form without argument. [#40193](https://github.com/ClickHouse/ClickHouse/pull/40193) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add counters (ProfileEvents) for cases when query complexity limitation has been set and has reached (a separate counter for `overflow_mode` = `break` and `throw`). For example, if you have set up `max_rows_to_read` with `read_overflow_mode = 'break'`, looking at the value of `OverflowBreak` counter will allow distinguishing incomplete results. [#40205](https://github.com/ClickHouse/ClickHouse/pull/40205) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix memory accounting in case of "Memory limit exceeded" errors (previously [peak] memory usage was takes failed allocations into account). [#40249](https://github.com/ClickHouse/ClickHouse/pull/40249) ([Azat Khuzhin](https://github.com/azat)). +* Add metrics for filesystem cache: `FilesystemCacheSize` and `FilesystemCacheElements`. [#40260](https://github.com/ClickHouse/ClickHouse/pull/40260) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support hadoop secure RPC transfer (hadoop.rpc.protection=privacy and hadoop.rpc.protection=integrity). [#39411](https://github.com/ClickHouse/ClickHouse/pull/39411) ([michael1589](https://github.com/michael1589)). +* Avoid continuously growing memory consumption of pattern cache when using functions multi(Fuzzy)Match(Any|AllIndices|AnyIndex)(). [#40264](https://github.com/ClickHouse/ClickHouse/pull/40264) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Build/Testing/Packaging Improvement +* [ClickFiddle](https://fiddle.clickhouse.com/): A new tool for testing ClickHouse versions in read/write mode (**Igor Baliuk**). +* ClickHouse binary is made self-extracting [#35775](https://github.com/ClickHouse/ClickHouse/pull/35775) ([Yakov Olkhovskiy, Arthur Filatenkov](https://github.com/yakov-olkhovskiy)). +* Update tzdata to 2022b to support the new timezone changes. See https://github.com/google/cctz/pull/226. Chile's 2022 DST start is delayed from September 4 to September 11. Iran plans to stop observing DST permanently, after it falls back on 2022-09-21. There are corrections of the historical time zone of Asia/Tehran in the year 1977: Iran adopted standard time in 1935, not 1946. In 1977 it observed DST from 03-21 23:00 to 10-20 24:00; its 1978 transitions were on 03-24 and 08-05, not 03-20 and 10-20; and its spring 1979 transition was on 05-27, not 03-21 (https://data.iana.org/time-zones/tzdb/NEWS). ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Former packages used to install systemd.service file to `/etc`. The files there are marked as `conf` and are not cleaned out, and not updated automatically. This PR cleans them out. [#39323](https://github.com/ClickHouse/ClickHouse/pull/39323) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Ensure LSan is effective. [#39430](https://github.com/ClickHouse/ClickHouse/pull/39430) ([Azat Khuzhin](https://github.com/azat)). +* TSAN has issues with clang-14 (https://github.com/google/sanitizers/issues/1552, https://github.com/google/sanitizers/issues/1540), so here we build the TSAN binaries with clang-15. [#39450](https://github.com/ClickHouse/ClickHouse/pull/39450) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove the option to build ClickHouse tools as separate executable programs. This fixes [#37847](https://github.com/ClickHouse/ClickHouse/issues/37847). [#39520](https://github.com/ClickHouse/ClickHouse/pull/39520) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Small preparations for build on s390x (which is big-endian). [#39627](https://github.com/ClickHouse/ClickHouse/pull/39627) ([Harry Lee](https://github.com/HarryLeeIBM)). [#39656](https://github.com/ClickHouse/ClickHouse/pull/39656) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed Endian issue in BitHelpers for s390x. [#39656](https://github.com/ClickHouse/ClickHouse/pull/39656) ([Harry Lee](https://github.com/HarryLeeIBM)). Implement a piece of code related to SipHash for s390x architecture (which is not supported by ClickHouse). [#39732](https://github.com/ClickHouse/ClickHouse/pull/39732) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed an Endian issue in Coordination snapshot code for s390x architecture (which is not supported by ClickHouse). [#39931](https://github.com/ClickHouse/ClickHouse/pull/39931) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed Endian issues in Codec code for s390x architecture (which is not supported by ClickHouse). [#40008](https://github.com/ClickHouse/ClickHouse/pull/40008) ([Harry Lee](https://github.com/HarryLeeIBM)). Fixed Endian issues in reading/writing BigEndian binary data in ReadHelpers and WriteHelpers code for s390x architecture (which is not supported by ClickHouse). [#40179](https://github.com/ClickHouse/ClickHouse/pull/40179) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Support build with `clang-16` (trunk). This closes [#39949](https://github.com/ClickHouse/ClickHouse/issues/39949). [#40181](https://github.com/ClickHouse/ClickHouse/pull/40181) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Prepare RISC-V 64 build to run in CI. This is for [#40141](https://github.com/ClickHouse/ClickHouse/issues/40141). [#40197](https://github.com/ClickHouse/ClickHouse/pull/40197) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Simplified function registration macro interface (`FUNCTION_REGISTER*`) to eliminate the step to add and call an extern function in the registerFunctions.cpp, it also makes incremental builds of a new function faster. [#38615](https://github.com/ClickHouse/ClickHouse/pull/38615) ([Li Yin](https://github.com/liyinsg)). +* Docker: Now entrypoint.sh in docker image creates and executes chown for all folders it found in config for multidisk setup [#17717](https://github.com/ClickHouse/ClickHouse/issues/17717). [#39121](https://github.com/ClickHouse/ClickHouse/pull/39121) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix +* Fix possible segfault in `CapnProto` input format. This bug was found and send through ClickHouse bug-bounty [program](https://github.com/ClickHouse/ClickHouse/issues/38986) by *kiojj*. [#40241](https://github.com/ClickHouse/ClickHouse/pull/40241) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a very rare case of incorrect behavior of array subscript operator. This closes [#28720](https://github.com/ClickHouse/ClickHouse/issues/28720). [#40185](https://github.com/ClickHouse/ClickHouse/pull/40185) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix insufficient argument check for encryption functions (found by query fuzzer). This closes [#39987](https://github.com/ClickHouse/ClickHouse/issues/39987). [#40194](https://github.com/ClickHouse/ClickHouse/pull/40194) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix the case when the order of columns can be incorrect if the `IN` operator is used with a table with `ENGINE = Set` containing multiple columns. This fixes [#13014](https://github.com/ClickHouse/ClickHouse/issues/13014). [#40225](https://github.com/ClickHouse/ClickHouse/pull/40225) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix seeking while reading from encrypted disk. This PR fixes [#38381](https://github.com/ClickHouse/ClickHouse/issues/38381). [#39687](https://github.com/ClickHouse/ClickHouse/pull/39687) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix duplicate columns in join plan. Finally, solve [#26809](https://github.com/ClickHouse/ClickHouse/issues/26809). [#40009](https://github.com/ClickHouse/ClickHouse/pull/40009) ([Vladimir C](https://github.com/vdimir)). +* Fixed query hanging for SELECT with ORDER BY WITH FILL with different date/time types. [#37849](https://github.com/ClickHouse/ClickHouse/pull/37849) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix ORDER BY that matches projections ORDER BY (before it simply returns unsorted result). [#38725](https://github.com/ClickHouse/ClickHouse/pull/38725) ([Azat Khuzhin](https://github.com/azat)). +* Do not optimise functions in GROUP BY statements if they shadow one of the table columns or expressions. Fixes [#37032](https://github.com/ClickHouse/ClickHouse/issues/37032). [#39103](https://github.com/ClickHouse/ClickHouse/pull/39103) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Fix wrong table name in logs after RENAME TABLE. This fixes [#38018](https://github.com/ClickHouse/ClickHouse/issues/38018). [#39227](https://github.com/ClickHouse/ClickHouse/pull/39227) ([Amos Bird](https://github.com/amosbird)). +* Fix positional arguments in case of columns pruning when optimising the query. Closes [#38433](https://github.com/ClickHouse/ClickHouse/issues/38433). [#39293](https://github.com/ClickHouse/ClickHouse/pull/39293) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug in schema inference in case of empty messages in Protobuf/CapnProto formats that allowed to create column with empty `Tuple` type. Closes [#39051](https://github.com/ClickHouse/ClickHouse/issues/39051) Add 2 new settings `input_format_{protobuf/capnproto}_skip_fields_with_unsupported_types_in_schema_inference` that allow to skip fields with unsupported types while schema inference for Protobuf and CapnProto formats. [#39357](https://github.com/ClickHouse/ClickHouse/pull/39357) ([Kruglov Pavel](https://github.com/Avogar)). +* (Window View is an experimental feature) Fix segmentation fault on `CREATE WINDOW VIEW .. ON CLUSTER ... INNER`. Closes [#39363](https://github.com/ClickHouse/ClickHouse/issues/39363). [#39384](https://github.com/ClickHouse/ClickHouse/pull/39384) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix WriteBuffer finalize when cancelling insert into function (in previous versions it may leat to std::terminate). [#39458](https://github.com/ClickHouse/ClickHouse/pull/39458) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix storing of columns of type `Object` in sparse serialization. [#39464](https://github.com/ClickHouse/ClickHouse/pull/39464) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible "Not found column in block" exception when using projections. This closes [#39469](https://github.com/ClickHouse/ClickHouse/issues/39469). [#39470](https://github.com/ClickHouse/ClickHouse/pull/39470) ([小路](https://github.com/nicelulu)). +* Fix exception on race between DROP and INSERT with materialized views. [#39477](https://github.com/ClickHouse/ClickHouse/pull/39477) ([Azat Khuzhin](https://github.com/azat)). +* A bug in Apache Avro library: fix data race and possible heap-buffer-overflow in Avro format. Closes [#39094](https://github.com/ClickHouse/ClickHouse/issues/39094) Closes [#33652](https://github.com/ClickHouse/ClickHouse/issues/33652). [#39498](https://github.com/ClickHouse/ClickHouse/pull/39498) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare bug in asynchronous reading (with setting `local_filesystem_read_method='pread_threadpool'`) with enabled `O_DIRECT` (enabled by setting `min_bytes_to_use_direct_io`). [#39506](https://github.com/ClickHouse/ClickHouse/pull/39506) ([Anton Popov](https://github.com/CurtizJ)). +* (only on FreeBSD) Fixes "Code: 49. DB::Exception: FunctionFactory: the function name '' is not unique. (LOGICAL_ERROR)" observed on FreeBSD when starting clickhouse. [#39551](https://github.com/ClickHouse/ClickHouse/pull/39551) ([Alexander Gololobov](https://github.com/davenger)). +* Fix bug with the recently introduced "maxsplit" argument for `splitByChar`, which was not working correctly. [#39552](https://github.com/ClickHouse/ClickHouse/pull/39552) ([filimonov](https://github.com/filimonov)). +* Fix bug in ASOF JOIN with `enable_optimize_predicate_expression`, close [#37813](https://github.com/ClickHouse/ClickHouse/issues/37813). [#39556](https://github.com/ClickHouse/ClickHouse/pull/39556) ([Vladimir C](https://github.com/vdimir)). +* Fixed `CREATE/DROP INDEX` query with `ON CLUSTER` or `Replicated` database and `ReplicatedMergeTree`. It used to be executed on all replicas (causing error or DDL queue stuck). Fixes [#39511](https://github.com/ClickHouse/ClickHouse/issues/39511). [#39565](https://github.com/ClickHouse/ClickHouse/pull/39565) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix "column not found" error for push down with join, close [#39505](https://github.com/ClickHouse/ClickHouse/issues/39505). [#39575](https://github.com/ClickHouse/ClickHouse/pull/39575) ([Vladimir C](https://github.com/vdimir)). +* Fix the wrong `REGEXP_REPLACE` alias. This fixes https://github.com/ClickHouse/ClickBench/issues/9. [#39592](https://github.com/ClickHouse/ClickHouse/pull/39592) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fixed point of origin for exponential decay window functions to the last value in window. Previously, decay was calculated by formula `exp((t - curr_row_t) / decay_length)`, which is incorrect when right boundary of window is not `CURRENT ROW`. It was changed to: `exp((t - last_row_t) / decay_length)`. There is no change in results for windows with `ROWS BETWEEN (smth) AND CURRENT ROW`. [#39593](https://github.com/ClickHouse/ClickHouse/pull/39593) ([Vladimir Chebotaryov](https://github.com/quickhouse)). +* Fix Decimal division overflow, which can be detected based on operands scale. [#39600](https://github.com/ClickHouse/ClickHouse/pull/39600) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix settings `output_format_arrow_string_as_string` and `output_format_arrow_low_cardinality_as_dictionary` work in combination. Closes [#39624](https://github.com/ClickHouse/ClickHouse/issues/39624). [#39647](https://github.com/ClickHouse/ClickHouse/pull/39647) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed a bug in default database resolution in distributed table reads. [#39674](https://github.com/ClickHouse/ClickHouse/pull/39674) ([Anton Kozlov](https://github.com/tonickkozlov)). +* (Only with the obsolete Ordinary databases) Select might read data of dropped table if cache for mmap IO is used and database engine is Ordinary and new tables was created with the same name as dropped one had. It's fixed. [#39708](https://github.com/ClickHouse/ClickHouse/pull/39708) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix possible error `Invalid column type for ColumnUnique::insertRangeFrom. Expected String, got ColumnLowCardinality` Fixes [#38460](https://github.com/ClickHouse/ClickHouse/issues/38460). [#39716](https://github.com/ClickHouse/ClickHouse/pull/39716) ([Arthur Passos](https://github.com/arthurpassos)). +* Field names in the `meta` section of JSON format were erroneously double escaped. This closes [#39693](https://github.com/ClickHouse/ClickHouse/issues/39693). [#39747](https://github.com/ClickHouse/ClickHouse/pull/39747) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix wrong index analysis with tuples and operator `IN`, which could lead to wrong query result. [#39752](https://github.com/ClickHouse/ClickHouse/pull/39752) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `EmbeddedRocksDB` tables filtering by key using params. [#39757](https://github.com/ClickHouse/ClickHouse/pull/39757) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix error `Invalid number of columns in chunk pushed to OutputPort` which was caused by ARRAY JOIN optimization. Fixes [#39164](https://github.com/ClickHouse/ClickHouse/issues/39164). [#39799](https://github.com/ClickHouse/ClickHouse/pull/39799) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* A workaround for a bug in Linux kernel. Fix `CANNOT_READ_ALL_DATA` exception with `local_filesystem_read_method=pread_threadpool`. This bug affected only Linux kernel version 5.9 and 5.10 according to [man](https://manpages.debian.org/testing/manpages-dev/preadv2.2.en.html#BUGS). [#39800](https://github.com/ClickHouse/ClickHouse/pull/39800) ([Anton Popov](https://github.com/CurtizJ)). +* (Only on NFS) Fix broken NFS mkdir for root-squashed volumes. [#39898](https://github.com/ClickHouse/ClickHouse/pull/39898) ([Constantine Peresypkin](https://github.com/pkit)). +* Remove dictionaries from prometheus metrics on DETACH/DROP. [#39926](https://github.com/ClickHouse/ClickHouse/pull/39926) ([Azat Khuzhin](https://github.com/azat)). +* Fix read of StorageFile with virtual columns. Closes [#39907](https://github.com/ClickHouse/ClickHouse/issues/39907). [#39943](https://github.com/ClickHouse/ClickHouse/pull/39943) ([flynn](https://github.com/ucasfl)). +* Fix big memory usage during fetches. Fixes [#39915](https://github.com/ClickHouse/ClickHouse/issues/39915). [#39990](https://github.com/ClickHouse/ClickHouse/pull/39990) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* (experimental feature) Fix `hashId` crash and salt parameter not being used. [#40002](https://github.com/ClickHouse/ClickHouse/pull/40002) ([Raúl Marín](https://github.com/Algunenano)). +* `EXCEPT` and `INTERSECT` operators may lead to crash if a specific combination of constant and non-constant columns were used. [#40020](https://github.com/ClickHouse/ClickHouse/pull/40020) ([Duc Canh Le](https://github.com/canhld94)). +* Fixed "Part directory doesn't exist" and "`tmp_` ... No such file or directory" errors during too slow INSERT or too long merge/mutation. Also fixed issue that may cause some replication queue entries to stuck without any errors or warnings in logs if previous attempt to fetch part failed, but `tmp-fetch_` directory was not cleaned up. [#40031](https://github.com/ClickHouse/ClickHouse/pull/40031) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix rare cases of parsing of arrays of tuples in format `Values`. [#40034](https://github.com/ClickHouse/ClickHouse/pull/40034) ([Anton Popov](https://github.com/CurtizJ)). +* Fixes ArrowColumn format Dictionary(X) & Dictionary(Nullable(X)) conversion to ClickHouse LowCardinality(X) & LowCardinality(Nullable(X)) respectively. [#40037](https://github.com/ClickHouse/ClickHouse/pull/40037) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix potential deadlock in writing to S3 during task scheduling failure. [#40070](https://github.com/ClickHouse/ClickHouse/pull/40070) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix bug in collectFilesToSkip() by adding correct file extension (.idx or idx2) for indexes to be recalculated, avoid wrong hard links. Fixed [#39896](https://github.com/ClickHouse/ClickHouse/issues/39896). [#40095](https://github.com/ClickHouse/ClickHouse/pull/40095) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* A fix for reverse DNS resolution. [#40134](https://github.com/ClickHouse/ClickHouse/pull/40134) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix unexpected result `arrayDifference` of `Array(UInt32). [#40211](https://github.com/ClickHouse/ClickHouse/pull/40211) ([Duc Canh Le](https://github.com/canhld94)). + + +### ClickHouse release 22.7, 2022-07-21 + +#### Upgrade Notes +* Enable setting `enable_positional_arguments` by default. It allows queries like `SELECT ... ORDER BY 1, 2` where 1, 2 are the references to the select clause. If you need to return the old behavior, disable this setting. [#38204](https://github.com/ClickHouse/ClickHouse/pull/38204) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable `format_csv_allow_single_quotes` by default. See [#37096](https://github.com/ClickHouse/ClickHouse/issues/37096). ([Kruglov Pavel](https://github.com/Avogar)). +* `Ordinary` database engine and old storage definition syntax for `*MergeTree` tables are deprecated. By default it's not possible to create new databases with `Ordinary` engine. If `system` database has `Ordinary` engine it will be automatically converted to `Atomic` on server startup. There are settings to keep old behavior (`allow_deprecated_database_ordinary` and `allow_deprecated_syntax_for_merge_tree`), but these settings may be removed in future releases. [#38335](https://github.com/ClickHouse/ClickHouse/pull/38335) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Force rewriting comma join to inner by default (set default value `cross_to_inner_join_rewrite = 2`). To have old behavior set `cross_to_inner_join_rewrite = 1`. [#39326](https://github.com/ClickHouse/ClickHouse/pull/39326) ([Vladimir C](https://github.com/vdimir)). If you will face any incompatibilities, you can turn this setting back. + +#### New Feature +* Support expressions with window functions. Closes [#19857](https://github.com/ClickHouse/ClickHouse/issues/19857). [#37848](https://github.com/ClickHouse/ClickHouse/pull/37848) ([Dmitry Novik](https://github.com/novikd)). +* Add new `direct` join algorithm for `EmbeddedRocksDB` tables, see [#33582](https://github.com/ClickHouse/ClickHouse/issues/33582). [#35363](https://github.com/ClickHouse/ClickHouse/pull/35363) ([Vladimir C](https://github.com/vdimir)). +* Added full sorting merge join algorithm. [#35796](https://github.com/ClickHouse/ClickHouse/pull/35796) ([Vladimir C](https://github.com/vdimir)). +* Implement NATS table engine, which allows to pub/sub to NATS. Closes [#32388](https://github.com/ClickHouse/ClickHouse/issues/32388). [#37171](https://github.com/ClickHouse/ClickHouse/pull/37171) ([tchepavel](https://github.com/tchepavel)). ([Kseniia Sumarokova](https://github.com/kssenii)) +* Implement table function `mongodb`. Allow writes into `MongoDB` storage / table function. [#37213](https://github.com/ClickHouse/ClickHouse/pull/37213) ([aaapetrenko](https://github.com/aaapetrenko)). ([Kseniia Sumarokova](https://github.com/kssenii)) +* Add `SQLInsert` output format. Closes [#38441](https://github.com/ClickHouse/ClickHouse/issues/38441). [#38477](https://github.com/ClickHouse/ClickHouse/pull/38477) ([Kruglov Pavel](https://github.com/Avogar)). +* Introduced settings `additional_table_filters`. Using this setting, you can specify additional filtering condition for a table which will be applied directly after reading. Example: `select number, x, y from (select number from system.numbers limit 5) f any left join (select x, y from table_1) s on f.number = s.x settings additional_table_filters={'system.numbers : 'number != 3', 'table_1' : 'x != 2'}`. Introduced setting `additional_result_filter` which specifies additional filtering condition for query result. Closes [#37918](https://github.com/ClickHouse/ClickHouse/issues/37918). [#38475](https://github.com/ClickHouse/ClickHouse/pull/38475) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add `compatibility` setting and `system.settings_changes` system table that contains information about changes in settings through ClickHouse versions. Closes [#35972](https://github.com/ClickHouse/ClickHouse/issues/35972). [#38957](https://github.com/ClickHouse/ClickHouse/pull/38957) ([Kruglov Pavel](https://github.com/Avogar)). +* Add functions `translate(string, from_string, to_string)` and `translateUTF8(string, from_string, to_string)`. It translates some characters to another. [#38935](https://github.com/ClickHouse/ClickHouse/pull/38935) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support `parseTimeDelta` function. It can be used like ` ;-+,:` can be used as separators, eg. `1yr-2mo`, `2m:6s`: `SELECT parseTimeDelta('1yr-2mo-4w + 12 days, 3 hours : 1 minute ; 33 seconds')`. [#39071](https://github.com/ClickHouse/ClickHouse/pull/39071) ([jiahui-97](https://github.com/jiahui-97)). +* Added `CREATE TABLE ... EMPTY AS SELECT` query. It automatically deduces table structure from the SELECT query, but does not fill the table after creation. Resolves [#38049](https://github.com/ClickHouse/ClickHouse/issues/38049). [#38272](https://github.com/ClickHouse/ClickHouse/pull/38272) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Added options to limit IO operations with remote storage: `max_remote_read_network_bandwidth_for_server` and `max_remote_write_network_bandwidth_for_server`. [#39095](https://github.com/ClickHouse/ClickHouse/pull/39095) ([Sergei Trifonov](https://github.com/serxa)). +* Add `group_by_use_nulls` setting to make aggregation key columns nullable in the case of ROLLUP, CUBE and GROUPING SETS. Closes [#37359](https://github.com/ClickHouse/ClickHouse/issues/37359). [#38642](https://github.com/ClickHouse/ClickHouse/pull/38642) ([Dmitry Novik](https://github.com/novikd)). +* Add the ability to specify compression level during data export. [#38907](https://github.com/ClickHouse/ClickHouse/pull/38907) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add an option to require explicit grants to SELECT from the `system` database. Details: [#38970](https://github.com/ClickHouse/ClickHouse/pull/38970) ([Vitaly Baranov](https://github.com/vitlibar)). +* Functions `multiMatchAny`, `multiMatchAnyIndex`, `multiMatchAllIndices` and their fuzzy variants now accept non-const pattern array argument. [#38485](https://github.com/ClickHouse/ClickHouse/pull/38485) ([Robert Schulze](https://github.com/rschu1ze)). SQL function `multiSearchAllPositions` now accepts non-const needle arguments. [#39167](https://github.com/ClickHouse/ClickHouse/pull/39167) ([Robert Schulze](https://github.com/rschu1ze)). +* Add a setting `zstd_window_log_max` to configure max memory usage on zstd decoding when importing external files. Closes [#35693](https://github.com/ClickHouse/ClickHouse/issues/35693). [#37015](https://github.com/ClickHouse/ClickHouse/pull/37015) ([wuxiaobai24](https://github.com/wuxiaobai24)). +* Add `send_logs_source_regexp` setting. Send server text logs with specified regexp to match log source name. Empty means all sources. [#39161](https://github.com/ClickHouse/ClickHouse/pull/39161) ([Amos Bird](https://github.com/amosbird)). +* Support `ALTER` for `Hive` tables. [#38214](https://github.com/ClickHouse/ClickHouse/pull/38214) ([lgbo](https://github.com/lgbo-ustc)). +* Support `isNullable` function. This function checks whether it's argument is nullable and return 1 or 0. Closes [#38611](https://github.com/ClickHouse/ClickHouse/issues/38611). [#38841](https://github.com/ClickHouse/ClickHouse/pull/38841) ([lokax](https://github.com/lokax)). +* Added functions for base58 encoding/decoding. [#38159](https://github.com/ClickHouse/ClickHouse/pull/38159) ([Andrey Zvonov](https://github.com/zvonand)). +* Add chart visualization to Play UI. [#38197](https://github.com/ClickHouse/ClickHouse/pull/38197) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added L2 Squared distance and norm functions for both arrays and tuples. [#38545](https://github.com/ClickHouse/ClickHouse/pull/38545) ([Julian Gilyadov](https://github.com/israelg99)). +* Add ability to pass HTTP headers to the `url` table function / storage via SQL. Closes [#37897](https://github.com/ClickHouse/ClickHouse/issues/37897). [#38176](https://github.com/ClickHouse/ClickHouse/pull/38176) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `clickhouse-diagnostics` binary to the packages. [#38647](https://github.com/ClickHouse/ClickHouse/pull/38647) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Experimental Feature +* Adds new setting `implicit_transaction` to run standalone queries inside a transaction. It handles both creation and closing (via COMMIT if the query succeeded or ROLLBACK if it didn't) of the transaction automatically. [#38344](https://github.com/ClickHouse/ClickHouse/pull/38344) ([Raúl Marín](https://github.com/Algunenano)). + +#### Performance Improvement +* Distinct optimization for sorted columns. Use specialized distinct transformation in case input stream is sorted by column(s) in distinct. Optimization can be applied to pre-distinct, final distinct, or both. Initial implementation by @dimarub2000. [#37803](https://github.com/ClickHouse/ClickHouse/pull/37803) ([Igor Nikonov](https://github.com/devcrafter)). +* Improve performance of `ORDER BY`, `MergeTree` merges, window functions using batch version of `BinaryHeap`. [#38022](https://github.com/ClickHouse/ClickHouse/pull/38022) ([Maksim Kita](https://github.com/kitaisreal)). +* More parallel execution for queries with `FINAL` [#36396](https://github.com/ClickHouse/ClickHouse/pull/36396) ([Nikita Taranov](https://github.com/nickitat)). +* Fix significant join performance regression which was introduced in [#35616](https://github.com/ClickHouse/ClickHouse/pull/35616). It's interesting that common join queries such as ssb queries have been 10 times slower for almost 3 months while no one complains. [#38052](https://github.com/ClickHouse/ClickHouse/pull/38052) ([Amos Bird](https://github.com/amosbird)). +* Migrate from the Intel hyperscan library to vectorscan, this speeds up many string matching on non-x86 platforms. [#38171](https://github.com/ClickHouse/ClickHouse/pull/38171) ([Robert Schulze](https://github.com/rschu1ze)). +* Increased parallelism of query plan steps executed after aggregation. [#38295](https://github.com/ClickHouse/ClickHouse/pull/38295) ([Nikita Taranov](https://github.com/nickitat)). +* Improve performance of insertion to columns of type `JSON`. [#38320](https://github.com/ClickHouse/ClickHouse/pull/38320) ([Anton Popov](https://github.com/CurtizJ)). +* Optimized insertion and lookups in the HashTable. [#38413](https://github.com/ClickHouse/ClickHouse/pull/38413) ([Nikita Taranov](https://github.com/nickitat)). +* Fix performance degradation from [#32493](https://github.com/ClickHouse/ClickHouse/issues/32493). [#38417](https://github.com/ClickHouse/ClickHouse/pull/38417) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve performance of joining with numeric columns using SIMD instructions. [#37235](https://github.com/ClickHouse/ClickHouse/pull/37235) ([zzachimed](https://github.com/zzachimed)). [#38565](https://github.com/ClickHouse/ClickHouse/pull/38565) ([Maksim Kita](https://github.com/kitaisreal)). +* Norm and Distance functions for arrays speed up 1.2-2 times. [#38740](https://github.com/ClickHouse/ClickHouse/pull/38740) ([Alexander Gololobov](https://github.com/davenger)). +* Add AVX-512 VBMI optimized `copyOverlap32Shuffle` for LZ4 decompression. In other words, LZ4 decompression performance is improved. [#37891](https://github.com/ClickHouse/ClickHouse/pull/37891) ([Guo Wangyang](https://github.com/guowangy)). +* `ORDER BY (a, b)` will use all the same benefits as `ORDER BY a, b`. [#38873](https://github.com/ClickHouse/ClickHouse/pull/38873) ([Igor Nikonov](https://github.com/devcrafter)). +* Align branches within a 32B boundary to make benchmark more stable. [#38988](https://github.com/ClickHouse/ClickHouse/pull/38988) ([Guo Wangyang](https://github.com/guowangy)). It improves performance 1..2% on average for Intel. +* Executable UDF, executable dictionaries, and Executable tables will avoid wasting one second during wait for subprocess termination. [#38929](https://github.com/ClickHouse/ClickHouse/pull/38929) ([Constantine Peresypkin](https://github.com/pkit)). +* Optimize accesses to `system.stack_trace` table if not all columns are selected. [#39177](https://github.com/ClickHouse/ClickHouse/pull/39177) ([Azat Khuzhin](https://github.com/azat)). +* Improve isNullable/isConstant/isNull/isNotNull performance for LowCardinality argument. [#39192](https://github.com/ClickHouse/ClickHouse/pull/39192) ([Kruglov Pavel](https://github.com/Avogar)). +* Optimized processing of ORDER BY in window functions. [#34632](https://github.com/ClickHouse/ClickHouse/pull/34632) ([Vladimir Chebotarev](https://github.com/excitoon)). +* The table `system.asynchronous_metric_log` is further optimized for storage space. This closes [#38134](https://github.com/ClickHouse/ClickHouse/issues/38134). See the [YouTube video](https://www.youtube.com/watch?v=0fSp9SF8N8A). [#38428](https://github.com/ClickHouse/ClickHouse/pull/38428) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Improvement +* Support SQL standard CREATE INDEX and DROP INDEX syntax. [#35166](https://github.com/ClickHouse/ClickHouse/pull/35166) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Send profile events for INSERT queries (previously only SELECT was supported). [#37391](https://github.com/ClickHouse/ClickHouse/pull/37391) ([Azat Khuzhin](https://github.com/azat)). +* Implement in order aggregation (`optimize_aggregation_in_order`) for fully materialized projections. [#37469](https://github.com/ClickHouse/ClickHouse/pull/37469) ([Azat Khuzhin](https://github.com/azat)). +* Remove subprocess run for kerberos initialization. Added new integration test. Closes [#27651](https://github.com/ClickHouse/ClickHouse/issues/27651). [#38105](https://github.com/ClickHouse/ClickHouse/pull/38105) ([Roman Vasin](https://github.com/rvasin)). +* * Add setting `multiple_joins_try_to_keep_original_names` to not rewrite identifier name on multiple JOINs rewrite, close [#34697](https://github.com/ClickHouse/ClickHouse/issues/34697). [#38149](https://github.com/ClickHouse/ClickHouse/pull/38149) ([Vladimir C](https://github.com/vdimir)). +* Improved trace-visualizer UX. [#38169](https://github.com/ClickHouse/ClickHouse/pull/38169) ([Sergei Trifonov](https://github.com/serxa)). +* Enable stack trace collection and query profiler for AArch64. [#38181](https://github.com/ClickHouse/ClickHouse/pull/38181) ([Maksim Kita](https://github.com/kitaisreal)). +* Do not skip symlinks in `user_defined` directory during SQL user defined functions loading. Closes [#38042](https://github.com/ClickHouse/ClickHouse/issues/38042). [#38184](https://github.com/ClickHouse/ClickHouse/pull/38184) ([Maksim Kita](https://github.com/kitaisreal)). +* Added background cleanup of subdirectories in `store/`. In some cases clickhouse-server might left garbage subdirectories in `store/` (for example, on unsuccessful table creation) and those dirs were never been removed. Fixes [#33710](https://github.com/ClickHouse/ClickHouse/issues/33710). [#38265](https://github.com/ClickHouse/ClickHouse/pull/38265) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add `DESCRIBE CACHE` query to show cache settings from config. Add `SHOW CACHES` query to show available filesystem caches list. [#38279](https://github.com/ClickHouse/ClickHouse/pull/38279) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add access check for `system drop filesystem cache`. Support ON CLUSTER. [#38319](https://github.com/ClickHouse/ClickHouse/pull/38319) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix PostgreSQL database engine incompatibility on upgrade from 21.3 to 22.3. Closes [#36659](https://github.com/ClickHouse/ClickHouse/issues/36659). [#38369](https://github.com/ClickHouse/ClickHouse/pull/38369) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `filesystemAvailable` and similar functions now work in `clickhouse-local`. This closes [#38423](https://github.com/ClickHouse/ClickHouse/issues/38423). [#38424](https://github.com/ClickHouse/ClickHouse/pull/38424) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `revision` function. [#38555](https://github.com/ClickHouse/ClickHouse/pull/38555) ([Azat Khuzhin](https://github.com/azat)). +* Fix GCS via proxy tunnel usage. [#38726](https://github.com/ClickHouse/ClickHouse/pull/38726) ([Azat Khuzhin](https://github.com/azat)). +* Support `\i file` in clickhouse client / local (similar to psql \i). [#38813](https://github.com/ClickHouse/ClickHouse/pull/38813) ([Kseniia Sumarokova](https://github.com/kssenii)). +* New option `optimize = 1` in `EXPLAIN AST`. If enabled, it shows AST after it's rewritten, otherwise AST of original query. Disabled by default. [#38910](https://github.com/ClickHouse/ClickHouse/pull/38910) ([Igor Nikonov](https://github.com/devcrafter)). +* Allow trailing comma in columns list. closes [#38425](https://github.com/ClickHouse/ClickHouse/issues/38425). [#38440](https://github.com/ClickHouse/ClickHouse/pull/38440) ([chen](https://github.com/xiedeyantu)). +* Bugfixes and performance improvements for `parallel_hash` JOIN method. [#37648](https://github.com/ClickHouse/ClickHouse/pull/37648) ([Vladimir C](https://github.com/vdimir)). +* Support hadoop secure RPC transfer (hadoop.rpc.protection=privacy and hadoop.rpc.protection=integrity). [#37852](https://github.com/ClickHouse/ClickHouse/pull/37852) ([Peng Liu](https://github.com/michael1589)). +* Add struct type support in `StorageHive`. [#38118](https://github.com/ClickHouse/ClickHouse/pull/38118) ([lgbo](https://github.com/lgbo-ustc)). +* S3 single objects are now removed with `RemoveObjectRequest`. Implement compatibility with GCP which did not allow to use `removeFileIfExists` effectively breaking approximately half of `remove` functionality. Automatic detection for `DeleteObjects` S3 API, that is not supported by GCS. This will allow to use GCS without explicit `support_batch_delete=0` in configuration. [#37882](https://github.com/ClickHouse/ClickHouse/pull/37882) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Expose basic ClickHouse Keeper related monitoring data (via ProfileEvents and CurrentMetrics). [#38072](https://github.com/ClickHouse/ClickHouse/pull/38072) ([lingpeng0314](https://github.com/lingpeng0314)). +* Support `auto_close` option for PostgreSQL engine connection. Closes [#31486](https://github.com/ClickHouse/ClickHouse/issues/31486). [#38363](https://github.com/ClickHouse/ClickHouse/pull/38363) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow `NULL` modifier in columns declaration for table functions. [#38816](https://github.com/ClickHouse/ClickHouse/pull/38816) ([Kruglov Pavel](https://github.com/Avogar)). +* Deactivate `mutations_finalizing_task` before shutdown to avoid benign `TABLE_IS_READ_ONLY` errors during shutdown. [#38851](https://github.com/ClickHouse/ClickHouse/pull/38851) ([Raúl Marín](https://github.com/Algunenano)). +* Eliminate unnecessary waiting of SELECT queries after ALTER queries in presence of INSERT queries if you use deprecated Ordinary databases. [#38864](https://github.com/ClickHouse/ClickHouse/pull/38864) ([Azat Khuzhin](https://github.com/azat)). +* New option `rewrite` in `EXPLAIN AST`. If enabled, it shows AST after it's rewritten, otherwise AST of original query. Disabled by default. [#38910](https://github.com/ClickHouse/ClickHouse/pull/38910) ([Igor Nikonov](https://github.com/devcrafter)). +* Stop reporting Zookeeper "Node exists" exceptions in system.errors when they are expected. [#38961](https://github.com/ClickHouse/ClickHouse/pull/38961) ([Raúl Marín](https://github.com/Algunenano)). +* `clickhouse-keeper`: add support for real-time digest calculation and verification. It is disabled by default. [#37555](https://github.com/ClickHouse/ClickHouse/pull/37555) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow to specify globs `* or {expr1, expr2, expr3}` inside a key for `clickhouse-extract-from-config` tool. [#38966](https://github.com/ClickHouse/ClickHouse/pull/38966) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* clearOldLogs: Don't report KEEPER_EXCEPTION on concurrent deletes. [#39016](https://github.com/ClickHouse/ClickHouse/pull/39016) ([Raúl Marín](https://github.com/Algunenano)). +* clickhouse-keeper improvement: persist meta-information about keeper servers to disk. [#39069](https://github.com/ClickHouse/ClickHouse/pull/39069) ([Antonio Andelic](https://github.com/antonio2368)). This will make it easier to operate if you shutdown or restart all keeper nodes at the same time. +* Continue without exception when running out of disk space when using filesystem cache. [#39106](https://github.com/ClickHouse/ClickHouse/pull/39106) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Handling SIGTERM signals from k8s. [#39130](https://github.com/ClickHouse/ClickHouse/pull/39130) ([Timur Solodovnikov](https://github.com/tsolodov)). +* Add `merge_algorithm` column (Undecided, Horizontal, Vertical) to system.part_log. [#39181](https://github.com/ClickHouse/ClickHouse/pull/39181) ([Azat Khuzhin](https://github.com/azat)). +* Don't increment a counter in `system.errors` when the disk is not rotational. [#39216](https://github.com/ClickHouse/ClickHouse/pull/39216) ([Raúl Marín](https://github.com/Algunenano)). +* The metric `result_bytes` for `INSERT` queries in `system.query_log` shows number of bytes inserted. Previously value was incorrect and stored the same value as `result_rows`. [#39225](https://github.com/ClickHouse/ClickHouse/pull/39225) ([Ilya Yatsishin](https://github.com/qoega)). +* The CPU usage metric in clickhouse-client will be displayed in a better way. Fixes [#38756](https://github.com/ClickHouse/ClickHouse/issues/38756). [#39280](https://github.com/ClickHouse/ClickHouse/pull/39280) ([Sergei Trifonov](https://github.com/serxa)). +* Rethrow exception on filesystem cache initialization on server startup, better error message. [#39386](https://github.com/ClickHouse/ClickHouse/pull/39386) ([Kseniia Sumarokova](https://github.com/kssenii)). +* OpenTelemetry now collects traces without Processors spans by default (there are too many). To enable Processors spans collection `opentelemetry_trace_processors` setting. [#39170](https://github.com/ClickHouse/ClickHouse/pull/39170) ([Ilya Yatsishin](https://github.com/qoega)). +* Functions `multiMatch[Fuzzy](AllIndices/Any/AnyIndex)` - don't throw a logical error if the needle argument is empty. [#39012](https://github.com/ClickHouse/ClickHouse/pull/39012) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow to declare `RabbitMQ` queue without default arguments `x-max-length` and `x-overflow`. [#39259](https://github.com/ClickHouse/ClickHouse/pull/39259) ([rnbondarenko](https://github.com/rnbondarenko)). + +#### Build/Testing/Packaging Improvement +* Apply Clang Thread Safety Analysis (TSA) annotations to ClickHouse. [#38068](https://github.com/ClickHouse/ClickHouse/pull/38068) ([Robert Schulze](https://github.com/rschu1ze)). +* Adapt universal installation script for FreeBSD. [#39302](https://github.com/ClickHouse/ClickHouse/pull/39302) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Preparation for building on `s390x` platform. [#39193](https://github.com/ClickHouse/ClickHouse/pull/39193) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Fix a bug in `jemalloc` library [#38757](https://github.com/ClickHouse/ClickHouse/pull/38757) ([Azat Khuzhin](https://github.com/azat)). +* Hardware benchmark now has support for automatic results uploading. [#38427](https://github.com/ClickHouse/ClickHouse/pull/38427) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* System table "system.licenses" is now correctly populated on Mac (Darwin). [#38294](https://github.com/ClickHouse/ClickHouse/pull/38294) ([Robert Schulze](https://github.com/rschu1ze)). +* Change `all|noarch` packages to architecture-dependent - Fix some documentation for it - Push aarch64|arm64 packages to artifactory and release assets - Fixes [#36443](https://github.com/ClickHouse/ClickHouse/issues/36443). [#38580](https://github.com/ClickHouse/ClickHouse/pull/38580) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) +* Fix rounding for `Decimal128/Decimal256` with more than 19-digits long scale. [#38027](https://github.com/ClickHouse/ClickHouse/pull/38027) ([Igor Nikonov](https://github.com/devcrafter)). +* Fixed crash caused by data race in storage `Hive` (integration table engine). [#38887](https://github.com/ClickHouse/ClickHouse/pull/38887) ([lgbo](https://github.com/lgbo-ustc)). +* Fix crash when executing GRANT ALL ON *.* with ON CLUSTER. It was broken in https://github.com/ClickHouse/ClickHouse/pull/35767. This closes [#38618](https://github.com/ClickHouse/ClickHouse/issues/38618). [#38674](https://github.com/ClickHouse/ClickHouse/pull/38674) ([Vitaly Baranov](https://github.com/vitlibar)). +* Correct glob expansion in case of `{0..10}` forms. Fixes [#38498](https://github.com/ClickHouse/ClickHouse/issues/38498) Current Implementation is similar to what shell does mentiond by @rschu1ze [here](https://github.com/ClickHouse/ClickHouse/pull/38502#issuecomment-1169057723). [#38502](https://github.com/ClickHouse/ClickHouse/pull/38502) ([Heena Bansal](https://github.com/HeenaBansal2009)). +* Fix crash for `mapUpdate`, `mapFilter` functions when using with constant map argument. Closes [#38547](https://github.com/ClickHouse/ClickHouse/issues/38547). [#38553](https://github.com/ClickHouse/ClickHouse/pull/38553) ([hexiaoting](https://github.com/hexiaoting)). +* Fix `toHour` monotonicity information for query optimization which can lead to incorrect query result (incorrect index analysis). This fixes [#38333](https://github.com/ClickHouse/ClickHouse/issues/38333). [#38675](https://github.com/ClickHouse/ClickHouse/pull/38675) ([Amos Bird](https://github.com/amosbird)). +* Fix checking whether s3 storage support parallel writes. It resulted in s3 parallel writes not working. [#38792](https://github.com/ClickHouse/ClickHouse/pull/38792) ([chen](https://github.com/xiedeyantu)). +* Fix s3 seekable reads with parallel read buffer. (Affected memory usage during query). Closes [#38258](https://github.com/ClickHouse/ClickHouse/issues/38258). [#38802](https://github.com/ClickHouse/ClickHouse/pull/38802) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Update `simdjson`. This fixes [#38621](https://github.com/ClickHouse/ClickHouse/issues/38621) - a buffer overflow on machines with the latest Intel CPUs with AVX-512 VBMI. [#38838](https://github.com/ClickHouse/ClickHouse/pull/38838) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix possible logical error for Vertical merges. [#38859](https://github.com/ClickHouse/ClickHouse/pull/38859) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix settings profile with seconds unit. [#38896](https://github.com/ClickHouse/ClickHouse/pull/38896) ([Raúl Marín](https://github.com/Algunenano)). +* Fix incorrect partition pruning when there is a nullable partition key. Note: most likely you don't use nullable partition keys - this is an obscure feature you should not use. Nullable keys are a nonsense and this feature is only needed for some crazy use-cases. This fixes [#38941](https://github.com/ClickHouse/ClickHouse/issues/38941). [#38946](https://github.com/ClickHouse/ClickHouse/pull/38946) ([Amos Bird](https://github.com/amosbird)). +* Improve `fsync_part_directory` for fetches. [#38993](https://github.com/ClickHouse/ClickHouse/pull/38993) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible dealock inside `OvercommitTracker`. Fixes [#37794](https://github.com/ClickHouse/ClickHouse/issues/37794). [#39030](https://github.com/ClickHouse/ClickHouse/pull/39030) ([Dmitry Novik](https://github.com/novikd)). +* Fix bug in filesystem cache that could happen in some corner case which coincided with cache capacity hitting the limit. Closes [#39066](https://github.com/ClickHouse/ClickHouse/issues/39066). [#39070](https://github.com/ClickHouse/ClickHouse/pull/39070) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix some corner cases of interpretation of the arguments of window expressions. Fixes [#38538](https://github.com/ClickHouse/ClickHouse/issues/38538) Allow using of higher-order functions in window expressions. [#39112](https://github.com/ClickHouse/ClickHouse/pull/39112) ([Dmitry Novik](https://github.com/novikd)). +* Keep `LowCardinality` type in `tuple` function. Previously `LowCardinality` type was dropped and elements of created tuple had underlying type of `LowCardinality`. [#39113](https://github.com/ClickHouse/ClickHouse/pull/39113) ([Anton Popov](https://github.com/CurtizJ)). +* Fix error `Block structure mismatch` which could happen for INSERT into table with attached MATERIALIZED VIEW and enabled setting `extremes = 1`. Closes [#29759](https://github.com/ClickHouse/ClickHouse/issues/29759) and [#38729](https://github.com/ClickHouse/ClickHouse/issues/38729). [#39125](https://github.com/ClickHouse/ClickHouse/pull/39125) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix unexpected query result when both `optimize_trivial_count_query` and `empty_result_for_aggregation_by_empty_set` are set to true. This fixes [#39140](https://github.com/ClickHouse/ClickHouse/issues/39140). [#39155](https://github.com/ClickHouse/ClickHouse/pull/39155) ([Amos Bird](https://github.com/amosbird)). +* Fixed error `Not found column Type in block` in selects with `PREWHERE` and read-in-order optimizations. [#39157](https://github.com/ClickHouse/ClickHouse/pull/39157) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix extremely rare race condition in during hardlinks for remote filesystem. The only way to reproduce it is concurrent run of backups. [#39190](https://github.com/ClickHouse/ClickHouse/pull/39190) ([alesapin](https://github.com/alesapin)). +* (zero-copy replication is an experimental feature that should not be used in production) Fix fetch of in-memory part with `allow_remote_fs_zero_copy_replication`. [#39214](https://github.com/ClickHouse/ClickHouse/pull/39214) ([Azat Khuzhin](https://github.com/azat)). +* (MaterializedPostgreSQL - experimental feature). Fix segmentation fault in MaterializedPostgreSQL database engine, which could happen if some exception occurred at replication initialisation. Closes [#36939](https://github.com/ClickHouse/ClickHouse/issues/36939). [#39272](https://github.com/ClickHouse/ClickHouse/pull/39272) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix incorrect fetch of table metadata from PostgreSQL database engine. Closes [#33502](https://github.com/ClickHouse/ClickHouse/issues/33502). [#39283](https://github.com/ClickHouse/ClickHouse/pull/39283) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix projection exception when aggregation keys are wrapped inside other functions. This fixes [#37151](https://github.com/ClickHouse/ClickHouse/issues/37151). [#37155](https://github.com/ClickHouse/ClickHouse/pull/37155) ([Amos Bird](https://github.com/amosbird)). +* Fix possible logical error `... with argument with type Nothing and default implementation for Nothing is expected to return result with type Nothing, got ...` in some functions. Closes: [#37610](https://github.com/ClickHouse/ClickHouse/issues/37610) Closes: [#37741](https://github.com/ClickHouse/ClickHouse/issues/37741). [#37759](https://github.com/ClickHouse/ClickHouse/pull/37759) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix incorrect columns order in subqueries of UNION (in case of duplicated columns in subselects may produce incorrect result). [#37887](https://github.com/ClickHouse/ClickHouse/pull/37887) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect work of MODIFY ALTER Column with column names that contain dots. Closes [#37907](https://github.com/ClickHouse/ClickHouse/issues/37907). [#37971](https://github.com/ClickHouse/ClickHouse/pull/37971) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading of sparse columns from `MergeTree` tables that store their data in S3. [#37978](https://github.com/ClickHouse/ClickHouse/pull/37978) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible crash in `Distributed` async insert in case of removing a replica from config. [#38029](https://github.com/ClickHouse/ClickHouse/pull/38029) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix "Missing columns" for GLOBAL JOIN with CTE without alias. [#38056](https://github.com/ClickHouse/ClickHouse/pull/38056) ([Azat Khuzhin](https://github.com/azat)). +* Rewrite tuple functions as literals in backwards-compatibility mode. [#38096](https://github.com/ClickHouse/ClickHouse/pull/38096) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Fix redundant memory reservation for output block during `ORDER BY`. [#38127](https://github.com/ClickHouse/ClickHouse/pull/38127) ([iyupeng](https://github.com/iyupeng)). +* Fix possible logical error `Bad cast from type DB::IColumn* to DB::ColumnNullable*` in array mapped functions. Closes [#38006](https://github.com/ClickHouse/ClickHouse/issues/38006). [#38132](https://github.com/ClickHouse/ClickHouse/pull/38132) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix temporary name clash in partial merge join, close [#37928](https://github.com/ClickHouse/ClickHouse/issues/37928). [#38135](https://github.com/ClickHouse/ClickHouse/pull/38135) ([Vladimir C](https://github.com/vdimir)). +* Some minr issue with queries like `CREATE TABLE nested_name_tuples (`a` Tuple(x String, y Tuple(i Int32, j String))) ENGINE = Memory;` [#38136](https://github.com/ClickHouse/ClickHouse/pull/38136) ([lgbo](https://github.com/lgbo-ustc)). +* Fix bug with nested short-circuit functions that led to execution of arguments even if condition is false. Closes [#38040](https://github.com/ClickHouse/ClickHouse/issues/38040). [#38173](https://github.com/ClickHouse/ClickHouse/pull/38173) ([Kruglov Pavel](https://github.com/Avogar)). +* (Window View is a experimental feature) Fix LOGICAL_ERROR for WINDOW VIEW with incorrect structure. [#38205](https://github.com/ClickHouse/ClickHouse/pull/38205) ([Azat Khuzhin](https://github.com/azat)). +* Update librdkafka submodule to fix crash when an OAUTHBEARER refresh callback is set. [#38225](https://github.com/ClickHouse/ClickHouse/pull/38225) ([Rafael Acevedo](https://github.com/racevedoo)). +* Fix INSERT into Distributed hung due to ProfileEvents. [#38307](https://github.com/ClickHouse/ClickHouse/pull/38307) ([Azat Khuzhin](https://github.com/azat)). +* Fix retries in PostgreSQL engine. [#38310](https://github.com/ClickHouse/ClickHouse/pull/38310) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix optimization in PartialSortingTransform (SIGSEGV and possible incorrect result). [#38324](https://github.com/ClickHouse/ClickHouse/pull/38324) ([Azat Khuzhin](https://github.com/azat)). +* Fix RabbitMQ with formats based on PeekableReadBuffer. Closes [#38061](https://github.com/ClickHouse/ClickHouse/issues/38061). [#38356](https://github.com/ClickHouse/ClickHouse/pull/38356) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MaterializedPostgreSQL - experimentail feature. Fix possible `Invalid number of rows in Chunk` in MaterializedPostgreSQL. Closes [#37323](https://github.com/ClickHouse/ClickHouse/issues/37323). [#38360](https://github.com/ClickHouse/ClickHouse/pull/38360) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix RabbitMQ configuration with connection string setting. Closes [#36531](https://github.com/ClickHouse/ClickHouse/issues/36531). [#38365](https://github.com/ClickHouse/ClickHouse/pull/38365) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix PostgreSQL engine not using PostgreSQL schema when retrieving array dimension size. Closes [#36755](https://github.com/ClickHouse/ClickHouse/issues/36755). Closes [#36772](https://github.com/ClickHouse/ClickHouse/issues/36772). [#38366](https://github.com/ClickHouse/ClickHouse/pull/38366) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possibly incorrect result of distributed queries with `DISTINCT` and `LIMIT`. Fixes [#38282](https://github.com/ClickHouse/ClickHouse/issues/38282). [#38371](https://github.com/ClickHouse/ClickHouse/pull/38371) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong results of countSubstrings() & position() on patterns with 0-bytes. [#38589](https://github.com/ClickHouse/ClickHouse/pull/38589) ([Robert Schulze](https://github.com/rschu1ze)). +* Now it's possible to start a clickhouse-server and attach/detach tables even for tables with the incorrect values of IPv4/IPv6 representation. Proper fix for issue [#35156](https://github.com/ClickHouse/ClickHouse/issues/35156). [#38590](https://github.com/ClickHouse/ClickHouse/pull/38590) ([alesapin](https://github.com/alesapin)). +* `rankCorr` function will work correctly if some arguments are NaNs. This closes [#38396](https://github.com/ClickHouse/ClickHouse/issues/38396). [#38722](https://github.com/ClickHouse/ClickHouse/pull/38722) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `parallel_view_processing=1` with `optimize_trivial_insert_select=1`. Fix `max_insert_threads` while pushing to views. [#38731](https://github.com/ClickHouse/ClickHouse/pull/38731) ([Azat Khuzhin](https://github.com/azat)). +* Fix use-after-free for aggregate functions with `Map` combinator that leads to incorrect result. [#38748](https://github.com/ClickHouse/ClickHouse/pull/38748) ([Azat Khuzhin](https://github.com/azat)). + +### ClickHouse release 22.6, 2022-06-16 + +#### Backward Incompatible Change +* Remove support for octal number literals in SQL. In previous versions they were parsed as Float64. [#37765](https://github.com/ClickHouse/ClickHouse/pull/37765) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Changes how settings using `seconds` as type are parsed to support floating point values (for example: `max_execution_time=0.5`). Infinity or NaN values will throw an exception. [#37187](https://github.com/ClickHouse/ClickHouse/pull/37187) ([Raúl Marín](https://github.com/Algunenano)). +* Changed format of binary serialization of columns of experimental type `Object`. New format is more convenient to implement by third-party clients. [#37482](https://github.com/ClickHouse/ClickHouse/pull/37482) ([Anton Popov](https://github.com/CurtizJ)). +* Turn on setting `output_format_json_named_tuples_as_objects` by default. It allows to serialize named tuples as JSON objects in JSON formats. [#37756](https://github.com/ClickHouse/ClickHouse/pull/37756) ([Anton Popov](https://github.com/CurtizJ)). +* LIKE patterns with trailing escape symbol ('\\') are now disallowed (as mandated by the SQL standard). [#37764](https://github.com/ClickHouse/ClickHouse/pull/37764) ([Robert Schulze](https://github.com/rschu1ze)). +* If you run different ClickHouse versions on a cluster with AArch64 CPU or mix AArch64 and amd64 on a cluster, and use distributed queries with GROUP BY multiple keys of fixed-size type that fit in 256 bits but don't fit in 64 bits, and the size of the result is huge, the data will not be fully aggregated in the result of these queries during upgrade. Workaround: upgrade with downtime instead of a rolling upgrade. + +#### New Feature +* Add `GROUPING` function. It allows to disambiguate the records in the queries with `ROLLUP`, `CUBE` or `GROUPING SETS`. Closes [#19426](https://github.com/ClickHouse/ClickHouse/issues/19426). [#37163](https://github.com/ClickHouse/ClickHouse/pull/37163) ([Dmitry Novik](https://github.com/novikd)). +* A new codec [FPC](https://userweb.cs.txstate.edu/~burtscher/papers/dcc07a.pdf) algorithm for floating point data compression. [#37553](https://github.com/ClickHouse/ClickHouse/pull/37553) ([Mikhail Guzov](https://github.com/koloshmet)). +* Add new columnar JSON formats: `JSONColumns`, `JSONCompactColumns`, `JSONColumnsWithMetadata`. Closes [#36338](https://github.com/ClickHouse/ClickHouse/issues/36338) Closes [#34509](https://github.com/ClickHouse/ClickHouse/issues/34509). [#36975](https://github.com/ClickHouse/ClickHouse/pull/36975) ([Kruglov Pavel](https://github.com/Avogar)). +* Added open telemetry traces visualizing tool based on d3js. [#37810](https://github.com/ClickHouse/ClickHouse/pull/37810) ([Sergei Trifonov](https://github.com/serxa)). +* Support INSERTs into `system.zookeeper` table. Closes [#22130](https://github.com/ClickHouse/ClickHouse/issues/22130). [#37596](https://github.com/ClickHouse/ClickHouse/pull/37596) ([Han Fei](https://github.com/hanfei1991)). +* Support non-constant pattern argument for `LIKE`, `ILIKE` and `match` functions. [#37251](https://github.com/ClickHouse/ClickHouse/pull/37251) ([Robert Schulze](https://github.com/rschu1ze)). +* Executable user defined functions now support parameters. Example: `SELECT test_function(parameters)(arguments)`. Closes [#37578](https://github.com/ClickHouse/ClickHouse/issues/37578). [#37720](https://github.com/ClickHouse/ClickHouse/pull/37720) ([Maksim Kita](https://github.com/kitaisreal)). +* Add `merge_reason` column to system.part_log table. [#36912](https://github.com/ClickHouse/ClickHouse/pull/36912) ([Sema Checherinda](https://github.com/CheSema)). +* Add support for Maps and Records in Avro format. Add new setting `input_format_avro_null_as_default ` that allow to insert null as default in Avro format. Closes [#18925](https://github.com/ClickHouse/ClickHouse/issues/18925) Closes [#37378](https://github.com/ClickHouse/ClickHouse/issues/37378) Closes [#32899](https://github.com/ClickHouse/ClickHouse/issues/32899). [#37525](https://github.com/ClickHouse/ClickHouse/pull/37525) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `clickhouse-disks` tool to introspect and operate on virtual filesystems configured for ClickHouse. [#36060](https://github.com/ClickHouse/ClickHouse/pull/36060) ([Artyom Yurkov](https://github.com/Varinara)). +* Adds H3 unidirectional edge functions. [#36843](https://github.com/ClickHouse/ClickHouse/pull/36843) ([Bharat Nallan](https://github.com/bharatnc)). +* Add support for calculating [hashids](https://hashids.org/) from unsigned integers. [#37013](https://github.com/ClickHouse/ClickHouse/pull/37013) ([Michael Nutt](https://github.com/mnutt)). +* Explicit `SALT` specification is allowed for `CREATE USER IDENTIFIED WITH sha256_hash`. [#37377](https://github.com/ClickHouse/ClickHouse/pull/37377) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add two new settings `input_format_csv_skip_first_lines/input_format_tsv_skip_first_lines` to allow skipping specified number of lines in the beginning of the file in CSV/TSV formats. [#37537](https://github.com/ClickHouse/ClickHouse/pull/37537) ([Kruglov Pavel](https://github.com/Avogar)). +* `showCertificate` function shows current server's SSL certificate. [#37540](https://github.com/ClickHouse/ClickHouse/pull/37540) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* HTTP source for Data Dictionaries in Named Collections is supported. [#37581](https://github.com/ClickHouse/ClickHouse/pull/37581) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Added a new window function `nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL x SECOND])`. [#37628](https://github.com/ClickHouse/ClickHouse/pull/37628) ([Andrey Zvonov](https://github.com/zvonand)). +* Implemented changing the comment for `ReplicatedMergeTree` tables. [#37416](https://github.com/ClickHouse/ClickHouse/pull/37416) ([Vasily Nemkov](https://github.com/Enmk)). +* Added `SYSTEM UNFREEZE` query that deletes the whole backup regardless if the corresponding table is deleted or not. [#36424](https://github.com/ClickHouse/ClickHouse/pull/36424) ([Vadim Volodin](https://github.com/PolyProgrammist)). + +#### Experimental Feature +* Enables `POPULATE` for `WINDOW VIEW`. [#36945](https://github.com/ClickHouse/ClickHouse/pull/36945) ([vxider](https://github.com/Vxider)). +* `ALTER TABLE ... MODIFY QUERY` support for `WINDOW VIEW`. [#37188](https://github.com/ClickHouse/ClickHouse/pull/37188) ([vxider](https://github.com/Vxider)). +* This PR changes the behavior of the `ENGINE` syntax in `WINDOW VIEW`, to make it like in `MATERIALIZED VIEW`. [#37214](https://github.com/ClickHouse/ClickHouse/pull/37214) ([vxider](https://github.com/Vxider)). + +#### Performance Improvement +* Added numerous optimizations for ARM NEON [#38093](https://github.com/ClickHouse/ClickHouse/pull/38093)([Daniel Kutenin](https://github.com/danlark1)), ([Alexandra Pilipyuk](https://github.com/chalice19)) Note: if you run different ClickHouse versions on a cluster with ARM CPU and use distributed queries with GROUP BY multiple keys of fixed-size type that fit in 256 bits but don't fit in 64 bits, the result of the aggregation query will be wrong during upgrade. Workaround: upgrade with downtime instead of a rolling upgrade. +* Improve performance and memory usage for select of subset of columns for formats Native, Protobuf, CapnProto, JSONEachRow, TSKV, all formats with suffixes WithNames/WithNamesAndTypes. Previously while selecting only subset of columns from files in these formats all columns were read and stored in memory. Now only required columns are read. This PR enables setting `input_format_skip_unknown_fields` by default, because otherwise in case of select of subset of columns exception will be thrown. [#37192](https://github.com/ClickHouse/ClickHouse/pull/37192) ([Kruglov Pavel](https://github.com/Avogar)). +* Now more filters can be pushed down for join. [#37472](https://github.com/ClickHouse/ClickHouse/pull/37472) ([Amos Bird](https://github.com/amosbird)). +* Load marks for only necessary columns when reading wide parts. [#36879](https://github.com/ClickHouse/ClickHouse/pull/36879) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Improved performance of aggregation in case, when sparse columns (can be enabled by experimental setting `ratio_of_defaults_for_sparse_serialization` in `MergeTree` tables) are used as arguments in aggregate functions. [#37617](https://github.com/ClickHouse/ClickHouse/pull/37617) ([Anton Popov](https://github.com/CurtizJ)). +* Optimize function `COALESCE` with two arguments. [#37666](https://github.com/ClickHouse/ClickHouse/pull/37666) ([Anton Popov](https://github.com/CurtizJ)). +* Replace `multiIf` to `if` in case when `multiIf` has only one condition, because function `if` is more performant. [#37695](https://github.com/ClickHouse/ClickHouse/pull/37695) ([Anton Popov](https://github.com/CurtizJ)). +* Improve performance of `dictGetDescendants`, `dictGetChildren` functions, create temporary parent to children hierarchical index per query, not per function call during query. Allow to specify `BIDIRECTIONAL` for `HIERARHICAL` attributes, dictionary will maintain parent to children index in memory, that way functions `dictGetDescendants`, `dictGetChildren` will not create temporary index per query. Closes [#32481](https://github.com/ClickHouse/ClickHouse/issues/32481). [#37148](https://github.com/ClickHouse/ClickHouse/pull/37148) ([Maksim Kita](https://github.com/kitaisreal)). +* Aggregates state destruction now may be posted on a thread pool. For queries with LIMIT and big state it provides significant speedup, e.g. `select uniq(number) from numbers_mt(1e7) group by number limit 100` became around 2.5x faster. [#37855](https://github.com/ClickHouse/ClickHouse/pull/37855) ([Nikita Taranov](https://github.com/nickitat)). +* Improve sort performance by single column. [#37195](https://github.com/ClickHouse/ClickHouse/pull/37195) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of single column sorting using sorting queue specializations. [#37990](https://github.com/ClickHouse/ClickHouse/pull/37990) ([Maksim Kita](https://github.com/kitaisreal)). +* Improved performance on array norm and distance functions 2x-4x times. [#37394](https://github.com/ClickHouse/ClickHouse/pull/37394) ([Alexander Gololobov](https://github.com/davenger)). +* Improve performance of number comparison functions using dynamic dispatch. [#37399](https://github.com/ClickHouse/ClickHouse/pull/37399) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of ORDER BY with LIMIT. [#37481](https://github.com/ClickHouse/ClickHouse/pull/37481) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `hasAll` function using dynamic dispatch infrastructure. [#37484](https://github.com/ClickHouse/ClickHouse/pull/37484) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `greatCircleAngle`, `greatCircleDistance`, `geoDistance` functions. [#37524](https://github.com/ClickHouse/ClickHouse/pull/37524) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of insert into MergeTree if there are multiple columns in ORDER BY. [#35762](https://github.com/ClickHouse/ClickHouse/pull/35762) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix excessive CPU usage in background when there are a lot of tables. [#38028](https://github.com/ClickHouse/ClickHouse/pull/38028) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `not` function using dynamic dispatch. [#38058](https://github.com/ClickHouse/ClickHouse/pull/38058) ([Maksim Kita](https://github.com/kitaisreal)). +* Optimized the internal caching of re2 patterns which occur e.g. in LIKE and MATCH functions. [#37544](https://github.com/ClickHouse/ClickHouse/pull/37544) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve filter bitmask generator function all in one with AVX-512 instructions. [#37588](https://github.com/ClickHouse/ClickHouse/pull/37588) ([yaqi-zhao](https://github.com/yaqi-zhao)). +* Apply read method `threadpool` for Hive integration engine. This will significantly speed up reading. [#36328](https://github.com/ClickHouse/ClickHouse/pull/36328) ([李扬](https://github.com/taiyang-li)). +* When all the columns to read are partition keys, construct columns by the file's row number without real reading the Hive file. [#37103](https://github.com/ClickHouse/ClickHouse/pull/37103) ([lgbo](https://github.com/lgbo-ustc)). +* Support multi disks for caching hive files. [#37279](https://github.com/ClickHouse/ClickHouse/pull/37279) ([lgbo](https://github.com/lgbo-ustc)). +* Limiting the maximum cache usage per query can effectively prevent cache pool contamination. [Related Issues](https://github.com/ClickHouse/ClickHouse/issues/28961). [#37859](https://github.com/ClickHouse/ClickHouse/pull/37859) ([Han Shukai](https://github.com/KinderRiven)). +* Currently clickhouse directly downloads all remote files to the local cache (even if they are only read once), which will frequently cause IO of the local hard disk. In some scenarios, these IOs may not be necessary and may easily cause negative optimization. As shown in the figure below, when we run SSB Q1-Q4, the performance of the cache has caused negative optimization. [#37516](https://github.com/ClickHouse/ClickHouse/pull/37516) ([Han Shukai](https://github.com/KinderRiven)). +* Allow to prune the list of files via virtual columns such as `_file` and `_path` when reading from S3. This is for [#37174](https://github.com/ClickHouse/ClickHouse/issues/37174) , [#23494](https://github.com/ClickHouse/ClickHouse/issues/23494). [#37356](https://github.com/ClickHouse/ClickHouse/pull/37356) ([Amos Bird](https://github.com/amosbird)). +* In function: CompressedWriteBuffer::nextImpl(), there is an unnecessary write-copy step that would happen frequently during inserting data. Below shows the differentiation with this patch: - Before: 1. Compress "working_buffer" into "compressed_buffer" 2. write-copy into "out" - After: Directly Compress "working_buffer" into "out". [#37242](https://github.com/ClickHouse/ClickHouse/pull/37242) ([jasperzhu](https://github.com/jinjunzh)). + +#### Improvement +* Support types with non-standard defaults in ROLLUP, CUBE, GROUPING SETS. Closes [#37360](https://github.com/ClickHouse/ClickHouse/issues/37360). [#37667](https://github.com/ClickHouse/ClickHouse/pull/37667) ([Dmitry Novik](https://github.com/novikd)). +* Fix stack traces collection on ARM. Closes [#37044](https://github.com/ClickHouse/ClickHouse/issues/37044). Closes [#15638](https://github.com/ClickHouse/ClickHouse/issues/15638). [#37797](https://github.com/ClickHouse/ClickHouse/pull/37797) ([Maksim Kita](https://github.com/kitaisreal)). +* Client will try every IP address returned by DNS resolution until successful connection. [#37273](https://github.com/ClickHouse/ClickHouse/pull/37273) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Allow to use String type instead of Binary in Arrow/Parquet/ORC formats. This PR introduces 3 new settings for it: `output_format_arrow_string_as_string`, `output_format_parquet_string_as_string`, `output_format_orc_string_as_string`. Default value for all settings is `false`. [#37327](https://github.com/ClickHouse/ClickHouse/pull/37327) ([Kruglov Pavel](https://github.com/Avogar)). +* Apply setting `input_format_max_rows_to_read_for_schema_inference` for all read rows in total from all files in globs. Previously setting `input_format_max_rows_to_read_for_schema_inference` was applied for each file in glob separately and in case of huge number of nulls we could read first `input_format_max_rows_to_read_for_schema_inference` rows from each file and get nothing. Also increase default value for this setting to 25000. [#37332](https://github.com/ClickHouse/ClickHouse/pull/37332) ([Kruglov Pavel](https://github.com/Avogar)). +* Add separate `CLUSTER` grant (and `access_control_improvements.on_cluster_queries_require_cluster_grant` configuration directive, for backward compatibility, default to `false`). [#35767](https://github.com/ClickHouse/ClickHouse/pull/35767) ([Azat Khuzhin](https://github.com/azat)). +* Added support for schema inference for `hdfsCluster`. [#35812](https://github.com/ClickHouse/ClickHouse/pull/35812) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implement `least_used` load balancing algorithm for disks inside volume (multi disk configuration). [#36686](https://github.com/ClickHouse/ClickHouse/pull/36686) ([Azat Khuzhin](https://github.com/azat)). +* Modify the HTTP Endpoint to return the full stats under the `X-ClickHouse-Summary` header when `send_progress_in_http_headers=0` (before it would return all zeros). - Modify the HTTP Endpoint to return `X-ClickHouse-Exception-Code` header when progress has been sent before (`send_progress_in_http_headers=1`) - Modify the HTTP Endpoint to return `HTTP_REQUEST_TIMEOUT` (408) instead of `HTTP_INTERNAL_SERVER_ERROR` (500) on `TIMEOUT_EXCEEDED` errors. [#36884](https://github.com/ClickHouse/ClickHouse/pull/36884) ([Raúl Marín](https://github.com/Algunenano)). +* Allow a user to inspect grants from granted roles. [#36941](https://github.com/ClickHouse/ClickHouse/pull/36941) ([nvartolomei](https://github.com/nvartolomei)). +* Do not calculate an integral numerically but use CDF functions instead. This will speed up execution and will increase the precision. This fixes [#36714](https://github.com/ClickHouse/ClickHouse/issues/36714). [#36953](https://github.com/ClickHouse/ClickHouse/pull/36953) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add default implementation for Nothing in functions. Now most of the functions will return column with type Nothing in case one of it's arguments is Nothing. It also solves problem with functions like arrayMap/arrayFilter and similar when they have empty array as an argument. Previously queries like `select arrayMap(x -> 2 * x, []);` failed because function inside lambda cannot work with type `Nothing`, now such queries return empty array with type `Array(Nothing)`. Also add support for arrays of nullable types in functions like arrayFilter/arrayFill. Previously, queries like `select arrayFilter(x -> x % 2, [1, NULL])` failed, now they work (if the result of lambda is NULL, then this value won't be included in the result). Closes [#37000](https://github.com/ClickHouse/ClickHouse/issues/37000). [#37048](https://github.com/ClickHouse/ClickHouse/pull/37048) ([Kruglov Pavel](https://github.com/Avogar)). +* Now if a shard has local replica we create a local plan and a plan to read from all remote replicas. They have shared initiator which coordinates reading. [#37204](https://github.com/ClickHouse/ClickHouse/pull/37204) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do no longer abort server startup if configuration option "mark_cache_size" is not explicitly set. [#37326](https://github.com/ClickHouse/ClickHouse/pull/37326) ([Robert Schulze](https://github.com/rschu1ze)). +* Allows providing `NULL`/`NOT NULL` right after type in column declaration. [#37337](https://github.com/ClickHouse/ClickHouse/pull/37337) ([Igor Nikonov](https://github.com/devcrafter)). +* optimize file segment PARTIALLY_DOWNLOADED get read buffer. [#37338](https://github.com/ClickHouse/ClickHouse/pull/37338) ([xiedeyantu](https://github.com/xiedeyantu)). +* Try to improve short circuit functions processing to fix problems with stress tests. [#37384](https://github.com/ClickHouse/ClickHouse/pull/37384) ([Kruglov Pavel](https://github.com/Avogar)). +* Closes [#37395](https://github.com/ClickHouse/ClickHouse/issues/37395). [#37415](https://github.com/ClickHouse/ClickHouse/pull/37415) ([Memo](https://github.com/Joeywzr)). +* Fix extremely rare deadlock during part fetch in zero-copy replication. Fixes [#37423](https://github.com/ClickHouse/ClickHouse/issues/37423). [#37424](https://github.com/ClickHouse/ClickHouse/pull/37424) ([metahys](https://github.com/metahys)). +* Don't allow to create storage with unknown data format. [#37450](https://github.com/ClickHouse/ClickHouse/pull/37450) ([Kruglov Pavel](https://github.com/Avogar)). +* Set `global_memory_usage_overcommit_max_wait_microseconds` default value to 5 seconds. Add info about `OvercommitTracker` to OOM exception message. Add `MemoryOvercommitWaitTimeMicroseconds` profile event. [#37460](https://github.com/ClickHouse/ClickHouse/pull/37460) ([Dmitry Novik](https://github.com/novikd)). +* Do not display `-0.0` CPU time in clickhouse-client. It can appear due to rounding errors. This closes [#38003](https://github.com/ClickHouse/ClickHouse/issues/38003). This closes [#38038](https://github.com/ClickHouse/ClickHouse/issues/38038). [#38064](https://github.com/ClickHouse/ClickHouse/pull/38064) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: Keep controls in place when the page is scrolled horizontally. This makes edits comfortable even if the table is wide and it was scrolled far to the right. The feature proposed by Maksym Tereshchenko from CaspianDB. [#37470](https://github.com/ClickHouse/ClickHouse/pull/37470) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Modify query div in play.html to be extendable beyond 20% height. In case of very long queries it is helpful to extend the textarea element, only today, since the div is fixed height, the extended textarea hides the data div underneath. With this fix, extending the textarea element will push the data div down/up such the extended textarea won't hide it. Also, keeps query box width 100% even when the user adjusting the size of the query textarea. [#37488](https://github.com/ClickHouse/ClickHouse/pull/37488) ([guyco87](https://github.com/guyco87)). +* Added `ProfileEvents` for introspection of type of written (inserted or merged) parts (`Inserted{Wide/Compact/InMemory}Parts`, `MergedInto{Wide/Compact/InMemory}Parts`. Added column `part_type` to `system.part_log`. Resolves [#37495](https://github.com/ClickHouse/ClickHouse/issues/37495). [#37536](https://github.com/ClickHouse/ClickHouse/pull/37536) ([Anton Popov](https://github.com/CurtizJ)). +* clickhouse-keeper improvement: move broken logs to a timestamped folder. [#37565](https://github.com/ClickHouse/ClickHouse/pull/37565) ([Antonio Andelic](https://github.com/antonio2368)). +* Do not write expired columns by TTL after subsequent merges (before only first merge/optimize of the part will not write expired by TTL columns, all other will do). [#37570](https://github.com/ClickHouse/ClickHouse/pull/37570) ([Azat Khuzhin](https://github.com/azat)). +* More precise result of the `dumpColumnStructure` miscellaneous function in presence of LowCardinality or Sparse columns. In previous versions, these functions were converting the argument to a full column before returning the result. This is needed to provide an answer in [#6935](https://github.com/ClickHouse/ClickHouse/issues/6935). [#37633](https://github.com/ClickHouse/ClickHouse/pull/37633) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* clickhouse-keeper: store only unique session IDs for watches. [#37641](https://github.com/ClickHouse/ClickHouse/pull/37641) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible "Cannot write to finalized buffer". [#37645](https://github.com/ClickHouse/ClickHouse/pull/37645) ([Azat Khuzhin](https://github.com/azat)). +* Add setting `support_batch_delete` for `DiskS3` to disable multiobject delete calls, which Google Cloud Storage doesn't support. [#37659](https://github.com/ClickHouse/ClickHouse/pull/37659) ([Fred Wulff](https://github.com/frew)). +* Add an option to disable connection pooling in ODBC bridge. [#37705](https://github.com/ClickHouse/ClickHouse/pull/37705) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Functions `dictGetHierarchy`, `dictIsIn`, `dictGetChildren`, `dictGetDescendants` added support nullable `HIERARCHICAL` attribute in dictionaries. Closes [#35521](https://github.com/ClickHouse/ClickHouse/issues/35521). [#37805](https://github.com/ClickHouse/ClickHouse/pull/37805) ([Maksim Kita](https://github.com/kitaisreal)). +* Expose BoringSSL version related info in the `system.build_options` table. [#37850](https://github.com/ClickHouse/ClickHouse/pull/37850) ([Bharat Nallan](https://github.com/bharatnc)). +* Now clickhouse-server removes `delete_tmp` directories on server start. Fixes [#26503](https://github.com/ClickHouse/ClickHouse/issues/26503). [#37906](https://github.com/ClickHouse/ClickHouse/pull/37906) ([alesapin](https://github.com/alesapin)). +* Clean up broken detached parts after timeout. Closes [#25195](https://github.com/ClickHouse/ClickHouse/issues/25195). [#37975](https://github.com/ClickHouse/ClickHouse/pull/37975) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Now in MergeTree table engines family failed-to-move parts will be removed instantly. [#37994](https://github.com/ClickHouse/ClickHouse/pull/37994) ([alesapin](https://github.com/alesapin)). +* Now if setting `always_fetch_merged_part` is enabled for ReplicatedMergeTree merges will try to find parts on other replicas rarely with smaller load for [Zoo]Keeper. [#37995](https://github.com/ClickHouse/ClickHouse/pull/37995) ([alesapin](https://github.com/alesapin)). +* Add implicit grants with grant option too. For example `GRANT CREATE TABLE ON test.* TO A WITH GRANT OPTION` now allows `A` to execute `GRANT CREATE VIEW ON test.* TO B`. [#38017](https://github.com/ClickHouse/ClickHouse/pull/38017) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement +* Use `clang-14` and LLVM infrastructure version 14 for builds. This closes [#34681](https://github.com/ClickHouse/ClickHouse/issues/34681). [#34754](https://github.com/ClickHouse/ClickHouse/pull/34754) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Note: `clang-14` has [a bug](https://github.com/google/sanitizers/issues/1540) in ThreadSanitizer that makes our CI work worse. +* Allow to drop privileges at startup. This simplifies Docker images. Closes [#36293](https://github.com/ClickHouse/ClickHouse/issues/36293). [#36341](https://github.com/ClickHouse/ClickHouse/pull/36341) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add docs spellcheck to CI. [#37790](https://github.com/ClickHouse/ClickHouse/pull/37790) ([Vladimir C](https://github.com/vdimir)). +* Fix overly aggressive stripping which removed the embedded hash required for checking the consistency of the executable. [#37993](https://github.com/ClickHouse/ClickHouse/pull/37993) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Bug Fix + +* Fix `SELECT ... INTERSECT` and `EXCEPT SELECT` statements with constant string types. [#37738](https://github.com/ClickHouse/ClickHouse/pull/37738) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix `GROUP BY` `AggregateFunction` (i.e. you `GROUP BY` by the column that has `AggregateFunction` type). [#37093](https://github.com/ClickHouse/ClickHouse/pull/37093) ([Azat Khuzhin](https://github.com/azat)). +* (experimental WINDOW VIEW) Fix `addDependency` in WindowView. This bug can be reproduced like [#37237](https://github.com/ClickHouse/ClickHouse/issues/37237). [#37224](https://github.com/ClickHouse/ClickHouse/pull/37224) ([vxider](https://github.com/Vxider)). +* Fix inconsistency in ORDER BY ... WITH FILL feature. Query, containing ORDER BY ... WITH FILL, can generate extra rows when multiple WITH FILL columns are present. [#38074](https://github.com/ClickHouse/ClickHouse/pull/38074) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* This PR moving `addDependency` from constructor to `startup()` to avoid adding dependency to a *dropped* table, fix [#37237](https://github.com/ClickHouse/ClickHouse/issues/37237). [#37243](https://github.com/ClickHouse/ClickHouse/pull/37243) ([vxider](https://github.com/Vxider)). +* Fix inserting defaults for missing values in columnar formats. Previously missing columns were filled with defaults for types, not for columns. [#37253](https://github.com/ClickHouse/ClickHouse/pull/37253) ([Kruglov Pavel](https://github.com/Avogar)). +* (experimental Object type) Fix some cases of insertion nested arrays to columns of type `Object`. [#37305](https://github.com/ClickHouse/ClickHouse/pull/37305) ([Anton Popov](https://github.com/CurtizJ)). +* Fix unexpected errors with a clash of constant strings in aggregate function, prewhere and join. Close [#36891](https://github.com/ClickHouse/ClickHouse/issues/36891). [#37336](https://github.com/ClickHouse/ClickHouse/pull/37336) ([Vladimir C](https://github.com/vdimir)). +* Fix projections with GROUP/ORDER BY in query and optimize_aggregation_in_order (before the result was incorrect since only finish sorting was performed). [#37342](https://github.com/ClickHouse/ClickHouse/pull/37342) ([Azat Khuzhin](https://github.com/azat)). +* Fixed error with symbols in key name in S3. Fixes [#33009](https://github.com/ClickHouse/ClickHouse/issues/33009). [#37344](https://github.com/ClickHouse/ClickHouse/pull/37344) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Throw an exception when GROUPING SETS used with ROLLUP or CUBE. [#37367](https://github.com/ClickHouse/ClickHouse/pull/37367) ([Dmitry Novik](https://github.com/novikd)). +* Fix LOGICAL_ERROR in getMaxSourcePartsSizeForMerge during merges (in case of non standard, greater, values of `background_pool_size`/`background_merges_mutations_concurrency_ratio` has been specified in `config.xml` (new way) not in `users.xml` (deprecated way)). [#37413](https://github.com/ClickHouse/ClickHouse/pull/37413) ([Azat Khuzhin](https://github.com/azat)). +* Stop removing UTF-8 BOM in RowBinary format. [#37428](https://github.com/ClickHouse/ClickHouse/pull/37428) ([Paul Loyd](https://github.com/loyd)). [#37428](https://github.com/ClickHouse/ClickHouse/pull/37428) ([Paul Loyd](https://github.com/loyd)). +* clickhouse-keeper bugfix: fix force recovery for single node cluster. [#37440](https://github.com/ClickHouse/ClickHouse/pull/37440) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix logical error in normalizeUTF8 functions. Closes [#37298](https://github.com/ClickHouse/ClickHouse/issues/37298). [#37443](https://github.com/ClickHouse/ClickHouse/pull/37443) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix cast lowcard of nullable in JoinSwitcher, close [#37385](https://github.com/ClickHouse/ClickHouse/issues/37385). [#37453](https://github.com/ClickHouse/ClickHouse/pull/37453) ([Vladimir C](https://github.com/vdimir)). +* Fix named tuples output in ORC/Arrow/Parquet formats. [#37458](https://github.com/ClickHouse/ClickHouse/pull/37458) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix optimization of monotonous functions in ORDER BY clause in presence of GROUPING SETS. Fixes [#37401](https://github.com/ClickHouse/ClickHouse/issues/37401). [#37493](https://github.com/ClickHouse/ClickHouse/pull/37493) ([Dmitry Novik](https://github.com/novikd)). +* Fix error on joining with dictionary on some conditions. Close [#37386](https://github.com/ClickHouse/ClickHouse/issues/37386). [#37530](https://github.com/ClickHouse/ClickHouse/pull/37530) ([Vladimir C](https://github.com/vdimir)). +* Prohibit `optimize_aggregation_in_order` with `GROUPING SETS` (fixes `LOGICAL_ERROR`). [#37542](https://github.com/ClickHouse/ClickHouse/pull/37542) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong dump information of ActionsDAG. [#37587](https://github.com/ClickHouse/ClickHouse/pull/37587) ([zhanglistar](https://github.com/zhanglistar)). +* Fix converting types for UNION queries (may produce LOGICAL_ERROR). [#37593](https://github.com/ClickHouse/ClickHouse/pull/37593) ([Azat Khuzhin](https://github.com/azat)). +* Fix `WITH FILL` modifier with negative intervals in `STEP` clause. Fixes [#37514](https://github.com/ClickHouse/ClickHouse/issues/37514). [#37600](https://github.com/ClickHouse/ClickHouse/pull/37600) ([Anton Popov](https://github.com/CurtizJ)). +* Fix illegal joinGet array usage when ` join_use_nulls = 1`. This fixes [#37562](https://github.com/ClickHouse/ClickHouse/issues/37562) . [#37650](https://github.com/ClickHouse/ClickHouse/pull/37650) ([Amos Bird](https://github.com/amosbird)). +* Fix columns number mismatch in cross join, close [#37561](https://github.com/ClickHouse/ClickHouse/issues/37561). [#37653](https://github.com/ClickHouse/ClickHouse/pull/37653) ([Vladimir C](https://github.com/vdimir)). +* Fix segmentation fault in `show create table` from mysql database when it is configured with named collections. Closes [#37683](https://github.com/ClickHouse/ClickHouse/issues/37683). [#37690](https://github.com/ClickHouse/ClickHouse/pull/37690) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix RabbitMQ Storage not being able to startup on server restart if storage was create without SETTINGS clause. Closes [#37463](https://github.com/ClickHouse/ClickHouse/issues/37463). [#37691](https://github.com/ClickHouse/ClickHouse/pull/37691) ([Kseniia Sumarokova](https://github.com/kssenii)). +* SQL user defined functions disable CREATE/DROP in readonly mode. Closes [#37280](https://github.com/ClickHouse/ClickHouse/issues/37280). [#37699](https://github.com/ClickHouse/ClickHouse/pull/37699) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix formatting of Nullable arguments for executable user defined functions. Closes [#35897](https://github.com/ClickHouse/ClickHouse/issues/35897). [#37711](https://github.com/ClickHouse/ClickHouse/pull/37711) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix optimization enabled by setting `optimize_monotonous_functions_in_order_by` in distributed queries. Fixes [#36037](https://github.com/ClickHouse/ClickHouse/issues/36037). [#37724](https://github.com/ClickHouse/ClickHouse/pull/37724) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible logical error: `Invalid Field get from type UInt64 to type Float64` in `values` table function. Closes [#37602](https://github.com/ClickHouse/ClickHouse/issues/37602). [#37754](https://github.com/ClickHouse/ClickHouse/pull/37754) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible segfault in schema inference in case of exception in SchemaReader constructor. Closes [#37680](https://github.com/ClickHouse/ClickHouse/issues/37680). [#37760](https://github.com/ClickHouse/ClickHouse/pull/37760) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix setting cast_ipv4_ipv6_default_on_conversion_error for internal cast function. Closes [#35156](https://github.com/ClickHouse/ClickHouse/issues/35156). [#37761](https://github.com/ClickHouse/ClickHouse/pull/37761) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix toString error on DatatypeDate32. [#37775](https://github.com/ClickHouse/ClickHouse/pull/37775) ([LiuNeng](https://github.com/liuneng1994)). +* The clickhouse-keeper setting `dead_session_check_period_ms` was transformed into microseconds (multiplied by 1000), which lead to dead sessions only being cleaned up after several minutes (instead of 500ms). [#37824](https://github.com/ClickHouse/ClickHouse/pull/37824) ([Michael Lex](https://github.com/mlex)). +* Fix possible "No more packets are available" for distributed queries (in case of `async_socket_for_remote`/`use_hedged_requests` is disabled). [#37826](https://github.com/ClickHouse/ClickHouse/pull/37826) ([Azat Khuzhin](https://github.com/azat)). +* (experimental WINDOW VIEW) Do not drop the inner target table when executing `ALTER TABLE … MODIFY QUERY` in WindowView. [#37879](https://github.com/ClickHouse/ClickHouse/pull/37879) ([vxider](https://github.com/Vxider)). +* Fix directory ownership of coordination dir in clickhouse-keeper Docker image. Fixes [#37914](https://github.com/ClickHouse/ClickHouse/issues/37914). [#37915](https://github.com/ClickHouse/ClickHouse/pull/37915) ([James Maidment](https://github.com/jamesmaidment)). +* Dictionaries fix custom query with update field and `{condition}`. Closes [#33746](https://github.com/ClickHouse/ClickHouse/issues/33746). [#37947](https://github.com/ClickHouse/ClickHouse/pull/37947) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible incorrect result of `SELECT ... WITH FILL` in the case when `ORDER BY` should be applied after `WITH FILL` result (e.g. for outer query). Incorrect result was caused by optimization for `ORDER BY` expressions ([#35623](https://github.com/ClickHouse/ClickHouse/issues/35623)). Closes [#37904](https://github.com/ClickHouse/ClickHouse/issues/37904). [#37959](https://github.com/ClickHouse/ClickHouse/pull/37959) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* (experimental WINDOW VIEW) Add missing default columns when pushing to the target table in WindowView, fix [#37815](https://github.com/ClickHouse/ClickHouse/issues/37815). [#37965](https://github.com/ClickHouse/ClickHouse/pull/37965) ([vxider](https://github.com/Vxider)). +* Fixed too large stack frame that would cause compilation to fail. [#37996](https://github.com/ClickHouse/ClickHouse/pull/37996) ([Han Shukai](https://github.com/KinderRiven)). +* When open enable_filesystem_query_cache_limit, throw Reserved cache size exceeds the remaining cache size. [#38004](https://github.com/ClickHouse/ClickHouse/pull/38004) ([xiedeyantu](https://github.com/xiedeyantu)). +* Fix converting types for UNION queries (may produce LOGICAL_ERROR). [#34775](https://github.com/ClickHouse/ClickHouse/pull/34775) ([Azat Khuzhin](https://github.com/azat)). +* TTL merge may not be scheduled again if BackgroundExecutor is busy. --merges_with_ttl_counter is increased in selectPartsToMerge() --merge task will be ignored if BackgroundExecutor is busy --merges_with_ttl_counter will not be decrease. [#36387](https://github.com/ClickHouse/ClickHouse/pull/36387) ([lthaooo](https://github.com/lthaooo)). +* Fix overridden settings value of `normalize_function_names`. [#36937](https://github.com/ClickHouse/ClickHouse/pull/36937) ([李扬](https://github.com/taiyang-li)). +* Fix for exponential time decaying window functions. Now respecting boundaries of the window. [#36944](https://github.com/ClickHouse/ClickHouse/pull/36944) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix possible heap-use-after-free error when reading system.projection_parts and system.projection_parts_columns . This fixes [#37184](https://github.com/ClickHouse/ClickHouse/issues/37184). [#37185](https://github.com/ClickHouse/ClickHouse/pull/37185) ([Amos Bird](https://github.com/amosbird)). +* Fixed `DateTime64` fractional seconds behavior prior to Unix epoch. [#37697](https://github.com/ClickHouse/ClickHouse/pull/37697) ([Andrey Zvonov](https://github.com/zvonand)). [#37039](https://github.com/ClickHouse/ClickHouse/pull/37039) ([李扬](https://github.com/taiyang-li)). + +### ClickHouse release 22.5, 2022-05-19 + +#### Upgrade Notes + +* Now, background merges, mutations and `OPTIMIZE` will not increment `SelectedRows` and `SelectedBytes` metrics. They (still) will increment `MergedRows` and `MergedUncompressedBytes` as it was before. This only affects the metric values, and makes them better. This change does not introduce any incompatibility, but you may wonder about the changes of metrics, so we put in this category. [#37040](https://github.com/ClickHouse/ClickHouse/pull/37040) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Updated the BoringSSL module to the official FIPS compliant version. This makes ClickHouse FIPS compliant. [#35914](https://github.com/ClickHouse/ClickHouse/pull/35914) ([Meena-Renganathan](https://github.com/Meena-Renganathan)). The ciphers `aes-192-cfb128` and `aes-256-cfb128` were removed, because they are not included in the FIPS certified version of BoringSSL. +* `max_memory_usage` setting is removed from the default user profile in `users.xml`. This enables flexible memory limits for queries instead of the old rigid limit of 10 GB. +* Disable `log_query_threads` setting by default. It controls the logging of statistics about every thread participating in query execution. After supporting asynchronous reads, the total number of distinct thread ids became too large, and logging into the `query_thread_log` has become too heavy. [#37077](https://github.com/ClickHouse/ClickHouse/pull/37077) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove function `groupArraySorted` which has a bug. [#36822](https://github.com/ClickHouse/ClickHouse/pull/36822) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Enable memory overcommit by default. [#35921](https://github.com/ClickHouse/ClickHouse/pull/35921) ([Dmitry Novik](https://github.com/novikd)). +* Add support of GROUPING SETS in GROUP BY clause. This implementation supports a parallel processing of grouping sets. [#33631](https://github.com/ClickHouse/ClickHouse/pull/33631) ([Dmitry Novik](https://github.com/novikd)). +* Added `system.certificates` table. [#37142](https://github.com/ClickHouse/ClickHouse/pull/37142) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Adds `h3Line`, `h3Distance` and `h3HexRing` functions. [#37030](https://github.com/ClickHouse/ClickHouse/pull/37030) ([Bharat Nallan](https://github.com/bharatnc)). +* New single binary based diagnostics tool (clickhouse-diagnostics). [#36705](https://github.com/ClickHouse/ClickHouse/pull/36705) ([Dale McDiarmid](https://github.com/gingerwizard)). +* Add output format `Prometheus` [#36051](https://github.com/ClickHouse/ClickHouse/issues/36051). [#36206](https://github.com/ClickHouse/ClickHouse/pull/36206) ([Vladimir C](https://github.com/vdimir)). +* Add `MySQLDump` input format. It reads all data from INSERT queries belonging to one table in dump. If there are more than one table, by default it reads data from the first one. [#36667](https://github.com/ClickHouse/ClickHouse/pull/36667) ([Kruglov Pavel](https://github.com/Avogar)). +* Show the `total_rows` and `total_bytes` fields in `system.tables` for temporary tables. [#36401](https://github.com/ClickHouse/ClickHouse/issues/36401). [#36439](https://github.com/ClickHouse/ClickHouse/pull/36439) ([xiedeyantu](https://github.com/xiedeyantu)). +* Allow to override `parts_to_delay_insert` and `parts_to_throw_insert` with query-level settings. If they are defined, they will override table-level settings. [#36371](https://github.com/ClickHouse/ClickHouse/pull/36371) ([Memo](https://github.com/Joeywzr)). + +#### Experimental Feature + +* Implemented L1, L2, Linf, Cosine distance functions for arrays and L1, L2, Linf norm functions for arrays. + [#37033](https://github.com/ClickHouse/ClickHouse/pull/37033) ([qieqieplus](https://github.com/qieqieplus)). Caveat: the functions will be renamed. +* Improve the `WATCH` query in WindowView: 1. Reduce the latency of providing query results by calling the `fire_condition` signal. 2. Makes the cancel query operation(ctrl-c) faster, by checking `isCancelled()` more frequently. [#37226](https://github.com/ClickHouse/ClickHouse/pull/37226) ([vxider](https://github.com/Vxider)). +* Introspection for remove filesystem cache. [#36802](https://github.com/ClickHouse/ClickHouse/pull/36802) ([Han Shukai](https://github.com/KinderRiven)). +* Added new hash function `wyHash64` for SQL. [#36467](https://github.com/ClickHouse/ClickHouse/pull/36467) ([olevino](https://github.com/olevino)). +* Improvement for replicated databases: Added `SYSTEM SYNC DATABASE REPLICA` query which allows to sync tables metadata inside Replicated database, because currently synchronisation is asynchronous. [#35944](https://github.com/ClickHouse/ClickHouse/pull/35944) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Improvement for remote filesystem cache: Better read from cache. [#37054](https://github.com/ClickHouse/ClickHouse/pull/37054) ([Kseniia Sumarokova](https://github.com/kssenii)). Improve `SYSTEM DROP FILESYSTEM CACHE` query: `` option and `FORCE` option. [#36639](https://github.com/ClickHouse/ClickHouse/pull/36639) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improvement for semistructured data: Allow to cast columns of type `Object(...)` to `Object(Nullable(...))`. [#36564](https://github.com/ClickHouse/ClickHouse/pull/36564) ([awakeljw](https://github.com/awakeljw)). +* Improvement for parallel replicas: We create a local interpreter if we want to execute query on localhost replica. But for when executing query on multiple replicas we rely on the fact that a connection exists so replicas can talk to coordinator. It is now improved and localhost replica can talk to coordinator directly in the same process. [#36281](https://github.com/ClickHouse/ClickHouse/pull/36281) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Performance Improvement + +* Improve performance of `avg`, `sum` aggregate functions if used without GROUP BY expression. [#37257](https://github.com/ClickHouse/ClickHouse/pull/37257) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of unary arithmetic functions (`bitCount`, `bitNot`, `abs`, `intExp2`, `intExp10`, `negate`, `roundAge`, `roundDuration`, `roundToExp2`, `sign`) using dynamic dispatch. [#37289](https://github.com/ClickHouse/ClickHouse/pull/37289) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of ORDER BY, MergeJoin, insertion into MergeTree using JIT compilation of sort columns comparator. [#34469](https://github.com/ClickHouse/ClickHouse/pull/34469) ([Maksim Kita](https://github.com/kitaisreal)). +* Change structure of `system.asynchronous_metric_log`. It will take about 10 times less space. This closes [#36357](https://github.com/ClickHouse/ClickHouse/issues/36357). The field `event_time_microseconds` was removed, because it is useless. [#36360](https://github.com/ClickHouse/ClickHouse/pull/36360) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Load marks for only necessary columns when reading wide parts. [#36879](https://github.com/ClickHouse/ClickHouse/pull/36879) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Improves performance of file descriptor cache by narrowing mutex scopes. [#36682](https://github.com/ClickHouse/ClickHouse/pull/36682) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Improve performance of reading from storage `File` and table functions `file` in case when path has globs and matched directory contains large number of files. [#36647](https://github.com/ClickHouse/ClickHouse/pull/36647) ([Anton Popov](https://github.com/CurtizJ)). +* Apply parallel parsing for input format `HiveText`, which can speed up HiveText parsing by 2x when reading local file. [#36650](https://github.com/ClickHouse/ClickHouse/pull/36650) ([李扬](https://github.com/taiyang-li)). +* The default `HashJoin` is not thread safe for inserting right table's rows and run it in a single thread. When the right table is large, the join process is too slow with low cpu utilization. [#36415](https://github.com/ClickHouse/ClickHouse/pull/36415) ([lgbo](https://github.com/lgbo-ustc)). +* Allow to rewrite `select countDistinct(a) from t` to `select count(1) from (select a from t groupBy a)`. [#35993](https://github.com/ClickHouse/ClickHouse/pull/35993) ([zhanglistar](https://github.com/zhanglistar)). +* Transform OR LIKE chain to multiMatchAny. Will enable once we have more confidence it works. [#34932](https://github.com/ClickHouse/ClickHouse/pull/34932) ([Daniel Kutenin](https://github.com/danlark1)). +* Improve performance of some functions with inlining. [#34544](https://github.com/ClickHouse/ClickHouse/pull/34544) ([Daniel Kutenin](https://github.com/danlark1)). +* Add a branch to avoid unnecessary memcpy in readBig. It improves performance somewhat. [#36095](https://github.com/ClickHouse/ClickHouse/pull/36095) ([jasperzhu](https://github.com/jinjunzh)). +* Implement partial GROUP BY key for optimize_aggregation_in_order. [#35111](https://github.com/ClickHouse/ClickHouse/pull/35111) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Show names of erroneous files in case of parsing errors while executing table functions `file`, `s3` and `url`. [#36314](https://github.com/ClickHouse/ClickHouse/pull/36314) ([Anton Popov](https://github.com/CurtizJ)). +* Allowed to increase the number of threads for executing background operations (merges, mutations, moves and fetches) at runtime if they are specified at top level config. [#36425](https://github.com/ClickHouse/ClickHouse/pull/36425) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Now date time conversion functions that generates time before 1970-01-01 00:00:00 with partial hours/minutes timezones will be saturated to zero instead of overflow. This is the continuation of https://github.com/ClickHouse/ClickHouse/pull/29953 which addresses https://github.com/ClickHouse/ClickHouse/pull/29953#discussion_r800550280 . Mark as improvement because it's implementation defined behavior (and very rare case) and we are allowed to break it. [#36656](https://github.com/ClickHouse/ClickHouse/pull/36656) ([Amos Bird](https://github.com/amosbird)). +* Add a warning if someone running clickhouse-server with log level "test". The log level "test" was added recently and cannot be used in production due to inevitable, unavoidable, fatal and life-threatening performance degradation. [#36824](https://github.com/ClickHouse/ClickHouse/pull/36824) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Parse collations in CREATE TABLE, throw exception or ignore. closes [#35892](https://github.com/ClickHouse/ClickHouse/issues/35892). [#36271](https://github.com/ClickHouse/ClickHouse/pull/36271) ([yuuch](https://github.com/yuuch)). +* Option `compatibility_ignore_auto_increment_in_create_table` allows ignoring `AUTO_INCREMENT` keyword in a column declaration to simplify migration from MySQL. [#37178](https://github.com/ClickHouse/ClickHouse/pull/37178) ([Igor Nikonov](https://github.com/devcrafter)). +* Add aliases `JSONLines` and `NDJSON` for `JSONEachRow`. Closes [#36303](https://github.com/ClickHouse/ClickHouse/issues/36303). [#36327](https://github.com/ClickHouse/ClickHouse/pull/36327) ([flynn](https://github.com/ucasfl)). +* Limit the max partitions could be queried for each hive table. Avoid resource overruns. [#37281](https://github.com/ClickHouse/ClickHouse/pull/37281) ([lgbo](https://github.com/lgbo-ustc)). +* Added implicit cast for `h3kRing` function second argument to improve usability. Closes [#35432](https://github.com/ClickHouse/ClickHouse/issues/35432). [#37189](https://github.com/ClickHouse/ClickHouse/pull/37189) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix progress indication for `INSERT SELECT` in `clickhouse-local` for any query and for file progress in client, more correct file progress. [#37075](https://github.com/ClickHouse/ClickHouse/pull/37075) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug which can lead to forgotten outdated parts in MergeTree table engines family in case of filesystem failures during parts removal. Before fix they will be removed only after first server restart. [#37014](https://github.com/ClickHouse/ClickHouse/pull/37014) ([alesapin](https://github.com/alesapin)). +* Implemented a new mode of handling row policies which can be enabled in the main configuration which enables users without permissive row policies to read rows. [#36997](https://github.com/ClickHouse/ClickHouse/pull/36997) ([Vitaly Baranov](https://github.com/vitlibar)). +* Play UI: Nullable numbers will be aligned to the right in table cells. This closes [#36982](https://github.com/ClickHouse/ClickHouse/issues/36982). [#36988](https://github.com/ClickHouse/ClickHouse/pull/36988) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Play UI: If there is one row in result and more than a few columns, display the result vertically. Continuation of [#36811](https://github.com/ClickHouse/ClickHouse/issues/36811). [#36842](https://github.com/ClickHouse/ClickHouse/pull/36842) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Cleanup CSS in Play UI. The pixels are more evenly placed. Better usability for long content in table cells. [#36569](https://github.com/ClickHouse/ClickHouse/pull/36569) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Finalize write buffers in case of exception to avoid doing it in destructors. Hope it fixes: [#36907](https://github.com/ClickHouse/ClickHouse/issues/36907). [#36979](https://github.com/ClickHouse/ClickHouse/pull/36979) ([Kruglov Pavel](https://github.com/Avogar)). +* After [#36425](https://github.com/ClickHouse/ClickHouse/issues/36425) settings like `background_fetches_pool_size` became obsolete and can appear in top level config, but clickhouse throws and exception like `Error updating configuration from '/etc/clickhouse-server/config.xml' config.: Code: 137. DB::Exception: A setting 'background_fetches_pool_size' appeared at top level in config /etc/clickhouse-server/config.xml.` This is fixed. [#36917](https://github.com/ClickHouse/ClickHouse/pull/36917) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add extra diagnostic info (if applicable) when sending exception to other server. [#36872](https://github.com/ClickHouse/ClickHouse/pull/36872) ([tavplubix](https://github.com/tavplubix)). +* Allow to execute hash functions with arguments of type `Array(Tuple(..))`. [#36812](https://github.com/ClickHouse/ClickHouse/pull/36812) ([Anton Popov](https://github.com/CurtizJ)). +* Added `user_defined_path` config setting. [#36753](https://github.com/ClickHouse/ClickHouse/pull/36753) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow cluster macro in `s3Cluster` table function. [#36726](https://github.com/ClickHouse/ClickHouse/pull/36726) ([Vadim Volodin](https://github.com/PolyProgrammist)). +* Properly cancel INSERT queries in `clickhouse-client`/`clickhouse-local`. [#36710](https://github.com/ClickHouse/ClickHouse/pull/36710) ([Azat Khuzhin](https://github.com/azat)). +* Allow to cancel a query while still keeping a decent query id in `MySQLHandler`. [#36699](https://github.com/ClickHouse/ClickHouse/pull/36699) ([Amos Bird](https://github.com/amosbird)). +* Add `is_all_data_sent` column into `system.processes`, and improve internal testing hardening check based on it. [#36649](https://github.com/ClickHouse/ClickHouse/pull/36649) ([Azat Khuzhin](https://github.com/azat)). +* The metrics about time spent reading from s3 now calculated correctly. Close [#35483](https://github.com/ClickHouse/ClickHouse/issues/35483). [#36572](https://github.com/ClickHouse/ClickHouse/pull/36572) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow file descriptors in table function file if it is run in clickhouse-local. [#36562](https://github.com/ClickHouse/ClickHouse/pull/36562) ([wuxiaobai24](https://github.com/wuxiaobai24)). +* Allow names of tuple elements that start from digits. [#36544](https://github.com/ClickHouse/ClickHouse/pull/36544) ([Anton Popov](https://github.com/CurtizJ)). +* Now clickhouse-benchmark can read authentication info from environment variables. [#36497](https://github.com/ClickHouse/ClickHouse/pull/36497) ([Anton Kozlov](https://github.com/tonickkozlov)). +* `clickhouse-keeper` improvement: add support for force recovery which allows you to reconfigure cluster without quorum. [#36258](https://github.com/ClickHouse/ClickHouse/pull/36258) ([Antonio Andelic](https://github.com/antonio2368)). +* Improve schema inference for JSON objects. [#36207](https://github.com/ClickHouse/ClickHouse/pull/36207) ([Kruglov Pavel](https://github.com/Avogar)). +* Refactor code around schema inference with globs. Try next file from glob only if it makes sense (previously we tried next file in case of any error). Also it fixes [#36317](https://github.com/ClickHouse/ClickHouse/issues/36317). [#36205](https://github.com/ClickHouse/ClickHouse/pull/36205) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a separate `CLUSTER` grant (and `access_control_improvements.on_cluster_queries_require_cluster_grant` configuration directive, for backward compatibility, default to `false`). [#35767](https://github.com/ClickHouse/ClickHouse/pull/35767) ([Azat Khuzhin](https://github.com/azat)). +* If the required amount of memory is available before the selected query stopped, all waiting queries continue execution. Now we don't stop any query if memory is freed before the moment when the selected query knows about the cancellation. [#35637](https://github.com/ClickHouse/ClickHouse/pull/35637) ([Dmitry Novik](https://github.com/novikd)). +* Nullables detection in protobuf. In proto3, default values are not sent on the wire. This makes it non-trivial to distinguish between null and default values for Nullable columns. A standard way to deal with this problem is to use Google wrappers to nest the target value within an inner message (see https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto). In this case, a missing field is interpreted as null value, a field with missing value if interpreted as default value, and a field with regular value is interpreted as regular value. However, ClickHouse interprets Google wrappers as nested columns. We propose to introduce special behaviour to detect Google wrappers and interpret them like in the description above. For example, to serialize values for a Nullable column `test`, we would use `google.protobuf.StringValue test` in our .proto schema. Note that these types are so called "well-known types" in Protobuf, implemented in the library itself. [#35149](https://github.com/ClickHouse/ClickHouse/pull/35149) ([Jakub Kuklis](https://github.com/jkuklis)). +* Added support for specifying `content_type` in predefined and static HTTP handler config. [#34916](https://github.com/ClickHouse/ClickHouse/pull/34916) ([Roman Nikonov](https://github.com/nic11)). +* Warn properly if use clickhouse-client --file without preceeding --external. Close [#34747](https://github.com/ClickHouse/ClickHouse/issues/34747). [#34765](https://github.com/ClickHouse/ClickHouse/pull/34765) ([李扬](https://github.com/taiyang-li)). +* Improve MySQL database engine to compatible with binary(0) dataType. [#37232](https://github.com/ClickHouse/ClickHouse/pull/37232) ([zzsmdfj](https://github.com/zzsmdfj)). +* Improve JSON report of clickhouse-benchmark. [#36473](https://github.com/ClickHouse/ClickHouse/pull/36473) ([Tian Xinhui](https://github.com/xinhuitian)). +* Server might refuse to start if it cannot resolve hostname of external ClickHouse dictionary. It's fixed. Fixes [#36451](https://github.com/ClickHouse/ClickHouse/issues/36451). [#36463](https://github.com/ClickHouse/ClickHouse/pull/36463) ([tavplubix](https://github.com/tavplubix)). + +#### Build/Testing/Packaging Improvement + +* Now `clickhouse-keeper` for the `x86_64` architecture is statically linked with [musl](https://musl.libc.org/) and doesn't depend on any system libraries. [#31833](https://github.com/ClickHouse/ClickHouse/pull/31833) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* ClickHouse builds for `PowerPC64LE` architecture are now available in universal installation script `curl https://clickhouse.com/ | sh` and by direct link `https://builds.clickhouse.com/master/powerpc64le/clickhouse`. [#37095](https://github.com/ClickHouse/ClickHouse/pull/37095) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Limit PowerPC code generation to Power8 for better compatibility. This closes [#36025](https://github.com/ClickHouse/ClickHouse/issues/36025). [#36529](https://github.com/ClickHouse/ClickHouse/pull/36529) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Simplify performance test. This will give a chance for us to use it. [#36769](https://github.com/ClickHouse/ClickHouse/pull/36769) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fail performance comparison on errors in the report. [#34797](https://github.com/ClickHouse/ClickHouse/pull/34797) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add ZSTD support for Arrow. This fixes [#35283](https://github.com/ClickHouse/ClickHouse/issues/35283). [#35486](https://github.com/ClickHouse/ClickHouse/pull/35486) ([Sean Lafferty](https://github.com/seanlaff)). + +#### Bug Fix + +* Extracts Version ID if present from the URI and adds a request to the AWS HTTP URI. Closes [#31221](https://github.com/ClickHouse/ClickHouse/issues/31221). - [x] Extract `Version ID` from URI if present and reassemble without it. - [x] Configure `AWS HTTP URI` object with request. - [x] Unit Tests: [`gtest_s3_uri`](https://github.com/ClickHouse/ClickHouse/blob/2340a6c6849ebc05a8efbf97ba8de3ff9dc0eff4/src/IO/tests/gtest_s3_uri.cpp) - [x] Drop instrumentation commit. [#34571](https://github.com/ClickHouse/ClickHouse/pull/34571) ([Saad Ur Rahman](https://github.com/surahman)). +* Fix system.opentelemetry_span_log attribute.values alias to values instead of keys. [#37275](https://github.com/ClickHouse/ClickHouse/pull/37275) ([Aleksandr Razumov](https://github.com/ernado)). +* Fix Nullable(String) to Nullable(Bool/IPv4/IPv6) conversion Closes [#37221](https://github.com/ClickHouse/ClickHouse/issues/37221). [#37270](https://github.com/ClickHouse/ClickHouse/pull/37270) ([Kruglov Pavel](https://github.com/Avogar)). +* Experimental feature: Fix execution of mutations in tables, in which there exist columns of type `Object`. Using subcolumns of type `Object` in `WHERE` expression of `UPDATE` or `DELETE` queries is now allowed yet, as well as manipulating (`DROP`, `MODIFY`) of separate subcolumns. Fixes [#37205](https://github.com/ClickHouse/ClickHouse/issues/37205). [#37266](https://github.com/ClickHouse/ClickHouse/pull/37266) ([Anton Popov](https://github.com/CurtizJ)). +* Kafka does not need `group.id` on producer stage. In console log you can find Warning that describe this issue: ``` 2022.05.15 17:59:13.270227 [ 137 ] {} StorageKafka (topic-name): [rdk:CONFWARN] [thrd:app]: Configuration property group.id is a consumer property and will be ignored by this producer instance ```. [#37228](https://github.com/ClickHouse/ClickHouse/pull/37228) ([Mark Andreev](https://github.com/mrk-andreev)). +* Experimental feature (WindowView): Update `max_fired_watermark ` after blocks actually fired, in case delete data that hasn't been fired yet. [#37225](https://github.com/ClickHouse/ClickHouse/pull/37225) ([vxider](https://github.com/Vxider)). +* Fix "Cannot create column of type Set" for distributed queries with LIMIT BY. [#37193](https://github.com/ClickHouse/ClickHouse/pull/37193) ([Azat Khuzhin](https://github.com/azat)). +* Experimental feature: Now WindowView `WATCH EVENTS` query will not be terminated due to the nonempty Chunk created in `WindowViewSource.h:58`. [#37182](https://github.com/ClickHouse/ClickHouse/pull/37182) ([vxider](https://github.com/Vxider)). +* Enable `enable_global_with_statement` for subqueries, close [#37141](https://github.com/ClickHouse/ClickHouse/issues/37141). [#37166](https://github.com/ClickHouse/ClickHouse/pull/37166) ([Vladimir C](https://github.com/vdimir)). +* Fix implicit cast for optimize_skip_unused_shards_rewrite_in. [#37153](https://github.com/ClickHouse/ClickHouse/pull/37153) ([Azat Khuzhin](https://github.com/azat)). +* The ILIKE function on FixedString columns could have returned wrong results (i.e. match less than it should). [#37117](https://github.com/ClickHouse/ClickHouse/pull/37117) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix `GROUP BY` `AggregateFunction` (i.e. you `GROUP BY` by the column that has `AggregateFunction` type). [#37093](https://github.com/ClickHouse/ClickHouse/pull/37093) ([Azat Khuzhin](https://github.com/azat)). +* Experimental feature: Fix optimize_aggregation_in_order with prefix GROUP BY and *Array aggregate functions. [#37050](https://github.com/ClickHouse/ClickHouse/pull/37050) ([Azat Khuzhin](https://github.com/azat)). +* Fixed performance degradation of some INSERT SELECT queries with implicit aggregation. Fixes [#36792](https://github.com/ClickHouse/ClickHouse/issues/36792). [#37047](https://github.com/ClickHouse/ClickHouse/pull/37047) ([tavplubix](https://github.com/tavplubix)). +* Experimental feature: Fix in-order `GROUP BY` (`optimize_aggregation_in_order=1`) with `*Array` (`groupArrayArray`/...) aggregate functions. [#37046](https://github.com/ClickHouse/ClickHouse/pull/37046) ([Azat Khuzhin](https://github.com/azat)). +* Fix LowCardinality->ArrowDictionary invalid output when type of indexes is not UInt8. Closes [#36832](https://github.com/ClickHouse/ClickHouse/issues/36832). [#37043](https://github.com/ClickHouse/ClickHouse/pull/37043) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed problem with infs in `quantileTDigest`. Fixes [#32107](https://github.com/ClickHouse/ClickHouse/issues/32107). [#37021](https://github.com/ClickHouse/ClickHouse/pull/37021) ([Vladimir Chebotarev](https://github.com/excitoon)). +* Fix sending external tables data in HedgedConnections with max_parallel_replicas != 1. [#36981](https://github.com/ClickHouse/ClickHouse/pull/36981) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed logical error on `TRUNCATE` query in `Replicated` database. Fixes [#33747](https://github.com/ClickHouse/ClickHouse/issues/33747). [#36976](https://github.com/ClickHouse/ClickHouse/pull/36976) ([tavplubix](https://github.com/tavplubix)). +* Experimental feature: Fix stuck when dropping source table in WindowView. Closes [#35678](https://github.com/ClickHouse/ClickHouse/issues/35678). [#36967](https://github.com/ClickHouse/ClickHouse/pull/36967) ([vxider](https://github.com/Vxider)). +* Experimental feature (rocksdb cache): Fix issue: [#36671](https://github.com/ClickHouse/ClickHouse/issues/36671). [#36929](https://github.com/ClickHouse/ClickHouse/pull/36929) ([李扬](https://github.com/taiyang-li)). +* Experimental feature: Fix bugs when using multiple columns in WindowView by adding converting actions to make it possible to call`writeIntoWindowView` with a slightly different schema. [#36928](https://github.com/ClickHouse/ClickHouse/pull/36928) ([vxider](https://github.com/Vxider)). +* Fix bug in clickhouse-keeper which can lead to corrupted compressed log files in case of small load and restarts. [#36910](https://github.com/ClickHouse/ClickHouse/pull/36910) ([alesapin](https://github.com/alesapin)). +* Fix incorrect query result when doing constant aggregation. This fixes [#36728](https://github.com/ClickHouse/ClickHouse/issues/36728) . [#36888](https://github.com/ClickHouse/ClickHouse/pull/36888) ([Amos Bird](https://github.com/amosbird)). +* Experimental feature: Fix `current_size` count in cache. [#36887](https://github.com/ClickHouse/ClickHouse/pull/36887) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Experimental feature: Fix fire in window view with hop window [#34044](https://github.com/ClickHouse/ClickHouse/issues/34044). [#36861](https://github.com/ClickHouse/ClickHouse/pull/36861) ([vxider](https://github.com/Vxider)). +* Experimental feature: Fix incorrect cast in cached buffer from remote fs. [#36809](https://github.com/ClickHouse/ClickHouse/pull/36809) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix creation of tables with `flatten_nested = 0`. Previously unflattened `Nested` columns could be flattened after server restart. [#36803](https://github.com/ClickHouse/ClickHouse/pull/36803) ([Anton Popov](https://github.com/CurtizJ)). +* Fix some issues with async reads from remote filesystem which happened when reading low cardinality. [#36763](https://github.com/ClickHouse/ClickHouse/pull/36763) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Experimental feature: Fix insertion to columns of type `Object` from multiple files, e.g. via table function `file` with globs. [#36762](https://github.com/ClickHouse/ClickHouse/pull/36762) ([Anton Popov](https://github.com/CurtizJ)). +* Fix timeouts in Hedged requests. Connection hang right after sending remote query could lead to eternal waiting. [#36749](https://github.com/ClickHouse/ClickHouse/pull/36749) ([Kruglov Pavel](https://github.com/Avogar)). +* Experimental feature: Fix a bug of `groupBitmapAndState`/`groupBitmapOrState`/`groupBitmapXorState` on distributed table. [#36739](https://github.com/ClickHouse/ClickHouse/pull/36739) ([Zhang Yifan](https://github.com/zhangyifan27)). +* Experimental feature: During the [test](https://s3.amazonaws.com/clickhouse-test-reports/36376/1cb1c7275cb53769ab826772db9b71361bb3e413/stress_test__thread__actions_/clickhouse-server.clean.log) in [PR](https://github.com/ClickHouse/ClickHouse/pull/36376), I found that the one cache class was initialized twice, it throws a exception. Although the cause of this problem is not clear, there should be code logic of repeatedly loading disk in ClickHouse, so we need to make special judgment for this situation. [#36737](https://github.com/ClickHouse/ClickHouse/pull/36737) ([Han Shukai](https://github.com/KinderRiven)). +* Fix vertical merges in wide parts. Previously an exception `There is no column` can be thrown during merge. [#36707](https://github.com/ClickHouse/ClickHouse/pull/36707) ([Anton Popov](https://github.com/CurtizJ)). +* Fix server reload on port change (do not wait for current connections from query context). [#36700](https://github.com/ClickHouse/ClickHouse/pull/36700) ([Azat Khuzhin](https://github.com/azat)). +* Experimental feature: In the previous [PR](https://github.com/ClickHouse/ClickHouse/pull/36376), I found that testing (stateless tests, flaky check (address, actions)) is timeout. Moreover, testing locally can also trigger unstable system deadlocks. This problem still exists when using the latest source code of master. [#36697](https://github.com/ClickHouse/ClickHouse/pull/36697) ([Han Shukai](https://github.com/KinderRiven)). +* Experimental feature: Fix server restart if cache configuration changed. [#36685](https://github.com/ClickHouse/ClickHouse/pull/36685) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible heap-use-after-free in schema inference. Closes [#36661](https://github.com/ClickHouse/ClickHouse/issues/36661). [#36679](https://github.com/ClickHouse/ClickHouse/pull/36679) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed parsing of query settings in `CREATE` query when engine is not specified. Fixes https://github.com/ClickHouse/ClickHouse/pull/34187#issuecomment-1103812419. [#36642](https://github.com/ClickHouse/ClickHouse/pull/36642) ([tavplubix](https://github.com/tavplubix)). +* Experimental feature: Fix merges of wide parts with type `Object`. [#36637](https://github.com/ClickHouse/ClickHouse/pull/36637) ([Anton Popov](https://github.com/CurtizJ)). +* Fix format crash when default expression follow EPHEMERAL not literal. Closes [#36618](https://github.com/ClickHouse/ClickHouse/issues/36618). [#36633](https://github.com/ClickHouse/ClickHouse/pull/36633) ([flynn](https://github.com/ucasfl)). +* Fix `Missing column` exception which could happen while using `INTERPOLATE` with `ENGINE = MergeTree` table. [#36549](https://github.com/ClickHouse/ClickHouse/pull/36549) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix potential error with literals in `WHERE` for join queries. Close [#36279](https://github.com/ClickHouse/ClickHouse/issues/36279). [#36542](https://github.com/ClickHouse/ClickHouse/pull/36542) ([Vladimir C](https://github.com/vdimir)). +* Fix offset update ReadBufferFromEncryptedFile, which could cause undefined behaviour. [#36493](https://github.com/ClickHouse/ClickHouse/pull/36493) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix hostname sanity checks for Keeper cluster configuration. Add `keeper_server.host_checks_enabled` config to enable/disable those checks. [#36492](https://github.com/ClickHouse/ClickHouse/pull/36492) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix usage of executable user defined functions in GROUP BY. Before executable user defined functions cannot be used as expressions in GROUP BY. Closes [#36448](https://github.com/ClickHouse/ClickHouse/issues/36448). [#36486](https://github.com/ClickHouse/ClickHouse/pull/36486) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible exception with unknown packet from server in client. [#36481](https://github.com/ClickHouse/ClickHouse/pull/36481) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Experimental feature (please never use `system.session_log`, it is going to be removed): Add missing enum values in system.session_log table. Closes [#36474](https://github.com/ClickHouse/ClickHouse/issues/36474). [#36480](https://github.com/ClickHouse/ClickHouse/pull/36480) ([Memo](https://github.com/Joeywzr)). +* Fix bug in s3Cluster schema inference that let to the fact that not all data was read in the select from s3Cluster. The bug appeared in https://github.com/ClickHouse/ClickHouse/pull/35544. [#36434](https://github.com/ClickHouse/ClickHouse/pull/36434) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix nullptr dereference in JOIN and COLUMNS matcher. This fixes [#36416](https://github.com/ClickHouse/ClickHouse/issues/36416). This is for https://github.com/ClickHouse/ClickHouse/pull/36417. [#36430](https://github.com/ClickHouse/ClickHouse/pull/36430) ([Amos Bird](https://github.com/amosbird)). +* Fix dictionary reload for `ClickHouseDictionarySource` if it contains scalar subqueries. [#36390](https://github.com/ClickHouse/ClickHouse/pull/36390) ([lthaooo](https://github.com/lthaooo)). +* Fix assertion in JOIN, close [#36199](https://github.com/ClickHouse/ClickHouse/issues/36199). [#36201](https://github.com/ClickHouse/ClickHouse/pull/36201) ([Vladimir C](https://github.com/vdimir)). +* Queries with aliases inside special operators returned parsing error (was broken in 22.1). Example: `SELECT substring('test' AS t, 1, 1)`. [#36167](https://github.com/ClickHouse/ClickHouse/pull/36167) ([Maksim Kita](https://github.com/kitaisreal)). +* Experimental feature: Fix insertion of complex JSONs with nested arrays to columns of type `Object`. [#36077](https://github.com/ClickHouse/ClickHouse/pull/36077) ([Anton Popov](https://github.com/CurtizJ)). +* Fix ALTER DROP COLUMN of nested column with compact parts (i.e. `ALTER TABLE x DROP COLUMN n`, when there is column `n.d`). [#35797](https://github.com/ClickHouse/ClickHouse/pull/35797) ([Azat Khuzhin](https://github.com/azat)). +* Fix substring function range error length when `offset` and `length` is negative constant and `s` is not constant. [#33861](https://github.com/ClickHouse/ClickHouse/pull/33861) ([RogerYK](https://github.com/RogerYK)). + + +### ClickHouse release 22.4, 2022-04-19 + +#### Backward Incompatible Change + +* Do not allow SETTINGS after FORMAT for INSERT queries (there is compatibility setting `allow_settings_after_format_in_insert` to accept such queries, but it is turned OFF by default). [#35883](https://github.com/ClickHouse/ClickHouse/pull/35883) ([Azat Khuzhin](https://github.com/azat)). +* Function `yandexConsistentHash` (consistent hashing algorithm by Konstantin "kostik" Oblakov) is renamed to `kostikConsistentHash`. The old name is left as an alias for compatibility. Although this change is backward compatible, we may remove the alias in subsequent releases, that's why it's recommended to update the usages of this function in your apps. [#35553](https://github.com/ClickHouse/ClickHouse/pull/35553) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature + +* Added INTERPOLATE extension to the ORDER BY ... WITH FILL. Closes [#34903](https://github.com/ClickHouse/ClickHouse/issues/34903). [#35349](https://github.com/ClickHouse/ClickHouse/pull/35349) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Profiling on Processors level (under `log_processors_profiles` setting, ClickHouse will write time that processor spent during execution/waiting for data to `system.processors_profile_log` table). [#34355](https://github.com/ClickHouse/ClickHouse/pull/34355) ([Azat Khuzhin](https://github.com/azat)). +* Added functions makeDate(year, month, day), makeDate32(year, month, day). [#35628](https://github.com/ClickHouse/ClickHouse/pull/35628) ([Alexander Gololobov](https://github.com/davenger)). Implementation of makeDateTime() and makeDateTIme64(). [#35934](https://github.com/ClickHouse/ClickHouse/pull/35934) ([Alexander Gololobov](https://github.com/davenger)). +* Support new type of quota `WRITTEN BYTES` to limit amount of written bytes during insert queries. [#35736](https://github.com/ClickHouse/ClickHouse/pull/35736) ([Anton Popov](https://github.com/CurtizJ)). +* Added function `flattenTuple`. It receives nested named `Tuple` as an argument and returns a flatten `Tuple` which elements are the paths from the original `Tuple`. E.g.: `Tuple(a Int, Tuple(b Int, c Int)) -> Tuple(a Int, b Int, c Int)`. `flattenTuple` can be used to select all paths from type `Object` as separate columns. [#35690](https://github.com/ClickHouse/ClickHouse/pull/35690) ([Anton Popov](https://github.com/CurtizJ)). +* Added functions `arrayFirstOrNull`, `arrayLastOrNull`. Closes [#35238](https://github.com/ClickHouse/ClickHouse/issues/35238). [#35414](https://github.com/ClickHouse/ClickHouse/pull/35414) ([Maksim Kita](https://github.com/kitaisreal)). +* Added functions `minSampleSizeContinous` and `minSampleSizeConversion`. Author [achimbab](https://github.com/achimbab). [#35360](https://github.com/ClickHouse/ClickHouse/pull/35360) ([Maksim Kita](https://github.com/kitaisreal)). +* New functions minSampleSizeContinous and minSampleSizeConversion. [#34354](https://github.com/ClickHouse/ClickHouse/pull/34354) ([achimbab](https://github.com/achimbab)). +* Introduce format `ProtobufList` (all records as repeated messages in out Protobuf). Closes [#16436](https://github.com/ClickHouse/ClickHouse/issues/16436). [#35152](https://github.com/ClickHouse/ClickHouse/pull/35152) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Add `h3PointDistM`, `h3PointDistKm`, `h3PointDistRads`, `h3GetRes0Indexes`, `h3GetPentagonIndexes` functions. [#34568](https://github.com/ClickHouse/ClickHouse/pull/34568) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `toLastDayOfMonth` function which rounds up a date or date with time to the last day of the month. [#33501](https://github.com/ClickHouse/ClickHouse/issues/33501). [#34394](https://github.com/ClickHouse/ClickHouse/pull/34394) ([Habibullah Oladepo](https://github.com/holadepo)). +* Added load balancing setting for \[Zoo\]Keeper client. Closes [#29617](https://github.com/ClickHouse/ClickHouse/issues/29617). [#30325](https://github.com/ClickHouse/ClickHouse/pull/30325) ([小路](https://github.com/nicelulu)). +* Add a new kind of row policies named `simple`. Before this PR we had two kinds or row policies: `permissive` and `restrictive`. A `simple` row policy adds a new filter on a table without any side-effects like it was for permissive and restrictive policies. [#35345](https://github.com/ClickHouse/ClickHouse/pull/35345) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added an ability to specify cluster secret in replicated database. [#35333](https://github.com/ClickHouse/ClickHouse/pull/35333) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added sanity checks on server startup (available memory and disk space, max thread count, etc). [#34566](https://github.com/ClickHouse/ClickHouse/pull/34566) ([Sergei Trifonov](https://github.com/serxa)). +* INTERVAL improvement - can be used with `[MILLI|MICRO|NANO]SECOND`. Added `toStartOf[Milli|Micro|Nano]second()` functions. Added `[add|subtract][Milli|Micro|Nano]seconds()`. [#34353](https://github.com/ClickHouse/ClickHouse/pull/34353) ([Andrey Zvonov](https://github.com/zvonand)). + +#### Experimental Feature + +* Added support for transactions for simple `MergeTree` tables. This feature is highly experimental and not recommended for production. Part of [#22086](https://github.com/ClickHouse/ClickHouse/issues/22086). [#24258](https://github.com/ClickHouse/ClickHouse/pull/24258) ([tavplubix](https://github.com/tavplubix)). +* Support schema inference for type `Object` in format `JSONEachRow`. Allow to convert columns of type `Map` to columns of type `Object`. [#35629](https://github.com/ClickHouse/ClickHouse/pull/35629) ([Anton Popov](https://github.com/CurtizJ)). +* Allow to write remote FS cache on all write operations. Add `system.remote_filesystem_cache` table. Add `drop remote filesystem cache` query. Add introspection for s3 metadata with `system.remote_data_paths` table. Closes [#34021](https://github.com/ClickHouse/ClickHouse/issues/34021). Add cache option for merges by adding mode `read_from_filesystem_cache_if_exists_otherwise_bypass_cache` (turned on by default for merges and can also be turned on by query setting with the same name). Rename cache related settings (`remote_fs_enable_cache -> enable_filesystem_cache`, etc). [#35475](https://github.com/ClickHouse/ClickHouse/pull/35475) ([Kseniia Sumarokova](https://github.com/kssenii)). +* An option to store parts metadata in RocksDB. Speed up parts loading process of MergeTree to accelerate starting up of clickhouse-server. With this improvement, clickhouse-server was able to decrease starting up time from 75 minutes to 20 seconds, with 700k mergetree parts. [#32928](https://github.com/ClickHouse/ClickHouse/pull/32928) ([李扬](https://github.com/taiyang-li)). + +#### Performance Improvement + +* A new query plan optimization. Evaluate functions after `ORDER BY` when possible. As an example, for a query `SELECT sipHash64(number) FROM numbers(1e8) ORDER BY number LIMIT 5`, function `sipHash64` would be evaluated after `ORDER BY` and `LIMIT`, which gives ~20x speed up. [#35623](https://github.com/ClickHouse/ClickHouse/pull/35623) ([Nikita Taranov](https://github.com/nickitat)). +* Sizes of hash tables used during aggregation now collected and used in later queries to avoid hash tables resizes. [#33439](https://github.com/ClickHouse/ClickHouse/pull/33439) ([Nikita Taranov](https://github.com/nickitat)). +* Improvement for hasAll function using SIMD instructions (SSE and AVX2). [#27653](https://github.com/ClickHouse/ClickHouse/pull/27653) ([youennL-cs](https://github.com/youennL-cs)). [#35723](https://github.com/ClickHouse/ClickHouse/pull/35723) ([Maksim Kita](https://github.com/kitaisreal)). +* Multiple changes to improve ASOF JOIN performance (1.2 - 1.6x as fast). It also adds support to use big integers. [#34733](https://github.com/ClickHouse/ClickHouse/pull/34733) ([Raúl Marín](https://github.com/Algunenano)). +* Improve performance of ASOF JOIN if key is native integer. [#35525](https://github.com/ClickHouse/ClickHouse/pull/35525) ([Maksim Kita](https://github.com/kitaisreal)). +* Parallelization of multipart upload into S3 storage. [#35343](https://github.com/ClickHouse/ClickHouse/pull/35343) ([Sergei Trifonov](https://github.com/serxa)). +* URL storage engine now downloads multiple chunks in parallel if the endpoint supports HTTP Range. Two additional settings were added, `max_download_threads` and `max_download_buffer_size`, which control maximum number of threads a single query can use to download the file and the maximum number of bytes each thread can process. [#35150](https://github.com/ClickHouse/ClickHouse/pull/35150) ([Antonio Andelic](https://github.com/antonio2368)). +* Use multiple threads to download objects from S3. Downloading is controllable using `max_download_threads` and `max_download_buffer_size` settings. [#35571](https://github.com/ClickHouse/ClickHouse/pull/35571) ([Antonio Andelic](https://github.com/antonio2368)). +* Narrow mutex scope when interacting with HDFS. Related to [#35292](https://github.com/ClickHouse/ClickHouse/issues/35292). [#35646](https://github.com/ClickHouse/ClickHouse/pull/35646) ([shuchaome](https://github.com/shuchaome)). +* Require mutations for per-table TTL only when it had been changed. [#35953](https://github.com/ClickHouse/ClickHouse/pull/35953) ([Azat Khuzhin](https://github.com/azat)). + +#### Improvement + +* Multiple improvements for schema inference. Use some tweaks and heuristics to determine numbers, strings, arrays, tuples and maps in CSV, TSV and TSVRaw data formats. Add setting `input_format_csv_use_best_effort_in_schema_inference` for CSV format that enables/disables using these heuristics, if it's disabled, we treat everything as string. Add similar setting `input_format_tsv_use_best_effort_in_schema_inference` for TSV/TSVRaw format. These settings are enabled by default. - Add Maps support for schema inference in Values format. - Fix possible segfault in schema inference in Values format. - Allow to skip columns with unsupported types in Arrow/ORC/Parquet formats. Add corresponding settings for it: `input_format_{parquet|orc|arrow}_skip_columns_with_unsupported_types_in_schema_inference`. These settings are disabled by default. - Allow to convert a column with type Null to a Nullable column with all NULL values in Arrow/Parquet formats. - Allow to specify column names in schema inference via setting `column_names_for_schema_inference` for formats that don't contain column names (like CSV, TSV, JSONCompactEachRow, etc) - Fix schema inference in ORC/Arrow/Parquet formats in terms of working with Nullable columns. Previously all inferred types were not Nullable and it blocked reading Nullable columns from data, now it's fixed and all inferred types are always Nullable (because we cannot understand that column is Nullable or not by reading the schema). - Fix schema inference in Template format with CSV escaping rules. [#35582](https://github.com/ClickHouse/ClickHouse/pull/35582) ([Kruglov Pavel](https://github.com/Avogar)). +* Add parallel parsing and schema inference for format `JSONAsObject`. [#35592](https://github.com/ClickHouse/ClickHouse/pull/35592) ([Anton Popov](https://github.com/CurtizJ)). +* Added a support for automatic schema inference to `s3Cluster` table function. Synced the signatures of `s3 ` and `s3Cluster`. [#35544](https://github.com/ClickHouse/ClickHouse/pull/35544) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Added support for schema inference for `hdfsCluster`. [#35602](https://github.com/ClickHouse/ClickHouse/pull/35602) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add new setting `input_format_json_read_bools_as_numbers` that allows to infer and parse bools as numbers in JSON input formats. It's enabled by default. Suggested by @alexey-milovidov. [#35735](https://github.com/ClickHouse/ClickHouse/pull/35735) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve columns ordering in schema inference for formats TSKV and JSONEachRow, closes [#35640](https://github.com/ClickHouse/ClickHouse/issues/35640). Don't stop schema inference when reading empty row in schema inference for formats TSKV and JSONEachRow. [#35724](https://github.com/ClickHouse/ClickHouse/pull/35724) ([Kruglov Pavel](https://github.com/Avogar)). +* Add settings `input_format_orc_case_insensitive_column_matching`, `input_format_arrow_case_insensitive_column_matching`, and `input_format_parquet_case_insensitive_column_matching` which allows ClickHouse to use case insensitive matching of columns while reading data from ORC, Arrow or Parquet files. [#35459](https://github.com/ClickHouse/ClickHouse/pull/35459) ([Antonio Andelic](https://github.com/antonio2368)). +* Added `is_secure` column to `system.query_log` which denotes if the client is using a secure connection over TCP or HTTP. [#35705](https://github.com/ClickHouse/ClickHouse/pull/35705) ([Antonio Andelic](https://github.com/antonio2368)). +* Now `kafka_num_consumers` can be bigger than amount of physical cores in case of low resource machine (less than 16 cores). [#35926](https://github.com/ClickHouse/ClickHouse/pull/35926) ([alesapin](https://github.com/alesapin)). +* Add some basic metrics to monitor engine=Kafka tables. [#35916](https://github.com/ClickHouse/ClickHouse/pull/35916) ([filimonov](https://github.com/filimonov)). +* Now it's not allowed to `ALTER TABLE ... RESET SETTING` for non-existing settings for MergeTree engines family. Fixes [#35816](https://github.com/ClickHouse/ClickHouse/issues/35816). [#35884](https://github.com/ClickHouse/ClickHouse/pull/35884) ([alesapin](https://github.com/alesapin)). +* Now some `ALTER MODIFY COLUMN` queries for `Arrays` and `Nullable` types can be done at metadata level without mutations. For example, alter from `Array(Enum8('Option1'=1))` to `Array(Enum8('Option1'=1, 'Option2'=2))`. [#35882](https://github.com/ClickHouse/ClickHouse/pull/35882) ([alesapin](https://github.com/alesapin)). +* Added an animation to the hourglass icon to indicate to the user that a query is running. [#35860](https://github.com/ClickHouse/ClickHouse/pull/35860) ([peledni](https://github.com/peledni)). +* support ALTER TABLE t DETACH PARTITION (ALL). [#35794](https://github.com/ClickHouse/ClickHouse/pull/35794) ([awakeljw](https://github.com/awakeljw)). +* Improve projection analysis to optimize trivial queries such as `count()`. [#35788](https://github.com/ClickHouse/ClickHouse/pull/35788) ([Amos Bird](https://github.com/amosbird)). +* Support schema inference for insert select with using `input` table function. Get schema from insertion table instead of inferring it from the data in case of insert select from table functions that support schema inference. Closes [#35639](https://github.com/ClickHouse/ClickHouse/issues/35639). [#35760](https://github.com/ClickHouse/ClickHouse/pull/35760) ([Kruglov Pavel](https://github.com/Avogar)). +* Respect `remote_url_allow_hosts` for Hive tables. [#35743](https://github.com/ClickHouse/ClickHouse/pull/35743) ([李扬](https://github.com/taiyang-li)). +* Implement `send_logs_level` for clickhouse-local. Closes [#35653](https://github.com/ClickHouse/ClickHouse/issues/35653). [#35716](https://github.com/ClickHouse/ClickHouse/pull/35716) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Closes [#35641](https://github.com/ClickHouse/ClickHouse/issues/35641) Allow `EPHEMERAL` columns without explicit default expression. [#35706](https://github.com/ClickHouse/ClickHouse/pull/35706) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add profile event counter `AsyncInsertBytes` about size of async INSERTs. [#35644](https://github.com/ClickHouse/ClickHouse/pull/35644) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the pipeline description for JOIN. [#35612](https://github.com/ClickHouse/ClickHouse/pull/35612) ([何李夫](https://github.com/helifu)). +* Deduce absolute hdfs config path. [#35572](https://github.com/ClickHouse/ClickHouse/pull/35572) ([李扬](https://github.com/taiyang-li)). +* Improve pasting performance and compatibility of clickhouse-client. This helps [#35501](https://github.com/ClickHouse/ClickHouse/issues/35501). [#35541](https://github.com/ClickHouse/ClickHouse/pull/35541) ([Amos Bird](https://github.com/amosbird)). +* It was possible to get stack overflow in distributed queries if one of the settings `async_socket_for_remote` and `use_hedged_requests` is enabled while parsing very deeply nested data type (at least in debug build). Closes [#35509](https://github.com/ClickHouse/ClickHouse/issues/35509). [#35524](https://github.com/ClickHouse/ClickHouse/pull/35524) ([Kruglov Pavel](https://github.com/Avogar)). +* Add sizes of subcolumns to `system.parts_columns` table. [#35488](https://github.com/ClickHouse/ClickHouse/pull/35488) ([Anton Popov](https://github.com/CurtizJ)). +* Add explicit table info to the scan node of query plan and pipeline. [#35460](https://github.com/ClickHouse/ClickHouse/pull/35460) ([何李夫](https://github.com/helifu)). +* Allow server to bind to low-numbered ports (e.g. 443). ClickHouse installation script will set `cap_net_bind_service` to the binary file. [#35451](https://github.com/ClickHouse/ClickHouse/pull/35451) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix INSERT INTO table FROM INFILE: it did not display the progress bar. [#35429](https://github.com/ClickHouse/ClickHouse/pull/35429) ([xiedeyantu](https://github.com/xiedeyantu)). +* Add arguments `--user`, `--password`, `--host`, `--port` for `clickhouse-diagnostics` tool. [#35422](https://github.com/ClickHouse/ClickHouse/pull/35422) ([李扬](https://github.com/taiyang-li)). +* Support uuid for Postgres engines. Closes [#35384](https://github.com/ClickHouse/ClickHouse/issues/35384). [#35403](https://github.com/ClickHouse/ClickHouse/pull/35403) ([Kseniia Sumarokova](https://github.com/kssenii)). +* For table function `s3cluster` or `HDFSCluster` or `hive`, we can't get right `AccessType` by `StorageFactory::instance().getSourceAccessType(getStorageTypeName())`. This pr fix it. [#35365](https://github.com/ClickHouse/ClickHouse/pull/35365) ([李扬](https://github.com/taiyang-li)). +* Remove `--testmode` option for clickhouse-client, enable it unconditionally. [#35354](https://github.com/ClickHouse/ClickHouse/pull/35354) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Don't allow `wchc` operation (four letter command) for clickhouse-keeper. [#35320](https://github.com/ClickHouse/ClickHouse/pull/35320) ([zhangyuli1](https://github.com/zhangyuli1)). +* Add function `getTypeSerializationStreams`. For a specified type (which is detected from column), it returns an array with all the serialization substream paths. This function is useful mainly for developers. [#35290](https://github.com/ClickHouse/ClickHouse/pull/35290) ([李扬](https://github.com/taiyang-li)). +* If `port` is not specified in cluster configuration, default server port will be used. This closes [#34769](https://github.com/ClickHouse/ClickHouse/issues/34769). [#34772](https://github.com/ClickHouse/ClickHouse/pull/34772) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use `minmax` index for orc/parquet file in Hive Engine. Related PR: https://github.com/ClickHouse/arrow/pull/10. [#34631](https://github.com/ClickHouse/ClickHouse/pull/34631) ([李扬](https://github.com/taiyang-li)). +* System log tables now allow to specify COMMENT in ENGINE declaration. Closes [#33768](https://github.com/ClickHouse/ClickHouse/issues/33768). [#34536](https://github.com/ClickHouse/ClickHouse/pull/34536) ([Maksim Kita](https://github.com/kitaisreal)). +* Proper support of setting `max_rows_to_read` in case of reading in order of sorting key and specified limit. Previously the exception `Limit for rows or bytes to read exceeded` could be thrown even if query actually requires to read less amount of rows. [#33230](https://github.com/ClickHouse/ClickHouse/pull/33230) ([Anton Popov](https://github.com/CurtizJ)). +* Respect only quota & period from cgroups, ignore shares (which are not really limit the number of the cores which can be used). [#35815](https://github.com/ClickHouse/ClickHouse/pull/35815) ([filimonov](https://github.com/filimonov)). + +#### Build/Testing/Packaging Improvement + +* Add next batch of randomization settings in functional tests. [#35047](https://github.com/ClickHouse/ClickHouse/pull/35047) ([Kruglov Pavel](https://github.com/Avogar)). +* Add backward compatibility check in stress test. Closes [#25088](https://github.com/ClickHouse/ClickHouse/issues/25088). [#27928](https://github.com/ClickHouse/ClickHouse/pull/27928) ([Kruglov Pavel](https://github.com/Avogar)). +* Migrate package building to `nfpm` - Deprecate `release` script in favor of `packages/build` - Build everything in clickhouse/binary-builder image (cleanup: clickhouse/deb-builder) - Add symbol stripping to cmake (todo: use $prefix/lib/$bin_dir/clickhouse/$binary.debug) - Fix issue with DWARF symbols - Add Alpine APK packages - Rename `alien` to `additional_pkgs`. [#33664](https://github.com/ClickHouse/ClickHouse/pull/33664) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add a night scan and upload for Coverity. [#34895](https://github.com/ClickHouse/ClickHouse/pull/34895) ([Boris Kuschel](https://github.com/bkuschel)). +* A dedicated small package for `clickhouse-keeper`. [#35308](https://github.com/ClickHouse/ClickHouse/pull/35308) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Running with podman was failing: it complains about specifying the same volume twice. [#35978](https://github.com/ClickHouse/ClickHouse/pull/35978) ([Roman Nikonov](https://github.com/nic11)). +* Minor improvement in contrib/krb5 build configuration. [#35832](https://github.com/ClickHouse/ClickHouse/pull/35832) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Add a label to recognize a building task for every image. [#35583](https://github.com/ClickHouse/ClickHouse/pull/35583) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Apply `black` formatter to python code and add a per-commit check. [#35466](https://github.com/ClickHouse/ClickHouse/pull/35466) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Redo alpine image to use clean Dockerfile. Create a script in tests/ci to build both ubuntu and alpine images. Add clickhouse-keeper image (cc @nikitamikhaylov). Add build check to PullRequestCI. Add a job to a ReleaseCI. Add a job to MasterCI to build and push `clickhouse/clickhouse-server:head` and `clickhouse/clickhouse-keeper:head` images for each merged PR. [#35211](https://github.com/ClickHouse/ClickHouse/pull/35211) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Fix stress-test report in CI, now we upload the runlog with information about started stress tests only once. [#35093](https://github.com/ClickHouse/ClickHouse/pull/35093) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Switch to libcxx / libcxxabi from LLVM 14. [#34906](https://github.com/ClickHouse/ClickHouse/pull/34906) ([Raúl Marín](https://github.com/Algunenano)). +* Update unixodbc to mitigate CVE-2018-7485. Note: this CVE is not relevant for ClickHouse as it implements its own isolation layer for ODBC. [#35943](https://github.com/ClickHouse/ClickHouse/pull/35943) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix + +* Added settings `input_format_ipv4_default_on_conversion_error`, `input_format_ipv6_default_on_conversion_error` to allow insert of invalid ip address values as default into tables. Closes [#35726](https://github.com/ClickHouse/ClickHouse/issues/35726). [#35733](https://github.com/ClickHouse/ClickHouse/pull/35733) ([Maksim Kita](https://github.com/kitaisreal)). +* Avoid erasing columns from a block if it doesn't exist while reading data from Hive. [#35393](https://github.com/ClickHouse/ClickHouse/pull/35393) ([lgbo](https://github.com/lgbo-ustc)). +* Add type checking when creating materialized view. Close: [#23684](https://github.com/ClickHouse/ClickHouse/issues/23684). [#24896](https://github.com/ClickHouse/ClickHouse/pull/24896) ([hexiaoting](https://github.com/hexiaoting)). +* Fix formatting of INSERT INFILE queries (missing quotes). [#35886](https://github.com/ClickHouse/ClickHouse/pull/35886) ([Azat Khuzhin](https://github.com/azat)). +* Disable `session_log` because memory safety issue has been found by fuzzing. See [#35714](https://github.com/ClickHouse/ClickHouse/issues/35714). [#35873](https://github.com/ClickHouse/ClickHouse/pull/35873) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Avoid processing per-column TTL multiple times. [#35820](https://github.com/ClickHouse/ClickHouse/pull/35820) ([Azat Khuzhin](https://github.com/azat)). +* Fix inserts to columns of type `Object` in case when there is data related to several partitions in insert query. [#35806](https://github.com/ClickHouse/ClickHouse/pull/35806) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug in indexes of not presented columns in -WithNames formats that led to error `INCORRECT_NUMBER_OF_COLUMNS ` when the number of columns is more than 256. Closes [#35793](https://github.com/ClickHouse/ClickHouse/issues/35793). [#35803](https://github.com/ClickHouse/ClickHouse/pull/35803) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes [#35751](https://github.com/ClickHouse/ClickHouse/issues/35751). [#35799](https://github.com/ClickHouse/ClickHouse/pull/35799) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix for reading from HDFS in Snappy format. [#35771](https://github.com/ClickHouse/ClickHouse/pull/35771) ([shuchaome](https://github.com/shuchaome)). +* Fix bug in conversion from custom types to string that could lead to segfault or unexpected error messages. Closes [#35752](https://github.com/ClickHouse/ClickHouse/issues/35752). [#35755](https://github.com/ClickHouse/ClickHouse/pull/35755) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix any/all (subquery) implementation. Closes [#35489](https://github.com/ClickHouse/ClickHouse/issues/35489). [#35727](https://github.com/ClickHouse/ClickHouse/pull/35727) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix dropping non-empty database in clickhouse-local. Closes [#35692](https://github.com/ClickHouse/ClickHouse/issues/35692). [#35711](https://github.com/ClickHouse/ClickHouse/pull/35711) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug in creating materialized view with subquery after server restart. Materialized view was not getting updated after inserts into underlying table after server restart. Closes [#35511](https://github.com/ClickHouse/ClickHouse/issues/35511). [#35691](https://github.com/ClickHouse/ClickHouse/pull/35691) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible `Can't adjust last granule` exception while reading subcolumns of experimental type `Object`. [#35687](https://github.com/ClickHouse/ClickHouse/pull/35687) ([Anton Popov](https://github.com/CurtizJ)). +* Enable build with JIT compilation by default. [#35683](https://github.com/ClickHouse/ClickHouse/pull/35683) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible loss of subcolumns in experimental type `Object`. [#35682](https://github.com/ClickHouse/ClickHouse/pull/35682) ([Anton Popov](https://github.com/CurtizJ)). +* Fix check ASOF JOIN key nullability, close [#35565](https://github.com/ClickHouse/ClickHouse/issues/35565). [#35674](https://github.com/ClickHouse/ClickHouse/pull/35674) ([Vladimir C](https://github.com/vdimir)). +* Fix part checking logic for parts with projections. Error happened when projection and main part had different types. This is similar to https://github.com/ClickHouse/ClickHouse/pull/33774 . The bug is addressed by @caoyang10. [#35667](https://github.com/ClickHouse/ClickHouse/pull/35667) ([Amos Bird](https://github.com/amosbird)). +* Fix server crash when large number of arguments are passed into `format` function. Please refer to the test file and see how to reproduce the crash. [#35651](https://github.com/ClickHouse/ClickHouse/pull/35651) ([Amos Bird](https://github.com/amosbird)). +* Fix usage of quotas with asynchronous inserts. [#35645](https://github.com/ClickHouse/ClickHouse/pull/35645) ([Anton Popov](https://github.com/CurtizJ)). +* Fix positional arguments with aliases. Closes [#35600](https://github.com/ClickHouse/ClickHouse/issues/35600). [#35620](https://github.com/ClickHouse/ClickHouse/pull/35620) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Check `remote_url_allow_hosts` before schema inference in URL engine Closes [#35064](https://github.com/ClickHouse/ClickHouse/issues/35064). [#35619](https://github.com/ClickHouse/ClickHouse/pull/35619) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `HashJoin` when columns with `LowCardinality` type are used. This closes [#35548](https://github.com/ClickHouse/ClickHouse/issues/35548). [#35616](https://github.com/ClickHouse/ClickHouse/pull/35616) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfault in MaterializedPostgreSQL which happened if exception occurred when data, collected in memory, was synced into underlying tables. Closes [#35611](https://github.com/ClickHouse/ClickHouse/issues/35611). [#35614](https://github.com/ClickHouse/ClickHouse/pull/35614) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Setting `database_atomic_wait_for_drop_and_detach_synchronously` worked incorrectly for `ATTACH TABLE` query when previously detached table is still in use, It's fixed. [#35594](https://github.com/ClickHouse/ClickHouse/pull/35594) ([tavplubix](https://github.com/tavplubix)). +* Fix HTTP headers with named collections, add compression_method. Closes [#35273](https://github.com/ClickHouse/ClickHouse/issues/35273). Closes [#35269](https://github.com/ClickHouse/ClickHouse/issues/35269). [#35593](https://github.com/ClickHouse/ClickHouse/pull/35593) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix s3 engine getting virtual columns. Closes [#35411](https://github.com/ClickHouse/ClickHouse/issues/35411). [#35586](https://github.com/ClickHouse/ClickHouse/pull/35586) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixed return type deduction for `caseWithExpression`. The type of the ELSE branch is now correctly taken into account. [#35576](https://github.com/ClickHouse/ClickHouse/pull/35576) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix parsing of IPv6 addresses longer than 39 characters. Closes [#34022](https://github.com/ClickHouse/ClickHouse/issues/34022). [#35539](https://github.com/ClickHouse/ClickHouse/pull/35539) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix cast into IPv4, IPv6 address in IN section. Fixes [#35528](https://github.com/ClickHouse/ClickHouse/issues/35528). [#35534](https://github.com/ClickHouse/ClickHouse/pull/35534) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash during short circuit function evaluation when one of arguments is nullable constant. Closes [#35497](https://github.com/ClickHouse/ClickHouse/issues/35497). Closes [#35496](https://github.com/ClickHouse/ClickHouse/issues/35496). [#35502](https://github.com/ClickHouse/ClickHouse/pull/35502) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crash for function `throwIf` with constant arguments. [#35500](https://github.com/ClickHouse/ClickHouse/pull/35500) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix bug in Keeper which can lead to unstable client connections. Introduced in [#35031](https://github.com/ClickHouse/ClickHouse/issues/35031). [#35498](https://github.com/ClickHouse/ClickHouse/pull/35498) ([alesapin](https://github.com/alesapin)). +* Fix bug in function `if` when resulting column type differs with resulting data type that led to logical errors like `Logical error: 'Bad cast from type DB::ColumnVector to DB::ColumnVector'.`. Closes [#35367](https://github.com/ClickHouse/ClickHouse/issues/35367). [#35476](https://github.com/ClickHouse/ClickHouse/pull/35476) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix excessive logging when using S3 as backend for MergeTree or as separate table engine/function. Fixes [#30559](https://github.com/ClickHouse/ClickHouse/issues/30559). [#35434](https://github.com/ClickHouse/ClickHouse/pull/35434) ([alesapin](https://github.com/alesapin)). +* Now merges executed with zero copy replication (experimental) will not spam logs with message `Found parts with the same min block and with the same max block as the missing part _ on replica _. Hoping that it will eventually appear as a result of a merge.`. [#35430](https://github.com/ClickHouse/ClickHouse/pull/35430) ([alesapin](https://github.com/alesapin)). +* Skip possible exception if empty chunks appear in GroupingAggregatedTransform. [#35417](https://github.com/ClickHouse/ClickHouse/pull/35417) ([Nikita Taranov](https://github.com/nickitat)). +* Fix working with columns that are not needed in query in Arrow/Parquet/ORC formats, it prevents possible errors like `Unsupported type of an input column ` when file contains column with unsupported type and we don't use it in query. [#35406](https://github.com/ClickHouse/ClickHouse/pull/35406) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix for local cache for remote filesystem (experimental feature) for high concurrency on corner cases. [#35381](https://github.com/ClickHouse/ClickHouse/pull/35381) ([Kseniia Sumarokova](https://github.com/kssenii)). Fix possible deadlock in cache. [#35378](https://github.com/ClickHouse/ClickHouse/pull/35378) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partition pruning in case of comparison with constant in `WHERE`. If column and constant had different types, overflow was possible. Query could return an incorrect empty result. This fixes [#35304](https://github.com/ClickHouse/ClickHouse/issues/35304). [#35334](https://github.com/ClickHouse/ClickHouse/pull/35334) ([Amos Bird](https://github.com/amosbird)). +* Fix schema inference for TSKV format while using small max_read_buffer_size. [#35332](https://github.com/ClickHouse/ClickHouse/pull/35332) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix mutations in tables with enabled sparse columns. [#35284](https://github.com/ClickHouse/ClickHouse/pull/35284) ([Anton Popov](https://github.com/CurtizJ)). +* Do not delay final part writing by default (fixes possible `Memory limit exceeded` during `INSERT` by adding `max_insert_delayed_streams_for_parallel_write` with default to 1000 for writes to s3 and disabled as before otherwise). [#34780](https://github.com/ClickHouse/ClickHouse/pull/34780) ([Azat Khuzhin](https://github.com/azat)). + + +### ClickHouse release v22.3-lts, 2022-03-17 + +#### Backward Incompatible Change + +* Make `arrayCompact` function behave as other higher-order functions: perform compaction not of lambda function results but on the original array. If you're using nontrivial lambda functions in arrayCompact you may restore old behaviour by wrapping `arrayCompact` arguments into `arrayMap`. Closes [#34010](https://github.com/ClickHouse/ClickHouse/issues/34010) [#18535](https://github.com/ClickHouse/ClickHouse/issues/18535) [#14778](https://github.com/ClickHouse/ClickHouse/issues/14778). [#34795](https://github.com/ClickHouse/ClickHouse/pull/34795) ([Alexandre Snarskii](https://github.com/snar)). +* Change implementation specific behavior on overflow of function `toDatetime`. It will be saturated to the nearest min/max supported instant of datetime instead of wraparound. This change is highlighted as "backward incompatible" because someone may unintentionally rely on the old behavior. [#32898](https://github.com/ClickHouse/ClickHouse/pull/32898) ([HaiBo Li](https://github.com/marising)). +* Make function `cast(value, 'IPv4')`, `cast(value, 'IPv6')` behave same as `toIPv4`, `toIPv6` functions. Changed behavior of incorrect IP address passed into functions `toIPv4`,` toIPv6`, now if invalid IP address passes into this functions exception will be raised, before this function return default value. Added functions `IPv4StringToNumOrDefault`, `IPv4StringToNumOrNull`, `IPv6StringToNumOrDefault`, `IPv6StringOrNull` `toIPv4OrDefault`, `toIPv4OrNull`, `toIPv6OrDefault`, `toIPv6OrNull`. Functions `IPv4StringToNumOrDefault `, `toIPv4OrDefault `, `toIPv6OrDefault ` should be used if previous logic relied on `IPv4StringToNum`, `toIPv4`, `toIPv6` returning default value for invalid address. Added setting `cast_ipv4_ipv6_default_on_conversion_error`, if this setting enabled, then IP address conversion functions will behave as before. Closes [#22825](https://github.com/ClickHouse/ClickHouse/issues/22825). Closes [#5799](https://github.com/ClickHouse/ClickHouse/issues/5799). Closes [#35156](https://github.com/ClickHouse/ClickHouse/issues/35156). [#35240](https://github.com/ClickHouse/ClickHouse/pull/35240) ([Maksim Kita](https://github.com/kitaisreal)). + +#### New Feature + +* Support for caching data locally for remote filesystems. It can be enabled for `s3` disks. Closes [#28961](https://github.com/ClickHouse/ClickHouse/issues/28961). [#33717](https://github.com/ClickHouse/ClickHouse/pull/33717) ([Kseniia Sumarokova](https://github.com/kssenii)). In the meantime, we enabled the test suite on s3 filesystem and no more known issues exist, so it is started to be production ready. +* Add new table function `hive`. It can be used as follows `hive('', '', '', '', '')` for example `SELECT * FROM hive('thrift://hivetest:9083', 'test', 'demo', 'id Nullable(String), score Nullable(Int32), day Nullable(String)', 'day')`. [#34946](https://github.com/ClickHouse/ClickHouse/pull/34946) ([lgbo](https://github.com/lgbo-ustc)). +* Support authentication of users connected via SSL by their X.509 certificate. [#31484](https://github.com/ClickHouse/ClickHouse/pull/31484) ([eungenue](https://github.com/eungenue)). +* Support schema inference for inserting into table functions `file`/`hdfs`/`s3`/`url`. [#34732](https://github.com/ClickHouse/ClickHouse/pull/34732) ([Kruglov Pavel](https://github.com/Avogar)). +* Now you can read `system.zookeeper` table without restrictions on path or using `like` expression. This reads can generate quite heavy load for zookeeper so to enable this ability you have to enable setting `allow_unrestricted_reads_from_keeper`. [#34609](https://github.com/ClickHouse/ClickHouse/pull/34609) ([Sergei Trifonov](https://github.com/serxa)). +* Display CPU and memory metrics in clickhouse-local. Close [#34545](https://github.com/ClickHouse/ClickHouse/issues/34545). [#34605](https://github.com/ClickHouse/ClickHouse/pull/34605) ([李扬](https://github.com/taiyang-li)). +* Implement `startsWith` and `endsWith` function for arrays, closes [#33982](https://github.com/ClickHouse/ClickHouse/issues/33982). [#34368](https://github.com/ClickHouse/ClickHouse/pull/34368) ([usurai](https://github.com/usurai)). +* Add three functions for Map data type: 1. `mapReplace(map1, map2)` - replaces values for keys in map1 with the values of the corresponding keys in map2; adds keys from map2 that don't exist in map1. 2. `mapFilter` 3. `mapMap`. mapFilter and mapMap are higher order functions, accepting two arguments, the first argument is a lambda function with k, v pair as arguments, the second argument is a column of type Map. [#33698](https://github.com/ClickHouse/ClickHouse/pull/33698) ([hexiaoting](https://github.com/hexiaoting)). +* Allow getting default user and password for clickhouse-client from the `CLICKHOUSE_USER` and `CLICKHOUSE_PASSWORD` environment variables. Close [#34538](https://github.com/ClickHouse/ClickHouse/issues/34538). [#34947](https://github.com/ClickHouse/ClickHouse/pull/34947) ([DR](https://github.com/freedomDR)). + +#### Experimental Feature + +* New data type `Object()`, which supports storing of semi-structured data (for now JSON only). Data is written to such types as string. Then all paths are extracted according to format of semi-structured data and written as separate columns in most optimal types, that can store all their values. Those columns can be queried by names that match paths in source data. E.g `data.key1.key2` or with cast operator `data.key1.key2::Int64`. +* Add `database_replicated_allow_only_replicated_engine` setting. When enabled, it only allowed to only create `Replicated` tables or tables with stateless engines in `Replicated` databases. [#35214](https://github.com/ClickHouse/ClickHouse/pull/35214) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). Note that `Replicated` database is still an experimental feature. + +#### Performance Improvement + +* Improve performance of insertion into `MergeTree` tables by optimizing sorting. Up to 2x improvement is observed on realistic benchmarks. [#34750](https://github.com/ClickHouse/ClickHouse/pull/34750) ([Maksim Kita](https://github.com/kitaisreal)). +* Columns pruning when reading Parquet, ORC and Arrow files from URL and S3. Closes [#34163](https://github.com/ClickHouse/ClickHouse/issues/34163). [#34849](https://github.com/ClickHouse/ClickHouse/pull/34849) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Columns pruning when reading Parquet, ORC and Arrow files from Hive. [#34954](https://github.com/ClickHouse/ClickHouse/pull/34954) ([lgbo](https://github.com/lgbo-ustc)). +* A bunch of performance optimizations from a performance superhero. Improve performance of processing queries with large `IN` section. Improve performance of `direct` dictionary if its source is `ClickHouse`. Improve performance of `detectCharset `, `detectLanguageUnknown ` functions. [#34888](https://github.com/ClickHouse/ClickHouse/pull/34888) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `any` aggregate function by using more batching. [#34760](https://github.com/ClickHouse/ClickHouse/pull/34760) ([Raúl Marín](https://github.com/Algunenano)). +* Multiple improvements for performance of `clickhouse-keeper`: less locking [#35010](https://github.com/ClickHouse/ClickHouse/pull/35010) ([zhanglistar](https://github.com/zhanglistar)), lower memory usage by streaming reading and writing of snapshot instead of full copy. [#34584](https://github.com/ClickHouse/ClickHouse/pull/34584) ([zhanglistar](https://github.com/zhanglistar)), optimizing compaction of log store in the RAFT implementation. [#34534](https://github.com/ClickHouse/ClickHouse/pull/34534) ([zhanglistar](https://github.com/zhanglistar)), versioning of the internal data structure [#34486](https://github.com/ClickHouse/ClickHouse/pull/34486) ([zhanglistar](https://github.com/zhanglistar)). + +#### Improvement + +* Allow asynchronous inserts to table functions. Fixes [#34864](https://github.com/ClickHouse/ClickHouse/issues/34864). [#34866](https://github.com/ClickHouse/ClickHouse/pull/34866) ([Anton Popov](https://github.com/CurtizJ)). +* Implicit type casting of the key argument for functions `dictGetHierarchy`, `dictIsIn`, `dictGetChildren`, `dictGetDescendants`. Closes [#34970](https://github.com/ClickHouse/ClickHouse/issues/34970). [#35027](https://github.com/ClickHouse/ClickHouse/pull/35027) ([Maksim Kita](https://github.com/kitaisreal)). +* `EXPLAIN AST` query can output AST in form of a graph in Graphviz format: `EXPLAIN AST graph = 1 SELECT * FROM system.parts`. [#35173](https://github.com/ClickHouse/ClickHouse/pull/35173) ([李扬](https://github.com/taiyang-li)). +* When large files were written with `s3` table function or table engine, the content type on the files was mistakenly set to `application/xml` due to a bug in the AWS SDK. This closes [#33964](https://github.com/ClickHouse/ClickHouse/issues/33964). [#34433](https://github.com/ClickHouse/ClickHouse/pull/34433) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Change restrictive row policies a bit to make them an easier alternative to permissive policies in easy cases. If for a particular table only restrictive policies exist (without permissive policies) users will be able to see some rows. Also `SHOW CREATE ROW POLICY` will always show `AS permissive` or `AS restrictive` in row policy's definition. [#34596](https://github.com/ClickHouse/ClickHouse/pull/34596) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve schema inference with globs in File/S3/HDFS/URL engines. Try to use the next path for schema inference in case of error. [#34465](https://github.com/ClickHouse/ClickHouse/pull/34465) ([Kruglov Pavel](https://github.com/Avogar)). +* Play UI now correctly detects the preferred light/dark theme from the OS. [#35068](https://github.com/ClickHouse/ClickHouse/pull/35068) ([peledni](https://github.com/peledni)). +* Added `date_time_input_format = 'best_effort_us'`. Closes [#34799](https://github.com/ClickHouse/ClickHouse/issues/34799). [#34982](https://github.com/ClickHouse/ClickHouse/pull/34982) ([WenYao](https://github.com/Cai-Yao)). +* A new settings called `allow_plaintext_password` and `allow_no_password` are added in server configuration which turn on/off authentication types that can be potentially insecure in some environments. They are allowed by default. [#34738](https://github.com/ClickHouse/ClickHouse/pull/34738) ([Heena Bansal](https://github.com/HeenaBansal2009)). +* Support for `DateTime64` data type in `Arrow` format, closes [#8280](https://github.com/ClickHouse/ClickHouse/issues/8280) and closes [#28574](https://github.com/ClickHouse/ClickHouse/issues/28574). [#34561](https://github.com/ClickHouse/ClickHouse/pull/34561) ([李扬](https://github.com/taiyang-li)). +* Reload `remote_url_allow_hosts` (filtering of outgoing connections) on config update. [#35294](https://github.com/ClickHouse/ClickHouse/pull/35294) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support `--testmode` parameter for `clickhouse-local`. This parameter enables interpretation of test hints that we use in functional tests. [#35264](https://github.com/ClickHouse/ClickHouse/pull/35264) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add `distributed_depth` to query log. It is like a more detailed variant of `is_initial_query` [#35207](https://github.com/ClickHouse/ClickHouse/pull/35207) ([李扬](https://github.com/taiyang-li)). +* Respect `remote_url_allow_hosts` for `MySQL` and `PostgreSQL` table functions. [#35191](https://github.com/ClickHouse/ClickHouse/pull/35191) ([Heena Bansal](https://github.com/HeenaBansal2009)). +* Added `disk_name` field to `system.part_log`. [#35178](https://github.com/ClickHouse/ClickHouse/pull/35178) ([Artyom Yurkov](https://github.com/Varinara)). +* Do not retry non-rertiable errors when querying remote URLs. Closes [#35161](https://github.com/ClickHouse/ClickHouse/issues/35161). [#35172](https://github.com/ClickHouse/ClickHouse/pull/35172) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support distributed INSERT SELECT queries (the setting `parallel_distributed_insert_select`) table function `view()`. [#35132](https://github.com/ClickHouse/ClickHouse/pull/35132) ([Azat Khuzhin](https://github.com/azat)). +* More precise memory tracking during `INSERT` into `Buffer` with `AggregateFunction`. [#35072](https://github.com/ClickHouse/ClickHouse/pull/35072) ([Azat Khuzhin](https://github.com/azat)). +* Avoid division by zero in Query Profiler if Linux kernel has a bug. Closes [#34787](https://github.com/ClickHouse/ClickHouse/issues/34787). [#35032](https://github.com/ClickHouse/ClickHouse/pull/35032) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add more sanity checks for keeper configuration: now mixing of localhost and non-local servers is not allowed, also add checks for same value of internal raft port and keeper client port. [#35004](https://github.com/ClickHouse/ClickHouse/pull/35004) ([alesapin](https://github.com/alesapin)). +* Currently, if the user changes the settings of the system tables there will be tons of logs and ClickHouse will rename the tables every minute. This fixes [#34929](https://github.com/ClickHouse/ClickHouse/issues/34929). [#34949](https://github.com/ClickHouse/ClickHouse/pull/34949) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Use connection pool for Hive metastore client. [#34940](https://github.com/ClickHouse/ClickHouse/pull/34940) ([lgbo](https://github.com/lgbo-ustc)). +* Ignore per-column `TTL` in `CREATE TABLE AS` if new table engine does not support it (i.e. if the engine is not of `MergeTree` family). [#34938](https://github.com/ClickHouse/ClickHouse/pull/34938) ([Azat Khuzhin](https://github.com/azat)). +* Allow `LowCardinality` strings for `ngrambf_v1`/`tokenbf_v1` indexes. Closes [#21865](https://github.com/ClickHouse/ClickHouse/issues/21865). [#34911](https://github.com/ClickHouse/ClickHouse/pull/34911) ([Lars Hiller Eidnes](https://github.com/larspars)). +* Allow opening empty sqlite db if the file doesn't exist. Closes [#33367](https://github.com/ClickHouse/ClickHouse/issues/33367). [#34907](https://github.com/ClickHouse/ClickHouse/pull/34907) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Implement memory statistics for FreeBSD - this is required for `max_server_memory_usage` to work correctly. [#34902](https://github.com/ClickHouse/ClickHouse/pull/34902) ([Alexandre Snarskii](https://github.com/snar)). +* In previous versions the progress bar in clickhouse-client can jump forward near 50% for no reason. This closes [#34324](https://github.com/ClickHouse/ClickHouse/issues/34324). [#34801](https://github.com/ClickHouse/ClickHouse/pull/34801) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Now `ALTER TABLE DROP COLUMN columnX` queries for `MergeTree` table engines will work instantly when `columnX` is an `ALIAS` column. Fixes [#34660](https://github.com/ClickHouse/ClickHouse/issues/34660). [#34786](https://github.com/ClickHouse/ClickHouse/pull/34786) ([alesapin](https://github.com/alesapin)). +* Show hints when user mistyped the name of a data skipping index. Closes [#29698](https://github.com/ClickHouse/ClickHouse/issues/29698). [#34764](https://github.com/ClickHouse/ClickHouse/pull/34764) ([flynn](https://github.com/ucasfl)). +* Support `remote()`/`cluster()` table functions for `parallel_distributed_insert_select`. [#34728](https://github.com/ClickHouse/ClickHouse/pull/34728) ([Azat Khuzhin](https://github.com/azat)). +* Do not reset logging that configured via `--log-file`/`--errorlog-file` command line options in case of empty configuration in the config file. [#34718](https://github.com/ClickHouse/ClickHouse/pull/34718) ([Amos Bird](https://github.com/amosbird)). +* Extract schema only once on table creation and prevent reading from local files/external sources to extract schema on each server startup. [#34684](https://github.com/ClickHouse/ClickHouse/pull/34684) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow specifying argument names for executable UDFs. This is necessary for formats where argument name is part of serialization, like `Native`, `JSONEachRow`. Closes [#34604](https://github.com/ClickHouse/ClickHouse/issues/34604). [#34653](https://github.com/ClickHouse/ClickHouse/pull/34653) ([Maksim Kita](https://github.com/kitaisreal)). +* `MaterializedMySQL` (experimental feature) now supports `materialized_mysql_tables_list` (a comma-separated list of MySQL database tables, which will be replicated by the MaterializedMySQL database engine. Default value: empty list — means all the tables will be replicated), mentioned at [#32977](https://github.com/ClickHouse/ClickHouse/issues/32977). [#34487](https://github.com/ClickHouse/ClickHouse/pull/34487) ([zzsmdfj](https://github.com/zzsmdfj)). +* Improve OpenTelemetry span logs for INSERT operation on distributed table. [#34480](https://github.com/ClickHouse/ClickHouse/pull/34480) ([Frank Chen](https://github.com/FrankChen021)). +* Make the znode `ctime` and `mtime` consistent between servers in ClickHouse Keeper. [#33441](https://github.com/ClickHouse/ClickHouse/pull/33441) ([小路](https://github.com/nicelulu)). + +#### Build/Testing/Packaging Improvement + +* Package repository is migrated to JFrog Artifactory (**Mikhail f. Shiryaev**). +* Randomize some settings in functional tests, so more possible combinations of settings will be tested. This is yet another fuzzing method to ensure better test coverage. This closes [#32268](https://github.com/ClickHouse/ClickHouse/issues/32268). [#34092](https://github.com/ClickHouse/ClickHouse/pull/34092) ([Kruglov Pavel](https://github.com/Avogar)). +* Drop PVS-Studio from our CI. [#34680](https://github.com/ClickHouse/ClickHouse/pull/34680) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add an ability to build stripped binaries with CMake. In previous versions it was performed by dh-tools. [#35196](https://github.com/ClickHouse/ClickHouse/pull/35196) ([alesapin](https://github.com/alesapin)). +* Smaller "fat-free" `clickhouse-keeper` build. [#35031](https://github.com/ClickHouse/ClickHouse/pull/35031) ([alesapin](https://github.com/alesapin)). +* Use @robot-clickhouse as an author and committer for PRs like https://github.com/ClickHouse/ClickHouse/pull/34685. [#34793](https://github.com/ClickHouse/ClickHouse/pull/34793) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Limit DWARF version for debug info by 4 max, because our internal stack symbolizer cannot parse DWARF version 5. This makes sense if you compile ClickHouse with clang-15. [#34777](https://github.com/ClickHouse/ClickHouse/pull/34777) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove `clickhouse-test` debian package as unneeded complication. CI use tests from repository and standalone testing via deb package is no longer supported. [#34606](https://github.com/ClickHouse/ClickHouse/pull/34606) ([Ilya Yatsishin](https://github.com/qoega)). + +#### Bug Fix (user-visible misbehaviour in official stable or prestable release) + +* A fix for HDFS integration: When the inner buffer size is too small, NEED_MORE_INPUT in `HadoopSnappyDecoder` will run multi times (>=3) for one compressed block. This makes the input data be copied into the wrong place in `HadoopSnappyDecoder::buffer`. [#35116](https://github.com/ClickHouse/ClickHouse/pull/35116) ([lgbo](https://github.com/lgbo-ustc)). +* Ignore obsolete grants in ATTACH GRANT statements. This PR fixes [#34815](https://github.com/ClickHouse/ClickHouse/issues/34815). [#34855](https://github.com/ClickHouse/ClickHouse/pull/34855) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix segfault in Postgres database when getting create table query if database was created using named collections. Closes [#35312](https://github.com/ClickHouse/ClickHouse/issues/35312). [#35313](https://github.com/ClickHouse/ClickHouse/pull/35313) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partial merge join duplicate rows bug, close [#31009](https://github.com/ClickHouse/ClickHouse/issues/31009). [#35311](https://github.com/ClickHouse/ClickHouse/pull/35311) ([Vladimir C](https://github.com/vdimir)). +* Fix possible `Assertion 'position() != working_buffer.end()' failed` while using bzip2 compression with small `max_read_buffer_size` setting value. The bug was found in https://github.com/ClickHouse/ClickHouse/pull/35047. [#35300](https://github.com/ClickHouse/ClickHouse/pull/35300) ([Kruglov Pavel](https://github.com/Avogar)). While using lz4 compression with a small max_read_buffer_size setting value. [#35296](https://github.com/ClickHouse/ClickHouse/pull/35296) ([Kruglov Pavel](https://github.com/Avogar)). While using lzma compression with small `max_read_buffer_size` setting value. [#35295](https://github.com/ClickHouse/ClickHouse/pull/35295) ([Kruglov Pavel](https://github.com/Avogar)). While using `brotli` compression with a small `max_read_buffer_size` setting value. The bug was found in https://github.com/ClickHouse/ClickHouse/pull/35047. [#35281](https://github.com/ClickHouse/ClickHouse/pull/35281) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix possible segfault in `JSONEachRow` schema inference. [#35291](https://github.com/ClickHouse/ClickHouse/pull/35291) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `CHECK TABLE` query in case when sparse columns are enabled in table. [#35274](https://github.com/ClickHouse/ClickHouse/pull/35274) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid std::terminate in case of exception in reading from remote VFS. [#35257](https://github.com/ClickHouse/ClickHouse/pull/35257) ([Azat Khuzhin](https://github.com/azat)). +* Fix reading port from config, close [#34776](https://github.com/ClickHouse/ClickHouse/issues/34776). [#35193](https://github.com/ClickHouse/ClickHouse/pull/35193) ([Vladimir C](https://github.com/vdimir)). +* Fix error in query with `WITH TOTALS` in case if `HAVING` returned empty result. This fixes [#33711](https://github.com/ClickHouse/ClickHouse/issues/33711). [#35186](https://github.com/ClickHouse/ClickHouse/pull/35186) ([Amos Bird](https://github.com/amosbird)). +* Fix a corner case of `replaceRegexpAll`, close [#35117](https://github.com/ClickHouse/ClickHouse/issues/35117). [#35182](https://github.com/ClickHouse/ClickHouse/pull/35182) ([Vladimir C](https://github.com/vdimir)). +* Schema inference didn't work properly on case of `INSERT INTO FUNCTION s3(...) FROM ...`, it tried to read schema from s3 file instead of from select query. [#35176](https://github.com/ClickHouse/ClickHouse/pull/35176) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix MaterializedPostgreSQL (experimental feature) `table overrides` for partition by, etc. Closes [#35048](https://github.com/ClickHouse/ClickHouse/issues/35048). [#35162](https://github.com/ClickHouse/ClickHouse/pull/35162) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix MaterializedPostgreSQL (experimental feature) adding new table to replication (ATTACH TABLE) after manually removing (DETACH TABLE). Closes [#33800](https://github.com/ClickHouse/ClickHouse/issues/33800). Closes [#34922](https://github.com/ClickHouse/ClickHouse/issues/34922). Closes [#34315](https://github.com/ClickHouse/ClickHouse/issues/34315). [#35158](https://github.com/ClickHouse/ClickHouse/pull/35158) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partition pruning error when non-monotonic function is used with IN operator. This fixes [#35136](https://github.com/ClickHouse/ClickHouse/issues/35136). [#35146](https://github.com/ClickHouse/ClickHouse/pull/35146) ([Amos Bird](https://github.com/amosbird)). +* Fixed slightly incorrect translation of YAML configs to XML. [#35135](https://github.com/ClickHouse/ClickHouse/pull/35135) ([Miel Donkers](https://github.com/mdonkers)). +* Fix `optimize_skip_unused_shards_rewrite_in` for signed columns and negative values. [#35134](https://github.com/ClickHouse/ClickHouse/pull/35134) ([Azat Khuzhin](https://github.com/azat)). +* The `update_lag` external dictionary configuration option was unusable showing the error message ``Unexpected key `update_lag` in dictionary source configuration``. [#35089](https://github.com/ClickHouse/ClickHouse/pull/35089) ([Jason Chu](https://github.com/1lann)). +* Avoid possible deadlock on server shutdown. [#35081](https://github.com/ClickHouse/ClickHouse/pull/35081) ([Azat Khuzhin](https://github.com/azat)). +* Fix missing alias after function is optimized to a subcolumn when setting `optimize_functions_to_subcolumns` is enabled. Closes [#33798](https://github.com/ClickHouse/ClickHouse/issues/33798). [#35079](https://github.com/ClickHouse/ClickHouse/pull/35079) ([qieqieplus](https://github.com/qieqieplus)). +* Fix reading from `system.asynchronous_inserts` table if there exists asynchronous insert into table function. [#35050](https://github.com/ClickHouse/ClickHouse/pull/35050) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible exception `Reading for MergeTree family tables must be done with last position boundary` (relevant to operation on remote VFS). Closes [#34979](https://github.com/ClickHouse/ClickHouse/issues/34979). [#35001](https://github.com/ClickHouse/ClickHouse/pull/35001) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix unexpected result when use -State type aggregate function in window frame. [#34999](https://github.com/ClickHouse/ClickHouse/pull/34999) ([metahys](https://github.com/metahys)). +* Fix possible segfault in FileLog (experimental feature). Closes [#30749](https://github.com/ClickHouse/ClickHouse/issues/30749). [#34996](https://github.com/ClickHouse/ClickHouse/pull/34996) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible rare error `Cannot push block to port which already has data`. [#34993](https://github.com/ClickHouse/ClickHouse/pull/34993) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix wrong schema inference for unquoted dates in CSV. Closes [#34768](https://github.com/ClickHouse/ClickHouse/issues/34768). [#34961](https://github.com/ClickHouse/ClickHouse/pull/34961) ([Kruglov Pavel](https://github.com/Avogar)). +* Integration with Hive: Fix unexpected result when use `in` in `where` in hive query. [#34945](https://github.com/ClickHouse/ClickHouse/pull/34945) ([lgbo](https://github.com/lgbo-ustc)). +* Avoid busy polling in ClickHouse Keeper while searching for changelog files to delete. [#34931](https://github.com/ClickHouse/ClickHouse/pull/34931) ([Azat Khuzhin](https://github.com/azat)). +* Fix DateTime64 conversion from PostgreSQL. Closes [#33364](https://github.com/ClickHouse/ClickHouse/issues/33364). [#34910](https://github.com/ClickHouse/ClickHouse/pull/34910) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible "Part directory doesn't exist" during `INSERT` into MergeTree table backed by VFS over s3. [#34876](https://github.com/ClickHouse/ClickHouse/pull/34876) ([Azat Khuzhin](https://github.com/azat)). +* Support DDLs like CREATE USER to be executed on cross replicated cluster. [#34860](https://github.com/ClickHouse/ClickHouse/pull/34860) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix bugs for multiple columns group by in `WindowView` (experimental feature). [#34859](https://github.com/ClickHouse/ClickHouse/pull/34859) ([vxider](https://github.com/Vxider)). +* Fix possible failures in S2 functions when queries contain const columns. [#34745](https://github.com/ClickHouse/ClickHouse/pull/34745) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix bug for H3 funcs containing const columns which cause queries to fail. [#34743](https://github.com/ClickHouse/ClickHouse/pull/34743) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix `No such file or directory` with enabled `fsync_part_directory` and vertical merge. [#34739](https://github.com/ClickHouse/ClickHouse/pull/34739) ([Azat Khuzhin](https://github.com/azat)). +* Fix serialization/printing for system queries `RELOAD MODEL`, `RELOAD FUNCTION`, `RESTART DISK` when used `ON CLUSTER`. Closes [#34514](https://github.com/ClickHouse/ClickHouse/issues/34514). [#34696](https://github.com/ClickHouse/ClickHouse/pull/34696) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix `allow_experimental_projection_optimization` with `enable_global_with_statement` (before it may lead to `Stack size too large` error in case of multiple expressions in `WITH` clause, and also it executes scalar subqueries again and again, so not it will be more optimal). [#34650](https://github.com/ClickHouse/ClickHouse/pull/34650) ([Azat Khuzhin](https://github.com/azat)). +* Stop to select part for mutate when the other replica has already updated the transaction log for `ReplatedMergeTree` engine. [#34633](https://github.com/ClickHouse/ClickHouse/pull/34633) ([Jianmei Zhang](https://github.com/zhangjmruc)). +* Fix incorrect result of trivial count query when part movement feature is used [#34089](https://github.com/ClickHouse/ClickHouse/issues/34089). [#34385](https://github.com/ClickHouse/ClickHouse/pull/34385) ([nvartolomei](https://github.com/nvartolomei)). +* Fix inconsistency of `max_query_size` limitation in distributed subqueries. [#34078](https://github.com/ClickHouse/ClickHouse/pull/34078) ([Chao Ma](https://github.com/godliness)). + + +### ClickHouse release v22.2, 2022-02-17 + +#### Upgrade Notes + +* Applying data skipping indexes for queries with FINAL may produce incorrect result. In this release we disabled data skipping indexes by default for queries with FINAL (a new setting `use_skip_indexes_if_final` is introduced and disabled by default). [#34243](https://github.com/ClickHouse/ClickHouse/pull/34243) ([Azat Khuzhin](https://github.com/azat)). + +#### New Feature + +* Projections are production ready. Set `allow_experimental_projection_optimization` by default and deprecate this setting. [#34456](https://github.com/ClickHouse/ClickHouse/pull/34456) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* An option to create a new files on insert for `File`/`S3`/`HDFS` engines. Allow to overwrite a file in `HDFS`. Throw an exception in attempt to overwrite a file in `S3` by default. Throw an exception in attempt to append data to file in formats that have a suffix (and thus don't support appends, like `Parquet`, `ORC`). Closes [#31640](https://github.com/ClickHouse/ClickHouse/issues/31640) Closes [#31622](https://github.com/ClickHouse/ClickHouse/issues/31622) Closes [#23862](https://github.com/ClickHouse/ClickHouse/issues/23862) Closes [#15022](https://github.com/ClickHouse/ClickHouse/issues/15022) Closes [#16674](https://github.com/ClickHouse/ClickHouse/issues/16674). [#33302](https://github.com/ClickHouse/ClickHouse/pull/33302) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a setting that allows a user to provide own deduplication semantic in `MergeTree`/`ReplicatedMergeTree` If provided, it's used instead of data digest to generate block ID. So, for example, by providing a unique value for the setting in each INSERT statement, the user can avoid the same inserted data being deduplicated. This closes: [#7461](https://github.com/ClickHouse/ClickHouse/issues/7461). [#32304](https://github.com/ClickHouse/ClickHouse/pull/32304) ([Igor Nikonov](https://github.com/devcrafter)). +* Add support of `DEFAULT` keyword for INSERT statements. Closes [#6331](https://github.com/ClickHouse/ClickHouse/issues/6331). [#33141](https://github.com/ClickHouse/ClickHouse/pull/33141) ([Andrii Buriachevskyi](https://github.com/1over)). +* `EPHEMERAL` column specifier is added to `CREATE TABLE` query. Closes [#9436](https://github.com/ClickHouse/ClickHouse/issues/9436). [#34424](https://github.com/ClickHouse/ClickHouse/pull/34424) ([yakov-olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Support `IF EXISTS` clause for `TTL expr TO [DISK|VOLUME] [IF EXISTS] 'xxx'` feature. Parts will be moved to disk or volume only if it exists on replica, so `MOVE TTL` rules will be able to behave differently on replicas according to the existing storage policies. Resolves [#34455](https://github.com/ClickHouse/ClickHouse/issues/34455). [#34504](https://github.com/ClickHouse/ClickHouse/pull/34504) ([Anton Popov](https://github.com/CurtizJ)). +* Allow set default table engine and to create tables without specifying ENGINE. [#34187](https://github.com/ClickHouse/ClickHouse/pull/34187) ([Ilya Yatsishin](https://github.com/qoega)). +* Add table function `format(format_name, data)`. [#34125](https://github.com/ClickHouse/ClickHouse/pull/34125) ([Kruglov Pavel](https://github.com/Avogar)). +* Detect format in `clickhouse-local` by file name even in the case when it is passed to stdin. [#33829](https://github.com/ClickHouse/ClickHouse/pull/33829) ([Kruglov Pavel](https://github.com/Avogar)). +* Add schema inference for `values` table function. Closes [#33811](https://github.com/ClickHouse/ClickHouse/issues/33811). [#34017](https://github.com/ClickHouse/ClickHouse/pull/34017) ([Kruglov Pavel](https://github.com/Avogar)). +* Dynamic reload of server TLS certificates on config reload. Closes [#15764](https://github.com/ClickHouse/ClickHouse/issues/15764). [#15765](https://github.com/ClickHouse/ClickHouse/pull/15765) ([johnskopis](https://github.com/johnskopis)). [#31257](https://github.com/ClickHouse/ClickHouse/pull/31257) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Now ReplicatedMergeTree can recover data when some of its disks are broken. [#13544](https://github.com/ClickHouse/ClickHouse/pull/13544) ([Amos Bird](https://github.com/amosbird)). +* Fault-tolerant connections in clickhouse-client: `clickhouse-client ... --host host1 --host host2 --port port2 --host host3 --port port --host host4`. [#34490](https://github.com/ClickHouse/ClickHouse/pull/34490) ([Kruglov Pavel](https://github.com/Avogar)). [#33824](https://github.com/ClickHouse/ClickHouse/pull/33824) ([Filippov Denis](https://github.com/DF5HSE)). +* Add `DEGREES` and `RADIANS` functions for MySQL compatibility. [#33769](https://github.com/ClickHouse/ClickHouse/pull/33769) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `h3ToCenterChild` function. [#33313](https://github.com/ClickHouse/ClickHouse/pull/33313) ([Bharat Nallan](https://github.com/bharatnc)). Add new h3 miscellaneous functions: `edgeLengthKm`,`exactEdgeLengthKm`,`exactEdgeLengthM`,`exactEdgeLengthRads`,`numHexagons`. [#33621](https://github.com/ClickHouse/ClickHouse/pull/33621) ([Bharat Nallan](https://github.com/bharatnc)). +* Add function `bitSlice` to extract bit subsequences from String/FixedString. [#33360](https://github.com/ClickHouse/ClickHouse/pull/33360) ([RogerYK](https://github.com/RogerYK)). +* Implemented `meanZTest` aggregate function. [#33354](https://github.com/ClickHouse/ClickHouse/pull/33354) ([achimbab](https://github.com/achimbab)). +* Add confidence intervals to T-tests aggregate functions. [#33260](https://github.com/ClickHouse/ClickHouse/pull/33260) ([achimbab](https://github.com/achimbab)). +* Add function `addressToLineWithInlines`. Close [#26211](https://github.com/ClickHouse/ClickHouse/issues/26211). [#33467](https://github.com/ClickHouse/ClickHouse/pull/33467) ([SuperDJY](https://github.com/cmsxbc)). +* Added `#!` and `# ` as a recognised start of a single line comment. Closes [#34138](https://github.com/ClickHouse/ClickHouse/issues/34138). [#34230](https://github.com/ClickHouse/ClickHouse/pull/34230) ([Aaron Katz](https://github.com/aaronstephenkatz)). + +#### Experimental Feature + +* Functions for text classification: language and charset detection. See [#23271](https://github.com/ClickHouse/ClickHouse/issues/23271). [#33314](https://github.com/ClickHouse/ClickHouse/pull/33314) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add memory overcommit to `MemoryTracker`. Added `guaranteed` settings for memory limits which represent soft memory limits. In case when hard memory limit is reached, `MemoryTracker` tries to cancel the most overcommited query. New setting `memory_usage_overcommit_max_wait_microseconds` specifies how long queries may wait another query to stop. Closes [#28375](https://github.com/ClickHouse/ClickHouse/issues/28375). [#31182](https://github.com/ClickHouse/ClickHouse/pull/31182) ([Dmitry Novik](https://github.com/novikd)). +* Enable stream to table join in WindowView. [#33729](https://github.com/ClickHouse/ClickHouse/pull/33729) ([vxider](https://github.com/Vxider)). +* Support `SET`, `YEAR`, `TIME` and `GEOMETRY` data types in `MaterializedMySQL` (experimental feature). Fixes [#18091](https://github.com/ClickHouse/ClickHouse/issues/18091), [#21536](https://github.com/ClickHouse/ClickHouse/issues/21536), [#26361](https://github.com/ClickHouse/ClickHouse/issues/26361). [#33429](https://github.com/ClickHouse/ClickHouse/pull/33429) ([zzsmdfj](https://github.com/zzsmdfj)). +* Fix various issues when projection is enabled by default. Each issue is described in separate commit. This is for [#33678](https://github.com/ClickHouse/ClickHouse/issues/33678) . This fixes [#34273](https://github.com/ClickHouse/ClickHouse/issues/34273). [#34305](https://github.com/ClickHouse/ClickHouse/pull/34305) ([Amos Bird](https://github.com/amosbird)). + +#### Performance Improvement + +* Support `optimize_read_in_order` if prefix of sorting key is already sorted. E.g. if we have sorting key `ORDER BY (a, b)` in table and query with `WHERE a = const ORDER BY b` clauses, now it will be applied reading in order of sorting key instead of full sort. [#32748](https://github.com/ClickHouse/ClickHouse/pull/32748) ([Anton Popov](https://github.com/CurtizJ)). +* Improve performance of partitioned insert into table functions `URL`, `S3`, `File`, `HDFS`. Closes [#34348](https://github.com/ClickHouse/ClickHouse/issues/34348). [#34510](https://github.com/ClickHouse/ClickHouse/pull/34510) ([Maksim Kita](https://github.com/kitaisreal)). +* Multiple performance improvements of clickhouse-keeper. [#34484](https://github.com/ClickHouse/ClickHouse/pull/34484) [#34587](https://github.com/ClickHouse/ClickHouse/pull/34587) ([zhanglistar](https://github.com/zhanglistar)). +* `FlatDictionary` improve performance of dictionary data load. [#33871](https://github.com/ClickHouse/ClickHouse/pull/33871) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance of `mapPopulateSeries` function. Closes [#33944](https://github.com/ClickHouse/ClickHouse/issues/33944). [#34318](https://github.com/ClickHouse/ClickHouse/pull/34318) ([Maksim Kita](https://github.com/kitaisreal)). +* `_file` and `_path` virtual columns (in file-like table engines) are made `LowCardinality` - it will make queries for multiple files faster. Closes [#34300](https://github.com/ClickHouse/ClickHouse/issues/34300). [#34317](https://github.com/ClickHouse/ClickHouse/pull/34317) ([flynn](https://github.com/ucasfl)). +* Speed up loading of data parts. It was not parallelized before: the setting `part_loading_threads` did not have effect. See [#4699](https://github.com/ClickHouse/ClickHouse/issues/4699). [#34310](https://github.com/ClickHouse/ClickHouse/pull/34310) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve performance of `LineAsString` format. This closes [#34303](https://github.com/ClickHouse/ClickHouse/issues/34303). [#34306](https://github.com/ClickHouse/ClickHouse/pull/34306) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Optimize `quantilesExact{Low,High}` to use `nth_element` instead of `sort`. [#34287](https://github.com/ClickHouse/ClickHouse/pull/34287) ([Danila Kutenin](https://github.com/danlark1)). +* Slightly improve performance of `Regexp` format. [#34202](https://github.com/ClickHouse/ClickHouse/pull/34202) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Minor improvement for analysis of scalar subqueries. [#34128](https://github.com/ClickHouse/ClickHouse/pull/34128) ([Federico Rodriguez](https://github.com/fedrod)). +* Make ORDER BY tuple almost as fast as ORDER BY columns. We have special optimizations for multiple column ORDER BY: https://github.com/ClickHouse/ClickHouse/pull/10831 . It's beneficial to also apply to tuple columns. [#34060](https://github.com/ClickHouse/ClickHouse/pull/34060) ([Amos Bird](https://github.com/amosbird)). +* Rework and reintroduce the scalar subqueries cache to Materialized Views execution. [#33958](https://github.com/ClickHouse/ClickHouse/pull/33958) ([Raúl Marín](https://github.com/Algunenano)). +* Slightly improve performance of `ORDER BY` by adding x86-64 AVX-512 support for `memcmpSmall` functions to accelerate memory comparison. It works only if you compile ClickHouse by yourself. [#33706](https://github.com/ClickHouse/ClickHouse/pull/33706) ([hanqf-git](https://github.com/hanqf-git)). +* Improve `range_hashed` dictionary performance if for key there are a lot of intervals. Fixes [#23821](https://github.com/ClickHouse/ClickHouse/issues/23821). [#33516](https://github.com/ClickHouse/ClickHouse/pull/33516) ([Maksim Kita](https://github.com/kitaisreal)). +* For inserts and merges into S3, write files in parallel whenever possible (TODO: check if it's merged). [#33291](https://github.com/ClickHouse/ClickHouse/pull/33291) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve `clickhouse-keeper` performance and fix several memory leaks in NuRaft library. [#33329](https://github.com/ClickHouse/ClickHouse/pull/33329) ([alesapin](https://github.com/alesapin)). + +#### Improvement + +* Support asynchronous inserts in `clickhouse-client` for queries with inlined data. [#34267](https://github.com/ClickHouse/ClickHouse/pull/34267) ([Anton Popov](https://github.com/CurtizJ)). +* Functions `dictGet`, `dictHas` implicitly cast key argument to dictionary key structure, if they are different. [#33672](https://github.com/ClickHouse/ClickHouse/pull/33672) ([Maksim Kita](https://github.com/kitaisreal)). +* Improvements for `range_hashed` dictionaries. Improve performance of load time if there are multiple attributes. Allow to create a dictionary without attributes. Added option to specify strategy when intervals `start` and `end` have `Nullable` type `convert_null_range_bound_to_open` by default is `true`. Closes [#29791](https://github.com/ClickHouse/ClickHouse/issues/29791). Allow to specify `Float`, `Decimal`, `DateTime64`, `Int128`, `Int256`, `UInt128`, `UInt256` as range types. `RangeHashedDictionary` added support for range values that extend `Int64` type. Closes [#28322](https://github.com/ClickHouse/ClickHouse/issues/28322). Added option `range_lookup_strategy` to specify range lookup type `min`, `max` by default is `min` . Closes [#21647](https://github.com/ClickHouse/ClickHouse/issues/21647). Fixed allocated bytes calculations. Fixed type name in `system.dictionaries` in case of `ComplexKeyHashedDictionary`. [#33927](https://github.com/ClickHouse/ClickHouse/pull/33927) ([Maksim Kita](https://github.com/kitaisreal)). +* `flat`, `hashed`, `hashed_array` dictionaries now support creating with empty attributes, with support of reading the keys and using `dictHas`. Fixes [#33820](https://github.com/ClickHouse/ClickHouse/issues/33820). [#33918](https://github.com/ClickHouse/ClickHouse/pull/33918) ([Maksim Kita](https://github.com/kitaisreal)). +* Added support for `DateTime64` data type in dictionaries. [#33914](https://github.com/ClickHouse/ClickHouse/pull/33914) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow to write `s3(url, access_key_id, secret_access_key)` (autodetect of data format and table structure, but with explicit credentials). [#34503](https://github.com/ClickHouse/ClickHouse/pull/34503) ([Kruglov Pavel](https://github.com/Avogar)). +* Added sending of the output format back to client like it's done in HTTP protocol as suggested in [#34362](https://github.com/ClickHouse/ClickHouse/issues/34362). Closes [#34362](https://github.com/ClickHouse/ClickHouse/issues/34362). [#34499](https://github.com/ClickHouse/ClickHouse/pull/34499) ([Vitaly Baranov](https://github.com/vitlibar)). +* Send ProfileEvents statistics in case of INSERT SELECT query (to display query metrics in `clickhouse-client` for this type of queries). [#34498](https://github.com/ClickHouse/ClickHouse/pull/34498) ([Dmitry Novik](https://github.com/novikd)). +* Recognize `.jsonl` extension for JSONEachRow format. [#34496](https://github.com/ClickHouse/ClickHouse/pull/34496) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve schema inference in clickhouse-local. Allow to write just `clickhouse-local -q "select * from table" < data.format`. [#34495](https://github.com/ClickHouse/ClickHouse/pull/34495) ([Kruglov Pavel](https://github.com/Avogar)). +* Privileges CREATE/ALTER/DROP ROW POLICY now can be granted on a table or on `database.*` as well as globally `*.*`. [#34489](https://github.com/ClickHouse/ClickHouse/pull/34489) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow to export arbitrary large files to `s3`. Add two new settings: `s3_upload_part_size_multiply_factor` and `s3_upload_part_size_multiply_parts_count_threshold`. Now each time `s3_upload_part_size_multiply_parts_count_threshold` uploaded to S3 from a single query `s3_min_upload_part_size` multiplied by `s3_upload_part_size_multiply_factor`. Fixes [#34244](https://github.com/ClickHouse/ClickHouse/issues/34244). [#34422](https://github.com/ClickHouse/ClickHouse/pull/34422) ([alesapin](https://github.com/alesapin)). +* Allow to skip not found (404) URLs for globs when using URL storage / table function. Also closes [#34359](https://github.com/ClickHouse/ClickHouse/issues/34359). [#34392](https://github.com/ClickHouse/ClickHouse/pull/34392) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Default input and output formats for `clickhouse-local` that can be overriden by --input-format and --output-format. Close [#30631](https://github.com/ClickHouse/ClickHouse/issues/30631). [#34352](https://github.com/ClickHouse/ClickHouse/pull/34352) ([李扬](https://github.com/taiyang-li)). +* Add options for `clickhouse-format`. Which close [#30528](https://github.com/ClickHouse/ClickHouse/issues/30528) - `max_query_size` - `max_parser_depth`. [#34349](https://github.com/ClickHouse/ClickHouse/pull/34349) ([李扬](https://github.com/taiyang-li)). +* Better handling of pre-inputs before client start. This is for [#34308](https://github.com/ClickHouse/ClickHouse/issues/34308). [#34336](https://github.com/ClickHouse/ClickHouse/pull/34336) ([Amos Bird](https://github.com/amosbird)). +* `REGEXP_MATCHES` and `REGEXP_REPLACE` function aliases for compatibility with PostgreSQL. Close [#30885](https://github.com/ClickHouse/ClickHouse/issues/30885). [#34334](https://github.com/ClickHouse/ClickHouse/pull/34334) ([李扬](https://github.com/taiyang-li)). +* Some servers expect a User-Agent header in their HTTP requests. A `User-Agent` header entry has been added to HTTP requests of the form: User-Agent: ClickHouse/VERSION_STRING. [#34330](https://github.com/ClickHouse/ClickHouse/pull/34330) ([Saad Ur Rahman](https://github.com/surahman)). +* Cancel merges before acquiring table lock for `TRUNCATE` query to avoid `DEADLOCK_AVOIDED` error in some cases. Fixes [#34302](https://github.com/ClickHouse/ClickHouse/issues/34302). [#34304](https://github.com/ClickHouse/ClickHouse/pull/34304) ([tavplubix](https://github.com/tavplubix)). +* Change severity of the "Cancelled merging parts" message in logs, because it's not an error. This closes [#34148](https://github.com/ClickHouse/ClickHouse/issues/34148). [#34232](https://github.com/ClickHouse/ClickHouse/pull/34232) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add ability to compose PostgreSQL-style cast operator `::` with expressions using `[]` and `.` operators (array and tuple indexing). [#34229](https://github.com/ClickHouse/ClickHouse/pull/34229) ([Nikolay Degterinsky](https://github.com/evillique)). +* Recognize `YYYYMMDD-hhmmss` format in `parseDateTimeBestEffort` function. This closes [#34206](https://github.com/ClickHouse/ClickHouse/issues/34206). [#34208](https://github.com/ClickHouse/ClickHouse/pull/34208) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow carriage return in the middle of the line while parsing by `Regexp` format. This closes [#34200](https://github.com/ClickHouse/ClickHouse/issues/34200). [#34205](https://github.com/ClickHouse/ClickHouse/pull/34205) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow to parse dictionary's `PRIMARY KEY` as `PRIMARY KEY (id, value)`; previously supported only `PRIMARY KEY id, value`. Closes [#34135](https://github.com/ClickHouse/ClickHouse/issues/34135). [#34141](https://github.com/ClickHouse/ClickHouse/pull/34141) ([Maksim Kita](https://github.com/kitaisreal)). +* An optional argument for `splitByChar` to limit the number of resulting elements. close [#34081](https://github.com/ClickHouse/ClickHouse/issues/34081). [#34140](https://github.com/ClickHouse/ClickHouse/pull/34140) ([李扬](https://github.com/taiyang-li)). +* Improving the experience of multiple line editing for clickhouse-client. This is a follow-up of [#31123](https://github.com/ClickHouse/ClickHouse/pull/31123). [#34114](https://github.com/ClickHouse/ClickHouse/pull/34114) ([Amos Bird](https://github.com/amosbird)). +* Add `UUID` suport in `MsgPack` input/output format. [#34065](https://github.com/ClickHouse/ClickHouse/pull/34065) ([Kruglov Pavel](https://github.com/Avogar)). +* Tracing context (for OpenTelemetry) is now propagated from GRPC client metadata (this change is relevant for GRPC client-server protocol). [#34064](https://github.com/ClickHouse/ClickHouse/pull/34064) ([andremarianiello](https://github.com/andremarianiello)). +* Supports all types of `SYSTEM` queries with `ON CLUSTER` clause. [#34005](https://github.com/ClickHouse/ClickHouse/pull/34005) ([小路](https://github.com/nicelulu)). +* Improve memory accounting for queries that are using less than `max_untracker_memory`. [#34001](https://github.com/ClickHouse/ClickHouse/pull/34001) ([Azat Khuzhin](https://github.com/azat)). +* Fixed UTF-8 string case-insensitive search when lowercase and uppercase characters are represented by different number of bytes. Example is `ẞ` and `ß`. This closes [#7334](https://github.com/ClickHouse/ClickHouse/issues/7334). [#33992](https://github.com/ClickHouse/ClickHouse/pull/33992) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Detect format and schema from stdin in `clickhouse-local`. [#33960](https://github.com/ClickHouse/ClickHouse/pull/33960) ([Kruglov Pavel](https://github.com/Avogar)). +* Correctly handle the case of misconfiguration when multiple disks are using the same path on the filesystem. [#29072](https://github.com/ClickHouse/ClickHouse/issues/29072). [#33905](https://github.com/ClickHouse/ClickHouse/pull/33905) ([zhongyuankai](https://github.com/zhongyuankai)). +* Try every resolved IP address while getting S3 proxy. S3 proxies are rarely used, mostly in Yandex Cloud. [#33862](https://github.com/ClickHouse/ClickHouse/pull/33862) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support EXPLAIN AST CREATE FUNCTION query `EXPLAIN AST CREATE FUNCTION mycast AS (n) -> cast(n as String)` will return `EXPLAIN AST CREATE FUNCTION mycast AS n -> CAST(n, 'String')`. [#33819](https://github.com/ClickHouse/ClickHouse/pull/33819) ([李扬](https://github.com/taiyang-li)). +* Added support for cast from `Map(Key, Value)` to `Array(Tuple(Key, Value))`. [#33794](https://github.com/ClickHouse/ClickHouse/pull/33794) ([Maksim Kita](https://github.com/kitaisreal)). +* Add some improvements and fixes for `Bool` data type. Fixes [#33244](https://github.com/ClickHouse/ClickHouse/issues/33244). [#33737](https://github.com/ClickHouse/ClickHouse/pull/33737) ([Kruglov Pavel](https://github.com/Avogar)). +* Parse and store OpenTelemetry trace-id in big-endian order. [#33723](https://github.com/ClickHouse/ClickHouse/pull/33723) ([Frank Chen](https://github.com/FrankChen021)). +* Improvement for `fromUnixTimestamp64` family functions.. They now accept any integer value that can be converted to `Int64`. This closes: [#14648](https://github.com/ClickHouse/ClickHouse/issues/14648). [#33505](https://github.com/ClickHouse/ClickHouse/pull/33505) ([Andrey Zvonov](https://github.com/zvonand)). +* Reimplement `_shard_num` from constants (see [#7624](https://github.com/ClickHouse/ClickHouse/issues/7624)) with `shardNum()` function (seee [#27020](https://github.com/ClickHouse/ClickHouse/issues/27020)), to avoid possible issues (like those that had been found in [#16947](https://github.com/ClickHouse/ClickHouse/issues/16947)). [#33392](https://github.com/ClickHouse/ClickHouse/pull/33392) ([Azat Khuzhin](https://github.com/azat)). +* Enable binary arithmetic (plus, minus, multiply, division, least, greatest) between Decimal and Float. [#33355](https://github.com/ClickHouse/ClickHouse/pull/33355) ([flynn](https://github.com/ucasfl)). +* Respect cgroups limits in max_threads autodetection. [#33342](https://github.com/ClickHouse/ClickHouse/pull/33342) ([JaySon](https://github.com/JaySon-Huang)). +* Add new clickhouse-keeper setting `min_session_timeout_ms`. Now clickhouse-keeper will determine client session timeout according to `min_session_timeout_ms` and `session_timeout_ms` settings. [#33288](https://github.com/ClickHouse/ClickHouse/pull/33288) ([JackyWoo](https://github.com/JackyWoo)). +* Added `UUID` data type support for functions `hex` and `bin`. [#32170](https://github.com/ClickHouse/ClickHouse/pull/32170) ([Frank Chen](https://github.com/FrankChen021)). +* Fix reading of subcolumns with dots in their names. In particular fixed reading of `Nested` columns, if their element names contain dots (e.g ```Nested(`keys.name` String, `keys.id` UInt64, values UInt64)```). [#34228](https://github.com/ClickHouse/ClickHouse/pull/34228) ([Anton Popov](https://github.com/CurtizJ)). +* Fixes `parallel_view_processing = 0` not working when inserting into a table using `VALUES`. - Fixes `view_duration_ms` in the `query_views_log` not being set correctly for materialized views. [#34067](https://github.com/ClickHouse/ClickHouse/pull/34067) ([Raúl Marín](https://github.com/Algunenano)). +* Fix parsing tables structure from ZooKeeper: now metadata from ZooKeeper compared with local metadata in canonical form. It helps when canonical function names can change between ClickHouse versions. [#33933](https://github.com/ClickHouse/ClickHouse/pull/33933) ([sunny](https://github.com/sunny19930321)). +* Properly escape some characters for interaction with LDAP. [#33401](https://github.com/ClickHouse/ClickHouse/pull/33401) ([IlyaTsoi](https://github.com/IlyaTsoi)). + +#### Build/Testing/Packaging Improvement + +* Remove unbundled build support. [#33690](https://github.com/ClickHouse/ClickHouse/pull/33690) ([Azat Khuzhin](https://github.com/azat)). +* Ensure that tests don't depend on the result of non-stable sorting of equal elements. Added equal items ranges randomization in debug after sort to prevent issues when we rely on equal items sort order. [#34393](https://github.com/ClickHouse/ClickHouse/pull/34393) ([Maksim Kita](https://github.com/kitaisreal)). +* Add verbosity to a style check. [#34289](https://github.com/ClickHouse/ClickHouse/pull/34289) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Remove `clickhouse-test` debian package because it's obsolete. [#33948](https://github.com/ClickHouse/ClickHouse/pull/33948) ([Ilya Yatsishin](https://github.com/qoega)). +* Multiple improvements for build system to remove the possibility of occasionally using packages from the OS and to enforce hermetic builds. [#33695](https://github.com/ClickHouse/ClickHouse/pull/33695) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix (user-visible misbehaviour in official stable or prestable release) + +* Fixed the assertion in case of using `allow_experimental_parallel_reading_from_replicas` with `max_parallel_replicas` equals to 1. This fixes [#34525](https://github.com/ClickHouse/ClickHouse/issues/34525). [#34613](https://github.com/ClickHouse/ClickHouse/pull/34613) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix rare bug while reading of empty arrays, which could lead to `Data compressed with different methods` error. It can reproduce if you have mostly empty arrays, but not always. And reading is performed in backward direction with ORDER BY ... DESC. This error is extremely unlikely to happen. [#34327](https://github.com/ClickHouse/ClickHouse/pull/34327) ([Anton Popov](https://github.com/CurtizJ)). +* Fix wrong result of `round`/`roundBankers` if integer values of small types are rounded. Closes [#33267](https://github.com/ClickHouse/ClickHouse/issues/33267). [#34562](https://github.com/ClickHouse/ClickHouse/pull/34562) ([李扬](https://github.com/taiyang-li)). +* Sometimes query cancellation did not work immediately when we were reading multiple files from s3 or HDFS. Fixes [#34301](https://github.com/ClickHouse/ClickHouse/issues/34301) Relates to [#34397](https://github.com/ClickHouse/ClickHouse/issues/34397). [#34539](https://github.com/ClickHouse/ClickHouse/pull/34539) ([Dmitry Novik](https://github.com/novikd)). +* Fix exception `Chunk should have AggregatedChunkInfo in MergingAggregatedTransform` (in case of `optimize_aggregation_in_order = 1` and `distributed_aggregation_memory_efficient = 0`). Fixes [#34526](https://github.com/ClickHouse/ClickHouse/issues/34526). [#34532](https://github.com/ClickHouse/ClickHouse/pull/34532) ([Anton Popov](https://github.com/CurtizJ)). +* Fix comparison between integers and floats in index analysis. Previously it could lead to skipping some granules for reading by mistake. Fixes [#34493](https://github.com/ClickHouse/ClickHouse/issues/34493). [#34528](https://github.com/ClickHouse/ClickHouse/pull/34528) ([Anton Popov](https://github.com/CurtizJ)). +* Fix compression support in URL engine. [#34524](https://github.com/ClickHouse/ClickHouse/pull/34524) ([Frank Chen](https://github.com/FrankChen021)). +* Fix possible error 'file_size: Operation not supported' in files' schema autodetection. [#34479](https://github.com/ClickHouse/ClickHouse/pull/34479) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes possible race with table deletion. [#34416](https://github.com/ClickHouse/ClickHouse/pull/34416) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible error `Cannot convert column Function to mask` in short circuit function evaluation. Closes [#34171](https://github.com/ClickHouse/ClickHouse/issues/34171). [#34415](https://github.com/ClickHouse/ClickHouse/pull/34415) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix potential crash when doing schema inference from url source. Closes [#34147](https://github.com/ClickHouse/ClickHouse/issues/34147). [#34405](https://github.com/ClickHouse/ClickHouse/pull/34405) ([Kruglov Pavel](https://github.com/Avogar)). +* For UDFs access permissions were checked for database level instead of global level as it should be. Closes [#34281](https://github.com/ClickHouse/ClickHouse/issues/34281). [#34404](https://github.com/ClickHouse/ClickHouse/pull/34404) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix wrong engine syntax in result of `SHOW CREATE DATABASE` query for databases with engine `Memory`. This closes [#34335](https://github.com/ClickHouse/ClickHouse/issues/34335). [#34345](https://github.com/ClickHouse/ClickHouse/pull/34345) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fixed a couple of extremely rare race conditions that might lead to broken state of replication queue and "intersecting parts" error. [#34297](https://github.com/ClickHouse/ClickHouse/pull/34297) ([tavplubix](https://github.com/tavplubix)). +* Fix progress bar width. It was incorrectly rounded to integer number of characters. [#34275](https://github.com/ClickHouse/ClickHouse/pull/34275) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix current_user/current_address client information fields for inter-server communication (before this patch current_user/current_address will be preserved from the previous query). [#34263](https://github.com/ClickHouse/ClickHouse/pull/34263) ([Azat Khuzhin](https://github.com/azat)). +* Fix memory leak in case of some Exception during query processing with `optimize_aggregation_in_order=1`. [#34234](https://github.com/ClickHouse/ClickHouse/pull/34234) ([Azat Khuzhin](https://github.com/azat)). +* Fix metric `Query`, which shows the number of executing queries. In last several releases it was always 0. [#34224](https://github.com/ClickHouse/ClickHouse/pull/34224) ([Anton Popov](https://github.com/CurtizJ)). +* Fix schema inference for table runction `s3`. [#34186](https://github.com/ClickHouse/ClickHouse/pull/34186) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare and benign race condition in `HDFS`, `S3` and `URL` storage engines which can lead to additional connections. [#34172](https://github.com/ClickHouse/ClickHouse/pull/34172) ([alesapin](https://github.com/alesapin)). +* Fix bug which can rarely lead to error "Cannot read all data" while reading LowCardinality columns of MergeTree table engines family which stores data on remote file system like S3 (virtual filesystem over s3 is an experimental feature that is not ready for production). [#34139](https://github.com/ClickHouse/ClickHouse/pull/34139) ([alesapin](https://github.com/alesapin)). +* Fix inserts to distributed tables in case of a change of native protocol. The last change was in the version 22.1, so there may be some failures of inserts to distributed tables after upgrade to that version. [#34132](https://github.com/ClickHouse/ClickHouse/pull/34132) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible data race in `File` table engine that was introduced in [#33960](https://github.com/ClickHouse/ClickHouse/pull/33960). Closes [#34111](https://github.com/ClickHouse/ClickHouse/issues/34111). [#34113](https://github.com/ClickHouse/ClickHouse/pull/34113) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed minor race condition that might cause "intersecting parts" error in extremely rare cases after ZooKeeper connection loss. [#34096](https://github.com/ClickHouse/ClickHouse/pull/34096) ([tavplubix](https://github.com/tavplubix)). +* Fix asynchronous inserts with `Native` format. [#34068](https://github.com/ClickHouse/ClickHouse/pull/34068) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug which lead to inability for server to start when both replicated access storage and keeper (embedded in clickhouse-server) are used. Introduced two settings for keeper socket timeout instead of settings from default user: `keeper_server.socket_receive_timeout_sec` and `keeper_server.socket_send_timeout_sec`. Fixes [#33973](https://github.com/ClickHouse/ClickHouse/issues/33973). [#33988](https://github.com/ClickHouse/ClickHouse/pull/33988) ([alesapin](https://github.com/alesapin)). +* Fix segfault while parsing ORC file with corrupted footer. Closes [#33797](https://github.com/ClickHouse/ClickHouse/issues/33797). [#33984](https://github.com/ClickHouse/ClickHouse/pull/33984) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix parsing IPv6 from query parameter (prepared statements) and fix IPv6 to string conversion. Closes [#33928](https://github.com/ClickHouse/ClickHouse/issues/33928). [#33971](https://github.com/ClickHouse/ClickHouse/pull/33971) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash while reading of nested tuples. Fixes [#33838](https://github.com/ClickHouse/ClickHouse/issues/33838). [#33956](https://github.com/ClickHouse/ClickHouse/pull/33956) ([Anton Popov](https://github.com/CurtizJ)). +* Fix usage of functions `array` and `tuple` with literal arguments in distributed queries. Previously it could lead to `Not found columns` exception. [#33938](https://github.com/ClickHouse/ClickHouse/pull/33938) ([Anton Popov](https://github.com/CurtizJ)). +* Aggregate function combinator `-If` did not correctly process `Nullable` filter argument. This closes [#27073](https://github.com/ClickHouse/ClickHouse/issues/27073). [#33920](https://github.com/ClickHouse/ClickHouse/pull/33920) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix potential race condition when doing remote disk read (virtual filesystem over s3 is an experimental feature that is not ready for production). [#33912](https://github.com/ClickHouse/ClickHouse/pull/33912) ([Amos Bird](https://github.com/amosbird)). +* Fix crash if SQL UDF is created with lambda with non identifier arguments. Closes [#33866](https://github.com/ClickHouse/ClickHouse/issues/33866). [#33868](https://github.com/ClickHouse/ClickHouse/pull/33868) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix usage of sparse columns (which can be enabled by experimental setting `ratio_of_defaults_for_sparse_serialization`). [#33849](https://github.com/ClickHouse/ClickHouse/pull/33849) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed `replica is not readonly` logical error on `SYSTEM RESTORE REPLICA` query when replica is actually readonly. Fixes [#33806](https://github.com/ClickHouse/ClickHouse/issues/33806). [#33847](https://github.com/ClickHouse/ClickHouse/pull/33847) ([tavplubix](https://github.com/tavplubix)). +* Fix memory leak in `clickhouse-keeper` in case of compression is used (default). [#33840](https://github.com/ClickHouse/ClickHouse/pull/33840) ([Azat Khuzhin](https://github.com/azat)). +* Fix index analysis with no common types available. [#33833](https://github.com/ClickHouse/ClickHouse/pull/33833) ([Amos Bird](https://github.com/amosbird)). +* Fix schema inference for `JSONEachRow` and `JSONCompactEachRow`. [#33830](https://github.com/ClickHouse/ClickHouse/pull/33830) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix usage of external dictionaries with `redis` source and large number of keys. [#33804](https://github.com/ClickHouse/ClickHouse/pull/33804) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bug in client that led to 'Connection reset by peer' in server. Closes [#33309](https://github.com/ClickHouse/ClickHouse/issues/33309). [#33790](https://github.com/ClickHouse/ClickHouse/pull/33790) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix parsing query INSERT INTO ... VALUES SETTINGS ... (...), ... [#33776](https://github.com/ClickHouse/ClickHouse/pull/33776) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug of check table when creating data part with wide format and projection. [#33774](https://github.com/ClickHouse/ClickHouse/pull/33774) ([李扬](https://github.com/taiyang-li)). +* Fix tiny race between count() and INSERT/merges/... in MergeTree (it is possible to return incorrect number of rows for SELECT with optimize_trivial_count_query). [#33753](https://github.com/ClickHouse/ClickHouse/pull/33753) ([Azat Khuzhin](https://github.com/azat)). +* Throw exception when directory listing request has failed in storage HDFS. [#33724](https://github.com/ClickHouse/ClickHouse/pull/33724) ([LiuNeng](https://github.com/liuneng1994)). +* Fix mutation when table contains projections. This fixes [#33010](https://github.com/ClickHouse/ClickHouse/issues/33010). This fixes [#33275](https://github.com/ClickHouse/ClickHouse/issues/33275). [#33679](https://github.com/ClickHouse/ClickHouse/pull/33679) ([Amos Bird](https://github.com/amosbird)). +* Correctly determine current database if `CREATE TEMPORARY TABLE AS SELECT` is queried inside a named HTTP session. This is a very rare use case. This closes [#8340](https://github.com/ClickHouse/ClickHouse/issues/8340). [#33676](https://github.com/ClickHouse/ClickHouse/pull/33676) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Allow some queries with sorting, LIMIT BY, ARRAY JOIN and lambda functions. This closes [#7462](https://github.com/ClickHouse/ClickHouse/issues/7462). [#33675](https://github.com/ClickHouse/ClickHouse/pull/33675) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix bug in "zero copy replication" (a feature that is under development and should not be used in production) which lead to data duplication in case of TTL move. Fixes [#33643](https://github.com/ClickHouse/ClickHouse/issues/33643). [#33642](https://github.com/ClickHouse/ClickHouse/pull/33642) ([alesapin](https://github.com/alesapin)). +* Fix `Chunk should have AggregatedChunkInfo in GroupingAggregatedTransform` (in case of `optimize_aggregation_in_order = 1`). [#33637](https://github.com/ClickHouse/ClickHouse/pull/33637) ([Azat Khuzhin](https://github.com/azat)). +* Fix error `Bad cast from type ... to DB::DataTypeArray` which may happen when table has `Nested` column with dots in name, and default value is generated for it (e.g. during insert, when column is not listed). Continuation of [#28762](https://github.com/ClickHouse/ClickHouse/issues/28762). [#33588](https://github.com/ClickHouse/ClickHouse/pull/33588) ([Alexey Pavlenko](https://github.com/alexeypavlenko)). +* Export into `lz4` files has been fixed. Closes [#31421](https://github.com/ClickHouse/ClickHouse/issues/31421). [#31862](https://github.com/ClickHouse/ClickHouse/pull/31862) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix potential crash if `group_by_overflow_mode` was set to `any` (approximate GROUP BY) and aggregation was performed by single column of type `LowCardinality`. [#34506](https://github.com/ClickHouse/ClickHouse/pull/34506) ([DR](https://github.com/freedomDR)). +* Fix inserting to temporary tables via gRPC client-server protocol. Fixes [#34347](https://github.com/ClickHouse/ClickHouse/issues/34347), issue `#2`. [#34364](https://github.com/ClickHouse/ClickHouse/pull/34364) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix issue [#19429](https://github.com/ClickHouse/ClickHouse/issues/19429). [#34225](https://github.com/ClickHouse/ClickHouse/pull/34225) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix issue [#18206](https://github.com/ClickHouse/ClickHouse/issues/18206). [#33977](https://github.com/ClickHouse/ClickHouse/pull/33977) ([Vitaly Baranov](https://github.com/vitlibar)). +* This PR allows using multiple LDAP storages in the same list of user directories. It worked earlier but was broken because LDAP tests are disabled (they are part of the testflows tests). [#33574](https://github.com/ClickHouse/ClickHouse/pull/33574) ([Vitaly Baranov](https://github.com/vitlibar)). + + +### ClickHouse release v22.1, 2022-01-18 + +#### Upgrade Notes + +* The functions `left` and `right` were previously implemented in parser and now full-featured. Distributed queries with `left` or `right` functions without aliases may throw exception if cluster contains different versions of clickhouse-server. If you are upgrading your cluster and encounter this error, you should finish upgrading your cluster to ensure all nodes have the same version. Also you can add aliases (`AS something`) to the columns in your queries to avoid this issue. [#33407](https://github.com/ClickHouse/ClickHouse/pull/33407) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Resource usage by scalar subqueries is fully accounted since this version. With this change, rows read in scalar subqueries are now reported in the query_log. If the scalar subquery is cached (repeated or called for several rows) the rows read are only counted once. This change allows KILLing queries and reporting progress while they are executing scalar subqueries. [#32271](https://github.com/ClickHouse/ClickHouse/pull/32271) ([Raúl Marín](https://github.com/Algunenano)). + +#### New Feature + +* Implement data schema inference for input formats. Allow to skip structure (or write just `auto`) in table functions `file`, `url`, `s3`, `hdfs` and in parameters of `clickhouse-local` . Allow to skip structure in create query for table engines `File`, `HDFS`, `S3`, `URL`, `Merge`, `Buffer`, `Distributed` and `ReplicatedMergeTree` (if we add new replicas). [#32455](https://github.com/ClickHouse/ClickHouse/pull/32455) ([Kruglov Pavel](https://github.com/Avogar)). +* Detect format by file extension in `file`/`hdfs`/`s3`/`url` table functions and `HDFS`/`S3`/`URL` table engines and also for `SELECT INTO OUTFILE` and `INSERT FROM INFILE` [#33565](https://github.com/ClickHouse/ClickHouse/pull/33565) ([Kruglov Pavel](https://github.com/Avogar)). Close [#30918](https://github.com/ClickHouse/ClickHouse/issues/30918). [#33443](https://github.com/ClickHouse/ClickHouse/pull/33443) ([OnePiece](https://github.com/zhongyuankai)). +* A tool for collecting diagnostics data if you need support. [#33175](https://github.com/ClickHouse/ClickHouse/pull/33175) ([Alexander Burmak](https://github.com/Alex-Burmak)). +* Automatic cluster discovery via Zoo/Keeper. It allows to add replicas to the cluster without changing configuration on every server. [#31442](https://github.com/ClickHouse/ClickHouse/pull/31442) ([vdimir](https://github.com/vdimir)). +* Implement hive table engine to access apache hive from clickhouse. This implements: [#29245](https://github.com/ClickHouse/ClickHouse/issues/29245). [#31104](https://github.com/ClickHouse/ClickHouse/pull/31104) ([taiyang-li](https://github.com/taiyang-li)). +* Add aggregate functions `cramersV`, `cramersVBiasCorrected`, `theilsU` and `contingency`. These functions calculate dependency (measure of association) between categorical values. All these functions are using cross-tab (histogram on pairs) for implementation. You can imagine it like a correlation coefficient but for any discrete values (not necessary numbers). [#33366](https://github.com/ClickHouse/ClickHouse/pull/33366) ([alexey-milovidov](https://github.com/alexey-milovidov)). Initial implementation by [Vanyok-All-is-OK](https://github.com/Vanyok-All-is-OK) and [antikvist](https://github.com/antikvist). +* Added table function `hdfsCluster` which allows processing files from HDFS in parallel from many nodes in a specified cluster, similarly to `s3Cluster`. [#32400](https://github.com/ClickHouse/ClickHouse/pull/32400) ([Zhichang Yu](https://github.com/yuzhichang)). +* Adding support for disks backed by Azure Blob Storage, in a similar way it has been done for disks backed by AWS S3. [#31505](https://github.com/ClickHouse/ClickHouse/pull/31505) ([Jakub Kuklis](https://github.com/jkuklis)). +* Allow `COMMENT` in `CREATE VIEW` (for all VIEW kinds). [#31062](https://github.com/ClickHouse/ClickHouse/pull/31062) ([Vasily Nemkov](https://github.com/Enmk)). +* Dynamically reinitialize listening ports and protocols when configuration changes. [#30549](https://github.com/ClickHouse/ClickHouse/pull/30549) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Added `left`, `right`, `leftUTF8`, `rightUTF8` functions. Fix error in implementation of `substringUTF8` function with negative offset (offset from the end of string). [#33407](https://github.com/ClickHouse/ClickHouse/pull/33407) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add new functions for `H3` coordinate system: `h3HexAreaKm2`, `h3CellAreaM2`, `h3CellAreaRads2`. [#33479](https://github.com/ClickHouse/ClickHouse/pull/33479) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `MONTHNAME` function. [#33436](https://github.com/ClickHouse/ClickHouse/pull/33436) ([usurai](https://github.com/usurai)). +* Added function `arrayLast`. Closes [#33390](https://github.com/ClickHouse/ClickHouse/issues/33390). [#33415](https://github.com/ClickHouse/ClickHouse/pull/33415) Added function `arrayLastIndex`. [#33465](https://github.com/ClickHouse/ClickHouse/pull/33465) ([Maksim Kita](https://github.com/kitaisreal)). +* Add function `decodeURLFormComponent` slightly different to `decodeURLComponent`. Close [#10298](https://github.com/ClickHouse/ClickHouse/issues/10298). [#33451](https://github.com/ClickHouse/ClickHouse/pull/33451) ([SuperDJY](https://github.com/cmsxbc)). +* Allow to split `GraphiteMergeTree` rollup rules for plain/tagged metrics (optional rule_type field). [#33494](https://github.com/ClickHouse/ClickHouse/pull/33494) ([Michail Safronov](https://github.com/msaf1980)). + + +#### Performance Improvement + +* Support moving conditions to `PREWHERE` (setting `optimize_move_to_prewhere`) for tables of `Merge` engine if its all underlying tables supports `PREWHERE`. [#33300](https://github.com/ClickHouse/ClickHouse/pull/33300) ([Anton Popov](https://github.com/CurtizJ)). +* More efficient handling of globs for URL storage. Now you can easily query million URLs in parallel with retries. Closes [#32866](https://github.com/ClickHouse/ClickHouse/issues/32866). [#32907](https://github.com/ClickHouse/ClickHouse/pull/32907) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid exponential backtracking in parser. This closes [#20158](https://github.com/ClickHouse/ClickHouse/issues/20158). [#33481](https://github.com/ClickHouse/ClickHouse/pull/33481) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Abuse of `untuple` function was leading to exponential complexity of query analysis (found by fuzzer). This closes [#33297](https://github.com/ClickHouse/ClickHouse/issues/33297). [#33445](https://github.com/ClickHouse/ClickHouse/pull/33445) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Reduce allocated memory for dictionaries with string attributes. [#33466](https://github.com/ClickHouse/ClickHouse/pull/33466) ([Maksim Kita](https://github.com/kitaisreal)). +* Slight performance improvement of `reinterpret` function. [#32587](https://github.com/ClickHouse/ClickHouse/pull/32587) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Non significant change. In extremely rare cases when data part is lost on every replica, after merging of some data parts, the subsequent queries may skip less amount of partitions during partition pruning. This hardly affects anything. [#32220](https://github.com/ClickHouse/ClickHouse/pull/32220) ([Azat Khuzhin](https://github.com/azat)). +* Improve `clickhouse-keeper` writing performance by optimization the size calculation logic. [#32366](https://github.com/ClickHouse/ClickHouse/pull/32366) ([zhanglistar](https://github.com/zhanglistar)). +* Optimize single part projection materialization. This closes [#31669](https://github.com/ClickHouse/ClickHouse/issues/31669). [#31885](https://github.com/ClickHouse/ClickHouse/pull/31885) ([Amos Bird](https://github.com/amosbird)). +* Improve query performance of system tables. [#33312](https://github.com/ClickHouse/ClickHouse/pull/33312) ([OnePiece](https://github.com/zhongyuankai)). +* Optimize selecting of MergeTree parts that can be moved between volumes. [#33225](https://github.com/ClickHouse/ClickHouse/pull/33225) ([OnePiece](https://github.com/zhongyuankai)). +* Fix `sparse_hashed` dict performance with sequential keys (wrong hash function). [#32536](https://github.com/ClickHouse/ClickHouse/pull/32536) ([Azat Khuzhin](https://github.com/azat)). + + +#### Experimental Feature + +* Parallel reading from multiple replicas within a shard during distributed query without using sample key. To enable this, set `allow_experimental_parallel_reading_from_replicas = 1` and `max_parallel_replicas` to any number. This closes [#26748](https://github.com/ClickHouse/ClickHouse/issues/26748). [#29279](https://github.com/ClickHouse/ClickHouse/pull/29279) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implemented sparse serialization. It can reduce usage of disk space and improve performance of some queries for columns, which contain a lot of default (zero) values. It can be enabled by setting `ratio_for_sparse_serialization`. Sparse serialization will be chosen dynamically for column, if it has ratio of number of default values to number of all values above that threshold. Serialization (default or sparse) will be fixed for every column in part, but may varies between parts. [#22535](https://github.com/ClickHouse/ClickHouse/pull/22535) ([Anton Popov](https://github.com/CurtizJ)). +* Add "TABLE OVERRIDE" feature for customizing MaterializedMySQL table schemas. [#32325](https://github.com/ClickHouse/ClickHouse/pull/32325) ([Stig Bakken](https://github.com/stigsb)). +* Add `EXPLAIN TABLE OVERRIDE` query. [#32836](https://github.com/ClickHouse/ClickHouse/pull/32836) ([Stig Bakken](https://github.com/stigsb)). +* Support TABLE OVERRIDE clause for MaterializedPostgreSQL. RFC: [#31480](https://github.com/ClickHouse/ClickHouse/issues/31480). [#32749](https://github.com/ClickHouse/ClickHouse/pull/32749) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Change ZooKeeper path for zero-copy marks for shared data. Note that "zero-copy replication" is non-production feature (in early stages of development) that you shouldn't use anyway. But in case if you have used it, let you keep in mind this change. [#32061](https://github.com/ClickHouse/ClickHouse/pull/32061) ([ianton-ru](https://github.com/ianton-ru)). +* Events clause support for WINDOW VIEW watch query. [#32607](https://github.com/ClickHouse/ClickHouse/pull/32607) ([vxider](https://github.com/Vxider)). +* Fix ACL with explicit digit hash in `clickhouse-keeper`: now the behavior consistent with ZooKeeper and generated digest is always accepted. [#33249](https://github.com/ClickHouse/ClickHouse/pull/33249) ([小路](https://github.com/nicelulu)). [#33246](https://github.com/ClickHouse/ClickHouse/pull/33246). +* Fix unexpected projection removal when detaching parts. [#32067](https://github.com/ClickHouse/ClickHouse/pull/32067) ([Amos Bird](https://github.com/amosbird)). + + +#### Improvement + +* Now date time conversion functions that generates time before `1970-01-01 00:00:00` will be saturated to zero instead of overflow. [#29953](https://github.com/ClickHouse/ClickHouse/pull/29953) ([Amos Bird](https://github.com/amosbird)). It also fixes a bug in index analysis if date truncation function would yield result before the Unix epoch. +* Always display resource usage (total CPU usage, total RAM usage and max RAM usage per host) in client. [#33271](https://github.com/ClickHouse/ClickHouse/pull/33271) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Improve `Bool` type serialization and deserialization, check the range of values. [#32984](https://github.com/ClickHouse/ClickHouse/pull/32984) ([Kruglov Pavel](https://github.com/Avogar)). +* If an invalid setting is defined using the `SET` query or using the query parameters in the HTTP request, error message will contain suggestions that are similar to the invalid setting string (if any exists). [#32946](https://github.com/ClickHouse/ClickHouse/pull/32946) ([Antonio Andelic](https://github.com/antonio2368)). +* Support hints for mistyped setting names for clickhouse-client and clickhouse-local. Closes [#32237](https://github.com/ClickHouse/ClickHouse/issues/32237). [#32841](https://github.com/ClickHouse/ClickHouse/pull/32841) ([凌涛](https://github.com/lingtaolf)). +* Allow to use virtual columns in Materialized Views. Close [#11210](https://github.com/ClickHouse/ClickHouse/issues/11210). [#33482](https://github.com/ClickHouse/ClickHouse/pull/33482) ([OnePiece](https://github.com/zhongyuankai)). +* Add config to disable IPv6 in clickhouse-keeper if needed. This close [#33381](https://github.com/ClickHouse/ClickHouse/issues/33381). [#33450](https://github.com/ClickHouse/ClickHouse/pull/33450) ([Wu Xueyang](https://github.com/wuxueyang96)). +* Add more info to `system.build_options` about current git revision. [#33431](https://github.com/ClickHouse/ClickHouse/pull/33431) ([taiyang-li](https://github.com/taiyang-li)). +* `clickhouse-local`: track memory under `--max_memory_usage_in_client` option. [#33341](https://github.com/ClickHouse/ClickHouse/pull/33341) ([Azat Khuzhin](https://github.com/azat)). +* Allow negative intervals in function `intervalLengthSum`. Their length will be added as well. This closes [#33323](https://github.com/ClickHouse/ClickHouse/issues/33323). [#33335](https://github.com/ClickHouse/ClickHouse/pull/33335) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* `LineAsString` can be used as output format. This closes [#30919](https://github.com/ClickHouse/ClickHouse/issues/30919). [#33331](https://github.com/ClickHouse/ClickHouse/pull/33331) ([Sergei Trifonov](https://github.com/serxa)). +* Support `` in cluster configuration, as an alternative form of `1`. Close [#33270](https://github.com/ClickHouse/ClickHouse/issues/33270). [#33330](https://github.com/ClickHouse/ClickHouse/pull/33330) ([SuperDJY](https://github.com/cmsxbc)). +* Pressing Ctrl+C twice will terminate `clickhouse-benchmark` immediately without waiting for in-flight queries. This closes [#32586](https://github.com/ClickHouse/ClickHouse/issues/32586). [#33303](https://github.com/ClickHouse/ClickHouse/pull/33303) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Support Unix timestamp with milliseconds in `parseDateTimeBestEffort` function. [#33276](https://github.com/ClickHouse/ClickHouse/pull/33276) ([Ben](https://github.com/benbiti)). +* Allow to cancel query while reading data from external table in the formats: `Arrow` / `Parquet` / `ORC` - it failed to be cancelled it case of big files and setting input_format_allow_seeks as false. Closes [#29678](https://github.com/ClickHouse/ClickHouse/issues/29678). [#33238](https://github.com/ClickHouse/ClickHouse/pull/33238) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If table engine supports `SETTINGS` clause, allow to pass the settings as key-value or via config. Add this support for MySQL. [#33231](https://github.com/ClickHouse/ClickHouse/pull/33231) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Correctly prevent Nullable primary keys if necessary. This is for [#32780](https://github.com/ClickHouse/ClickHouse/issues/32780). [#33218](https://github.com/ClickHouse/ClickHouse/pull/33218) ([Amos Bird](https://github.com/amosbird)). +* Add retry for `PostgreSQL` connections in case nothing has been fetched yet. Closes [#33199](https://github.com/ClickHouse/ClickHouse/issues/33199). [#33209](https://github.com/ClickHouse/ClickHouse/pull/33209) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Validate config keys for external dictionaries. [#33095](https://github.com/ClickHouse/ClickHouse/issues/33095#issuecomment-1000577517). [#33130](https://github.com/ClickHouse/ClickHouse/pull/33130) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Send profile info inside `clickhouse-local`. Closes [#33093](https://github.com/ClickHouse/ClickHouse/issues/33093). [#33097](https://github.com/ClickHouse/ClickHouse/pull/33097) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Short circuit evaluation: support for function `throwIf`. Closes [#32969](https://github.com/ClickHouse/ClickHouse/issues/32969). [#32973](https://github.com/ClickHouse/ClickHouse/pull/32973) ([Maksim Kita](https://github.com/kitaisreal)). +* (This only happens in unofficial builds). Fixed segfault when inserting data into compressed Decimal, String, FixedString and Array columns. This closes [#32939](https://github.com/ClickHouse/ClickHouse/issues/32939). [#32940](https://github.com/ClickHouse/ClickHouse/pull/32940) ([N. Kolotov](https://github.com/nkolotov)). +* Added support for specifying subquery as SQL user defined function. Example: `CREATE FUNCTION test AS () -> (SELECT 1)`. Closes [#30755](https://github.com/ClickHouse/ClickHouse/issues/30755). [#32758](https://github.com/ClickHouse/ClickHouse/pull/32758) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve gRPC compression support for [#28671](https://github.com/ClickHouse/ClickHouse/issues/28671). [#32747](https://github.com/ClickHouse/ClickHouse/pull/32747) ([Vitaly Baranov](https://github.com/vitlibar)). +* Flush all In-Memory data parts when WAL is not enabled while shutdown server or detaching table. [#32742](https://github.com/ClickHouse/ClickHouse/pull/32742) ([nauta](https://github.com/nautaa)). +* Allow to control connection timeouts for MySQL (previously was supported only for dictionary source). Closes [#16669](https://github.com/ClickHouse/ClickHouse/issues/16669). Previously default connect_timeout was rather small, now it is configurable. [#32734](https://github.com/ClickHouse/ClickHouse/pull/32734) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support `authSource` option for storage `MongoDB`. Closes [#32594](https://github.com/ClickHouse/ClickHouse/issues/32594). [#32702](https://github.com/ClickHouse/ClickHouse/pull/32702) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Support `Date32` type in `genarateRandom` table function. [#32643](https://github.com/ClickHouse/ClickHouse/pull/32643) ([nauta](https://github.com/nautaa)). +* Add settings `max_concurrent_select_queries` and `max_concurrent_insert_queries` for control concurrent queries by query kind. Close [#3575](https://github.com/ClickHouse/ClickHouse/issues/3575). [#32609](https://github.com/ClickHouse/ClickHouse/pull/32609) ([SuperDJY](https://github.com/cmsxbc)). +* Improve handling nested structures with missing columns while reading data in `Protobuf` format. Follow-up to https://github.com/ClickHouse/ClickHouse/pull/31988. [#32531](https://github.com/ClickHouse/ClickHouse/pull/32531) ([Vitaly Baranov](https://github.com/vitlibar)). +* Allow empty credentials for `MongoDB` engine. Closes [#26267](https://github.com/ClickHouse/ClickHouse/issues/26267). [#32460](https://github.com/ClickHouse/ClickHouse/pull/32460) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable some optimizations for window functions that may lead to exceptions. Closes [#31535](https://github.com/ClickHouse/ClickHouse/issues/31535). Closes [#31620](https://github.com/ClickHouse/ClickHouse/issues/31620). [#32453](https://github.com/ClickHouse/ClickHouse/pull/32453) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allows to connect to MongoDB 5.0. Closes [#31483](https://github.com/ClickHouse/ClickHouse/issues/31483),. [#32416](https://github.com/ClickHouse/ClickHouse/pull/32416) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Enable comparison between `Decimal` and `Float`. Closes [#22626](https://github.com/ClickHouse/ClickHouse/issues/22626). [#31966](https://github.com/ClickHouse/ClickHouse/pull/31966) ([flynn](https://github.com/ucasFL)). +* Added settings `command_read_timeout`, `command_write_timeout` for `StorageExecutable`, `StorageExecutablePool`, `ExecutableDictionary`, `ExecutablePoolDictionary`, `ExecutableUserDefinedFunctions`. Setting `command_read_timeout` controls timeout for reading data from command stdout in milliseconds. Setting `command_write_timeout` timeout for writing data to command stdin in milliseconds. Added settings `command_termination_timeout` for `ExecutableUserDefinedFunction`, `ExecutableDictionary`, `StorageExecutable`. Added setting `execute_direct` for `ExecutableUserDefinedFunction`, by default true. Added setting `execute_direct` for `ExecutableDictionary`, `ExecutablePoolDictionary`, by default false. [#30957](https://github.com/ClickHouse/ClickHouse/pull/30957) ([Maksim Kita](https://github.com/kitaisreal)). +* Bitmap aggregate functions will give correct result for out of range argument instead of wraparound. [#33127](https://github.com/ClickHouse/ClickHouse/pull/33127) ([DR](https://github.com/freedomDR)). +* Fix parsing incorrect queries with `FROM INFILE` statement. [#33521](https://github.com/ClickHouse/ClickHouse/pull/33521) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't allow to write into `S3` if path contains globs. [#33142](https://github.com/ClickHouse/ClickHouse/pull/33142) ([Kruglov Pavel](https://github.com/Avogar)). +* `--echo` option was not used by `clickhouse-client` in batch mode with single query. [#32843](https://github.com/ClickHouse/ClickHouse/pull/32843) ([N. Kolotov](https://github.com/nkolotov)). +* Use `--database` option for clickhouse-local. [#32797](https://github.com/ClickHouse/ClickHouse/pull/32797) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix surprisingly bad code in SQL ordinary function `file`. Now it supports symlinks. [#32640](https://github.com/ClickHouse/ClickHouse/pull/32640) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Updating `modification_time` for data part in `system.parts` after part movement [#32964](https://github.com/ClickHouse/ClickHouse/issues/32964). [#32965](https://github.com/ClickHouse/ClickHouse/pull/32965) ([save-my-heart](https://github.com/save-my-heart)). +* Potential issue, cannot be exploited: integer overflow may happen in array resize. [#33024](https://github.com/ClickHouse/ClickHouse/pull/33024) ([varadarajkumar](https://github.com/varadarajkumar)). + + +#### Build/Testing/Packaging Improvement + +* Add packages, functional tests and Docker builds for AArch64 (ARM) version of ClickHouse. [#32911](https://github.com/ClickHouse/ClickHouse/pull/32911) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). [#32415](https://github.com/ClickHouse/ClickHouse/pull/32415) +* Prepare ClickHouse to be built with musl-libc. It is not enabled by default. [#33134](https://github.com/ClickHouse/ClickHouse/pull/33134) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Make installation script working on FreeBSD. This closes [#33384](https://github.com/ClickHouse/ClickHouse/issues/33384). [#33418](https://github.com/ClickHouse/ClickHouse/pull/33418) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Add `actionlint` for GitHub Actions workflows and verify workflow files via `act --list` to check the correct workflow syntax. [#33612](https://github.com/ClickHouse/ClickHouse/pull/33612) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add more tests for the nullable primary key feature. Add more tests with different types and merge tree kinds, plus randomly generated data. [#33228](https://github.com/ClickHouse/ClickHouse/pull/33228) ([Amos Bird](https://github.com/amosbird)). +* Add a simple tool to visualize flaky tests in web browser. [#33185](https://github.com/ClickHouse/ClickHouse/pull/33185) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Enable hermetic build for shared builds. This is mainly for developers. [#32968](https://github.com/ClickHouse/ClickHouse/pull/32968) ([Amos Bird](https://github.com/amosbird)). +* Update `libc++` and `libc++abi` to the latest. [#32484](https://github.com/ClickHouse/ClickHouse/pull/32484) ([Raúl Marín](https://github.com/Algunenano)). +* Added integration test for external .NET client ([ClickHouse.Client](https://github.com/DarkWanderer/ClickHouse.Client)). [#23230](https://github.com/ClickHouse/ClickHouse/pull/23230) ([Oleg V. Kozlyuk](https://github.com/DarkWanderer)). +* Inject git information into clickhouse binary file. So we can get source code revision easily from clickhouse binary file. [#33124](https://github.com/ClickHouse/ClickHouse/pull/33124) ([taiyang-li](https://github.com/taiyang-li)). +* Remove obsolete code from ConfigProcessor. Yandex specific code is not used anymore. The code contained one minor defect. This defect was reported by [Mallik Hassan](https://github.com/SadiHassan) in [#33032](https://github.com/ClickHouse/ClickHouse/issues/33032). This closes [#33032](https://github.com/ClickHouse/ClickHouse/issues/33032). [#33026](https://github.com/ClickHouse/ClickHouse/pull/33026) ([alexey-milovidov](https://github.com/alexey-milovidov)). + + +#### Bug Fix (user-visible misbehavior in official stable or prestable release) + +* Several fixes for format parsing. This is relevant if `clickhouse-server` is open for write access to adversary. Specifically crafted input data for `Native` format may lead to reading uninitialized memory or crash. This is relevant if `clickhouse-server` is open for write access to adversary. [#33050](https://github.com/ClickHouse/ClickHouse/pull/33050) ([Heena Bansal](https://github.com/HeenaBansal2009)). Fixed Apache Avro Union type index out of boundary issue in Apache Avro binary format. [#33022](https://github.com/ClickHouse/ClickHouse/pull/33022) ([Harry Lee](https://github.com/HarryLeeIBM)). Fix null pointer dereference in `LowCardinality` data when deserializing `LowCardinality` data in the Native format. [#33021](https://github.com/ClickHouse/ClickHouse/pull/33021) ([Harry Lee](https://github.com/HarryLeeIBM)). +* ClickHouse Keeper handler will correctly remove operation when response sent. [#32988](https://github.com/ClickHouse/ClickHouse/pull/32988) ([JackyWoo](https://github.com/JackyWoo)). +* Potential off-by-one miscalculation of quotas: quota limit was not reached, but the limit was exceeded. This fixes [#31174](https://github.com/ClickHouse/ClickHouse/issues/31174). [#31656](https://github.com/ClickHouse/ClickHouse/pull/31656) ([sunny](https://github.com/sunny19930321)). +* Fixed CASTing from String to IPv4 or IPv6 and back. Fixed error message in case of failed conversion. [#29224](https://github.com/ClickHouse/ClickHouse/pull/29224) ([Dmitry Novik](https://github.com/novikd)) [#27914](https://github.com/ClickHouse/ClickHouse/pull/27914) ([Vasily Nemkov](https://github.com/Enmk)). +* Fixed an exception like `Unknown aggregate function nothing` during an execution on a remote server. This fixes [#16689](https://github.com/ClickHouse/ClickHouse/issues/16689). [#26074](https://github.com/ClickHouse/ClickHouse/pull/26074) ([hexiaoting](https://github.com/hexiaoting)). +* Fix wrong database for JOIN without explicit database in distributed queries (Fixes: [#10471](https://github.com/ClickHouse/ClickHouse/issues/10471)). [#33611](https://github.com/ClickHouse/ClickHouse/pull/33611) ([Azat Khuzhin](https://github.com/azat)). +* Fix segfault in Apache `Avro` format that appears after the second insert into file. [#33566](https://github.com/ClickHouse/ClickHouse/pull/33566) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix segfault in Apache `Arrow` format if schema contains `Dictionary` type. Closes [#33507](https://github.com/ClickHouse/ClickHouse/issues/33507). [#33529](https://github.com/ClickHouse/ClickHouse/pull/33529) ([Kruglov Pavel](https://github.com/Avogar)). +* Out of band `offset` and `limit` settings may be applied incorrectly for views. Close [#33289](https://github.com/ClickHouse/ClickHouse/issues/33289) [#33518](https://github.com/ClickHouse/ClickHouse/pull/33518) ([hexiaoting](https://github.com/hexiaoting)). +* Fix an exception `Block structure mismatch` which may happen during insertion into table with default nested `LowCardinality` column. Fixes [#33028](https://github.com/ClickHouse/ClickHouse/issues/33028). [#33504](https://github.com/ClickHouse/ClickHouse/pull/33504) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix dictionary expressions for `range_hashed` range min and range max attributes when created using DDL. Closes [#30809](https://github.com/ClickHouse/ClickHouse/issues/30809). [#33478](https://github.com/ClickHouse/ClickHouse/pull/33478) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix possible use-after-free for INSERT into Materialized View with concurrent DROP ([Azat Khuzhin](https://github.com/azat)). +* Do not try to read pass EOF (to workaround for a bug in the Linux kernel), this bug can be reproduced on kernels (3.14..5.9), and requires `index_granularity_bytes=0` (i.e. turn off adaptive index granularity). [#33372](https://github.com/ClickHouse/ClickHouse/pull/33372) ([Azat Khuzhin](https://github.com/azat)). +* The commands `SYSTEM SUSPEND` and `SYSTEM ... THREAD FUZZER` missed access control. It is fixed. Author: Kevin Michel. [#33333](https://github.com/ClickHouse/ClickHouse/pull/33333) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix when `COMMENT` for dictionaries does not appear in `system.tables`, `system.dictionaries`. Allow to modify the comment for `Dictionary` engine. Closes [#33251](https://github.com/ClickHouse/ClickHouse/issues/33251). [#33261](https://github.com/ClickHouse/ClickHouse/pull/33261) ([Maksim Kita](https://github.com/kitaisreal)). +* Add asynchronous inserts (with enabled setting `async_insert`) to query log. Previously such queries didn't appear in the query log. [#33239](https://github.com/ClickHouse/ClickHouse/pull/33239) ([Anton Popov](https://github.com/CurtizJ)). +* Fix sending `WHERE 1 = 0` expressions for external databases query. Closes [#33152](https://github.com/ClickHouse/ClickHouse/issues/33152). [#33214](https://github.com/ClickHouse/ClickHouse/pull/33214) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix DDL validation for MaterializedPostgreSQL. Fix setting `materialized_postgresql_allow_automatic_update`. Closes [#29535](https://github.com/ClickHouse/ClickHouse/issues/29535). [#33200](https://github.com/ClickHouse/ClickHouse/pull/33200) ([Kseniia Sumarokova](https://github.com/kssenii)). Make sure unused replication slots are always removed. Found in [#26952](https://github.com/ClickHouse/ClickHouse/issues/26952). [#33187](https://github.com/ClickHouse/ClickHouse/pull/33187) ([Kseniia Sumarokova](https://github.com/kssenii)). Fix MaterializedPostreSQL detach/attach (removing / adding to replication) tables with non-default schema. Found in [#29535](https://github.com/ClickHouse/ClickHouse/issues/29535). [#33179](https://github.com/ClickHouse/ClickHouse/pull/33179) ([Kseniia Sumarokova](https://github.com/kssenii)). Fix DROP MaterializedPostgreSQL database. [#33468](https://github.com/ClickHouse/ClickHouse/pull/33468) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The metric `StorageBufferBytes` sometimes was miscalculated. [#33159](https://github.com/ClickHouse/ClickHouse/pull/33159) ([xuyatian](https://github.com/xuyatian)). +* Fix error `Invalid version for SerializationLowCardinality key column` in case of reading from `LowCardinality` column with `local_filesystem_read_prefetch` or `remote_filesystem_read_prefetch` enabled. [#33046](https://github.com/ClickHouse/ClickHouse/pull/33046) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `s3` table function reading empty file. Closes [#33008](https://github.com/ClickHouse/ClickHouse/issues/33008). [#33037](https://github.com/ClickHouse/ClickHouse/pull/33037) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix Context leak in case of cancel_http_readonly_queries_on_client_close (i.e. leaking of external tables that had been uploaded the the server and other resources). [#32982](https://github.com/ClickHouse/ClickHouse/pull/32982) ([Azat Khuzhin](https://github.com/azat)). +* Fix wrong tuple output in `CSV` format in case of custom csv delimiter. [#32981](https://github.com/ClickHouse/ClickHouse/pull/32981) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix HDFS URL check that didn't allow using HA namenode address. Bug was introduced in https://github.com/ClickHouse/ClickHouse/pull/31042. [#32976](https://github.com/ClickHouse/ClickHouse/pull/32976) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix throwing exception like positional argument out of bounds for non-positional arguments. Closes [#31173](https://github.com/ClickHouse/ClickHouse/issues/31173)#event-5789668239. [#32961](https://github.com/ClickHouse/ClickHouse/pull/32961) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix UB in case of unexpected EOF during filling a set from HTTP query (i.e. if the client interrupted in the middle, i.e. `timeout 0.15s curl -Ss -F 's=@t.csv;' 'http://127.0.0.1:8123/?s_structure=key+Int&query=SELECT+dummy+IN+s'` and with large enough `t.csv`). [#32955](https://github.com/ClickHouse/ClickHouse/pull/32955) ([Azat Khuzhin](https://github.com/azat)). +* Fix a regression in `replaceRegexpAll` function. The function worked incorrectly when matched substring was empty. This closes [#32777](https://github.com/ClickHouse/ClickHouse/issues/32777). This closes [#30245](https://github.com/ClickHouse/ClickHouse/issues/30245). [#32945](https://github.com/ClickHouse/ClickHouse/pull/32945) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix `ORC` format stripe reading. [#32929](https://github.com/ClickHouse/ClickHouse/pull/32929) ([kreuzerkrieg](https://github.com/kreuzerkrieg)). +* `topKWeightedState` failed for some input types. [#32487](https://github.com/ClickHouse/ClickHouse/issues/32487). [#32914](https://github.com/ClickHouse/ClickHouse/pull/32914) ([vdimir](https://github.com/vdimir)). +* Fix exception `Single chunk is expected from view inner query (LOGICAL_ERROR)` in materialized view. Fixes [#31419](https://github.com/ClickHouse/ClickHouse/issues/31419). [#32862](https://github.com/ClickHouse/ClickHouse/pull/32862) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix optimization with lazy seek for async reads from remote filesystems. Closes [#32803](https://github.com/ClickHouse/ClickHouse/issues/32803). [#32835](https://github.com/ClickHouse/ClickHouse/pull/32835) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `MergeTree` table engine might silently skip some mutations if there are too many running mutations or in case of high memory consumption, it's fixed. Fixes [#17882](https://github.com/ClickHouse/ClickHouse/issues/17882). [#32814](https://github.com/ClickHouse/ClickHouse/pull/32814) ([tavplubix](https://github.com/tavplubix)). +* Avoid reusing the scalar subquery cache when processing MV blocks. This fixes a bug when the scalar query reference the source table but it means that all subscalar queries in the MV definition will be calculated for each block. [#32811](https://github.com/ClickHouse/ClickHouse/pull/32811) ([Raúl Marín](https://github.com/Algunenano)). +* Server might fail to start if database with `MySQL` engine cannot connect to MySQL server, it's fixed. Fixes [#14441](https://github.com/ClickHouse/ClickHouse/issues/14441). [#32802](https://github.com/ClickHouse/ClickHouse/pull/32802) ([tavplubix](https://github.com/tavplubix)). +* Fix crash when used `fuzzBits` function, close [#32737](https://github.com/ClickHouse/ClickHouse/issues/32737). [#32755](https://github.com/ClickHouse/ClickHouse/pull/32755) ([SuperDJY](https://github.com/cmsxbc)). +* Fix error `Column is not under aggregate function` in case of MV with `GROUP BY (list of columns)` (which is pared as `GROUP BY tuple(...)`) over `Kafka`/`RabbitMQ`. Fixes [#32668](https://github.com/ClickHouse/ClickHouse/issues/32668) and [#32744](https://github.com/ClickHouse/ClickHouse/issues/32744). [#32751](https://github.com/ClickHouse/ClickHouse/pull/32751) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix `ALTER TABLE ... MATERIALIZE TTL` query with `TTL ... DELETE WHERE ...` and `TTL ... GROUP BY ...` modes. [#32695](https://github.com/ClickHouse/ClickHouse/pull/32695) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `optimize_read_in_order` optimization in case when table engine is `Distributed` or `Merge` and its underlying `MergeTree` tables have monotonous function in prefix of sorting key. [#32670](https://github.com/ClickHouse/ClickHouse/pull/32670) ([Anton Popov](https://github.com/CurtizJ)). +* Fix LOGICAL_ERROR exception when the target of a materialized view is a JOIN or a SET table. [#32669](https://github.com/ClickHouse/ClickHouse/pull/32669) ([Raúl Marín](https://github.com/Algunenano)). +* Inserting into S3 with multipart upload to Google Cloud Storage may trigger abort. [#32504](https://github.com/ClickHouse/ClickHouse/issues/32504). [#32649](https://github.com/ClickHouse/ClickHouse/pull/32649) ([vdimir](https://github.com/vdimir)). +* Fix possible exception at `RabbitMQ` storage startup by delaying channel creation. [#32584](https://github.com/ClickHouse/ClickHouse/pull/32584) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix table lifetime (i.e. possible use-after-free) in case of parallel DROP TABLE and INSERT. [#32572](https://github.com/ClickHouse/ClickHouse/pull/32572) ([Azat Khuzhin](https://github.com/azat)). +* Fix async inserts with formats `CustomSeparated`, `Template`, `Regexp`, `MsgPack` and `JSONAsString`. Previousely the async inserts with these formats didn't read any data. [#32530](https://github.com/ClickHouse/ClickHouse/pull/32530) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `groupBitmapAnd` function on distributed table. [#32529](https://github.com/ClickHouse/ClickHouse/pull/32529) ([minhthucdao](https://github.com/dmthuc)). +* Fix crash in JOIN found by fuzzer, close [#32458](https://github.com/ClickHouse/ClickHouse/issues/32458). [#32508](https://github.com/ClickHouse/ClickHouse/pull/32508) ([vdimir](https://github.com/vdimir)). +* Proper handling of the case with Apache Arrow column duplication. [#32507](https://github.com/ClickHouse/ClickHouse/pull/32507) ([Dmitriy Mokhnatkin](https://github.com/DMokhnatkin)). +* Fix issue with ambiguous query formatting in distributed queries that led to errors when some table columns were named `ALL` or `DISTINCT`. This closes [#32391](https://github.com/ClickHouse/ClickHouse/issues/32391). [#32490](https://github.com/ClickHouse/ClickHouse/pull/32490) ([alexey-milovidov](https://github.com/alexey-milovidov)). +* Fix failures in queries that are trying to use skipping indices, which are not materialized yet. Fixes [#32292](https://github.com/ClickHouse/ClickHouse/issues/32292) and [#30343](https://github.com/ClickHouse/ClickHouse/issues/30343). [#32359](https://github.com/ClickHouse/ClickHouse/pull/32359) ([Anton Popov](https://github.com/CurtizJ)). +* Fix broken select query when there are more than 2 row policies on same column, begin at second queries on the same session. [#31606](https://github.com/ClickHouse/ClickHouse/issues/31606). [#32291](https://github.com/ClickHouse/ClickHouse/pull/32291) ([SuperDJY](https://github.com/cmsxbc)). +* Fix fractional unix timestamp conversion to `DateTime64`, fractional part was reversed for negative unix timestamps (before 1970-01-01). [#32240](https://github.com/ClickHouse/ClickHouse/pull/32240) ([Ben](https://github.com/benbiti)). +* Some entries of replication queue might hang for `temporary_directories_lifetime` (1 day by default) with `Directory tmp_merge_` or `Part ... (state Deleting) already exists, but it will be deleted soon` or similar error. It's fixed. Fixes [#29616](https://github.com/ClickHouse/ClickHouse/issues/29616). [#32201](https://github.com/ClickHouse/ClickHouse/pull/32201) ([tavplubix](https://github.com/tavplubix)). +* Fix parsing of `APPLY lambda` column transformer which could lead to client/server crash. [#32138](https://github.com/ClickHouse/ClickHouse/pull/32138) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `base64Encode` adding trailing bytes on small strings. [#31797](https://github.com/ClickHouse/ClickHouse/pull/31797) ([Kevin Michel](https://github.com/kmichel-aiven)). +* Fix possible crash (or incorrect result) in case of `LowCardinality` arguments of window function. Fixes [#31114](https://github.com/ClickHouse/ClickHouse/issues/31114). [#31888](https://github.com/ClickHouse/ClickHouse/pull/31888) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix hang up with command `DROP TABLE system.query_log sync`. [#33293](https://github.com/ClickHouse/ClickHouse/pull/33293) ([zhanghuajie](https://github.com/zhanghuajieHIT)). + + +## [Changelog for 2021](./2021.md) diff --git a/docs/ja/whats-new/changelog/2023.md b/docs/ja/whats-new/changelog/2023.md new file mode 100644 index 00000000000..daa6c121dd9 --- /dev/null +++ b/docs/ja/whats-new/changelog/2023.md @@ -0,0 +1,2171 @@ +--- +slug: /ja/whats-new/changelog/2023 +sidebar_position: 8 +sidebar_label: 2023 +title: 2023 Changelog +--- + +### Table of Contents +**[ClickHouse release v23.12, 2023-12-28](#2312)**
    +**[ClickHouse release v23.11, 2023-12-06](#2311)**
    +**[ClickHouse release v23.10, 2023-11-02](#2310)**
    +**[ClickHouse release v23.9, 2023-09-28](#239)**
    +**[ClickHouse release v23.8 LTS, 2023-08-31](#238)**
    +**[ClickHouse release v23.7, 2023-07-27](#237)**
    +**[ClickHouse release v23.6, 2023-06-30](#236)**
    +**[ClickHouse release v23.5, 2023-06-08](#235)**
    +**[ClickHouse release v23.4, 2023-04-26](#234)**
    +**[ClickHouse release v23.3 LTS, 2023-03-30](#233)**
    +**[ClickHouse release v23.2, 2023-02-23](#232)**
    +**[ClickHouse release v23.1, 2023-01-25](#231)**
    +**[Changelog for 2022](https://clickhouse.com/docs/ja/whats-new/changelog/2022/)**
    + +# 2023 Changelog + +### ClickHouse release 23.12, 2023-12-28 {#2312} + +#### Backward Incompatible Change +* Fix check for non-deterministic functions in TTL expressions. Previously, you could create a TTL expression with non-deterministic functions in some cases, which could lead to undefined behavior later. This fixes [#37250](https://github.com/ClickHouse/ClickHouse/issues/37250). Disallow TTL expressions that don't depend on any columns of a table by default. It can be allowed back by `SET allow_suspicious_ttl_expressions = 1` or `SET compatibility = '23.11'`. Closes [#37286](https://github.com/ClickHouse/ClickHouse/issues/37286). [#51858](https://github.com/ClickHouse/ClickHouse/pull/51858) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The MergeTree setting `clean_deleted_rows` is deprecated, it has no effect anymore. The `CLEANUP` keyword for the `OPTIMIZE` is not allowed by default (it can be unlocked with the `allow_experimental_replacing_merge_with_cleanup` setting). [#58267](https://github.com/ClickHouse/ClickHouse/pull/58267) ([Alexander Tokmakov](https://github.com/tavplubix)). This fixes [#57930](https://github.com/ClickHouse/ClickHouse/issues/57930). This closes [#54988](https://github.com/ClickHouse/ClickHouse/issues/54988). This closes [#54570](https://github.com/ClickHouse/ClickHouse/issues/54570). This closes [#50346](https://github.com/ClickHouse/ClickHouse/issues/50346). This closes [#47579](https://github.com/ClickHouse/ClickHouse/issues/47579). The feature has to be removed because it is not good. We have to remove it as quickly as possible, because there is no other option. [#57932](https://github.com/ClickHouse/ClickHouse/pull/57932) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Implement Refreshable Materialized Views, requested in [#33919](https://github.com/ClickHouse/ClickHouse/issues/33919). [#56946](https://github.com/ClickHouse/ClickHouse/pull/56946) ([Michael Kolupaev](https://github.com/al13n321), [Michael Guzov](https://github.com/koloshmet)). +* Introduce `PASTE JOIN`, which allows users to join tables without `ON` clause simply by row numbers. Example: `SELECT * FROM (SELECT number AS a FROM numbers(2)) AS t1 PASTE JOIN (SELECT number AS a FROM numbers(2) ORDER BY a DESC) AS t2`. [#57995](https://github.com/ClickHouse/ClickHouse/pull/57995) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* The `ORDER BY` clause now supports specifying `ALL`, meaning that ClickHouse sorts by all columns in the `SELECT` clause. Example: `SELECT col1, col2 FROM tab WHERE [...] ORDER BY ALL`. [#57875](https://github.com/ClickHouse/ClickHouse/pull/57875) ([zhongyuankai](https://github.com/zhongyuankai)). +* Added a new mutation command `ALTER TABLE
    APPLY DELETED MASK`, which allows to enforce applying of mask written by lightweight delete and to remove rows marked as deleted from disk. [#57433](https://github.com/ClickHouse/ClickHouse/pull/57433) ([Anton Popov](https://github.com/CurtizJ)). +* A handler `/binary` opens a visual viewer of symbols inside the ClickHouse binary. [#58211](https://github.com/ClickHouse/ClickHouse/pull/58211) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added a new SQL function `sqid` to generate Sqids (https://sqids.org/), example: `SELECT sqid(125, 126)`. [#57512](https://github.com/ClickHouse/ClickHouse/pull/57512) ([Robert Schulze](https://github.com/rschu1ze)). +* Add a new function `seriesPeriodDetectFFT` to detect series period using FFT. [#57574](https://github.com/ClickHouse/ClickHouse/pull/57574) ([Bhavna Jindal](https://github.com/bhavnajindal)). +* Add an HTTP endpoint for checking if Keeper is ready to accept traffic. [#55876](https://github.com/ClickHouse/ClickHouse/pull/55876) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Add 'union' mode for schema inference. In this mode the resulting table schema is the union of all files schemas (so schema is inferred from each file). The mode of schema inference is controlled by a setting `schema_inference_mode` with two possible values - `default` and `union`. Closes [#55428](https://github.com/ClickHouse/ClickHouse/issues/55428). [#55892](https://github.com/ClickHouse/ClickHouse/pull/55892) ([Kruglov Pavel](https://github.com/Avogar)). +* Add new setting `input_format_csv_try_infer_numbers_from_strings` that allows to infer numbers from strings in CSV format. Closes [#56455](https://github.com/ClickHouse/ClickHouse/issues/56455). [#56859](https://github.com/ClickHouse/ClickHouse/pull/56859) ([Kruglov Pavel](https://github.com/Avogar)). +* When the number of databases or tables exceeds a configurable threshold, show a warning to the user. [#57375](https://github.com/ClickHouse/ClickHouse/pull/57375) ([凌涛](https://github.com/lingtaolf)). +* Dictionary with `HASHED_ARRAY` (and `COMPLEX_KEY_HASHED_ARRAY`) layout supports `SHARDS` similarly to `HASHED`. [#57544](https://github.com/ClickHouse/ClickHouse/pull/57544) ([vdimir](https://github.com/vdimir)). +* Add asynchronous metrics for total primary key bytes and total allocated primary key bytes in memory. [#57551](https://github.com/ClickHouse/ClickHouse/pull/57551) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `SHA512_256` function. [#57645](https://github.com/ClickHouse/ClickHouse/pull/57645) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `FORMAT_BYTES` as an alias for `formatReadableSize`. [#57592](https://github.com/ClickHouse/ClickHouse/pull/57592) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow passing optional session token to the `s3` table function. [#57850](https://github.com/ClickHouse/ClickHouse/pull/57850) ([Shani Elharrar](https://github.com/shanielh)). +* Introduce a new setting `http_make_head_request`. If it is turned off, the URL table engine will not do a HEAD request to determine the file size. This is needed to support inefficient, misconfigured, or not capable HTTP servers. [#54602](https://github.com/ClickHouse/ClickHouse/pull/54602) ([Fionera](https://github.com/fionera)). +* It is now possible to refer to ALIAS column in index (non-primary-key) definitions (issue [#55650](https://github.com/ClickHouse/ClickHouse/issues/55650)). Example: `CREATE TABLE tab(col UInt32, col_alias ALIAS col + 1, INDEX idx (col_alias) TYPE minmax) ENGINE = MergeTree ORDER BY col;`. [#57546](https://github.com/ClickHouse/ClickHouse/pull/57546) ([Robert Schulze](https://github.com/rschu1ze)). +* Added a new setting `readonly` which can be used to specify an S3 disk is read only. It can be useful to create a table on a disk of `s3_plain` type, while having read only access to the underlying S3 bucket. [#57977](https://github.com/ClickHouse/ClickHouse/pull/57977) ([Pengyuan Bian](https://github.com/bianpengyuan)). +* The primary key analysis in MergeTree tables will now be applied to predicates that include the virtual column `_part_offset` (optionally with `_part`). This feature can serve as a special kind of a secondary index. [#58224](https://github.com/ClickHouse/ClickHouse/pull/58224) ([Amos Bird](https://github.com/amosbird)). + +#### Performance Improvement +* Extract non-intersecting parts ranges from MergeTree table during FINAL processing. That way we can avoid additional FINAL logic for this non-intersecting parts ranges. In case when amount of duplicate values with same primary key is low, performance will be almost the same as without FINAL. Improve reading performance for MergeTree FINAL when `do_not_merge_across_partitions_select_final` setting is set. [#58120](https://github.com/ClickHouse/ClickHouse/pull/58120) ([Maksim Kita](https://github.com/kitaisreal)). +* Made copy between s3 disks using a s3-server-side copy instead of copying through the buffer. Improves `BACKUP/RESTORE` operations and `clickhouse-disks copy` command. [#56744](https://github.com/ClickHouse/ClickHouse/pull/56744) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Hash JOIN respects setting `max_joined_block_size_rows` and do not produce large blocks for `ALL JOIN`. [#56996](https://github.com/ClickHouse/ClickHouse/pull/56996) ([vdimir](https://github.com/vdimir)). +* Release memory for aggregation earlier. This may avoid unnecessary external aggregation. [#57691](https://github.com/ClickHouse/ClickHouse/pull/57691) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Improve performance of string serialization. [#57717](https://github.com/ClickHouse/ClickHouse/pull/57717) ([Maksim Kita](https://github.com/kitaisreal)). +* Support trivial count optimization for `Merge`-engine tables. [#57867](https://github.com/ClickHouse/ClickHouse/pull/57867) ([skyoct](https://github.com/skyoct)). +* Optimized aggregation in some cases. [#57872](https://github.com/ClickHouse/ClickHouse/pull/57872) ([Anton Popov](https://github.com/CurtizJ)). +* The `hasAny` function can now take advantage of the full-text skipping indices. [#57878](https://github.com/ClickHouse/ClickHouse/pull/57878) ([Jpnock](https://github.com/Jpnock)). +* Function `if(cond, then, else)` (and its alias `cond ? then : else`) were optimized to use branch-free evaluation. [#57885](https://github.com/ClickHouse/ClickHouse/pull/57885) ([zhanglistar](https://github.com/zhanglistar)). +* MergeTree automatically derive `do_not_merge_across_partitions_select_final` setting if partition key expression contains only columns from primary key expression. [#58218](https://github.com/ClickHouse/ClickHouse/pull/58218) ([Maksim Kita](https://github.com/kitaisreal)). +* Speedup `MIN` and `MAX` for native types. [#58231](https://github.com/ClickHouse/ClickHouse/pull/58231) ([Raúl Marín](https://github.com/Algunenano)). +* Implement `SLRU` cache policy for filesystem cache. [#57076](https://github.com/ClickHouse/ClickHouse/pull/57076) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The limit for the number of connections per endpoint for background fetches was raised from `15` to the value of `background_fetches_pool_size` setting. - MergeTree-level setting `replicated_max_parallel_fetches_for_host` became obsolete - MergeTree-level settings `replicated_fetches_http_connection_timeout`, `replicated_fetches_http_send_timeout` and `replicated_fetches_http_receive_timeout` are moved to the Server-level. - Setting `keep_alive_timeout` is added to the list of Server-level settings. [#57523](https://github.com/ClickHouse/ClickHouse/pull/57523) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Make querying `system.filesystem_cache` not memory intensive. [#57687](https://github.com/ClickHouse/ClickHouse/pull/57687) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Reduce memory usage on strings deserialization. [#57787](https://github.com/ClickHouse/ClickHouse/pull/57787) ([Maksim Kita](https://github.com/kitaisreal)). +* More efficient constructor for Enum - it makes sense when Enum has a boatload of values. [#57887](https://github.com/ClickHouse/ClickHouse/pull/57887) ([Duc Canh Le](https://github.com/canhld94)). +* An improvement for reading from the filesystem cache: always use `pread` method. [#57970](https://github.com/ClickHouse/ClickHouse/pull/57970) ([Nikita Taranov](https://github.com/nickitat)). +* Add optimization for AND notEquals chain in logical expression optimizer. This optimization is only available with the experimental Analyzer enabled. [#58214](https://github.com/ClickHouse/ClickHouse/pull/58214) ([Kevin Mingtarja](https://github.com/kevinmingtarja)). + +#### Improvement +* Support for soft memory limit in Keeper. It will refuse requests if the memory usage is close to the maximum. [#57271](https://github.com/ClickHouse/ClickHouse/pull/57271) ([Han Fei](https://github.com/hanfei1991)). [#57699](https://github.com/ClickHouse/ClickHouse/pull/57699) ([Han Fei](https://github.com/hanfei1991)). +* Make inserts into distributed tables handle updated cluster configuration properly. When the list of cluster nodes is dynamically updated, the Directory Monitor of the distribution table will update it. [#42826](https://github.com/ClickHouse/ClickHouse/pull/42826) ([zhongyuankai](https://github.com/zhongyuankai)). +* Do not allow creating a replicated table with inconsistent merge parameters. [#56833](https://github.com/ClickHouse/ClickHouse/pull/56833) ([Duc Canh Le](https://github.com/canhld94)). +* Show uncompressed size in `system.tables`. [#56618](https://github.com/ClickHouse/ClickHouse/issues/56618). [#57186](https://github.com/ClickHouse/ClickHouse/pull/57186) ([Chen Lixiang](https://github.com/chenlx0)). +* Add `skip_unavailable_shards` as a setting for `Distributed` tables that is similar to the corresponding query-level setting. Closes [#43666](https://github.com/ClickHouse/ClickHouse/issues/43666). [#57218](https://github.com/ClickHouse/ClickHouse/pull/57218) ([Gagan Goel](https://github.com/tntnatbry)). +* The function `substring` (aliases: `substr`, `mid`) can now be used with `Enum` types. Previously, the first function argument had to be a value of type `String` or `FixedString`. This improves compatibility with 3rd party tools such as Tableau via MySQL interface. [#57277](https://github.com/ClickHouse/ClickHouse/pull/57277) ([Serge Klochkov](https://github.com/slvrtrn)). +* Function `format` now supports arbitrary argument types (instead of only `String` and `FixedString` arguments). This is important to calculate `SELECT format('The {0} to all questions is {1}', 'answer', 42)`. [#57549](https://github.com/ClickHouse/ClickHouse/pull/57549) ([Robert Schulze](https://github.com/rschu1ze)). +* Allows to use the `date_trunc` function with a case-insensitive first argument. Both cases are now supported: `SELECT date_trunc('day', now())` and `SELECT date_trunc('DAY', now())`. [#57624](https://github.com/ClickHouse/ClickHouse/pull/57624) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Better hints when a table doesn't exist. [#57342](https://github.com/ClickHouse/ClickHouse/pull/57342) ([Bharat Nallan](https://github.com/bharatnc)). +* Allow to overwrite `max_partition_size_to_drop` and `max_table_size_to_drop` server settings in query time. [#57452](https://github.com/ClickHouse/ClickHouse/pull/57452) ([Jordi Villar](https://github.com/jrdi)). +* Slightly better inference of unnamed tupes in JSON formats. [#57751](https://github.com/ClickHouse/ClickHouse/pull/57751) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for read-only flag when connecting to Keeper (fixes [#53749](https://github.com/ClickHouse/ClickHouse/issues/53749)). [#57479](https://github.com/ClickHouse/ClickHouse/pull/57479) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Fix possible distributed sends stuck due to "No such file or directory" (during recovering a batch from disk). Fix possible issues with `error_count` from `system.distribution_queue` (in case of `distributed_directory_monitor_max_sleep_time_ms` >5min). Introduce profile event to track async INSERT failures - `DistributedAsyncInsertionFailures`. [#57480](https://github.com/ClickHouse/ClickHouse/pull/57480) ([Azat Khuzhin](https://github.com/azat)). +* Support PostgreSQL generated columns and default column values in `MaterializedPostgreSQL` (experimental feature). Closes [#40449](https://github.com/ClickHouse/ClickHouse/issues/40449). [#57568](https://github.com/ClickHouse/ClickHouse/pull/57568) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to apply some filesystem cache config settings changes without server restart. [#57578](https://github.com/ClickHouse/ClickHouse/pull/57578) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Properly handling PostgreSQL table structure with empty array. [#57618](https://github.com/ClickHouse/ClickHouse/pull/57618) ([Mike Kot](https://github.com/myrrc)). +* Expose the total number of errors occurred since last server restart as a `ClickHouseErrorMetric_ALL` metric. [#57627](https://github.com/ClickHouse/ClickHouse/pull/57627) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow nodes in the configuration file with `from_env`/`from_zk` reference and non empty element with replace=1. [#57628](https://github.com/ClickHouse/ClickHouse/pull/57628) ([Azat Khuzhin](https://github.com/azat)). +* A table function `fuzzJSON` which allows generating a lot of malformed JSON for fuzzing. [#57646](https://github.com/ClickHouse/ClickHouse/pull/57646) ([Julia Kartseva](https://github.com/jkartseva)). +* Allow IPv6 to UInt128 conversion and binary arithmetic. [#57707](https://github.com/ClickHouse/ClickHouse/pull/57707) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add a setting for `async inserts deduplication cache` - how long we wait for cache update. Deprecate setting `async_block_ids_cache_min_update_interval_ms`. Now cache is updated only in case of conflicts. [#57743](https://github.com/ClickHouse/ClickHouse/pull/57743) ([alesapin](https://github.com/alesapin)). +* `sleep()` function now can be cancelled with `KILL QUERY`. [#57746](https://github.com/ClickHouse/ClickHouse/pull/57746) ([Vitaly Baranov](https://github.com/vitlibar)). +* Forbid `CREATE TABLE ... AS SELECT` queries for `Replicated` table engines in the experimental `Replicated` database because they are not supported. Reference [#35408](https://github.com/ClickHouse/ClickHouse/issues/35408). [#57796](https://github.com/ClickHouse/ClickHouse/pull/57796) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix and improve transforming queries for external databases, to recursively obtain all compatible predicates. [#57888](https://github.com/ClickHouse/ClickHouse/pull/57888) ([flynn](https://github.com/ucasfl)). +* Support dynamic reloading of the filesystem cache size. Closes [#57866](https://github.com/ClickHouse/ClickHouse/issues/57866). [#57897](https://github.com/ClickHouse/ClickHouse/pull/57897) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Correctly support `system.stack_trace` for threads with blocked SIGRTMIN (these threads can exist in low-quality external libraries such as Apache rdkafka). [#57907](https://github.com/ClickHouse/ClickHouse/pull/57907) ([Azat Khuzhin](https://github.com/azat)). Aand also send signal to the threads only if it is not blocked to avoid waiting `storage_system_stack_trace_pipe_read_timeout_ms` when it does not make any sense. [#58136](https://github.com/ClickHouse/ClickHouse/pull/58136) ([Azat Khuzhin](https://github.com/azat)). +* Tolerate keeper failures in the quorum inserts' check. [#57986](https://github.com/ClickHouse/ClickHouse/pull/57986) ([Raúl Marín](https://github.com/Algunenano)). +* Add max/peak RSS (`MemoryResidentMax`) into system.asynchronous_metrics. [#58095](https://github.com/ClickHouse/ClickHouse/pull/58095) ([Azat Khuzhin](https://github.com/azat)). +* This PR allows users to use s3-style links (`https://` and `s3://`) without mentioning region if it's not default. Also find the correct region if the user mentioned the wrong one. [#58148](https://github.com/ClickHouse/ClickHouse/pull/58148) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* `clickhouse-format --obfuscate` will know about Settings, MergeTreeSettings, and time zones and keep their names unchanged. [#58179](https://github.com/ClickHouse/ClickHouse/pull/58179) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added explicit `finalize()` function in `ZipArchiveWriter`. Simplify too complicated code in `ZipArchiveWriter`. This fixes [#58074](https://github.com/ClickHouse/ClickHouse/issues/58074). [#58202](https://github.com/ClickHouse/ClickHouse/pull/58202) ([Vitaly Baranov](https://github.com/vitlibar)). +* Make caches with the same path use the same cache objects. This behaviour existed before, but was broken in 23.4. If such caches with the same path have different set of cache settings, an exception will be thrown, that this is not allowed. [#58264](https://github.com/ClickHouse/ClickHouse/pull/58264) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Parallel replicas (experimental feature): friendly settings [#57542](https://github.com/ClickHouse/ClickHouse/pull/57542) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas (experimental feature): announcement response handling improvement [#57749](https://github.com/ClickHouse/ClickHouse/pull/57749) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas (experimental feature): give more respect to `min_number_of_marks` in `ParallelReplicasReadingCoordinator` [#57763](https://github.com/ClickHouse/ClickHouse/pull/57763) ([Nikita Taranov](https://github.com/nickitat)). +* Parallel replicas (experimental feature): disable parallel replicas with IN (subquery) [#58133](https://github.com/ClickHouse/ClickHouse/pull/58133) ([Igor Nikonov](https://github.com/devcrafter)). +* Parallel replicas (experimental feature): add profile event 'ParallelReplicasUsedCount' [#58173](https://github.com/ClickHouse/ClickHouse/pull/58173) ([Igor Nikonov](https://github.com/devcrafter)). +* Non POST requests such as HEAD will be readonly similar to GET. [#58060](https://github.com/ClickHouse/ClickHouse/pull/58060) ([San](https://github.com/santrancisco)). +* Add `bytes_uncompressed` column to `system.part_log` [#58167](https://github.com/ClickHouse/ClickHouse/pull/58167) ([Jordi Villar](https://github.com/jrdi)). +* Add base backup name to `system.backups` and `system.backup_log` tables [#58178](https://github.com/ClickHouse/ClickHouse/pull/58178) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Add support for specifying query parameters in the command line in clickhouse-local [#58210](https://github.com/ClickHouse/ClickHouse/pull/58210) ([Pradeep Chhetri](https://github.com/chhetripradeep)). + +#### Build/Testing/Packaging Improvement +* Randomize more settings [#39663](https://github.com/ClickHouse/ClickHouse/pull/39663) ([Anton Popov](https://github.com/CurtizJ)). +* Randomize disabled optimizations in CI [#57315](https://github.com/ClickHouse/ClickHouse/pull/57315) ([Raúl Marín](https://github.com/Algunenano)). +* Allow usage of Azure-related table engines/functions on macOS. [#51866](https://github.com/ClickHouse/ClickHouse/pull/51866) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* ClickHouse Fast Test now uses Musl instead of GLibc. [#57711](https://github.com/ClickHouse/ClickHouse/pull/57711) ([Alexey Milovidov](https://github.com/alexey-milovidov)). The fully-static Musl build is available to download from the CI. +* Run ClickBench for every commit. This closes [#57708](https://github.com/ClickHouse/ClickHouse/issues/57708). [#57712](https://github.com/ClickHouse/ClickHouse/pull/57712) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove the usage of a harmful C/POSIX `select` function from external libraries. [#57467](https://github.com/ClickHouse/ClickHouse/pull/57467) ([Igor Nikonov](https://github.com/devcrafter)). +* Settings only available in ClickHouse Cloud will be also present in the open-source ClickHouse build for convenience. [#57638](https://github.com/ClickHouse/ClickHouse/pull/57638) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fixed a possibility of sorting order breakage in TTL GROUP BY [#49103](https://github.com/ClickHouse/ClickHouse/pull/49103) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix: split `lttb` bucket strategy, first bucket and last bucket should only contain single point [#57003](https://github.com/ClickHouse/ClickHouse/pull/57003) ([FFish](https://github.com/wxybear)). +* Fix possible deadlock in the `Template` format during sync after error [#57004](https://github.com/ClickHouse/ClickHouse/pull/57004) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix early stop while parsing a file with skipping lots of errors [#57006](https://github.com/ClickHouse/ClickHouse/pull/57006) ([Kruglov Pavel](https://github.com/Avogar)). +* Prevent dictionary's ACL bypass via the `dictionary` table function [#57362](https://github.com/ClickHouse/ClickHouse/pull/57362) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix another case of a "non-ready set" error found by Fuzzer. [#57423](https://github.com/ClickHouse/ClickHouse/pull/57423) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix several issues regarding PostgreSQL `array_ndims` usage. [#57436](https://github.com/ClickHouse/ClickHouse/pull/57436) ([Ryan Jacobs](https://github.com/ryanmjacobs)). +* Fix RWLock inconsistency after write lock timeout [#57454](https://github.com/ClickHouse/ClickHouse/pull/57454) ([Vitaly Baranov](https://github.com/vitlibar)). Fix RWLock inconsistency after write lock timeout (again) [#57733](https://github.com/ClickHouse/ClickHouse/pull/57733) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix: don't exclude ephemeral column when building pushing to view chain [#57461](https://github.com/ClickHouse/ClickHouse/pull/57461) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* MaterializedPostgreSQL (experimental issue): fix issue [#41922](https://github.com/ClickHouse/ClickHouse/issues/41922), add test for [#41923](https://github.com/ClickHouse/ClickHouse/issues/41923) [#57515](https://github.com/ClickHouse/ClickHouse/pull/57515) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Ignore ON CLUSTER clause in grant/revoke queries for management of replicated access entities. [#57538](https://github.com/ClickHouse/ClickHouse/pull/57538) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Fix crash in clickhouse-local [#57553](https://github.com/ClickHouse/ClickHouse/pull/57553) ([Nikolay Degterinsky](https://github.com/evillique)). +* A fix for Hash JOIN. [#57564](https://github.com/ClickHouse/ClickHouse/pull/57564) ([vdimir](https://github.com/vdimir)). +* Fix possible error in PostgreSQL source [#57567](https://github.com/ClickHouse/ClickHouse/pull/57567) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix type correction in Hash JOIN for nested LowCardinality. [#57614](https://github.com/ClickHouse/ClickHouse/pull/57614) ([vdimir](https://github.com/vdimir)). +* Avoid hangs of `system.stack_trace` by correctly prohibiting parallel reading from it. [#57641](https://github.com/ClickHouse/ClickHouse/pull/57641) ([Azat Khuzhin](https://github.com/azat)). +* Fix an error for aggregation of sparse columns with `any(...) RESPECT NULL` [#57710](https://github.com/ClickHouse/ClickHouse/pull/57710) ([Azat Khuzhin](https://github.com/azat)). +* Fix unary operators parsing [#57713](https://github.com/ClickHouse/ClickHouse/pull/57713) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix dependency loading for the experimental table engine `MaterializedPostgreSQL`. [#57754](https://github.com/ClickHouse/ClickHouse/pull/57754) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix retries for disconnected nodes for BACKUP/RESTORE ON CLUSTER [#57764](https://github.com/ClickHouse/ClickHouse/pull/57764) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix result of external aggregation in case of partially materialized projection [#57790](https://github.com/ClickHouse/ClickHouse/pull/57790) ([Anton Popov](https://github.com/CurtizJ)). +* Fix merge in aggregation functions with `*Map` combinator [#57795](https://github.com/ClickHouse/ClickHouse/pull/57795) ([Anton Popov](https://github.com/CurtizJ)). +* Disable `system.kafka_consumers` because it has a bug. [#57822](https://github.com/ClickHouse/ClickHouse/pull/57822) ([Azat Khuzhin](https://github.com/azat)). +* Fix LowCardinality keys support in Merge JOIN. [#57827](https://github.com/ClickHouse/ClickHouse/pull/57827) ([vdimir](https://github.com/vdimir)). +* A fix for `InterpreterCreateQuery` related to the sample block. [#57855](https://github.com/ClickHouse/ClickHouse/pull/57855) ([Maksim Kita](https://github.com/kitaisreal)). +* `addresses_expr` were ignored for named collections from PostgreSQL. [#57874](https://github.com/ClickHouse/ClickHouse/pull/57874) ([joelynch](https://github.com/joelynch)). +* Fix invalid memory access in BLAKE3 (Rust) [#57876](https://github.com/ClickHouse/ClickHouse/pull/57876) ([Raúl Marín](https://github.com/Algunenano)). Then it was rewritten from Rust to C++ for better [memory-safety](https://www.memorysafety.org/). [#57994](https://github.com/ClickHouse/ClickHouse/pull/57994) ([Raúl Marín](https://github.com/Algunenano)). +* Normalize function names in `CREATE INDEX` [#57906](https://github.com/ClickHouse/ClickHouse/pull/57906) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix handling of unavailable replicas before first request happened [#57933](https://github.com/ClickHouse/ClickHouse/pull/57933) ([Nikita Taranov](https://github.com/nickitat)). +* Fix literal alias misclassification [#57988](https://github.com/ClickHouse/ClickHouse/pull/57988) ([Chen768959](https://github.com/Chen768959)). +* Fix invalid preprocessing on Keeper [#58069](https://github.com/ClickHouse/ClickHouse/pull/58069) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix integer overflow in the `Poco` library, related to `UTF32Encoding` [#58073](https://github.com/ClickHouse/ClickHouse/pull/58073) ([Andrey Fedotov](https://github.com/anfedotoff)). +* Fix parallel replicas (experimental feature) in presence of a scalar subquery with a big integer value [#58118](https://github.com/ClickHouse/ClickHouse/pull/58118) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix `accurateCastOrNull` for out-of-range `DateTime` [#58139](https://github.com/ClickHouse/ClickHouse/pull/58139) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix possible `PARAMETER_OUT_OF_BOUND` error during subcolumns reading from a wide part in MergeTree [#58175](https://github.com/ClickHouse/ClickHouse/pull/58175) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a slow-down of CREATE VIEW with an enormous number of subqueries [#58220](https://github.com/ClickHouse/ClickHouse/pull/58220) ([Tao Wang](https://github.com/wangtZJU)). +* Fix parallel parsing for JSONCompactEachRow [#58181](https://github.com/ClickHouse/ClickHouse/pull/58181) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#58250](https://github.com/ClickHouse/ClickHouse/pull/58250) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release 23.11, 2023-12-06 {#2311} + +#### Backward Incompatible Change +* The default ClickHouse server configuration file has enabled `access_management` (user manipulation by SQL queries) and `named_collection_control` (manipulation of named collection by SQL queries) for the `default` user by default. This closes [#56482](https://github.com/ClickHouse/ClickHouse/issues/56482). [#56619](https://github.com/ClickHouse/ClickHouse/pull/56619) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Multiple improvements for `RESPECT NULLS`/`IGNORE NULLS` for window functions. If you use them as aggregate functions and store the states of aggregate functions with these modifiers, they might become incompatible. [#57189](https://github.com/ClickHouse/ClickHouse/pull/57189) ([Raúl Marín](https://github.com/Algunenano)). +* Remove optimization `optimize_move_functions_out_of_any`. [#57190](https://github.com/ClickHouse/ClickHouse/pull/57190) ([Raúl Marín](https://github.com/Algunenano)). +* Formatters `%l`/`%k`/`%c` in function `parseDateTime` are now able to parse hours/months without leading zeros, e.g. `select parseDateTime('2023-11-26 8:14', '%F %k:%i')` now works. Set `parsedatetime_parse_without_leading_zeros = 0` to restore the previous behavior which required two digits. Function `formatDateTime` is now also able to print hours/months without leading zeros. This is controlled by setting `formatdatetime_format_without_leading_zeros` but off by default to not break existing use cases. [#55872](https://github.com/ClickHouse/ClickHouse/pull/55872) ([Azat Khuzhin](https://github.com/azat)). +* You can no longer use the aggregate function `avgWeighted` with arguments of type `Decimal`. Workaround: convert arguments to `Float64`. This closes [#43928](https://github.com/ClickHouse/ClickHouse/issues/43928). This closes [#31768](https://github.com/ClickHouse/ClickHouse/issues/31768). This closes [#56435](https://github.com/ClickHouse/ClickHouse/issues/56435). If you have used this function inside materialized views or projections with `Decimal` arguments, contact support@clickhouse.com. Fixed error in aggregate function `sumMap` and made it slower around 1.5..2 times. It does not matter because the function is garbage anyway. This closes [#54955](https://github.com/ClickHouse/ClickHouse/issues/54955). This closes [#53134](https://github.com/ClickHouse/ClickHouse/issues/53134). This closes [#55148](https://github.com/ClickHouse/ClickHouse/issues/55148). Fix a bug in function `groupArraySample` - it used the same random seed in case more than one aggregate state is generated in a query. [#56350](https://github.com/ClickHouse/ClickHouse/pull/56350) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Added server setting `async_load_databases` for asynchronous loading of databases and tables. Speeds up the server start time. Applies to databases with `Ordinary`, `Atomic` and `Replicated` engines. Their tables load metadata asynchronously. Query to a table increases the priority of the load job and waits for it to be done. Added a new table `system.asynchronous_loader` for introspection. [#49351](https://github.com/ClickHouse/ClickHouse/pull/49351) ([Sergei Trifonov](https://github.com/serxa)). +* Add system table `blob_storage_log`. It allows auditing all the data written to S3 and other object storages. [#52918](https://github.com/ClickHouse/ClickHouse/pull/52918) ([vdimir](https://github.com/vdimir)). +* Use statistics to order prewhere conditions better. [#53240](https://github.com/ClickHouse/ClickHouse/pull/53240) ([Han Fei](https://github.com/hanfei1991)). +* Added support for compression in the Keeper's protocol. It can be enabled on the ClickHouse side by using this flag `use_compression` inside `zookeeper` section. Keep in mind that only ClickHouse Keeper supports compression, while Apache ZooKeeper does not. Resolves [#49507](https://github.com/ClickHouse/ClickHouse/issues/49507). [#54957](https://github.com/ClickHouse/ClickHouse/pull/54957) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Introduce the feature `storage_metadata_write_full_object_key`. If it is set as `true` then metadata files are written with the new format. With that format ClickHouse stores full remote object key in the metadata file which allows better flexibility and optimization. [#55566](https://github.com/ClickHouse/ClickHouse/pull/55566) ([Sema Checherinda](https://github.com/CheSema)). +* Add new settings and syntax to protect named collections' fields from being overridden. This is meant to prevent a malicious user from obtaining unauthorized access to secrets. [#55782](https://github.com/ClickHouse/ClickHouse/pull/55782) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Add `hostname` column to all system log tables - it is useful if you make the system tables replicated, shared, or distributed. [#55894](https://github.com/ClickHouse/ClickHouse/pull/55894) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `CHECK ALL TABLES` query. [#56022](https://github.com/ClickHouse/ClickHouse/pull/56022) ([vdimir](https://github.com/vdimir)). +* Added function `fromDaysSinceYearZero` which is similar to MySQL's `FROM_DAYS`. E.g. `SELECT fromDaysSinceYearZero(739136)` returns `2023-09-08`. [#56088](https://github.com/ClickHouse/ClickHouse/pull/56088) ([Joanna Hulboj](https://github.com/jh0x)). +* Add an external Python tool to view backups and to extract information from them without using ClickHouse. [#56268](https://github.com/ClickHouse/ClickHouse/pull/56268) ([Vitaly Baranov](https://github.com/vitlibar)). +* Implement a new setting called `preferred_optimize_projection_name`. If it is set to a non-empty string, the specified projection would be used if possible instead of choosing from all the candidates. [#56309](https://github.com/ClickHouse/ClickHouse/pull/56309) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add 4-letter command for yielding/resigning leadership (https://github.com/ClickHouse/ClickHouse/issues/56352). [#56354](https://github.com/ClickHouse/ClickHouse/pull/56354) ([Pradeep Chhetri](https://github.com/chhetripradeep)). [#56620](https://github.com/ClickHouse/ClickHouse/pull/56620) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Added a new SQL function, `arrayRandomSample(arr, k)` which returns a sample of k elements from the input array. Similar functionality could previously be achieved only with less convenient syntax, e.g. `SELECT arrayReduce('groupArraySample(3)', range(10))`. [#56416](https://github.com/ClickHouse/ClickHouse/pull/56416) ([Robert Schulze](https://github.com/rschu1ze)). +* Added support for `Float16` type data to use in `.npy` files. Closes [#56344](https://github.com/ClickHouse/ClickHouse/issues/56344). [#56424](https://github.com/ClickHouse/ClickHouse/pull/56424) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Added a system view `information_schema.statistics` for better compatibility with Tableau Online. [#56425](https://github.com/ClickHouse/ClickHouse/pull/56425) ([Serge Klochkov](https://github.com/slvrtrn)). +* Add `system.symbols` table useful for introspection of the binary. [#56548](https://github.com/ClickHouse/ClickHouse/pull/56548) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Configurable dashboards. Queries for charts are now loaded using a query, which by default uses a new `system.dashboards` table. [#56771](https://github.com/ClickHouse/ClickHouse/pull/56771) ([Sergei Trifonov](https://github.com/serxa)). +* Introduce `fileCluster` table function - it is useful if you mount a shared filesystem (NFS and similar) into the `user_files` directory. [#56868](https://github.com/ClickHouse/ClickHouse/pull/56868) ([Andrey Zvonov](https://github.com/zvonand)). +* Add `_size` virtual column with file size in bytes to `s3/file/hdfs/url/azureBlobStorage` engines. [#57126](https://github.com/ClickHouse/ClickHouse/pull/57126) ([Kruglov Pavel](https://github.com/Avogar)). +* Expose the number of errors for each error code occurred on a server since last restart from the Prometheus endpoint. [#57209](https://github.com/ClickHouse/ClickHouse/pull/57209) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* ClickHouse keeper reports its running availability zone at `/keeper/availability-zone` path. This can be configured via `us-west-1a`. [#56715](https://github.com/ClickHouse/ClickHouse/pull/56715) ([Jianfei Hu](https://github.com/incfly)). +* Make ALTER materialized_view MODIFY QUERY non experimental and deprecate `allow_experimental_alter_materialized_view_structure` setting. Fixes [#15206](https://github.com/ClickHouse/ClickHouse/issues/15206). [#57311](https://github.com/ClickHouse/ClickHouse/pull/57311) ([alesapin](https://github.com/alesapin)). +* Setting `join_algorithm` respects specified order [#51745](https://github.com/ClickHouse/ClickHouse/pull/51745) ([vdimir](https://github.com/vdimir)). +* Add support for the [well-known Protobuf types](https://protobuf.dev/reference/protobuf/google.protobuf/) in the Protobuf format. [#56741](https://github.com/ClickHouse/ClickHouse/pull/56741) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). + +#### Performance Improvement +* Adaptive timeouts for interacting with S3. The first attempt is made with low send and receive timeouts. [#56314](https://github.com/ClickHouse/ClickHouse/pull/56314) ([Sema Checherinda](https://github.com/CheSema)). +* Increase the default value of `max_concurrent_queries` from 100 to 1000. This makes sense when there is a large number of connecting clients, which are slowly sending or receiving data, so the server is not limited by CPU, or when the number of CPU cores is larger than 100. Also, enable the concurrency control by default, and set the desired number of query processing threads in total as twice the number of CPU cores. It improves performance in scenarios with a very large number of concurrent queries. [#46927](https://github.com/ClickHouse/ClickHouse/pull/46927) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support parallel evaluation of window functions. Fixes [#34688](https://github.com/ClickHouse/ClickHouse/issues/34688). [#39631](https://github.com/ClickHouse/ClickHouse/pull/39631) ([Dmitry Novik](https://github.com/novikd)). +* `Numbers` table engine (of the `system.numbers` table) now analyzes the condition to generate the needed subset of data, like table's index. [#50909](https://github.com/ClickHouse/ClickHouse/pull/50909) ([JackyWoo](https://github.com/JackyWoo)). +* Improved the performance of filtering by `IN (...)` condition for `Merge` table engine. [#54905](https://github.com/ClickHouse/ClickHouse/pull/54905) ([Nikita Taranov](https://github.com/nickitat)). +* An improvement which takes place when the filesystem cache is full and there are big reads. [#55158](https://github.com/ClickHouse/ClickHouse/pull/55158) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add ability to disable checksums for S3 to avoid excessive pass over the file (this is controlled by the setting `s3_disable_checksum`). [#55559](https://github.com/ClickHouse/ClickHouse/pull/55559) ([Azat Khuzhin](https://github.com/azat)). +* Now we read synchronously from remote tables when data is in page cache (like we do for local tables). It is faster, it doesn't require synchronisation inside the thread pool, and doesn't hesitate to do `seek`-s on local FS, and reduces CPU wait. [#55841](https://github.com/ClickHouse/ClickHouse/pull/55841) ([Nikita Taranov](https://github.com/nickitat)). +* Optimization for getting value from `map`, `arrayElement`. It will bring about 30% speedup. - reduce the reserved memory - reduce the `resize` call. [#55957](https://github.com/ClickHouse/ClickHouse/pull/55957) ([lgbo](https://github.com/lgbo-ustc)). +* Optimization of multi-stage filtering with AVX-512. The performance experiments of the OnTime dataset on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) show that this change could bring the improvements of 7.4%, 5.9%, 4.7%, 3.0%, and 4.6% to the QPS of the query Q2, Q3, Q4, Q5 and Q6 respectively while having no impact on others. [#56079](https://github.com/ClickHouse/ClickHouse/pull/56079) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Limit the number of threads busy inside the query profiler. If there are more - they will skip profiling. [#56105](https://github.com/ClickHouse/ClickHouse/pull/56105) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Decrease the amount of virtual function calls in window functions. [#56120](https://github.com/ClickHouse/ClickHouse/pull/56120) ([Maksim Kita](https://github.com/kitaisreal)). +* Allow recursive Tuple field pruning in ORC data format to speed up scaning. [#56122](https://github.com/ClickHouse/ClickHouse/pull/56122) ([李扬](https://github.com/taiyang-li)). +* Trivial count optimization for `Npy` data format: queries like `select count() from 'data.npy'` will work much more fast because of caching the results. [#56304](https://github.com/ClickHouse/ClickHouse/pull/56304) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Queries with aggregation and a large number of streams will use less amount of memory during the plan's construction. [#57074](https://github.com/ClickHouse/ClickHouse/pull/57074) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve performance of executing queries for use cases with many users and highly concurrent queries (>2000 QPS) by optimizing the access to ProcessList. [#57106](https://github.com/ClickHouse/ClickHouse/pull/57106) ([Andrej Hoos](https://github.com/adikus)). +* Trivial improvement on array join, reuse some intermediate results. [#57183](https://github.com/ClickHouse/ClickHouse/pull/57183) ([李扬](https://github.com/taiyang-li)). +* There are cases when stack unwinding was slow. Not anymore. [#57221](https://github.com/ClickHouse/ClickHouse/pull/57221) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Now we use default read pool for reading from external storage when `max_streams = 1`. It is beneficial when read prefetches are enabled. [#57334](https://github.com/ClickHouse/ClickHouse/pull/57334) ([Nikita Taranov](https://github.com/nickitat)). +* Keeper improvement: improve memory-usage during startup by delaying log preprocessing. [#55660](https://github.com/ClickHouse/ClickHouse/pull/55660) ([Antonio Andelic](https://github.com/antonio2368)). +* Improved performance of glob matching for `File` and `HDFS` storages. [#56141](https://github.com/ClickHouse/ClickHouse/pull/56141) ([Andrey Zvonov](https://github.com/zvonand)). +* Posting lists in experimental full text indexes are now compressed which reduces their size by 10-30%. [#56226](https://github.com/ClickHouse/ClickHouse/pull/56226) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Parallelise `BackupEntriesCollector` in backups. [#56312](https://github.com/ClickHouse/ClickHouse/pull/56312) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Improvement +* Add a new `MergeTree` setting `add_implicit_sign_column_constraint_for_collapsing_engine` (disabled by default). When enabled, it adds an implicit CHECK constraint for `CollapsingMergeTree` tables that restricts the value of the `Sign` column to be only -1 or 1. [#56701](https://github.com/ClickHouse/ClickHouse/issues/56701). [#56986](https://github.com/ClickHouse/ClickHouse/pull/56986) ([Kevin Mingtarja](https://github.com/kevinmingtarja)). +* Enable adding new disk to storage configuration without restart. [#56367](https://github.com/ClickHouse/ClickHouse/pull/56367) ([Duc Canh Le](https://github.com/canhld94)). +* Support creating and materializing index in the same alter query, also support "modify TTL" and "materialize TTL" in the same query. Closes [#55651](https://github.com/ClickHouse/ClickHouse/issues/55651). [#56331](https://github.com/ClickHouse/ClickHouse/pull/56331) ([flynn](https://github.com/ucasfl)). +* Add a new table function named `fuzzJSON` with rows containing perturbed versions of the source JSON string with random variations. [#56490](https://github.com/ClickHouse/ClickHouse/pull/56490) ([Julia Kartseva](https://github.com/jkartseva)). +* Engine `Merge` filters the records according to the row policies of the underlying tables, so you don't have to create another row policy on a `Merge` table. [#50209](https://github.com/ClickHouse/ClickHouse/pull/50209) ([Ilya Golshtein](https://github.com/ilejn)). +* Add a setting `max_execution_time_leaf` to limit the execution time on shard for distributed query, and `timeout_overflow_mode_leaf` to control the behaviour if timeout happens. [#51823](https://github.com/ClickHouse/ClickHouse/pull/51823) ([Duc Canh Le](https://github.com/canhld94)). +* Add ClickHouse setting to disable tunneling for HTTPS requests over HTTP proxy. [#55033](https://github.com/ClickHouse/ClickHouse/pull/55033) ([Arthur Passos](https://github.com/arthurpassos)). +* Set `background_fetches_pool_size` to 16, background_schedule_pool_size to 512 that is better for production usage with frequent small insertions. [#54327](https://github.com/ClickHouse/ClickHouse/pull/54327) ([Denny Crane](https://github.com/den-crane)). +* While read data from a csv format file, and at end of line is `\r` , which not followed by `\n`, then we will enconter the exception as follows `Cannot parse CSV format: found \r (CR) not followed by \n (LF). Line must end by \n (LF) or \r\n (CR LF) or \n\r.` In clickhouse, the csv end of line must be `\n` or `\r\n` or `\n\r`, so the `\r` must be followed by `\n`, but in some suitation, the csv input data is abnormal, like above, `\r` is at end of line. [#54340](https://github.com/ClickHouse/ClickHouse/pull/54340) ([KevinyhZou](https://github.com/KevinyhZou)). +* Update Arrow library to release-13.0.0 that supports new encodings. Closes [#44505](https://github.com/ClickHouse/ClickHouse/issues/44505). [#54800](https://github.com/ClickHouse/ClickHouse/pull/54800) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve performance of ON CLUSTER queries by removing heavy system calls to get all network interfaces when looking for local ip address in the DDL entry hosts list. [#54909](https://github.com/ClickHouse/ClickHouse/pull/54909) ([Duc Canh Le](https://github.com/canhld94)). +* Fixed accounting of memory allocated before attaching a thread to a query or a user. [#56089](https://github.com/ClickHouse/ClickHouse/pull/56089) ([Nikita Taranov](https://github.com/nickitat)). +* Add support for `LARGE_LIST` in Apache Arrow formats. [#56118](https://github.com/ClickHouse/ClickHouse/pull/56118) ([edef](https://github.com/edef1c)). +* Allow manual compaction of `EmbeddedRocksDB` via `OPTIMIZE` query. [#56225](https://github.com/ClickHouse/ClickHouse/pull/56225) ([Azat Khuzhin](https://github.com/azat)). +* Add ability to specify BlockBasedTableOptions for `EmbeddedRocksDB` tables. [#56264](https://github.com/ClickHouse/ClickHouse/pull/56264) ([Azat Khuzhin](https://github.com/azat)). +* `SHOW COLUMNS` now displays MySQL's equivalent data type name when the connection was made through the MySQL protocol. Previously, this was the case when setting `use_mysql_types_in_show_columns = 1`. The setting is retained but made obsolete. [#56277](https://github.com/ClickHouse/ClickHouse/pull/56277) ([Robert Schulze](https://github.com/rschu1ze)). +* Fixed possible `The local set of parts of table doesn't look like the set of parts in ZooKeeper` error if server was restarted just after `TRUNCATE` or `DROP PARTITION`. [#56282](https://github.com/ClickHouse/ClickHouse/pull/56282) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fixed handling of non-const query strings in functions `formatQuery`/ `formatQuerySingleLine`. Also added `OrNull` variants of both functions that return a NULL when a query cannot be parsed instead of throwing an exception. [#56327](https://github.com/ClickHouse/ClickHouse/pull/56327) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow backup of materialized view with dropped inner table instead of failing the backup. [#56387](https://github.com/ClickHouse/ClickHouse/pull/56387) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Queries to `system.replicas` initiate requests to ZooKeeper when certain columns are queried. When there are thousands of tables these requests might produce a considerable load on ZooKeeper. If there are multiple simultaneous queries to `system.replicas` they do same requests multiple times. The change is to "deduplicate" requests from concurrent queries. [#56420](https://github.com/ClickHouse/ClickHouse/pull/56420) ([Alexander Gololobov](https://github.com/davenger)). +* Fix translation to MySQL compatible query for querying external databases. [#56456](https://github.com/ClickHouse/ClickHouse/pull/56456) ([flynn](https://github.com/ucasfl)). +* Add support for backing up and restoring tables using `KeeperMap` engine. [#56460](https://github.com/ClickHouse/ClickHouse/pull/56460) ([Antonio Andelic](https://github.com/antonio2368)). +* 404 response for CompleteMultipartUpload has to be rechecked. Operation could be done on server even if client got timeout or other network errors. The next retry of CompleteMultipartUpload receives 404 response. If the object key exists that operation is considered as successful. [#56475](https://github.com/ClickHouse/ClickHouse/pull/56475) ([Sema Checherinda](https://github.com/CheSema)). +* Enable the HTTP OPTIONS method by default - it simplifies requesting ClickHouse from a web browser. [#56483](https://github.com/ClickHouse/ClickHouse/pull/56483) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The value for `dns_max_consecutive_failures` was changed by mistake in [#46550](https://github.com/ClickHouse/ClickHouse/issues/46550) - this is reverted and adjusted to a better value. Also, increased the HTTP keep-alive timeout to a reasonable value from production. [#56485](https://github.com/ClickHouse/ClickHouse/pull/56485) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Load base backups lazily (a base backup won't be loaded until it's needed). Also add some log message and profile events for backups. [#56516](https://github.com/ClickHouse/ClickHouse/pull/56516) ([Vitaly Baranov](https://github.com/vitlibar)). +* Setting `query_cache_store_results_of_queries_with_nondeterministic_functions` (with values `false` or `true`) was marked obsolete. It was replaced by setting `query_cache_nondeterministic_function_handling`, a three-valued enum that controls how the query cache handles queries with non-deterministic functions: a) throw an exception (default behavior), b) save the non-deterministic query result regardless, or c) ignore, i.e. don't throw an exception and don't cache the result. [#56519](https://github.com/ClickHouse/ClickHouse/pull/56519) ([Robert Schulze](https://github.com/rschu1ze)). +* Rewrite equality with `is null` check in JOIN ON section. Experimental *Analyzer only*. [#56538](https://github.com/ClickHouse/ClickHouse/pull/56538) ([vdimir](https://github.com/vdimir)). +* Function`concat` now supports arbitrary argument types (instead of only String and FixedString arguments). This makes it behave more similar to MySQL `concat` implementation. For example, `SELECT concat('ab', 42)` now returns `ab42`. [#56540](https://github.com/ClickHouse/ClickHouse/pull/56540) ([Serge Klochkov](https://github.com/slvrtrn)). +* Allow getting cache configuration from 'named_collection' section in config or from SQL created named collections. [#56541](https://github.com/ClickHouse/ClickHouse/pull/56541) ([Kseniia Sumarokova](https://github.com/kssenii)). +* PostgreSQL database engine: Make the removal of outdated tables less aggressive with unsuccessful postgres connection. [#56609](https://github.com/ClickHouse/ClickHouse/pull/56609) ([jsc0218](https://github.com/jsc0218)). +* It took too much time to connnect to PG when URL is not right, so the relevant query stucks there and get cancelled. [#56648](https://github.com/ClickHouse/ClickHouse/pull/56648) ([jsc0218](https://github.com/jsc0218)). +* Keeper improvement: disable compressed logs by default in Keeper. [#56763](https://github.com/ClickHouse/ClickHouse/pull/56763) ([Antonio Andelic](https://github.com/antonio2368)). +* Add config setting `wait_dictionaries_load_at_startup`. [#56782](https://github.com/ClickHouse/ClickHouse/pull/56782) ([Vitaly Baranov](https://github.com/vitlibar)). +* There was a potential vulnerability in previous ClickHouse versions: if a user has connected and unsuccessfully tried to authenticate with the "interserver secret" method, the server didn't terminate the connection immediately but continued to receive and ignore the leftover packets from the client. While these packets are ignored, they are still parsed, and if they use a compression method with another known vulnerability, it will lead to exploitation of it without authentication. This issue was found with [ClickHouse Bug Bounty Program](https://github.com/ClickHouse/ClickHouse/issues/38986) by https://twitter.com/malacupa. [#56794](https://github.com/ClickHouse/ClickHouse/pull/56794) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fetching a part waits when that part is fully committed on remote replica. It is better not send part in PreActive state. In case of zero copy this is mandatory restriction. [#56808](https://github.com/ClickHouse/ClickHouse/pull/56808) ([Sema Checherinda](https://github.com/CheSema)). +* Fix possible postgresql logical replication conversion error when using experimental `MaterializedPostgreSQL`. [#53721](https://github.com/ClickHouse/ClickHouse/pull/53721) ([takakawa](https://github.com/takakawa)). +* Implement user-level setting `alter_move_to_space_execute_async` which allow to execute queries `ALTER TABLE ... MOVE PARTITION|PART TO DISK|VOLUME` asynchronously. The size of pool for background executions is controlled by `background_move_pool_size`. Default behavior is synchronous execution. Fixes [#47643](https://github.com/ClickHouse/ClickHouse/issues/47643). [#56809](https://github.com/ClickHouse/ClickHouse/pull/56809) ([alesapin](https://github.com/alesapin)). +* Able to filter by engine when scanning system.tables, avoid unnecessary (potentially time-consuming) connection. [#56813](https://github.com/ClickHouse/ClickHouse/pull/56813) ([jsc0218](https://github.com/jsc0218)). +* Show `total_bytes` and `total_rows` in system tables for RocksDB storage. [#56816](https://github.com/ClickHouse/ClickHouse/pull/56816) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Allow basic commands in ALTER for TEMPORARY tables. [#56892](https://github.com/ClickHouse/ClickHouse/pull/56892) ([Sergey](https://github.com/icuken)). +* LZ4 compression. Buffer compressed block in a rare case when out buffer capacity is not enough for writing compressed block directly to out's buffer. [#56938](https://github.com/ClickHouse/ClickHouse/pull/56938) ([Sema Checherinda](https://github.com/CheSema)). +* Add metrics for the number of queued jobs, which is useful for the IO thread pool. [#56958](https://github.com/ClickHouse/ClickHouse/pull/56958) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a setting for PostgreSQL table engine setting in the config file. Added a check for the setting Added documentation around the additional setting. [#56959](https://github.com/ClickHouse/ClickHouse/pull/56959) ([Peignon Melvyn](https://github.com/melvynator)). +* Function `concat` can now be called with a single argument, e.g., `SELECT concat('abc')`. This makes its behavior more consistent with MySQL's concat implementation. [#57000](https://github.com/ClickHouse/ClickHouse/pull/57000) ([Serge Klochkov](https://github.com/slvrtrn)). +* Signs all `x-amz-*` headers as required by AWS S3 docs. [#57001](https://github.com/ClickHouse/ClickHouse/pull/57001) ([Arthur Passos](https://github.com/arthurpassos)). +* Function `fromDaysSinceYearZero` (alias: `FROM_DAYS`) can now be used with unsigned and signed integer types (previously, it had to be an unsigned integer). This improve compatibility with 3rd party tools such as Tableau Online. [#57002](https://github.com/ClickHouse/ClickHouse/pull/57002) ([Serge Klochkov](https://github.com/slvrtrn)). +* Add `system.s3queue_log` to default config. [#57036](https://github.com/ClickHouse/ClickHouse/pull/57036) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Change the default for `wait_dictionaries_load_at_startup` to true, and use this setting only if `dictionaries_lazy_load` is false. [#57133](https://github.com/ClickHouse/ClickHouse/pull/57133) ([Vitaly Baranov](https://github.com/vitlibar)). +* Check dictionary source type on creation even if `dictionaries_lazy_load` is enabled. [#57134](https://github.com/ClickHouse/ClickHouse/pull/57134) ([Vitaly Baranov](https://github.com/vitlibar)). +* Plan-level optimizations can now be enabled/disabled individually. Previously, it was only possible to disable them all. The setting which previously did that (`query_plan_enable_optimizations`) is retained and can still be used to disable all optimizations. [#57152](https://github.com/ClickHouse/ClickHouse/pull/57152) ([Robert Schulze](https://github.com/rschu1ze)). +* The server's exit code will correspond to the exception code. For example, if the server cannot start due to memory limit, it will exit with the code 241 = MEMORY_LIMIT_EXCEEDED. In previous versions, the exit code for exceptions was always 70 = Poco::Util::ExitCode::EXIT_SOFTWARE. [#57153](https://github.com/ClickHouse/ClickHouse/pull/57153) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Do not demangle and symbolize stack frames from `functional` C++ header. [#57201](https://github.com/ClickHouse/ClickHouse/pull/57201) ([Mike Kot](https://github.com/myrrc)). +* HTTP server page `/dashboard` now supports charts with multiple lines. [#57236](https://github.com/ClickHouse/ClickHouse/pull/57236) ([Sergei Trifonov](https://github.com/serxa)). +* The `max_memory_usage_in_client` command line option supports a string value with a suffix (K, M, G, etc). Closes [#56879](https://github.com/ClickHouse/ClickHouse/issues/56879). [#57273](https://github.com/ClickHouse/ClickHouse/pull/57273) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Bumped Intel QPL (used by codec `DEFLATE_QPL`) from v1.2.0 to v1.3.1 . Also fixed a bug in case of BOF (Block On Fault) = 0, changed to handle page faults by falling back to SW path. [#57291](https://github.com/ClickHouse/ClickHouse/pull/57291) ([jasperzhu](https://github.com/jinjunzh)). +* Increase default `replicated_deduplication_window` of MergeTree settings from 100 to 1k. [#57335](https://github.com/ClickHouse/ClickHouse/pull/57335) ([sichenzhao](https://github.com/sichenzhao)). +* Stop using `INCONSISTENT_METADATA_FOR_BACKUP` that much. If possible prefer to continue scanning instead of stopping and starting the scanning for backup from the beginning. [#57385](https://github.com/ClickHouse/ClickHouse/pull/57385) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Build/Testing/Packaging Improvement +* Add SQLLogic test. [#56078](https://github.com/ClickHouse/ClickHouse/pull/56078) ([Han Fei](https://github.com/hanfei1991)). +* Make `clickhouse-local` and `clickhouse-client` available under short names (`ch`, `chl`, `chc`) for usability. [#56634](https://github.com/ClickHouse/ClickHouse/pull/56634) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Optimized build size further by removing unused code from external libraries. [#56786](https://github.com/ClickHouse/ClickHouse/pull/56786) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add automatic check that there are no large translation units. [#56559](https://github.com/ClickHouse/ClickHouse/pull/56559) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Lower the size of the single-binary distribution. This closes [#55181](https://github.com/ClickHouse/ClickHouse/issues/55181). [#56617](https://github.com/ClickHouse/ClickHouse/pull/56617) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Information about the sizes of every translation unit and binary file after each build will be sent to the CI database in ClickHouse Cloud. This closes [#56107](https://github.com/ClickHouse/ClickHouse/issues/56107). [#56636](https://github.com/ClickHouse/ClickHouse/pull/56636) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Certain files of "Apache Arrow" library (which we use only for non-essential things like parsing the arrow format) were rebuilt all the time regardless of the build cache. This is fixed. [#56657](https://github.com/ClickHouse/ClickHouse/pull/56657) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Avoid recompiling translation units depending on the autogenerated source file about version. [#56660](https://github.com/ClickHouse/ClickHouse/pull/56660) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Tracing data of the linker invocations will be sent to the CI database in ClickHouse Cloud. [#56725](https://github.com/ClickHouse/ClickHouse/pull/56725) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use DWARF 5 debug symbols for the clickhouse binary (was DWARF 4 previously). [#56770](https://github.com/ClickHouse/ClickHouse/pull/56770) ([Michael Kolupaev](https://github.com/al13n321)). +* Add a new build option `SANITIZE_COVERAGE`. If it is enabled, the code is instrumented to track the coverage. The collected information is available inside ClickHouse with: (1) a new function `coverage` that returns an array of unique addresses in the code found after the previous coverage reset; (2) `SYSTEM RESET COVERAGE` query that resets the accumulated data. This allows us to compare the coverage of different tests, including differential code coverage. Continuation of [#20539](https://github.com/ClickHouse/ClickHouse/issues/20539). [#56102](https://github.com/ClickHouse/ClickHouse/pull/56102) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Some of the stack frames might not be resolved when collecting stacks. In such cases the raw address might be helpful. [#56267](https://github.com/ClickHouse/ClickHouse/pull/56267) ([Alexander Gololobov](https://github.com/davenger)). +* Add an option to disable `libssh`. [#56333](https://github.com/ClickHouse/ClickHouse/pull/56333) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable temporary_data_in_cache in S3 tests in CI. [#48425](https://github.com/ClickHouse/ClickHouse/pull/48425) ([vdimir](https://github.com/vdimir)). +* Set the max memory usage for clickhouse-client (`1G`) in the CI. [#56873](https://github.com/ClickHouse/ClickHouse/pull/56873) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix exerimental Analyzer - insertion from select with subquery referencing insertion table should process only insertion block. [#50857](https://github.com/ClickHouse/ClickHouse/pull/50857) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix a bug in `str_to_map` function. [#56423](https://github.com/ClickHouse/ClickHouse/pull/56423) ([Arthur Passos](https://github.com/arthurpassos)). +* Keeper `reconfig`: add timeout before yielding/taking leadership [#53481](https://github.com/ClickHouse/ClickHouse/pull/53481) ([Mike Kot](https://github.com/myrrc)). +* Fix incorrect header in grace hash join and filter pushdown [#53922](https://github.com/ClickHouse/ClickHouse/pull/53922) ([vdimir](https://github.com/vdimir)). +* Select from system tables when table based on table function. [#55540](https://github.com/ClickHouse/ClickHouse/pull/55540) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* RFC: Fix "Cannot find column X in source stream" for Distributed queries with LIMIT BY [#55836](https://github.com/ClickHouse/ClickHouse/pull/55836) ([Azat Khuzhin](https://github.com/azat)). +* Fix 'Cannot read from file:' while running client in a background [#55976](https://github.com/ClickHouse/ClickHouse/pull/55976) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix clickhouse-local exit on bad send_logs_level setting [#55994](https://github.com/ClickHouse/ClickHouse/pull/55994) ([Kruglov Pavel](https://github.com/Avogar)). +* Bug fix explain ast with parameterized view [#56004](https://github.com/ClickHouse/ClickHouse/pull/56004) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix a crash during table loading on startup [#56232](https://github.com/ClickHouse/ClickHouse/pull/56232) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix ClickHouse-sourced dictionaries with an explicit query [#56236](https://github.com/ClickHouse/ClickHouse/pull/56236) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix segfault in signal handler for Keeper [#56266](https://github.com/ClickHouse/ClickHouse/pull/56266) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix incomplete query result for UNION in view() function. [#56274](https://github.com/ClickHouse/ClickHouse/pull/56274) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix inconsistency of "cast('0' as DateTime64(3))" and "cast('0' as Nullable(DateTime64(3)))" [#56286](https://github.com/ClickHouse/ClickHouse/pull/56286) ([李扬](https://github.com/taiyang-li)). +* Fix rare race condition related to Memory allocation failure [#56303](https://github.com/ClickHouse/ClickHouse/pull/56303) ([alesapin](https://github.com/alesapin)). +* Fix restore from backup with `flatten_nested` and `data_type_default_nullable` [#56306](https://github.com/ClickHouse/ClickHouse/pull/56306) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix crash in case of adding a column with type Object(JSON) [#56307](https://github.com/ClickHouse/ClickHouse/pull/56307) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix crash in filterPushDown [#56380](https://github.com/ClickHouse/ClickHouse/pull/56380) ([vdimir](https://github.com/vdimir)). +* Fix restore from backup with mat view and dropped source table [#56383](https://github.com/ClickHouse/ClickHouse/pull/56383) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix segfault during Kerberos initialization [#56401](https://github.com/ClickHouse/ClickHouse/pull/56401) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix buffer overflow in T64 [#56434](https://github.com/ClickHouse/ClickHouse/pull/56434) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix nullable primary key in final (2) [#56452](https://github.com/ClickHouse/ClickHouse/pull/56452) ([Amos Bird](https://github.com/amosbird)). +* Fix ON CLUSTER queries without database on initial node [#56484](https://github.com/ClickHouse/ClickHouse/pull/56484) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix startup failure due to TTL dependency [#56489](https://github.com/ClickHouse/ClickHouse/pull/56489) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix ALTER COMMENT queries ON CLUSTER [#56491](https://github.com/ClickHouse/ClickHouse/pull/56491) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix ALTER COLUMN with ALIAS [#56493](https://github.com/ClickHouse/ClickHouse/pull/56493) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix empty NAMED COLLECTIONs [#56494](https://github.com/ClickHouse/ClickHouse/pull/56494) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix two cases of projection analysis. [#56502](https://github.com/ClickHouse/ClickHouse/pull/56502) ([Amos Bird](https://github.com/amosbird)). +* Fix handling of aliases in query cache [#56545](https://github.com/ClickHouse/ClickHouse/pull/56545) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix conversion from `Nullable(Enum)` to `Nullable(String)` [#56644](https://github.com/ClickHouse/ClickHouse/pull/56644) ([Nikolay Degterinsky](https://github.com/evillique)). +* More reliable log handling in Keeper [#56670](https://github.com/ClickHouse/ClickHouse/pull/56670) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix configuration merge for nodes with substitution attributes [#56694](https://github.com/ClickHouse/ClickHouse/pull/56694) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix duplicate usage of table function input(). [#56695](https://github.com/ClickHouse/ClickHouse/pull/56695) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix: RabbitMQ OpenSSL dynamic loading issue [#56703](https://github.com/ClickHouse/ClickHouse/pull/56703) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix crash in GCD codec in case when zeros present in data [#56704](https://github.com/ClickHouse/ClickHouse/pull/56704) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix 'mutex lock failed: Invalid argument' in clickhouse-local during insert into function [#56710](https://github.com/ClickHouse/ClickHouse/pull/56710) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix Date text parsing in optimistic path [#56765](https://github.com/ClickHouse/ClickHouse/pull/56765) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash in FPC codec [#56795](https://github.com/ClickHouse/ClickHouse/pull/56795) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* DatabaseReplicated: fix DDL query timeout after recovering a replica [#56796](https://github.com/ClickHouse/ClickHouse/pull/56796) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix incorrect nullable columns reporting in MySQL binary protocol [#56799](https://github.com/ClickHouse/ClickHouse/pull/56799) ([Serge Klochkov](https://github.com/slvrtrn)). +* Support Iceberg metadata files for metastore tables [#56810](https://github.com/ClickHouse/ClickHouse/pull/56810) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix TSAN report under transform [#56817](https://github.com/ClickHouse/ClickHouse/pull/56817) ([Raúl Marín](https://github.com/Algunenano)). +* Fix SET query and SETTINGS formatting [#56825](https://github.com/ClickHouse/ClickHouse/pull/56825) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix failure to start due to table dependency in joinGet [#56828](https://github.com/ClickHouse/ClickHouse/pull/56828) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix flattening existing Nested columns during ADD COLUMN [#56830](https://github.com/ClickHouse/ClickHouse/pull/56830) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix allow cr end of line for csv [#56901](https://github.com/ClickHouse/ClickHouse/pull/56901) ([KevinyhZou](https://github.com/KevinyhZou)). +* Fix `tryBase64Decode` with invalid input [#56913](https://github.com/ClickHouse/ClickHouse/pull/56913) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix generating deep nested columns in CapnProto/Protobuf schemas [#56941](https://github.com/ClickHouse/ClickHouse/pull/56941) ([Kruglov Pavel](https://github.com/Avogar)). +* Prevent incompatible ALTER of projection columns [#56948](https://github.com/ClickHouse/ClickHouse/pull/56948) ([Amos Bird](https://github.com/amosbird)). +* Fix sqlite file path validation [#56984](https://github.com/ClickHouse/ClickHouse/pull/56984) ([San](https://github.com/santrancisco)). +* S3Queue: fix metadata reference increment [#56990](https://github.com/ClickHouse/ClickHouse/pull/56990) ([Kseniia Sumarokova](https://github.com/kssenii)). +* S3Queue minor fix [#56999](https://github.com/ClickHouse/ClickHouse/pull/56999) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix file path validation for DatabaseFileSystem [#57029](https://github.com/ClickHouse/ClickHouse/pull/57029) ([San](https://github.com/santrancisco)). +* Fix `fuzzBits` with `ARRAY JOIN` [#57033](https://github.com/ClickHouse/ClickHouse/pull/57033) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix Nullptr dereference in partial merge join with joined_subquery_re… [#57048](https://github.com/ClickHouse/ClickHouse/pull/57048) ([vdimir](https://github.com/vdimir)). +* Fix race condition in RemoteSource [#57052](https://github.com/ClickHouse/ClickHouse/pull/57052) ([Raúl Marín](https://github.com/Algunenano)). +* Implement `bitHammingDistance` for big integers [#57073](https://github.com/ClickHouse/ClickHouse/pull/57073) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* S3-style links bug fix [#57075](https://github.com/ClickHouse/ClickHouse/pull/57075) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix JSON_QUERY function with multiple numeric paths [#57096](https://github.com/ClickHouse/ClickHouse/pull/57096) ([KevinyhZou](https://github.com/KevinyhZou)). +* Fix buffer overflow in Gorilla codec [#57107](https://github.com/ClickHouse/ClickHouse/pull/57107) ([Nikolay Degterinsky](https://github.com/evillique)). +* Close interserver connection on any exception before authentication [#57142](https://github.com/ClickHouse/ClickHouse/pull/57142) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix segfault after ALTER UPDATE with Nullable MATERIALIZED column [#57147](https://github.com/ClickHouse/ClickHouse/pull/57147) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix incorrect JOIN plan optimization with partially materialized normal projection [#57196](https://github.com/ClickHouse/ClickHouse/pull/57196) ([Amos Bird](https://github.com/amosbird)). +* Ignore comments when comparing column descriptions [#57259](https://github.com/ClickHouse/ClickHouse/pull/57259) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix `ReadonlyReplica` metric for all cases [#57267](https://github.com/ClickHouse/ClickHouse/pull/57267) ([Antonio Andelic](https://github.com/antonio2368)). +* Background merges correctly use temporary data storage in the cache [#57275](https://github.com/ClickHouse/ClickHouse/pull/57275) ([vdimir](https://github.com/vdimir)). +* Keeper fix for changelog and snapshots [#57299](https://github.com/ClickHouse/ClickHouse/pull/57299) ([Antonio Andelic](https://github.com/antonio2368)). +* Ignore finished ON CLUSTER tasks if hostname changed [#57339](https://github.com/ClickHouse/ClickHouse/pull/57339) ([Alexander Tokmakov](https://github.com/tavplubix)). +* MergeTree mutations reuse source part index granularity [#57352](https://github.com/ClickHouse/ClickHouse/pull/57352) ([Maksim Kita](https://github.com/kitaisreal)). +* FS cache: add a limit for background download [#57424](https://github.com/ClickHouse/ClickHouse/pull/57424) ([Kseniia Sumarokova](https://github.com/kssenii)). + + +### ClickHouse release 23.10, 2023-11-02 {#2310} + +#### Backward Incompatible Change +* There is no longer an option to automatically remove broken data parts. This closes [#55174](https://github.com/ClickHouse/ClickHouse/issues/55174). [#55184](https://github.com/ClickHouse/ClickHouse/pull/55184) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#55557](https://github.com/ClickHouse/ClickHouse/pull/55557) ([Jihyuk Bok](https://github.com/tomahawk28)). +* The obsolete in-memory data parts can no longer be read from the write-ahead log. If you have configured in-memory parts before, they have to be removed before the upgrade. [#55186](https://github.com/ClickHouse/ClickHouse/pull/55186) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove the integration with Meilisearch. Reason: it was compatible only with the old version 0.18. The recent version of Meilisearch changed the protocol and does not work anymore. Note: we would appreciate it if you help to return it back. [#55189](https://github.com/ClickHouse/ClickHouse/pull/55189) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Rename directory monitor concept into background INSERT. All the settings `*directory_monitor*` had been renamed to `distributed_background_insert*`. *Backward compatibility should be preserved* (since old settings had been added as an alias). [#55978](https://github.com/ClickHouse/ClickHouse/pull/55978) ([Azat Khuzhin](https://github.com/azat)). +* Do not interpret the `send_timeout` set on the client side as the `receive_timeout` on the server side and vise-versa. [#56035](https://github.com/ClickHouse/ClickHouse/pull/56035) ([Azat Khuzhin](https://github.com/azat)). +* Comparison of time intervals with different units will throw an exception. This closes [#55942](https://github.com/ClickHouse/ClickHouse/issues/55942). You might have occasionally rely on the previous behavior when the underlying numeric values were compared regardless of the units. [#56090](https://github.com/ClickHouse/ClickHouse/pull/56090) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Rewrited the experimental `S3Queue` table engine completely: changed the way we keep information in zookeeper which allows to make less zookeeper requests, added caching of zookeeper state in cases when we know the state will not change, improved the polling from s3 process to make it less aggressive, changed the way ttl and max set for trached files is maintained, now it is a background process. Added `system.s3queue` and `system.s3queue_log` tables. Closes [#54998](https://github.com/ClickHouse/ClickHouse/issues/54998). [#54422](https://github.com/ClickHouse/ClickHouse/pull/54422) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Arbitrary paths on HTTP endpoint are no longer interpreted as a request to the `/query` endpoint. [#55521](https://github.com/ClickHouse/ClickHouse/pull/55521) ([Konstantin Bogdanov](https://github.com/thevar1able)). + +#### New Feature +* Add function `arrayFold(accumulator, x1, ..., xn -> expression, initial, array1, ..., arrayn)` which applies a lambda function to multiple arrays of the same cardinality and collects the result in an accumulator. [#49794](https://github.com/ClickHouse/ClickHouse/pull/49794) ([Lirikl](https://github.com/Lirikl)). +* Support for `Npy` format. `SELECT * FROM file('example_array.npy', Npy)`. [#55982](https://github.com/ClickHouse/ClickHouse/pull/55982) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* If a table has a space-filling curve in its key, e.g., `ORDER BY mortonEncode(x, y)`, the conditions on its arguments, e.g., `x >= 10 AND x <= 20 AND y >= 20 AND y <= 30` can be used for indexing. A setting `analyze_index_with_space_filling_curves` is added to enable or disable this analysis. This closes [#41195](https://github.com/ClickHouse/ClickHouse/issue/41195). Continuation of [#4538](https://github.com/ClickHouse/ClickHouse/pull/4538). Continuation of [#6286](https://github.com/ClickHouse/ClickHouse/pull/6286). Continuation of [#28130](https://github.com/ClickHouse/ClickHouse/pull/28130). Continuation of [#41753](https://github.com/ClickHouse/ClickHouse/pull/#41753). [#55642](https://github.com/ClickHouse/ClickHouse/pull/55642) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* A new setting called `force_optimize_projection_name`, it takes a name of projection as an argument. If it's value set to a non-empty string, ClickHouse checks that this projection is used in the query at least once. Closes [#55331](https://github.com/ClickHouse/ClickHouse/issues/55331). [#56134](https://github.com/ClickHouse/ClickHouse/pull/56134) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Support asynchronous inserts with external data via native protocol. Previously it worked only if data is inlined into query. [#54730](https://github.com/ClickHouse/ClickHouse/pull/54730) ([Anton Popov](https://github.com/CurtizJ)). +* Added aggregation function `lttb` which uses the [Largest-Triangle-Three-Buckets](https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf) algorithm for downsampling data for visualization. [#53145](https://github.com/ClickHouse/ClickHouse/pull/53145) ([Sinan](https://github.com/sinsinan)). +* Query`CHECK TABLE` has better performance and usability (sends progress updates, cancellable). Support checking particular part with `CHECK TABLE ... PART 'part_name'`. [#53404](https://github.com/ClickHouse/ClickHouse/pull/53404) ([vdimir](https://github.com/vdimir)). +* Added function `jsonMergePatch`. When working with JSON data as strings, it provides a way to merge these strings (of JSON objects) together to form a single string containing a single JSON object. [#54364](https://github.com/ClickHouse/ClickHouse/pull/54364) ([Memo](https://github.com/Joeywzr)). +* The second part of Kusto Query Language dialect support. [Phase 1 implementation ](https://github.com/ClickHouse/ClickHouse/pull/37961) has been merged. [#42510](https://github.com/ClickHouse/ClickHouse/pull/42510) ([larryluogit](https://github.com/larryluogit)). +* Added a new SQL function, `arrayRandomSample(arr, k)` which returns a sample of k elements from the input array. Similar functionality could previously be achieved only with less convenient syntax, e.g. "SELECT arrayReduce('groupArraySample(3)', range(10))". [#54391](https://github.com/ClickHouse/ClickHouse/pull/54391) ([itayisraelov](https://github.com/itayisraelov)). +* Introduce `-ArgMin`/`-ArgMax` aggregate combinators which allow to aggregate by min/max values only. One use case can be found in [#54818](https://github.com/ClickHouse/ClickHouse/issues/54818). This PR also reorganize combinators into dedicated folder. [#54947](https://github.com/ClickHouse/ClickHouse/pull/54947) ([Amos Bird](https://github.com/amosbird)). +* Allow to drop cache for Protobuf format with `SYSTEM DROP SCHEMA FORMAT CACHE [FOR Protobuf]`. [#55064](https://github.com/ClickHouse/ClickHouse/pull/55064) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Add external HTTP Basic authenticator. [#55199](https://github.com/ClickHouse/ClickHouse/pull/55199) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Added function `byteSwap` which reverses the bytes of unsigned integers. This is particularly useful for reversing values of types which are represented as unsigned integers internally such as IPv4. [#55211](https://github.com/ClickHouse/ClickHouse/pull/55211) ([Priyansh Agrawal](https://github.com/Priyansh121096)). +* Added function `formatQuery` which returns a formatted version (possibly spanning multiple lines) of a SQL query string. Also added function `formatQuerySingleLine` which does the same but the returned string will not contain linebreaks. [#55239](https://github.com/ClickHouse/ClickHouse/pull/55239) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Added `DWARF` input format that reads debug symbols from an ELF executable/library/object file. [#55450](https://github.com/ClickHouse/ClickHouse/pull/55450) ([Michael Kolupaev](https://github.com/al13n321)). +* Allow to save unparsed records and errors in RabbitMQ, NATS and FileLog engines. Add virtual columns `_error` and `_raw_message`(for NATS and RabbitMQ), `_raw_record` (for FileLog) that are filled when ClickHouse fails to parse new record. The behaviour is controlled under storage settings `nats_handle_error_mode` for NATS, `rabbitmq_handle_error_mode` for RabbitMQ, `handle_error_mode` for FileLog similar to `kafka_handle_error_mode`. If it's set to `default`, en exception will be thrown when ClickHouse fails to parse a record, if it's set to `stream`, erorr and raw record will be saved into virtual columns. Closes [#36035](https://github.com/ClickHouse/ClickHouse/issues/36035). [#55477](https://github.com/ClickHouse/ClickHouse/pull/55477) ([Kruglov Pavel](https://github.com/Avogar)). +* Keeper client improvement: add `get_all_children_number command` that returns number of all children nodes under a specific path. [#55485](https://github.com/ClickHouse/ClickHouse/pull/55485) ([guoxiaolong](https://github.com/guoxiaolongzte)). +* Keeper client improvement: add `get_direct_children_number` command that returns number of direct children nodes under a path. [#55898](https://github.com/ClickHouse/ClickHouse/pull/55898) ([xuzifu666](https://github.com/xuzifu666)). +* Add statement `SHOW SETTING setting_name` which is a simpler version of existing statement `SHOW SETTINGS`. [#55979](https://github.com/ClickHouse/ClickHouse/pull/55979) ([Maksim Kita](https://github.com/kitaisreal)). +* Added fields `substreams` and `filenames` to the `system.parts_columns` table. [#55108](https://github.com/ClickHouse/ClickHouse/pull/55108) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for `SHOW MERGES` query. [#55815](https://github.com/ClickHouse/ClickHouse/pull/55815) ([megao](https://github.com/jetgm)). +* Introduce a setting `create_table_empty_primary_key_by_default` for default `ORDER BY ()`. [#55899](https://github.com/ClickHouse/ClickHouse/pull/55899) ([Srikanth Chekuri](https://github.com/srikanthccv)). + +#### Performance Improvement +* Add option `query_plan_preserve_num_streams_after_window_functions` to preserve the number of streams after evaluating window functions to allow parallel stream processing. [#50771](https://github.com/ClickHouse/ClickHouse/pull/50771) ([frinkr](https://github.com/frinkr)). +* Release more streams if data is small. [#53867](https://github.com/ClickHouse/ClickHouse/pull/53867) ([Jiebin Sun](https://github.com/jiebinn)). +* RoaringBitmaps being optimized before serialization. [#55044](https://github.com/ClickHouse/ClickHouse/pull/55044) ([UnamedRus](https://github.com/UnamedRus)). +* Posting lists in inverted indexes are now optimized to use the smallest possible representation for internal bitmaps. Depending on the repetitiveness of the data, this may significantly reduce the space consumption of inverted indexes. [#55069](https://github.com/ClickHouse/ClickHouse/pull/55069) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Fix contention on Context lock, this significantly improves performance for a lot of short-running concurrent queries. [#55121](https://github.com/ClickHouse/ClickHouse/pull/55121) ([Maksim Kita](https://github.com/kitaisreal)). +* Improved the performance of inverted index creation by 30%. This was achieved by replacing `std::unordered_map` with `absl::flat_hash_map`. [#55210](https://github.com/ClickHouse/ClickHouse/pull/55210) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Support ORC filter push down (rowgroup level). [#55330](https://github.com/ClickHouse/ClickHouse/pull/55330) ([李扬](https://github.com/taiyang-li)). +* Improve performance of external aggregation with a lot of temporary files. [#55489](https://github.com/ClickHouse/ClickHouse/pull/55489) ([Maksim Kita](https://github.com/kitaisreal)). +* Set a reasonable size for the marks cache for secondary indices by default to avoid loading the marks over and over again. [#55654](https://github.com/ClickHouse/ClickHouse/pull/55654) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Avoid unnecessary reconstruction of index granules when reading skip indexes. This addresses [#55653](https://github.com/ClickHouse/ClickHouse/issues/55653#issuecomment-1763766009). [#55683](https://github.com/ClickHouse/ClickHouse/pull/55683) ([Amos Bird](https://github.com/amosbird)). +* Cache CAST function in set during execution to improve the performance of function `IN` when set element type doesn't exactly match column type. [#55712](https://github.com/ClickHouse/ClickHouse/pull/55712) ([Duc Canh Le](https://github.com/canhld94)). +* Performance improvement for `ColumnVector::insertMany` and `ColumnVector::insertManyFrom`. [#55714](https://github.com/ClickHouse/ClickHouse/pull/55714) ([frinkr](https://github.com/frinkr)). +* Optimized Map subscript operations by predicting the next row's key position and reduce the comparisons. [#55929](https://github.com/ClickHouse/ClickHouse/pull/55929) ([lgbo](https://github.com/lgbo-ustc)). +* Support struct fields pruning in Parquet (in previous versions it didn't work in some cases). [#56117](https://github.com/ClickHouse/ClickHouse/pull/56117) ([lgbo](https://github.com/lgbo-ustc)). +* Add the ability to tune the number of parallel replicas used in a query execution based on the estimation of rows to read. [#51692](https://github.com/ClickHouse/ClickHouse/pull/51692) ([Raúl Marín](https://github.com/Algunenano)). +* Optimized external aggregation memory consumption in case many temporary files were generated. [#54798](https://github.com/ClickHouse/ClickHouse/pull/54798) ([Nikita Taranov](https://github.com/nickitat)). +* Distributed queries executed in `async_socket_for_remote` mode (default) now respect `max_threads` limit. Previously, some queries could create excessive threads (up to `max_distributed_connections`), causing server performance issues. [#53504](https://github.com/ClickHouse/ClickHouse/pull/53504) ([filimonov](https://github.com/filimonov)). +* Caching skip-able entries while executing DDL from Zookeeper distributed DDL queue. [#54828](https://github.com/ClickHouse/ClickHouse/pull/54828) ([Duc Canh Le](https://github.com/canhld94)). +* Experimental inverted indexes do not store tokens with too many matches (i.e. row ids in the posting list). This saves space and avoids ineffective index lookups when sequential scans would be equally fast or faster. The previous heuristics (`density` parameter passed to the index definition) that controlled when tokens would not be stored was too confusing for users. A much simpler heuristics based on parameter `max_rows_per_postings_list` (default: 64k) is introduced which directly controls the maximum allowed number of row ids in a postings list. [#55616](https://github.com/ClickHouse/ClickHouse/pull/55616) ([Harry Lee](https://github.com/HarryLeeIBM)). +* Improve write performance to `EmbeddedRocksDB` tables. [#55732](https://github.com/ClickHouse/ClickHouse/pull/55732) ([Duc Canh Le](https://github.com/canhld94)). +* Improved overall resilience for ClickHouse in case of many parts within partition (more than 1000). It might reduce the number of `TOO_MANY_PARTS` errors. [#55526](https://github.com/ClickHouse/ClickHouse/pull/55526) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Reduced memory consumption during loading of hierarchical dictionaries. [#55838](https://github.com/ClickHouse/ClickHouse/pull/55838) ([Nikita Taranov](https://github.com/nickitat)). +* All dictionaries support setting `dictionary_use_async_executor`. [#55839](https://github.com/ClickHouse/ClickHouse/pull/55839) ([vdimir](https://github.com/vdimir)). +* Prevent excesive memory usage when deserializing AggregateFunctionTopKGenericData. [#55947](https://github.com/ClickHouse/ClickHouse/pull/55947) ([Raúl Marín](https://github.com/Algunenano)). +* On a Keeper with lots of watches AsyncMetrics threads can consume 100% of CPU for noticable time in `DB::KeeperStorage::getSessionsWithWatchesCount`. The fix is to avoid traversing heavy `watches` and `list_watches` sets. [#56054](https://github.com/ClickHouse/ClickHouse/pull/56054) ([Alexander Gololobov](https://github.com/davenger)). +* Add setting `optimize_trivial_approximate_count_query` to use `count` approximation for storage EmbeddedRocksDB. Enable trivial count for StorageJoin. [#55806](https://github.com/ClickHouse/ClickHouse/pull/55806) ([Duc Canh Le](https://github.com/canhld94)). + +#### Improvement +* Functions `toDayOfWeek` (MySQL alias: `DAYOFWEEK`), `toYearWeek` (`YEARWEEK`) and `toWeek` (`WEEK`) now supports `String` arguments. This makes its behavior consistent with MySQL's behavior. [#55589](https://github.com/ClickHouse/ClickHouse/pull/55589) ([Robert Schulze](https://github.com/rschu1ze)). +* Introduced setting `date_time_overflow_behavior` with possible values `ignore`, `throw`, `saturate` that controls the overflow behavior when converting from Date, Date32, DateTime64, Integer or Float to Date, Date32, DateTime or DateTime64. [#55696](https://github.com/ClickHouse/ClickHouse/pull/55696) ([Andrey Zvonov](https://github.com/zvonand)). +* Implement query parameters support for `ALTER TABLE ... ACTION PARTITION [ID] {parameter_name:ParameterType}`. Merges [#49516](https://github.com/ClickHouse/ClickHouse/issues/49516). Closes [#49449](https://github.com/ClickHouse/ClickHouse/issues/49449). [#55604](https://github.com/ClickHouse/ClickHouse/pull/55604) ([alesapin](https://github.com/alesapin)). +* Print processor ids in a prettier manner in EXPLAIN. [#48852](https://github.com/ClickHouse/ClickHouse/pull/48852) ([Vlad Seliverstov](https://github.com/behebot)). +* Creating a direct dictionary with a lifetime field will be rejected at create time (as the lifetime does not make sense for direct dictionaries). Fixes: [#27861](https://github.com/ClickHouse/ClickHouse/issues/27861). [#49043](https://github.com/ClickHouse/ClickHouse/pull/49043) ([Rory Crispin](https://github.com/RoryCrispin)). +* Allow parameters in queries with partitions like `ALTER TABLE t DROP PARTITION`. Closes [#49449](https://github.com/ClickHouse/ClickHouse/issues/49449). [#49516](https://github.com/ClickHouse/ClickHouse/pull/49516) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add a new column `xid` for `system.zookeeper_connection`. [#50702](https://github.com/ClickHouse/ClickHouse/pull/50702) ([helifu](https://github.com/helifu)). +* Display the correct server settings in `system.server_settings` after configuration reload. [#53774](https://github.com/ClickHouse/ClickHouse/pull/53774) ([helifu](https://github.com/helifu)). +* Add support for mathematical minus `−` character in queries, similar to `-`. [#54100](https://github.com/ClickHouse/ClickHouse/pull/54100) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add replica groups to the experimental `Replicated` database engine. Closes [#53620](https://github.com/ClickHouse/ClickHouse/issues/53620). [#54421](https://github.com/ClickHouse/ClickHouse/pull/54421) ([Nikolay Degterinsky](https://github.com/evillique)). +* It is better to retry retriable s3 errors than totally fail the query. Set bigger value to the s3_retry_attempts by default. [#54770](https://github.com/ClickHouse/ClickHouse/pull/54770) ([Sema Checherinda](https://github.com/CheSema)). +* Add load balancing mode `hostname_levenshtein_distance`. [#54826](https://github.com/ClickHouse/ClickHouse/pull/54826) ([JackyWoo](https://github.com/JackyWoo)). +* Improve hiding secrets in logs. [#55089](https://github.com/ClickHouse/ClickHouse/pull/55089) ([Vitaly Baranov](https://github.com/vitlibar)). +* For now the projection analysis will be performed only on top of query plan. The setting `query_plan_optimize_projection` became obsolete (it was enabled by default long time ago). [#55112](https://github.com/ClickHouse/ClickHouse/pull/55112) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* When function `untuple` is now called on a tuple with named elements and itself has an alias (e.g. `select untuple(tuple(1)::Tuple(element_alias Int)) AS untuple_alias`), then the result column name is now generated from the untuple alias and the tuple element alias (in the example: "untuple_alias.element_alias"). [#55123](https://github.com/ClickHouse/ClickHouse/pull/55123) ([garcher22](https://github.com/garcher22)). +* Added setting `describe_include_virtual_columns`, which allows to include virtual columns of table into result of `DESCRIBE` query. Added setting `describe_compact_output`. If it is set to `true`, `DESCRIBE` query returns only names and types of columns without extra information. [#55129](https://github.com/ClickHouse/ClickHouse/pull/55129) ([Anton Popov](https://github.com/CurtizJ)). +* Sometimes `OPTIMIZE` with `optimize_throw_if_noop=1` may fail with an error `unknown reason` while the real cause of it - different projections in different parts. This behavior is fixed. [#55130](https://github.com/ClickHouse/ClickHouse/pull/55130) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow to have several `MaterializedPostgreSQL` tables following the same Postgres table. By default this behaviour is not enabled (for compatibility, because it is a backward-incompatible change), but can be turned on with setting `materialized_postgresql_use_unique_replication_consumer_identifier`. Closes [#54918](https://github.com/ClickHouse/ClickHouse/issues/54918). [#55145](https://github.com/ClickHouse/ClickHouse/pull/55145) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to parse negative `DateTime64` and `DateTime` with fractional part from short strings. [#55146](https://github.com/ClickHouse/ClickHouse/pull/55146) ([Andrey Zvonov](https://github.com/zvonand)). +* To improve compatibility with MySQL, 1. `information_schema.tables` now includes the new field `table_rows`, and 2. `information_schema.columns` now includes the new field `extra`. [#55215](https://github.com/ClickHouse/ClickHouse/pull/55215) ([Robert Schulze](https://github.com/rschu1ze)). +* Clickhouse-client won't show "0 rows in set" if it is zero and if exception was thrown. [#55240](https://github.com/ClickHouse/ClickHouse/pull/55240) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Support rename table without keyword `TABLE` like `RENAME db.t1 to db.t2`. [#55373](https://github.com/ClickHouse/ClickHouse/pull/55373) ([凌涛](https://github.com/lingtaolf)). +* Add `internal_replication` to `system.clusters`. [#55377](https://github.com/ClickHouse/ClickHouse/pull/55377) ([Konstantin Morozov](https://github.com/k-morozov)). +* Select remote proxy resolver based on request protocol, add proxy feature docs and remove `DB::ProxyConfiguration::Protocol::ANY`. [#55430](https://github.com/ClickHouse/ClickHouse/pull/55430) ([Arthur Passos](https://github.com/arthurpassos)). +* Avoid retrying keeper operations on INSERT after table shutdown. [#55519](https://github.com/ClickHouse/ClickHouse/pull/55519) ([Azat Khuzhin](https://github.com/azat)). +* `SHOW COLUMNS` now correctly reports type `FixedString` as `BLOB` if setting `use_mysql_types_in_show_columns` is on. Also added two new settings, `mysql_map_string_to_text_in_show_columns` and `mysql_map_fixed_string_to_text_in_show_columns` to switch the output for types `String` and `FixedString` as `TEXT` or `BLOB`. [#55617](https://github.com/ClickHouse/ClickHouse/pull/55617) ([Serge Klochkov](https://github.com/slvrtrn)). +* During ReplicatedMergeTree tables startup clickhouse server checks set of parts for unexpected parts (exists locally, but not in zookeeper). All unexpected parts move to detached directory and instead of them server tries to restore some ancestor (covered) parts. Now server tries to restore closest ancestors instead of random covered parts. [#55645](https://github.com/ClickHouse/ClickHouse/pull/55645) ([alesapin](https://github.com/alesapin)). +* The advanced dashboard now supports draggable charts on touch devices. This closes [#54206](https://github.com/ClickHouse/ClickHouse/issues/54206). [#55649](https://github.com/ClickHouse/ClickHouse/pull/55649) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Use the default query format if declared when outputting exception with `http_write_exception_in_output_format`. [#55739](https://github.com/ClickHouse/ClickHouse/pull/55739) ([Raúl Marín](https://github.com/Algunenano)). +* Provide a better message for common MATERIALIZED VIEW pitfalls. [#55826](https://github.com/ClickHouse/ClickHouse/pull/55826) ([Raúl Marín](https://github.com/Algunenano)). +* If you dropped the current database, you will still be able to run some queries in `clickhouse-local` and switch to another database. This makes the behavior consistent with `clickhouse-client`. This closes [#55834](https://github.com/ClickHouse/ClickHouse/issues/55834). [#55853](https://github.com/ClickHouse/ClickHouse/pull/55853) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Functions `(add|subtract)(Year|Quarter|Month|Week|Day|Hour|Minute|Second|Millisecond|Microsecond|Nanosecond)` now support string-encoded date arguments, e.g. `SELECT addDays('2023-10-22', 1)`. This increases compatibility with MySQL and is needed by Tableau Online. [#55869](https://github.com/ClickHouse/ClickHouse/pull/55869) ([Robert Schulze](https://github.com/rschu1ze)). +* The setting `apply_deleted_mask` when disabled allows to read rows that where marked as deleted by lightweight DELETE queries. This is useful for debugging. [#55952](https://github.com/ClickHouse/ClickHouse/pull/55952) ([Alexander Gololobov](https://github.com/davenger)). +* Allow skipping `null` values when serailizing Tuple to json objects, which makes it possible to keep compatiability with Spark's `to_json` function, which is also useful for gluten. [#55956](https://github.com/ClickHouse/ClickHouse/pull/55956) ([李扬](https://github.com/taiyang-li)). +* Functions `(add|sub)Date` now support string-encoded date arguments, e.g. `SELECT addDate('2023-10-22 11:12:13', INTERVAL 5 MINUTE)`. The same support for string-encoded date arguments is added to the plus and minus operators, e.g. `SELECT '2023-10-23' + INTERVAL 1 DAY`. This increases compatibility with MySQL and is needed by Tableau Online. [#55960](https://github.com/ClickHouse/ClickHouse/pull/55960) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow unquoted strings with CR (`\r`) in CSV format. Closes [#39930](https://github.com/ClickHouse/ClickHouse/issues/39930). [#56046](https://github.com/ClickHouse/ClickHouse/pull/56046) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to run `clickhouse-keeper` using embedded config. [#56086](https://github.com/ClickHouse/ClickHouse/pull/56086) ([Maksim Kita](https://github.com/kitaisreal)). +* Set limit of the maximum configuration value for `queued.min.messages` to avoid problem with start fetching data with Kafka. [#56121](https://github.com/ClickHouse/ClickHouse/pull/56121) ([Stas Morozov](https://github.com/r3b-fish)). +* Fixed a typo in SQL function `minSampleSizeContinous` (renamed `minSampleSizeContinuous`). Old name is preserved for backward compatibility. This closes: [#56139](https://github.com/ClickHouse/ClickHouse/issues/56139). [#56143](https://github.com/ClickHouse/ClickHouse/pull/56143) ([Dorota Szeremeta](https://github.com/orotaday)). +* Print path for broken parts on disk before shutting down the server. Before this change if a part is corrupted on disk and server cannot start, it was almost impossible to understand which part is broken. This is fixed. [#56181](https://github.com/ClickHouse/ClickHouse/pull/56181) ([Duc Canh Le](https://github.com/canhld94)). + +#### Build/Testing/Packaging Improvement +* If the database in Docker is already initialized, it doesn't need to be initialized again upon subsequent launches. This can potentially fix the issue of infinite container restarts when the database fails to load within 1000 attempts (relevant for very large databases and multi-node setups). [#50724](https://github.com/ClickHouse/ClickHouse/pull/50724) ([Alexander Nikolaev](https://github.com/AlexNik)). +* Resource with source code including submodules is built in Darwin special build task. It may be used to build ClickHouse without checking out the submodules. [#51435](https://github.com/ClickHouse/ClickHouse/pull/51435) ([Ilya Yatsishin](https://github.com/qoega)). +* An error was occuring when building ClickHouse with the AVX series of instructions enabled globally (which isn't recommended). The reason is that snappy does not enable `SNAPPY_HAVE_X86_CRC32`. [#55049](https://github.com/ClickHouse/ClickHouse/pull/55049) ([monchickey](https://github.com/monchickey)). +* Solve issue with launching standalone `clickhouse-keeper` from `clickhouse-server` package. [#55226](https://github.com/ClickHouse/ClickHouse/pull/55226) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* In the tests, RabbitMQ version is updated to 3.12.6. Improved logs collection for RabbitMQ tests. [#55424](https://github.com/ClickHouse/ClickHouse/pull/55424) ([Ilya Yatsishin](https://github.com/qoega)). +* Modified the error message difference between openssl and boringssl to fix the functional test. [#55975](https://github.com/ClickHouse/ClickHouse/pull/55975) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)). +* Use upstream repo for apache datasketches. [#55787](https://github.com/ClickHouse/ClickHouse/pull/55787) ([Nikita Taranov](https://github.com/nickitat)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Skip hardlinking inverted index files in mutation [#47663](https://github.com/ClickHouse/ClickHouse/pull/47663) ([cangyin](https://github.com/cangyin)). +* Fixed bug of `match` function (regex) with pattern containing alternation produces incorrect key condition. Closes #53222. [#54696](https://github.com/ClickHouse/ClickHouse/pull/54696) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix 'Cannot find column' in read-in-order optimization with ARRAY JOIN [#51746](https://github.com/ClickHouse/ClickHouse/pull/51746) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Support missed experimental `Object(Nullable(json))` subcolumns in query. [#54052](https://github.com/ClickHouse/ClickHouse/pull/54052) ([zps](https://github.com/VanDarkholme7)). +* Re-add fix for `accurateCastOrNull` [#54629](https://github.com/ClickHouse/ClickHouse/pull/54629) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix detecting `DEFAULT` for columns of a Distributed table created without AS [#55060](https://github.com/ClickHouse/ClickHouse/pull/55060) ([Vitaly Baranov](https://github.com/vitlibar)). +* Proper cleanup in case of exception in ctor of ShellCommandSource [#55103](https://github.com/ClickHouse/ClickHouse/pull/55103) ([Alexander Gololobov](https://github.com/davenger)). +* Fix deadlock in LDAP assigned role update [#55119](https://github.com/ClickHouse/ClickHouse/pull/55119) ([Julian Maicher](https://github.com/jmaicher)). +* Suppress error statistics update for internal exceptions [#55128](https://github.com/ClickHouse/ClickHouse/pull/55128) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix deadlock in backups [#55132](https://github.com/ClickHouse/ClickHouse/pull/55132) ([alesapin](https://github.com/alesapin)). +* Fix storage Iceberg files retrieval [#55144](https://github.com/ClickHouse/ClickHouse/pull/55144) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix partition pruning of extra columns in set. [#55172](https://github.com/ClickHouse/ClickHouse/pull/55172) ([Amos Bird](https://github.com/amosbird)). +* Fix recalculation of skip indexes in ALTER UPDATE queries when table has adaptive granularity [#55202](https://github.com/ClickHouse/ClickHouse/pull/55202) ([Duc Canh Le](https://github.com/canhld94)). +* Fix for background download in fs cache [#55252](https://github.com/ClickHouse/ClickHouse/pull/55252) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid possible memory leaks in compressors in case of missing buffer finalization [#55262](https://github.com/ClickHouse/ClickHouse/pull/55262) ([Azat Khuzhin](https://github.com/azat)). +* Fix functions execution over sparse columns [#55275](https://github.com/ClickHouse/ClickHouse/pull/55275) ([Azat Khuzhin](https://github.com/azat)). +* Fix incorrect merging of Nested for SELECT FINAL FROM SummingMergeTree [#55276](https://github.com/ClickHouse/ClickHouse/pull/55276) ([Azat Khuzhin](https://github.com/azat)). +* Fix bug with inability to drop detached partition in replicated merge tree on top of S3 without zero copy [#55309](https://github.com/ClickHouse/ClickHouse/pull/55309) ([alesapin](https://github.com/alesapin)). +* Fix a crash in MergeSortingPartialResultTransform (due to zero chunks after `remerge`) [#55335](https://github.com/ClickHouse/ClickHouse/pull/55335) ([Azat Khuzhin](https://github.com/azat)). +* Fix data-race in CreatingSetsTransform (on errors) due to throwing shared exception [#55338](https://github.com/ClickHouse/ClickHouse/pull/55338) ([Azat Khuzhin](https://github.com/azat)). +* Fix trash optimization (up to a certain extent) [#55353](https://github.com/ClickHouse/ClickHouse/pull/55353) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix leak in StorageHDFS [#55370](https://github.com/ClickHouse/ClickHouse/pull/55370) ([Azat Khuzhin](https://github.com/azat)). +* Fix parsing of arrays in cast operator [#55417](https://github.com/ClickHouse/ClickHouse/pull/55417) ([Anton Popov](https://github.com/CurtizJ)). +* Fix filtering by virtual columns with OR filter in query [#55418](https://github.com/ClickHouse/ClickHouse/pull/55418) ([Azat Khuzhin](https://github.com/azat)). +* Fix MongoDB connection issues [#55419](https://github.com/ClickHouse/ClickHouse/pull/55419) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix MySQL interface boolean representation [#55427](https://github.com/ClickHouse/ClickHouse/pull/55427) ([Serge Klochkov](https://github.com/slvrtrn)). +* Fix MySQL text protocol DateTime formatting and LowCardinality(Nullable(T)) types reporting [#55479](https://github.com/ClickHouse/ClickHouse/pull/55479) ([Serge Klochkov](https://github.com/slvrtrn)). +* Make `use_mysql_types_in_show_columns` affect only `SHOW COLUMNS` [#55481](https://github.com/ClickHouse/ClickHouse/pull/55481) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix stack symbolizer parsing `DW_FORM_ref_addr` incorrectly and sometimes crashing [#55483](https://github.com/ClickHouse/ClickHouse/pull/55483) ([Michael Kolupaev](https://github.com/al13n321)). +* Destroy fiber in case of exception in cancelBefore in AsyncTaskExecutor [#55516](https://github.com/ClickHouse/ClickHouse/pull/55516) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix Query Parameters not working with custom HTTP handlers [#55521](https://github.com/ClickHouse/ClickHouse/pull/55521) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix checking of non handled data for Values format [#55527](https://github.com/ClickHouse/ClickHouse/pull/55527) ([Azat Khuzhin](https://github.com/azat)). +* Fix 'Invalid cursor state' in odbc interacting with MS SQL Server [#55558](https://github.com/ClickHouse/ClickHouse/pull/55558) ([vdimir](https://github.com/vdimir)). +* Fix max execution time and 'break' overflow mode [#55577](https://github.com/ClickHouse/ClickHouse/pull/55577) ([Alexander Gololobov](https://github.com/davenger)). +* Fix crash in QueryNormalizer with cyclic aliases [#55602](https://github.com/ClickHouse/ClickHouse/pull/55602) ([vdimir](https://github.com/vdimir)). +* Disable wrong optimization and add a test [#55609](https://github.com/ClickHouse/ClickHouse/pull/55609) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Merging [#52352](https://github.com/ClickHouse/ClickHouse/issues/52352) [#55621](https://github.com/ClickHouse/ClickHouse/pull/55621) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add a test to avoid incorrect decimal sorting [#55662](https://github.com/ClickHouse/ClickHouse/pull/55662) ([Amos Bird](https://github.com/amosbird)). +* Fix progress bar for s3 and azure Cluster functions with url without globs [#55666](https://github.com/ClickHouse/ClickHouse/pull/55666) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix filtering by virtual columns with OR filter in query (resubmit) [#55678](https://github.com/ClickHouse/ClickHouse/pull/55678) ([Azat Khuzhin](https://github.com/azat)). +* Fixes and improvements for Iceberg storage [#55695](https://github.com/ClickHouse/ClickHouse/pull/55695) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix data race in CreatingSetsTransform (v2) [#55786](https://github.com/ClickHouse/ClickHouse/pull/55786) ([Azat Khuzhin](https://github.com/azat)). +* Throw exception when parsing illegal string as float if precise_float_parsing is true [#55861](https://github.com/ClickHouse/ClickHouse/pull/55861) ([李扬](https://github.com/taiyang-li)). +* Disable predicate pushdown if the CTE contains stateful functions [#55871](https://github.com/ClickHouse/ClickHouse/pull/55871) ([Raúl Marín](https://github.com/Algunenano)). +* Fix normalize ASTSelectWithUnionQuery, as it was stripping `FORMAT` from the query [#55887](https://github.com/ClickHouse/ClickHouse/pull/55887) ([flynn](https://github.com/ucasfl)). +* Try to fix possible segfault in Native ORC input format [#55891](https://github.com/ClickHouse/ClickHouse/pull/55891) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix window functions in case of sparse columns. [#55895](https://github.com/ClickHouse/ClickHouse/pull/55895) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* fix: StorageNull supports subcolumns [#55912](https://github.com/ClickHouse/ClickHouse/pull/55912) ([FFish](https://github.com/wxybear)). +* Do not write retriable errors for Replicated mutate/merge into error log [#55944](https://github.com/ClickHouse/ClickHouse/pull/55944) ([Azat Khuzhin](https://github.com/azat)). +* Fix `SHOW DATABASES LIMIT ` [#55962](https://github.com/ClickHouse/ClickHouse/pull/55962) ([Raúl Marín](https://github.com/Algunenano)). +* Fix autogenerated Protobuf schema with fields with underscore [#55974](https://github.com/ClickHouse/ClickHouse/pull/55974) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix dateTime64ToSnowflake64() with non-default scale [#55983](https://github.com/ClickHouse/ClickHouse/pull/55983) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix output/input of Arrow dictionary column [#55989](https://github.com/ClickHouse/ClickHouse/pull/55989) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix fetching schema from schema registry in AvroConfluent [#55991](https://github.com/ClickHouse/ClickHouse/pull/55991) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix 'Block structure mismatch' on concurrent ALTER and INSERTs in Buffer table [#55995](https://github.com/ClickHouse/ClickHouse/pull/55995) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix incorrect free space accounting for least_used JBOD policy [#56030](https://github.com/ClickHouse/ClickHouse/pull/56030) ([Azat Khuzhin](https://github.com/azat)). +* Fix missing scalar issue when evaluating subqueries inside table functions [#56057](https://github.com/ClickHouse/ClickHouse/pull/56057) ([Amos Bird](https://github.com/amosbird)). +* Fix wrong query result when http_write_exception_in_output_format=1 [#56135](https://github.com/ClickHouse/ClickHouse/pull/56135) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix schema cache for fallback JSON->JSONEachRow with changed settings [#56172](https://github.com/ClickHouse/ClickHouse/pull/56172) ([Kruglov Pavel](https://github.com/Avogar)). +* Add error handler to odbc-bridge [#56185](https://github.com/ClickHouse/ClickHouse/pull/56185) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). + + +### ClickHouse release 23.9, 2023-09-28 {#239} + +#### Backward Incompatible Change +* Remove the `status_info` configuration option and dictionaries status from the default Prometheus handler. [#54090](https://github.com/ClickHouse/ClickHouse/pull/54090) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The experimental parts metadata cache is removed from the codebase. [#54215](https://github.com/ClickHouse/ClickHouse/pull/54215) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable setting `input_format_json_try_infer_numbers_from_strings` by default, so we don't try to infer numbers from strings in JSON formats by default to avoid possible parsing errors when sample data contains strings that looks like a number. [#55099](https://github.com/ClickHouse/ClickHouse/pull/55099) ([Kruglov Pavel](https://github.com/Avogar)). + +#### New Feature +* Improve schema inference from JSON formats: 1) Now it's possible to infer named Tuples from JSON objects without experimantal JSON type under a setting `input_format_json_try_infer_named_tuples_from_objects` in JSON formats. Previously without experimantal type JSON we could only infer JSON objects as Strings or Maps, now we can infer named Tuple. Resulting Tuple type will conain all keys of objects that were read in data sample during schema inference. It can be useful for reading structured JSON data without sparse objects. The setting is enabled by default. 2) Allow parsing JSON array into a column with type String under setting `input_format_json_read_arrays_as_strings`. It can help reading arrays with values with different types. 3) Allow to use type String for JSON keys with unkown types (`null`/`[]`/`{}`) in sample data under setting `input_format_json_infer_incomplete_types_as_strings`. Now in JSON formats we can read any value into String column and we can avoid getting error `Cannot determine type for column 'column_name' by first 25000 rows of data, most likely this column contains only Nulls or empty Arrays/Maps` during schema inference by using type String for unknown types, so the data will be read successfully. [#54427](https://github.com/ClickHouse/ClickHouse/pull/54427) ([Kruglov Pavel](https://github.com/Avogar)). +* Added IO scheduling support for remote disks. Storage configuration for disk types `s3`, `s3_plain`, `hdfs` and `azure_blob_storage` can now contain `read_resource` and `write_resource` elements holding resource names. Scheduling policies for these resources can be configured in a separate server configuration section `resources`. Queries can be marked using setting `workload` and classified using server configuration section `workload_classifiers` to achieve diverse resource scheduling goals. More details in [the docs](https://clickhouse.com/docs/ja/operations/workload-scheduling). [#47009](https://github.com/ClickHouse/ClickHouse/pull/47009) ([Sergei Trifonov](https://github.com/serxa)). Added "bandwidth_limit" IO scheduling node type. It allows you to specify `max_speed` and `max_burst` constraints on traffic passing though this node. [#54618](https://github.com/ClickHouse/ClickHouse/pull/54618) ([Sergei Trifonov](https://github.com/serxa)). +* Added new type of authentication based on SSH keys. It works only for the native TCP protocol. [#41109](https://github.com/ClickHouse/ClickHouse/pull/41109) ([George Gamezardashvili](https://github.com/InfJoker)). +* Added a new column `_block_number` for MergeTree tables. [#44532](https://github.com/ClickHouse/ClickHouse/issues/44532). [#47532](https://github.com/ClickHouse/ClickHouse/pull/47532) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add `IF EMPTY` clause for `DROP TABLE` queries. [#48915](https://github.com/ClickHouse/ClickHouse/pull/48915) ([Pavel Novitskiy](https://github.com/pnovitskiy)). +* SQL functions `toString(datetime, timezone)` and `formatDateTime(datetime, format, timezone)` now support non-constant timezone arguments. [#53680](https://github.com/ClickHouse/ClickHouse/pull/53680) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add support for `ALTER TABLE MODIFY COMMENT`. Note: something similar was added by an external contributor a long time ago, but the feature did not work at all and only confused users. This closes [#36377](https://github.com/ClickHouse/ClickHouse/issues/36377). [#51304](https://github.com/ClickHouse/ClickHouse/pull/51304) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Note: this command does not propagate between replicas, so the replicas of a table could have different comments. +* Added `GCD` a.k.a. "greatest common denominator" as a new data compression codec. The codec computes the GCD of all column values, and then divides each value by the GCD. The GCD codec is a data preparation codec (similar to Delta and DoubleDelta) and cannot be used stand-alone. It works with data integer, decimal and date/time type. A viable use case for the GCD codec are column values that change (increase/decrease) in multiples of the GCD, e.g. 24 - 28 - 16 - 24 - 8 - 24 (assuming GCD = 4). [#53149](https://github.com/ClickHouse/ClickHouse/pull/53149) ([Alexander Nam](https://github.com/seshWCS)). +* Two new type aliases `DECIMAL(P)` (as shortcut for `DECIMAL(P, 0)` and `DECIMAL` (as shortcut for `DECIMAL(10, 0)`) were added. This makes ClickHouse more compatible with MySQL's SQL dialect. [#53328](https://github.com/ClickHouse/ClickHouse/pull/53328) ([Val Doroshchuk](https://github.com/valbok)). +* Added a new system log table `backup_log` to track all `BACKUP` and `RESTORE` operations. [#53638](https://github.com/ClickHouse/ClickHouse/pull/53638) ([Victor Krasnov](https://github.com/sirvickr)). +* Added a format setting `output_format_markdown_escape_special_characters` (default: false). The setting controls whether special characters like `!`, `#`, `$` etc. are escaped (i.e. prefixed by a backslash) in the `Markdown` output format. [#53860](https://github.com/ClickHouse/ClickHouse/pull/53860) ([irenjj](https://github.com/irenjj)). +* Add function `decodeHTMLComponent`. [#54097](https://github.com/ClickHouse/ClickHouse/pull/54097) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `peak_threads_usage` to query_log table. [#54335](https://github.com/ClickHouse/ClickHouse/pull/54335) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Add `SHOW FUNCTIONS` support to clickhouse-client. [#54337](https://github.com/ClickHouse/ClickHouse/pull/54337) ([Julia Kartseva](https://github.com/wat-ze-hex)). +* Added function `toDaysSinceYearZero` with alias `TO_DAYS` (for compatibility with MySQL) which returns the number of days passed since `0001-01-01` (in Proleptic Gregorian Calendar). [#54479](https://github.com/ClickHouse/ClickHouse/pull/54479) ([Robert Schulze](https://github.com/rschu1ze)). Function `toDaysSinceYearZero` now supports arguments of type `DateTime` and `DateTime64`. [#54856](https://github.com/ClickHouse/ClickHouse/pull/54856) ([Serge Klochkov](https://github.com/slvrtrn)). +* Added functions `YYYYMMDDtoDate`, `YYYYMMDDtoDate32`, `YYYYMMDDhhmmssToDateTime` and `YYYYMMDDhhmmssToDateTime64`. They convert a date or date with time encoded as integer (e.g. 20230911) into a native date or date with time. As such, they provide the opposite functionality of existing functions `YYYYMMDDToDate`, `YYYYMMDDToDateTime`, `YYYYMMDDhhmmddToDateTime`, `YYYYMMDDhhmmddToDateTime64`. [#54509](https://github.com/ClickHouse/ClickHouse/pull/54509) ([Quanfa Fu](https://github.com/dentiscalprum)) ([Robert Schulze](https://github.com/rschu1ze)). +* Add several string distance functions, including `byteHammingDistance`, `editDistance`. [#54935](https://github.com/ClickHouse/ClickHouse/pull/54935) ([flynn](https://github.com/ucasfl)). +* Allow specifying the expiration date and, optionally, the time for user credentials with `VALID UNTIL datetime` clause. [#51261](https://github.com/ClickHouse/ClickHouse/pull/51261) ([Nikolay Degterinsky](https://github.com/evillique)). +* Allow S3-style URLs for table functions `s3`, `gcs`, `oss`. URL is automatically converted to HTTP. Example: `'s3://clickhouse-public-datasets/hits.csv'` is converted to `'https://clickhouse-public-datasets.s3.amazonaws.com/hits.csv'`. [#54931](https://github.com/ClickHouse/ClickHouse/pull/54931) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add new setting `print_pretty_type_names` to print pretty deep nested types like Tuple/Maps/Arrays. [#55095](https://github.com/ClickHouse/ClickHouse/pull/55095) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Performance Improvement +* Speed up reading from S3 by enabling prefetches by default. [#53709](https://github.com/ClickHouse/ClickHouse/pull/53709) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Do not implicitly read PK and version columns in lonely parts if unnecessary for queries with FINAL. [#53919](https://github.com/ClickHouse/ClickHouse/pull/53919) ([Duc Canh Le](https://github.com/canhld94)). +* Optimize group by constant keys. Will optimize queries with group by `_file/_path` after https://github.com/ClickHouse/ClickHouse/pull/53529. [#53549](https://github.com/ClickHouse/ClickHouse/pull/53549) ([Kruglov Pavel](https://github.com/Avogar)). +* Improve performance of sorting for `Decimal` columns. Improve performance of insertion into `MergeTree` if ORDER BY contains a `Decimal` column. Improve performance of sorting when data is already sorted or almost sorted. [#35961](https://github.com/ClickHouse/ClickHouse/pull/35961) ([Maksim Kita](https://github.com/kitaisreal)). +* Improve performance for huge query analysis. Fixes [#51224](https://github.com/ClickHouse/ClickHouse/issues/51224). [#51469](https://github.com/ClickHouse/ClickHouse/pull/51469) ([frinkr](https://github.com/frinkr)). +* An optimization to rewrite `COUNT(DISTINCT ...)` and various `uniq` variants to `count` if it is selected from a subquery with GROUP BY. [#52082](https://github.com/ClickHouse/ClickHouse/pull/52082) [#52645](https://github.com/ClickHouse/ClickHouse/pull/52645) ([JackyWoo](https://github.com/JackyWoo)). +* Remove manual calls to `mmap/mremap/munmap` and delegate all this work to `jemalloc` - and it slightly improves performance. [#52792](https://github.com/ClickHouse/ClickHouse/pull/52792) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed high in CPU consumption when working with NATS. [#54399](https://github.com/ClickHouse/ClickHouse/pull/54399) ([Vasilev Pyotr](https://github.com/vahpetr)). +* Since we use separate instructions for executing `toString` with datetime argument, it is possible to improve performance a bit for non-datetime arguments and have some parts of the code cleaner. Follows up [#53680](https://github.com/ClickHouse/ClickHouse/issues/53680). [#54443](https://github.com/ClickHouse/ClickHouse/pull/54443) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Instead of serializing json elements into a `std::stringstream`, this PR try to put the serialization result into `ColumnString` direclty. [#54613](https://github.com/ClickHouse/ClickHouse/pull/54613) ([lgbo](https://github.com/lgbo-ustc)). +* Enable ORDER BY optimization for reading data in corresponding order from a MergeTree table in case that the table is behind a view. [#54628](https://github.com/ClickHouse/ClickHouse/pull/54628) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve JSON SQL functions by reusing `GeneratorJSONPath` and removing several shared pointers. [#54735](https://github.com/ClickHouse/ClickHouse/pull/54735) ([lgbo](https://github.com/lgbo-ustc)). +* Keeper tries to batch flush requests for better performance. [#53049](https://github.com/ClickHouse/ClickHouse/pull/53049) ([Antonio Andelic](https://github.com/antonio2368)). +* Now `clickhouse-client` processes files in parallel in case of `INFILE 'glob_expression'`. Closes [#54218](https://github.com/ClickHouse/ClickHouse/issues/54218). [#54533](https://github.com/ClickHouse/ClickHouse/pull/54533) ([Max K.](https://github.com/mkaynov)). +* Allow to use primary key for IN function where primary key column types are different from `IN` function right side column types. Example: `SELECT id FROM test_table WHERE id IN (SELECT '5')`. Closes [#48936](https://github.com/ClickHouse/ClickHouse/issues/48936). [#54544](https://github.com/ClickHouse/ClickHouse/pull/54544) ([Maksim Kita](https://github.com/kitaisreal)). +* Hash JOIN tries to shrink internal buffers consuming half of maximal available memory (set by `max_bytes_in_join`). [#54584](https://github.com/ClickHouse/ClickHouse/pull/54584) ([vdimir](https://github.com/vdimir)). +* Respect `max_block_size` for array join to avoid possible OOM. Close [#54290](https://github.com/ClickHouse/ClickHouse/issues/54290). [#54664](https://github.com/ClickHouse/ClickHouse/pull/54664) ([李扬](https://github.com/taiyang-li)). +* Reuse HTTP connections in the `s3` table function. [#54812](https://github.com/ClickHouse/ClickHouse/pull/54812) ([Michael Kolupaev](https://github.com/al13n321)). +* Replace the linear search in `MergeTreeRangeReader::Stream::ceilRowsToCompleteGranules` with a binary search. [#54869](https://github.com/ClickHouse/ClickHouse/pull/54869) ([usurai](https://github.com/usurai)). + +#### Experimental Feature +* The creation of `Annoy` indexes can now be parallelized using setting `max_threads_for_annoy_index_creation`. [#54047](https://github.com/ClickHouse/ClickHouse/pull/54047) ([Robert Schulze](https://github.com/rschu1ze)). +* Parallel replicas over distributed don't read from all replicas [#54199](https://github.com/ClickHouse/ClickHouse/pull/54199) ([Igor Nikonov](https://github.com/devcrafter)). + +#### Improvement +* Allow to replace long names of files of columns in `MergeTree` data parts to hashes of names. It helps to avoid `File name too long` error in some cases. [#50612](https://github.com/ClickHouse/ClickHouse/pull/50612) ([Anton Popov](https://github.com/CurtizJ)). +* Parse data in `JSON` format as `JSONEachRow` if failed to parse metadata. It will allow to read files with `.json` extension even if real format is JSONEachRow. Closes [#45740](https://github.com/ClickHouse/ClickHouse/issues/45740). [#54405](https://github.com/ClickHouse/ClickHouse/pull/54405) ([Kruglov Pavel](https://github.com/Avogar)). +* Output valid JSON/XML on excetpion during HTTP query execution. Add setting `http_write_exception_in_output_format` to enable/disable this behaviour (enabled by default). [#52853](https://github.com/ClickHouse/ClickHouse/pull/52853) ([Kruglov Pavel](https://github.com/Avogar)). +* View `information_schema.tables` now has a new field `data_length` which shows the approximate size of the data on disk. Required to run queries generated by Amazon QuickSight. [#55037](https://github.com/ClickHouse/ClickHouse/pull/55037) ([Robert Schulze](https://github.com/rschu1ze)). +* The MySQL interface gained a minimal implementation of prepared statements, just enough to allow a connection from Tableau Online to ClickHouse via the MySQL connector. [#54115](https://github.com/ClickHouse/ClickHouse/pull/54115) ([Serge Klochkov](https://github.com/slvrtrn)). Please note: the prepared statements implementation is pretty minimal, we do not support arguments binding yet, it is not required in this particular Tableau online use case. It will be implemented as a follow-up if necessary after extensive testing of Tableau Online in case we discover issues. +* Support case-insensitive and dot-all matching modes in `regexp_tree` dictionaries. [#50906](https://github.com/ClickHouse/ClickHouse/pull/50906) ([Johann Gan](https://github.com/johanngan)). +* Keeper improvement: Add a `createIfNotExists` Keeper command. [#48855](https://github.com/ClickHouse/ClickHouse/pull/48855) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* More precise integer type inference, fix [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003) ([Chen768959](https://github.com/Chen768959)). +* Introduced resolving of charsets in the string literals for MaterializedMySQL. [#53220](https://github.com/ClickHouse/ClickHouse/pull/53220) ([Val Doroshchuk](https://github.com/valbok)). +* Fix a subtle issue with a rarely used `EmbeddedRocksDB` table engine in an extremely rare scenario: sometimes the `EmbeddedRocksDB` table engine does not close files correctly in NFS after running `DROP TABLE`. [#53502](https://github.com/ClickHouse/ClickHouse/pull/53502) ([Mingliang Pan](https://github.com/liangliangpan)). +* `RESTORE TABLE ON CLUSTER` must create replicated tables with a matching UUID on hosts. Otherwise the macro `{uuid}` in ZooKeeper path can't work correctly after RESTORE. This PR implements that. [#53765](https://github.com/ClickHouse/ClickHouse/pull/53765) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added restore setting `restore_broken_parts_as_detached`: if it's true the RESTORE process won't stop on broken parts while restoring, instead all the broken parts will be copied to the `detached` folder with the prefix `broken-from-backup'. If it's false the RESTORE process will stop on the first broken part (if any). The default value is false. [#53877](https://github.com/ClickHouse/ClickHouse/pull/53877) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add `elapsed_ns` field to HTTP headers X-ClickHouse-Progress and X-ClickHouse-Summary. [#54179](https://github.com/ClickHouse/ClickHouse/pull/54179) ([joelynch](https://github.com/joelynch)). +* Implementation of `reconfig` (https://github.com/ClickHouse/ClickHouse/pull/49450), `sync`, and `exists` commands for keeper-client. [#54201](https://github.com/ClickHouse/ClickHouse/pull/54201) ([pufit](https://github.com/pufit)). +* `clickhouse-local` and `clickhouse-client` now allow to specify the `--query` parameter multiple times, e.g. `./clickhouse-client --query "SELECT 1" --query "SELECT 2"`. This syntax is slightly more intuitive than `./clickhouse-client --multiquery "SELECT 1;S ELECT 2"`, a bit easier to script (e.g. `queries.push_back('--query "$q"')`) and more consistent with the behavior of existing parameter `--queries-file` (e.g. `./clickhouse client --queries-file queries1.sql --queries-file queries2.sql`). [#54249](https://github.com/ClickHouse/ClickHouse/pull/54249) ([Robert Schulze](https://github.com/rschu1ze)). +* Add sub-second precision to `formatReadableTimeDelta`. [#54250](https://github.com/ClickHouse/ClickHouse/pull/54250) ([Andrey Zvonov](https://github.com/zvonand)). +* Enable `allow_remove_stale_moving_parts` by default. [#54260](https://github.com/ClickHouse/ClickHouse/pull/54260) ([vdimir](https://github.com/vdimir)). +* Fix using count from cache and improve progress bar for reading from archives. [#54271](https://github.com/ClickHouse/ClickHouse/pull/54271) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for S3 credentials using SSO. To define a profile to be used with SSO, set `AWS_PROFILE` environment variable. [#54347](https://github.com/ClickHouse/ClickHouse/pull/54347) ([Antonio Andelic](https://github.com/antonio2368)). +* Support NULL as default for nested types Array/Tuple/Map for input formats. Closes [#51100](https://github.com/ClickHouse/ClickHouse/issues/51100). [#54351](https://github.com/ClickHouse/ClickHouse/pull/54351) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow reading some unusual configuration of chunks from Arrow/Parquet formats. [#54370](https://github.com/ClickHouse/ClickHouse/pull/54370) ([Arthur Passos](https://github.com/arthurpassos)). +* Add `STD` alias to `stddevPop` function for MySQL compatibility. Closes [#54274](https://github.com/ClickHouse/ClickHouse/issues/54274). [#54382](https://github.com/ClickHouse/ClickHouse/pull/54382) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `addDate` function for compatibility with MySQL and `subDate` for consistency. Reference [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54400](https://github.com/ClickHouse/ClickHouse/pull/54400) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `modification_time` into `system.detached_parts`. [#54506](https://github.com/ClickHouse/ClickHouse/pull/54506) ([Azat Khuzhin](https://github.com/azat)). +* Added a setting `splitby_max_substrings_includes_remaining_string` which controls if functions "splitBy*()" with argument "max_substring" > 0 include the remaining string (if any) in the result array (Python/Spark semantics) or not. The default behavior does not change. [#54518](https://github.com/ClickHouse/ClickHouse/pull/54518) ([Robert Schulze](https://github.com/rschu1ze)). +* Better integer types inference for `Int64`/`UInt64` fields. Continuation of [#53003](https://github.com/ClickHouse/ClickHouse/pull/53003). Now it works also for nested types like Arrays of Arrays and for functions like `map/tuple`. Issue: [#51236](https://github.com/ClickHouse/ClickHouse/issues/51236). [#54553](https://github.com/ClickHouse/ClickHouse/pull/54553) ([Kruglov Pavel](https://github.com/Avogar)). +* Added array operations for multiplying, dividing and modulo on scalar. Works in each way, for example `5 * [5, 5]` and `[5, 5] * 5` - both cases are possible. [#54608](https://github.com/ClickHouse/ClickHouse/pull/54608) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add optional `version` argument to `rm` command in `keeper-client` to support safer deletes. [#54708](https://github.com/ClickHouse/ClickHouse/pull/54708) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Disable killing the server by systemd (that may lead to data loss when using Buffer tables). [#54744](https://github.com/ClickHouse/ClickHouse/pull/54744) ([Azat Khuzhin](https://github.com/azat)). +* Added field `is_deterministic` to system table `system.functions` which indicates whether the result of a function is stable between two invocations (given exactly the same inputs) or not. [#54766](https://github.com/ClickHouse/ClickHouse/pull/54766) [#55035](https://github.com/ClickHouse/ClickHouse/pull/55035) ([Robert Schulze](https://github.com/rschu1ze)). +* Made the views in schema `information_schema` more compatible with the equivalent views in MySQL (i.e. modified and extended them) up to a point where Tableau Online is able to connect to ClickHouse. More specifically: 1. The type of field `information_schema.tables.table_type` changed from Enum8 to String. 2. Added fields `table_comment` and `table_collation` to view `information_schema.table`. 3. Added views `information_schema.key_column_usage` and `referential_constraints`. 4. Replaced uppercase aliases in `information_schema` views with concrete uppercase columns. [#54773](https://github.com/ClickHouse/ClickHouse/pull/54773) ([Serge Klochkov](https://github.com/slvrtrn)). +* The query cache now returns an error if the user tries to cache the result of a query with a non-deterministic function such as `now`, `randomString` and `dictGet`. Compared to the previous behavior (silently don't cache the result), this reduces confusion and surprise for users. [#54801](https://github.com/ClickHouse/ClickHouse/pull/54801) ([Robert Schulze](https://github.com/rschu1ze)). +* Forbid special columns like materialized/ephemeral/alias for `file`/`s3`/`url`/... storages, fix insert into ephemeral columns from files. Closes [#53477](https://github.com/ClickHouse/ClickHouse/issues/53477). [#54803](https://github.com/ClickHouse/ClickHouse/pull/54803) ([Kruglov Pavel](https://github.com/Avogar)). +* More configurable collecting metadata for backup. [#54804](https://github.com/ClickHouse/ClickHouse/pull/54804) ([Vitaly Baranov](https://github.com/vitlibar)). +* `clickhouse-local`'s log file (if enabled with --server_logs_file flag) will now prefix each line with timestamp, thread id, etc, just like `clickhouse-server`. [#54807](https://github.com/ClickHouse/ClickHouse/pull/54807) ([Michael Kolupaev](https://github.com/al13n321)). +* Field `is_obsolete` in the `system.merge_tree_settings` table - it is now 1 for obsolete merge tree settings. Previously, only the description indicated that the setting is obsolete. [#54837](https://github.com/ClickHouse/ClickHouse/pull/54837) ([Robert Schulze](https://github.com/rschu1ze)). +* Make it possible to use plural when using interval literals. `INTERVAL 2 HOURS` should be equivalent to `INTERVAL 2 HOUR`. [#54860](https://github.com/ClickHouse/ClickHouse/pull/54860) ([Jordi Villar](https://github.com/jrdi)). +* Always allow the creation of a projection with `Nullable` PK. This fixes [#54814](https://github.com/ClickHouse/ClickHouse/issues/54814). [#54895](https://github.com/ClickHouse/ClickHouse/pull/54895) ([Amos Bird](https://github.com/amosbird)). +* Retry backup's S3 operations after connection reset failure. [#54900](https://github.com/ClickHouse/ClickHouse/pull/54900) ([Vitaly Baranov](https://github.com/vitlibar)). +* Make the exception message exact in case of the maximum value of a settings is less than the minimum value. [#54925](https://github.com/ClickHouse/ClickHouse/pull/54925) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* `LIKE`, `match`, and other regular expressions matching functions now allow matching with patterns containing non-UTF-8 substrings by falling back to binary matching. Example: you can use `string LIKE '\xFE\xFF%'` to detect BOM. This closes [#54486](https://github.com/ClickHouse/ClickHouse/issues/54486). [#54942](https://github.com/ClickHouse/ClickHouse/pull/54942) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added `ContextLockWaitMicroseconds` profile event. [#55029](https://github.com/ClickHouse/ClickHouse/pull/55029) ([Maksim Kita](https://github.com/kitaisreal)). +* The Keeper dynamically adjusts log levels. [#50372](https://github.com/ClickHouse/ClickHouse/pull/50372) ([helifu](https://github.com/helifu)). +* Added function `timestamp` for compatibility with MySQL. Closes [#54275](https://github.com/ClickHouse/ClickHouse/issues/54275). [#54639](https://github.com/ClickHouse/ClickHouse/pull/54639) ([Nikolay Degterinsky](https://github.com/evillique)). + +#### Build/Testing/Packaging Improvement +* Bumped the compiler of official and continuous integration builds of ClickHouse from Clang 16 to 17. [#53831](https://github.com/ClickHouse/ClickHouse/pull/53831) ([Robert Schulze](https://github.com/rschu1ze)). +* Regenerated tld data for lookups (`tldLookup.generated.cpp`). [#54269](https://github.com/ClickHouse/ClickHouse/pull/54269) ([Bharat Nallan](https://github.com/bharatnc)). +* Remove the redundant `clickhouse-keeper-client` symlink. [#54587](https://github.com/ClickHouse/ClickHouse/pull/54587) ([Tomas Barton](https://github.com/deric)). +* Use `/usr/bin/env` to resolve bash - now it supports Nix OS. [#54603](https://github.com/ClickHouse/ClickHouse/pull/54603) ([Fionera](https://github.com/fionera)). +* CMake added `PROFILE_CPU` option needed to perform `perf record` without using a DWARF call graph. [#54917](https://github.com/ClickHouse/ClickHouse/pull/54917) ([Maksim Kita](https://github.com/kitaisreal)). +* If the linker is different than LLD, stop with a fatal error. [#55036](https://github.com/ClickHouse/ClickHouse/pull/55036) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Replaced the library to handle (encode/decode) base64 values from Turbo-Base64 to aklomp-base64. Both are SIMD-accelerated on x86 and ARM but 1. the license of the latter (BSD-2) is more favorable for ClickHouse, Turbo64 switched in the meantime to GPL-3, 2. with more GitHub stars, aklomp-base64 seems more future-proof, 3. aklomp-base64 has a slightly nicer API (which is arguably subjective), and 4. aklomp-base64 does not require us to hack around bugs (like non-threadsafe initialization). Note: aklomp-base64 rejects unpadded base64 values whereas Turbo-Base64 decodes them on a best-effort basis. RFC-4648 leaves it open whether padding is mandatory or not, but depending on the context this may be a behavioral change to be aware of. [#54119](https://github.com/ClickHouse/ClickHouse/pull/54119) ([Mikhail Koviazin](https://github.com/mkmkme)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix REPLACE/MOVE PARTITION with zero-copy replication (note: "zero-copy replication" is an experimental feature) [#54193](https://github.com/ClickHouse/ClickHouse/pull/54193) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix zero copy locks with hardlinks (note: "zero-copy replication" is an experimental feature) [#54859](https://github.com/ClickHouse/ClickHouse/pull/54859) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix zero copy garbage (note: "zero-copy replication" is an experimental feature) [#54550](https://github.com/ClickHouse/ClickHouse/pull/54550) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Pass HTTP retry timeout as milliseconds (it was incorrect before). [#54438](https://github.com/ClickHouse/ClickHouse/pull/54438) ([Duc Canh Le](https://github.com/canhld94)). +* Fix misleading error message in OUTFILE with `CapnProto`/`Protobuf` [#52870](https://github.com/ClickHouse/ClickHouse/pull/52870) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix summary reporting with parallel replicas with LIMIT [#53050](https://github.com/ClickHouse/ClickHouse/pull/53050) ([Raúl Marín](https://github.com/Algunenano)). +* Fix throttling of BACKUPs from/to S3 (in case native copy was not used) and in some other places as well [#53336](https://github.com/ClickHouse/ClickHouse/pull/53336) ([Azat Khuzhin](https://github.com/azat)). +* Fix IO throttling during copying whole directories [#53338](https://github.com/ClickHouse/ClickHouse/pull/53338) ([Azat Khuzhin](https://github.com/azat)). +* Fix: moved to prewhere condition actions can lose column [#53492](https://github.com/ClickHouse/ClickHouse/pull/53492) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fixed internal error when replacing with byte-equal parts [#53735](https://github.com/ClickHouse/ClickHouse/pull/53735) ([Pedro Riera](https://github.com/priera)). +* Fix: require columns participating in interpolate expression [#53754](https://github.com/ClickHouse/ClickHouse/pull/53754) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix cluster discovery initialization + setting up fail points in config [#54113](https://github.com/ClickHouse/ClickHouse/pull/54113) ([vdimir](https://github.com/vdimir)). +* Fix issues in `accurateCastOrNull` [#54136](https://github.com/ClickHouse/ClickHouse/pull/54136) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix nullable primary key with the FINAL modifier [#54164](https://github.com/ClickHouse/ClickHouse/pull/54164) ([Amos Bird](https://github.com/amosbird)). +* Fixed error that prevented insertion in replicated materialized view of new data in presence of duplicated data. [#54184](https://github.com/ClickHouse/ClickHouse/pull/54184) ([Pedro Riera](https://github.com/priera)). +* Fix: allow `IPv6` for bloom filter [#54200](https://github.com/ClickHouse/ClickHouse/pull/54200) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* fix possible type mismatch with `IPv4` [#54212](https://github.com/ClickHouse/ClickHouse/pull/54212) ([Bharat Nallan](https://github.com/bharatnc)). +* Fix `system.data_skipping_indices` for recreated indices [#54225](https://github.com/ClickHouse/ClickHouse/pull/54225) ([Artur Malchanau](https://github.com/Hexta)). +* fix name clash for multiple join rewriter v2 [#54240](https://github.com/ClickHouse/ClickHouse/pull/54240) ([Tao Wang](https://github.com/wangtZJU)). +* Fix unexpected errors in `system.errors` after join [#54306](https://github.com/ClickHouse/ClickHouse/pull/54306) ([vdimir](https://github.com/vdimir)). +* Fix `isZeroOrNull(NULL)` [#54316](https://github.com/ClickHouse/ClickHouse/pull/54316) ([flynn](https://github.com/ucasfl)). +* Fix: parallel replicas over distributed with `prefer_localhost_replica` = 1 [#54334](https://github.com/ClickHouse/ClickHouse/pull/54334) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix logical error in vertical merge + replacing merge tree + optimize cleanup [#54368](https://github.com/ClickHouse/ClickHouse/pull/54368) ([alesapin](https://github.com/alesapin)). +* Fix possible error `URI contains invalid characters` in the `s3` table function [#54373](https://github.com/ClickHouse/ClickHouse/pull/54373) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix segfault in AST optimization of `arrayExists` function [#54379](https://github.com/ClickHouse/ClickHouse/pull/54379) ([Nikolay Degterinsky](https://github.com/evillique)). +* Check for overflow before addition in `analysisOfVariance` function [#54385](https://github.com/ClickHouse/ClickHouse/pull/54385) ([Antonio Andelic](https://github.com/antonio2368)). +* Reproduce and fix the bug in removeSharedRecursive [#54430](https://github.com/ClickHouse/ClickHouse/pull/54430) ([Sema Checherinda](https://github.com/CheSema)). +* Fix possible incorrect result with SimpleAggregateFunction in PREWHERE and FINAL [#54436](https://github.com/ClickHouse/ClickHouse/pull/54436) ([Azat Khuzhin](https://github.com/azat)). +* Fix filtering parts with indexHint for non analyzer [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)). +* Fix aggregate projections with normalized states [#54480](https://github.com/ClickHouse/ClickHouse/pull/54480) ([Amos Bird](https://github.com/amosbird)). +* `clickhouse-local`: something for multiquery parameter [#54498](https://github.com/ClickHouse/ClickHouse/pull/54498) ([CuiShuoGuo](https://github.com/bakam412)). +* `clickhouse-local` supports `--database` command line argument [#54503](https://github.com/ClickHouse/ClickHouse/pull/54503) ([vdimir](https://github.com/vdimir)). +* Fix possible parsing error in `-WithNames` formats with disabled `input_format_with_names_use_header` [#54513](https://github.com/ClickHouse/ClickHouse/pull/54513) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix rare case of CHECKSUM_DOESNT_MATCH error [#54549](https://github.com/ClickHouse/ClickHouse/pull/54549) ([alesapin](https://github.com/alesapin)). +* Fix sorting of UNION ALL of already sorted results [#54564](https://github.com/ClickHouse/ClickHouse/pull/54564) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix snapshot install in Keeper [#54572](https://github.com/ClickHouse/ClickHouse/pull/54572) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix race in `ColumnUnique` [#54575](https://github.com/ClickHouse/ClickHouse/pull/54575) ([Nikita Taranov](https://github.com/nickitat)). +* Annoy/Usearch index: Fix LOGICAL_ERROR during build-up with default values [#54600](https://github.com/ClickHouse/ClickHouse/pull/54600) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix serialization of `ColumnDecimal` [#54601](https://github.com/ClickHouse/ClickHouse/pull/54601) ([Nikita Taranov](https://github.com/nickitat)). +* Fix schema inference for *Cluster functions for column names with spaces [#54635](https://github.com/ClickHouse/ClickHouse/pull/54635) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix using structure from insertion tables in case of defaults and explicit insert columns [#54655](https://github.com/ClickHouse/ClickHouse/pull/54655) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix: avoid using regex match, possibly containing alternation, as a key condition. [#54696](https://github.com/ClickHouse/ClickHouse/pull/54696) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix ReplacingMergeTree with vertical merge and cleanup [#54706](https://github.com/ClickHouse/ClickHouse/pull/54706) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix virtual columns having incorrect values after ORDER BY [#54811](https://github.com/ClickHouse/ClickHouse/pull/54811) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix filtering parts with indexHint for non analyzer [#54825](https://github.com/ClickHouse/ClickHouse/pull/54825) [#54449](https://github.com/ClickHouse/ClickHouse/pull/54449) ([Azat Khuzhin](https://github.com/azat)). +* Fix Keeper segfault during shutdown [#54841](https://github.com/ClickHouse/ClickHouse/pull/54841) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix `Invalid number of rows in Chunk` in MaterializedPostgreSQL [#54844](https://github.com/ClickHouse/ClickHouse/pull/54844) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Move obsolete format settings to separate section [#54855](https://github.com/ClickHouse/ClickHouse/pull/54855) ([Kruglov Pavel](https://github.com/Avogar)). +* Rebuild `minmax_count_projection` when partition key gets modified [#54943](https://github.com/ClickHouse/ClickHouse/pull/54943) ([Amos Bird](https://github.com/amosbird)). +* Fix bad cast to `ColumnVector` in function `if` [#55019](https://github.com/ClickHouse/ClickHouse/pull/55019) ([Kruglov Pavel](https://github.com/Avogar)). +* Prevent attaching parts from tables with different projections or indices [#55062](https://github.com/ClickHouse/ClickHouse/pull/55062) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Store NULL in scalar result map for empty subquery result [#52240](https://github.com/ClickHouse/ClickHouse/pull/52240) ([vdimir](https://github.com/vdimir)). +* Fix `FINAL` produces invalid read ranges in a rare case [#54934](https://github.com/ClickHouse/ClickHouse/pull/54934) ([Nikita Taranov](https://github.com/nickitat)). +* Fix: insert quorum w/o keeper retries [#55026](https://github.com/ClickHouse/ClickHouse/pull/55026) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix simple state with nullable [#55030](https://github.com/ClickHouse/ClickHouse/pull/55030) ([Pedro Riera](https://github.com/priera)). + + +### ClickHouse release 23.8 LTS, 2023-08-31 {#238} + +#### Backward Incompatible Change +* If a dynamic disk contains a name, it should be specified as `disk = disk(name = 'disk_name'`, ...) in disk function arguments. In previous version it could be specified as `disk = disk_(...)`, which is no longer supported. [#52820](https://github.com/ClickHouse/ClickHouse/pull/52820) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `clickhouse-benchmark` will establish connections in parallel when invoked with `--concurrency` more than one. Previously it was unusable if you ran it with 1000 concurrent connections from Europe to the US. Correct calculation of QPS for connections with high latency. Backward incompatible change: the option for JSON output of `clickhouse-benchmark` is removed. If you've used this option, you can also extract data from the `system.query_log` in JSON format as a workaround. [#53293](https://github.com/ClickHouse/ClickHouse/pull/53293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `microseconds` column is removed from the `system.text_log`, and the `milliseconds` column is removed from the `system.metric_log`, because they are redundant in the presence of the `event_time_microseconds` column. [#53601](https://github.com/ClickHouse/ClickHouse/pull/53601) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Deprecate the metadata cache feature. It is experimental and we have never used it. The feature is dangerous: [#51182](https://github.com/ClickHouse/ClickHouse/issues/51182). Remove the `system.merge_tree_metadata_cache` system table. The metadata cache is still available in this version but will be removed soon. This closes [#39197](https://github.com/ClickHouse/ClickHouse/issues/39197). [#51303](https://github.com/ClickHouse/ClickHouse/pull/51303) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable support for 3DES in TLS connections. [#52893](https://github.com/ClickHouse/ClickHouse/pull/52893) ([Kenji Noguchi](https://github.com/knoguchi)). + +#### New Feature +* Direct import from zip/7z/tar archives. Example: `file('*.zip :: *.csv')`. [#50321](https://github.com/ClickHouse/ClickHouse/pull/50321) ([nikitakeba](https://github.com/nikitakeba)). +* Add column `ptr` to `system.trace_log` for `trace_type = 'MemorySample'`. This column contains an address of allocation. Added function `flameGraph` which can build flamegraph containing allocated and not released memory. Reworking of [#38391](https://github.com/ClickHouse/ClickHouse/issues/38391). [#45322](https://github.com/ClickHouse/ClickHouse/pull/45322) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Added table function `azureBlobStorageCluster`. The supported set of features is very similar to table function `s3Cluster`. [#50795](https://github.com/ClickHouse/ClickHouse/pull/50795) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Allow using `cluster`, `clusterAllReplicas`, `remote`, and `remoteSecure` without table name in issue [#50808](https://github.com/ClickHouse/ClickHouse/issues/50808). [#50848](https://github.com/ClickHouse/ClickHouse/pull/50848) ([Yangkuan Liu](https://github.com/LiuYangkuan)). +* A system table to monitor Kafka consumers. [#50999](https://github.com/ClickHouse/ClickHouse/pull/50999) ([Ilya Golshtein](https://github.com/ilejn)). +* Added `max_sessions_for_user` setting. [#51724](https://github.com/ClickHouse/ClickHouse/pull/51724) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* New functions `toUTCTimestamp/fromUTCTimestamp` to act same as spark's `to_utc_timestamp/from_utc_timestamp`. [#52117](https://github.com/ClickHouse/ClickHouse/pull/52117) ([KevinyhZou](https://github.com/KevinyhZou)). +* Add new functions `structureToCapnProtoSchema`/`structureToProtobufSchema` that convert ClickHouse table structure to CapnProto/Protobuf format schema. Allow to input/output data in CapnProto/Protobuf format without external format schema using autogenerated schema from table structure (controlled by settings `format_capn_proto_use_autogenerated_schema`/`format_protobuf_use_autogenerated_schema`). Allow to export autogenerated schema while input/output using setting `output_format_schema`. [#52278](https://github.com/ClickHouse/ClickHouse/pull/52278) ([Kruglov Pavel](https://github.com/Avogar)). +* A new field `query_cache_usage` in `system.query_log` now shows if and how the query cache was used. [#52384](https://github.com/ClickHouse/ClickHouse/pull/52384) ([Robert Schulze](https://github.com/rschu1ze)). +* Add new function `startsWithUTF8` and `endsWithUTF8`. [#52555](https://github.com/ClickHouse/ClickHouse/pull/52555) ([李扬](https://github.com/taiyang-li)). +* Allow variable number of columns in TSV/CustomSeparated/JSONCompactEachRow, make schema inference work with variable number of columns. Add settings `input_format_tsv_allow_variable_number_of_columns`, `input_format_custom_allow_variable_number_of_columns`, `input_format_json_compact_allow_variable_number_of_columns`. [#52692](https://github.com/ClickHouse/ClickHouse/pull/52692) ([Kruglov Pavel](https://github.com/Avogar)). +* Added `SYSTEM STOP/START PULLING REPLICATION LOG` queries (for testing `ReplicatedMergeTree`). [#52881](https://github.com/ClickHouse/ClickHouse/pull/52881) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Allow to execute constant non-deterministic functions in mutations on initiator. [#53129](https://github.com/ClickHouse/ClickHouse/pull/53129) ([Anton Popov](https://github.com/CurtizJ)). +* Add input format `One` that doesn't read any data and always returns single row with column `dummy` with type `UInt8` and value `0` like `system.one`. It can be used together with `_file/_path` virtual columns to list files in file/s3/url/hdfs/etc table functions without reading any data. [#53209](https://github.com/ClickHouse/ClickHouse/pull/53209) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `tupleConcat` function. Closes [#52759](https://github.com/ClickHouse/ClickHouse/issues/52759). [#53239](https://github.com/ClickHouse/ClickHouse/pull/53239) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support `TRUNCATE DATABASE` operation. [#53261](https://github.com/ClickHouse/ClickHouse/pull/53261) ([Bharat Nallan](https://github.com/bharatnc)). +* Add `max_threads_for_indexes` setting to limit number of threads used for primary key processing. [#53313](https://github.com/ClickHouse/ClickHouse/pull/53313) ([jorisgio](https://github.com/jorisgio)). +* Re-add SipHash keyed functions. [#53525](https://github.com/ClickHouse/ClickHouse/pull/53525) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* ([#52755](https://github.com/ClickHouse/ClickHouse/issues/52755) , [#52895](https://github.com/ClickHouse/ClickHouse/issues/52895)) Added functions `arrayRotateLeft`, `arrayRotateRight`, `arrayShiftLeft`, `arrayShiftRight`. [#53557](https://github.com/ClickHouse/ClickHouse/pull/53557) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Add column `name` to `system.clusters` as an alias to cluster. [#53605](https://github.com/ClickHouse/ClickHouse/pull/53605) ([irenjj](https://github.com/irenjj)). +* The advanced dashboard now allows mass editing (save/load). [#53608](https://github.com/ClickHouse/ClickHouse/pull/53608) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The advanced dashboard now has an option to maximize charts and move them around. [#53622](https://github.com/ClickHouse/ClickHouse/pull/53622) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added support for adding and subtracting arrays: `[5,2] + [1,7]`. Division and multiplication were not implemented due to confusion between pointwise multiplication and the scalar product of arguments. Closes [#49939](https://github.com/ClickHouse/ClickHouse/issues/49939). [#52625](https://github.com/ClickHouse/ClickHouse/pull/52625) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add support for string literals as table names. Closes [#52178](https://github.com/ClickHouse/ClickHouse/issues/52178). [#52635](https://github.com/ClickHouse/ClickHouse/pull/52635) ([hendrik-m](https://github.com/hendrik-m)). + +#### Experimental Feature +* Add new table engine `S3Queue` for streaming data import from s3. Closes [#37012](https://github.com/ClickHouse/ClickHouse/issues/37012). [#49086](https://github.com/ClickHouse/ClickHouse/pull/49086) ([s-kat](https://github.com/s-kat)). It is not ready to use. Do not use it. +* Enable parallel reading from replicas over distributed table. Related to [#49708](https://github.com/ClickHouse/ClickHouse/issues/49708). [#53005](https://github.com/ClickHouse/ClickHouse/pull/53005) ([Igor Nikonov](https://github.com/devcrafter)). +* Add experimental support for HNSW as approximate neighbor search method. [#53447](https://github.com/ClickHouse/ClickHouse/pull/53447) ([Davit Vardanyan](https://github.com/davvard)). This is currently intended for those who continue working on the implementation. Do not use it. + +#### Performance Improvement +* Parquet filter pushdown. I.e. when reading Parquet files, row groups (chunks of the file) are skipped based on the WHERE condition and the min/max values in each column. In particular, if the file is roughly sorted by some column, queries that filter by a short range of that column will be much faster. [#52951](https://github.com/ClickHouse/ClickHouse/pull/52951) ([Michael Kolupaev](https://github.com/al13n321)). +* Optimize reading small row groups by batching them together in Parquet. Closes [#53069](https://github.com/ClickHouse/ClickHouse/issues/53069). [#53281](https://github.com/ClickHouse/ClickHouse/pull/53281) ([Kruglov Pavel](https://github.com/Avogar)). +* Optimize count from files in most input formats. Closes [#44334](https://github.com/ClickHouse/ClickHouse/issues/44334). [#53637](https://github.com/ClickHouse/ClickHouse/pull/53637) ([Kruglov Pavel](https://github.com/Avogar)). +* Use filter by file/path before reading in `url`/`file`/`hdfs` table functions. [#53529](https://github.com/ClickHouse/ClickHouse/pull/53529) ([Kruglov Pavel](https://github.com/Avogar)). +* Enable JIT compilation for AArch64, PowerPC, SystemZ, RISC-V. [#38217](https://github.com/ClickHouse/ClickHouse/pull/38217) ([Maksim Kita](https://github.com/kitaisreal)). +* Add setting `rewrite_count_distinct_if_with_count_distinct_implementation` to rewrite `countDistinctIf` with `count_distinct_implementation`. Closes [#30642](https://github.com/ClickHouse/ClickHouse/issues/30642). [#46051](https://github.com/ClickHouse/ClickHouse/pull/46051) ([flynn](https://github.com/ucasfl)). +* Speed up merging of states of `uniq` and `uniqExact` aggregate functions by parallelizing conversion before merge. [#50748](https://github.com/ClickHouse/ClickHouse/pull/50748) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize aggregation performance of nullable string key when using a large number of variable length keys. [#51399](https://github.com/ClickHouse/ClickHouse/pull/51399) ([LiuNeng](https://github.com/liuneng1994)). +* Add a pass in Analyzer for time filter optimization with preimage. The performance experiments of SSB on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) show that this change could bring an improvement of 8.5% to the geomean QPS when the experimental analyzer is enabled. [#52091](https://github.com/ClickHouse/ClickHouse/pull/52091) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Optimize the merge if all hash sets are single-level in the `uniqExact` (COUNT DISTINCT) function. [#52973](https://github.com/ClickHouse/ClickHouse/pull/52973) ([Jiebin Sun](https://github.com/jiebinn)). +* `Join` table engine: do not clone hash join data structure with all columns. [#53046](https://github.com/ClickHouse/ClickHouse/pull/53046) ([Duc Canh Le](https://github.com/canhld94)). +* Implement native `ORC` input format without the "apache arrow" library to improve performance. [#53324](https://github.com/ClickHouse/ClickHouse/pull/53324) ([李扬](https://github.com/taiyang-li)). +* The dashboard will tell the server to compress the data, which is useful for large time frames over slow internet connections. For example, one chart with 86400 points can be 1.5 MB uncompressed and 60 KB compressed with `br`. [#53569](https://github.com/ClickHouse/ClickHouse/pull/53569) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better utilization of thread pool for BACKUPs and RESTOREs. [#53649](https://github.com/ClickHouse/ClickHouse/pull/53649) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Load filesystem cache metadata on startup in parallel. Configured by `load_metadata_threads` (default: 1) cache config setting. Related to [#52037](https://github.com/ClickHouse/ClickHouse/issues/52037). [#52943](https://github.com/ClickHouse/ClickHouse/pull/52943) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Improve `move_primary_key_columns_to_end_of_prewhere`. [#53337](https://github.com/ClickHouse/ClickHouse/pull/53337) ([Han Fei](https://github.com/hanfei1991)). +* This optimizes the interaction with ClickHouse Keeper. Previously the caller could register the same watch callback multiple times. In that case each entry was consuming memory and the same callback was called multiple times which didn't make much sense. In order to avoid this the caller could have some logic to not add the same watch multiple times. With this change this deduplication is done internally if the watch callback is passed via shared_ptr. [#53452](https://github.com/ClickHouse/ClickHouse/pull/53452) ([Alexander Gololobov](https://github.com/davenger)). +* Cache number of rows in files for count in file/s3/url/hdfs/azure functions. The cache can be enabled/disabled by setting `use_cache_for_count_from_files` (enabled by default). Continuation of https://github.com/ClickHouse/ClickHouse/pull/53637. [#53692](https://github.com/ClickHouse/ClickHouse/pull/53692) ([Kruglov Pavel](https://github.com/Avogar)). +* More careful thread management will improve the speed of the S3 table function over a large number of files by more than ~25%. [#53668](https://github.com/ClickHouse/ClickHouse/pull/53668) ([pufit](https://github.com/pufit)). + +#### Improvement +* Add `stderr_reaction` configuration/setting to control the reaction (none, log or throw) when external command stderr has data. This helps make debugging external command easier. [#43210](https://github.com/ClickHouse/ClickHouse/pull/43210) ([Amos Bird](https://github.com/amosbird)). +* Add `partition` column to the `system part_log` and merge table. [#48990](https://github.com/ClickHouse/ClickHouse/pull/48990) ([Jianfei Hu](https://github.com/incfly)). +* The sizes of the (index) uncompressed/mark, mmap and query caches can now be configured dynamically at runtime (without server restart). [#51446](https://github.com/ClickHouse/ClickHouse/pull/51446) ([Robert Schulze](https://github.com/rschu1ze)). +* If a dictionary is created with a complex key, automatically choose the "complex key" layout variant. [#49587](https://github.com/ClickHouse/ClickHouse/pull/49587) ([xiebin](https://github.com/xbthink)). +* Add setting `use_concurrency_control` for better testing of the new concurrency control feature. [#49618](https://github.com/ClickHouse/ClickHouse/pull/49618) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added suggestions for mistyped names for databases and tables. [#49801](https://github.com/ClickHouse/ClickHouse/pull/49801) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* While read small files from HDFS by Gluten, we found that it will cost more times when compare to directly query by Spark. And we did something with that. [#50063](https://github.com/ClickHouse/ClickHouse/pull/50063) ([KevinyhZou](https://github.com/KevinyhZou)). +* There were too many worthless error logs after session expiration, which we didn't like. [#50171](https://github.com/ClickHouse/ClickHouse/pull/50171) ([helifu](https://github.com/helifu)). +* Introduce fallback ZooKeeper sessions which are time-bound. Fixed `index` column in system.zookeeper_connection for DNS addresses. [#50424](https://github.com/ClickHouse/ClickHouse/pull/50424) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Add ability to log when max_partitions_per_insert_block is reached. [#50948](https://github.com/ClickHouse/ClickHouse/pull/50948) ([Sean Haynes](https://github.com/seandhaynes)). +* Added a bunch of custom commands to clickhouse-keeper-client (mostly to make ClickHouse debugging easier). [#51117](https://github.com/ClickHouse/ClickHouse/pull/51117) ([pufit](https://github.com/pufit)). +* Updated check for connection string in `azureBlobStorage` table function as connection string with "sas" does not always begin with the default endpoint and updated connection URL to include "sas" token after adding Azure's container to URL. [#51141](https://github.com/ClickHouse/ClickHouse/pull/51141) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix description for filtering sets in the `full_sorting_merge` JOIN algorithm. [#51329](https://github.com/ClickHouse/ClickHouse/pull/51329) ([Tanay Tummalapalli](https://github.com/ttanay)). +* Fixed memory consumption in `Aggregator` when `max_block_size` is huge. [#51566](https://github.com/ClickHouse/ClickHouse/pull/51566) ([Nikita Taranov](https://github.com/nickitat)). +* Add `SYSTEM SYNC FILESYSTEM CACHE` command. It will compare in-memory state of filesystem cache with what it has on disk and fix in-memory state if needed. This is only needed if you are making manual interventions in on-disk data, which is highly discouraged. [#51622](https://github.com/ClickHouse/ClickHouse/pull/51622) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Attempt to create a generic proxy resolver for CH while keeping backwards compatibility with existing S3 storage conf proxy resolver. [#51749](https://github.com/ClickHouse/ClickHouse/pull/51749) ([Arthur Passos](https://github.com/arthurpassos)). +* Support reading tuple subcolumns from file/s3/hdfs/url/azureBlobStorage table functions. [#51806](https://github.com/ClickHouse/ClickHouse/pull/51806) ([Kruglov Pavel](https://github.com/Avogar)). +* Function `arrayIntersect` now returns the values in the order, corresponding to the first argument. Closes [#27622](https://github.com/ClickHouse/ClickHouse/issues/27622). [#51850](https://github.com/ClickHouse/ClickHouse/pull/51850) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Add new queries, which allow to create/drop of access entities in specified access storage or move access entities from one access storage to another. [#51912](https://github.com/ClickHouse/ClickHouse/pull/51912) ([pufit](https://github.com/pufit)). +* Make `ALTER TABLE FREEZE` queries not replicated in the Replicated database engine. [#52064](https://github.com/ClickHouse/ClickHouse/pull/52064) ([Mike Kot](https://github.com/myrrc)). +* Added possibility to flush system tables on unexpected shutdown. [#52174](https://github.com/ClickHouse/ClickHouse/pull/52174) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix the case when `s3` table function refused to work with pre-signed URLs. close [#50846](https://github.com/ClickHouse/ClickHouse/issues/50846). [#52310](https://github.com/ClickHouse/ClickHouse/pull/52310) ([chen](https://github.com/xiedeyantu)). +* Add column `name` as an alias to `event` and `metric` in the `system.events` and `system.metrics` tables. Closes [#51257](https://github.com/ClickHouse/ClickHouse/issues/51257). [#52315](https://github.com/ClickHouse/ClickHouse/pull/52315) ([chen](https://github.com/xiedeyantu)). +* Added support of syntax `CREATE UNIQUE INDEX` in parser as a no-op for better SQL compatibility. `UNIQUE` index is not supported. Set `create_index_ignore_unique = 1` to ignore UNIQUE keyword in queries. [#52320](https://github.com/ClickHouse/ClickHouse/pull/52320) ([Ilya Yatsishin](https://github.com/qoega)). +* Add support of predefined macro (`{database}` and `{table}`) in some Kafka engine settings: topic, consumer, client_id, etc. [#52386](https://github.com/ClickHouse/ClickHouse/pull/52386) ([Yury Bogomolov](https://github.com/ybogo)). +* Disable updating the filesystem cache during backup/restore. Filesystem cache must not be updated during backup/restore, it seems it just slows down the process without any profit (because the BACKUP command can read a lot of data and it's no use to put all the data to the filesystem cache and immediately evict it). [#52402](https://github.com/ClickHouse/ClickHouse/pull/52402) ([Vitaly Baranov](https://github.com/vitlibar)). +* The configuration of S3 endpoint allow using it from the root, and append '/' automatically if needed. [#47809](https://github.com/ClickHouse/ClickHouse/issues/47809). [#52600](https://github.com/ClickHouse/ClickHouse/pull/52600) ([xiaolei565](https://github.com/xiaolei565)). +* For clickhouse-local allow positional options and populate global UDF settings (user_scripts_path and user_defined_executable_functions_config). [#52643](https://github.com/ClickHouse/ClickHouse/pull/52643) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* `system.asynchronous_metrics` now includes metrics "QueryCacheEntries" and "QueryCacheBytes" to inspect the query cache. [#52650](https://github.com/ClickHouse/ClickHouse/pull/52650) ([Robert Schulze](https://github.com/rschu1ze)). +* Added possibility to use `s3_storage_class` parameter in the `SETTINGS` clause of the `BACKUP` statement for backups to S3. [#52658](https://github.com/ClickHouse/ClickHouse/pull/52658) ([Roman Vasin](https://github.com/rvasin)). +* Add utility `print-backup-info.py` which parses a backup metadata file and prints information about the backup. [#52690](https://github.com/ClickHouse/ClickHouse/pull/52690) ([Vitaly Baranov](https://github.com/vitlibar)). +* Closes [#49510](https://github.com/ClickHouse/ClickHouse/issues/49510). Currently we have database and table names case-sensitive, but BI tools query `information_schema` sometimes in lowercase, sometimes in uppercase. For this reason we have `information_schema` database, containing lowercase tables, such as `information_schema.tables` and `INFORMATION_SCHEMA` database, containing uppercase tables, such as `INFORMATION_SCHEMA.TABLES`. But some tools are querying `INFORMATION_SCHEMA.tables` and `information_schema.TABLES`. The proposed solution is to duplicate both lowercase and uppercase tables in lowercase and uppercase `information_schema` database. [#52695](https://github.com/ClickHouse/ClickHouse/pull/52695) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Query`CHECK TABLE` has better performance and usability (sends progress updates, cancellable). [#52745](https://github.com/ClickHouse/ClickHouse/pull/52745) ([vdimir](https://github.com/vdimir)). +* Add support for `modulo`, `intDiv`, `intDivOrZero` for tuples by distributing them across tuple's elements. [#52758](https://github.com/ClickHouse/ClickHouse/pull/52758) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Search for default `yaml` and `yml` configs in clickhouse-client after `xml`. [#52767](https://github.com/ClickHouse/ClickHouse/pull/52767) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* When merging into non-'clickhouse' rooted configuration, configs with different root node name just bypassed without exception. [#52770](https://github.com/ClickHouse/ClickHouse/pull/52770) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Now it's possible to specify min (`memory_profiler_sample_min_allocation_size`) and max (`memory_profiler_sample_max_allocation_size`) size for allocations to be tracked with sampling memory profiler. [#52779](https://github.com/ClickHouse/ClickHouse/pull/52779) ([alesapin](https://github.com/alesapin)). +* Add `precise_float_parsing` setting to switch float parsing methods (fast/precise). [#52791](https://github.com/ClickHouse/ClickHouse/pull/52791) ([Andrey Zvonov](https://github.com/zvonand)). +* Use the same default paths for `clickhouse-keeper` (symlink) as for `clickhouse-keeper` (executable). [#52861](https://github.com/ClickHouse/ClickHouse/pull/52861) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve error message for table function `remote`. Closes [#40220](https://github.com/ClickHouse/ClickHouse/issues/40220). [#52959](https://github.com/ClickHouse/ClickHouse/pull/52959) ([jiyoungyoooo](https://github.com/jiyoungyoooo)). +* Added the possibility to specify custom storage policy in the `SETTINGS` clause of `RESTORE` queries. [#52970](https://github.com/ClickHouse/ClickHouse/pull/52970) ([Victor Krasnov](https://github.com/sirvickr)). +* Add the ability to throttle the S3 requests on backup operations (`BACKUP` and `RESTORE` commands now honor `s3_max_[get/put]_[rps/burst]`). [#52974](https://github.com/ClickHouse/ClickHouse/pull/52974) ([Daniel Pozo Escalona](https://github.com/danipozo)). +* Add settings to ignore ON CLUSTER clause in queries for management of replicated user-defined functions or access control entities with replicated storage. [#52975](https://github.com/ClickHouse/ClickHouse/pull/52975) ([Aleksei Filatov](https://github.com/aalexfvk)). +* EXPLAIN actions for JOIN step. [#53006](https://github.com/ClickHouse/ClickHouse/pull/53006) ([Maksim Kita](https://github.com/kitaisreal)). +* Make `hasTokenOrNull` and `hasTokenCaseInsensitiveOrNull` return null for empty needles. [#53059](https://github.com/ClickHouse/ClickHouse/pull/53059) ([ltrk2](https://github.com/ltrk2)). +* Allow to restrict allowed paths for filesystem caches. Mainly useful for dynamic disks. If in server config `filesystem_caches_path` is specified, all filesystem caches' paths will be restricted to this directory. E.g. if the `path` in cache config is relative - it will be put in `filesystem_caches_path`; if `path` in cache config is absolute, it will be required to lie inside `filesystem_caches_path`. If `filesystem_caches_path` is not specified in config, then behaviour will be the same as in earlier versions. [#53124](https://github.com/ClickHouse/ClickHouse/pull/53124) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added a bunch of custom commands (mostly to make ClickHouse debugging easier). [#53127](https://github.com/ClickHouse/ClickHouse/pull/53127) ([pufit](https://github.com/pufit)). +* Add diagnostic info about file name during schema inference - it helps when you process multiple files with globs. [#53135](https://github.com/ClickHouse/ClickHouse/pull/53135) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Client will load suggestions using the main connection if the second connection is not allowed to create a session. [#53177](https://github.com/ClickHouse/ClickHouse/pull/53177) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Add EXCEPT clause to `SYSTEM STOP/START LISTEN QUERIES [ALL/DEFAULT/CUSTOM]` query, for example `SYSTEM STOP LISTEN QUERIES ALL EXCEPT TCP, HTTP`. [#53280](https://github.com/ClickHouse/ClickHouse/pull/53280) ([Nikolay Degterinsky](https://github.com/evillique)). +* Change the default of `max_concurrent_queries` from 100 to 1000. It's ok to have many concurrent queries if they are not heavy, and mostly waiting for the network. Note: don't confuse concurrent queries and QPS: for example, ClickHouse server can do tens of thousands of QPS with less than 100 concurrent queries. [#53285](https://github.com/ClickHouse/ClickHouse/pull/53285) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Limit number of concurrent background partition optimize merges. [#53405](https://github.com/ClickHouse/ClickHouse/pull/53405) ([Duc Canh Le](https://github.com/canhld94)). +* Added a setting `allow_moving_table_directory_to_trash` that allows to ignore `Directory for table data already exists` error when replicating/recovering a `Replicated` database. [#53425](https://github.com/ClickHouse/ClickHouse/pull/53425) ([Alexander Tokmakov](https://github.com/tavplubix)). +* If server settings `asynchronous_metrics_update_period_s` and `asynchronous_heavy_metrics_update_period_s` are misconfigured to 0, it will now fail gracefully instead of terminating the application. [#53428](https://github.com/ClickHouse/ClickHouse/pull/53428) ([Robert Schulze](https://github.com/rschu1ze)). +* The ClickHouse server now respects memory limits changed via cgroups when reloading its configuration. [#53455](https://github.com/ClickHouse/ClickHouse/pull/53455) ([Robert Schulze](https://github.com/rschu1ze)). +* Add ability to turn off flush of Distributed tables on `DETACH`, `DROP`, or server shutdown. [#53501](https://github.com/ClickHouse/ClickHouse/pull/53501) ([Azat Khuzhin](https://github.com/azat)). +* The `domainRFC` function now supports IPv6 in square brackets. [#53506](https://github.com/ClickHouse/ClickHouse/pull/53506) ([Chen768959](https://github.com/Chen768959)). +* Use longer timeout for S3 CopyObject requests, which are used in backups. [#53533](https://github.com/ClickHouse/ClickHouse/pull/53533) ([Michael Kolupaev](https://github.com/al13n321)). +* Added server setting `aggregate_function_group_array_max_element_size`. This setting is used to limit array size for `groupArray` function at serialization. The default value is `16777215`. [#53550](https://github.com/ClickHouse/ClickHouse/pull/53550) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* `SCHEMA` was added as alias for `DATABASE` to improve MySQL compatibility. [#53587](https://github.com/ClickHouse/ClickHouse/pull/53587) ([Daniël van Eeden](https://github.com/dveeden)). +* Add asynchronous metrics about tables in the system database. For example, `TotalBytesOfMergeTreeTablesSystem`. This closes [#53603](https://github.com/ClickHouse/ClickHouse/issues/53603). [#53604](https://github.com/ClickHouse/ClickHouse/pull/53604) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* SQL editor in the Play UI and Dashboard will not use Grammarly. [#53614](https://github.com/ClickHouse/ClickHouse/pull/53614) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* As expert-level settings, it is now possible to (1) configure the size_ratio (i.e. the relative size of the protected queue) of the [index] mark/uncompressed caches, (2) configure the cache policy of the index mark and index uncompressed caches. [#53657](https://github.com/ClickHouse/ClickHouse/pull/53657) ([Robert Schulze](https://github.com/rschu1ze)). +* Added client info validation to the query packet in TCPHandler. [#53673](https://github.com/ClickHouse/ClickHouse/pull/53673) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Retry loading parts in case of network errors while interaction with Microsoft Azure. [#53750](https://github.com/ClickHouse/ClickHouse/pull/53750) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Stacktrace for exceptions, Materailized view exceptions are propagated. [#53766](https://github.com/ClickHouse/ClickHouse/pull/53766) ([Ilya Golshtein](https://github.com/ilejn)). +* If no hostname or port were specified, keeper client will try to search for a connection string in the ClickHouse's config.xml. [#53769](https://github.com/ClickHouse/ClickHouse/pull/53769) ([pufit](https://github.com/pufit)). +* Add profile event `PartsLockMicroseconds` which shows the amount of microseconds we hold the data parts lock in MergeTree table engine family. [#53797](https://github.com/ClickHouse/ClickHouse/pull/53797) ([alesapin](https://github.com/alesapin)). +* Make reconnect limit in RAFT limits configurable for keeper. This configuration can help to make keeper to rebuild connection with peers quicker if the current connection is broken. [#53817](https://github.com/ClickHouse/ClickHouse/pull/53817) ([Pengyuan Bian](https://github.com/bianpengyuan)). +* Ignore foreign keys in tables definition to improve compatibility with MySQL, so a user wouldn't need to rewrite his SQL of the foreign key part, ref [#53380](https://github.com/ClickHouse/ClickHouse/issues/53380). [#53864](https://github.com/ClickHouse/ClickHouse/pull/53864) ([jsc0218](https://github.com/jsc0218)). + +#### Build/Testing/Packaging Improvement +* Don't expose symbols from ClickHouse binary to dynamic linker. It might fix [#43933](https://github.com/ClickHouse/ClickHouse/issues/43933). [#47475](https://github.com/ClickHouse/ClickHouse/pull/47475) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `clickhouse-keeper-client` symlink to the clickhouse-server package. [#51882](https://github.com/ClickHouse/ClickHouse/pull/51882) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Add https://github.com/elliotchance/sqltest to CI to report the SQL 2016 conformance. [#52293](https://github.com/ClickHouse/ClickHouse/pull/52293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Upgrade PRQL to 0.9.3. [#53060](https://github.com/ClickHouse/ClickHouse/pull/53060) ([Maximilian Roos](https://github.com/max-sixty)). +* System tables from CI checks are exported to ClickHouse Cloud. [#53086](https://github.com/ClickHouse/ClickHouse/pull/53086) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The compiler's profile data (`-ftime-trace`) is uploaded to ClickHouse Cloud. [#53100](https://github.com/ClickHouse/ClickHouse/pull/53100) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Speed up Debug and Tidy builds. [#53178](https://github.com/ClickHouse/ClickHouse/pull/53178) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Speed up the build by removing tons and tonnes of garbage. One of the frequently included headers was poisoned by boost. [#53180](https://github.com/ClickHouse/ClickHouse/pull/53180) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove even more garbage. [#53182](https://github.com/ClickHouse/ClickHouse/pull/53182) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The function `arrayAUC` was using heavy C++ templates - ditched them. [#53183](https://github.com/ClickHouse/ClickHouse/pull/53183) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Some translation units were always rebuilt regardless of ccache. The culprit is found and fixed. [#53184](https://github.com/ClickHouse/ClickHouse/pull/53184) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The compiler's profile data (`-ftime-trace`) is uploaded to ClickHouse Cloud., the second attempt after [#53100](https://github.com/ClickHouse/ClickHouse/issues/53100). [#53213](https://github.com/ClickHouse/ClickHouse/pull/53213) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Export logs from CI in stateful tests to ClickHouse Cloud. [#53351](https://github.com/ClickHouse/ClickHouse/pull/53351) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Export logs from CI in stress tests. [#53353](https://github.com/ClickHouse/ClickHouse/pull/53353) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Export logs from CI in fuzzer. [#53354](https://github.com/ClickHouse/ClickHouse/pull/53354) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Preserve environment parameters in `clickhouse start` command. Fixes [#51962](https://github.com/ClickHouse/ClickHouse/issues/51962). [#53418](https://github.com/ClickHouse/ClickHouse/pull/53418) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Follow up for [#53418](https://github.com/ClickHouse/ClickHouse/issues/53418). Small improvements for install_check.py, adding tests for proper ENV parameters passing to the main process on `init.d start`. [#53457](https://github.com/ClickHouse/ClickHouse/pull/53457) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Reorganize file management in CMake to prevent potential duplications. For instance, `indexHint.cpp` is duplicated in both `dbms_sources` and `clickhouse_functions_sources`. [#53621](https://github.com/ClickHouse/ClickHouse/pull/53621) ([Amos Bird](https://github.com/amosbird)). +* Upgrade snappy to 1.1.10. [#53672](https://github.com/ClickHouse/ClickHouse/pull/53672) ([李扬](https://github.com/taiyang-li)). +* Slightly improve cmake build by sanitizing some dependencies and removing some duplicates. Each commit includes a short description of the changes made. [#53759](https://github.com/ClickHouse/ClickHouse/pull/53759) ([Amos Bird](https://github.com/amosbird)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Do not reset (experimental) Annoy index during build-up with more than one mark [#51325](https://github.com/ClickHouse/ClickHouse/pull/51325) ([Tian Xinhui](https://github.com/xinhuitian)). +* Fix usage of temporary directories during RESTORE [#51493](https://github.com/ClickHouse/ClickHouse/pull/51493) ([Azat Khuzhin](https://github.com/azat)). +* Fix binary arithmetic for Nullable(IPv4) [#51642](https://github.com/ClickHouse/ClickHouse/pull/51642) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Support IPv4 and IPv6 data types as dictionary attributes [#51756](https://github.com/ClickHouse/ClickHouse/pull/51756) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* A fix for checksum of compress marks [#51777](https://github.com/ClickHouse/ClickHouse/pull/51777) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix mistakenly comma parsing as part of datetime in CSV best effort parsing [#51950](https://github.com/ClickHouse/ClickHouse/pull/51950) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't throw exception when executable UDF has parameters [#51961](https://github.com/ClickHouse/ClickHouse/pull/51961) ([Nikita Taranov](https://github.com/nickitat)). +* Fix recalculation of skip indexes and projections in `ALTER DELETE` queries [#52530](https://github.com/ClickHouse/ClickHouse/pull/52530) ([Anton Popov](https://github.com/CurtizJ)). +* MaterializedMySQL: Fix the infinite loop in ReadBuffer::read [#52621](https://github.com/ClickHouse/ClickHouse/pull/52621) ([Val Doroshchuk](https://github.com/valbok)). +* Load suggestion only with `clickhouse` dialect [#52628](https://github.com/ClickHouse/ClickHouse/pull/52628) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Init and destroy ares channel on demand. [#52634](https://github.com/ClickHouse/ClickHouse/pull/52634) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix filtering by virtual columns with OR expression [#52653](https://github.com/ClickHouse/ClickHouse/pull/52653) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash in function `tuple` with one sparse column argument [#52659](https://github.com/ClickHouse/ClickHouse/pull/52659) ([Anton Popov](https://github.com/CurtizJ)). +* Fix named collections on cluster [#52687](https://github.com/ClickHouse/ClickHouse/pull/52687) ([Al Korgun](https://github.com/alkorgun)). +* Fix reading of unnecessary column in case of multistage `PREWHERE` [#52689](https://github.com/ClickHouse/ClickHouse/pull/52689) ([Anton Popov](https://github.com/CurtizJ)). +* Fix unexpected sort result on multi columns with nulls first direction [#52761](https://github.com/ClickHouse/ClickHouse/pull/52761) ([copperybean](https://github.com/copperybean)). +* Fix data race in Keeper reconfiguration [#52804](https://github.com/ClickHouse/ClickHouse/pull/52804) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix sorting of sparse columns with large limit [#52827](https://github.com/ClickHouse/ClickHouse/pull/52827) ([Anton Popov](https://github.com/CurtizJ)). +* clickhouse-keeper: fix implementation of server with poll. [#52833](https://github.com/ClickHouse/ClickHouse/pull/52833) ([Andy Fiddaman](https://github.com/citrus-it)). +* Make regexp analyzer recognize named capturing groups [#52840](https://github.com/ClickHouse/ClickHouse/pull/52840) ([Han Fei](https://github.com/hanfei1991)). +* Fix possible assert in `~PushingAsyncPipelineExecutor` in clickhouse-local [#52862](https://github.com/ClickHouse/ClickHouse/pull/52862) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading of empty `Nested(Array(LowCardinality(...)))` [#52949](https://github.com/ClickHouse/ClickHouse/pull/52949) ([Anton Popov](https://github.com/CurtizJ)). +* Added new tests for session_log and fixed the inconsistency between login and logout. [#52958](https://github.com/ClickHouse/ClickHouse/pull/52958) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix password leak in show create mysql table [#52962](https://github.com/ClickHouse/ClickHouse/pull/52962) ([Duc Canh Le](https://github.com/canhld94)). +* Convert sparse column format to full in CreateSetAndFilterOnTheFlyStep [#53000](https://github.com/ClickHouse/ClickHouse/pull/53000) ([vdimir](https://github.com/vdimir)). +* Fix rare race condition with empty key prefix directory deletion in fs cache [#53055](https://github.com/ClickHouse/ClickHouse/pull/53055) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix ZstdDeflatingWriteBuffer truncating the output sometimes [#53064](https://github.com/ClickHouse/ClickHouse/pull/53064) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix query_id in part_log with async flush queries [#53103](https://github.com/ClickHouse/ClickHouse/pull/53103) ([Raúl Marín](https://github.com/Algunenano)). +* Fix possible error from cache "Read unexpected size" [#53121](https://github.com/ClickHouse/ClickHouse/pull/53121) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable the new parquet encoder [#53130](https://github.com/ClickHouse/ClickHouse/pull/53130) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix "Not-ready Set" exception [#53162](https://github.com/ClickHouse/ClickHouse/pull/53162) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix character escaping in the PostgreSQL engine [#53250](https://github.com/ClickHouse/ClickHouse/pull/53250) ([Nikolay Degterinsky](https://github.com/evillique)). +* Experimental session_log table: Added new tests for session_log and fixed the inconsistency between login and logout. [#53255](https://github.com/ClickHouse/ClickHouse/pull/53255) ([Alexey Gerasimchuck](https://github.com/Demilivor)). Fixed inconsistency between login success and logout [#53302](https://github.com/ClickHouse/ClickHouse/pull/53302) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix adding sub-second intervals to DateTime [#53309](https://github.com/ClickHouse/ClickHouse/pull/53309) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix "Context has expired" error in dictionaries [#53342](https://github.com/ClickHouse/ClickHouse/pull/53342) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect normal projection AST format [#53347](https://github.com/ClickHouse/ClickHouse/pull/53347) ([Amos Bird](https://github.com/amosbird)). +* Forbid use_structure_from_insertion_table_in_table_functions when execute Scalar [#53348](https://github.com/ClickHouse/ClickHouse/pull/53348) ([flynn](https://github.com/ucasfl)). +* Fix loading lazy database during system.table select query [#53372](https://github.com/ClickHouse/ClickHouse/pull/53372) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fixed system.data_skipping_indices for MaterializedMySQL [#53381](https://github.com/ClickHouse/ClickHouse/pull/53381) ([Filipp Ozinov](https://github.com/bakwc)). +* Fix processing single carriage return in TSV file segmentation engine [#53407](https://github.com/ClickHouse/ClickHouse/pull/53407) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `Context has expired` error properly [#53433](https://github.com/ClickHouse/ClickHouse/pull/53433) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix `timeout_overflow_mode` when having subquery in the rhs of IN [#53439](https://github.com/ClickHouse/ClickHouse/pull/53439) ([Duc Canh Le](https://github.com/canhld94)). +* Fix an unexpected behavior in [#53152](https://github.com/ClickHouse/ClickHouse/issues/53152) [#53440](https://github.com/ClickHouse/ClickHouse/pull/53440) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Fix JSON_QUERY Function parse error while path is all number [#53470](https://github.com/ClickHouse/ClickHouse/pull/53470) ([KevinyhZou](https://github.com/KevinyhZou)). +* Fix wrong columns order for queries with parallel FINAL. [#53489](https://github.com/ClickHouse/ClickHouse/pull/53489) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed SELECTing from ReplacingMergeTree with do_not_merge_across_partitions_select_final [#53511](https://github.com/ClickHouse/ClickHouse/pull/53511) ([Vasily Nemkov](https://github.com/Enmk)). +* Flush async insert queue first on shutdown [#53547](https://github.com/ClickHouse/ClickHouse/pull/53547) ([joelynch](https://github.com/joelynch)). +* Fix crash in join on sparse columna [#53548](https://github.com/ClickHouse/ClickHouse/pull/53548) ([vdimir](https://github.com/vdimir)). +* Fix possible UB in Set skipping index for functions with incorrect args [#53559](https://github.com/ClickHouse/ClickHouse/pull/53559) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible UB in inverted indexes (experimental feature) [#53560](https://github.com/ClickHouse/ClickHouse/pull/53560) ([Azat Khuzhin](https://github.com/azat)). +* Fix: interpolate expression takes source column instead of same name aliased from select expression. [#53572](https://github.com/ClickHouse/ClickHouse/pull/53572) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix number of dropped granules in EXPLAIN PLAN index=1 [#53616](https://github.com/ClickHouse/ClickHouse/pull/53616) ([wangxiaobo](https://github.com/wzb5212)). +* Correctly handle totals and extremes with `DelayedSource` [#53644](https://github.com/ClickHouse/ClickHouse/pull/53644) ([Antonio Andelic](https://github.com/antonio2368)). +* Prepared set cache in mutation pipeline stuck [#53645](https://github.com/ClickHouse/ClickHouse/pull/53645) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix bug on mutations with subcolumns of type JSON in predicates of UPDATE and DELETE queries. [#53677](https://github.com/ClickHouse/ClickHouse/pull/53677) ([VanDarkholme7](https://github.com/VanDarkholme7)). +* Fix filter pushdown for full_sorting_merge join [#53699](https://github.com/ClickHouse/ClickHouse/pull/53699) ([vdimir](https://github.com/vdimir)). +* Try to fix bug with `NULL::LowCardinality(Nullable(...)) NOT IN` [#53706](https://github.com/ClickHouse/ClickHouse/pull/53706) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix: sorted distinct with sparse columns [#53711](https://github.com/ClickHouse/ClickHouse/pull/53711) ([Igor Nikonov](https://github.com/devcrafter)). +* `transform`: correctly handle default column with multiple rows [#53742](https://github.com/ClickHouse/ClickHouse/pull/53742) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix fuzzer crash in parseDateTime [#53764](https://github.com/ClickHouse/ClickHouse/pull/53764) ([Robert Schulze](https://github.com/rschu1ze)). +* MaterializedPostgreSQL: fix uncaught exception in getCreateTableQueryImpl [#53832](https://github.com/ClickHouse/ClickHouse/pull/53832) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible segfault while using PostgreSQL engine [#53847](https://github.com/ClickHouse/ClickHouse/pull/53847) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix named_collection_admin alias [#54066](https://github.com/ClickHouse/ClickHouse/pull/54066) ([Kseniia Sumarokova](https://github.com/kssenii)). + +### ClickHouse release 23.7, 2023-07-27 {#237} + +#### Backward Incompatible Change +* Add `NAMED COLLECTION` access type (aliases `USE NAMED COLLECTION`, `NAMED COLLECTION USAGE`). This PR is backward incompatible because this access type is disabled by default (because a parent access type `NAMED COLLECTION ADMIN` is disabled by default as well). Proposed in [#50277](https://github.com/ClickHouse/ClickHouse/issues/50277). To grant use `GRANT NAMED COLLECTION ON collection_name TO user` or `GRANT NAMED COLLECTION ON * TO user`, to be able to give these grants `named_collection_admin` is required in config (previously it was named `named_collection_control`, so will remain as an alias). [#50625](https://github.com/ClickHouse/ClickHouse/pull/50625) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fixing a typo in the `system.parts` column name `last_removal_attemp_time`. Now it is named `last_removal_attempt_time`. [#52104](https://github.com/ClickHouse/ClickHouse/pull/52104) ([filimonov](https://github.com/filimonov)). +* Bump version of the distributed_ddl_entry_format_version to 5 by default (enables opentelemetry and initial_query_idd pass through). This will not allow to process existing entries for distributed DDL after *downgrade* (but note, that usually there should be no such unprocessed entries). [#52128](https://github.com/ClickHouse/ClickHouse/pull/52128) ([Azat Khuzhin](https://github.com/azat)). +* Check projection metadata the same way we check ordinary metadata. This change may prevent the server from starting in case there was a table with an invalid projection. An example is a projection that created positional columns in PK (e.g. `projection p (select * order by 1, 4)` which is not allowed in table PK and can cause a crash during insert/merge). Drop such projections before the update. Fixes [#52353](https://github.com/ClickHouse/ClickHouse/issues/52353). [#52361](https://github.com/ClickHouse/ClickHouse/pull/52361) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* The experimental feature `hashid` is removed due to a bug. The quality of implementation was questionable at the start, and it didn't get through the experimental status. This closes [#52406](https://github.com/ClickHouse/ClickHouse/issues/52406). [#52449](https://github.com/ClickHouse/ClickHouse/pull/52449) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* Added `Overlay` database engine to combine multiple databases into one. Added `Filesystem` database engine to represent a directory in the filesystem as a set of implicitly available tables with auto-detected formats and structures. A new `S3` database engine allows to read-only interact with s3 storage by representing a prefix as a set of tables. A new `HDFS` database engine allows to interact with HDFS storage in the same way. [#48821](https://github.com/ClickHouse/ClickHouse/pull/48821) ([alekseygolub](https://github.com/alekseygolub)). +* Add support for external disks in Keeper for storing snapshots and logs. [#50098](https://github.com/ClickHouse/ClickHouse/pull/50098) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for multi-directory selection (`{}`) globs. [#50559](https://github.com/ClickHouse/ClickHouse/pull/50559) ([Andrey Zvonov](https://github.com/zvonand)). +* Kafka connector can fetch Avro schema from schema registry with basic authentication using url-encoded credentials. [#49664](https://github.com/ClickHouse/ClickHouse/pull/49664) ([Ilya Golshtein](https://github.com/ilejn)). +* Add function `arrayJaccardIndex` which computes the Jaccard similarity between two arrays. [#50076](https://github.com/ClickHouse/ClickHouse/pull/50076) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Add a column `is_obsolete` to `system.settings` and similar tables. Closes [#50819](https://github.com/ClickHouse/ClickHouse/issues/50819). [#50826](https://github.com/ClickHouse/ClickHouse/pull/50826) ([flynn](https://github.com/ucasfl)). +* Implement support of encrypted elements in configuration file. Added possibility to use encrypted text in leaf elements of configuration file. The text is encrypted using encryption codecs from `` section. [#50986](https://github.com/ClickHouse/ClickHouse/pull/50986) ([Roman Vasin](https://github.com/rvasin)). +* Grace Hash Join algorithm is now applicable to FULL and RIGHT JOINs. [#49483](https://github.com/ClickHouse/ClickHouse/issues/49483). [#51013](https://github.com/ClickHouse/ClickHouse/pull/51013) ([lgbo](https://github.com/lgbo-ustc)). +* Add `SYSTEM STOP LISTEN` query for more graceful termination. Closes [#47972](https://github.com/ClickHouse/ClickHouse/issues/47972). [#51016](https://github.com/ClickHouse/ClickHouse/pull/51016) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `input_format_csv_allow_variable_number_of_columns` options. [#51273](https://github.com/ClickHouse/ClickHouse/pull/51273) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Another boring feature: add function `substring_index`, as in Spark or MySQL. [#51472](https://github.com/ClickHouse/ClickHouse/pull/51472) ([李扬](https://github.com/taiyang-li)). +* A system table `jemalloc_bins` to show stats for jemalloc bins. Example `SELECT *, size * (nmalloc - ndalloc) AS allocated_bytes FROM system.jemalloc_bins WHERE allocated_bytes > 0 ORDER BY allocated_bytes DESC LIMIT 10`. Enjoy. [#51674](https://github.com/ClickHouse/ClickHouse/pull/51674) ([Alexander Gololobov](https://github.com/davenger)). +* Add `RowBinaryWithDefaults` format with extra byte before each column as a flag for using the column's default value. Closes [#50854](https://github.com/ClickHouse/ClickHouse/issues/50854). [#51695](https://github.com/ClickHouse/ClickHouse/pull/51695) ([Kruglov Pavel](https://github.com/Avogar)). +* Added `default_temporary_table_engine` setting. Same as `default_table_engine` but for temporary tables. [#51292](https://github.com/ClickHouse/ClickHouse/issues/51292). [#51708](https://github.com/ClickHouse/ClickHouse/pull/51708) ([velavokr](https://github.com/velavokr)). +* Added new `initcap` / `initcapUTF8` functions which convert the first letter of each word to upper case and the rest to lower case. [#51735](https://github.com/ClickHouse/ClickHouse/pull/51735) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Create table now supports `PRIMARY KEY` syntax in column definition. Columns are added to primary index in the same order columns are defined. [#51881](https://github.com/ClickHouse/ClickHouse/pull/51881) ([Ilya Yatsishin](https://github.com/qoega)). +* Added the possibility to use date and time format specifiers in log and error log file names, either in config files (`log` and `errorlog` tags) or command line arguments (`--log-file` and `--errorlog-file`). [#51945](https://github.com/ClickHouse/ClickHouse/pull/51945) ([Victor Krasnov](https://github.com/sirvickr)). +* Added Peak Memory Usage statistic to HTTP headers. [#51946](https://github.com/ClickHouse/ClickHouse/pull/51946) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Added new `hasSubsequence` (+`CaseInsensitive` and `UTF8` versions) functions to match subsequences in strings. [#52050](https://github.com/ClickHouse/ClickHouse/pull/52050) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Add `array_agg` as alias of `groupArray` for PostgreSQL compatibility. Closes [#52100](https://github.com/ClickHouse/ClickHouse/issues/52100). ### Documentation entry for user-facing changes. [#52135](https://github.com/ClickHouse/ClickHouse/pull/52135) ([flynn](https://github.com/ucasfl)). +* Add `any_value` as a compatibility alias for `any` aggregate function. Closes [#52140](https://github.com/ClickHouse/ClickHouse/issues/52140). [#52147](https://github.com/ClickHouse/ClickHouse/pull/52147) ([flynn](https://github.com/ucasfl)). +* Add aggregate function `array_concat_agg` for compatibility with BigQuery, it's alias of `groupArrayArray`. Closes [#52139](https://github.com/ClickHouse/ClickHouse/issues/52139). [#52149](https://github.com/ClickHouse/ClickHouse/pull/52149) ([flynn](https://github.com/ucasfl)). +* Add `OCTET_LENGTH` as an alias to `length`. Closes [#52153](https://github.com/ClickHouse/ClickHouse/issues/52153). [#52176](https://github.com/ClickHouse/ClickHouse/pull/52176) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Added `firstLine` function to extract the first line from the multi-line string. This closes [#51172](https://github.com/ClickHouse/ClickHouse/issues/51172). [#52209](https://github.com/ClickHouse/ClickHouse/pull/52209) ([Mikhail Koviazin](https://github.com/mkmkme)). +* Implement KQL-style formatting for the `Interval` data type. This is only needed for compatibility with the `Kusto` query language. [#45671](https://github.com/ClickHouse/ClickHouse/pull/45671) ([ltrk2](https://github.com/ltrk2)). +* Added query `SYSTEM FLUSH ASYNC INSERT QUEUE` which flushes all pending asynchronous inserts to the destination tables. Added a server-side setting `async_insert_queue_flush_on_shutdown` (`true` by default) which determines whether to flush queue of asynchronous inserts on graceful shutdown. Setting `async_insert_threads` is now a server-side setting. [#49160](https://github.com/ClickHouse/ClickHouse/pull/49160) ([Anton Popov](https://github.com/CurtizJ)). +* Aliases `current_database` and a new function `current_schemas` for compatibility with PostgreSQL. [#51076](https://github.com/ClickHouse/ClickHouse/pull/51076) ([Pedro Riera](https://github.com/priera)). +* Add alias for functions `today` (now available under the `curdate`/`current_date` names) and `now` (`current_timestamp`). [#52106](https://github.com/ClickHouse/ClickHouse/pull/52106) ([Lloyd-Pottiger](https://github.com/Lloyd-Pottiger)). +* Support `async_deduplication_token` for async insert. [#52136](https://github.com/ClickHouse/ClickHouse/pull/52136) ([Han Fei](https://github.com/hanfei1991)). +* Add new setting `disable_url_encoding` that allows to disable decoding/encoding path in uri in URL engine. [#52337](https://github.com/ClickHouse/ClickHouse/pull/52337) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Performance Improvement +* Enable automatic selection of the sparse serialization format by default. It improves performance. The format is supported since version 22.1. After this change, downgrading to versions older than 22.1 might not be possible. A downgrade may require to set `ratio_of_defaults_for_sparse_serialization=0.9375` [55153](https://github.com/ClickHouse/ClickHouse/issues/55153). You can turn off the usage of the sparse serialization format by providing the `ratio_of_defaults_for_sparse_serialization = 1` setting for your MergeTree tables. [#49631](https://github.com/ClickHouse/ClickHouse/pull/49631) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable `move_all_conditions_to_prewhere` and `enable_multiple_prewhere_read_steps` settings by default. [#46365](https://github.com/ClickHouse/ClickHouse/pull/46365) ([Alexander Gololobov](https://github.com/davenger)). +* Improves performance of some queries by tuning allocator. [#46416](https://github.com/ClickHouse/ClickHouse/pull/46416) ([Azat Khuzhin](https://github.com/azat)). +* Now we use fixed-size tasks in `MergeTreePrefetchedReadPool` as in `MergeTreeReadPool`. Also from now we use connection pool for S3 requests. [#49732](https://github.com/ClickHouse/ClickHouse/pull/49732) ([Nikita Taranov](https://github.com/nickitat)). +* More pushdown to the right side of join. [#50532](https://github.com/ClickHouse/ClickHouse/pull/50532) ([Nikita Taranov](https://github.com/nickitat)). +* Improve grace_hash join by reserving hash table's size (resubmit). [#50875](https://github.com/ClickHouse/ClickHouse/pull/50875) ([lgbo](https://github.com/lgbo-ustc)). +* Waiting on lock in `OpenedFileCache` could be noticeable sometimes. We sharded it into multiple sub-maps (each with its own lock) to avoid contention. [#51341](https://github.com/ClickHouse/ClickHouse/pull/51341) ([Nikita Taranov](https://github.com/nickitat)). +* Move conditions with primary key columns to the end of PREWHERE chain. The idea is that conditions with PK columns are likely to be used in PK analysis and will not contribute much more to PREWHERE filtering. [#51958](https://github.com/ClickHouse/ClickHouse/pull/51958) ([Alexander Gololobov](https://github.com/davenger)). +* Speed up `COUNT(DISTINCT)` for String types by inlining SipHash. The performance experiments of *OnTime* on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) show that this change could bring an improvement of *11.6%* to the QPS of the query *Q8* while having no impact on others. [#52036](https://github.com/ClickHouse/ClickHouse/pull/52036) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Enable `allow_vertical_merges_from_compact_to_wide_parts` by default. It will save memory usage during merges. [#52295](https://github.com/ClickHouse/ClickHouse/pull/52295) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect projection analysis which invalidates primary keys. This issue only exists when `query_plan_optimize_primary_key = 1, query_plan_optimize_projection = 1`. This fixes [#48823](https://github.com/ClickHouse/ClickHouse/issues/48823). This fixes [#51173](https://github.com/ClickHouse/ClickHouse/issues/51173). [#52308](https://github.com/ClickHouse/ClickHouse/pull/52308) ([Amos Bird](https://github.com/amosbird)). +* Reduce the number of syscalls in `FileCache::loadMetadata` - this speeds up server startup if the filesystem cache is configured. [#52435](https://github.com/ClickHouse/ClickHouse/pull/52435) ([Raúl Marín](https://github.com/Algunenano)). +* Allow to have strict lower boundary for file segment size by downloading remaining data in the background. Minimum size of file segment (if actual file size is bigger) is configured as cache configuration setting `boundary_alignment`, by default `4Mi`. Number of background threads are configured as cache configuration setting `background_download_threads`, by default `2`. Also `max_file_segment_size` was increased from `8Mi` to `32Mi` in this PR. [#51000](https://github.com/ClickHouse/ClickHouse/pull/51000) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Decreased default timeouts for S3 from 30 seconds to 3 seconds, and for other HTTP from 180 seconds to 30 seconds. [#51171](https://github.com/ClickHouse/ClickHouse/pull/51171) ([Michael Kolupaev](https://github.com/al13n321)). +* New setting `merge_tree_determine_task_size_by_prewhere_columns` added. If set to `true` only sizes of the columns from `PREWHERE` section will be considered to determine reading task size. Otherwise all the columns from query are considered. [#52606](https://github.com/ClickHouse/ClickHouse/pull/52606) ([Nikita Taranov](https://github.com/nickitat)). + +#### Improvement +* Use read_bytes/total_bytes_to_read for progress bar in s3/file/url/... table functions for better progress indication. [#51286](https://github.com/ClickHouse/ClickHouse/pull/51286) ([Kruglov Pavel](https://github.com/Avogar)). +* Introduce a table setting `wait_for_unique_parts_send_before_shutdown_ms` which specify the amount of time replica will wait before closing interserver handler for replicated sends. Also fix inconsistency with shutdown of tables and interserver handlers: now server shutdown tables first and only after it shut down interserver handlers. [#51851](https://github.com/ClickHouse/ClickHouse/pull/51851) ([alesapin](https://github.com/alesapin)). +* Allow SQL standard `FETCH` without `OFFSET`. See https://antonz.org/sql-fetch/. [#51293](https://github.com/ClickHouse/ClickHouse/pull/51293) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow filtering HTTP headers for the URL/S3 table functions with the new `http_forbid_headers` section in config. Both exact matching and regexp filters are available. [#51038](https://github.com/ClickHouse/ClickHouse/pull/51038) ([Nikolay Degterinsky](https://github.com/evillique)). +* Don't show messages about `16 EiB` free space in logs, as they don't make sense. This closes [#49320](https://github.com/ClickHouse/ClickHouse/issues/49320). [#49342](https://github.com/ClickHouse/ClickHouse/pull/49342) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Properly check the limit for the `sleepEachRow` function. Add a setting `function_sleep_max_microseconds_per_block`. This is needed for generic query fuzzer. [#49343](https://github.com/ClickHouse/ClickHouse/pull/49343) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix two issues in `geoHash` functions. [#50066](https://github.com/ClickHouse/ClickHouse/pull/50066) ([李扬](https://github.com/taiyang-li)). +* Log async insert flush queries into `system.query_log`. [#51160](https://github.com/ClickHouse/ClickHouse/pull/51160) ([Raúl Marín](https://github.com/Algunenano)). +* Functions `date_diff` and `age` now support millisecond/microsecond unit and work with microsecond precision. [#51291](https://github.com/ClickHouse/ClickHouse/pull/51291) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Improve parsing of path in clickhouse-keeper-client. [#51359](https://github.com/ClickHouse/ClickHouse/pull/51359) ([Azat Khuzhin](https://github.com/azat)). +* A third-party product depending on ClickHouse (Gluten: a Plugin to Double SparkSQL's Performance) had a bug. This fix avoids heap overflow in that third-party product while reading from HDFS. [#51386](https://github.com/ClickHouse/ClickHouse/pull/51386) ([李扬](https://github.com/taiyang-li)). +* Add ability to disable native copy for S3 (setting for BACKUP/RESTORE `allow_s3_native_copy`, and `s3_allow_native_copy` for `s3`/`s3_plain` disks). [#51448](https://github.com/ClickHouse/ClickHouse/pull/51448) ([Azat Khuzhin](https://github.com/azat)). +* Add column `primary_key_size` to `system.parts` table to show compressed primary key size on disk. Closes [#51400](https://github.com/ClickHouse/ClickHouse/issues/51400). [#51496](https://github.com/ClickHouse/ClickHouse/pull/51496) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Allow running `clickhouse-local` without procfs, without home directory existing, and without name resolution plugins from glibc. [#51518](https://github.com/ClickHouse/ClickHouse/pull/51518) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add placeholder `%a` for rull filename in rename_files_after_processing setting. [#51603](https://github.com/ClickHouse/ClickHouse/pull/51603) ([Kruglov Pavel](https://github.com/Avogar)). +* Add column `modification_time` into `system.parts_columns`. [#51685](https://github.com/ClickHouse/ClickHouse/pull/51685) ([Azat Khuzhin](https://github.com/azat)). +* Add new setting `input_format_csv_use_default_on_bad_values` to CSV format that allows to insert default value when parsing of a single field failed. [#51716](https://github.com/ClickHouse/ClickHouse/pull/51716) ([KevinyhZou](https://github.com/KevinyhZou)). +* Added a crash log flush to the disk after the unexpected crash. [#51720](https://github.com/ClickHouse/ClickHouse/pull/51720) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Fix behavior in dashboard page where errors unrelated to authentication are not shown. Also fix 'overlapping' chart behavior. [#51744](https://github.com/ClickHouse/ClickHouse/pull/51744) ([Zach Naimon](https://github.com/ArctypeZach)). +* Allow UUID to UInt128 conversion. [#51765](https://github.com/ClickHouse/ClickHouse/pull/51765) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Added support for function `range` of Nullable arguments. [#51767](https://github.com/ClickHouse/ClickHouse/pull/51767) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Convert condition like `toyear(x) = c` to `c1 <= x < c2`. [#51795](https://github.com/ClickHouse/ClickHouse/pull/51795) ([Han Fei](https://github.com/hanfei1991)). +* Improve MySQL compatibility of the statement `SHOW INDEX`. [#51796](https://github.com/ClickHouse/ClickHouse/pull/51796) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix `use_structure_from_insertion_table_in_table_functions` does not work with `MATERIALIZED` and `ALIAS` columns. Closes [#51817](https://github.com/ClickHouse/ClickHouse/issues/51817). Closes [#51019](https://github.com/ClickHouse/ClickHouse/issues/51019). [#51825](https://github.com/ClickHouse/ClickHouse/pull/51825) ([flynn](https://github.com/ucasfl)). +* Cache dictionary now requests only unique keys from source. Closes [#51762](https://github.com/ClickHouse/ClickHouse/issues/51762). [#51853](https://github.com/ClickHouse/ClickHouse/pull/51853) ([Maksim Kita](https://github.com/kitaisreal)). +* Fixed the case when settings were not applied for EXPLAIN query when FORMAT was provided. [#51859](https://github.com/ClickHouse/ClickHouse/pull/51859) ([Nikita Taranov](https://github.com/nickitat)). +* Allow SETTINGS before FORMAT in DESCRIBE TABLE query for compatibility with SELECT query. Closes [#51544](https://github.com/ClickHouse/ClickHouse/issues/51544). [#51899](https://github.com/ClickHouse/ClickHouse/pull/51899) ([Nikolay Degterinsky](https://github.com/evillique)). +* Var-Int encoded integers (e.g. used by the native protocol) can now use the full 64-bit range. 3rd party clients are advised to update their var-int code accordingly. [#51905](https://github.com/ClickHouse/ClickHouse/pull/51905) ([Robert Schulze](https://github.com/rschu1ze)). +* Update certificates when they change without the need to manually SYSTEM RELOAD CONFIG. [#52030](https://github.com/ClickHouse/ClickHouse/pull/52030) ([Mike Kot](https://github.com/myrrc)). +* Added `allow_create_index_without_type` setting that allow to ignore `ADD INDEX` queries without specified `TYPE`. Standard SQL queries will just succeed without changing table schema. [#52056](https://github.com/ClickHouse/ClickHouse/pull/52056) ([Ilya Yatsishin](https://github.com/qoega)). +* Log messages are written to the `system.text_log` from the server startup. [#52113](https://github.com/ClickHouse/ClickHouse/pull/52113) ([Dmitry Kardymon](https://github.com/kardymonds)). +* In cases where the HTTP endpoint has multiple IP addresses and the first of them is unreachable, a timeout exception was thrown. Made session creation with handling all resolved endpoints. [#52116](https://github.com/ClickHouse/ClickHouse/pull/52116) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Avro input format now supports Union even if it contains only a single type. Closes [#52131](https://github.com/ClickHouse/ClickHouse/issues/52131). [#52137](https://github.com/ClickHouse/ClickHouse/pull/52137) ([flynn](https://github.com/ucasfl)). +* Add setting `optimize_use_implicit_projections` to disable implicit projections (currently only `min_max_count` projection). [#52152](https://github.com/ClickHouse/ClickHouse/pull/52152) ([Amos Bird](https://github.com/amosbird)). +* It was possible to use the function `hasToken` for infinite loop. Now this possibility is removed. This closes [#52156](https://github.com/ClickHouse/ClickHouse/issues/52156). [#52160](https://github.com/ClickHouse/ClickHouse/pull/52160) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Create ZK ancestors optimistically. [#52195](https://github.com/ClickHouse/ClickHouse/pull/52195) ([Raúl Marín](https://github.com/Algunenano)). +* Fix [#50582](https://github.com/ClickHouse/ClickHouse/issues/50582). Avoid the `Not found column ... in block` error in some cases of reading in-order and constants. [#52259](https://github.com/ClickHouse/ClickHouse/pull/52259) ([Chen768959](https://github.com/Chen768959)). +* Check whether S2 geo primitives are invalid as early as possible on ClickHouse side. This closes: [#27090](https://github.com/ClickHouse/ClickHouse/issues/27090). [#52260](https://github.com/ClickHouse/ClickHouse/pull/52260) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Add back missing projection QueryAccessInfo when `query_plan_optimize_projection = 1`. This fixes [#50183](https://github.com/ClickHouse/ClickHouse/issues/50183) . This fixes [#50093](https://github.com/ClickHouse/ClickHouse/issues/50093). [#52327](https://github.com/ClickHouse/ClickHouse/pull/52327) ([Amos Bird](https://github.com/amosbird)). +* When `ZooKeeperRetriesControl` rethrows an error, it's more useful to see its original stack trace, not the one from `ZooKeeperRetriesControl` itself. [#52347](https://github.com/ClickHouse/ClickHouse/pull/52347) ([Vitaly Baranov](https://github.com/vitlibar)). +* Wait for zero copy replication lock even if some disks don't support it. [#52376](https://github.com/ClickHouse/ClickHouse/pull/52376) ([Raúl Marín](https://github.com/Algunenano)). +* Now interserver port will be closed only after tables are shut down. [#52498](https://github.com/ClickHouse/ClickHouse/pull/52498) ([alesapin](https://github.com/alesapin)). + +#### Experimental Feature +* Writing parquet files is 10x faster, it's multi-threaded now. Almost the same speed as reading. [#49367](https://github.com/ClickHouse/ClickHouse/pull/49367) ([Michael Kolupaev](https://github.com/al13n321)). This is controlled by the setting `output_format_parquet_use_custom_encoder` which is disabled by default, because the feature is non-ideal. +* Added support for [PRQL](https://prql-lang.org/) as a query language. [#50686](https://github.com/ClickHouse/ClickHouse/pull/50686) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Allow to add disk name for custom disks. Previously custom disks would use an internal generated disk name. Now it will be possible with `disk = disk_(...)` (e.g. disk will have name `name`) . [#51552](https://github.com/ClickHouse/ClickHouse/pull/51552) ([Kseniia Sumarokova](https://github.com/kssenii)). This syntax can be changed in this release. +* (experimental MaterializedMySQL) Fixed crash when `mysqlxx::Pool::Entry` is used after it was disconnected. [#52063](https://github.com/ClickHouse/ClickHouse/pull/52063) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) `CREATE TABLE ... AS SELECT` .. is now supported in MaterializedMySQL. [#52067](https://github.com/ClickHouse/ClickHouse/pull/52067) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) Introduced automatic conversion of text types to utf8 for MaterializedMySQL. [#52084](https://github.com/ClickHouse/ClickHouse/pull/52084) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) Now unquoted UTF-8 strings are supported in DDL for MaterializedMySQL. [#52318](https://github.com/ClickHouse/ClickHouse/pull/52318) ([Val Doroshchuk](https://github.com/valbok)). +* (experimental MaterializedMySQL) Now double quoted comments are supported in MaterializedMySQL. [#52355](https://github.com/ClickHouse/ClickHouse/pull/52355) ([Val Doroshchuk](https://github.com/valbok)). +* Upgrade Intel QPL from v1.1.0 to v1.2.0 2. Upgrade Intel accel-config from v3.5 to v4.0 3. Fixed issue that Device IOTLB miss has big perf. impact for IAA accelerators. [#52180](https://github.com/ClickHouse/ClickHouse/pull/52180) ([jasperzhu](https://github.com/jinjunzh)). +* The `session_timezone` setting (new in version 23.6) is demoted to experimental. [#52445](https://github.com/ClickHouse/ClickHouse/pull/52445) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support ZooKeeper `reconfig` command for ClickHouse Keeper with incremental reconfiguration which can be enabled via `keeper_server.enable_reconfiguration` setting. Support adding servers, removing servers, and changing server priorities. [#49450](https://github.com/ClickHouse/ClickHouse/pull/49450) ([Mike Kot](https://github.com/myrrc)). It is suspected that this feature is incomplete. + +#### Build/Testing/Packaging Improvement +* Add experimental ClickHouse builds for Linux RISC-V 64 to CI. [#31398](https://github.com/ClickHouse/ClickHouse/pull/31398) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add integration test check with the enabled Analyzer. [#50926](https://github.com/ClickHouse/ClickHouse/pull/50926) [#52210](https://github.com/ClickHouse/ClickHouse/pull/52210) ([Dmitry Novik](https://github.com/novikd)). +* Reproducible builds for Rust. [#52395](https://github.com/ClickHouse/ClickHouse/pull/52395) ([Azat Khuzhin](https://github.com/azat)). +* Update Cargo dependencies. [#51721](https://github.com/ClickHouse/ClickHouse/pull/51721) ([Raúl Marín](https://github.com/Algunenano)). +* Make the function `CHColumnToArrowColumn::fillArrowArrayWithArrayColumnData` to work with nullable arrays, which are not possible in ClickHouse, but needed for Gluten. [#52112](https://github.com/ClickHouse/ClickHouse/pull/52112) ([李扬](https://github.com/taiyang-li)). +* We've updated the CCTZ library to master, but there are no user-visible changes. [#52124](https://github.com/ClickHouse/ClickHouse/pull/52124) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `system.licenses` table now includes the hard-forked library Poco. This closes [#52066](https://github.com/ClickHouse/ClickHouse/issues/52066). [#52127](https://github.com/ClickHouse/ClickHouse/pull/52127) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Check that there are no cases of bad punctuation: whitespace before a comma like `Hello ,world` instead of `Hello, world`. [#52549](https://github.com/ClickHouse/ClickHouse/pull/52549) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Bug Fix (user-visible misbehavior in an official stable release) +* Fix MaterializedPostgreSQL syncTables [#49698](https://github.com/ClickHouse/ClickHouse/pull/49698) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix projection with optimize_aggregators_of_group_by_keys [#49709](https://github.com/ClickHouse/ClickHouse/pull/49709) ([Amos Bird](https://github.com/amosbird)). +* Fix optimize_skip_unused_shards with JOINs [#51037](https://github.com/ClickHouse/ClickHouse/pull/51037) ([Azat Khuzhin](https://github.com/azat)). +* Fix formatDateTime() with fractional negative datetime64 [#51290](https://github.com/ClickHouse/ClickHouse/pull/51290) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Functions `hasToken*` were totally wrong. Add a test for [#43358](https://github.com/ClickHouse/ClickHouse/issues/43358) [#51378](https://github.com/ClickHouse/ClickHouse/pull/51378) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix optimization to move functions before sorting. [#51481](https://github.com/ClickHouse/ClickHouse/pull/51481) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix Block structure mismatch in Pipe::unitePipes for FINAL [#51492](https://github.com/ClickHouse/ClickHouse/pull/51492) ([Nikita Taranov](https://github.com/nickitat)). +* Fix SIGSEGV for clusters with zero weight across all shards (fixes INSERT INTO FUNCTION clusterAllReplicas()) [#51545](https://github.com/ClickHouse/ClickHouse/pull/51545) ([Azat Khuzhin](https://github.com/azat)). +* Fix timeout for hedged requests [#51582](https://github.com/ClickHouse/ClickHouse/pull/51582) ([Azat Khuzhin](https://github.com/azat)). +* Fix logical error in ANTI join with NULL [#51601](https://github.com/ClickHouse/ClickHouse/pull/51601) ([vdimir](https://github.com/vdimir)). +* Fix for moving 'IN' conditions to PREWHERE [#51610](https://github.com/ClickHouse/ClickHouse/pull/51610) ([Alexander Gololobov](https://github.com/davenger)). +* Do not apply PredicateExpressionsOptimizer for ASOF/ANTI join [#51633](https://github.com/ClickHouse/ClickHouse/pull/51633) ([vdimir](https://github.com/vdimir)). +* Fix async insert with deduplication for ReplicatedMergeTree using merging algorithms [#51676](https://github.com/ClickHouse/ClickHouse/pull/51676) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix reading from empty column in `parseSipHashKey` [#51804](https://github.com/ClickHouse/ClickHouse/pull/51804) ([Nikita Taranov](https://github.com/nickitat)). +* Fix segfault when create invalid EmbeddedRocksdb table [#51847](https://github.com/ClickHouse/ClickHouse/pull/51847) ([Duc Canh Le](https://github.com/canhld94)). +* Fix inserts into MongoDB tables [#51876](https://github.com/ClickHouse/ClickHouse/pull/51876) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix deadlock on DatabaseCatalog shutdown [#51908](https://github.com/ClickHouse/ClickHouse/pull/51908) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix error in subquery operators [#51922](https://github.com/ClickHouse/ClickHouse/pull/51922) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix async connect to hosts with multiple ips [#51934](https://github.com/ClickHouse/ClickHouse/pull/51934) ([Kruglov Pavel](https://github.com/Avogar)). +* Do not remove inputs after ActionsDAG::merge [#51947](https://github.com/ClickHouse/ClickHouse/pull/51947) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Check refcount in `RemoveManyObjectStorageOperation::finalize` instead of `execute` [#51954](https://github.com/ClickHouse/ClickHouse/pull/51954) ([vdimir](https://github.com/vdimir)). +* Allow parametric UDFs [#51964](https://github.com/ClickHouse/ClickHouse/pull/51964) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Small fix for toDateTime64() for dates after 2283-12-31 [#52130](https://github.com/ClickHouse/ClickHouse/pull/52130) ([Andrey Zvonov](https://github.com/zvonand)). +* Fix ORDER BY tuple of WINDOW functions [#52145](https://github.com/ClickHouse/ClickHouse/pull/52145) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix incorrect projection analysis when aggregation expression contains monotonic functions [#52151](https://github.com/ClickHouse/ClickHouse/pull/52151) ([Amos Bird](https://github.com/amosbird)). +* Fix error in `groupArrayMoving` functions [#52161](https://github.com/ClickHouse/ClickHouse/pull/52161) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disable direct join for range dictionary [#52187](https://github.com/ClickHouse/ClickHouse/pull/52187) ([Duc Canh Le](https://github.com/canhld94)). +* Fix sticky mutations test (and extremely rare race condition) [#52197](https://github.com/ClickHouse/ClickHouse/pull/52197) ([alesapin](https://github.com/alesapin)). +* Fix race in Web disk [#52211](https://github.com/ClickHouse/ClickHouse/pull/52211) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix data race in Connection::setAsyncCallback on unknown packet from server [#52219](https://github.com/ClickHouse/ClickHouse/pull/52219) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix temp data deletion on startup, add test [#52275](https://github.com/ClickHouse/ClickHouse/pull/52275) ([vdimir](https://github.com/vdimir)). +* Don't use minmax_count projections when counting nullable columns [#52297](https://github.com/ClickHouse/ClickHouse/pull/52297) ([Amos Bird](https://github.com/amosbird)). +* MergeTree/ReplicatedMergeTree should use server timezone for log entries [#52325](https://github.com/ClickHouse/ClickHouse/pull/52325) ([Azat Khuzhin](https://github.com/azat)). +* Fix parameterized view with cte and multiple usage [#52328](https://github.com/ClickHouse/ClickHouse/pull/52328) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Disable expression templates for time intervals [#52335](https://github.com/ClickHouse/ClickHouse/pull/52335) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix `apply_snapshot` in Keeper [#52358](https://github.com/ClickHouse/ClickHouse/pull/52358) ([Antonio Andelic](https://github.com/antonio2368)). +* Update build-osx.md [#52377](https://github.com/ClickHouse/ClickHouse/pull/52377) ([AlexBykovski](https://github.com/AlexBykovski)). +* Fix `countSubstrings` hang with empty needle and a column haystack [#52409](https://github.com/ClickHouse/ClickHouse/pull/52409) ([Sergei Trifonov](https://github.com/serxa)). +* Fix normal projection with merge table [#52432](https://github.com/ClickHouse/ClickHouse/pull/52432) ([Amos Bird](https://github.com/amosbird)). +* Fix possible double-free in Aggregator [#52439](https://github.com/ClickHouse/ClickHouse/pull/52439) ([Nikita Taranov](https://github.com/nickitat)). +* Fixed inserting into Buffer engine [#52440](https://github.com/ClickHouse/ClickHouse/pull/52440) ([Vasily Nemkov](https://github.com/Enmk)). +* The implementation of AnyHash was non-conformant. [#52448](https://github.com/ClickHouse/ClickHouse/pull/52448) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Check recursion depth in OptimizedRegularExpression [#52451](https://github.com/ClickHouse/ClickHouse/pull/52451) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix data-race DatabaseReplicated::startupTables()/canExecuteReplicatedMetadataAlter() [#52490](https://github.com/ClickHouse/ClickHouse/pull/52490) ([Azat Khuzhin](https://github.com/azat)). +* Fix abort in function `transform` [#52513](https://github.com/ClickHouse/ClickHouse/pull/52513) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix lightweight delete after drop of projection [#52517](https://github.com/ClickHouse/ClickHouse/pull/52517) ([Anton Popov](https://github.com/CurtizJ)). +* Fix possible error "Cannot drain connections: cancel first" [#52585](https://github.com/ClickHouse/ClickHouse/pull/52585) ([Kruglov Pavel](https://github.com/Avogar)). + + +### ClickHouse release 23.6, 2023-06-29 {#236} + +#### Backward Incompatible Change +* Delete feature `do_not_evict_index_and_mark_files` in the fs cache. This feature was only making things worse. [#51253](https://github.com/ClickHouse/ClickHouse/pull/51253) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Remove ALTER support for experimental LIVE VIEW. [#51287](https://github.com/ClickHouse/ClickHouse/pull/51287) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Decrease the default values for `http_max_field_value_size` and `http_max_field_name_size` to 128 KiB. [#51163](https://github.com/ClickHouse/ClickHouse/pull/51163) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* CGroups metrics related to CPU are replaced with one metric, `CGroupMaxCPU` for better usability. The `Normalized` CPU usage metrics will be normalized to CGroups limits instead of the total number of CPUs when they are set. This closes [#50836](https://github.com/ClickHouse/ClickHouse/issues/50836). [#50835](https://github.com/ClickHouse/ClickHouse/pull/50835) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### New Feature +* The function `transform` as well as `CASE` with value matching started to support all data types. This closes [#29730](https://github.com/ClickHouse/ClickHouse/issues/29730). This closes [#32387](https://github.com/ClickHouse/ClickHouse/issues/32387). This closes [#50827](https://github.com/ClickHouse/ClickHouse/issues/50827). This closes [#31336](https://github.com/ClickHouse/ClickHouse/issues/31336). This closes [#40493](https://github.com/ClickHouse/ClickHouse/issues/40493). [#51351](https://github.com/ClickHouse/ClickHouse/pull/51351) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added option `--rename_files_after_processing `. This closes [#34207](https://github.com/ClickHouse/ClickHouse/issues/34207). [#49626](https://github.com/ClickHouse/ClickHouse/pull/49626) ([alekseygolub](https://github.com/alekseygolub)). +* Add support for `TRUNCATE` modifier in `INTO OUTFILE` clause. Suggest using `APPEND` or `TRUNCATE` for `INTO OUTFILE` when file exists. [#50950](https://github.com/ClickHouse/ClickHouse/pull/50950) ([alekar](https://github.com/alekar)). +* Add table engine `Redis` and table function `redis`. It allows querying external Redis servers. [#50150](https://github.com/ClickHouse/ClickHouse/pull/50150) ([JackyWoo](https://github.com/JackyWoo)). +* Allow to skip empty files in file/s3/url/hdfs table functions using settings `s3_skip_empty_files`, `hdfs_skip_empty_files`, `engine_file_skip_empty_files`, `engine_url_skip_empty_files`. [#50364](https://github.com/ClickHouse/ClickHouse/pull/50364) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a new setting named `use_mysql_types_in_show_columns` to alter the `SHOW COLUMNS` SQL statement to display MySQL equivalent types when a client is connected via the MySQL compatibility port. [#49577](https://github.com/ClickHouse/ClickHouse/pull/49577) ([Thomas Panetti](https://github.com/tpanetti)). +* Clickhouse-client can now be called with a connection string instead of "--host", "--port", "--user" etc. [#50689](https://github.com/ClickHouse/ClickHouse/pull/50689) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Add setting `session_timezone`; it is used as the default timezone for a session when not explicitly specified. [#44149](https://github.com/ClickHouse/ClickHouse/pull/44149) ([Andrey Zvonov](https://github.com/zvonand)). +* Codec DEFLATE_QPL is now controlled via server setting "enable_deflate_qpl_codec" (default: false) instead of setting "allow_experimental_codecs". This marks DEFLATE_QPL non-experimental. [#50775](https://github.com/ClickHouse/ClickHouse/pull/50775) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Improved scheduling of merge selecting and cleanup tasks in `ReplicatedMergeTree`. The tasks will not be executed too frequently when there's nothing to merge or cleanup. Added settings `max_merge_selecting_sleep_ms`, `merge_selecting_sleep_slowdown_factor`, `max_cleanup_delay_period` and `cleanup_thread_preferred_points_per_iteration`. It should close [#31919](https://github.com/ClickHouse/ClickHouse/issues/31919). [#50107](https://github.com/ClickHouse/ClickHouse/pull/50107) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Make filter push down through cross join. [#50605](https://github.com/ClickHouse/ClickHouse/pull/50605) ([Han Fei](https://github.com/hanfei1991)). +* Improve performance with enabled QueryProfiler using thread-local timer_id instead of global object. [#48778](https://github.com/ClickHouse/ClickHouse/pull/48778) ([Jiebin Sun](https://github.com/jiebinn)). +* Rewrite CapnProto input/output format to improve its performance. Map column names and CapnProto fields case insensitive, fix reading/writing of nested structure fields. [#49752](https://github.com/ClickHouse/ClickHouse/pull/49752) ([Kruglov Pavel](https://github.com/Avogar)). +* Optimize parquet write performance for parallel threads. [#50102](https://github.com/ClickHouse/ClickHouse/pull/50102) ([Hongbin Ma](https://github.com/binmahone)). +* Disable `parallelize_output_from_storages` for processing MATERIALIZED VIEWs and storages with one block only. [#50214](https://github.com/ClickHouse/ClickHouse/pull/50214) ([Azat Khuzhin](https://github.com/azat)). +* Merge PR [#46558](https://github.com/ClickHouse/ClickHouse/pull/46558). Avoid block permutation during sort if the block is already sorted. [#50697](https://github.com/ClickHouse/ClickHouse/pull/50697) ([Alexey Milovidov](https://github.com/alexey-milovidov), [Maksim Kita](https://github.com/kitaisreal)). +* Make multiple list requests to ZooKeeper in parallel to speed up reading from system.zookeeper table. [#51042](https://github.com/ClickHouse/ClickHouse/pull/51042) ([Alexander Gololobov](https://github.com/davenger)). +* Speedup initialization of DateTime lookup tables for time zones. This should reduce startup/connect time of clickhouse-client especially in debug build as it is rather heavy. [#51347](https://github.com/ClickHouse/ClickHouse/pull/51347) ([Alexander Gololobov](https://github.com/davenger)). +* Fix data lakes slowness because of synchronous head requests. (Related to Iceberg/Deltalake/Hudi being slow with a lot of files). [#50976](https://github.com/ClickHouse/ClickHouse/pull/50976) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Do not read all the columns from right GLOBAL JOIN table. [#50721](https://github.com/ClickHouse/ClickHouse/pull/50721) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +#### Experimental Feature +* Support parallel replicas with the analyzer. [#50441](https://github.com/ClickHouse/ClickHouse/pull/50441) ([Raúl Marín](https://github.com/Algunenano)). +* Add random sleep before large merges/mutations execution to split load more evenly between replicas in case of zero-copy replication. [#51282](https://github.com/ClickHouse/ClickHouse/pull/51282) ([alesapin](https://github.com/alesapin)). +* Do not replicate `ALTER PARTITION` queries and mutations through `Replicated` database if it has only one shard and the underlying table is `ReplicatedMergeTree`. [#51049](https://github.com/ClickHouse/ClickHouse/pull/51049) ([Alexander Tokmakov](https://github.com/tavplubix)). + +#### Improvement +* Relax the thresholds for "too many parts" to be more modern. Return the backpressure during long-running insert queries. [#50856](https://github.com/ClickHouse/ClickHouse/pull/50856) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow to cast IPv6 to IPv4 address for CIDR ::ffff:0:0/96 (IPv4-mapped addresses). [#49759](https://github.com/ClickHouse/ClickHouse/pull/49759) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Update MongoDB protocol to support MongoDB 5.1 version and newer. Support for the versions with the old protocol (<3.6) is preserved. Closes [#45621](https://github.com/ClickHouse/ClickHouse/issues/45621), [#49879](https://github.com/ClickHouse/ClickHouse/issues/49879). [#50061](https://github.com/ClickHouse/ClickHouse/pull/50061) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add setting `input_format_max_bytes_to_read_for_schema_inference` to limit the number of bytes to read in schema inference. Closes [#50577](https://github.com/ClickHouse/ClickHouse/issues/50577). [#50592](https://github.com/ClickHouse/ClickHouse/pull/50592) ([Kruglov Pavel](https://github.com/Avogar)). +* Respect setting `input_format_null_as_default` in schema inference. [#50602](https://github.com/ClickHouse/ClickHouse/pull/50602) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to skip trailing empty lines in CSV/TSV/CustomSeparated formats via settings `input_format_csv_skip_trailing_empty_lines`, `input_format_tsv_skip_trailing_empty_lines` and `input_format_custom_skip_trailing_empty_lines` (disabled by default). Closes [#49315](https://github.com/ClickHouse/ClickHouse/issues/49315). [#50635](https://github.com/ClickHouse/ClickHouse/pull/50635) ([Kruglov Pavel](https://github.com/Avogar)). +* Functions "toDateOrDefault|OrNull" and "accuateCast[OrDefault|OrNull]" now correctly parse numeric arguments. [#50709](https://github.com/ClickHouse/ClickHouse/pull/50709) ([Dmitry Kardymon](https://github.com/kardymonds)). +* Support CSV with whitespace or `\t` field delimiters, and these delimiters are supported in Spark. [#50712](https://github.com/ClickHouse/ClickHouse/pull/50712) ([KevinyhZou](https://github.com/KevinyhZou)). +* Settings `number_of_mutations_to_delay` and `number_of_mutations_to_throw` are enabled by default now with values 500 and 1000 respectively. [#50726](https://github.com/ClickHouse/ClickHouse/pull/50726) ([Anton Popov](https://github.com/CurtizJ)). +* The dashboard correctly shows missing values. This closes [#50831](https://github.com/ClickHouse/ClickHouse/issues/50831). [#50832](https://github.com/ClickHouse/ClickHouse/pull/50832) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added the possibility to use date and time arguments in the syslog timestamp format in functions `parseDateTimeBestEffort*` and `parseDateTime64BestEffort*`. [#50925](https://github.com/ClickHouse/ClickHouse/pull/50925) ([Victor Krasnov](https://github.com/sirvickr)). +* Command line parameter "--password" in clickhouse-client can now be specified only once. [#50966](https://github.com/ClickHouse/ClickHouse/pull/50966) ([Alexey Gerasimchuck](https://github.com/Demilivor)). +* Use `hash_of_all_files` from `system.parts` to check identity of parts during on-cluster backups. [#50997](https://github.com/ClickHouse/ClickHouse/pull/50997) ([Vitaly Baranov](https://github.com/vitlibar)). +* The system table zookeeper_connection connected_time identifies the time when the connection is established (standard format), and session_uptime_elapsed_seconds is added, which labels the duration of the established connection session (in seconds). [#51026](https://github.com/ClickHouse/ClickHouse/pull/51026) ([郭小龙](https://github.com/guoxiaolongzte)). +* Improve the progress bar for file/s3/hdfs/url table functions by using chunk size from source data and using incremental total size counting in each thread. Fix the progress bar for *Cluster functions. This closes [#47250](https://github.com/ClickHouse/ClickHouse/issues/47250). [#51088](https://github.com/ClickHouse/ClickHouse/pull/51088) ([Kruglov Pavel](https://github.com/Avogar)). +* Add total_bytes_to_read to the Progress packet in TCP protocol for better Progress bar. [#51158](https://github.com/ClickHouse/ClickHouse/pull/51158) ([Kruglov Pavel](https://github.com/Avogar)). +* Better checking of data parts on disks with filesystem cache. [#51164](https://github.com/ClickHouse/ClickHouse/pull/51164) ([Anton Popov](https://github.com/CurtizJ)). +* Fix sometimes not correct current_elements_num in fs cache. [#51242](https://github.com/ClickHouse/ClickHouse/pull/51242) ([Kseniia Sumarokova](https://github.com/kssenii)). + +#### Build/Testing/Packaging Improvement +* Add embedded keeper-client to standalone keeper binary. [#50964](https://github.com/ClickHouse/ClickHouse/pull/50964) ([pufit](https://github.com/pufit)). +* Actual LZ4 version is used now. [#50621](https://github.com/ClickHouse/ClickHouse/pull/50621) ([Nikita Taranov](https://github.com/nickitat)). +* ClickHouse server will print the list of changed settings on fatal errors. This closes [#51137](https://github.com/ClickHouse/ClickHouse/issues/51137). [#51138](https://github.com/ClickHouse/ClickHouse/pull/51138) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow building ClickHouse with clang-17. [#51300](https://github.com/ClickHouse/ClickHouse/pull/51300) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* [SQLancer](https://github.com/sqlancer/sqlancer) check is considered stable as bugs that were triggered by it are fixed. Now failures of SQLancer check will be reported as failed check status. [#51340](https://github.com/ClickHouse/ClickHouse/pull/51340) ([Ilya Yatsishin](https://github.com/qoega)). +* Split huge `RUN` in Dockerfile into smaller conditional. Install the necessary tools on demand in the same `RUN` layer, and remove them after that. Upgrade the OS only once at the beginning. Use a modern way to check the signed repository. Downgrade the base repo to ubuntu:20.04 to address the issues on older docker versions. Upgrade golang version to address golang vulnerabilities. [#51504](https://github.com/ClickHouse/ClickHouse/pull/51504) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Report loading status for executable dictionaries correctly [#48775](https://github.com/ClickHouse/ClickHouse/pull/48775) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Proper mutation of skip indices and projections [#50104](https://github.com/ClickHouse/ClickHouse/pull/50104) ([Amos Bird](https://github.com/amosbird)). +* Cleanup moving parts [#50489](https://github.com/ClickHouse/ClickHouse/pull/50489) ([vdimir](https://github.com/vdimir)). +* Fix backward compatibility for IP types hashing in aggregate functions [#50551](https://github.com/ClickHouse/ClickHouse/pull/50551) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix Log family table return wrong rows count after truncate [#50585](https://github.com/ClickHouse/ClickHouse/pull/50585) ([flynn](https://github.com/ucasfl)). +* Fix bug in `uniqExact` parallel merging [#50590](https://github.com/ClickHouse/ClickHouse/pull/50590) ([Nikita Taranov](https://github.com/nickitat)). +* Revert recent grace hash join changes [#50699](https://github.com/ClickHouse/ClickHouse/pull/50699) ([vdimir](https://github.com/vdimir)). +* Query Cache: Try to fix bad cast from `ColumnConst` to `ColumnVector` [#50704](https://github.com/ClickHouse/ClickHouse/pull/50704) ([Robert Schulze](https://github.com/rschu1ze)). +* Avoid storing logs in Keeper containing unknown operation [#50751](https://github.com/ClickHouse/ClickHouse/pull/50751) ([Antonio Andelic](https://github.com/antonio2368)). +* SummingMergeTree support for DateTime64 [#50797](https://github.com/ClickHouse/ClickHouse/pull/50797) ([Jordi Villar](https://github.com/jrdi)). +* Add compatibility setting for non-const timezones [#50834](https://github.com/ClickHouse/ClickHouse/pull/50834) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix hashing of LDAP params in the cache entries [#50865](https://github.com/ClickHouse/ClickHouse/pull/50865) ([Julian Maicher](https://github.com/jmaicher)). +* Fallback to parsing big integer from String instead of exception in Parquet format [#50873](https://github.com/ClickHouse/ClickHouse/pull/50873) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix checking the lock file too often while writing a backup [#50889](https://github.com/ClickHouse/ClickHouse/pull/50889) ([Vitaly Baranov](https://github.com/vitlibar)). +* Do not apply projection if read-in-order was enabled. [#50923](https://github.com/ClickHouse/ClickHouse/pull/50923) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix race in the Azure blob storage iterator [#50936](https://github.com/ClickHouse/ClickHouse/pull/50936) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix erroneous `sort_description` propagation in `CreatingSets` [#50955](https://github.com/ClickHouse/ClickHouse/pull/50955) ([Nikita Taranov](https://github.com/nickitat)). +* Fix Iceberg v2 optional metadata parsing [#50974](https://github.com/ClickHouse/ClickHouse/pull/50974) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MaterializedMySQL: Keep parentheses for empty table overrides [#50977](https://github.com/ClickHouse/ClickHouse/pull/50977) ([Val Doroshchuk](https://github.com/valbok)). +* Fix crash in BackupCoordinationStageSync::setError() [#51012](https://github.com/ClickHouse/ClickHouse/pull/51012) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix subtly broken copy-on-write of ColumnLowCardinality dictionary [#51064](https://github.com/ClickHouse/ClickHouse/pull/51064) ([Michael Kolupaev](https://github.com/al13n321)). +* Generate safe IVs [#51086](https://github.com/ClickHouse/ClickHouse/pull/51086) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix ineffective query cache for SELECTs with subqueries [#51132](https://github.com/ClickHouse/ClickHouse/pull/51132) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix Set index with constant nullable comparison. [#51205](https://github.com/ClickHouse/ClickHouse/pull/51205) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a crash in s3 and s3Cluster functions [#51209](https://github.com/ClickHouse/ClickHouse/pull/51209) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix a crash with compiled expressions [#51231](https://github.com/ClickHouse/ClickHouse/pull/51231) ([LiuNeng](https://github.com/liuneng1994)). +* Fix use-after-free in StorageURL when switching URLs [#51260](https://github.com/ClickHouse/ClickHouse/pull/51260) ([Michael Kolupaev](https://github.com/al13n321)). +* Updated check for parameterized view [#51272](https://github.com/ClickHouse/ClickHouse/pull/51272) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix multiple writing of same file to backup [#51299](https://github.com/ClickHouse/ClickHouse/pull/51299) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix fuzzer failure in ActionsDAG [#51301](https://github.com/ClickHouse/ClickHouse/pull/51301) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove garbage from function `transform` [#51350](https://github.com/ClickHouse/ClickHouse/pull/51350) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + + +### ClickHouse release 23.5, 2023-06-08 {#235} + +#### Upgrade Notes +* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `` section of the server configuration file. **Upgrade notes:** If you upgrade from versions prior to 22.9, you should either upgrade all replicas at once or disable the compression before upgrade, or upgrade through an intermediate version, where the compressed marks are supported but not enabled by default, such as 23.3. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make local object storage work consistently with s3 object storage, fix problem with append (closes [#48465](https://github.com/ClickHouse/ClickHouse/issues/48465)), make it configurable as independent storage. The change is backward incompatible because the cache on top of local object storage is not compatible to previous versions. [#48791](https://github.com/ClickHouse/ClickHouse/pull/48791) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The experimental feature "in-memory data parts" is removed. The data format is still supported, but the settings are no-op, and compact or wide parts will be used instead. This closes [#45409](https://github.com/ClickHouse/ClickHouse/issues/45409). [#49429](https://github.com/ClickHouse/ClickHouse/pull/49429) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Changed default values of settings `parallelize_output_from_storages` and `input_format_parquet_preserve_order`. This allows ClickHouse to reorder rows when reading from files (e.g. CSV or Parquet), greatly improving performance in many cases. To restore the old behavior of preserving order, use `parallelize_output_from_storages = 0`, `input_format_parquet_preserve_order = 1`. [#49479](https://github.com/ClickHouse/ClickHouse/pull/49479) ([Michael Kolupaev](https://github.com/al13n321)). +* Make projections production-ready. Add the `optimize_use_projections` setting to control whether the projections will be selected for SELECT queries. The setting `allow_experimental_projection_optimization` is obsolete and does nothing. [#49719](https://github.com/ClickHouse/ClickHouse/pull/49719) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Mark `joinGet` as non-deterministic (so as `dictGet`). It allows using them in mutations without an extra setting. [#49843](https://github.com/ClickHouse/ClickHouse/pull/49843) ([Azat Khuzhin](https://github.com/azat)). +* Revert the "`groupArray` returns cannot be nullable" change (due to binary compatibility breakage for `groupArray`/`groupArrayLast`/`groupArraySample` over `Nullable` types, which likely will lead to `TOO_LARGE_ARRAY_SIZE` or `CANNOT_READ_ALL_DATA`). [#49971](https://github.com/ClickHouse/ClickHouse/pull/49971) ([Azat Khuzhin](https://github.com/azat)). +* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. If you update from version prior to 22.12, we recommend to set this flag to `false` until update is finished. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)). + +#### New Feature +* Added storage engine AzureBlobStorage and azureBlobStorage table function. The supported set of features is very similar to storage/table function S3 [#50604] (https://github.com/ClickHouse/ClickHouse/pull/50604) ([alesapin](https://github.com/alesapin)) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni). +* Added native ClickHouse Keeper CLI Client, it is available as `clickhouse keeper-client` [#47414](https://github.com/ClickHouse/ClickHouse/pull/47414) ([pufit](https://github.com/pufit)). +* Add `urlCluster` table function. Refactor all *Cluster table functions to reduce code duplication. Make schema inference work for all possible *Cluster function signatures and for named collections. Closes [#38499](https://github.com/ClickHouse/ClickHouse/issues/38499). [#45427](https://github.com/ClickHouse/ClickHouse/pull/45427) ([attack204](https://github.com/attack204)), Pavel Kruglov. +* The query cache can now be used for production workloads. [#47977](https://github.com/ClickHouse/ClickHouse/pull/47977) ([Robert Schulze](https://github.com/rschu1ze)). The query cache can now support queries with totals and extremes modifier. [#48853](https://github.com/ClickHouse/ClickHouse/pull/48853) ([Robert Schulze](https://github.com/rschu1ze)). Make `allow_experimental_query_cache` setting as obsolete for backward-compatibility. It was removed in https://github.com/ClickHouse/ClickHouse/pull/47977. [#49934](https://github.com/ClickHouse/ClickHouse/pull/49934) ([Timur Solodovnikov](https://github.com/tsolodov)). +* Geographical data types (`Point`, `Ring`, `Polygon`, and `MultiPolygon`) are production-ready. [#50022](https://github.com/ClickHouse/ClickHouse/pull/50022) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add schema inference to PostgreSQL, MySQL, MeiliSearch, and SQLite table engines. Closes [#49972](https://github.com/ClickHouse/ClickHouse/issues/49972). [#50000](https://github.com/ClickHouse/ClickHouse/pull/50000) ([Nikolay Degterinsky](https://github.com/evillique)). +* Password type in queries like `CREATE USER u IDENTIFIED BY 'p'` will be automatically set according to the setting `default_password_type` in the `config.xml` on the server. Closes [#42915](https://github.com/ClickHouse/ClickHouse/issues/42915). [#44674](https://github.com/ClickHouse/ClickHouse/pull/44674) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add bcrypt password authentication type. Closes [#34599](https://github.com/ClickHouse/ClickHouse/issues/34599). [#44905](https://github.com/ClickHouse/ClickHouse/pull/44905) ([Nikolay Degterinsky](https://github.com/evillique)). +* Introduces new keyword `INTO OUTFILE 'file.txt' APPEND`. [#48880](https://github.com/ClickHouse/ClickHouse/pull/48880) ([alekar](https://github.com/alekar)). +* Added `system.zookeeper_connection` table that shows information about Keeper connections. [#45245](https://github.com/ClickHouse/ClickHouse/pull/45245) ([mateng915](https://github.com/mateng0915)). +* Add new function `generateRandomStructure` that generates random table structure. It can be used in combination with table function `generateRandom`. [#47409](https://github.com/ClickHouse/ClickHouse/pull/47409) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow the use of `CASE` without an `ELSE` branch and extended `transform` to deal with more types. Also fix some issues that made transform() return incorrect results when decimal types were mixed with other numeric types. [#48300](https://github.com/ClickHouse/ClickHouse/pull/48300) ([Salvatore Mesoraca](https://github.com/aiven-sal)). This closes #2655. This closes #9596. This closes #38666. +* Added [server-side encryption using KMS keys](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html) with S3 tables, and the `header` setting with S3 disks. Closes [#48723](https://github.com/ClickHouse/ClickHouse/issues/48723). [#48724](https://github.com/ClickHouse/ClickHouse/pull/48724) ([Johann Gan](https://github.com/johanngan)). +* Add MemoryTracker for the background tasks (merges and mutation). Introduces `merges_mutations_memory_usage_soft_limit` and `merges_mutations_memory_usage_to_ram_ratio` settings that represent the soft memory limit for merges and mutations. If this limit is reached ClickHouse won't schedule new merge or mutation tasks. Also `MergesMutationsMemoryTracking` metric is introduced to allow observing current memory usage of background tasks. Resubmit [#46089](https://github.com/ClickHouse/ClickHouse/issues/46089). Closes [#48774](https://github.com/ClickHouse/ClickHouse/issues/48774). [#48787](https://github.com/ClickHouse/ClickHouse/pull/48787) ([Dmitry Novik](https://github.com/novikd)). +* Function `dotProduct` work for array. [#49050](https://github.com/ClickHouse/ClickHouse/pull/49050) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Support statement `SHOW INDEX` to improve compatibility with MySQL. [#49158](https://github.com/ClickHouse/ClickHouse/pull/49158) ([Robert Schulze](https://github.com/rschu1ze)). +* Add virtual column `_file` and `_path` support to table function `url`. - Improve error message for table function `url`. - resolves [#49231](https://github.com/ClickHouse/ClickHouse/issues/49231) - resolves [#49232](https://github.com/ClickHouse/ClickHouse/issues/49232). [#49356](https://github.com/ClickHouse/ClickHouse/pull/49356) ([Ziyi Tan](https://github.com/Ziy1-Tan)). +* Adding the `grants` field in the users.xml file, which allows specifying grants for users. [#49381](https://github.com/ClickHouse/ClickHouse/pull/49381) ([pufit](https://github.com/pufit)). +* Support full/right join by using grace hash join algorithm. [#49483](https://github.com/ClickHouse/ClickHouse/pull/49483) ([lgbo](https://github.com/lgbo-ustc)). +* `WITH FILL` modifier groups filling by sorting prefix. Controlled by `use_with_fill_by_sorting_prefix` setting (enabled by default). Related to [#33203](https://github.com/ClickHouse/ClickHouse/issues/33203)#issuecomment-1418736794. [#49503](https://github.com/ClickHouse/ClickHouse/pull/49503) ([Igor Nikonov](https://github.com/devcrafter)). +* Clickhouse-client now accepts queries after "--multiquery" when "--query" (or "-q") is absent. example: clickhouse-client --multiquery "select 1; select 2;". [#49870](https://github.com/ClickHouse/ClickHouse/pull/49870) ([Alexey Gerasimchuk](https://github.com/Demilivor)). +* Add separate `handshake_timeout` for receiving Hello packet from replica. Closes [#48854](https://github.com/ClickHouse/ClickHouse/issues/48854). [#49948](https://github.com/ClickHouse/ClickHouse/pull/49948) ([Kruglov Pavel](https://github.com/Avogar)). +* Added a function "space" which repeats a space as many times as specified. [#50103](https://github.com/ClickHouse/ClickHouse/pull/50103) ([Robert Schulze](https://github.com/rschu1ze)). +* Added --input_format_csv_trim_whitespaces option. [#50215](https://github.com/ClickHouse/ClickHouse/pull/50215) ([Alexey Gerasimchuk](https://github.com/Demilivor)). +* Allow the `dictGetAll` function for regexp tree dictionaries to return values from multiple matches as arrays. Closes [#50254](https://github.com/ClickHouse/ClickHouse/issues/50254). [#50255](https://github.com/ClickHouse/ClickHouse/pull/50255) ([Johann Gan](https://github.com/johanngan)). +* Added `toLastDayOfWeek` function to round a date or a date with time up to the nearest Saturday or Sunday. [#50315](https://github.com/ClickHouse/ClickHouse/pull/50315) ([Victor Krasnov](https://github.com/sirvickr)). +* Ability to ignore a skip index by specifying `ignore_data_skipping_indices`. [#50329](https://github.com/ClickHouse/ClickHouse/pull/50329) ([Boris Kuschel](https://github.com/bkuschel)). +* Add `system.user_processes` table and `SHOW USER PROCESSES` query to show memory info and ProfileEvents on user level. [#50492](https://github.com/ClickHouse/ClickHouse/pull/50492) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Add server and format settings `display_secrets_in_show_and_select` for displaying secrets of tables, databases, table functions, and dictionaries. Add privilege `displaySecretsInShowAndSelect` controlling which users can view secrets. [#46528](https://github.com/ClickHouse/ClickHouse/pull/46528) ([Mike Kot](https://github.com/myrrc)). +* Allow to set up a ROW POLICY for all tables that belong to a DATABASE. [#47640](https://github.com/ClickHouse/ClickHouse/pull/47640) ([Ilya Golshtein](https://github.com/ilejn)). + +#### Performance Improvement +* Compress marks and primary key by default. It significantly reduces the cold query time. Upgrade notes: the support for compressed marks and primary key has been added in version 22.9. If you turned on compressed marks or primary key or installed version 23.5 or newer, which has compressed marks or primary key on by default, you will not be able to downgrade to version 22.8 or earlier. You can also explicitly disable compressed marks or primary keys by specifying the `compress_marks` and `compress_primary_key` settings in the `` section of the server configuration file. [#42587](https://github.com/ClickHouse/ClickHouse/pull/42587) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* New setting s3_max_inflight_parts_for_one_file sets the limit of concurrently loaded parts with multipart upload request in scope of one file. [#49961](https://github.com/ClickHouse/ClickHouse/pull/49961) ([Sema Checherinda](https://github.com/CheSema)). +* When reading from multiple files reduce parallel parsing threads for each file. Resolves [#42192](https://github.com/ClickHouse/ClickHouse/issues/42192). [#46661](https://github.com/ClickHouse/ClickHouse/pull/46661) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Use aggregate projection only if it reads fewer granules than normal reading. It should help in case if query hits the PK of the table, but not the projection. Fixes [#49150](https://github.com/ClickHouse/ClickHouse/issues/49150). [#49417](https://github.com/ClickHouse/ClickHouse/pull/49417) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not store blocks in `ANY` hash join if nothing is inserted. [#48633](https://github.com/ClickHouse/ClickHouse/pull/48633) ([vdimir](https://github.com/vdimir)). +* Fixes aggregate combinator `-If` when JIT compiled, and enable JIT compilation for aggregate functions. Closes [#48120](https://github.com/ClickHouse/ClickHouse/issues/48120). [#49083](https://github.com/ClickHouse/ClickHouse/pull/49083) ([Igor Nikonov](https://github.com/devcrafter)). +* For reading from remote tables we use smaller tasks (instead of reading the whole part) to make tasks stealing work * task size is determined by size of columns to read * always use 1mb buffers for reading from s3 * boundaries of cache segments aligned to 1mb so they have decent size even with small tasks. it also should prevent fragmentation. [#49287](https://github.com/ClickHouse/ClickHouse/pull/49287) ([Nikita Taranov](https://github.com/nickitat)). +* Introduced settings: - `merge_max_block_size_bytes` to limit the amount of memory used for background operations. - `vertical_merge_algorithm_min_bytes_to_activate` to add another condition to activate vertical merges. [#49313](https://github.com/ClickHouse/ClickHouse/pull/49313) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Default size of a read buffer for reading from local filesystem changed to a slightly better value. Also two new settings are introduced: `max_read_buffer_size_local_fs` and `max_read_buffer_size_remote_fs`. [#49321](https://github.com/ClickHouse/ClickHouse/pull/49321) ([Nikita Taranov](https://github.com/nickitat)). +* Improve memory usage and speed of `SPARSE_HASHED`/`HASHED` dictionaries (e.g. `SPARSE_HASHED` now eats 2.6x less memory, and is ~2x faster). [#49380](https://github.com/ClickHouse/ClickHouse/pull/49380) ([Azat Khuzhin](https://github.com/azat)). +* Optimize the `system.query_log` and `system.query_thread_log` tables by applying `LowCardinality` when appropriate. The queries over these tables will be faster. [#49530](https://github.com/ClickHouse/ClickHouse/pull/49530) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Better performance when reading local `Parquet` files (through parallel reading). [#49539](https://github.com/ClickHouse/ClickHouse/pull/49539) ([Michael Kolupaev](https://github.com/al13n321)). +* Improve the performance of `RIGHT/FULL JOIN` by up to 2 times in certain scenarios, especially when joining a small left table with a large right table. [#49585](https://github.com/ClickHouse/ClickHouse/pull/49585) ([lgbo](https://github.com/lgbo-ustc)). +* Improve performance of BLAKE3 by 11% by enabling LTO for Rust. [#49600](https://github.com/ClickHouse/ClickHouse/pull/49600) ([Azat Khuzhin](https://github.com/azat)). Now it is on par with C++. +* Optimize the structure of the `system.opentelemetry_span_log`. Use `LowCardinality` where appropriate. Although this table is generally stupid (it is using the Map data type even for common attributes), it will be slightly better. [#49647](https://github.com/ClickHouse/ClickHouse/pull/49647) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Try to reserve hash table's size in `grace_hash` join. [#49816](https://github.com/ClickHouse/ClickHouse/pull/49816) ([lgbo](https://github.com/lgbo-ustc)). +* Parallel merge of `uniqExactIf` states. Closes [#49885](https://github.com/ClickHouse/ClickHouse/issues/49885). [#50285](https://github.com/ClickHouse/ClickHouse/pull/50285) ([flynn](https://github.com/ucasfl)). +* Keeper improvement: add `CheckNotExists` request to Keeper, which allows to improve the performance of Replicated tables. [#48897](https://github.com/ClickHouse/ClickHouse/pull/48897) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper performance improvements: avoid serializing same request twice while processing. Cache deserialization results of large requests. Controlled by new coordination setting `min_request_size_for_cache`. [#49004](https://github.com/ClickHouse/ClickHouse/pull/49004) ([Antonio Andelic](https://github.com/antonio2368)). +* Reduced number of `List` ZooKeeper requests when selecting parts to merge and a lot of partitions do not have anything to merge. [#49637](https://github.com/ClickHouse/ClickHouse/pull/49637) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Rework locking in the FS cache [#44985](https://github.com/ClickHouse/ClickHouse/pull/44985) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable pure parallel replicas if trivial count optimization is possible. [#50594](https://github.com/ClickHouse/ClickHouse/pull/50594) ([Raúl Marín](https://github.com/Algunenano)). +* Don't send head request for all keys in Iceberg schema inference, only for keys that are used for reaing data. [#50203](https://github.com/ClickHouse/ClickHouse/pull/50203) ([Kruglov Pavel](https://github.com/Avogar)). +* Setting `enable_memory_bound_merging_of_aggregation_results` is enabled by default. [#50319](https://github.com/ClickHouse/ClickHouse/pull/50319) ([Nikita Taranov](https://github.com/nickitat)). + +#### Experimental Feature +* `DEFLATE_QPL` codec lower the minimum simd version to SSE 4.2. [doc change in qpl](https://github.com/intel/qpl/commit/3f8f5cea27739f5261e8fd577dc233ffe88bf679) - Intel® QPL relies on a run-time kernels dispatcher and cpuid check to choose the best available implementation(sse/avx2/avx512) - restructured cmakefile for qpl build in clickhouse to align with latest upstream qpl. [#49811](https://github.com/ClickHouse/ClickHouse/pull/49811) ([jasperzhu](https://github.com/jinjunzh)). +* Add initial support to do JOINs with pure parallel replicas. [#49544](https://github.com/ClickHouse/ClickHouse/pull/49544) ([Raúl Marín](https://github.com/Algunenano)). +* More parallelism on `Outdated` parts removal with "zero-copy replication". [#49630](https://github.com/ClickHouse/ClickHouse/pull/49630) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Parallel Replicas: 1) Fixed an error `NOT_FOUND_COLUMN_IN_BLOCK` in case of using parallel replicas with non-replicated storage with disabled setting `parallel_replicas_for_non_replicated_merge_tree` 2) Now `allow_experimental_parallel_reading_from_replicas` have 3 possible values - 0, 1 and 2. 0 - disabled, 1 - enabled, silently disable them in case of failure (in case of FINAL or JOIN), 2 - enabled, throw an exception in case of failure. 3) If FINAL modifier is used in SELECT query and parallel replicas are enabled, ClickHouse will try to disable them if `allow_experimental_parallel_reading_from_replicas` is set to 1 and throw an exception otherwise. [#50195](https://github.com/ClickHouse/ClickHouse/pull/50195) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* When parallel replicas are enabled they will always skip unavailable servers (the behavior is controlled by the setting `skip_unavailable_shards`, enabled by default and can be only disabled). This closes: [#48565](https://github.com/ClickHouse/ClickHouse/issues/48565). [#50293](https://github.com/ClickHouse/ClickHouse/pull/50293) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). + +#### Improvement +* The `BACKUP` command will not decrypt data from encrypted disks while making a backup. Instead the data will be stored in a backup in encrypted form. Such backups can be restored only to an encrypted disk with the same (or extended) list of encryption keys. [#48896](https://github.com/ClickHouse/ClickHouse/pull/48896) ([Vitaly Baranov](https://github.com/vitlibar)). +* Added possibility to use temporary tables in FROM part of ATTACH PARTITION FROM and REPLACE PARTITION FROM. [#49436](https://github.com/ClickHouse/ClickHouse/pull/49436) ([Roman Vasin](https://github.com/rvasin)). +* Added setting `async_insert` for `MergeTree` tables. It has the same meaning as query-level setting `async_insert` and enables asynchronous inserts for specific table. Note: it doesn't take effect for insert queries from `clickhouse-client`, use query-level setting in that case. [#49122](https://github.com/ClickHouse/ClickHouse/pull/49122) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for size suffixes in quota creation statement parameters. [#49087](https://github.com/ClickHouse/ClickHouse/pull/49087) ([Eridanus](https://github.com/Eridanus117)). +* Extend `first_value` and `last_value` to accept NULL. [#46467](https://github.com/ClickHouse/ClickHouse/pull/46467) ([lgbo](https://github.com/lgbo-ustc)). +* Add alias `str_to_map` and `mapFromString` for `extractKeyValuePairs`. closes https://github.com/clickhouse/clickhouse/issues/47185. [#49466](https://github.com/ClickHouse/ClickHouse/pull/49466) ([flynn](https://github.com/ucasfl)). +* Add support for CGroup version 2 for asynchronous metrics about the memory usage and availability. This closes [#37983](https://github.com/ClickHouse/ClickHouse/issues/37983). [#45999](https://github.com/ClickHouse/ClickHouse/pull/45999) ([sichenzhao](https://github.com/sichenzhao)). +* Cluster table functions should always skip unavailable shards. close [#46314](https://github.com/ClickHouse/ClickHouse/issues/46314). [#46765](https://github.com/ClickHouse/ClickHouse/pull/46765) ([zk_kiger](https://github.com/zk-kiger)). +* Allow CSV file to contain empty columns in its header. [#47496](https://github.com/ClickHouse/ClickHouse/pull/47496) ([你不要过来啊](https://github.com/iiiuwioajdks)). +* Add Google Cloud Storage S3 compatible table function `gcs`. Like the `oss` and `cosn` functions, it is just an alias over the `s3` table function, and it does not bring any new features. [#47815](https://github.com/ClickHouse/ClickHouse/pull/47815) ([Kuba Kaflik](https://github.com/jkaflik)). +* Add ability to use strict parts size for S3 (compatibility with CloudFlare R2 S3 Storage). [#48492](https://github.com/ClickHouse/ClickHouse/pull/48492) ([Azat Khuzhin](https://github.com/azat)). +* Added new columns with info about `Replicated` database replicas to `system.clusters`: `database_shard_name`, `database_replica_name`, `is_active`. Added an optional `FROM SHARD` clause to `SYSTEM DROP DATABASE REPLICA` query. [#48548](https://github.com/ClickHouse/ClickHouse/pull/48548) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add a new column `zookeeper_name` in system.replicas, to indicate on which (auxiliary) zookeeper cluster the replicated table's metadata is stored. [#48549](https://github.com/ClickHouse/ClickHouse/pull/48549) ([cangyin](https://github.com/cangyin)). +* `IN` operator support the comparison of `Date` and `Date32`. Closes [#48736](https://github.com/ClickHouse/ClickHouse/issues/48736). [#48806](https://github.com/ClickHouse/ClickHouse/pull/48806) ([flynn](https://github.com/ucasfl)). +* Support for erasure codes in `HDFS`, author: @M1eyu2018, @tomscut. [#48833](https://github.com/ClickHouse/ClickHouse/pull/48833) ([M1eyu](https://github.com/M1eyu2018)). +* Implement SYSTEM DROP REPLICA from auxiliary ZooKeeper clusters, may be close [#48931](https://github.com/ClickHouse/ClickHouse/issues/48931). [#48932](https://github.com/ClickHouse/ClickHouse/pull/48932) ([wangxiaobo](https://github.com/wzb5212)). +* Add Array data type to MongoDB. Closes [#48598](https://github.com/ClickHouse/ClickHouse/issues/48598). [#48983](https://github.com/ClickHouse/ClickHouse/pull/48983) ([Nikolay Degterinsky](https://github.com/evillique)). +* Support storing `Interval` data types in tables. [#49085](https://github.com/ClickHouse/ClickHouse/pull/49085) ([larryluogit](https://github.com/larryluogit)). +* Allow using `ntile` window function without explicit window frame definition: `ntile(3) OVER (ORDER BY a)`, close [#46763](https://github.com/ClickHouse/ClickHouse/issues/46763). [#49093](https://github.com/ClickHouse/ClickHouse/pull/49093) ([vdimir](https://github.com/vdimir)). +* Added settings (`number_of_mutations_to_delay`, `number_of_mutations_to_throw`) to delay or throw `ALTER` queries that create mutations (`ALTER UPDATE`, `ALTER DELETE`, `ALTER MODIFY COLUMN`, ...) in case when table already has a lot of unfinished mutations. [#49117](https://github.com/ClickHouse/ClickHouse/pull/49117) ([Anton Popov](https://github.com/CurtizJ)). +* Catch exception from `create_directories` in filesystem cache. [#49203](https://github.com/ClickHouse/ClickHouse/pull/49203) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Copies embedded examples to a new field `example` in `system.functions` to supplement the field `description`. [#49222](https://github.com/ClickHouse/ClickHouse/pull/49222) ([Dan Roscigno](https://github.com/DanRoscigno)). +* Enable connection options for the MongoDB dictionary. Example: ``` xml localhost 27017 test dictionary_source ssl=true ``` ### Documentation entry for user-facing changes. [#49225](https://github.com/ClickHouse/ClickHouse/pull/49225) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Added an alias `asymptotic` for `asymp` computational method for `kolmogorovSmirnovTest`. Improved documentation. [#49286](https://github.com/ClickHouse/ClickHouse/pull/49286) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Aggregation function groupBitAnd/Or/Xor now work on signed integer data. This makes them consistent with the behavior of scalar functions bitAnd/Or/Xor. [#49292](https://github.com/ClickHouse/ClickHouse/pull/49292) ([exmy](https://github.com/exmy)). +* Split function-documentation into more fine-granular fields. [#49300](https://github.com/ClickHouse/ClickHouse/pull/49300) ([Robert Schulze](https://github.com/rschu1ze)). +* Use multiple threads shared between all tables within a server to load outdated data parts. The the size of the pool and its queue is controlled by `max_outdated_parts_loading_thread_pool_size` and `outdated_part_loading_thread_pool_queue_size` settings. [#49317](https://github.com/ClickHouse/ClickHouse/pull/49317) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Don't overestimate the size of processed data for `LowCardinality` columns when they share dictionaries between blocks. This closes [#49322](https://github.com/ClickHouse/ClickHouse/issues/49322). See also [#48745](https://github.com/ClickHouse/ClickHouse/issues/48745). [#49323](https://github.com/ClickHouse/ClickHouse/pull/49323) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Parquet writer now uses reasonable row group size when invoked through `OUTFILE`. [#49325](https://github.com/ClickHouse/ClickHouse/pull/49325) ([Michael Kolupaev](https://github.com/al13n321)). +* Allow restricted keywords like `ARRAY` as an alias if the alias is quoted. Closes [#49324](https://github.com/ClickHouse/ClickHouse/issues/49324). [#49360](https://github.com/ClickHouse/ClickHouse/pull/49360) ([Nikolay Degterinsky](https://github.com/evillique)). +* Data parts loading and deletion jobs were moved to shared server-wide pools instead of per-table pools. Pools sizes are controlled via settings `max_active_parts_loading_thread_pool_size`, `max_outdated_parts_loading_thread_pool_size` and `max_parts_cleaning_thread_pool_size` in top-level config. Table-level settings `max_part_loading_threads` and `max_part_removal_threads` became obsolete. [#49474](https://github.com/ClickHouse/ClickHouse/pull/49474) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow `?password=pass` in URL of the Play UI. Password is replaced in browser history. [#49505](https://github.com/ClickHouse/ClickHouse/pull/49505) ([Mike Kot](https://github.com/myrrc)). +* Allow reading zero-size objects from remote filesystems. (because empty files are not backup'd, so we might end up with zero blobs in metadata file). Closes [#49480](https://github.com/ClickHouse/ClickHouse/issues/49480). [#49519](https://github.com/ClickHouse/ClickHouse/pull/49519) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Attach thread MemoryTracker to `total_memory_tracker` after `ThreadGroup` detached. [#49527](https://github.com/ClickHouse/ClickHouse/pull/49527) ([Dmitry Novik](https://github.com/novikd)). +* Fix parameterized views when a query parameter is used multiple times in the query. [#49556](https://github.com/ClickHouse/ClickHouse/pull/49556) ([Azat Khuzhin](https://github.com/azat)). +* Release memory allocated for the last sent ProfileEvents snapshot in the context of a query. Followup [#47564](https://github.com/ClickHouse/ClickHouse/issues/47564). [#49561](https://github.com/ClickHouse/ClickHouse/pull/49561) ([Dmitry Novik](https://github.com/novikd)). +* Function "makeDate" now provides a MySQL-compatible overload (year & day of the year argument). [#49603](https://github.com/ClickHouse/ClickHouse/pull/49603) ([Robert Schulze](https://github.com/rschu1ze)). +* Support `dictionary` table function for `RegExpTreeDictionary`. [#49666](https://github.com/ClickHouse/ClickHouse/pull/49666) ([Han Fei](https://github.com/hanfei1991)). +* Added weighted fair IO scheduling policy. Added dynamic resource manager, which allows IO scheduling hierarchy to be updated in runtime w/o server restarts. [#49671](https://github.com/ClickHouse/ClickHouse/pull/49671) ([Sergei Trifonov](https://github.com/serxa)). +* Add compose request after multipart upload to GCS. This enables the usage of copy operation on objects uploaded with the multipart upload. It's recommended to set `s3_strict_upload_part_size` to some value because compose request can fail on objects created with parts of different sizes. [#49693](https://github.com/ClickHouse/ClickHouse/pull/49693) ([Antonio Andelic](https://github.com/antonio2368)). +* For the `extractKeyValuePairs` function: improve the "best-effort" parsing logic to accept `key_value_delimiter` as a valid part of the value. This also simplifies branching and might even speed up things a bit. [#49760](https://github.com/ClickHouse/ClickHouse/pull/49760) ([Arthur Passos](https://github.com/arthurpassos)). +* Add `initial_query_id` field for system.processors_profile_log [#49777](https://github.com/ClickHouse/ClickHouse/pull/49777) ([helifu](https://github.com/helifu)). +* System log tables can now have custom sorting keys. [#49778](https://github.com/ClickHouse/ClickHouse/pull/49778) ([helifu](https://github.com/helifu)). +* A new field `partitions` to `system.query_log` is used to indicate which partitions are participating in the calculation. [#49779](https://github.com/ClickHouse/ClickHouse/pull/49779) ([helifu](https://github.com/helifu)). +* Added `enable_the_endpoint_id_with_zookeeper_name_prefix` setting for `ReplicatedMergeTree` (disabled by default). When enabled, it adds ZooKeeper cluster name to table's interserver communication endpoint. It avoids `Duplicate interserver IO endpoint` errors when having replicated tables with the same path, but different auxiliary ZooKeepers. [#49780](https://github.com/ClickHouse/ClickHouse/pull/49780) ([helifu](https://github.com/helifu)). +* Add query parameters to `clickhouse-local`. Closes [#46561](https://github.com/ClickHouse/ClickHouse/issues/46561). [#49785](https://github.com/ClickHouse/ClickHouse/pull/49785) ([Nikolay Degterinsky](https://github.com/evillique)). +* Allow loading dictionaries and functions from YAML by default. In previous versions, it required editing the `dictionaries_config` or `user_defined_executable_functions_config` in the configuration file, as they expected `*.xml` files. [#49812](https://github.com/ClickHouse/ClickHouse/pull/49812) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The Kafka table engine now allows to use alias columns. [#49824](https://github.com/ClickHouse/ClickHouse/pull/49824) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Add setting to limit the max number of pairs produced by `extractKeyValuePairs`, a safeguard to avoid using way too much memory. [#49836](https://github.com/ClickHouse/ClickHouse/pull/49836) ([Arthur Passos](https://github.com/arthurpassos)). +* Add support for (an unusual) case where the arguments in the `IN` operator are single-element tuples. [#49844](https://github.com/ClickHouse/ClickHouse/pull/49844) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* `bitHammingDistance` function support `String` and `FixedString` data type. Closes [#48827](https://github.com/ClickHouse/ClickHouse/issues/48827). [#49858](https://github.com/ClickHouse/ClickHouse/pull/49858) ([flynn](https://github.com/ucasfl)). +* Fix timeout resetting errors in the client on OS X. [#49863](https://github.com/ClickHouse/ClickHouse/pull/49863) ([alekar](https://github.com/alekar)). +* Add support for big integers, such as UInt128, Int128, UInt256, and Int256 in the function `bitCount`. This enables Hamming distance over large bit masks for AI applications. [#49867](https://github.com/ClickHouse/ClickHouse/pull/49867) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fingerprints to be used instead of key IDs in encrypted disks. This simplifies the configuration of encrypted disks. [#49882](https://github.com/ClickHouse/ClickHouse/pull/49882) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add UUID data type to PostgreSQL. Closes [#49739](https://github.com/ClickHouse/ClickHouse/issues/49739). [#49894](https://github.com/ClickHouse/ClickHouse/pull/49894) ([Nikolay Degterinsky](https://github.com/evillique)). +* Function `toUnixTimestamp` now accepts `Date` and `Date32` arguments. [#49989](https://github.com/ClickHouse/ClickHouse/pull/49989) ([Victor Krasnov](https://github.com/sirvickr)). +* Charge only server memory for dictionaries. [#49995](https://github.com/ClickHouse/ClickHouse/pull/49995) ([Azat Khuzhin](https://github.com/azat)). +* The server will allow using the `SQL_*` settings such as `SQL_AUTO_IS_NULL` as no-ops for MySQL compatibility. This closes [#49927](https://github.com/ClickHouse/ClickHouse/issues/49927). [#50013](https://github.com/ClickHouse/ClickHouse/pull/50013) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Preserve initial_query_id for ON CLUSTER queries, which is useful for introspection (under `distributed_ddl_entry_format_version=5`). [#50015](https://github.com/ClickHouse/ClickHouse/pull/50015) ([Azat Khuzhin](https://github.com/azat)). +* Preserve backward incompatibility for renamed settings by using aliases (`allow_experimental_projection_optimization` for `optimize_use_projections`, `allow_experimental_lightweight_delete` for `enable_lightweight_delete`). [#50044](https://github.com/ClickHouse/ClickHouse/pull/50044) ([Azat Khuzhin](https://github.com/azat)). +* Support passing FQDN through setting my_hostname to register cluster node in keeper. Add setting of invisible to support multi compute groups. A compute group as a cluster, is invisible to other compute groups. [#50186](https://github.com/ClickHouse/ClickHouse/pull/50186) ([Yangkuan Liu](https://github.com/LiuYangkuan)). +* Fix PostgreSQL reading all the data even though `LIMIT n` could be specified. [#50187](https://github.com/ClickHouse/ClickHouse/pull/50187) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add new profile events for queries with subqueries (`QueriesWithSubqueries`/`SelectQueriesWithSubqueries`/`InsertQueriesWithSubqueries`). [#50204](https://github.com/ClickHouse/ClickHouse/pull/50204) ([Azat Khuzhin](https://github.com/azat)). +* Adding the roles field in the users.xml file, which allows specifying roles with grants via a config file. [#50278](https://github.com/ClickHouse/ClickHouse/pull/50278) ([pufit](https://github.com/pufit)). +* Report `CGroupCpuCfsPeriod` and `CGroupCpuCfsQuota` in AsynchronousMetrics. - Respect cgroup v2 memory limits during server startup. [#50379](https://github.com/ClickHouse/ClickHouse/pull/50379) ([alekar](https://github.com/alekar)). +* Add a signal handler for SIGQUIT to work the same way as SIGINT. Closes [#50298](https://github.com/ClickHouse/ClickHouse/issues/50298). [#50435](https://github.com/ClickHouse/ClickHouse/pull/50435) ([Nikolay Degterinsky](https://github.com/evillique)). +* In case JSON parse fails due to the large size of the object output the last position to allow debugging. [#50474](https://github.com/ClickHouse/ClickHouse/pull/50474) ([Valentin Alexeev](https://github.com/valentinalexeev)). +* Support decimals with not fixed size. Closes [#49130](https://github.com/ClickHouse/ClickHouse/issues/49130). [#50586](https://github.com/ClickHouse/ClickHouse/pull/50586) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Build/Testing/Packaging Improvement +* New and improved `keeper-bench`. Everything can be customized from YAML/XML file: - request generator - each type of request generator can have a specific set of fields - multi requests can be generated just by doing the same under `multi` key - for each request or subrequest in multi a `weight` field can be defined to control distribution - define trees that need to be setup for a test run - hosts can be defined with all timeouts customizable and it's possible to control how many sessions to generate for each host - integers defined with `min_value` and `max_value` fields are random number generators. [#48547](https://github.com/ClickHouse/ClickHouse/pull/48547) ([Antonio Andelic](https://github.com/antonio2368)). +* Io_uring is not supported on macos, don't choose it when running tests on local to avoid occasional failures. [#49250](https://github.com/ClickHouse/ClickHouse/pull/49250) ([Frank Chen](https://github.com/FrankChen021)). +* Support named fault injection for testing. [#49361](https://github.com/ClickHouse/ClickHouse/pull/49361) ([Han Fei](https://github.com/hanfei1991)). +* Allow running ClickHouse in the OS where the `prctl` (process control) syscall is not available, such as AWS Lambda. [#49538](https://github.com/ClickHouse/ClickHouse/pull/49538) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fixed the issue of build conflict between contrib/isa-l and isa-l in qpl [49296](https://github.com/ClickHouse/ClickHouse/issues/49296). [#49584](https://github.com/ClickHouse/ClickHouse/pull/49584) ([jasperzhu](https://github.com/jinjunzh)). +* Utilities are now only build if explicitly requested ("-DENABLE_UTILS=1") instead of by default, this reduces link times in typical development builds. [#49620](https://github.com/ClickHouse/ClickHouse/pull/49620) ([Robert Schulze](https://github.com/rschu1ze)). +* Pull build description of idxd-config into a separate CMake file to avoid accidental removal in future. [#49651](https://github.com/ClickHouse/ClickHouse/pull/49651) ([jasperzhu](https://github.com/jinjunzh)). +* Add CI check with an enabled analyzer in the master. Follow-up [#49562](https://github.com/ClickHouse/ClickHouse/issues/49562). [#49668](https://github.com/ClickHouse/ClickHouse/pull/49668) ([Dmitry Novik](https://github.com/novikd)). +* Switch to LLVM/clang 16. [#49678](https://github.com/ClickHouse/ClickHouse/pull/49678) ([Azat Khuzhin](https://github.com/azat)). +* Allow building ClickHouse with clang-17. [#49851](https://github.com/ClickHouse/ClickHouse/pull/49851) ([Alexey Milovidov](https://github.com/alexey-milovidov)). [#50410](https://github.com/ClickHouse/ClickHouse/pull/50410) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* ClickHouse is now easier to be integrated into other cmake projects. [#49991](https://github.com/ClickHouse/ClickHouse/pull/49991) ([Amos Bird](https://github.com/amosbird)). (Which is strongly discouraged - Alexey Milovidov). +* Fix strange additional QEMU logging after [#47151](https://github.com/ClickHouse/ClickHouse/issues/47151), see https://s3.amazonaws.com/clickhouse-test-reports/50078/a4743996ee4f3583884d07bcd6501df0cfdaa346/stateless_tests__release__databasereplicated__[3_4].html. [#50442](https://github.com/ClickHouse/ClickHouse/pull/50442) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* ClickHouse can work on Linux RISC-V 6.1.22. This closes [#50456](https://github.com/ClickHouse/ClickHouse/issues/50456). [#50457](https://github.com/ClickHouse/ClickHouse/pull/50457) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Bump internal protobuf to v3.18 (fixes bogus CVE-2022-1941). [#50400](https://github.com/ClickHouse/ClickHouse/pull/50400) ([Robert Schulze](https://github.com/rschu1ze)). +* Bump internal libxml2 to v2.10.4 (fixes bogus CVE-2023-28484 and bogus CVE-2023-29469). [#50402](https://github.com/ClickHouse/ClickHouse/pull/50402) ([Robert Schulze](https://github.com/rschu1ze)). +* Bump c-ares to v1.19.1 (bogus CVE-2023-32067, bogus CVE-2023-31130, bogus CVE-2023-31147). [#50403](https://github.com/ClickHouse/ClickHouse/pull/50403) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix bogus CVE-2022-2469 in libgsasl. [#50404](https://github.com/ClickHouse/ClickHouse/pull/50404) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* ActionsDAG: fix wrong optimization [#47584](https://github.com/ClickHouse/ClickHouse/pull/47584) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Correctly handle concurrent snapshots in Keeper [#48466](https://github.com/ClickHouse/ClickHouse/pull/48466) ([Antonio Andelic](https://github.com/antonio2368)). +* MergeTreeMarksLoader holds DataPart instead of DataPartStorage [#48515](https://github.com/ClickHouse/ClickHouse/pull/48515) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Sequence state fix [#48603](https://github.com/ClickHouse/ClickHouse/pull/48603) ([Ilya Golshtein](https://github.com/ilejn)). +* Back/Restore concurrency check on previous fails [#48726](https://github.com/ClickHouse/ClickHouse/pull/48726) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix Attaching a table with non-existent ZK path does not increase the ReadonlyReplica metric [#48954](https://github.com/ClickHouse/ClickHouse/pull/48954) ([wangxiaobo](https://github.com/wzb5212)). +* Fix possible terminate called for uncaught exception in some places [#49112](https://github.com/ClickHouse/ClickHouse/pull/49112) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix key not found error for queries with multiple StorageJoin [#49137](https://github.com/ClickHouse/ClickHouse/pull/49137) ([vdimir](https://github.com/vdimir)). +* Fix wrong query result when using nullable primary key [#49172](https://github.com/ClickHouse/ClickHouse/pull/49172) ([Duc Canh Le](https://github.com/canhld94)). +* Fix reinterpretAs*() on big endian machines [#49198](https://github.com/ClickHouse/ClickHouse/pull/49198) ([Suzy Wang](https://github.com/SuzyWangIBMer)). +* (Experimental zero-copy replication) Lock zero copy parts more atomically [#49211](https://github.com/ClickHouse/ClickHouse/pull/49211) ([alesapin](https://github.com/alesapin)). +* Fix race on Outdated parts loading [#49223](https://github.com/ClickHouse/ClickHouse/pull/49223) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix all key value is null and group use rollup return wrong answer [#49282](https://github.com/ClickHouse/ClickHouse/pull/49282) ([Shuai li](https://github.com/loneylee)). +* Fix calculating load_factor for HASHED dictionaries with SHARDS [#49319](https://github.com/ClickHouse/ClickHouse/pull/49319) ([Azat Khuzhin](https://github.com/azat)). +* Disallow configuring compression CODECs for alias columns [#49363](https://github.com/ClickHouse/ClickHouse/pull/49363) ([Timur Solodovnikov](https://github.com/tsolodov)). +* Fix bug in removal of existing part directory [#49365](https://github.com/ClickHouse/ClickHouse/pull/49365) ([alesapin](https://github.com/alesapin)). +* Properly fix GCS when HMAC is used [#49390](https://github.com/ClickHouse/ClickHouse/pull/49390) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix fuzz bug when subquery set is not built when reading from remote() [#49425](https://github.com/ClickHouse/ClickHouse/pull/49425) ([Alexander Gololobov](https://github.com/davenger)). +* Invert `shutdown_wait_unfinished_queries` [#49427](https://github.com/ClickHouse/ClickHouse/pull/49427) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* (Experimental zero-copy replication) Fix another zero copy bug [#49473](https://github.com/ClickHouse/ClickHouse/pull/49473) ([alesapin](https://github.com/alesapin)). +* Fix postgres database setting [#49481](https://github.com/ClickHouse/ClickHouse/pull/49481) ([Mal Curtis](https://github.com/snikch)). +* Correctly handle `s3Cluster` arguments [#49490](https://github.com/ClickHouse/ClickHouse/pull/49490) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix bug in TraceCollector destructor. [#49508](https://github.com/ClickHouse/ClickHouse/pull/49508) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix AsynchronousReadIndirectBufferFromRemoteFS breaking on short seeks [#49525](https://github.com/ClickHouse/ClickHouse/pull/49525) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix dictionaries loading order [#49560](https://github.com/ClickHouse/ClickHouse/pull/49560) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Forbid the change of data type of Object('json') column [#49563](https://github.com/ClickHouse/ClickHouse/pull/49563) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix stress test (Logical error: Expected 7134 >= 11030) [#49623](https://github.com/ClickHouse/ClickHouse/pull/49623) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix bug in DISTINCT [#49628](https://github.com/ClickHouse/ClickHouse/pull/49628) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix: DISTINCT in order with zero values in non-sorted columns [#49636](https://github.com/ClickHouse/ClickHouse/pull/49636) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix one-off error in big integers found by UBSan with fuzzer [#49645](https://github.com/ClickHouse/ClickHouse/pull/49645) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix reading from sparse columns after restart [#49660](https://github.com/ClickHouse/ClickHouse/pull/49660) ([Anton Popov](https://github.com/CurtizJ)). +* Fix assert in SpanHolder::finish() with fibers [#49673](https://github.com/ClickHouse/ClickHouse/pull/49673) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix short circuit functions and mutations with sparse arguments [#49716](https://github.com/ClickHouse/ClickHouse/pull/49716) ([Anton Popov](https://github.com/CurtizJ)). +* Fix writing appended files to incremental backups [#49725](https://github.com/ClickHouse/ClickHouse/pull/49725) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix "There is no physical column _row_exists in table" error occurring during lightweight delete mutation on a table with Object column. [#49737](https://github.com/ClickHouse/ClickHouse/pull/49737) ([Alexander Gololobov](https://github.com/davenger)). +* Fix msan issue in randomStringUTF8(uneven number) [#49750](https://github.com/ClickHouse/ClickHouse/pull/49750) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix aggregate function kolmogorovSmirnovTest [#49768](https://github.com/ClickHouse/ClickHouse/pull/49768) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Fix settings aliases in native protocol [#49776](https://github.com/ClickHouse/ClickHouse/pull/49776) ([Azat Khuzhin](https://github.com/azat)). +* Fix `arrayMap` with array of tuples with single argument [#49789](https://github.com/ClickHouse/ClickHouse/pull/49789) ([Anton Popov](https://github.com/CurtizJ)). +* Fix per-query IO/BACKUPs throttling settings [#49797](https://github.com/ClickHouse/ClickHouse/pull/49797) ([Azat Khuzhin](https://github.com/azat)). +* Fix setting NULL in profile definition [#49831](https://github.com/ClickHouse/ClickHouse/pull/49831) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix a bug with projections and the aggregate_functions_null_for_empty setting (for query_plan_optimize_projection) [#49873](https://github.com/ClickHouse/ClickHouse/pull/49873) ([Amos Bird](https://github.com/amosbird)). +* Fix processing pending batch for Distributed async INSERT after restart [#49884](https://github.com/ClickHouse/ClickHouse/pull/49884) ([Azat Khuzhin](https://github.com/azat)). +* Fix assertion in CacheMetadata::doCleanup [#49914](https://github.com/ClickHouse/ClickHouse/pull/49914) ([Kseniia Sumarokova](https://github.com/kssenii)). +* fix `is_prefix` in OptimizeRegularExpression [#49919](https://github.com/ClickHouse/ClickHouse/pull/49919) ([Han Fei](https://github.com/hanfei1991)). +* Fix metrics `WriteBufferFromS3Bytes`, `WriteBufferFromS3Microseconds` and `WriteBufferFromS3RequestsErrors` [#49930](https://github.com/ClickHouse/ClickHouse/pull/49930) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Fix IPv6 encoding in protobuf [#49933](https://github.com/ClickHouse/ClickHouse/pull/49933) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix possible Logical error on bad Nullable parsing for text formats [#49960](https://github.com/ClickHouse/ClickHouse/pull/49960) ([Kruglov Pavel](https://github.com/Avogar)). +* Add setting output_format_parquet_compliant_nested_types to produce more compatible Parquet files [#50001](https://github.com/ClickHouse/ClickHouse/pull/50001) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix logical error in stress test "Not enough space to add ..." [#50021](https://github.com/ClickHouse/ClickHouse/pull/50021) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Avoid deadlock when starting table in attach thread of `ReplicatedMergeTree` [#50026](https://github.com/ClickHouse/ClickHouse/pull/50026) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix assert in SpanHolder::finish() with fibers attempt 2 [#50034](https://github.com/ClickHouse/ClickHouse/pull/50034) ([Kruglov Pavel](https://github.com/Avogar)). +* Add proper escaping for DDL OpenTelemetry context serialization [#50045](https://github.com/ClickHouse/ClickHouse/pull/50045) ([Azat Khuzhin](https://github.com/azat)). +* Fix reporting broken projection parts [#50052](https://github.com/ClickHouse/ClickHouse/pull/50052) ([Amos Bird](https://github.com/amosbird)). +* JIT compilation not equals NaN fix [#50056](https://github.com/ClickHouse/ClickHouse/pull/50056) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix crashing in case of Replicated database without arguments [#50058](https://github.com/ClickHouse/ClickHouse/pull/50058) ([Azat Khuzhin](https://github.com/azat)). +* Fix crash with `multiIf` and constant condition and nullable arguments [#50123](https://github.com/ClickHouse/ClickHouse/pull/50123) ([Anton Popov](https://github.com/CurtizJ)). +* Fix invalid index analysis for date related keys [#50153](https://github.com/ClickHouse/ClickHouse/pull/50153) ([Amos Bird](https://github.com/amosbird)). +* do not allow modify order by when there are no order by cols [#50154](https://github.com/ClickHouse/ClickHouse/pull/50154) ([Han Fei](https://github.com/hanfei1991)). +* Fix broken index analysis when binary operator contains a null constant argument [#50177](https://github.com/ClickHouse/ClickHouse/pull/50177) ([Amos Bird](https://github.com/amosbird)). +* clickhouse-client: disallow usage of `--query` and `--queries-file` at the same time [#50210](https://github.com/ClickHouse/ClickHouse/pull/50210) ([Alexey Gerasimchuk](https://github.com/Demilivor)). +* Fix UB for INTO OUTFILE extensions (APPEND / AND STDOUT) and WATCH EVENTS [#50216](https://github.com/ClickHouse/ClickHouse/pull/50216) ([Azat Khuzhin](https://github.com/azat)). +* Fix skipping spaces at end of row in CustomSeparatedIgnoreSpaces format [#50224](https://github.com/ClickHouse/ClickHouse/pull/50224) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix iceberg metadata parsing [#50232](https://github.com/ClickHouse/ClickHouse/pull/50232) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix nested distributed SELECT in WITH clause [#50234](https://github.com/ClickHouse/ClickHouse/pull/50234) ([Azat Khuzhin](https://github.com/azat)). +* Fix msan issue in keyed siphash [#50245](https://github.com/ClickHouse/ClickHouse/pull/50245) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix bugs in Poco sockets in non-blocking mode, use true non-blocking sockets [#50252](https://github.com/ClickHouse/ClickHouse/pull/50252) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix checksum calculation for backup entries [#50264](https://github.com/ClickHouse/ClickHouse/pull/50264) ([Vitaly Baranov](https://github.com/vitlibar)). +* Comparison functions NaN fix [#50287](https://github.com/ClickHouse/ClickHouse/pull/50287) ([Maksim Kita](https://github.com/kitaisreal)). +* JIT aggregation nullable key fix [#50291](https://github.com/ClickHouse/ClickHouse/pull/50291) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix clickhouse-local crashing when writing empty Arrow or Parquet output [#50328](https://github.com/ClickHouse/ClickHouse/pull/50328) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix crash when Pool::Entry::disconnect() is called [#50334](https://github.com/ClickHouse/ClickHouse/pull/50334) ([Val Doroshchuk](https://github.com/valbok)). +* Improved fetch part by holding directory lock longer [#50339](https://github.com/ClickHouse/ClickHouse/pull/50339) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix bitShift* functions with both constant arguments [#50343](https://github.com/ClickHouse/ClickHouse/pull/50343) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix Keeper deadlock on exception when preprocessing requests. [#50387](https://github.com/ClickHouse/ClickHouse/pull/50387) ([frinkr](https://github.com/frinkr)). +* Fix hashing of const integer values [#50421](https://github.com/ClickHouse/ClickHouse/pull/50421) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix merge_tree_min_rows_for_seek/merge_tree_min_bytes_for_seek for data skipping indexes [#50432](https://github.com/ClickHouse/ClickHouse/pull/50432) ([Azat Khuzhin](https://github.com/azat)). +* Limit the number of in-flight tasks for loading outdated parts [#50450](https://github.com/ClickHouse/ClickHouse/pull/50450) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Keeper fix: apply uncommitted state after snapshot install [#50483](https://github.com/ClickHouse/ClickHouse/pull/50483) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix incorrect constant folding [#50536](https://github.com/ClickHouse/ClickHouse/pull/50536) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix logical error in stress test (Not enough space to add ...) [#50583](https://github.com/ClickHouse/ClickHouse/pull/50583) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix converting Null to LowCardinality(Nullable) in values table function [#50637](https://github.com/ClickHouse/ClickHouse/pull/50637) ([Kruglov Pavel](https://github.com/Avogar)). +* Revert invalid RegExpTreeDictionary optimization [#50642](https://github.com/ClickHouse/ClickHouse/pull/50642) ([Johann Gan](https://github.com/johanngan)). + +### ClickHouse release 23.4, 2023-04-26 {#234} + +#### Backward Incompatible Change +* Formatter '%M' in function formatDateTime() now prints the month name instead of the minutes. This makes the behavior consistent with MySQL. The previous behavior can be restored using setting "formatdatetime_parsedatetime_m_is_month_name = 0". [#47246](https://github.com/ClickHouse/ClickHouse/pull/47246) ([Robert Schulze](https://github.com/rschu1ze)). +* This change makes sense only if you are using the virtual filesystem cache. If `path` in the virtual filesystem cache configuration is not empty and is not an absolute path, then it will be put in `/caches/`. [#48784](https://github.com/ClickHouse/ClickHouse/pull/48784) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Primary/secondary indices and sorting keys with identical expressions are now rejected. This behavior can be disabled using setting `allow_suspicious_indices`. [#48536](https://github.com/ClickHouse/ClickHouse/pull/48536) ([凌涛](https://github.com/lingtaolf)). + +#### New Feature +* Support new aggregate function `quantileGK`/`quantilesGK`, like [approx_percentile](https://spark.apache.org/docs/latest/api/sql/index.html#approx_percentile) in spark. Greenwald-Khanna algorithm refer to http://infolab.stanford.edu/~datar/courses/cs361a/papers/quantiles.pdf. [#46428](https://github.com/ClickHouse/ClickHouse/pull/46428) ([李扬](https://github.com/taiyang-li)). +* Add a statement `SHOW COLUMNS` which shows distilled information from system.columns. [#48017](https://github.com/ClickHouse/ClickHouse/pull/48017) ([Robert Schulze](https://github.com/rschu1ze)). +* Added `LIGHTWEIGHT` and `PULL` modifiers for `SYSTEM SYNC REPLICA` query. `LIGHTWEIGHT` version waits for fetches and drop-ranges only (merges and mutations are ignored). `PULL` version pulls new entries from ZooKeeper and does not wait for them. Fixes [#47794](https://github.com/ClickHouse/ClickHouse/issues/47794). [#48085](https://github.com/ClickHouse/ClickHouse/pull/48085) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Add `kafkaMurmurHash` function for compatibility with Kafka DefaultPartitioner. Closes [#47834](https://github.com/ClickHouse/ClickHouse/issues/47834). [#48185](https://github.com/ClickHouse/ClickHouse/pull/48185) ([Nikolay Degterinsky](https://github.com/evillique)). +* Allow to easily create a user with the same grants as the current user by using `GRANT CURRENT GRANTS`. [#48262](https://github.com/ClickHouse/ClickHouse/pull/48262) ([pufit](https://github.com/pufit)). +* Add statistical aggregate function `kolmogorovSmirnovTest`. Close [#48228](https://github.com/ClickHouse/ClickHouse/issues/48228). [#48325](https://github.com/ClickHouse/ClickHouse/pull/48325) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Added a `lost_part_count` column to the `system.replicas` table. The column value shows the total number of lost parts in the corresponding table. Value is stored in zookeeper and can be used instead of not persistent `ReplicatedDataLoss` profile event for monitoring. [#48526](https://github.com/ClickHouse/ClickHouse/pull/48526) ([Sergei Trifonov](https://github.com/serxa)). +* Add `soundex` function for compatibility. Closes [#39880](https://github.com/ClickHouse/ClickHouse/issues/39880). [#48567](https://github.com/ClickHouse/ClickHouse/pull/48567) ([FriendLey](https://github.com/FriendLey)). +* Support `Map` type for JSONExtract. [#48629](https://github.com/ClickHouse/ClickHouse/pull/48629) ([李扬](https://github.com/taiyang-li)). +* Add `PrettyJSONEachRow` format to output pretty JSON with new line delimiters and 4 space indents. [#48898](https://github.com/ClickHouse/ClickHouse/pull/48898) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `ParquetMetadata` input format to read Parquet file metadata. [#48911](https://github.com/ClickHouse/ClickHouse/pull/48911) ([Kruglov Pavel](https://github.com/Avogar)). +* Add `extractKeyValuePairs` function to extract key value pairs from strings. Input strings might contain noise (i.e. log files / do not need to be 100% formatted in key-value-pair format), the algorithm will look for key value pairs matching the arguments passed to the function. As of now, function accepts the following arguments: `data_column` (mandatory), `key_value_pair_delimiter` (defaults to `:`), `pair_delimiters` (defaults to `\space \, \;`) and `quoting_character` (defaults to double quotes). [#43606](https://github.com/ClickHouse/ClickHouse/pull/43606) ([Arthur Passos](https://github.com/arthurpassos)). +* Functions replaceOne(), replaceAll(), replaceRegexpOne() and replaceRegexpAll() can now be called with non-const pattern and replacement arguments. [#46589](https://github.com/ClickHouse/ClickHouse/pull/46589) ([Robert Schulze](https://github.com/rschu1ze)). +* Added functions to work with columns of type `Map`: `mapConcat`, `mapSort`, `mapExists`. [#48071](https://github.com/ClickHouse/ClickHouse/pull/48071) ([Anton Popov](https://github.com/CurtizJ)). + +#### Performance Improvement +* Reading files in `Parquet` format is now much faster. IO and decoding are parallelized (controlled by `max_threads` setting), and only required data ranges are read. [#47964](https://github.com/ClickHouse/ClickHouse/pull/47964) ([Michael Kolupaev](https://github.com/al13n321)). +* If we run a mutation with IN (subquery) like this: `ALTER TABLE t UPDATE col='new value' WHERE id IN (SELECT id FROM huge_table)` and the table `t` has multiple parts than for each part a set for subquery `SELECT id FROM huge_table` is built in memory. And if there are many parts then this might consume a lot of memory (and lead to an OOM) and CPU. The solution is to introduce a short-lived cache of sets that are currently being built by mutation tasks. If another task of the same mutation is executed concurrently it can look up the set in the cache, wait for it to be built and reuse it. [#46835](https://github.com/ClickHouse/ClickHouse/pull/46835) ([Alexander Gololobov](https://github.com/davenger)). +* Only check dependencies if necessary when applying `ALTER TABLE` queries. [#48062](https://github.com/ClickHouse/ClickHouse/pull/48062) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize function `mapUpdate`. [#48118](https://github.com/ClickHouse/ClickHouse/pull/48118) ([Anton Popov](https://github.com/CurtizJ)). +* Now an internal query to local replica is sent explicitly and data from it received through loopback interface. Setting `prefer_localhost_replica` is not respected for parallel replicas. This is needed for better scheduling and makes the code cleaner: the initiator is only responsible for coordinating of the reading process and merging results, continuously answering for requests while all the secondary queries read the data. Note: Using loopback interface is not so performant, otherwise some replicas could starve for tasks which could lead to even slower query execution and not utilizing all possible resources. The initialization of the coordinator is now even more lazy. All incoming requests contain the information about the reading algorithm we initialize the coordinator with it when first request comes. If any replica decides to read with a different algorithm–an exception will be thrown and a query will be aborted. [#48246](https://github.com/ClickHouse/ClickHouse/pull/48246) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Do not build set for the right side of `IN` clause with subquery when it is used only for analysis of skip indexes, and they are disabled by setting (`use_skip_indexes=0`). Previously it might affect the performance of queries. [#48299](https://github.com/ClickHouse/ClickHouse/pull/48299) ([Anton Popov](https://github.com/CurtizJ)). +* Query processing is parallelized right after reading `FROM file(...)`. Related to [#38755](https://github.com/ClickHouse/ClickHouse/issues/38755). [#48525](https://github.com/ClickHouse/ClickHouse/pull/48525) ([Igor Nikonov](https://github.com/devcrafter)). Query processing is parallelized right after reading from any data source. Affected data sources are mostly simple or external storages like table functions `url`, `file`. [#48727](https://github.com/ClickHouse/ClickHouse/pull/48727) ([Igor Nikonov](https://github.com/devcrafter)). This is controlled by the setting `parallelize_output_from_storages` which is not enabled by default. +* Lowered contention of ThreadPool mutex (may increase performance for a huge amount of small jobs). [#48750](https://github.com/ClickHouse/ClickHouse/pull/48750) ([Sergei Trifonov](https://github.com/serxa)). +* Reduce memory usage for multiple `ALTER DELETE` mutations. [#48522](https://github.com/ClickHouse/ClickHouse/pull/48522) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Remove the excessive connection attempts if the `skip_unavailable_shards` setting is enabled. [#48771](https://github.com/ClickHouse/ClickHouse/pull/48771) ([Azat Khuzhin](https://github.com/azat)). + +#### Experimental Feature +* Entries in the query cache are now squashed to max_block_size and compressed. [#45912](https://github.com/ClickHouse/ClickHouse/pull/45912) ([Robert Schulze](https://github.com/rschu1ze)). +* It is now possible to define per-user quotas in the query cache. [#48284](https://github.com/ClickHouse/ClickHouse/pull/48284) ([Robert Schulze](https://github.com/rschu1ze)). +* Some fixes for parallel replicas [#48433](https://github.com/ClickHouse/ClickHouse/pull/48433) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Implement zero-copy-replication (an experimental feature) on encrypted disks. [#48741](https://github.com/ClickHouse/ClickHouse/pull/48741) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Improvement +* Increase default value for `connect_timeout_with_failover_ms` to 1000 ms (because of adding async connections in https://github.com/ClickHouse/ClickHouse/pull/47229) . Closes [#5188](https://github.com/ClickHouse/ClickHouse/issues/5188). [#49009](https://github.com/ClickHouse/ClickHouse/pull/49009) ([Kruglov Pavel](https://github.com/Avogar)). +* Several improvements around data lakes: - Make `Iceberg` work with non-partitioned data. - Support `Iceberg` format version v2 (previously only v1 was supported) - Support reading partitioned data for `DeltaLake`/`Hudi` - Faster reading of `DeltaLake` metadata by using Delta's checkpoint files - Fixed incorrect `Hudi` reads: previously it incorrectly chose which data to read and therefore was able to read correctly only small size tables - Made these engines to pickup updates of changed data (previously the state was set on table creation) - Make proper testing for `Iceberg`/`DeltaLake`/`Hudi` using spark. [#47307](https://github.com/ClickHouse/ClickHouse/pull/47307) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add async connection to socket and async writing to socket. Make creating connections and sending query/external tables async across shards. Refactor code with fibers. Closes [#46931](https://github.com/ClickHouse/ClickHouse/issues/46931). We will be able to increase `connect_timeout_with_failover_ms` by default after this PR (https://github.com/ClickHouse/ClickHouse/issues/5188). [#47229](https://github.com/ClickHouse/ClickHouse/pull/47229) ([Kruglov Pavel](https://github.com/Avogar)). +* Support config sections `keeper`/`keeper_server` as an alternative to `zookeeper`. Close [#34766](https://github.com/ClickHouse/ClickHouse/issues/34766) , [#34767](https://github.com/ClickHouse/ClickHouse/issues/34767). [#35113](https://github.com/ClickHouse/ClickHouse/pull/35113) ([李扬](https://github.com/taiyang-li)). +* It is possible to set _secure_ flag in named_collections for a dictionary with a ClickHouse table source. Addresses [#38450](https://github.com/ClickHouse/ClickHouse/issues/38450) . [#46323](https://github.com/ClickHouse/ClickHouse/pull/46323) ([Ilya Golshtein](https://github.com/ilejn)). +* `bitCount` function support `FixedString` and `String` data type. [#49044](https://github.com/ClickHouse/ClickHouse/pull/49044) ([flynn](https://github.com/ucasfl)). +* Added configurable retries for all operations with [Zoo]Keeper for Backup queries. [#47224](https://github.com/ClickHouse/ClickHouse/pull/47224) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Enable `use_environment_credentials` for S3 by default, so the entire provider chain is constructed by default. [#47397](https://github.com/ClickHouse/ClickHouse/pull/47397) ([Antonio Andelic](https://github.com/antonio2368)). +* Currently, the JSON_VALUE function is similar as spark's get_json_object function, which support to get value from JSON string by a path like '$.key'. But still has something different - 1. in spark's get_json_object will return null while the path is not exist, but in JSON_VALUE will return empty string; - 2. in spark's get_json_object will return a complex type value, such as a JSON object/array value, but in JSON_VALUE will return empty string. [#47494](https://github.com/ClickHouse/ClickHouse/pull/47494) ([KevinyhZou](https://github.com/KevinyhZou)). +* For `use_structure_from_insertion_table_in_table_functions` more flexible insert table structure propagation to table function. Fixed an issue with name mapping and using virtual columns. No more need for 'auto' setting. [#47962](https://github.com/ClickHouse/ClickHouse/pull/47962) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Do not continue retrying to connect to Keeper if the query is killed or over limits. [#47985](https://github.com/ClickHouse/ClickHouse/pull/47985) ([Raúl Marín](https://github.com/Algunenano)). +* Support Enum output/input in `BSONEachRow`, allow all map key types and avoid extra calculations on output. [#48122](https://github.com/ClickHouse/ClickHouse/pull/48122) ([Kruglov Pavel](https://github.com/Avogar)). +* Support more ClickHouse types in `ORC`/`Arrow`/`Parquet` formats: Enum(8|16), (U)Int(128|256), Decimal256 (for ORC), allow reading IPv4 from Int32 values (ORC outputs IPv4 as Int32, and we couldn't read it back), fix reading Nullable(IPv6) from binary data for `ORC`. [#48126](https://github.com/ClickHouse/ClickHouse/pull/48126) ([Kruglov Pavel](https://github.com/Avogar)). +* Add columns `perform_ttl_move_on_insert`, `load_balancing` for table `system.storage_policies`, modify column `volume_type` type to `Enum8`. [#48167](https://github.com/ClickHouse/ClickHouse/pull/48167) ([lizhuoyu5](https://github.com/lzydmxy)). +* Added support for `BACKUP ALL` command which backups all tables and databases, including temporary and system ones. [#48189](https://github.com/ClickHouse/ClickHouse/pull/48189) ([Vitaly Baranov](https://github.com/vitlibar)). +* Function mapFromArrays supports `Map` type as an input. [#48207](https://github.com/ClickHouse/ClickHouse/pull/48207) ([李扬](https://github.com/taiyang-li)). +* The output of some SHOW PROCESSLIST is now sorted. [#48241](https://github.com/ClickHouse/ClickHouse/pull/48241) ([Robert Schulze](https://github.com/rschu1ze)). +* Per-query/per-server throttling for remote IO/local IO/BACKUPs (server settings: `max_remote_read_network_bandwidth_for_server`, `max_remote_write_network_bandwidth_for_server`, `max_local_read_bandwidth_for_server`, `max_local_write_bandwidth_for_server`, `max_backup_bandwidth_for_server`, settings: `max_remote_read_network_bandwidth`, `max_remote_write_network_bandwidth`, `max_local_read_bandwidth`, `max_local_write_bandwidth`, `max_backup_bandwidth`). [#48242](https://github.com/ClickHouse/ClickHouse/pull/48242) ([Azat Khuzhin](https://github.com/azat)). +* Support more types in `CapnProto` format: Map, (U)Int(128|256), Decimal(128|256). Allow integer conversions during input/output. [#48257](https://github.com/ClickHouse/ClickHouse/pull/48257) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't throw CURRENT_WRITE_BUFFER_IS_EXHAUSTED for normal behaviour. [#48288](https://github.com/ClickHouse/ClickHouse/pull/48288) ([Raúl Marín](https://github.com/Algunenano)). +* Add new setting `keeper_map_strict_mode` which enforces extra guarantees on operations made on top of `KeeperMap` tables. [#48293](https://github.com/ClickHouse/ClickHouse/pull/48293) ([Antonio Andelic](https://github.com/antonio2368)). +* Check primary key type for simple dictionary is native unsigned integer type Add setting `check_dictionary_primary_key ` for compatibility(set `check_dictionary_primary_key =false` to disable checking). [#48335](https://github.com/ClickHouse/ClickHouse/pull/48335) ([lizhuoyu5](https://github.com/lzydmxy)). +* Don't replicate mutations for `KeeperMap` because it's unnecessary. [#48354](https://github.com/ClickHouse/ClickHouse/pull/48354) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow to write/read unnamed tuple as nested Message in Protobuf format. Tuple elements and Message fields are matched by position. [#48390](https://github.com/ClickHouse/ClickHouse/pull/48390) ([Kruglov Pavel](https://github.com/Avogar)). +* Support `additional_table_filters` and `additional_result_filter` settings in the new planner. Also, add a documentation entry for `additional_result_filter`. [#48405](https://github.com/ClickHouse/ClickHouse/pull/48405) ([Dmitry Novik](https://github.com/novikd)). +* `parseDateTime` now understands format string '%f' (fractional seconds). [#48420](https://github.com/ClickHouse/ClickHouse/pull/48420) ([Robert Schulze](https://github.com/rschu1ze)). +* Format string "%f" in formatDateTime() now prints "000000" if the formatted value has no fractional seconds, the previous behavior (single zero) can be restored using setting "formatdatetime_f_prints_single_zero = 1". [#48422](https://github.com/ClickHouse/ClickHouse/pull/48422) ([Robert Schulze](https://github.com/rschu1ze)). +* Don't replicate DELETE and TRUNCATE for KeeperMap. [#48434](https://github.com/ClickHouse/ClickHouse/pull/48434) ([Antonio Andelic](https://github.com/antonio2368)). +* Generate valid Decimals and Bools in generateRandom function. [#48436](https://github.com/ClickHouse/ClickHouse/pull/48436) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow trailing commas in expression list of SELECT query, for example `SELECT a, b, c, FROM table`. Closes [#37802](https://github.com/ClickHouse/ClickHouse/issues/37802). [#48438](https://github.com/ClickHouse/ClickHouse/pull/48438) ([Nikolay Degterinsky](https://github.com/evillique)). +* Override `CLICKHOUSE_USER` and `CLICKHOUSE_PASSWORD` environment variables with `--user` and `--password` client parameters. Closes [#38909](https://github.com/ClickHouse/ClickHouse/issues/38909). [#48440](https://github.com/ClickHouse/ClickHouse/pull/48440) ([Nikolay Degterinsky](https://github.com/evillique)). +* Added retries to loading of data parts in `MergeTree` tables in case of retryable errors. [#48442](https://github.com/ClickHouse/ClickHouse/pull/48442) ([Anton Popov](https://github.com/CurtizJ)). +* Add support for `Date`, `Date32`, `DateTime`, `DateTime64` data types to `arrayMin`, `arrayMax`, `arrayDifference` functions. Closes [#21645](https://github.com/ClickHouse/ClickHouse/issues/21645). [#48445](https://github.com/ClickHouse/ClickHouse/pull/48445) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add support for `{server_uuid}` macro. It is useful for identifying replicas in autoscaled clusters when new replicas are constantly added and removed in runtime. This closes [#48554](https://github.com/ClickHouse/ClickHouse/issues/48554). [#48563](https://github.com/ClickHouse/ClickHouse/pull/48563) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The installation script will create a hard link instead of copying if it is possible. [#48578](https://github.com/ClickHouse/ClickHouse/pull/48578) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support `SHOW TABLE` syntax meaning the same as `SHOW CREATE TABLE`. Closes [#48580](https://github.com/ClickHouse/ClickHouse/issues/48580). [#48591](https://github.com/ClickHouse/ClickHouse/pull/48591) ([flynn](https://github.com/ucasfl)). +* HTTP temporary buffers now support working by evicting data from the virtual filesystem cache. [#48664](https://github.com/ClickHouse/ClickHouse/pull/48664) ([Vladimir C](https://github.com/vdimir)). +* Make Schema inference works for `CREATE AS SELECT`. Closes [#47599](https://github.com/ClickHouse/ClickHouse/issues/47599). [#48679](https://github.com/ClickHouse/ClickHouse/pull/48679) ([flynn](https://github.com/ucasfl)). +* Added a `replicated_max_mutations_in_one_entry` setting for `ReplicatedMergeTree` that allows limiting the number of mutation commands per one `MUTATE_PART` entry (default is 10000). [#48731](https://github.com/ClickHouse/ClickHouse/pull/48731) ([Alexander Tokmakov](https://github.com/tavplubix)). +* In AggregateFunction types, don't count unused arena bytes as `read_bytes`. [#48745](https://github.com/ClickHouse/ClickHouse/pull/48745) ([Raúl Marín](https://github.com/Algunenano)). +* Fix some MySQL-related settings not being handled with the MySQL dictionary source + named collection. Closes [#48402](https://github.com/ClickHouse/ClickHouse/issues/48402). [#48759](https://github.com/ClickHouse/ClickHouse/pull/48759) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If a user set `max_single_part_upload_size` to a very large value, it can lead to a crash due to a bug in the AWS S3 SDK. This fixes [#47679](https://github.com/ClickHouse/ClickHouse/issues/47679). [#48816](https://github.com/ClickHouse/ClickHouse/pull/48816) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix data race in `RabbitMQ` ([report](https://pastila.nl/?004f7100/de1505289ab5bb355e67ebe6c7cc8707)), refactor the code. [#48845](https://github.com/ClickHouse/ClickHouse/pull/48845) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add aliases `name` and `part_name` form `system.parts` and `system.part_log`. Closes [#48718](https://github.com/ClickHouse/ClickHouse/issues/48718). [#48850](https://github.com/ClickHouse/ClickHouse/pull/48850) ([sichenzhao](https://github.com/sichenzhao)). +* Functions "arrayDifferenceSupport()", "arrayCumSum()" and "arrayCumSumNonNegative()" now support input arrays of wide integer types (U)Int128/256. [#48866](https://github.com/ClickHouse/ClickHouse/pull/48866) ([cluster](https://github.com/infdahai)). +* Multi-line history in clickhouse-client is now no longer padded. This makes pasting more natural. [#48870](https://github.com/ClickHouse/ClickHouse/pull/48870) ([Joanna Hulboj](https://github.com/jh0x)). +* Implement a slight improvement for the rare case when ClickHouse is run inside LXC and LXCFS is used. The LXCFS has an issue: sometimes it returns an error "Transport endpoint is not connected" on reading from the file inside `/proc`. This error was correctly logged into ClickHouse's server log. We have additionally workaround this issue by reopening a file. This is a minuscule change. [#48922](https://github.com/ClickHouse/ClickHouse/pull/48922) ([Real](https://github.com/RunningXie)). +* Improve memory accounting for prefetches. Randomise prefetch settings In CI. [#48973](https://github.com/ClickHouse/ClickHouse/pull/48973) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Correctly set headers for native copy operations on GCS. [#48981](https://github.com/ClickHouse/ClickHouse/pull/48981) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for specifying setting names in the command line with dashes instead of underscores, for example, `--max-threads` instead of `--max_threads`. Additionally, support Unicode dash characters like `—` instead of `--` - this is useful when you communicate with a team in another company, and a manager from that team copy-pasted code from MS Word. [#48985](https://github.com/ClickHouse/ClickHouse/pull/48985) ([alekseygolub](https://github.com/alekseygolub)). +* Add fallback to password authentication when authentication with SSL user certificate has failed. Closes [#48974](https://github.com/ClickHouse/ClickHouse/issues/48974). [#48989](https://github.com/ClickHouse/ClickHouse/pull/48989) ([Nikolay Degterinsky](https://github.com/evillique)). +* Improve the embedded dashboard. Close [#46671](https://github.com/ClickHouse/ClickHouse/issues/46671). [#49036](https://github.com/ClickHouse/ClickHouse/pull/49036) ([Kevin Zhang](https://github.com/Kinzeng)). +* Add profile events for log messages, so you can easily see the count of log messages by severity. [#49042](https://github.com/ClickHouse/ClickHouse/pull/49042) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* In previous versions, the `LineAsString` format worked inconsistently when the parallel parsing was enabled or not, in presence of DOS or macOS Classic line breaks. This closes [#49039](https://github.com/ClickHouse/ClickHouse/issues/49039). [#49052](https://github.com/ClickHouse/ClickHouse/pull/49052) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The exception message about the unparsed query parameter will also tell about the name of the parameter. Reimplement [#48878](https://github.com/ClickHouse/ClickHouse/issues/48878). Close [#48772](https://github.com/ClickHouse/ClickHouse/issues/48772). [#49061](https://github.com/ClickHouse/ClickHouse/pull/49061) ([Alexey Milovidov](https://github.com/alexey-milovidov)). + +#### Build/Testing/Packaging Improvement +* Update time zones. The following were updated: Africa/Cairo, Africa/Casablanca, Africa/El_Aaiun, America/Bogota, America/Cambridge_Bay, America/Ciudad_Juarez, America/Godthab, America/Inuvik, America/Iqaluit, America/Nuuk, America/Ojinaga, America/Pangnirtung, America/Rankin_Inlet, America/Resolute, America/Whitehorse, America/Yellowknife, Asia/Gaza, Asia/Hebron, Asia/Kuala_Lumpur, Asia/Singapore, Canada/Yukon, Egypt, Europe/Kirov, Europe/Volgograd, Singapore. [#48572](https://github.com/ClickHouse/ClickHouse/pull/48572) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Reduce the number of dependencies in the header files to speed up the build. [#47984](https://github.com/ClickHouse/ClickHouse/pull/47984) ([Dmitry Novik](https://github.com/novikd)). +* Randomize compression of marks and indices in tests. [#48286](https://github.com/ClickHouse/ClickHouse/pull/48286) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Bump internal ZSTD from 1.5.4 to 1.5.5. [#46797](https://github.com/ClickHouse/ClickHouse/pull/46797) ([Robert Schulze](https://github.com/rschu1ze)). +* Randomize vertical merges from compact to wide parts in tests. [#48287](https://github.com/ClickHouse/ClickHouse/pull/48287) ([Raúl Marín](https://github.com/Algunenano)). +* Support for CRC32 checksum in HDFS. Fix performance issues. [#48614](https://github.com/ClickHouse/ClickHouse/pull/48614) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove remainders of GCC support. [#48671](https://github.com/ClickHouse/ClickHouse/pull/48671) ([Robert Schulze](https://github.com/rschu1ze)). +* Add CI run with new analyzer infrastructure enabled. [#48719](https://github.com/ClickHouse/ClickHouse/pull/48719) ([Dmitry Novik](https://github.com/novikd)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Fix system.query_views_log for MVs that are pushed from background threads [#46668](https://github.com/ClickHouse/ClickHouse/pull/46668) ([Azat Khuzhin](https://github.com/azat)). +* Fix several `RENAME COLUMN` bugs [#46946](https://github.com/ClickHouse/ClickHouse/pull/46946) ([alesapin](https://github.com/alesapin)). +* Fix minor hiliting issues in clickhouse-format [#47610](https://github.com/ClickHouse/ClickHouse/pull/47610) ([Natasha Murashkina](https://github.com/murfel)). +* Fix a bug in LLVM's libc++ leading to a crash for uploading parts to S3 which size is greater than INT_MAX [#47693](https://github.com/ClickHouse/ClickHouse/pull/47693) ([Azat Khuzhin](https://github.com/azat)). +* Fix overflow in the `sparkbar` function [#48121](https://github.com/ClickHouse/ClickHouse/pull/48121) ([Vladimir C](https://github.com/vdimir)). +* Fix race in S3 [#48190](https://github.com/ClickHouse/ClickHouse/pull/48190) ([Anton Popov](https://github.com/CurtizJ)). +* Disable JIT for aggregate functions due to inconsistent behavior [#48195](https://github.com/ClickHouse/ClickHouse/pull/48195) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix alter formatting (minor) [#48289](https://github.com/ClickHouse/ClickHouse/pull/48289) ([Natasha Murashkina](https://github.com/murfel)). +* Fix CPU usage in RabbitMQ (was worsened in 23.2 after [#44404](https://github.com/ClickHouse/ClickHouse/issues/44404)) [#48311](https://github.com/ClickHouse/ClickHouse/pull/48311) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix crash in EXPLAIN PIPELINE for Merge over Distributed [#48320](https://github.com/ClickHouse/ClickHouse/pull/48320) ([Azat Khuzhin](https://github.com/azat)). +* Fix serializing LowCardinality as Arrow dictionary [#48361](https://github.com/ClickHouse/ClickHouse/pull/48361) ([Kruglov Pavel](https://github.com/Avogar)). +* Reset downloader for cache file segment in TemporaryFileStream [#48386](https://github.com/ClickHouse/ClickHouse/pull/48386) ([Vladimir C](https://github.com/vdimir)). +* Fix possible SYSTEM SYNC REPLICA stuck in case of DROP/REPLACE PARTITION [#48391](https://github.com/ClickHouse/ClickHouse/pull/48391) ([Azat Khuzhin](https://github.com/azat)). +* Fix a startup error when loading a distributed table that depends on a dictionary [#48419](https://github.com/ClickHouse/ClickHouse/pull/48419) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Don't check dependencies when renaming system tables automatically [#48431](https://github.com/ClickHouse/ClickHouse/pull/48431) ([Raúl Marín](https://github.com/Algunenano)). +* Update only affected rows in KeeperMap storage [#48435](https://github.com/ClickHouse/ClickHouse/pull/48435) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix possible segfault in the VFS cache [#48469](https://github.com/ClickHouse/ClickHouse/pull/48469) ([Kseniia Sumarokova](https://github.com/kssenii)). +* `toTimeZone` function throws an error when no constant string is provided [#48471](https://github.com/ClickHouse/ClickHouse/pull/48471) ([Jordi Villar](https://github.com/jrdi)). +* Fix logical error with IPv4 in Protobuf, add support for Date32 [#48486](https://github.com/ClickHouse/ClickHouse/pull/48486) ([Kruglov Pavel](https://github.com/Avogar)). +* "changed" flag in system.settings was calculated incorrectly for settings with multiple values [#48516](https://github.com/ClickHouse/ClickHouse/pull/48516) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Fix storage `Memory` with enabled compression [#48517](https://github.com/ClickHouse/ClickHouse/pull/48517) ([Anton Popov](https://github.com/CurtizJ)). +* Fix bracketed-paste mode messing up password input in the event of client reconnection [#48528](https://github.com/ClickHouse/ClickHouse/pull/48528) ([Michael Kolupaev](https://github.com/al13n321)). +* Fix nested map for keys of IP and UUID types [#48556](https://github.com/ClickHouse/ClickHouse/pull/48556) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix an uncaught exception in case of parallel loader for hashed dictionaries [#48571](https://github.com/ClickHouse/ClickHouse/pull/48571) ([Azat Khuzhin](https://github.com/azat)). +* The `groupArray` aggregate function correctly works for empty result over nullable types [#48593](https://github.com/ClickHouse/ClickHouse/pull/48593) ([lgbo](https://github.com/lgbo-ustc)). +* Fix bug in Keeper when a node is not created with scheme `auth` in ACL sometimes. [#48595](https://github.com/ClickHouse/ClickHouse/pull/48595) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Allow IPv4 comparison operators with UInt [#48611](https://github.com/ClickHouse/ClickHouse/pull/48611) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix possible error from cache [#48636](https://github.com/ClickHouse/ClickHouse/pull/48636) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Async inserts with empty data will no longer throw exception. [#48663](https://github.com/ClickHouse/ClickHouse/pull/48663) ([Anton Popov](https://github.com/CurtizJ)). +* Fix table dependencies in case of failed RENAME TABLE [#48683](https://github.com/ClickHouse/ClickHouse/pull/48683) ([Azat Khuzhin](https://github.com/azat)). +* If the primary key has duplicate columns (which is only possible for projections), in previous versions it might lead to a bug [#48838](https://github.com/ClickHouse/ClickHouse/pull/48838) ([Amos Bird](https://github.com/amosbird)). +* Fix for a race condition in ZooKeeper when joining send_thread/receive_thread [#48849](https://github.com/ClickHouse/ClickHouse/pull/48849) ([Alexander Gololobov](https://github.com/davenger)). +* Fix unexpected part name error when trying to drop a ignored detached part with zero copy replication [#48862](https://github.com/ClickHouse/ClickHouse/pull/48862) ([Michael Lex](https://github.com/mlex)). +* Fix reading `Date32` Parquet/Arrow column into not a `Date32` column [#48864](https://github.com/ClickHouse/ClickHouse/pull/48864) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `UNKNOWN_IDENTIFIER` error while selecting from table with row policy and column with dots [#48976](https://github.com/ClickHouse/ClickHouse/pull/48976) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix aggregation by empty nullable strings [#48999](https://github.com/ClickHouse/ClickHouse/pull/48999) ([LiuNeng](https://github.com/liuneng1994)). + +### ClickHouse release 23.3 LTS, 2023-03-30 {#233} + +#### Upgrade Notes +* Lightweight DELETEs are production ready and enabled by default. The `DELETE` query for MergeTree tables is now available by default. +* The behavior of `*domain*RFC` and `netloc` functions is slightly changed: relaxed the set of symbols that are allowed in the URL authority for better conformance. [#46841](https://github.com/ClickHouse/ClickHouse/pull/46841) ([Azat Khuzhin](https://github.com/azat)). +* Prohibited creating tables based on KafkaEngine with DEFAULT/EPHEMERAL/ALIAS/MATERIALIZED statements for columns. [#47138](https://github.com/ClickHouse/ClickHouse/pull/47138) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* An "asynchronous connection drain" feature is removed. Related settings and metrics are removed as well. It was an internal feature, so the removal should not affect users who had never heard about that feature. [#47486](https://github.com/ClickHouse/ClickHouse/pull/47486) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Support 256-bit Decimal data type (more than 38 digits) in `arraySum`/`Min`/`Max`/`Avg`/`Product`, `arrayCumSum`/`CumSumNonNegative`, `arrayDifference`, array construction, IN operator, query parameters, `groupArrayMovingSum`, statistical functions, `min`/`max`/`any`/`argMin`/`argMax`, PostgreSQL wire protocol, MySQL table engine and function, `sumMap`, `mapAdd`, `mapSubtract`, `arrayIntersect`. Add support for big integers in `arrayIntersect`. Statistical aggregate functions involving moments (such as `corr` or various `TTest`s) will use `Float64` as their internal representation (they were using `Decimal128` before this change, but it was pointless), and these functions can return `nan` instead of `inf` in case of infinite variance. Some functions were allowed on `Decimal256` data types but returned `Decimal128` in previous versions - now it is fixed. This closes [#47569](https://github.com/ClickHouse/ClickHouse/issues/47569). This closes [#44864](https://github.com/ClickHouse/ClickHouse/issues/44864). This closes [#28335](https://github.com/ClickHouse/ClickHouse/issues/28335). [#47594](https://github.com/ClickHouse/ClickHouse/pull/47594) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Make backup_threads/restore_threads server settings (instead of user settings). [#47881](https://github.com/ClickHouse/ClickHouse/pull/47881) ([Azat Khuzhin](https://github.com/azat)). +* Do not allow const and non-deterministic secondary indices [#46839](https://github.com/ClickHouse/ClickHouse/pull/46839) ([Anton Popov](https://github.com/CurtizJ)). + +#### New Feature +* Add a new mode for splitting the work on replicas using settings `parallel_replicas_custom_key` and `parallel_replicas_custom_key_filter_type`. If the cluster consists of a single shard with multiple replicas, up to `max_parallel_replicas` will be randomly picked and turned into shards. For each shard, a corresponding filter is added to the query on the initiator before being sent to the shard. If the cluster consists of multiple shards, it will behave the same as `sample_key` but with the possibility to define an arbitrary key. [#45108](https://github.com/ClickHouse/ClickHouse/pull/45108) ([Antonio Andelic](https://github.com/antonio2368)). +* An option to display partial result on cancel: Added query setting `partial_result_on_first_cancel` allowing the canceled query (e.g. due to Ctrl-C) to return a partial result. [#45689](https://github.com/ClickHouse/ClickHouse/pull/45689) ([Alexey Perevyshin](https://github.com/alexX512)). +* Added support of arbitrary tables engines for temporary tables (except for Replicated and KeeperMap engines). Close [#31497](https://github.com/ClickHouse/ClickHouse/issues/31497). [#46071](https://github.com/ClickHouse/ClickHouse/pull/46071) ([Roman Vasin](https://github.com/rvasin)). +* Add support for replication of user-defined SQL functions using centralized storage in Keeper. [#46085](https://github.com/ClickHouse/ClickHouse/pull/46085) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Implement `system.server_settings` (similar to `system.settings`), which will contain server configurations. [#46550](https://github.com/ClickHouse/ClickHouse/pull/46550) ([pufit](https://github.com/pufit)). +* Support for `UNDROP TABLE` query. Closes [#46811](https://github.com/ClickHouse/ClickHouse/issues/46811). [#47241](https://github.com/ClickHouse/ClickHouse/pull/47241) ([chen](https://github.com/xiedeyantu)). +* Allow separate grants for named collections (e.g. to be able to give `SHOW/CREATE/ALTER/DROP named collection` access only to certain collections, instead of all at once). Closes [#40894](https://github.com/ClickHouse/ClickHouse/issues/40894). Add new access type `NAMED_COLLECTION_CONTROL` which is not given to user default unless explicitly added to the user config (is required to be able to do `GRANT ALL`), also `show_named_collections` is no longer obligatory to be manually specified for user default to be able to have full access rights as was in 23.2. [#46241](https://github.com/ClickHouse/ClickHouse/pull/46241) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow nested custom disks. Previously custom disks supported only flat disk structure. [#47106](https://github.com/ClickHouse/ClickHouse/pull/47106) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Introduce a function `widthBucket` (with a `WIDTH_BUCKET` alias for compatibility). [#42974](https://github.com/ClickHouse/ClickHouse/issues/42974). [#46790](https://github.com/ClickHouse/ClickHouse/pull/46790) ([avoiderboi](https://github.com/avoiderboi)). +* Add new function `parseDateTime`/`parseDateTimeInJodaSyntax` according to the specified format string. parseDateTime parses String to DateTime in MySQL syntax, parseDateTimeInJodaSyntax parses in Joda syntax. [#46815](https://github.com/ClickHouse/ClickHouse/pull/46815) ([李扬](https://github.com/taiyang-li)). +* Use `dummy UInt8` for the default structure of table function `null`. Closes [#46930](https://github.com/ClickHouse/ClickHouse/issues/46930). [#47006](https://github.com/ClickHouse/ClickHouse/pull/47006) ([flynn](https://github.com/ucasfl)). +* Support for date format with a comma, like `Dec 15, 2021` in the `parseDateTimeBestEffort` function. Closes [#46816](https://github.com/ClickHouse/ClickHouse/issues/46816). [#47071](https://github.com/ClickHouse/ClickHouse/pull/47071) ([chen](https://github.com/xiedeyantu)). +* Add settings `http_wait_end_of_query` and `http_response_buffer_size` that corresponds to URL params `wait_end_of_query` and `buffer_size` for the HTTP interface. This allows changing these settings in the profiles. [#47108](https://github.com/ClickHouse/ClickHouse/pull/47108) ([Vladimir C](https://github.com/vdimir)). +* Add `system.dropped_tables` table that shows tables that were dropped from `Atomic` databases but were not completely removed yet. [#47364](https://github.com/ClickHouse/ClickHouse/pull/47364) ([chen](https://github.com/xiedeyantu)). +* Add `INSTR` as alias of `positionCaseInsensitive` for MySQL compatibility. Closes [#47529](https://github.com/ClickHouse/ClickHouse/issues/47529). [#47535](https://github.com/ClickHouse/ClickHouse/pull/47535) ([flynn](https://github.com/ucasfl)). +* Added `toDecimalString` function allowing to convert numbers to string with fixed precision. [#47838](https://github.com/ClickHouse/ClickHouse/pull/47838) ([Andrey Zvonov](https://github.com/zvonand)). +* Add a merge tree setting `max_number_of_mutations_for_replica`. It limits the number of part mutations per replica to the specified amount. Zero means no limit on the number of mutations per replica (the execution can still be constrained by other settings). [#48047](https://github.com/ClickHouse/ClickHouse/pull/48047) ([Vladimir C](https://github.com/vdimir)). +* Add the Map-related function `mapFromArrays`, which allows the creation of a map from a pair of arrays. [#31125](https://github.com/ClickHouse/ClickHouse/pull/31125) ([李扬](https://github.com/taiyang-li)). +* Allow control of compression in Parquet/ORC/Arrow output formats, adds support for more compression input formats. This closes [#13541](https://github.com/ClickHouse/ClickHouse/issues/13541). [#47114](https://github.com/ClickHouse/ClickHouse/pull/47114) ([Kruglov Pavel](https://github.com/Avogar)). +* Add SSL User Certificate authentication to the native protocol. Closes [#47077](https://github.com/ClickHouse/ClickHouse/issues/47077). [#47596](https://github.com/ClickHouse/ClickHouse/pull/47596) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add *OrNull() and *OrZero() variants for `parseDateTime`, add alias `str_to_date` for MySQL parity. [#48000](https://github.com/ClickHouse/ClickHouse/pull/48000) ([Robert Schulze](https://github.com/rschu1ze)). +* Added operator `REGEXP` (similar to operators "LIKE", "IN", "MOD" etc.) for better compatibility with MySQL [#47869](https://github.com/ClickHouse/ClickHouse/pull/47869) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Marks in memory are now compressed, using 3-6x less memory. [#47290](https://github.com/ClickHouse/ClickHouse/pull/47290) ([Michael Kolupaev](https://github.com/al13n321)). +* Backups for large numbers of files were unbelievably slow in previous versions. Not anymore. Now they are unbelievably fast. [#47251](https://github.com/ClickHouse/ClickHouse/pull/47251) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Introduced a separate thread pool for backup's IO operations. This will allow scaling it independently of other pools and increase performance. [#47174](https://github.com/ClickHouse/ClickHouse/pull/47174) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). Use MultiRead request and retries for collecting metadata at the final stage of backup processing. [#47243](https://github.com/ClickHouse/ClickHouse/pull/47243) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). If a backup and restoring data are both in S3 then server-side copy should be used from now on. [#47546](https://github.com/ClickHouse/ClickHouse/pull/47546) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fixed excessive reading in queries with `FINAL`. [#47801](https://github.com/ClickHouse/ClickHouse/pull/47801) ([Nikita Taranov](https://github.com/nickitat)). +* Setting `max_final_threads` would be set to the number of cores at server startup (by the same algorithm as used for `max_threads`). This improves the concurrency of `final` execution on servers with high number of CPUs. [#47915](https://github.com/ClickHouse/ClickHouse/pull/47915) ([Nikita Taranov](https://github.com/nickitat)). +* Allow executing reading pipeline for DIRECT dictionary with CLICKHOUSE source in multiple threads. To enable set `dictionary_use_async_executor=1` in `SETTINGS` section for source in `CREATE DICTIONARY` statement. [#47986](https://github.com/ClickHouse/ClickHouse/pull/47986) ([Vladimir C](https://github.com/vdimir)). +* Optimize one nullable key aggregate performance. [#45772](https://github.com/ClickHouse/ClickHouse/pull/45772) ([LiuNeng](https://github.com/liuneng1994)). +* Implemented lowercase `tokenbf_v1` index utilization for `hasTokenOrNull`, `hasTokenCaseInsensitive` and `hasTokenCaseInsensitiveOrNull`. [#46252](https://github.com/ClickHouse/ClickHouse/pull/46252) ([ltrk2](https://github.com/ltrk2)). +* Optimize functions `position` and `LIKE` by searching the first two chars using SIMD. [#46289](https://github.com/ClickHouse/ClickHouse/pull/46289) ([Jiebin Sun](https://github.com/jiebinn)). +* Optimize queries from the `system.detached_parts`, which could be significantly large. Added several sources with respect to the block size limitation; in each block, an IO thread pool is used to calculate the part size, i.e. to make syscalls in parallel. [#46624](https://github.com/ClickHouse/ClickHouse/pull/46624) ([Sema Checherinda](https://github.com/CheSema)). +* Increase the default value of `max_replicated_merges_in_queue` for ReplicatedMergeTree tables from 16 to 1000. It allows faster background merge operation on clusters with a very large number of replicas, such as clusters with shared storage in ClickHouse Cloud. [#47050](https://github.com/ClickHouse/ClickHouse/pull/47050) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Updated `clickhouse-copier` to use `GROUP BY` instead of `DISTINCT` to get the list of partitions. For large tables, this reduced the select time from over 500s to under 1s. [#47386](https://github.com/ClickHouse/ClickHouse/pull/47386) ([Clayton McClure](https://github.com/cmcclure-twilio)). +* Fix performance degradation in `ASOF JOIN`. [#47544](https://github.com/ClickHouse/ClickHouse/pull/47544) ([Ongkong](https://github.com/ongkong)). +* Even more batching in Keeper. Improve performance by avoiding breaking batches on read requests. [#47978](https://github.com/ClickHouse/ClickHouse/pull/47978) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow PREWHERE for Merge with different DEFAULT expressions for columns. [#46831](https://github.com/ClickHouse/ClickHouse/pull/46831) ([Azat Khuzhin](https://github.com/azat)). + +#### Experimental Feature +* Parallel replicas: Improved the overall performance by better utilizing the local replica, and forbid the reading with parallel replicas from non-replicated MergeTree by default. [#47858](https://github.com/ClickHouse/ClickHouse/pull/47858) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Support filter push down to left table for JOIN with `Join`, `Dictionary` and `EmbeddedRocksDB` tables if the experimental Analyzer is enabled. [#47280](https://github.com/ClickHouse/ClickHouse/pull/47280) ([Maksim Kita](https://github.com/kitaisreal)). +* Now ReplicatedMergeTree with zero copy replication has less load to Keeper. [#47676](https://github.com/ClickHouse/ClickHouse/pull/47676) ([alesapin](https://github.com/alesapin)). +* Fix create materialized view with MaterializedPostgreSQL [#40807](https://github.com/ClickHouse/ClickHouse/pull/40807) ([Maksim Buren](https://github.com/maks-buren630501)). + +#### Improvement +* Enable `input_format_json_ignore_unknown_keys_in_named_tuple` by default. [#46742](https://github.com/ClickHouse/ClickHouse/pull/46742) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow errors to be ignored while pushing to MATERIALIZED VIEW (add new setting `materialized_views_ignore_errors`, by default to `false`, but it is set to `true` for flushing logs to `system.*_log` tables unconditionally). [#46658](https://github.com/ClickHouse/ClickHouse/pull/46658) ([Azat Khuzhin](https://github.com/azat)). +* Track the file queue of distributed sends in memory. [#45491](https://github.com/ClickHouse/ClickHouse/pull/45491) ([Azat Khuzhin](https://github.com/azat)). +* Now `X-ClickHouse-Query-Id` and `X-ClickHouse-Timezone` headers are added to responses in all queries via HTTP protocol. Previously it was done only for `SELECT` queries. [#46364](https://github.com/ClickHouse/ClickHouse/pull/46364) ([Anton Popov](https://github.com/CurtizJ)). +* External tables from `MongoDB`: support for connection to a replica set via a URI with a host:port enum and support for the readPreference option in MongoDB dictionaries. Example URI: mongodb://db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=myRepl&readPreference=primary. [#46524](https://github.com/ClickHouse/ClickHouse/pull/46524) ([artem-yadr](https://github.com/artem-yadr)). +* This improvement should be invisible for users. Re-implement projection analysis on top of query plan. Added setting `query_plan_optimize_projection=1` to switch between old and new version. Fixes [#44963](https://github.com/ClickHouse/ClickHouse/issues/44963). [#46537](https://github.com/ClickHouse/ClickHouse/pull/46537) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Use Parquet format v2 instead of v1 in output format by default. Add setting `output_format_parquet_version` to control parquet version, possible values `1.0`, `2.4`, `2.6`, `2.latest` (default). [#46617](https://github.com/ClickHouse/ClickHouse/pull/46617) ([Kruglov Pavel](https://github.com/Avogar)). +* It is now possible to use the new configuration syntax to configure Kafka topics with periods (`.`) in their name. [#46752](https://github.com/ClickHouse/ClickHouse/pull/46752) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix heuristics that check hyperscan patterns for problematic repeats. [#46819](https://github.com/ClickHouse/ClickHouse/pull/46819) ([Robert Schulze](https://github.com/rschu1ze)). +* Don't report ZK node exists to system.errors when a block was created concurrently by a different replica. [#46820](https://github.com/ClickHouse/ClickHouse/pull/46820) ([Raúl Marín](https://github.com/Algunenano)). +* Increase the limit for opened files in `clickhouse-local`. It will be able to read from `web` tables on servers with a huge number of CPU cores. Do not back off reading from the URL table engine in case of too many opened files. This closes [#46852](https://github.com/ClickHouse/ClickHouse/issues/46852). [#46853](https://github.com/ClickHouse/ClickHouse/pull/46853) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Exceptions thrown when numbers cannot be parsed now have an easier-to-read exception message. [#46917](https://github.com/ClickHouse/ClickHouse/pull/46917) ([Robert Schulze](https://github.com/rschu1ze)). +* Added update `system.backups` after every processed task to track the progress of backups. [#46989](https://github.com/ClickHouse/ClickHouse/pull/46989) ([Aleksandr Musorin](https://github.com/AVMusorin)). +* Allow types conversion in Native input format. Add settings `input_format_native_allow_types_conversion` that controls it (enabled by default). [#46990](https://github.com/ClickHouse/ClickHouse/pull/46990) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow IPv4 in the `range` function to generate IP ranges. [#46995](https://github.com/ClickHouse/ClickHouse/pull/46995) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Improve exception message when it's impossible to move a part from one volume/disk to another. [#47032](https://github.com/ClickHouse/ClickHouse/pull/47032) ([alesapin](https://github.com/alesapin)). +* Support `Bool` type in `JSONType` function. Previously `Null` type was mistakenly returned for bool values. [#47046](https://github.com/ClickHouse/ClickHouse/pull/47046) ([Anton Popov](https://github.com/CurtizJ)). +* Use `_request_body` parameter to configure predefined HTTP queries. [#47086](https://github.com/ClickHouse/ClickHouse/pull/47086) ([Constantine Peresypkin](https://github.com/pkit)). +* Automatic indentation in the built-in UI SQL editor when Enter is pressed. [#47113](https://github.com/ClickHouse/ClickHouse/pull/47113) ([Alexey Korepanov](https://github.com/alexkorep)). +* Self-extraction with 'sudo' will attempt to set uid and gid of extracted files to running user. [#47116](https://github.com/ClickHouse/ClickHouse/pull/47116) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Previously, the `repeat` function's second argument only accepted an unsigned integer type, which meant it could not accept values such as -1. This behavior differed from that of the Spark function. In this update, the repeat function has been modified to match the behavior of the Spark function. It now accepts the same types of inputs, including negative integers. Extensive testing has been performed to verify the correctness of the updated implementation. [#47134](https://github.com/ClickHouse/ClickHouse/pull/47134) ([KevinyhZou](https://github.com/KevinyhZou)). Note: the changelog entry was rewritten by ChatGPT. +* Remove `::__1` part from stacktraces. Display `std::basic_string ClickHouse release 23.2, 2023-02-23 {#232} + +#### Backward Incompatible Change +* Extend function "toDayOfWeek()" (alias: "DAYOFWEEK") with a mode argument that encodes whether the week starts on Monday or Sunday and whether counting starts at 0 or 1. For consistency with other date time functions, the mode argument was inserted between the time and the time zone arguments. This breaks existing usage of the (previously undocumented) 2-argument syntax "toDayOfWeek(time, time_zone)". A fix is to rewrite the function into "toDayOfWeek(time, 0, time_zone)". [#45233](https://github.com/ClickHouse/ClickHouse/pull/45233) ([Robert Schulze](https://github.com/rschu1ze)). +* Rename setting `max_query_cache_size` to `filesystem_cache_max_download_size`. [#45614](https://github.com/ClickHouse/ClickHouse/pull/45614) ([Kseniia Sumarokova](https://github.com/kssenii)). +* The `default` user will not have permissions for access type `SHOW NAMED COLLECTION` by default (e.g. `default` user will no longer be able to grant ALL to other users as it was before, therefore this PR is backward incompatible). [#46010](https://github.com/ClickHouse/ClickHouse/pull/46010) ([Kseniia Sumarokova](https://github.com/kssenii)). +* If the SETTINGS clause is specified before the FORMAT clause, the settings will be applied to formatting as well. [#46003](https://github.com/ClickHouse/ClickHouse/pull/46003) ([Azat Khuzhin](https://github.com/azat)). +* Remove support for setting `materialized_postgresql_allow_automatic_update` (which was by default turned off). [#46106](https://github.com/ClickHouse/ClickHouse/pull/46106) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Slightly improve performance of `countDigits` on realistic datasets. This closed [#44518](https://github.com/ClickHouse/ClickHouse/issues/44518). In previous versions, `countDigits(0)` returned `0`; now it returns `1`, which is more correct, and follows the existing documentation. [#46187](https://github.com/ClickHouse/ClickHouse/pull/46187) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Disallow creation of new columns compressed by a combination of codecs "Delta" or "DoubleDelta" followed by codecs "Gorilla" or "FPC". This can be bypassed using setting "allow_suspicious_codecs = true". [#45652](https://github.com/ClickHouse/ClickHouse/pull/45652) ([Robert Schulze](https://github.com/rschu1ze)). + +#### New Feature +* Add `StorageIceberg` and table function `iceberg` to access iceberg table store on S3. [#45384](https://github.com/ClickHouse/ClickHouse/pull/45384) ([flynn](https://github.com/ucasfl)). +* Allow configuring storage as `SETTINGS disk = ''` (instead of `storage_policy`) and with explicit disk creation `SETTINGS disk = disk(type=s3, ...)`. [#41976](https://github.com/ClickHouse/ClickHouse/pull/41976) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Expose `ProfileEvents` counters in `system.part_log`. [#38614](https://github.com/ClickHouse/ClickHouse/pull/38614) ([Bharat Nallan](https://github.com/bharatnc)). +* Enrichment of the existing `ReplacingMergeTree` engine to allow duplicate the insertion. It leverages the power of both `ReplacingMergeTree` and `CollapsingMergeTree` in one MergeTree engine. Deleted data are not returned when queried, but not removed from disk neither. [#41005](https://github.com/ClickHouse/ClickHouse/pull/41005) ([youennL-cs](https://github.com/youennL-cs)). +* Add `generateULID` function. Closes [#36536](https://github.com/ClickHouse/ClickHouse/issues/36536). [#44662](https://github.com/ClickHouse/ClickHouse/pull/44662) ([Nikolay Degterinsky](https://github.com/evillique)). +* Add `corrMatrix` aggregate function, calculating each two columns. In addition, since Aggregatefunctions `covarSamp` and `covarPop` are similar to `corr`, I add `covarSampMatrix`, `covarPopMatrix` by the way. @alexey-milovidov closes [#44587](https://github.com/ClickHouse/ClickHouse/issues/44587). [#44680](https://github.com/ClickHouse/ClickHouse/pull/44680) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Introduce arrayShuffle function for random array permutations. [#45271](https://github.com/ClickHouse/ClickHouse/pull/45271) ([Joanna Hulboj](https://github.com/jh0x)). +* Support types `FIXED_SIZE_BINARY` type in Arrow, `FIXED_LENGTH_BYTE_ARRAY` in `Parquet` and match them to `FixedString`. Add settings `output_format_parquet_fixed_string_as_fixed_byte_array/output_format_arrow_fixed_string_as_fixed_byte_array` to control default output type for FixedString. Closes [#45326](https://github.com/ClickHouse/ClickHouse/issues/45326). [#45340](https://github.com/ClickHouse/ClickHouse/pull/45340) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a new column `last_exception_time` to system.replication_queue. [#45457](https://github.com/ClickHouse/ClickHouse/pull/45457) ([Frank Chen](https://github.com/FrankChen021)). +* Add two new functions which allow for user-defined keys/seeds with SipHash{64,128}. [#45513](https://github.com/ClickHouse/ClickHouse/pull/45513) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Allow a three-argument version for table function `format`. close [#45808](https://github.com/ClickHouse/ClickHouse/issues/45808). [#45873](https://github.com/ClickHouse/ClickHouse/pull/45873) ([FFFFFFFHHHHHHH](https://github.com/FFFFFFFHHHHHHH)). +* Add `JodaTime` format support for 'x','w','S'. Refer to https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html. [#46073](https://github.com/ClickHouse/ClickHouse/pull/46073) ([zk_kiger](https://github.com/zk-kiger)). +* Support window function `ntile`. ([lgbo](https://github.com/lgbo-ustc)). +* Add setting `final` to implicitly apply the `FINAL` modifier to every table. [#40945](https://github.com/ClickHouse/ClickHouse/pull/40945) ([Arthur Passos](https://github.com/arthurpassos)). +* Added `arrayPartialSort` and `arrayPartialReverseSort` functions. [#46296](https://github.com/ClickHouse/ClickHouse/pull/46296) ([Joanna Hulboj](https://github.com/jh0x)). +* The new http parameter `client_protocol_version` allows setting a client protocol version for HTTP responses using the Native format. [#40397](https://github.com/ClickHouse/ClickHouse/issues/40397). [#46360](https://github.com/ClickHouse/ClickHouse/pull/46360) ([Geoff Genz](https://github.com/genzgd)). +* Add new function `regexpExtract`, like spark function `REGEXP_EXTRACT` for compatibility. It is similar to the existing function `extract`. [#46469](https://github.com/ClickHouse/ClickHouse/pull/46469) ([李扬](https://github.com/taiyang-li)). +* Add new function `JSONArrayLength`, which returns the number of elements in the outermost JSON array. The function returns NULL if the input JSON string is invalid. [#46631](https://github.com/ClickHouse/ClickHouse/pull/46631) ([李扬](https://github.com/taiyang-li)). + +#### Performance Improvement +* The introduced logic works if PREWHERE condition is a conjunction of multiple conditions (cond1 AND cond2 AND ... ). It groups those conditions that require reading the same columns into steps. After each step the corresponding part of the full condition is computed and the result rows might be filtered. This allows to read fewer rows in the next steps thus saving IO bandwidth and doing less computation. This logic is disabled by default for now. It will be enabled by default in one of the future releases once it is known to not have any regressions, so it is highly encouraged to be used for testing. It can be controlled by 2 settings: "enable_multiple_prewhere_read_steps" and "move_all_conditions_to_prewhere". [#46140](https://github.com/ClickHouse/ClickHouse/pull/46140) ([Alexander Gololobov](https://github.com/davenger)). +* An option added to aggregate partitions independently if table partition key and group by key are compatible. Controlled by the setting `allow_aggregate_partitions_independently`. Disabled by default because of limited applicability (please refer to the docs). [#45364](https://github.com/ClickHouse/ClickHouse/pull/45364) ([Nikita Taranov](https://github.com/nickitat)). +* Allow using Vertical merge algorithm with parts in Compact format. This will allow ClickHouse server to use much less memory for background operations. This closes [#46084](https://github.com/ClickHouse/ClickHouse/issues/46084). [#45681](https://github.com/ClickHouse/ClickHouse/pull/45681) [#46282](https://github.com/ClickHouse/ClickHouse/pull/46282) ([Anton Popov](https://github.com/CurtizJ)). +* Optimize `Parquet` reader by using batch reader. [#45878](https://github.com/ClickHouse/ClickHouse/pull/45878) ([LiuNeng](https://github.com/liuneng1994)). +* Add new `local_filesystem_read_method` method `io_uring` based on the asynchronous Linux [io_uring](https://kernel.dk/io_uring.pdf) subsystem, improving read performance almost universally compared to the default `pread` method. [#38456](https://github.com/ClickHouse/ClickHouse/pull/38456) ([Saulius Valatka](https://github.com/sauliusvl)). +* Rewrite aggregate functions with `if` expression as argument when logically equivalent. For example, `avg(if(cond, col, null))` can be rewritten to avgIf(cond, col). It is helpful in performance. [#44730](https://github.com/ClickHouse/ClickHouse/pull/44730) ([李扬](https://github.com/taiyang-li)). +* Improve lower/upper function performance with avx512 instructions. [#37894](https://github.com/ClickHouse/ClickHouse/pull/37894) ([yaqi-zhao](https://github.com/yaqi-zhao)). +* Remove the limitation that on systems with >=32 cores and SMT disabled ClickHouse uses only half of the cores (the case when you disable Hyper Threading in BIOS). [#44973](https://github.com/ClickHouse/ClickHouse/pull/44973) ([Robert Schulze](https://github.com/rschu1ze)). +* Improve performance of function `multiIf` by columnar executing, speed up by 2.3x. [#45296](https://github.com/ClickHouse/ClickHouse/pull/45296) ([李扬](https://github.com/taiyang-li)). +* Add fast path for function `position` when the needle is empty. [#45382](https://github.com/ClickHouse/ClickHouse/pull/45382) ([李扬](https://github.com/taiyang-li)). +* Enable `query_plan_remove_redundant_sorting` optimization by default. Optimization implemented in [#45420](https://github.com/ClickHouse/ClickHouse/issues/45420). [#45567](https://github.com/ClickHouse/ClickHouse/pull/45567) ([Igor Nikonov](https://github.com/devcrafter)). +* Increased HTTP Transfer Encoding chunk size to improve performance of large queries using the HTTP interface. [#45593](https://github.com/ClickHouse/ClickHouse/pull/45593) ([Geoff Genz](https://github.com/genzgd)). +* Fixed performance of short `SELECT` queries that read from tables with large number of `Array`/`Map`/`Nested` columns. [#45630](https://github.com/ClickHouse/ClickHouse/pull/45630) ([Anton Popov](https://github.com/CurtizJ)). +* Improve performance of filtering for big integers and decimal types. [#45949](https://github.com/ClickHouse/ClickHouse/pull/45949) ([李扬](https://github.com/taiyang-li)). +* This change could effectively reduce the overhead of obtaining the filter from ColumnNullable(UInt8) and improve the overall query performance. To evaluate the impact of this change, we adopted TPC-H benchmark but revised the column types from non-nullable to nullable, and we measured the QPS of its queries as the performance indicator. [#45962](https://github.com/ClickHouse/ClickHouse/pull/45962) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Make the `_part` and `_partition_id` virtual column be `LowCardinality(String)` type. Closes [#45964](https://github.com/ClickHouse/ClickHouse/issues/45964). [#45975](https://github.com/ClickHouse/ClickHouse/pull/45975) ([flynn](https://github.com/ucasfl)). +* Improve the performance of Decimal conversion when the scale does not change. [#46095](https://github.com/ClickHouse/ClickHouse/pull/46095) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Allow to increase prefetching for read data. [#46168](https://github.com/ClickHouse/ClickHouse/pull/46168) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Rewrite `arrayExists(x -> x = 1, arr)` -> `has(arr, 1)`, which improve performance by 1.34x. [#46188](https://github.com/ClickHouse/ClickHouse/pull/46188) ([李扬](https://github.com/taiyang-li)). +* Fix too big memory usage for vertical merges on non-remote disk. Respect `max_insert_delayed_streams_for_parallel_write` for the remote disk. [#46275](https://github.com/ClickHouse/ClickHouse/pull/46275) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Update zstd to v1.5.4. It has some minor improvements in performance and compression ratio. If you run replicas with different versions of ClickHouse you may see reasonable error messages `Data after merge/mutation is not byte-identical to data on another replicas.` with explanation. These messages are Ok and you should not worry. [#46280](https://github.com/ClickHouse/ClickHouse/pull/46280) ([Raúl Marín](https://github.com/Algunenano)). +* Fix performance degradation caused by [#39737](https://github.com/ClickHouse/ClickHouse/issues/39737). [#46309](https://github.com/ClickHouse/ClickHouse/pull/46309) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `replicas_status` handle will answer quickly even in case of a large replication queue. [#46310](https://github.com/ClickHouse/ClickHouse/pull/46310) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add avx512 support for aggregate function `sum`, function unary arithmetic, function comparison. [#37870](https://github.com/ClickHouse/ClickHouse/pull/37870) ([zhao zhou](https://github.com/zzachimed)). +* Rewrote the code around marks distribution and the overall coordination of the reading in order to achieve the maximum performance improvement. This closes [#34527](https://github.com/ClickHouse/ClickHouse/issues/34527). [#43772](https://github.com/ClickHouse/ClickHouse/pull/43772) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Remove redundant DISTINCT clauses in query (subqueries). Implemented on top of query plan. It does similar optimization as `optimize_duplicate_order_by_and_distinct` regarding DISTINCT clauses. Can be enabled via `query_plan_remove_redundant_distinct` setting. Related to [#42648](https://github.com/ClickHouse/ClickHouse/issues/42648). [#44176](https://github.com/ClickHouse/ClickHouse/pull/44176) ([Igor Nikonov](https://github.com/devcrafter)). +* A few query rewrite optimizations: `sumIf(123, cond) -> 123 * countIf(1, cond)`, `sum(if(cond, 123, 0)) -> 123 * countIf(cond)`, `sum(if(cond, 0, 123)) -> 123 * countIf(not(cond))` [#44728](https://github.com/ClickHouse/ClickHouse/pull/44728) ([李扬](https://github.com/taiyang-li)). +* Improved how memory bound merging and aggregation in order on top query plan interact. Previously we fell back to explicit sorting for AIO in some cases when it wasn't actually needed. [#45892](https://github.com/ClickHouse/ClickHouse/pull/45892) ([Nikita Taranov](https://github.com/nickitat)). +* Concurrent merges are scheduled using round-robin by default to ensure fair and starvation-free operation. Previously in heavily overloaded shards, big merges could possibly be starved by smaller merges due to the use of strict priority scheduling. Added `background_merges_mutations_scheduling_policy` server config option to select scheduling algorithm (`round_robin` or `shortest_task_first`). [#46247](https://github.com/ClickHouse/ClickHouse/pull/46247) ([Sergei Trifonov](https://github.com/serxa)). + +#### Improvement +* Enable retries for INSERT by default in case of ZooKeeper session loss. We already use it in production. [#46308](https://github.com/ClickHouse/ClickHouse/pull/46308) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to ignore unknown keys in JSON object for named tuples (`input_format_json_ignore_unknown_keys_in_named_tuple`). [#45678](https://github.com/ClickHouse/ClickHouse/pull/45678) ([Azat Khuzhin](https://github.com/azat)). +* Support optimizing the `where` clause with sorting key expression move to `prewhere` for query with `final`. [#38893](https://github.com/ClickHouse/ClickHouse/issues/38893). [#38950](https://github.com/ClickHouse/ClickHouse/pull/38950) ([hexiaoting](https://github.com/hexiaoting)). +* Add new metrics for backups: num_processed_files and processed_files_size described actual number of processed files. [#42244](https://github.com/ClickHouse/ClickHouse/pull/42244) ([Aleksandr](https://github.com/AVMusorin)). +* Added retries on interserver DNS errors. [#43179](https://github.com/ClickHouse/ClickHouse/pull/43179) ([Anton Kozlov](https://github.com/tonickkozlov)). +* Keeper improvement: try preallocating space on the disk to avoid undefined out-of-space issues. Introduce setting `max_log_file_size` for the maximum size of Keeper's Raft log files. [#44370](https://github.com/ClickHouse/ClickHouse/pull/44370) ([Antonio Andelic](https://github.com/antonio2368)). +* Optimize behavior for a replica delay api logic in case the replica is read-only. [#45148](https://github.com/ClickHouse/ClickHouse/pull/45148) ([mateng915](https://github.com/mateng0915)). +* Ask for the password in clickhouse-client interactively in a case when the empty password is wrong. Closes [#46702](https://github.com/ClickHouse/ClickHouse/issues/46702). [#46730](https://github.com/ClickHouse/ClickHouse/pull/46730) ([Nikolay Degterinsky](https://github.com/evillique)). +* Mark `Gorilla` compression on columns of non-Float* type as suspicious. [#45376](https://github.com/ClickHouse/ClickHouse/pull/45376) ([Robert Schulze](https://github.com/rschu1ze)). +* Show replica name that is executing a merge in the `postpone_reason` column. [#45458](https://github.com/ClickHouse/ClickHouse/pull/45458) ([Frank Chen](https://github.com/FrankChen021)). +* Save exception stack trace in part_log. [#45459](https://github.com/ClickHouse/ClickHouse/pull/45459) ([Frank Chen](https://github.com/FrankChen021)). +* The `regexp_tree` dictionary is polished and now it is compatible with https://github.com/ua-parser/uap-core. [#45631](https://github.com/ClickHouse/ClickHouse/pull/45631) ([Han Fei](https://github.com/hanfei1991)). +* Updated checking of `SYSTEM SYNC REPLICA`, resolves [#45508](https://github.com/ClickHouse/ClickHouse/issues/45508) [#45648](https://github.com/ClickHouse/ClickHouse/pull/45648) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Rename setting `replication_alter_partitions_sync` to `alter_sync`. [#45659](https://github.com/ClickHouse/ClickHouse/pull/45659) ([Antonio Andelic](https://github.com/antonio2368)). +* The `generateRandom` table function and the engine now support `LowCardinality` data types. This is useful for testing, for example you can write `INSERT INTO table SELECT * FROM generateRandom() LIMIT 1000`. This is needed to debug [#45590](https://github.com/ClickHouse/ClickHouse/issues/45590). [#45661](https://github.com/ClickHouse/ClickHouse/pull/45661) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The experimental query result cache now provides more modular configuration settings. [#45679](https://github.com/ClickHouse/ClickHouse/pull/45679) ([Robert Schulze](https://github.com/rschu1ze)). +* Renamed "query result cache" to "query cache". [#45682](https://github.com/ClickHouse/ClickHouse/pull/45682) ([Robert Schulze](https://github.com/rschu1ze)). +* add `SYSTEM SYNC FILE CACHE` command. It will do the `sync` syscall. [#8921](https://github.com/ClickHouse/ClickHouse/issues/8921). [#45685](https://github.com/ClickHouse/ClickHouse/pull/45685) ([DR](https://github.com/freedomDR)). +* Add a new S3 setting `allow_head_object_request`. This PR makes usage of `GetObjectAttributes` request instead of `HeadObject` introduced in https://github.com/ClickHouse/ClickHouse/pull/45288 optional (and disabled by default). [#45701](https://github.com/ClickHouse/ClickHouse/pull/45701) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add ability to override connection settings based on connection names (that said that now you can forget about storing password for each connection, you can simply put everything into `~/.clickhouse-client/config.xml` and even use different history files for them, which can be also useful). [#45715](https://github.com/ClickHouse/ClickHouse/pull/45715) ([Azat Khuzhin](https://github.com/azat)). +* Arrow format: support the duration type. Closes [#45669](https://github.com/ClickHouse/ClickHouse/issues/45669). [#45750](https://github.com/ClickHouse/ClickHouse/pull/45750) ([flynn](https://github.com/ucasfl)). +* Extend the logging in the Query Cache to improve investigations of the caching behavior. [#45751](https://github.com/ClickHouse/ClickHouse/pull/45751) ([Robert Schulze](https://github.com/rschu1ze)). +* The query cache's server-level settings are now reconfigurable at runtime. [#45758](https://github.com/ClickHouse/ClickHouse/pull/45758) ([Robert Schulze](https://github.com/rschu1ze)). +* Hide password in logs when a table function's arguments are specified with a named collection. [#45774](https://github.com/ClickHouse/ClickHouse/pull/45774) ([Vitaly Baranov](https://github.com/vitlibar)). +* Improve internal S3 client to correctly deduce regions and redirections for different types of URLs. [#45783](https://github.com/ClickHouse/ClickHouse/pull/45783) ([Antonio Andelic](https://github.com/antonio2368)). +* Add support for Map, IPv4 and IPv6 types in generateRandom. Mostly useful for testing. [#45785](https://github.com/ClickHouse/ClickHouse/pull/45785) ([Raúl Marín](https://github.com/Algunenano)). +* Support empty/notEmpty for IP types. [#45799](https://github.com/ClickHouse/ClickHouse/pull/45799) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* The column `num_processed_files` was split into two columns: `num_files` (for BACKUP) and `files_read` (for RESTORE). The column `processed_files_size` was split into two columns: `total_size` (for BACKUP) and `bytes_read` (for RESTORE). [#45800](https://github.com/ClickHouse/ClickHouse/pull/45800) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add support for `SHOW ENGINES` query for MySQL compatibility. [#45859](https://github.com/ClickHouse/ClickHouse/pull/45859) ([Filatenkov Artur](https://github.com/FArthur-cmd)). +* Improved how the obfuscator deals with queries. [#45867](https://github.com/ClickHouse/ClickHouse/pull/45867) ([Raúl Marín](https://github.com/Algunenano)). +* Improve behaviour of conversion into Date for boundary value 65535 (2149-06-06). [#46042](https://github.com/ClickHouse/ClickHouse/pull/46042) [#45914](https://github.com/ClickHouse/ClickHouse/pull/45914) ([Joanna Hulboj](https://github.com/jh0x)). +* Add setting `check_referential_table_dependencies` to check referential dependencies on `DROP TABLE`. This PR solves [#38326](https://github.com/ClickHouse/ClickHouse/issues/38326). [#45936](https://github.com/ClickHouse/ClickHouse/pull/45936) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix `tupleElement` to return `Null` when having `Null` argument. Closes [#45894](https://github.com/ClickHouse/ClickHouse/issues/45894). [#45952](https://github.com/ClickHouse/ClickHouse/pull/45952) ([flynn](https://github.com/ucasfl)). +* Throw an error on no files satisfying the S3 wildcard. Closes [#45587](https://github.com/ClickHouse/ClickHouse/issues/45587). [#45957](https://github.com/ClickHouse/ClickHouse/pull/45957) ([chen](https://github.com/xiedeyantu)). +* Use cluster state data to check concurrent backup/restore. [#45982](https://github.com/ClickHouse/ClickHouse/pull/45982) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* ClickHouse Client: Use "exact" matching for fuzzy search, which has correct case ignorance and more appropriate algorithm for matching SQL queries. [#46000](https://github.com/ClickHouse/ClickHouse/pull/46000) ([Azat Khuzhin](https://github.com/azat)). +* Forbid wrong create View syntax `CREATE View X TO Y AS SELECT`. Closes [#4331](https://github.com/ClickHouse/ClickHouse/issues/4331). [#46043](https://github.com/ClickHouse/ClickHouse/pull/46043) ([flynn](https://github.com/ucasfl)). +* Storage `Log` family support setting the `storage_policy`. Closes [#43421](https://github.com/ClickHouse/ClickHouse/issues/43421). [#46044](https://github.com/ClickHouse/ClickHouse/pull/46044) ([flynn](https://github.com/ucasfl)). +* Improve `JSONColumns` format when the result is empty. Closes [#46024](https://github.com/ClickHouse/ClickHouse/issues/46024). [#46053](https://github.com/ClickHouse/ClickHouse/pull/46053) ([flynn](https://github.com/ucasfl)). +* Add reference implementation for SipHash128. [#46065](https://github.com/ClickHouse/ClickHouse/pull/46065) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Add a new metric to record allocations times and bytes using mmap. [#46068](https://github.com/ClickHouse/ClickHouse/pull/46068) ([李扬](https://github.com/taiyang-li)). +* Currently for functions like `leftPad`, `rightPad`, `leftPadUTF8`, `rightPadUTF8`, the second argument `length` must be UInt8|16|32|64|128|256. Which is too strict for clickhouse users, besides, it is not consistent with other similar functions like `arrayResize`, `substring` and so on. [#46103](https://github.com/ClickHouse/ClickHouse/pull/46103) ([李扬](https://github.com/taiyang-li)). +* Fix assertion in the `welchTTest` function in debug build when the resulting statistics is NaN. Unified the behavior with other similar functions. Change the behavior of `studentTTest` to return NaN instead of throwing an exception because the previous behavior was inconvenient. This closes [#41176](https://github.com/ClickHouse/ClickHouse/issues/41176) This closes [#42162](https://github.com/ClickHouse/ClickHouse/issues/42162). [#46141](https://github.com/ClickHouse/ClickHouse/pull/46141) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* More convenient usage of big integers and ORDER BY WITH FILL. Allow using plain integers for start and end points in WITH FILL when ORDER BY big (128-bit and 256-bit) integers. Fix the wrong result for big integers with negative start or end points. This closes [#16733](https://github.com/ClickHouse/ClickHouse/issues/16733). [#46152](https://github.com/ClickHouse/ClickHouse/pull/46152) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add `parts`, `active_parts` and `total_marks` columns to `system.tables` on [issue](https://github.com/ClickHouse/ClickHouse/issues/44336). [#46161](https://github.com/ClickHouse/ClickHouse/pull/46161) ([attack204](https://github.com/attack204)). +* Functions "multi[Fuzzy]Match(Any|AnyIndex|AllIndices}" now reject regexes which will likely evaluate very slowly in vectorscan. [#46167](https://github.com/ClickHouse/ClickHouse/pull/46167) ([Robert Schulze](https://github.com/rschu1ze)). +* When `insert_null_as_default` is enabled and column doesn't have defined default value, the default of column type will be used. Also this PR fixes using default values on nulls in case of LowCardinality columns. [#46171](https://github.com/ClickHouse/ClickHouse/pull/46171) ([Kruglov Pavel](https://github.com/Avogar)). +* Prefer explicitly defined access keys for S3 clients. If `use_environment_credentials` is set to `true`, and the user has provided the access key through query or config, they will be used instead of the ones from the environment variable. [#46191](https://github.com/ClickHouse/ClickHouse/pull/46191) ([Antonio Andelic](https://github.com/antonio2368)). +* Add an alias "DATE_FORMAT()" for function "formatDateTime()" to improve compatibility with MySQL's SQL dialect, extend function `formatDateTime` with substitutions "a", "b", "c", "h", "i", "k", "l" "r", "s", "W". ### Documentation entry for user-facing changes User-readable short description: `DATE_FORMAT` is an alias of `formatDateTime`. Formats a Time according to the given Format string. Format is a constant expression, so you cannot have multiple formats for a single result column. (Provide link to [formatDateTime](https://clickhouse.com/docs/ja/sql-reference/functions/date-time-functions/#formatdatetime)). [#46302](https://github.com/ClickHouse/ClickHouse/pull/46302) ([Jake Bamrah](https://github.com/JakeBamrah)). +* Add `ProfileEvents` and `CurrentMetrics` about the callback tasks for parallel replicas (`s3Cluster` and `MergeTree` tables). [#46313](https://github.com/ClickHouse/ClickHouse/pull/46313) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add support for `DELETE` and `UPDATE` for tables using `KeeperMap` storage engine. [#46330](https://github.com/ClickHouse/ClickHouse/pull/46330) ([Antonio Andelic](https://github.com/antonio2368)). +* Allow writing RENAME queries with query parameters. Resolves [#45778](https://github.com/ClickHouse/ClickHouse/issues/45778). [#46407](https://github.com/ClickHouse/ClickHouse/pull/46407) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fix parameterized SELECT queries with REPLACE transformer. Resolves [#33002](https://github.com/ClickHouse/ClickHouse/issues/33002). [#46420](https://github.com/ClickHouse/ClickHouse/pull/46420) ([Nikolay Degterinsky](https://github.com/evillique)). +* Exclude the internal database used for temporary/external tables from the calculation of asynchronous metric "NumberOfDatabases". This makes the behavior consistent with system table "system.databases". [#46435](https://github.com/ClickHouse/ClickHouse/pull/46435) ([Robert Schulze](https://github.com/rschu1ze)). +* Added `last_exception_time` column into distribution_queue table. [#46564](https://github.com/ClickHouse/ClickHouse/pull/46564) ([Aleksandr](https://github.com/AVMusorin)). +* Support for IN clause with parameter in parameterized views. [#46583](https://github.com/ClickHouse/ClickHouse/pull/46583) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Do not load named collections on server startup (load them on first access instead). [#46607](https://github.com/ClickHouse/ClickHouse/pull/46607) ([Kseniia Sumarokova](https://github.com/kssenii)). + + +#### Build/Testing/Packaging Improvement +* Introduce GWP-ASan implemented by the LLVM runtime. This closes [#27039](https://github.com/ClickHouse/ClickHouse/issues/27039). [#45226](https://github.com/ClickHouse/ClickHouse/pull/45226) ([Han Fei](https://github.com/hanfei1991)). +* We want to make our tests less stable and more flaky: add randomization for merge tree settings in tests. [#38983](https://github.com/ClickHouse/ClickHouse/pull/38983) ([Anton Popov](https://github.com/CurtizJ)). +* Enable the HDFS support in PowerPC and which helps to fixes the following functional tests 02113_hdfs_assert.sh, 02244_hdfs_cluster.sql and 02368_cancel_write_into_hdfs.sh. [#44949](https://github.com/ClickHouse/ClickHouse/pull/44949) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)). +* Add systemd.service file for clickhouse-keeper. Fixes [#44293](https://github.com/ClickHouse/ClickHouse/issues/44293). [#45568](https://github.com/ClickHouse/ClickHouse/pull/45568) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* ClickHouse's fork of poco was moved from "contrib/" to "base/poco/". [#46075](https://github.com/ClickHouse/ClickHouse/pull/46075) ([Robert Schulze](https://github.com/rschu1ze)). +* Add an option for `clickhouse-watchdog` to restart the child process. This does not make a lot of use. [#46312](https://github.com/ClickHouse/ClickHouse/pull/46312) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* If the environment variable `CLICKHOUSE_DOCKER_RESTART_ON_EXIT` is set to 1, the Docker container will run `clickhouse-server` as a child instead of the first process, and restart it when it exited. [#46391](https://github.com/ClickHouse/ClickHouse/pull/46391) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix Systemd service file. [#46461](https://github.com/ClickHouse/ClickHouse/pull/46461) ([SuperDJY](https://github.com/cmsxbc)). +* Raised the minimum Clang version needed to build ClickHouse from 12 to 15. [#46710](https://github.com/ClickHouse/ClickHouse/pull/46710) ([Robert Schulze](https://github.com/rschu1ze)). +* Upgrade Intel QPL from v0.3.0 to v1.0.0 2. Build libaccel-config and link it statically to QPL library instead of dynamically. [#45809](https://github.com/ClickHouse/ClickHouse/pull/45809) ([jasperzhu](https://github.com/jinjunzh)). + + +#### Bug Fix (user-visible misbehavior in official stable release) + +* Flush data exactly by `rabbitmq_flush_interval_ms` or by `rabbitmq_max_block_size` in `StorageRabbitMQ`. Closes [#42389](https://github.com/ClickHouse/ClickHouse/issues/42389). Closes [#45160](https://github.com/ClickHouse/ClickHouse/issues/45160). [#44404](https://github.com/ClickHouse/ClickHouse/pull/44404) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Use PODArray to render in sparkBar function, so we can control the memory usage. Close [#44467](https://github.com/ClickHouse/ClickHouse/issues/44467). [#44489](https://github.com/ClickHouse/ClickHouse/pull/44489) ([Duc Canh Le](https://github.com/canhld94)). +* Fix functions (quantilesExactExclusive, quantilesExactInclusive) return unsorted array element. [#45379](https://github.com/ClickHouse/ClickHouse/pull/45379) ([wujunfu](https://github.com/wujunfu)). +* Fix uncaught exception in HTTPHandler when open telemetry is enabled. [#45456](https://github.com/ClickHouse/ClickHouse/pull/45456) ([Frank Chen](https://github.com/FrankChen021)). +* Don't infer Dates from 8 digit numbers. It could lead to wrong data to be read. [#45581](https://github.com/ClickHouse/ClickHouse/pull/45581) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixes to correctly use `odbc_bridge_use_connection_pooling` setting. [#45591](https://github.com/ClickHouse/ClickHouse/pull/45591) ([Bharat Nallan](https://github.com/bharatnc)). +* When the callback in the cache is called, it is possible that this cache is destructed. To keep it safe, we capture members by value. It's also safe for task schedule because it will be deactivated before storage is destroyed. Resolve [#45548](https://github.com/ClickHouse/ClickHouse/issues/45548). [#45601](https://github.com/ClickHouse/ClickHouse/pull/45601) ([Han Fei](https://github.com/hanfei1991)). +* Fix data corruption when codecs Delta or DoubleDelta are combined with codec Gorilla. [#45615](https://github.com/ClickHouse/ClickHouse/pull/45615) ([Robert Schulze](https://github.com/rschu1ze)). +* Correctly check types when using N-gram bloom filter index to avoid invalid reads. [#45617](https://github.com/ClickHouse/ClickHouse/pull/45617) ([Antonio Andelic](https://github.com/antonio2368)). +* A couple of segfaults have been reported around `c-ares`. They were introduced in my previous pull requests. I have fixed them with the help of Alexander Tokmakov. [#45629](https://github.com/ClickHouse/ClickHouse/pull/45629) ([Arthur Passos](https://github.com/arthurpassos)). +* Fix key description when encountering duplicate primary keys. This can happen in projections. See [#45590](https://github.com/ClickHouse/ClickHouse/issues/45590) for details. [#45686](https://github.com/ClickHouse/ClickHouse/pull/45686) ([Amos Bird](https://github.com/amosbird)). +* Set compression method and level for backup Closes [#45690](https://github.com/ClickHouse/ClickHouse/issues/45690). [#45737](https://github.com/ClickHouse/ClickHouse/pull/45737) ([Pradeep Chhetri](https://github.com/chhetripradeep)). +* Should use `select_query_typed.limitByOffset` instead of `select_query_typed.limitOffset`. [#45817](https://github.com/ClickHouse/ClickHouse/pull/45817) ([刘陶峰](https://github.com/taofengliu)). +* When use experimental analyzer, queries like `SELECT number FROM numbers(100) LIMIT 10 OFFSET 10;` get wrong results (empty result for this sql). That is caused by an unnecessary offset step added by planner. [#45822](https://github.com/ClickHouse/ClickHouse/pull/45822) ([刘陶峰](https://github.com/taofengliu)). +* Backward compatibility - allow implicit narrowing conversion from UInt64 to IPv4 - required for "INSERT ... VALUES ..." expression. [#45865](https://github.com/ClickHouse/ClickHouse/pull/45865) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Bugfix IPv6 parser for mixed ip4 address with missed first octet (like `::.1.2.3`). [#45871](https://github.com/ClickHouse/ClickHouse/pull/45871) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add the `query_kind` column to the `system.processes` table and the `SHOW PROCESSLIST` query. Remove duplicate code. It fixes a bug: the global configuration parameter `max_concurrent_select_queries` was not respected to queries with `INTERSECT` or `EXCEPT` chains. [#45872](https://github.com/ClickHouse/ClickHouse/pull/45872) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix crash in a function `stochasticLinearRegression`. Found by WingFuzz. [#45985](https://github.com/ClickHouse/ClickHouse/pull/45985) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix crash in `SELECT` queries with `INTERSECT` and `EXCEPT` modifiers that read data from tables with enabled sparse columns (controlled by setting `ratio_of_defaults_for_sparse_serialization`). [#45987](https://github.com/ClickHouse/ClickHouse/pull/45987) ([Anton Popov](https://github.com/CurtizJ)). +* Fix read in order optimization for DESC sorting with FINAL, close [#45815](https://github.com/ClickHouse/ClickHouse/issues/45815). [#46009](https://github.com/ClickHouse/ClickHouse/pull/46009) ([Vladimir C](https://github.com/vdimir)). +* Fix reading of non existing nested columns with multiple level in compact parts. [#46045](https://github.com/ClickHouse/ClickHouse/pull/46045) ([Azat Khuzhin](https://github.com/azat)). +* Fix elapsed column in system.processes (10x error). [#46047](https://github.com/ClickHouse/ClickHouse/pull/46047) ([Azat Khuzhin](https://github.com/azat)). +* Follow-up fix for Replace domain IP types (IPv4, IPv6) with native https://github.com/ClickHouse/ClickHouse/pull/43221. [#46087](https://github.com/ClickHouse/ClickHouse/pull/46087) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix environment variable substitution in the configuration when a parameter already has a value. This closes [#46131](https://github.com/ClickHouse/ClickHouse/issues/46131). This closes [#9547](https://github.com/ClickHouse/ClickHouse/issues/9547). [#46144](https://github.com/ClickHouse/ClickHouse/pull/46144) ([pufit](https://github.com/pufit)). +* Fix incorrect predicate push down with grouping sets. Closes [#45947](https://github.com/ClickHouse/ClickHouse/issues/45947). [#46151](https://github.com/ClickHouse/ClickHouse/pull/46151) ([flynn](https://github.com/ucasfl)). +* Fix possible pipeline stuck error on `fulls_sorting_join` with constant keys. [#46175](https://github.com/ClickHouse/ClickHouse/pull/46175) ([Vladimir C](https://github.com/vdimir)). +* Never rewrite tuple functions as literals during formatting to avoid incorrect results. [#46232](https://github.com/ClickHouse/ClickHouse/pull/46232) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Fix possible out of bounds error while reading LowCardinality(Nullable) in Arrow format. [#46270](https://github.com/ClickHouse/ClickHouse/pull/46270) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix `SYSTEM UNFREEZE` queries failing with the exception `CANNOT_PARSE_INPUT_ASSERTION_FAILED`. [#46325](https://github.com/ClickHouse/ClickHouse/pull/46325) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix possible crash which can be caused by an integer overflow while deserializing aggregating state of a function that stores HashTable. [#46349](https://github.com/ClickHouse/ClickHouse/pull/46349) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible `LOGICAL_ERROR` in asynchronous inserts with invalid data sent in format `VALUES`. [#46350](https://github.com/ClickHouse/ClickHouse/pull/46350) ([Anton Popov](https://github.com/CurtizJ)). +* Fixed a LOGICAL_ERROR on an attempt to execute `ALTER ... MOVE PART ... TO TABLE`. This type of query was never actually supported. [#46359](https://github.com/ClickHouse/ClickHouse/pull/46359) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix s3Cluster schema inference in parallel distributed insert select when `parallel_distributed_insert_select` is enabled. [#46381](https://github.com/ClickHouse/ClickHouse/pull/46381) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix queries like `ALTER TABLE ... UPDATE nested.arr1 = nested.arr2 ...`, where `arr1` and `arr2` are fields of the same `Nested` column. [#46387](https://github.com/ClickHouse/ClickHouse/pull/46387) ([Anton Popov](https://github.com/CurtizJ)). +* Scheduler may fail to schedule a task. If it happens, the whole MulityPartUpload should be aborted and `UploadHelper` must wait for already scheduled tasks. [#46451](https://github.com/ClickHouse/ClickHouse/pull/46451) ([Dmitry Novik](https://github.com/novikd)). +* Fix PREWHERE for Merge with different default types (fixes some `NOT_FOUND_COLUMN_IN_BLOCK` when the default type for the column differs, also allow `PREWHERE` when the type of column is the same across tables, and prohibit it, only if it differs). [#46454](https://github.com/ClickHouse/ClickHouse/pull/46454) ([Azat Khuzhin](https://github.com/azat)). +* Fix a crash that could happen when constant values are used in `ORDER BY`. Fixes [#46466](https://github.com/ClickHouse/ClickHouse/issues/46466). [#46493](https://github.com/ClickHouse/ClickHouse/pull/46493) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Do not throw exception if `disk` setting was specified on query level, but `storage_policy` was specified in config merge tree settings section. `disk` will override setting from config. [#46533](https://github.com/ClickHouse/ClickHouse/pull/46533) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix an invalid processing of constant `LowCardinality` argument in function `arrayMap`. This bug could lead to a segfault in release, and logical error `Bad cast` in debug build. [#46569](https://github.com/ClickHouse/ClickHouse/pull/46569) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* fixes [#46557](https://github.com/ClickHouse/ClickHouse/issues/46557). [#46611](https://github.com/ClickHouse/ClickHouse/pull/46611) ([Alexander Gololobov](https://github.com/davenger)). +* Fix endless restarts of clickhouse-server systemd unit if server cannot start within 1m30sec (Disable timeout logic for starting clickhouse-server from systemd service). [#46613](https://github.com/ClickHouse/ClickHouse/pull/46613) ([Azat Khuzhin](https://github.com/azat)). +* Allocated during asynchronous inserts memory buffers were deallocated in the global context and MemoryTracker counters for corresponding user and query were not updated correctly. That led to false positive OOM exceptions. [#46622](https://github.com/ClickHouse/ClickHouse/pull/46622) ([Dmitry Novik](https://github.com/novikd)). +* Updated to not clear on_expression from table_join as its used by future analyze runs resolves [#45185](https://github.com/ClickHouse/ClickHouse/issues/45185). [#46487](https://github.com/ClickHouse/ClickHouse/pull/46487) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). + + +### ClickHouse release 23.1, 2023-01-26 {#231} + +### ClickHouse release 23.1 + +#### Upgrade Notes +* The `SYSTEM RESTART DISK` query becomes a no-op. [#44647](https://github.com/ClickHouse/ClickHouse/pull/44647) ([alesapin](https://github.com/alesapin)). +* The `PREALLOCATE` option for `HASHED`/`SPARSE_HASHED` dictionaries becomes a no-op. [#45388](https://github.com/ClickHouse/ClickHouse/pull/45388) ([Azat Khuzhin](https://github.com/azat)). It does not give significant advantages anymore. +* Disallow `Gorilla` codec on columns of non-Float32 or non-Float64 type. [#45252](https://github.com/ClickHouse/ClickHouse/pull/45252) ([Robert Schulze](https://github.com/rschu1ze)). It was pointless and led to inconsistencies. +* Parallel quorum inserts might work incorrectly with `*MergeTree` tables created with the deprecated syntax. Therefore, parallel quorum inserts support is completely disabled for such tables. It does not affect tables created with a new syntax. [#45430](https://github.com/ClickHouse/ClickHouse/pull/45430) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Use the `GetObjectAttributes` request instead of the `HeadObject` request to get the size of an object in AWS S3. This change fixes handling endpoints without explicit regions after updating the AWS SDK, for example. [#45288](https://github.com/ClickHouse/ClickHouse/pull/45288) ([Vitaly Baranov](https://github.com/vitlibar)). AWS S3 and Minio are tested, but keep in mind that various S3-compatible services (GCS, R2, B2) may have subtle incompatibilities. This change also may require you to adjust the ACL to allow the `GetObjectAttributes` request. +* Forbid paths in timezone names. For example, a timezone name like `/usr/share/zoneinfo/Asia/Aden` is not allowed; the IANA timezone database name like `Asia/Aden` should be used. [#44225](https://github.com/ClickHouse/ClickHouse/pull/44225) ([Kruglov Pavel](https://github.com/Avogar)). +* Queries combining equijoin and constant expressions (e.g., `JOIN ON t1.x = t2.x AND 1 = 1`) are forbidden due to incorrect results. [#44016](https://github.com/ClickHouse/ClickHouse/pull/44016) ([Vladimir C](https://github.com/vdimir)). + + +#### New Feature +* Dictionary source for extracting keys by traversing regular expressions tree. It can be used for User-Agent parsing. [#40878](https://github.com/ClickHouse/ClickHouse/pull/40878) ([Vage Ogannisian](https://github.com/nooblose)). [#43858](https://github.com/ClickHouse/ClickHouse/pull/43858) ([Han Fei](https://github.com/hanfei1991)). +* Added parametrized view functionality, now it's possible to specify query parameters for the View table engine. resolves [#40907](https://github.com/ClickHouse/ClickHouse/issues/40907). [#41687](https://github.com/ClickHouse/ClickHouse/pull/41687) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add `quantileInterpolatedWeighted`/`quantilesInterpolatedWeighted` functions. [#38252](https://github.com/ClickHouse/ClickHouse/pull/38252) ([Bharat Nallan](https://github.com/bharatnc)). +* Array join support for the `Map` type, like the function "explode" in Spark. [#43239](https://github.com/ClickHouse/ClickHouse/pull/43239) ([李扬](https://github.com/taiyang-li)). +* Support SQL standard binary and hex string literals. [#43785](https://github.com/ClickHouse/ClickHouse/pull/43785) ([Mo Xuan](https://github.com/mo-avatar)). +* Allow formatting `DateTime` in Joda-Time style. Refer to [the Joda-Time docs](https://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html). [#43818](https://github.com/ClickHouse/ClickHouse/pull/43818) ([李扬](https://github.com/taiyang-li)). +* Implemented a fractional second formatter (`%f`) for `formatDateTime`. [#44060](https://github.com/ClickHouse/ClickHouse/pull/44060) ([ltrk2](https://github.com/ltrk2)). [#44497](https://github.com/ClickHouse/ClickHouse/pull/44497) ([Alexander Gololobov](https://github.com/davenger)). +* Added `age` function to calculate the difference between two dates or dates with time values expressed as the number of full units. Closes [#41115](https://github.com/ClickHouse/ClickHouse/issues/41115). [#44421](https://github.com/ClickHouse/ClickHouse/pull/44421) ([Robert Schulze](https://github.com/rschu1ze)). +* Add `Null` source for dictionaries. Closes [#44240](https://github.com/ClickHouse/ClickHouse/issues/44240). [#44502](https://github.com/ClickHouse/ClickHouse/pull/44502) ([mayamika](https://github.com/mayamika)). +* Allow configuring the S3 storage class with the `s3_storage_class` configuration option. Such as `STANDARD/INTELLIGENT_TIERING` Closes [#44443](https://github.com/ClickHouse/ClickHouse/issues/44443). [#44707](https://github.com/ClickHouse/ClickHouse/pull/44707) ([chen](https://github.com/xiedeyantu)). +* Insert default values in case of missing elements in JSON object while parsing named tuple. Add setting `input_format_json_defaults_for_missing_elements_in_named_tuple` that controls this behaviour. Closes [#45142](https://github.com/ClickHouse/ClickHouse/issues/45142)#issuecomment-1380153217. [#45231](https://github.com/ClickHouse/ClickHouse/pull/45231) ([Kruglov Pavel](https://github.com/Avogar)). +* Record server startup time in ProfileEvents (`ServerStartupMilliseconds`). Resolves [#43188](https://github.com/ClickHouse/ClickHouse/issues/43188). [#45250](https://github.com/ClickHouse/ClickHouse/pull/45250) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Refactor and Improve streaming engines Kafka/RabbitMQ/NATS and add support for all formats, also refactor formats a bit: - Fix producing messages in row-based formats with suffixes/prefixes. Now every message is formatted completely with all delimiters and can be parsed back using input format. - Support block-based formats like Native, Parquet, ORC, etc. Every block is formatted as a separate message. The number of rows in one message depends on the block size, so you can control it via the setting `max_block_size`. - Add new engine settings `kafka_max_rows_per_message/rabbitmq_max_rows_per_message/nats_max_rows_per_message`. They control the number of rows formatted in one message in row-based formats. Default value: 1. - Fix high memory consumption in the NATS table engine. - Support arbitrary binary data in NATS producer (previously it worked only with strings contained \0 at the end) - Add missing Kafka/RabbitMQ/NATS engine settings in the documentation. - Refactor producing and consuming in Kafka/RabbitMQ/NATS, separate it from WriteBuffers/ReadBuffers semantic. - Refactor output formats: remove callbacks on each row used in Kafka/RabbitMQ/NATS (now we don't use callbacks there), allow to use IRowOutputFormat directly, clarify row end and row between delimiters, make it possible to reset output format to start formatting again - Add proper implementation in formatRow function (bonus after formats refactoring). [#42777](https://github.com/ClickHouse/ClickHouse/pull/42777) ([Kruglov Pavel](https://github.com/Avogar)). +* Support reading/writing `Nested` tables as `List` of `Struct` in `CapnProto` format. Read/write `Decimal32/64` as `Int32/64`. Closes [#43319](https://github.com/ClickHouse/ClickHouse/issues/43319). [#43379](https://github.com/ClickHouse/ClickHouse/pull/43379) ([Kruglov Pavel](https://github.com/Avogar)). +* Added a `message_format_string` column to `system.text_log`. The column contains a pattern that was used to format the message. [#44543](https://github.com/ClickHouse/ClickHouse/pull/44543) ([Alexander Tokmakov](https://github.com/tavplubix)). This allows various analytics over the ClickHouse logs. +* Try to autodetect headers with column names (and maybe types) for CSV/TSV/CustomSeparated input formats. +Add settings input_format_tsv/csv/custom_detect_header that enable this behaviour (enabled by default). Closes [#44640](https://github.com/ClickHouse/ClickHouse/issues/44640). [#44953](https://github.com/ClickHouse/ClickHouse/pull/44953) ([Kruglov Pavel](https://github.com/Avogar)). + +#### Experimental Feature +* Add an experimental inverted index as a new secondary index type for efficient text search. [#38667](https://github.com/ClickHouse/ClickHouse/pull/38667) ([larryluogit](https://github.com/larryluogit)). +* Add experimental query result cache. [#43797](https://github.com/ClickHouse/ClickHouse/pull/43797) ([Robert Schulze](https://github.com/rschu1ze)). +* Added extendable and configurable scheduling subsystem for IO requests (not yet integrated with IO code itself). [#41840](https://github.com/ClickHouse/ClickHouse/pull/41840) ([Sergei Trifonov](https://github.com/serxa)). This feature does nothing at all, enjoy. +* Added `SYSTEM DROP DATABASE REPLICA` that removes metadata of a dead replica of a `Replicated` database. Resolves [#41794](https://github.com/ClickHouse/ClickHouse/issues/41794). [#42807](https://github.com/ClickHouse/ClickHouse/pull/42807) ([Alexander Tokmakov](https://github.com/tavplubix)). + +#### Performance Improvement +* Do not load inactive parts at startup of `MergeTree` tables. [#42181](https://github.com/ClickHouse/ClickHouse/pull/42181) ([Anton Popov](https://github.com/CurtizJ)). +* Improved latency of reading from storage `S3` and table function `s3` with large numbers of small files. Now settings `remote_filesystem_read_method` and `remote_filesystem_read_prefetch` take effect while reading from storage `S3`. [#43726](https://github.com/ClickHouse/ClickHouse/pull/43726) ([Anton Popov](https://github.com/CurtizJ)). +* Optimization for reading struct fields in Parquet/ORC files. Only the required fields are loaded. [#44484](https://github.com/ClickHouse/ClickHouse/pull/44484) ([lgbo](https://github.com/lgbo-ustc)). +* Two-level aggregation algorithm was mistakenly disabled for queries over the HTTP interface. It was enabled back, and it leads to a major performance improvement. [#45450](https://github.com/ClickHouse/ClickHouse/pull/45450) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Added mmap support for StorageFile, which should improve the performance of clickhouse-local. [#43927](https://github.com/ClickHouse/ClickHouse/pull/43927) ([pufit](https://github.com/pufit)). +* Added sharding support in HashedDictionary to allow parallel load (almost linear scaling based on number of shards). [#40003](https://github.com/ClickHouse/ClickHouse/pull/40003) ([Azat Khuzhin](https://github.com/azat)). +* Speed up query parsing. [#42284](https://github.com/ClickHouse/ClickHouse/pull/42284) ([Raúl Marín](https://github.com/Algunenano)). +* Always replace OR chain `expr = x1 OR ... OR expr = xN` to `expr IN (x1, ..., xN)` in the case where `expr` is a `LowCardinality` column. Setting `optimize_min_equality_disjunction_chain_length` is ignored in this case. [#42889](https://github.com/ClickHouse/ClickHouse/pull/42889) ([Guo Wangyang](https://github.com/guowangy)). +* Slightly improve performance by optimizing the code around ThreadStatus. [#43586](https://github.com/ClickHouse/ClickHouse/pull/43586) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Optimize the column-wise ternary logic evaluation by achieving auto-vectorization. In the performance test of this [microbenchmark](https://github.com/ZhiguoZh/ClickHouse/blob/20221123-ternary-logic-opt-example/src/Functions/examples/associative_applier_perf.cpp), we've observed a peak **performance gain** of **21x** on the ICX device (Intel Xeon Platinum 8380 CPU). [#43669](https://github.com/ClickHouse/ClickHouse/pull/43669) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Avoid acquiring read locks in the `system.tables` table if possible. [#43840](https://github.com/ClickHouse/ClickHouse/pull/43840) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize ThreadPool. The performance experiments of SSB (Star Schema Benchmark) on the ICX device (Intel Xeon Platinum 8380 CPU, 80 cores, 160 threads) shows that this change could effectively decrease the lock contention for ThreadPoolImpl::mutex by **75%**, increasing the CPU utilization and improving the overall performance by **2.4%**. [#44308](https://github.com/ClickHouse/ClickHouse/pull/44308) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Now the optimisation for predicting the hash table size is applied only if the cached hash table size is sufficiently large (thresholds were determined empirically and hardcoded). [#44455](https://github.com/ClickHouse/ClickHouse/pull/44455) ([Nikita Taranov](https://github.com/nickitat)). +* Small performance improvement for asynchronous reading from remote filesystems. [#44868](https://github.com/ClickHouse/ClickHouse/pull/44868) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Add fast path for: - `col like '%%'`; - `col like '%'`; - `col not like '%'`; - `col not like '%'`; - `match(col, '.*')`. [#45244](https://github.com/ClickHouse/ClickHouse/pull/45244) ([李扬](https://github.com/taiyang-li)). +* Slightly improve happy path optimisation in filtering (WHERE clause). [#45289](https://github.com/ClickHouse/ClickHouse/pull/45289) ([Nikita Taranov](https://github.com/nickitat)). +* Provide monotonicity info for `toUnixTimestamp64*` to enable more algebraic optimizations for index analysis. [#44116](https://github.com/ClickHouse/ClickHouse/pull/44116) ([Nikita Taranov](https://github.com/nickitat)). +* Allow the configuration of temporary data for query processing (spilling to disk) to cooperate with the filesystem cache (taking up the space from the cache disk) [#43972](https://github.com/ClickHouse/ClickHouse/pull/43972) ([Vladimir C](https://github.com/vdimir)). This mainly improves [ClickHouse Cloud](https://clickhouse.cloud/), but can be used for self-managed setups as well, if you know what to do. +* Make `system.replicas` table do parallel fetches of replicas statuses. Closes [#43918](https://github.com/ClickHouse/ClickHouse/issues/43918). [#43998](https://github.com/ClickHouse/ClickHouse/pull/43998) ([Nikolay Degterinsky](https://github.com/evillique)). +* Optimize memory consumption during backup to S3: files to S3 now will be copied directly without using `WriteBufferFromS3` (which could use a lot of memory). [#45188](https://github.com/ClickHouse/ClickHouse/pull/45188) ([Vitaly Baranov](https://github.com/vitlibar)). +* Add a cache for async block ids. This will reduce the number of requests of ZooKeeper when we enable async inserts deduplication. [#45106](https://github.com/ClickHouse/ClickHouse/pull/45106) ([Han Fei](https://github.com/hanfei1991)). + +#### Improvement + +* Use structure from insertion table in generateRandom without arguments. [#45239](https://github.com/ClickHouse/ClickHouse/pull/45239) ([Kruglov Pavel](https://github.com/Avogar)). +* Allow to implicitly convert floats stored in string fields of JSON to integers in `JSONExtract` functions. E.g. `JSONExtract('{"a": "1000.111"}', 'a', 'UInt64')` -> `1000`, previously it returned 0. [#45432](https://github.com/ClickHouse/ClickHouse/pull/45432) ([Anton Popov](https://github.com/CurtizJ)). +* Added fields `supports_parallel_parsing` and `supports_parallel_formatting` to table `system.formats` for better introspection. [#45499](https://github.com/ClickHouse/ClickHouse/pull/45499) ([Anton Popov](https://github.com/CurtizJ)). +* Improve reading CSV field in CustomSeparated/Template format. Closes [#42352](https://github.com/ClickHouse/ClickHouse/issues/42352) Closes [#39620](https://github.com/ClickHouse/ClickHouse/issues/39620). [#43332](https://github.com/ClickHouse/ClickHouse/pull/43332) ([Kruglov Pavel](https://github.com/Avogar)). +* Unify query elapsed time measurements. [#43455](https://github.com/ClickHouse/ClickHouse/pull/43455) ([Raúl Marín](https://github.com/Algunenano)). +* Improve automatic usage of structure from insertion table in table functions file/hdfs/s3 when virtual columns are present in a select query, it fixes the possible error `Block structure mismatch` or `number of columns mismatch`. [#43695](https://github.com/ClickHouse/ClickHouse/pull/43695) ([Kruglov Pavel](https://github.com/Avogar)). +* Add support for signed arguments in the function `range`. Fixes [#43333](https://github.com/ClickHouse/ClickHouse/issues/43333). [#43733](https://github.com/ClickHouse/ClickHouse/pull/43733) ([sanyu](https://github.com/wineternity)). +* Remove redundant sorting, for example, sorting related ORDER BY clauses in subqueries. Implemented on top of query plan. It does similar optimization as `optimize_duplicate_order_by_and_distinct` regarding `ORDER BY` clauses, but more generic, since it's applied to any redundant sorting steps (not only caused by ORDER BY clause) and applied to subqueries of any depth. Related to [#42648](https://github.com/ClickHouse/ClickHouse/issues/42648). [#43905](https://github.com/ClickHouse/ClickHouse/pull/43905) ([Igor Nikonov](https://github.com/devcrafter)). +* Add the ability to disable deduplication of files for BACKUP (for backups without deduplication ATTACH can be used instead of full RESTORE). For example `BACKUP foo TO S3(...) SETTINGS deduplicate_files=0` (default `deduplicate_files=1`). [#43947](https://github.com/ClickHouse/ClickHouse/pull/43947) ([Azat Khuzhin](https://github.com/azat)). +* Refactor and improve schema inference for text formats. Add new setting `schema_inference_make_columns_nullable` that controls making result types `Nullable` (enabled by default);. [#44019](https://github.com/ClickHouse/ClickHouse/pull/44019) ([Kruglov Pavel](https://github.com/Avogar)). +* Better support for `PROXYv1` protocol. [#44135](https://github.com/ClickHouse/ClickHouse/pull/44135) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add information about the latest part check by cleanup threads into `system.parts` table. [#44244](https://github.com/ClickHouse/ClickHouse/pull/44244) ([Dmitry Novik](https://github.com/novikd)). +* Disable table functions in readonly mode for inserts. [#44290](https://github.com/ClickHouse/ClickHouse/pull/44290) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add a setting `simultaneous_parts_removal_limit` to allow limiting the number of parts being processed by one iteration of CleanupThread. [#44461](https://github.com/ClickHouse/ClickHouse/pull/44461) ([Dmitry Novik](https://github.com/novikd)). +* Do not initialize ReadBufferFromS3 when only virtual columns are needed in a query. This may be helpful to [#44246](https://github.com/ClickHouse/ClickHouse/issues/44246). [#44493](https://github.com/ClickHouse/ClickHouse/pull/44493) ([chen](https://github.com/xiedeyantu)). +* Prevent duplicate column names hints. Closes [#44130](https://github.com/ClickHouse/ClickHouse/issues/44130). [#44519](https://github.com/ClickHouse/ClickHouse/pull/44519) ([Joanna Hulboj](https://github.com/jh0x)). +* Allow macro substitution in endpoint of disks. Resolve [#40951](https://github.com/ClickHouse/ClickHouse/issues/40951). [#44533](https://github.com/ClickHouse/ClickHouse/pull/44533) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Improve schema inference when `input_format_json_read_object_as_string` is enabled. [#44546](https://github.com/ClickHouse/ClickHouse/pull/44546) ([Kruglov Pavel](https://github.com/Avogar)). +* Add a user-level setting `database_replicated_allow_replicated_engine_arguments` which allows banning the creation of `ReplicatedMergeTree` tables with arguments in `DatabaseReplicated`. [#44566](https://github.com/ClickHouse/ClickHouse/pull/44566) ([alesapin](https://github.com/alesapin)). +* Prevent users from mistakenly specifying zero (invalid) value for `index_granularity`. This closes [#44536](https://github.com/ClickHouse/ClickHouse/issues/44536). [#44578](https://github.com/ClickHouse/ClickHouse/pull/44578) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Added possibility to set path to service keytab file in `keytab` parameter in `kerberos` section of config.xml. [#44594](https://github.com/ClickHouse/ClickHouse/pull/44594) ([Roman Vasin](https://github.com/rvasin)). +* Use already written part of the query for fuzzy search (pass to the `skim` library, which is written in Rust and linked statically to ClickHouse). [#44600](https://github.com/ClickHouse/ClickHouse/pull/44600) ([Azat Khuzhin](https://github.com/azat)). +* Enable `input_format_json_read_objects_as_strings` by default to be able to read nested JSON objects while JSON Object type is experimental. [#44657](https://github.com/ClickHouse/ClickHouse/pull/44657) ([Kruglov Pavel](https://github.com/Avogar)). +* Improvement for deduplication of async inserts: when users do duplicate async inserts, we should deduplicate inside the memory before we query Keeper. [#44682](https://github.com/ClickHouse/ClickHouse/pull/44682) ([Han Fei](https://github.com/hanfei1991)). +* Input/output `Avro` format will parse bool type as ClickHouse bool type. [#44684](https://github.com/ClickHouse/ClickHouse/pull/44684) ([Kruglov Pavel](https://github.com/Avogar)). +* Support Bool type in Arrow/Parquet/ORC. Closes [#43970](https://github.com/ClickHouse/ClickHouse/issues/43970). [#44698](https://github.com/ClickHouse/ClickHouse/pull/44698) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't greedily parse beyond the quotes when reading UUIDs - it may lead to mistakenly successful parsing of incorrect data. [#44686](https://github.com/ClickHouse/ClickHouse/pull/44686) ([Raúl Marín](https://github.com/Algunenano)). +* Infer UInt64 in case of Int64 overflow and fix some transforms in schema inference. [#44696](https://github.com/ClickHouse/ClickHouse/pull/44696) ([Kruglov Pavel](https://github.com/Avogar)). +* Previously dependency resolving inside `Replicated` database was done in a hacky way, and now it's done right using an explicit graph. [#44697](https://github.com/ClickHouse/ClickHouse/pull/44697) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Fix `output_format_pretty_row_numbers` does not preserve the counter across the blocks. Closes [#44815](https://github.com/ClickHouse/ClickHouse/issues/44815). [#44832](https://github.com/ClickHouse/ClickHouse/pull/44832) ([flynn](https://github.com/ucasfl)). +* Don't report errors in `system.errors` due to parts being merged concurrently with the background cleanup process. [#44874](https://github.com/ClickHouse/ClickHouse/pull/44874) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize and fix metrics for Distributed async INSERT. [#44922](https://github.com/ClickHouse/ClickHouse/pull/44922) ([Azat Khuzhin](https://github.com/azat)). +* Added settings to disallow concurrent backups and restores resolves [#43891](https://github.com/ClickHouse/ClickHouse/issues/43891) Implementation: * Added server-level settings to disallow concurrent backups and restores, which are read and set when BackupWorker is created in Context. * Settings are set to true by default. * Before starting backup or restores, added a check to see if any other backups/restores are running. For internal requests, it checks if it is from the self node using backup_uuid. [#45072](https://github.com/ClickHouse/ClickHouse/pull/45072) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Add `` config parameter for system logs. [#45320](https://github.com/ClickHouse/ClickHouse/pull/45320) ([Stig Bakken](https://github.com/stigsb)). + +#### Build/Testing/Packaging Improvement +* Statically link with the `skim` library (it is written in Rust) for fuzzy search in clickhouse client/local history. [#44239](https://github.com/ClickHouse/ClickHouse/pull/44239) ([Azat Khuzhin](https://github.com/azat)). +* We removed support for shared linking because of Rust. Actually, Rust is only an excuse for this removal, and we wanted to remove it nevertheless. [#44828](https://github.com/ClickHouse/ClickHouse/pull/44828) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Remove the dependency on the `adduser` tool from the packages, because we don't use it. This fixes [#44934](https://github.com/ClickHouse/ClickHouse/issues/44934). [#45011](https://github.com/ClickHouse/ClickHouse/pull/45011) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The `SQLite` library is updated to the latest. It is used for the SQLite database and table integration engines. Also, fixed a false-positive TSan report. This closes [#45027](https://github.com/ClickHouse/ClickHouse/issues/45027). [#45031](https://github.com/ClickHouse/ClickHouse/pull/45031) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* CRC-32 changes to address the WeakHash collision issue in PowerPC. [#45144](https://github.com/ClickHouse/ClickHouse/pull/45144) ([MeenaRenganathan22](https://github.com/MeenaRenganathan22)). +* Update aws-c* submodules [#43020](https://github.com/ClickHouse/ClickHouse/pull/43020) ([Vitaly Baranov](https://github.com/vitlibar)). +* Automatically merge green backport PRs and green approved PRs [#41110](https://github.com/ClickHouse/ClickHouse/pull/41110) ([Mikhail f. Shiryaev](https://github.com/Felixoid)). +* Introduce a [website](https://aretestsgreenyet.com/) for the status of ClickHouse CI. [Source](https://github.com/ClickHouse/aretestsgreenyet). + +#### Bug Fix + +* Replace domain IP types (IPv4, IPv6) with native. [#43221](https://github.com/ClickHouse/ClickHouse/pull/43221) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). It automatically fixes some missing implementations in the code. +* Fix the backup process if mutations get killed during the backup process. [#45351](https://github.com/ClickHouse/ClickHouse/pull/45351) ([Vitaly Baranov](https://github.com/vitlibar)). +* Fix the `Invalid number of rows in Chunk` exception message. [#41404](https://github.com/ClickHouse/ClickHouse/issues/41404). [#42126](https://github.com/ClickHouse/ClickHouse/pull/42126) ([Alexander Gololobov](https://github.com/davenger)). +* Fix possible use of an uninitialized value after executing expressions after sorting. Closes [#43386](https://github.com/ClickHouse/ClickHouse/issues/43386) [#43635](https://github.com/ClickHouse/ClickHouse/pull/43635) ([Kruglov Pavel](https://github.com/Avogar)). +* Better handling of NULL in aggregate combinators, fix possible segfault/logical error while using an obscure optimization `optimize_rewrite_sum_if_to_count_if`. Closes [#43758](https://github.com/ClickHouse/ClickHouse/issues/43758). [#43813](https://github.com/ClickHouse/ClickHouse/pull/43813) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix CREATE USER/ROLE query settings constraints. [#43993](https://github.com/ClickHouse/ClickHouse/pull/43993) ([Nikolay Degterinsky](https://github.com/evillique)). +* Fixed bug with non-parsable default value for `EPHEMERAL` column in table metadata. [#44026](https://github.com/ClickHouse/ClickHouse/pull/44026) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix parsing of bad version from compatibility setting. [#44224](https://github.com/ClickHouse/ClickHouse/pull/44224) ([Kruglov Pavel](https://github.com/Avogar)). +* Bring interval subtraction from datetime in line with addition. [#44241](https://github.com/ClickHouse/ClickHouse/pull/44241) ([ltrk2](https://github.com/ltrk2)). +* Remove limits on the maximum size of the result for view. [#44261](https://github.com/ClickHouse/ClickHouse/pull/44261) ([lizhuoyu5](https://github.com/lzydmxy)). +* Fix possible logical error in cache if `do_not_evict_index_and_mrk_files=1`. Closes [#42142](https://github.com/ClickHouse/ClickHouse/issues/42142). [#44268](https://github.com/ClickHouse/ClickHouse/pull/44268) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible too early cache write interruption in write-through cache (caching could be stopped due to false assumption when it shouldn't have). [#44289](https://github.com/ClickHouse/ClickHouse/pull/44289) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Fix possible crash in the case function `IN` with constant arguments was used as a constant argument together with `LowCardinality`. Fixes [#44221](https://github.com/ClickHouse/ClickHouse/issues/44221). [#44346](https://github.com/ClickHouse/ClickHouse/pull/44346) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix support for complex parameters (like arrays) of parametric aggregate functions. This closes [#30975](https://github.com/ClickHouse/ClickHouse/issues/30975). The aggregate function `sumMapFiltered` was unusable in distributed queries before this change. [#44358](https://github.com/ClickHouse/ClickHouse/pull/44358) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix reading ObjectId in BSON schema inference. [#44382](https://github.com/ClickHouse/ClickHouse/pull/44382) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix race which can lead to premature temp parts removal before merge finishes in ReplicatedMergeTree. This issue could lead to errors like `No such file or directory: xxx`. Fixes [#43983](https://github.com/ClickHouse/ClickHouse/issues/43983). [#44383](https://github.com/ClickHouse/ClickHouse/pull/44383) ([alesapin](https://github.com/alesapin)). +* Some invalid `SYSTEM ... ON CLUSTER` queries worked in an unexpected way if a cluster name was not specified. It's fixed, now invalid queries throw `SYNTAX_ERROR` as they should. Fixes [#44264](https://github.com/ClickHouse/ClickHouse/issues/44264). [#44387](https://github.com/ClickHouse/ClickHouse/pull/44387) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Fix reading Map type in ORC format. [#44400](https://github.com/ClickHouse/ClickHouse/pull/44400) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix reading columns that are not presented in input data in Parquet/ORC formats. Previously it could lead to error `INCORRECT_NUMBER_OF_COLUMNS`. Closes [#44333](https://github.com/ClickHouse/ClickHouse/issues/44333). [#44405](https://github.com/ClickHouse/ClickHouse/pull/44405) ([Kruglov Pavel](https://github.com/Avogar)). +* Previously the `bar` function used the same '▋' (U+258B "Left five eighths block") character to display both 5/8 and 6/8 bars. This change corrects this behavior by using '▊' (U+258A "Left three quarters block") for displaying 6/8 bar. [#44410](https://github.com/ClickHouse/ClickHouse/pull/44410) ([Alexander Gololobov](https://github.com/davenger)). +* Placing profile settings after profile settings constraints in the configuration file made constraints ineffective. [#44411](https://github.com/ClickHouse/ClickHouse/pull/44411) ([Konstantin Bogdanov](https://github.com/thevar1able)). +* Fix `SYNTAX_ERROR` while running `EXPLAIN AST INSERT` queries with data. Closes [#44207](https://github.com/ClickHouse/ClickHouse/issues/44207). [#44413](https://github.com/ClickHouse/ClickHouse/pull/44413) ([save-my-heart](https://github.com/save-my-heart)). +* Fix reading bool value with CRLF in CSV format. Closes [#44401](https://github.com/ClickHouse/ClickHouse/issues/44401). [#44442](https://github.com/ClickHouse/ClickHouse/pull/44442) ([Kruglov Pavel](https://github.com/Avogar)). +* Don't execute and/or/if/multiIf on a LowCardinality dictionary, so the result type cannot be LowCardinality. It could lead to the error `Illegal column ColumnLowCardinality` in some cases. Fixes [#43603](https://github.com/ClickHouse/ClickHouse/issues/43603). [#44469](https://github.com/ClickHouse/ClickHouse/pull/44469) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix mutations with the setting `max_streams_for_merge_tree_reading`. [#44472](https://github.com/ClickHouse/ClickHouse/pull/44472) ([Anton Popov](https://github.com/CurtizJ)). +* Fix potential null pointer dereference with GROUPING SETS in ASTSelectQuery::formatImpl ([#43049](https://github.com/ClickHouse/ClickHouse/issues/43049)). [#44479](https://github.com/ClickHouse/ClickHouse/pull/44479) ([Robert Schulze](https://github.com/rschu1ze)). +* Validate types in table function arguments, CAST function arguments, JSONAsObject schema inference according to settings. [#44501](https://github.com/ClickHouse/ClickHouse/pull/44501) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix IN function with LowCardinality and const column, close [#44503](https://github.com/ClickHouse/ClickHouse/issues/44503). [#44506](https://github.com/ClickHouse/ClickHouse/pull/44506) ([Duc Canh Le](https://github.com/canhld94)). +* Fixed a bug in the normalization of a `DEFAULT` expression in `CREATE TABLE` statement. The second argument of the function `in` (or the right argument of operator `IN`) might be replaced with the result of its evaluation during CREATE query execution. Fixes [#44496](https://github.com/ClickHouse/ClickHouse/issues/44496). [#44547](https://github.com/ClickHouse/ClickHouse/pull/44547) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Projections do not work in presence of WITH ROLLUP, WITH CUBE and WITH TOTALS. In previous versions, a query produced an exception instead of skipping the usage of projections. This closes [#44614](https://github.com/ClickHouse/ClickHouse/issues/44614). This closes [#42772](https://github.com/ClickHouse/ClickHouse/issues/42772). [#44615](https://github.com/ClickHouse/ClickHouse/pull/44615) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Async blocks were not cleaned because the function `get all blocks sorted by time` didn't get async blocks. [#44651](https://github.com/ClickHouse/ClickHouse/pull/44651) ([Han Fei](https://github.com/hanfei1991)). +* Fix `LOGICAL_ERROR` `The top step of the right pipeline should be ExpressionStep` for JOIN with subquery, UNION, and TOTALS. Fixes [#43687](https://github.com/ClickHouse/ClickHouse/issues/43687). [#44673](https://github.com/ClickHouse/ClickHouse/pull/44673) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Avoid `std::out_of_range` exception in the Executable table engine. [#44681](https://github.com/ClickHouse/ClickHouse/pull/44681) ([Kruglov Pavel](https://github.com/Avogar)). +* Do not apply `optimize_syntax_fuse_functions` to quantiles on AST, close [#44712](https://github.com/ClickHouse/ClickHouse/issues/44712). [#44713](https://github.com/ClickHouse/ClickHouse/pull/44713) ([Vladimir C](https://github.com/vdimir)). +* Fix bug with wrong type in Merge table and PREWHERE, close [#43324](https://github.com/ClickHouse/ClickHouse/issues/43324). [#44716](https://github.com/ClickHouse/ClickHouse/pull/44716) ([Vladimir C](https://github.com/vdimir)). +* Fix a possible crash during shutdown (while destroying TraceCollector). Fixes [#44757](https://github.com/ClickHouse/ClickHouse/issues/44757). [#44758](https://github.com/ClickHouse/ClickHouse/pull/44758) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix a possible crash in distributed query processing. The crash could happen if a query with totals or extremes returned an empty result and there are mismatched types in the Distributed and the local tables. Fixes [#44738](https://github.com/ClickHouse/ClickHouse/issues/44738). [#44760](https://github.com/ClickHouse/ClickHouse/pull/44760) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix fsync for fetches (`min_compressed_bytes_to_fsync_after_fetch`)/small files (ttl.txt, columns.txt) in mutations (`min_rows_to_fsync_after_merge`/`min_compressed_bytes_to_fsync_after_merge`). [#44781](https://github.com/ClickHouse/ClickHouse/pull/44781) ([Azat Khuzhin](https://github.com/azat)). +* A rare race condition was possible when querying the `system.parts` or `system.parts_columns` tables in the presence of parts being moved between disks. Introduced in [#41145](https://github.com/ClickHouse/ClickHouse/issues/41145). [#44809](https://github.com/ClickHouse/ClickHouse/pull/44809) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix the error `Context has expired` which could appear with enabled projections optimization. Can be reproduced for queries with specific functions, like `dictHas/dictGet` which use context in runtime. Fixes [#44844](https://github.com/ClickHouse/ClickHouse/issues/44844). [#44850](https://github.com/ClickHouse/ClickHouse/pull/44850) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* A fix for `Cannot read all data` error which could happen while reading `LowCardinality` dictionary from remote fs. Fixes [#44709](https://github.com/ClickHouse/ClickHouse/issues/44709). [#44875](https://github.com/ClickHouse/ClickHouse/pull/44875) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Ignore cases when hardware monitor sensors cannot be read instead of showing a full exception message in logs. [#44895](https://github.com/ClickHouse/ClickHouse/pull/44895) ([Raúl Marín](https://github.com/Algunenano)). +* Use `max_delay_to_insert` value in case the calculated time to delay INSERT exceeds the setting value. Related to [#44902](https://github.com/ClickHouse/ClickHouse/issues/44902). [#44916](https://github.com/ClickHouse/ClickHouse/pull/44916) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix error `Different order of columns in UNION subquery` for queries with `UNION`. Fixes [#44866](https://github.com/ClickHouse/ClickHouse/issues/44866). [#44920](https://github.com/ClickHouse/ClickHouse/pull/44920) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Delay for INSERT can be calculated incorrectly, which can lead to always using `max_delay_to_insert` setting as delay instead of a correct value. Using simple formula `max_delay_to_insert * (parts_over_threshold/max_allowed_parts_over_threshold)` i.e. delay grows proportionally to parts over threshold. Closes [#44902](https://github.com/ClickHouse/ClickHouse/issues/44902). [#44954](https://github.com/ClickHouse/ClickHouse/pull/44954) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix alter table TTL error when a wide part has the lightweight delete mask. [#44959](https://github.com/ClickHouse/ClickHouse/pull/44959) ([Mingliang Pan](https://github.com/liangliangpan)). +* Follow-up fix for Replace domain IP types (IPv4, IPv6) with native [#43221](https://github.com/ClickHouse/ClickHouse/issues/43221). [#45024](https://github.com/ClickHouse/ClickHouse/pull/45024) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Follow-up fix for Replace domain IP types (IPv4, IPv6) with native https://github.com/ClickHouse/ClickHouse/pull/43221. [#45043](https://github.com/ClickHouse/ClickHouse/pull/45043) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* A buffer overflow was possible in the parser. Found by fuzzer. [#45047](https://github.com/ClickHouse/ClickHouse/pull/45047) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Fix possible cannot-read-all-data error in storage FileLog. Closes [#45051](https://github.com/ClickHouse/ClickHouse/issues/45051), [#38257](https://github.com/ClickHouse/ClickHouse/issues/38257). [#45057](https://github.com/ClickHouse/ClickHouse/pull/45057) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Memory efficient aggregation (setting `distributed_aggregation_memory_efficient`) is disabled when grouping sets are present in the query. [#45058](https://github.com/ClickHouse/ClickHouse/pull/45058) ([Nikita Taranov](https://github.com/nickitat)). +* Fix `RANGE_HASHED` dictionary to count range columns as part of the primary key during updates when `update_field` is specified. Closes [#44588](https://github.com/ClickHouse/ClickHouse/issues/44588). [#45061](https://github.com/ClickHouse/ClickHouse/pull/45061) ([Maksim Kita](https://github.com/kitaisreal)). +* Fix error `Cannot capture column` for `LowCardinality` captured argument of nested lambda. Fixes [#45028](https://github.com/ClickHouse/ClickHouse/issues/45028). [#45065](https://github.com/ClickHouse/ClickHouse/pull/45065) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix the wrong query result of `additional_table_filters` (additional filter was not applied) in case the minmax/count projection is used. [#45133](https://github.com/ClickHouse/ClickHouse/pull/45133) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fixed bug in `histogram` function accepting negative values. [#45147](https://github.com/ClickHouse/ClickHouse/pull/45147) ([simpleton](https://github.com/rgzntrade)). +* Fix wrong column nullability in StoreageJoin, close [#44940](https://github.com/ClickHouse/ClickHouse/issues/44940). [#45184](https://github.com/ClickHouse/ClickHouse/pull/45184) ([Vladimir C](https://github.com/vdimir)). +* Fix `background_fetches_pool_size` settings reload (increase at runtime). [#45189](https://github.com/ClickHouse/ClickHouse/pull/45189) ([Raúl Marín](https://github.com/Algunenano)). +* Correctly process `SELECT` queries on KV engines (e.g. KeeperMap, EmbeddedRocksDB) using `IN` on the key with subquery producing different type. [#45215](https://github.com/ClickHouse/ClickHouse/pull/45215) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix logical error in SEMI JOIN & join_use_nulls in some cases, close [#45163](https://github.com/ClickHouse/ClickHouse/issues/45163), close [#45209](https://github.com/ClickHouse/ClickHouse/issues/45209). [#45230](https://github.com/ClickHouse/ClickHouse/pull/45230) ([Vladimir C](https://github.com/vdimir)). +* Fix heap-use-after-free in reading from s3. [#45253](https://github.com/ClickHouse/ClickHouse/pull/45253) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug when the Avro Union type is ['null', Nested type], closes [#45275](https://github.com/ClickHouse/ClickHouse/issues/45275). Fix bug that incorrectly infers `bytes` type to `Float`. [#45276](https://github.com/ClickHouse/ClickHouse/pull/45276) ([flynn](https://github.com/ucasfl)). +* Throw a correct exception when explicit PREWHERE cannot be used with a table using the storage engine `Merge`. [#45319](https://github.com/ClickHouse/ClickHouse/pull/45319) ([Antonio Andelic](https://github.com/antonio2368)). +* Under WSL1 Ubuntu self-extracting ClickHouse fails to decompress due to inconsistency - /proc/self/maps reporting 32bit file's inode, while stat reporting 64bit inode. [#45339](https://github.com/ClickHouse/ClickHouse/pull/45339) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix race in Distributed table startup (that could lead to processing file of async INSERT multiple times). [#45360](https://github.com/ClickHouse/ClickHouse/pull/45360) ([Azat Khuzhin](https://github.com/azat)). +* Fix a possible crash while reading from storage `S3` and table function `s3` in the case when `ListObject` request has failed. [#45371](https://github.com/ClickHouse/ClickHouse/pull/45371) ([Anton Popov](https://github.com/CurtizJ)). +* Fix `SELECT ... FROM system.dictionaries` exception when there is a dictionary with a bad structure (e.g. incorrect type in XML config). [#45399](https://github.com/ClickHouse/ClickHouse/pull/45399) ([Aleksei Filatov](https://github.com/aalexfvk)). +* Fix s3Cluster schema inference when structure from insertion table is used in `INSERT INTO ... SELECT * FROM s3Cluster` queries. [#45422](https://github.com/ClickHouse/ClickHouse/pull/45422) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix bug in JSON/BSONEachRow parsing with HTTP that could lead to using default values for some columns instead of values from data. [#45424](https://github.com/ClickHouse/ClickHouse/pull/45424) ([Kruglov Pavel](https://github.com/Avogar)). +* Fixed bug (Code: 632. DB::Exception: Unexpected data ... after parsed IPv6 value ...) with typed parsing of IP types from text source. [#45425](https://github.com/ClickHouse/ClickHouse/pull/45425) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* close [#45297](https://github.com/ClickHouse/ClickHouse/issues/45297) Add check for empty regular expressions. [#45428](https://github.com/ClickHouse/ClickHouse/pull/45428) ([Han Fei](https://github.com/hanfei1991)). +* Fix possible (likely distributed) query hung. [#45448](https://github.com/ClickHouse/ClickHouse/pull/45448) ([Azat Khuzhin](https://github.com/azat)). +* Fix possible deadlock with `allow_asynchronous_read_from_io_pool_for_merge_tree` enabled in case of exception from `ThreadPool::schedule`. [#45481](https://github.com/ClickHouse/ClickHouse/pull/45481) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). +* Fix possible in-use table after DETACH. [#45493](https://github.com/ClickHouse/ClickHouse/pull/45493) ([Azat Khuzhin](https://github.com/azat)). +* Fix rare abort in the case when a query is canceled and parallel parsing was used during its execution. [#45498](https://github.com/ClickHouse/ClickHouse/pull/45498) ([Anton Popov](https://github.com/CurtizJ)). +* Fix a race between Distributed table creation and INSERT into it (could lead to CANNOT_LINK during INSERT into the table). [#45502](https://github.com/ClickHouse/ClickHouse/pull/45502) ([Azat Khuzhin](https://github.com/azat)). +* Add proper default (SLRU) to cache policy getter. Closes [#45514](https://github.com/ClickHouse/ClickHouse/issues/45514). [#45524](https://github.com/ClickHouse/ClickHouse/pull/45524) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disallow array join in mutations closes [#42637](https://github.com/ClickHouse/ClickHouse/issues/42637) [#44447](https://github.com/ClickHouse/ClickHouse/pull/44447) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Fix for qualified asterisks with alias table name and column transformer. Resolves [#44736](https://github.com/ClickHouse/ClickHouse/issues/44736). [#44755](https://github.com/ClickHouse/ClickHouse/pull/44755) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). + +## [Changelog for 2022](https://clickhouse.com/docs/ja/whats-new/changelog/2022) diff --git a/docs/ja/whats-new/changelog/_category_.yml b/docs/ja/whats-new/changelog/_category_.yml new file mode 100644 index 00000000000..133c43eeda3 --- /dev/null +++ b/docs/ja/whats-new/changelog/_category_.yml @@ -0,0 +1,7 @@ +position: 10 +label: 'Changelog' +collapsible: true +collapsed: true +link: + type: generated-index + title: Changelog diff --git a/docs/ja/whats-new/changelog/cloud.md b/docs/ja/whats-new/changelog/cloud.md new file mode 100644 index 00000000000..fd538cf56d5 --- /dev/null +++ b/docs/ja/whats-new/changelog/cloud.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 1 +sidebar_label: Cloud +--- +# Cloud Changelog + +import CloudChangelog from '@site/docs/ja/cloud/reference/changelog.md'; + + diff --git a/docs/ja/whats-new/changelog/index.md b/docs/ja/whats-new/changelog/index.md new file mode 100644 index 00000000000..67cd30a94a6 --- /dev/null +++ b/docs/ja/whats-new/changelog/index.md @@ -0,0 +1,184 @@ +--- +slug: /ja/whats-new/changelog/ +sidebar_position: 2 +sidebar_label: 2024 +title: 2024 Changelog +note: This file is autogenerated by the yarn new-build +--- + +### Table of Contents +**[ClickHouse release v24.1, 2024-01-30](#241)**
    +**[Changelog for 2023](https://clickhouse.com/docs/en/whats-new/changelog/2023/)**
    + +# 2024 Changelog + +### ClickHouse release 24.1, 2024-01-30 + +#### Backward Incompatible Change +* The setting `print_pretty_type_names` is turned on by default. You can turn it off to keep the old behavior or `SET compatibility = '23.12'`. [#57726](https://github.com/ClickHouse/ClickHouse/pull/57726) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* The MergeTree setting `clean_deleted_rows` is deprecated, it has no effect anymore. The `CLEANUP` keyword for `OPTIMIZE` is not allowed by default (unless `allow_experimental_replacing_merge_with_cleanup` is enabled). [#58316](https://github.com/ClickHouse/ClickHouse/pull/58316) ([Alexander Tokmakov](https://github.com/tavplubix)). +* The function `reverseDNSQuery` is no longer available. This closes [#58368](https://github.com/ClickHouse/ClickHouse/issues/58368). [#58369](https://github.com/ClickHouse/ClickHouse/pull/58369) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Enable various changes to improve the access control in the configuration file. These changes affect the behavior, and you check the `config.xml` in the `access_control_improvements` section. In case you are not confident, keep the values in the configuration file as they were in the previous version. [#58584](https://github.com/ClickHouse/ClickHouse/pull/58584) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the operation of `sumMapFiltered` with NaN values. NaN values are now placed at the end (instead of randomly) and considered different from any values. `-0` is now also treated as equal to `0`; since 0 values are discarded, `-0` values are discarded too. [#58959](https://github.com/ClickHouse/ClickHouse/pull/58959) ([Raúl Marín](https://github.com/Algunenano)). +* The function `visibleWidth` will behave according to the docs. In previous versions, it simply counted code points after string serialization, like the `lengthUTF8` function, but didn't consider zero-width and combining characters, full-width characters, tabs, and deletes. Now the behavior is changed accordingly. If you want to keep the old behavior, set `function_visible_width_behavior` to `0`, or set `compatibility` to `23.12` or lower. [#59022](https://github.com/ClickHouse/ClickHouse/pull/59022) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `Kusto` dialect is disabled until these two bugs will be fixed: [#59037](https://github.com/ClickHouse/ClickHouse/issues/59037) and [#59036](https://github.com/ClickHouse/ClickHouse/issues/59036). [#59305](https://github.com/ClickHouse/ClickHouse/pull/59305) ([Alexey Milovidov](https://github.com/alexey-milovidov)). Any attempt to use `Kusto` will result in exception. +* More efficient implementation of the `FINAL` modifier no longer guarantees preserving the order even if `max_threads = 1`. If you counted on the previous behavior, set `enable_vertical_final` to 0 or `compatibility` to `23.12`. + +#### New Feature +* Implement Variant data type that represents a union of other data types. Type `Variant(T1, T2, ..., TN)` means that each row of this type has a value of either type `T1` or `T2` or ... or `TN` or none of them (`NULL` value). Variant type is available under a setting `allow_experimental_variant_type`. Reference: [#54864](https://github.com/ClickHouse/ClickHouse/issues/54864). [#58047](https://github.com/ClickHouse/ClickHouse/pull/58047) ([Kruglov Pavel](https://github.com/Avogar)). +* Certain settings (currently `min_compress_block_size` and `max_compress_block_size`) can now be specified at column-level where they take precedence over the corresponding table-level setting. Example: `CREATE TABLE tab (col String SETTINGS (min_compress_block_size = 81920, max_compress_block_size = 163840)) ENGINE = MergeTree ORDER BY tuple();`. [#55201](https://github.com/ClickHouse/ClickHouse/pull/55201) ([Duc Canh Le](https://github.com/canhld94)). +* Add `quantileDD` aggregate function as well as the corresponding `quantilesDD` and `medianDD`. It is based on the DDSketch https://www.vldb.org/pvldb/vol12/p2195-masson.pdf. ### Documentation entry for user-facing changes. [#56342](https://github.com/ClickHouse/ClickHouse/pull/56342) ([Srikanth Chekuri](https://github.com/srikanthccv)). +* Allow to configure any kind of object storage with any kind of metadata type. [#58357](https://github.com/ClickHouse/ClickHouse/pull/58357) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Added `null_status_on_timeout_only_active` and `throw_only_active` modes for `distributed_ddl_output_mode` that allow to avoid waiting for inactive replicas. [#58350](https://github.com/ClickHouse/ClickHouse/pull/58350) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Allow partitions from tables with different partition expressions to be attached when the destination table partition expression doesn't re-partition/split the part. [#39507](https://github.com/ClickHouse/ClickHouse/pull/39507) ([Arthur Passos](https://github.com/arthurpassos)). +* Add function `arrayShingles` to compute subarrays, e.g. `arrayShingles([1, 2, 3, 4, 5], 3)` returns `[[1,2,3],[2,3,4],[3,4,5]]`. [#58396](https://github.com/ClickHouse/ClickHouse/pull/58396) ([Zheng Miao](https://github.com/zenmiao7)). +* Added functions `punycodeEncode`, `punycodeDecode`, `idnaEncode` and `idnaDecode` which are useful for translating international domain names to an ASCII representation according to the IDNA standard. [#58454](https://github.com/ClickHouse/ClickHouse/pull/58454) ([Robert Schulze](https://github.com/rschu1ze)). +* Added string similarity functions `dramerauLevenshteinDistance`, `jaroSimilarity` and `jaroWinklerSimilarity`. [#58531](https://github.com/ClickHouse/ClickHouse/pull/58531) ([Robert Schulze](https://github.com/rschu1ze)). +* Add two settings `output_format_compression_level` to change output compression level and `output_format_compression_zstd_window_log` to explicitly set compression window size and enable long-range mode for zstd compression if output compression method is `zstd`. Applied for `INTO OUTFILE` and when writing to table functions `file`, `url`, `hdfs`, `s3`, and `azureBlobStorage`. [#58539](https://github.com/ClickHouse/ClickHouse/pull/58539) ([Duc Canh Le](https://github.com/canhld94)). +* Automatically disable ANSI escape sequences in Pretty formats if the output is not a terminal. Add new `auto` mode to setting `output_format_pretty_color`. [#58614](https://github.com/ClickHouse/ClickHouse/pull/58614) ([Shaun Struwig](https://github.com/Blargian)). +* Added function `sqidDecode` which decodes [Sqids](https://sqids.org/). [#58544](https://github.com/ClickHouse/ClickHouse/pull/58544) ([Robert Schulze](https://github.com/rschu1ze)). +* Allow to read Bool values into String in JSON input formats. It's done under a setting `input_format_json_read_bools_as_strings` that is enabled by default. [#58561](https://github.com/ClickHouse/ClickHouse/pull/58561) ([Kruglov Pavel](https://github.com/Avogar)). +* Added function `seriesDecomposeSTL` which decomposes a time series into a season, a trend and a residual component. [#57078](https://github.com/ClickHouse/ClickHouse/pull/57078) ([Bhavna Jindal](https://github.com/bhavnajindal)). +* Introduced MySQL Binlog Client for MaterializedMySQL: One binlog connection for many databases. [#57323](https://github.com/ClickHouse/ClickHouse/pull/57323) ([Val Doroshchuk](https://github.com/valbok)). +* Intel QuickAssist Technology (QAT) provides hardware-accelerated compression and cryptograpy. ClickHouse got a new compression codec `ZSTD_QAT` which utilizes QAT for zstd compression. The codec uses [Intel's QATlib](https://github.com/intel/qatlib) and [Inte's QAT ZSTD Plugin](https://github.com/intel/QAT-ZSTD-Plugin). Right now, only compression can be accelerated in hardware (a software fallback kicks in in case QAT could not be initialized), decompression always runs in software. [#57509](https://github.com/ClickHouse/ClickHouse/pull/57509) ([jasperzhu](https://github.com/jinjunzh)). +* Implementing the new way how object storage keys are generated for s3 disks. Now the format could be defined in terms of `re2` regex syntax with `key_template` option in disc description. [#57663](https://github.com/ClickHouse/ClickHouse/pull/57663) ([Sema Checherinda](https://github.com/CheSema)). +* Table system.dropped_tables_parts contains parts of system.dropped_tables tables (dropped but not yet removed tables). [#58038](https://github.com/ClickHouse/ClickHouse/pull/58038) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Add settings `max_materialized_views_size_for_table` to limit the number of materialized views attached to a table. [#58068](https://github.com/ClickHouse/ClickHouse/pull/58068) ([zhongyuankai](https://github.com/zhongyuankai)). +* `clickhouse-format` improvements: support INSERT queries with `VALUES`; support comments (use `--comments` to output them); support `--max_line_length` option to format only long queries in multiline. [#58246](https://github.com/ClickHouse/ClickHouse/pull/58246) ([vdimir](https://github.com/vdimir)). +* Attach all system tables in `clickhouse-local`, including `system.parts`. This closes [#58312](https://github.com/ClickHouse/ClickHouse/issues/58312). [#58359](https://github.com/ClickHouse/ClickHouse/pull/58359) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support for `Enum` data types in function `transform`. This closes [#58241](https://github.com/ClickHouse/ClickHouse/issues/58241). [#58360](https://github.com/ClickHouse/ClickHouse/pull/58360) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add table `system.database_engines`. [#58390](https://github.com/ClickHouse/ClickHouse/pull/58390) ([Bharat Nallan](https://github.com/bharatnc)). Allow registering database engines independently in the codebase. [#58365](https://github.com/ClickHouse/ClickHouse/pull/58365) ([Bharat Nallan](https://github.com/bharatnc)). Allow registering interpreters independently. [#58443](https://github.com/ClickHouse/ClickHouse/pull/58443) ([Bharat Nallan](https://github.com/bharatnc)). +* Added `FROM ` modifier for `SYSTEM SYNC REPLICA LIGHTWEIGHT` query. With the `FROM` modifier ensures we wait for fetches and drop-ranges only for the specified source replicas, as well as any replica not in zookeeper or with an empty source_replica. [#58393](https://github.com/ClickHouse/ClickHouse/pull/58393) ([Jayme Bird](https://github.com/jaymebrd)). +* Added setting `update_insert_deduplication_token_in_dependent_materialized_views`. This setting allows to update insert deduplication token with table identifier during insert in dependent materialized views. Closes [#59165](https://github.com/ClickHouse/ClickHouse/issues/59165). [#59238](https://github.com/ClickHouse/ClickHouse/pull/59238) ([Maksim Kita](https://github.com/kitaisreal)). +* Added statement `SYSTEM RELOAD ASYNCHRONOUS METRICS` which updates the asynchronous metrics. Mostly useful for testing and development. [#53710](https://github.com/ClickHouse/ClickHouse/pull/53710) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Performance Improvement +* Coordination for parallel replicas is rewritten for better parallelism and cache locality. It has been tested for linear scalability on hundreds of replicas. It also got support for reading in order. [#57968](https://github.com/ClickHouse/ClickHouse/pull/57968) ([Nikita Taranov](https://github.com/nickitat)). +* Replace HTTP outgoing buffering based with the native ClickHouse buffers. Add bytes counting metrics for interfaces. [#56064](https://github.com/ClickHouse/ClickHouse/pull/56064) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Large aggregation states of `uniqExact` will be merged in parallel in distrubuted queries. [#59009](https://github.com/ClickHouse/ClickHouse/pull/59009) ([Nikita Taranov](https://github.com/nickitat)). +* Lower memory usage after reading from `MergeTree` tables. [#59290](https://github.com/ClickHouse/ClickHouse/pull/59290) ([Anton Popov](https://github.com/CurtizJ)). +* Lower memory usage in vertical merges. [#59340](https://github.com/ClickHouse/ClickHouse/pull/59340) ([Anton Popov](https://github.com/CurtizJ)). +* Avoid huge memory consumption during Keeper startup for more cases. [#58455](https://github.com/ClickHouse/ClickHouse/pull/58455) ([Antonio Andelic](https://github.com/antonio2368)). +* Keeper improvement: reduce Keeper's memory usage for stored nodes. [#59002](https://github.com/ClickHouse/ClickHouse/pull/59002) ([Antonio Andelic](https://github.com/antonio2368)). +* More cache-friendly final implementation. Note on the behaviour change: previously queries with `FINAL` modifier that read with a single stream (e.g. `max_threads = 1`) produced sorted output without explicitly provided `ORDER BY` clause. This is no longer guaranteed when `enable_vertical_final = true` (and it is so by default). [#54366](https://github.com/ClickHouse/ClickHouse/pull/54366) ([Duc Canh Le](https://github.com/canhld94)). +* Bypass extra copying in `ReadBufferFromIStream` which is used, e.g., for reading from S3. [#56961](https://github.com/ClickHouse/ClickHouse/pull/56961) ([Nikita Taranov](https://github.com/nickitat)). +* Optimize array element function when input is Array(Map)/Array(Array(Num)/Array(Array(String))/Array(BigInt)/Array(Decimal). The previous implementations did more allocations than needed. The optimization speed up is up to ~6x especially when input type is Array(Map). [#56403](https://github.com/ClickHouse/ClickHouse/pull/56403) ([李扬](https://github.com/taiyang-li)). +* Read column once while reading more than one subcolumn from it in compact parts. [#57631](https://github.com/ClickHouse/ClickHouse/pull/57631) ([Kruglov Pavel](https://github.com/Avogar)). +* Rewrite the AST of `sum(column + constant)` function. This is available as an optimization pass for Analyzer [#57853](https://github.com/ClickHouse/ClickHouse/pull/57853) ([Jiebin Sun](https://github.com/jiebinn)). +* The evaluation of function `match` now utilizes skipping indices `ngrambf_v1` and `tokenbf_v1`. [#57882](https://github.com/ClickHouse/ClickHouse/pull/57882) ([凌涛](https://github.com/lingtaolf)). +* The evaluation of function `match` now utilizes inverted indices. [#58284](https://github.com/ClickHouse/ClickHouse/pull/58284) ([凌涛](https://github.com/lingtaolf)). +* MergeTree `FINAL` does not compare rows from same non-L0 part. [#58142](https://github.com/ClickHouse/ClickHouse/pull/58142) ([Duc Canh Le](https://github.com/canhld94)). +* Speed up iota calls (filling array with consecutive numbers). [#58271](https://github.com/ClickHouse/ClickHouse/pull/58271) ([Raúl Marín](https://github.com/Algunenano)). +* Speedup MIN/MAX for non-numeric types. [#58334](https://github.com/ClickHouse/ClickHouse/pull/58334) ([Raúl Marín](https://github.com/Algunenano)). +* Optimize the combination of filters (like in multi-stage PREWHERE) with BMI2/SSE intrinsics [#58800](https://github.com/ClickHouse/ClickHouse/pull/58800) ([Zhiguo Zhou](https://github.com/ZhiguoZh)). +* Use one thread less in `clickhouse-local`. [#58968](https://github.com/ClickHouse/ClickHouse/pull/58968) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Improve the `multiIf` function performance when the type is Nullable. [#57745](https://github.com/ClickHouse/ClickHouse/pull/57745) ([KevinyhZou](https://github.com/KevinyhZou)). +* Add `SYSTEM JEMALLOC PURGE` for purging unused jemalloc pages, `SYSTEM JEMALLOC [ ENABLE | DISABLE | FLUSH ] PROFILE` for controlling jemalloc profile if the profiler is enabled. Add jemalloc-related 4LW command in Keeper: `jmst` for dumping jemalloc stats, `jmfp`, `jmep`, `jmdp` for controlling jemalloc profile if the profiler is enabled. [#58665](https://github.com/ClickHouse/ClickHouse/pull/58665) ([Antonio Andelic](https://github.com/antonio2368)). +* Lower memory consumption in backups to S3. [#58962](https://github.com/ClickHouse/ClickHouse/pull/58962) ([Vitaly Baranov](https://github.com/vitlibar)). + +#### Improvement +* Added comments (brief descriptions) to all columns of system tables. There are several reasons for this: - We use system tables a lot, and sometimes it could be very difficult for developer to understand the purpose and the meaning of a particular column. - We change (add new ones or modify existing) system tables a lot and the documentation for them is always outdated. For example take a look at the documentation page for [`system.parts`](https://clickhouse.com/docs/en/operations/system-tables/parts). It misses a lot of columns - We would like to eventually generate documentation directly from ClickHouse. [#58356](https://github.com/ClickHouse/ClickHouse/pull/58356) ([Nikita Mikhaylov](https://github.com/nikitamikhaylov)). +* Allow queries without aliases for subqueries for `PASTE JOIN`. [#58654](https://github.com/ClickHouse/ClickHouse/pull/58654) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Enable `MySQL`/`MariaDB` integration on macOS. This closes [#21191](https://github.com/ClickHouse/ClickHouse/issues/21191). [#46316](https://github.com/ClickHouse/ClickHouse/pull/46316) ([Alexey Milovidov](https://github.com/alexey-milovidov)) ([Robert Schulze](https://github.com/rschu1ze)). +* Disable `max_rows_in_set_to_optimize_join` by default. [#56396](https://github.com/ClickHouse/ClickHouse/pull/56396) ([vdimir](https://github.com/vdimir)). +* Add `` config parameter that allows avoiding resolving hostnames in ON CLUSTER DDL queries and Replicated database engines. This mitigates the possibility of the queue being stuck in case of a change in cluster definition. Closes [#57573](https://github.com/ClickHouse/ClickHouse/issues/57573). [#57603](https://github.com/ClickHouse/ClickHouse/pull/57603) ([Nikolay Degterinsky](https://github.com/evillique)). +* Increase `load_metadata_threads` to 16 for the filesystem cache. It will make the server start up faster. [#57732](https://github.com/ClickHouse/ClickHouse/pull/57732) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Add ability to throttle merges/mutations (`max_mutations_bandwidth_for_server`/`max_merges_bandwidth_for_server`). [#57877](https://github.com/ClickHouse/ClickHouse/pull/57877) ([Azat Khuzhin](https://github.com/azat)). +* Replaced undocumented (boolean) column `is_hot_reloadable` in system table `system.server_settings` by (Enum8) column `changeable_without_restart` with possible values `No`, `Yes`, `IncreaseOnly` and `DecreaseOnly`. Also documented the column. [#58029](https://github.com/ClickHouse/ClickHouse/pull/58029) ([skyoct](https://github.com/skyoct)). +* Cluster discovery supports setting username and password, close [#58063](https://github.com/ClickHouse/ClickHouse/issues/58063). [#58123](https://github.com/ClickHouse/ClickHouse/pull/58123) ([vdimir](https://github.com/vdimir)). +* Support query parameters in `ALTER TABLE ... PART`. [#58297](https://github.com/ClickHouse/ClickHouse/pull/58297) ([Azat Khuzhin](https://github.com/azat)). +* Create consumers for Kafka tables on the fly (but keep them for some period - `kafka_consumers_pool_ttl_ms`, since last used), this should fix problem with statistics for `system.kafka_consumers` (that does not consumed when nobody reads from Kafka table, which leads to live memory leak and slow table detach) and also this PR enables stats for `system.kafka_consumers` by default again. [#58310](https://github.com/ClickHouse/ClickHouse/pull/58310) ([Azat Khuzhin](https://github.com/azat)). +* `sparkBar` as an alias to `sparkbar`. [#58335](https://github.com/ClickHouse/ClickHouse/pull/58335) ([凌涛](https://github.com/lingtaolf)). +* Avoid sending `ComposeObject` requests after upload to `GCS`. [#58343](https://github.com/ClickHouse/ClickHouse/pull/58343) ([Azat Khuzhin](https://github.com/azat)). +* Correctly handle keys with dot in the name in configurations XMLs. [#58354](https://github.com/ClickHouse/ClickHouse/pull/58354) ([Azat Khuzhin](https://github.com/azat)). +* Make function `format` return constant on constant arguments. This closes [#58355](https://github.com/ClickHouse/ClickHouse/issues/58355). [#58358](https://github.com/ClickHouse/ClickHouse/pull/58358) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Adding a setting `max_estimated_execution_time` to separate `max_execution_time` and `max_estimated_execution_time`. [#58402](https://github.com/ClickHouse/ClickHouse/pull/58402) ([Zhang Yifan](https://github.com/zhangyifan27)). +* Provide a hint when an invalid database engine name is used. [#58444](https://github.com/ClickHouse/ClickHouse/pull/58444) ([Bharat Nallan](https://github.com/bharatnc)). +* Add settings for better control of indexes type in Arrow dictionary. Use signed integer type for indexes by default as Arrow recommends. Closes [#57401](https://github.com/ClickHouse/ClickHouse/issues/57401). [#58519](https://github.com/ClickHouse/ClickHouse/pull/58519) ([Kruglov Pavel](https://github.com/Avogar)). +* Implement [#58575](https://github.com/ClickHouse/ClickHouse/issues/58575) Support `CLICKHOUSE_PASSWORD_FILE ` environment variable when running the docker image. [#58583](https://github.com/ClickHouse/ClickHouse/pull/58583) ([Eyal Halpern Shalev](https://github.com/Eyal-Shalev)). +* When executing some queries, which require a lot of streams for reading data, the error `"Paste JOIN requires sorted tables only"` was previously thrown. Now the numbers of streams resize to 1 in that case. [#58608](https://github.com/ClickHouse/ClickHouse/pull/58608) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Better message for INVALID_IDENTIFIER error. [#58703](https://github.com/ClickHouse/ClickHouse/pull/58703) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Improved handling of signed numeric literals in normalizeQuery. [#58710](https://github.com/ClickHouse/ClickHouse/pull/58710) ([Salvatore Mesoraca](https://github.com/aiven-sal)). +* Support Point data type for MySQL. [#58721](https://github.com/ClickHouse/ClickHouse/pull/58721) ([Kseniia Sumarokova](https://github.com/kssenii)). +* When comparing a Float32 column and a const string, read the string as Float32 (instead of Float64). [#58724](https://github.com/ClickHouse/ClickHouse/pull/58724) ([Raúl Marín](https://github.com/Algunenano)). +* Improve S3 compatibility, add ECloud EOS storage support. [#58786](https://github.com/ClickHouse/ClickHouse/pull/58786) ([xleoken](https://github.com/xleoken)). +* Allow `KILL QUERY` to cancel backups / restores. This PR also makes running backups and restores visible in `system.processes`. Also, there is a new setting in the server configuration now - `shutdown_wait_backups_and_restores` (default=true) which makes the server either wait on shutdown for all running backups and restores to finish or just cancel them. [#58804](https://github.com/ClickHouse/ClickHouse/pull/58804) ([Vitaly Baranov](https://github.com/vitlibar)). +* Avro format to support ZSTD codec. Closes [#58735](https://github.com/ClickHouse/ClickHouse/issues/58735). [#58805](https://github.com/ClickHouse/ClickHouse/pull/58805) ([flynn](https://github.com/ucasfl)). +* MySQL interface gained support for `net_write_timeout` and `net_read_timeout` settings. `net_write_timeout` is translated into the native `send_timeout` ClickHouse setting and, similarly, `net_read_timeout` into `receive_timeout`. Fixed an issue where it was possible to set MySQL `sql_select_limit` setting only if the entire statement was in upper case. [#58835](https://github.com/ClickHouse/ClickHouse/pull/58835) ([Serge Klochkov](https://github.com/slvrtrn)). +* A better exception message while conflict of creating dictionary and table with the same name. [#58841](https://github.com/ClickHouse/ClickHouse/pull/58841) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Make sure that for custom (created from SQL) disks ether `filesystem_caches_path` (a common directory prefix for all filesystem caches) or `custom_cached_disks_base_directory` (a common directory prefix for only filesystem caches created from custom disks) is specified in server config. `custom_cached_disks_base_directory` has higher priority for custom disks over `filesystem_caches_path`, which is used if the former one is absent. Filesystem cache setting `path` must lie inside that directory, otherwise exception will be thrown preventing disk to be created. This will not affect disks created on an older version and server was upgraded - then the exception will not be thrown to allow the server to successfully start). `custom_cached_disks_base_directory` is added to default server config as `/var/lib/clickhouse/caches/`. Closes [#57825](https://github.com/ClickHouse/ClickHouse/issues/57825). [#58869](https://github.com/ClickHouse/ClickHouse/pull/58869) ([Kseniia Sumarokova](https://github.com/kssenii)). +* MySQL interface gained compatibility with `SHOW WARNINGS`/`SHOW COUNT(*) WARNINGS` queries, though the returned result is always an empty set. [#58929](https://github.com/ClickHouse/ClickHouse/pull/58929) ([Serge Klochkov](https://github.com/slvrtrn)). +* Skip unavailable replicas when executing parallel distributed `INSERT SELECT`. [#58931](https://github.com/ClickHouse/ClickHouse/pull/58931) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Display word-descriptive log level while enabling structured log formatting in json. [#58936](https://github.com/ClickHouse/ClickHouse/pull/58936) ([Tim Liou](https://github.com/wheatdog)). +* MySQL interface gained support for `CAST(x AS SIGNED)` and `CAST(x AS UNSIGNED)` statements via data type aliases: `SIGNED` for Int64, and `UNSIGNED` for UInt64. This improves compatibility with BI tools such as Looker Studio. [#58954](https://github.com/ClickHouse/ClickHouse/pull/58954) ([Serge Klochkov](https://github.com/slvrtrn)). +* Change working directory to the data path in docker container. [#58975](https://github.com/ClickHouse/ClickHouse/pull/58975) ([cangyin](https://github.com/cangyin)). +* Added setting for Azure Blob Storage `azure_max_unexpected_write_error_retries` , can also be set from config under azure section. [#59001](https://github.com/ClickHouse/ClickHouse/pull/59001) ([SmitaRKulkarni](https://github.com/SmitaRKulkarni)). +* Allow server to start with broken data lake table. Closes [#58625](https://github.com/ClickHouse/ClickHouse/issues/58625). [#59080](https://github.com/ClickHouse/ClickHouse/pull/59080) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Allow to ignore schema evolution in the `Iceberg` table engine and read all data using schema specified by the user on table creation or latest schema parsed from metadata on table creation. This is done under a setting `iceberg_engine_ignore_schema_evolution` that is disabled by default. Note that enabling this setting can lead to incorrect result as in case of evolved schema all data files will be read using the same schema. [#59133](https://github.com/ClickHouse/ClickHouse/pull/59133) ([Kruglov Pavel](https://github.com/Avogar)). +* Prohibit mutable operations (`INSERT`/`ALTER`/`OPTIMIZE`/...) on read-only/write-once storages with a proper `TABLE_IS_READ_ONLY` error (to avoid leftovers). Avoid leaving left-overs on write-once disks (`format_version.txt`) on `CREATE`/`ATTACH`. Ignore `DROP` for `ReplicatedMergeTree` (so as for `MergeTree`). Fix iterating over `s3_plain` (`MetadataStorageFromPlainObjectStorage::iterateDirectory`). Note read-only is `web` disk, and write-once is `s3_plain`. [#59170](https://github.com/ClickHouse/ClickHouse/pull/59170) ([Azat Khuzhin](https://github.com/azat)). +* Fix bug in the experimental `_block_number` column which could lead to logical error during complex combination of `ALTER`s and `merge`s. Fixes [#56202](https://github.com/ClickHouse/ClickHouse/issues/56202). Replaces [#58601](https://github.com/ClickHouse/ClickHouse/issues/58601). [#59295](https://github.com/ClickHouse/ClickHouse/pull/59295) ([alesapin](https://github.com/alesapin)). +* Play UI understands when an exception is returned inside JSON. Adjustment for [#52853](https://github.com/ClickHouse/ClickHouse/issues/52853). [#59303](https://github.com/ClickHouse/ClickHouse/pull/59303) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* `/binary` HTTP handler allows to specify user, host, and optionally, password in the query string. [#59311](https://github.com/ClickHouse/ClickHouse/pull/59311) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support backups for compressed in-memory tables. This closes [#57893](https://github.com/ClickHouse/ClickHouse/issues/57893). [#59315](https://github.com/ClickHouse/ClickHouse/pull/59315) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Support the `FORMAT` clause in `BACKUP` and `RESTORE` queries. [#59338](https://github.com/ClickHouse/ClickHouse/pull/59338) ([Vitaly Baranov](https://github.com/vitlibar)). +* Function `concatWithSeparator` now supports arbitrary argument types (instead of only `String` and `FixedString` arguments). For example, `SELECT concatWithSeparator('.', 'number', 1)` now returns `number.1`. [#59341](https://github.com/ClickHouse/ClickHouse/pull/59341) ([Robert Schulze](https://github.com/rschu1ze)). + +#### Build/Testing/Packaging Improvement +* Improve aliases for clickhouse binary (now `ch`/`clickhouse` is `clickhouse-local` or `clickhouse` depends on the arguments) and add bash completion for new aliases. [#58344](https://github.com/ClickHouse/ClickHouse/pull/58344) ([Azat Khuzhin](https://github.com/azat)). +* Add settings changes check to CI to check that all settings changes are reflected in settings changes history. [#58555](https://github.com/ClickHouse/ClickHouse/pull/58555) ([Kruglov Pavel](https://github.com/Avogar)). +* Use tables directly attached from S3 in stateful tests. [#58791](https://github.com/ClickHouse/ClickHouse/pull/58791) ([Alexey Milovidov](https://github.com/alexey-milovidov)). +* Save the whole `fuzzer.log` as an archive instead of the last 100k lines. `tail -n 100000` often removes lines with table definitions. Example:. [#58821](https://github.com/ClickHouse/ClickHouse/pull/58821) ([Dmitry Novik](https://github.com/novikd)). +* Enable Rust on macOS with Aarch64 (this will add fuzzy search in client with skim and the PRQL language, though I don't think that are people who host ClickHouse on darwin, so it is mostly for fuzzy search in client I would say). [#59272](https://github.com/ClickHouse/ClickHouse/pull/59272) ([Azat Khuzhin](https://github.com/azat)). +* Fix aggregation issue in mixed x86_64 and ARM clusters [#59132](https://github.com/ClickHouse/ClickHouse/pull/59132) ([Harry Lee](https://github.com/HarryLeeIBM)). + +#### Bug Fix (user-visible misbehavior in an official stable release) + +* Add join keys conversion for nested LowCardinality [#51550](https://github.com/ClickHouse/ClickHouse/pull/51550) ([vdimir](https://github.com/vdimir)). +* Flatten only true Nested type if flatten_nested=1, not all Array(Tuple) [#56132](https://github.com/ClickHouse/ClickHouse/pull/56132) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix a bug with projections and the `aggregate_functions_null_for_empty` setting during insertion. [#56944](https://github.com/ClickHouse/ClickHouse/pull/56944) ([Amos Bird](https://github.com/amosbird)). +* Fixed potential exception due to stale profile UUID [#57263](https://github.com/ClickHouse/ClickHouse/pull/57263) ([Vasily Nemkov](https://github.com/Enmk)). +* Fix working with read buffers in StreamingFormatExecutor [#57438](https://github.com/ClickHouse/ClickHouse/pull/57438) ([Kruglov Pavel](https://github.com/Avogar)). +* Ignore MVs with dropped target table during pushing to views [#57520](https://github.com/ClickHouse/ClickHouse/pull/57520) ([Kruglov Pavel](https://github.com/Avogar)). +* Eliminate possible race between ALTER_METADATA and MERGE_PARTS [#57755](https://github.com/ClickHouse/ClickHouse/pull/57755) ([Azat Khuzhin](https://github.com/azat)). +* Fix the expressions order bug in group by with rollup [#57786](https://github.com/ClickHouse/ClickHouse/pull/57786) ([Chen768959](https://github.com/Chen768959)). +* A fix for the obsolete "zero-copy" replication feature: Fix lost blobs after dropping a replica with broken detached parts [#58333](https://github.com/ClickHouse/ClickHouse/pull/58333) ([Alexander Tokmakov](https://github.com/tavplubix)). +* Allow users to work with symlinks in user_files_path [#58447](https://github.com/ClickHouse/ClickHouse/pull/58447) ([Duc Canh Le](https://github.com/canhld94)). +* Fix a crash when graphite table does not have an agg function [#58453](https://github.com/ClickHouse/ClickHouse/pull/58453) ([Duc Canh Le](https://github.com/canhld94)). +* Delay reading from StorageKafka to allow multiple reads in materialized views [#58477](https://github.com/ClickHouse/ClickHouse/pull/58477) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Fix a stupid case of intersecting parts [#58482](https://github.com/ClickHouse/ClickHouse/pull/58482) ([Alexander Tokmakov](https://github.com/tavplubix)). +* MergeTreePrefetchedReadPool disable for LIMIT only queries [#58505](https://github.com/ClickHouse/ClickHouse/pull/58505) ([Maksim Kita](https://github.com/kitaisreal)). +* Enable ordinary databases while restoration [#58520](https://github.com/ClickHouse/ClickHouse/pull/58520) ([Jihyuk Bok](https://github.com/tomahawk28)). +* Fix Apache Hive threadpool reading for ORC/Parquet/... [#58537](https://github.com/ClickHouse/ClickHouse/pull/58537) ([sunny](https://github.com/sunny19930321)). +* Hide credentials in `system.backup_log`'s `base_backup_name` column [#58550](https://github.com/ClickHouse/ClickHouse/pull/58550) ([Daniel Pozo Escalona](https://github.com/danipozo)). +* `toStartOfInterval` for milli- microsencods values rounding [#58557](https://github.com/ClickHouse/ClickHouse/pull/58557) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Disable `max_joined_block_rows` in ConcurrentHashJoin [#58595](https://github.com/ClickHouse/ClickHouse/pull/58595) ([vdimir](https://github.com/vdimir)). +* Fix join using nullable in the old analyzer [#58596](https://github.com/ClickHouse/ClickHouse/pull/58596) ([vdimir](https://github.com/vdimir)). +* `makeDateTime64`: Allow non-const fraction argument [#58597](https://github.com/ClickHouse/ClickHouse/pull/58597) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix possible NULL dereference during symbolizing inline frames [#58607](https://github.com/ClickHouse/ClickHouse/pull/58607) ([Azat Khuzhin](https://github.com/azat)). +* Improve isolation of query cache entries under re-created users or role switches [#58611](https://github.com/ClickHouse/ClickHouse/pull/58611) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix broken partition key analysis when doing projection optimization [#58638](https://github.com/ClickHouse/ClickHouse/pull/58638) ([Amos Bird](https://github.com/amosbird)). +* Query cache: Fix per-user quota [#58731](https://github.com/ClickHouse/ClickHouse/pull/58731) ([Robert Schulze](https://github.com/rschu1ze)). +* Fix stream partitioning in parallel window functions [#58739](https://github.com/ClickHouse/ClickHouse/pull/58739) ([Dmitry Novik](https://github.com/novikd)). +* Fix double destroy call on exception throw in addBatchLookupTable8 [#58745](https://github.com/ClickHouse/ClickHouse/pull/58745) ([Raúl Marín](https://github.com/Algunenano)). +* Don't process requests in Keeper during shutdown [#58765](https://github.com/ClickHouse/ClickHouse/pull/58765) ([Antonio Andelic](https://github.com/antonio2368)). +* Fix a null pointer dereference in `SlabsPolygonIndex::find` [#58771](https://github.com/ClickHouse/ClickHouse/pull/58771) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix JSONExtract function for LowCardinality(Nullable) columns [#58808](https://github.com/ClickHouse/ClickHouse/pull/58808) ([vdimir](https://github.com/vdimir)). +* A fix for unexpected accumulation of memory usage while creating a huge number of tables by CREATE and DROP. [#58831](https://github.com/ClickHouse/ClickHouse/pull/58831) ([Maksim Kita](https://github.com/kitaisreal)). +* Multiple read file log storage in mv [#58877](https://github.com/ClickHouse/ClickHouse/pull/58877) ([János Benjamin Antal](https://github.com/antaljanosbenjamin)). +* Restriction for the access key id for s3. [#58900](https://github.com/ClickHouse/ClickHouse/pull/58900) ([MikhailBurdukov](https://github.com/MikhailBurdukov)). +* Fix possible crash in clickhouse-local during loading suggestions [#58907](https://github.com/ClickHouse/ClickHouse/pull/58907) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix crash when `indexHint` is used [#58911](https://github.com/ClickHouse/ClickHouse/pull/58911) ([Dmitry Novik](https://github.com/novikd)). +* Fix StorageURL forgetting headers on server restart [#58933](https://github.com/ClickHouse/ClickHouse/pull/58933) ([Michael Kolupaev](https://github.com/al13n321)). +* Analyzer: fix storage replacement with insertion block [#58958](https://github.com/ClickHouse/ClickHouse/pull/58958) ([Yakov Olkhovskiy](https://github.com/yakov-olkhovskiy)). +* Fix seek in ReadBufferFromZipArchive [#58966](https://github.com/ClickHouse/ClickHouse/pull/58966) ([Michael Kolupaev](https://github.com/al13n321)). +* A fix for experimental inverted indices (don't use in production): `DROP INDEX` of inverted index now removes all relevant files from persistence [#59040](https://github.com/ClickHouse/ClickHouse/pull/59040) ([mochi](https://github.com/MochiXu)). +* Fix data race on query_factories_info [#59049](https://github.com/ClickHouse/ClickHouse/pull/59049) ([Kseniia Sumarokova](https://github.com/kssenii)). +* Disable "Too many redirects" error retry [#59099](https://github.com/ClickHouse/ClickHouse/pull/59099) ([skyoct](https://github.com/skyoct)). +* Fix not started database shutdown deadlock [#59137](https://github.com/ClickHouse/ClickHouse/pull/59137) ([Sergei Trifonov](https://github.com/serxa)). +* Fix: LIMIT BY and LIMIT in distributed query [#59153](https://github.com/ClickHouse/ClickHouse/pull/59153) ([Igor Nikonov](https://github.com/devcrafter)). +* Fix crash with nullable timezone for `toString` [#59190](https://github.com/ClickHouse/ClickHouse/pull/59190) ([Yarik Briukhovetskyi](https://github.com/yariks5s)). +* Fix abort in iceberg metadata on bad file paths [#59275](https://github.com/ClickHouse/ClickHouse/pull/59275) ([Kruglov Pavel](https://github.com/Avogar)). +* Fix architecture name in select of Rust target [#59307](https://github.com/ClickHouse/ClickHouse/pull/59307) ([p1rattttt](https://github.com/p1rattttt)). +* Fix a logical error about "not-ready set" for querying from `system.tables` with a subquery in the IN clause. [#59351](https://github.com/ClickHouse/ClickHouse/pull/59351) ([Nikolai Kochetov](https://github.com/KochetovNicolai)). + +## [Changelog for 2023](https://clickhouse.com/docs/en/whats-new/changelog/2023) diff --git a/docs/ja/whats-new/roadmap.md b/docs/ja/whats-new/roadmap.md new file mode 100644 index 00000000000..23864fa05f7 --- /dev/null +++ b/docs/ja/whats-new/roadmap.md @@ -0,0 +1,20 @@ +--- +title: "Roadmap" +slug: /ja/whats-new/roadmap +sidebar_position: 50 +--- + +## Current Roadmap + +The current roadmap is published for open discussion: + +- [2024](https://github.com/ClickHouse/ClickHouse/issues/58392) + +## Previous Roadmaps + +- [2023](https://github.com/ClickHouse/ClickHouse/issues/44767) +- [2022](https://github.com/ClickHouse/ClickHouse/issues/44767) +- [2021](https://github.com/ClickHouse/ClickHouse/issues/17623) +- [2020](https://github.com/ClickHouse/ClickHouse/blob/be29057de1835f6f4a17e03a422b45b81efe6833/docs/ru/whats-new/extended-roadmap.md) +- [2019](https://github.com/ClickHouse/ClickHouse/issues/4785) +- [2018](https://github.com/ClickHouse/clickhouse-presentations/tree/master/roadmap2018) diff --git a/docs/ja/whats-new/security-changelog.md b/docs/ja/whats-new/security-changelog.md new file mode 100644 index 00000000000..202c71ff304 --- /dev/null +++ b/docs/ja/whats-new/security-changelog.md @@ -0,0 +1,204 @@ +--- +slug: /ja/whats-new/security-changelog +sidebar_position: 20 +sidebar_label: Security Changelog +--- + +# Security Changelog + +## Fixed in ClickHouse v24.5, 2024-08-01 {#fixed-in-clickhouse-release-2024-08-01} + +### [CVE-2024-6873](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-432f-r822-j66f) {#CVE-2024-6873} + +It is possible to redirect the execution flow of the ClickHouse server process from an unauthenticated vector by sending a specially crafted request to the ClickHouse server native interface. This redirection is limited to what is available within a 256-byte range of memory at the time of execution. This vulnerability was identified through our Bugbounty program and no known Proof of Concept Remote Code Execution (RCE) code has been produced or exploited. + +Fix has been pushed to the following open-source versions: v23.8.15.35-lts, v24.3.4.147-lts, v24.4.2.141-stable, v24.5.1.1763, v24.6.1.4423-stable + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied to all instances running v24.2 onward. + +Credits: malacupa (Independent researcher) + +## Fixed in ClickHouse v24.1, 2024-01-30 {#fixed-in-clickhouse-release-24-01-30} + +### [CVE-2024-22412](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-45h5-f7g3-gr8r) {#CVE-2024-22412} + +When toggling between user roles while using ClickHouse with query cache enabled, there is a risk of obtaining inaccurate data. ClickHouse advises users with vulnerable versions of ClickHouse not to use the query cache when their application dynamically switches between various roles. + +Fix has been pushed to the following open-source versions: v24.1.1.2048, v24.1.8.22-stable, v23.12.6.19-stable, v23.8.12.13-lts, v23.3.22.3-lts + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v24.0.2.54535. + +Credits: Evan Johnson and Alan Braithwaite from Runreveal team - More information can be found on [their blog post](https://blog.runreveal.com/cve-2024-22412-behind-the-bug-a-classic-caching-problem-in-the-clickhouse-query-cache/). + +## Fixed in ClickHouse v23.10.5.20, 2023-11-26 {#fixed-in-clickhouse-release-23-10-5-20-2023-11-26} + +### [CVE-2023-47118](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-g22g-p6q2-x39v) {#CVE-2023-47118} + +A heap buffer overflow vulnerability affecting the native interface running by default on port 9000/tcp. An attacker, by triggering a bug in the T64 compression codec, can cause the ClickHouse server process to crash. This vulnerability can be exploited without the need to authenticate. + +Fix has been pushed to the following open-source versions: v23.10.2.13, v23.9.4.11, v23.8.6.16, v23.3.16.7 + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v23.9.2.47475. + +Credits: malacupa (Independent researcher) + +### [CVE-2023-48298](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-qw9f-qv29-8938) {#CVE-2023-48298} + +An integer underflow vulnerability in the FPC compressions codec. An attacker can use it to cause the ClickHouse server process to crash. This vulnerability can be exploited without the need to authenticate. + +Fix has been pushed to the following open-source versions: v23.10.4.25, v23.9.5.29, v23.8.7.24, v23.3.17.13. + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v23.9.2.47475. + +Credits: malacupa (Independent researcher) + +### [CVE-2023-48704](https://github.com/ClickHouse/ClickHouse/security/advisories/GHSA-5rmf-5g48-xv63) {#CVE-2023-48704} + +A heap buffer overflow vulnerability affecting the native interface running by default on port 9000/tcp. An attacker, by triggering a bug in the Gorilla codec, can cause the ClickHouse server process to crash. This vulnerability can be exploited without the need to authenticate. + +Fix has been pushed to the following open-source versions: v23.10.5.20, v23.9.6.20, v23.8.8.20, v23.3.18.15. + +ClickHouse Cloud uses different versioning and a fix for this vulnerability was applied at v23.9.2.47551. + +Credits: malacupa (Independent researcher) + +## Fixed in ClickHouse 22.9.1.2603, 2022-09-22 {#fixed-in-clickhouse-release-22-9-1-2603-2022-9-22} + +### CVE-2022-44011 {#CVE-2022-44011} + +A heap buffer overflow issue was discovered in ClickHouse server. A malicious user with ability to load data into ClickHouse server could crash the ClickHouse server by inserting a malformed CapnProto object. + +Fix has been pushed to version 22.9.1.2603, 22.8.2.11, 22.7.4.16, 22.6.6.16, 22.3.12.19 + +Credits: Kiojj (independent researcher) + +### CVE-2022-44010 {#CVE-2022-44010} + +A heap buffer overflow issue was discovered in ClickHouse server. An attacker could send a specially crafted HTTP request to the HTTP Endpoint (listening on port 8123 by default), causing a heap-based buffer overflow that crashes the ClickHouse server process. This attack does not require authentication. + +Fix has been pushed to version 22.9.1.2603, 22.8.2.11, 22.7.4.16, 22.6.6.16, 22.3.12.19 + +Credits: Kiojj (independent researcher) + +## Fixed in ClickHouse 21.10.2.15, 2021-10-18 {#fixed-in-clickhouse-release-21-10-2-215-2021-10-18} + +### CVE-2021-43304 {#cve-2021-43304} + +Heap buffer overflow in ClickHouse's LZ4 compression codec when parsing a malicious query. There is no verification that the copy operations in the LZ4::decompressImpl loop and especially the arbitrary copy operation wildCopy(op, ip, copy_end), don’t exceed the destination buffer’s limits. + +Credits: JFrog Security Research Team + +### CVE-2021-43305 {#cve-2021-43305} + +Heap buffer overflow in ClickHouse's LZ4 compression codec when parsing a malicious query. There is no verification that the copy operations in the LZ4::decompressImpl loop and especially the arbitrary copy operation wildCopy(op, ip, copy_end), don’t exceed the destination buffer’s limits. This issue is very similar to CVE-2021-43304, but the vulnerable copy operation is in a different wildCopy call. + +Credits: JFrog Security Research Team + +### CVE-2021-42387 {#cve-2021-42387} + +Heap out-of-bounds read in ClickHouse's LZ4 compression codec when parsing a malicious query. As part of the LZ4::decompressImpl() loop, a 16-bit unsigned user-supplied value ('offset') is read from the compressed data. The offset is later used in the length of a copy operation, without checking the upper bounds of the source of the copy operation. + +Credits: JFrog Security Research Team + +### CVE-2021-42388 {#cve-2021-42388} + +Heap out-of-bounds read in ClickHouse's LZ4 compression codec when parsing a malicious query. As part of the LZ4::decompressImpl() loop, a 16-bit unsigned user-supplied value ('offset') is read from the compressed data. The offset is later used in the length of a copy operation, without checking the lower bounds of the source of the copy operation. + +Credits: JFrog Security Research Team + +### CVE-2021-42389 {#cve-2021-42389} + +Divide-by-zero in ClickHouse's Delta compression codec when parsing a malicious query. The first byte of the compressed buffer is used in a modulo operation without being checked for 0. + +Credits: JFrog Security Research Team + +### CVE-2021-42390 {#cve-2021-42390} + +Divide-by-zero in ClickHouse's DeltaDouble compression codec when parsing a malicious query. The first byte of the compressed buffer is used in a modulo operation without being checked for 0. + +Credits: JFrog Security Research Team + +### CVE-2021-42391 {#cve-2021-42391} + +Divide-by-zero in ClickHouse's Gorilla compression codec when parsing a malicious query. The first byte of the compressed buffer is used in a modulo operation without being checked for 0. + +Credits: JFrog Security Research Team + +## Fixed in ClickHouse 21.4.3.21, 2021-04-12 {#fixed-in-clickhouse-release-21-4-3-21-2021-04-12} + +### CVE-2021-25263 {#cve-2021-25263} + +An attacker that has CREATE DICTIONARY privilege, can read arbitary file outside permitted directory. + +Fix has been pushed to versions 20.8.18.32-lts, 21.1.9.41-stable, 21.2.9.41-stable, 21.3.6.55-lts, 21.4.3.21-stable and later. + +Credits: [Vyacheslav Egoshin](https://twitter.com/vegoshin) + +## Fixed in ClickHouse Release 19.14.3.3, 2019-09-10 {#fixed-in-clickhouse-release-19-14-3-3-2019-09-10} + +### CVE-2019-15024 {#cve-2019-15024} + +Аn attacker that has write access to ZooKeeper and who can run a custom server available from the network where ClickHouse runs, can create a custom-built malicious server that will act as a ClickHouse replica and register it in ZooKeeper. When another replica will fetch data part from the malicious replica, it can force clickhouse-server to write to arbitrary path on filesystem. + +Credits: Eldar Zaitov of Yandex Information Security Team + +### CVE-2019-16535 {#cve-2019-16535} + +Аn OOB read, OOB write and integer underflow in decompression algorithms can be used to achieve RCE or DoS via native protocol. + +Credits: Eldar Zaitov of Yandex Information Security Team + +### CVE-2019-16536 {#cve-2019-16536} + +Stack overflow leading to DoS can be triggered by a malicious authenticated client. + +Credits: Eldar Zaitov of Yandex Information Security Team + +## Fixed in ClickHouse Release 19.13.6.1, 2019-09-20 {#fixed-in-clickhouse-release-19-13-6-1-2019-09-20} + +### CVE-2019-18657 {#cve-2019-18657} + +Table function `url` had the vulnerability allowed the attacker to inject arbitrary HTTP headers in the request. + +Credits: [Nikita Tikhomirov](https://github.com/NSTikhomirov) + +## Fixed in ClickHouse Release 18.12.13, 2018-09-10 {#fixed-in-clickhouse-release-18-12-13-2018-09-10} + +### CVE-2018-14672 {#cve-2018-14672} + +Functions for loading CatBoost models allowed path traversal and reading arbitrary files through error messages. + +Credits: Andrey Krasichkov of Yandex Information Security Team + +## Fixed in ClickHouse Release 18.10.3, 2018-08-13 {#fixed-in-clickhouse-release-18-10-3-2018-08-13} + +### CVE-2018-14671 {#cve-2018-14671} + +unixODBC allowed loading arbitrary shared objects from the file system which led to a Remote Code Execution vulnerability. + +Credits: Andrey Krasichkov and Evgeny Sidorov of Yandex Information Security Team + +## Fixed in ClickHouse Release 1.1.54388, 2018-06-28 {#fixed-in-clickhouse-release-1-1-54388-2018-06-28} + +### CVE-2018-14668 {#cve-2018-14668} + +“remote” table function allowed arbitrary symbols in “user”, “password” and “default_database” fields which led to Cross Protocol Request Forgery Attacks. + +Credits: Andrey Krasichkov of Yandex Information Security Team + +## Fixed in ClickHouse Release 1.1.54390, 2018-07-06 {#fixed-in-clickhouse-release-1-1-54390-2018-07-06} + +### CVE-2018-14669 {#cve-2018-14669} + +ClickHouse MySQL client had “LOAD DATA LOCAL INFILE” functionality enabled that allowed a malicious MySQL database read arbitrary files from the connected ClickHouse server. + +Credits: Andrey Krasichkov and Evgeny Sidorov of Yandex Information Security Team + +## Fixed in ClickHouse Release 1.1.54131, 2017-01-10 {#fixed-in-clickhouse-release-1-1-54131-2017-01-10} + +### CVE-2018-14670 {#cve-2018-14670} + +Incorrect configuration in deb package could lead to the unauthorized use of the database. + +Credits: the UK’s National Cyber Security Centre (NCSC) + diff --git a/docusaurus.config.js b/docusaurus.config.js index 9f50ef9e3a0..8ea79d51385 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -79,7 +79,8 @@ const config = { docPath.includes('en/operations') || docPath.includes('en/sql-reference') || docPath.startsWith('ru') || - docPath.startsWith('zh') + docPath.startsWith('zh') || + docPath.startsWith('ja') ) { return ( 'https://github.com/ClickHouse/ClickHouse/tree/master/docs/' + @@ -2334,7 +2335,19 @@ const config = { { from: '/en/home', to: '/' - } + }, + { + from: '/ja/intro', + to: '/ja', + }, + { + from: '/ja/native-protocol/compression', + to: '/ja/data-compression/compression-modes' + }, + { + from: '/ja/integrations/data-formats/json', + to: '/ja/integrations/data-formats/json/overview' + }, ], }, ], @@ -2515,6 +2528,10 @@ const config = { label: 'Chinese', to: '/zh', }, + { + label: 'Japanese', + to: '/ja', + }, ], }, ], diff --git a/package.json b/package.json index 9b9e2152f46..88fae03fbfb 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,10 @@ "private": true, "config": { "prep_array_en": "docs/en/development docs/en/engines docs/en/getting-started docs/en/interfaces docs/en/operations docs/en/sql-reference", - "prep_array_root": "docs/ru docs/zh" + "prep_array_root": "docs/ru docs/zh docs/ja" }, "scripts": { - "build": "docusaurus build", + "build": "CI=true docusaurus build", "clear": "docusaurus clear && bash ./placeholderReset.sh", "deploy": "docusaurus deploy", "docusaurus": "docusaurus", @@ -16,7 +16,7 @@ "serve": "docusaurus serve", "build-api-doc": "node clickhouseapi.js", "build-swagger": "npx @redocly/cli build-docs https://api.clickhouse.cloud/v1 --output build/en/cloud/manage/api/swagger.html", - "new-build": "bash ./copyClickhouseRepoDocs.sh && bash ./scripts/settings/autogenerate-settings.sh && yarn build-api-doc && yarn build && yarn build-swagger", + "new-build": "export NODE_OPTIONS='--max-old-space-size=5600' && bash ./copyClickhouseRepoDocs.sh && bash ./scripts/settings/autogenerate-settings.sh && yarn build-api-doc && yarn build && yarn build-swagger", "start": "docusaurus start", "swizzle": "docusaurus swizzle", "write-heading-ids": "docusaurus write-heading-ids" diff --git a/sidebars.js b/sidebars.js index f0fbb45598b..b26adec0e22 100644 --- a/sidebars.js +++ b/sidebars.js @@ -1468,6 +1468,1312 @@ const sidebars = { dirName: "zh", }, ], + docs_japanese: [ + { + type: "category", + label: "イントロダクション", + collapsed: false, + collapsible: false, + items: [ + "ja/intro", + "ja/quick-start", + "ja/tutorial", + "ja/getting-started/install", + ], + }, + { + type: "category", + label: "コンセプト", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + "ja/concepts/why-clickhouse-is-so-fast", + "ja/concepts/olap", + "ja/about-us/distinctive-features", + "ja/concepts/glossary", + { + type: "category", + label: "FAQ", + collapsed: true, + collapsible: true, + items: [ + "ja/faq/general/index", + "ja/faq/general/mapreduce", + "ja/faq/general/ne-tormozit", + "ja/faq/general/olap", + "ja/faq/general/who-is-using-clickhouse", + "ja/concepts/why-clickhouse-is-so-fast", + ], + } + ], + }, + { + type: "category", + label: "スターター ガイド", + collapsed: false, + collapsible: false, + items: [ + "ja/guides/creating-tables", + "ja/guides/inserting-data", + "ja/guides/writing-queries", + "ja/guides/developer/mutations", + ], + }, + { + type: "category", + label: "ユースケース ガイド", + collapsed: false, + collapsible: false, + items: [ + { + type: "category", + label: "オブザーバビリティ", + collapsed: true, + collapsible: true, + items: [ + { + type: "doc", + label: "イントロダクション", + id: "ja/use-cases/observability/index", + }, + "ja/use-cases/observability/schema-design", + "ja/use-cases/observability/managing-data", + "ja/use-cases/observability/integrating-opentelemetry", + "ja/use-cases/observability/grafana", + "ja/use-cases/observability/demo-application", + ] + }, + ] + }, + { + type: "category", + label: "マイグレーション ガイド", + collapsed: false, + collapsible: false, + items: [ + { + type: "category", + label: "BigQuery", + collapsed: true, + collapsible: true, + items: [ + { + type: "doc", + id: "ja/migrations/bigquery/equivalent-concepts", + }, + { + type: "doc", + id: "ja/migrations/bigquery/migrating-to-clickhouse-cloud", + }, + { + type: "doc", + id: "ja/migrations/bigquery/loading-data", + }, + ] + }, + "ja/migrations/snowflake", + { + type: "category", + label: "PostgreSQL", + collapsed: true, + collapsible: true, + items: [ + { + type: "doc", + id: "ja/migrations/postgres/overview", + label: "イントロダクション", + }, + "ja/integrations/data-ingestion/dbms/postgresql/index", + "ja/integrations/data-ingestion/dbms/postgresql/postgres-vs-clickhouse", + "ja/migrations/postgres/dataset", + "ja/migrations/postgres/designing-schemas", + "ja/migrations/postgres/data-modeling-techniques", + "ja/integrations/data-ingestion/dbms/postgresql/rewriting-postgres-queries", + "ja/integrations/data-ingestion/dbms/postgresql/inserting-data", + "ja/integrations/data-ingestion/dbms/postgresql/data-type-mappings", + ], + }, + "ja/integrations/data-ingestion/dbms/mysql/index", + "ja/integrations/data-ingestion/redshift/index", + "ja/integrations/data-ingestion/dbms/dynamodb/index", + { + type: "doc", + id: "ja/integrations/migration/rockset", + label: "Rockset", + }, + ], + }, + { + type: "category", + label: "データセットの例", + className: "top-nav-item", + collapsed: true, + collapsible: true, + items: [ + "ja/getting-started/index", + "ja/getting-started/example-datasets/amazon-reviews", + "ja/getting-started/example-datasets/amplab-benchmark", + "ja/getting-started/example-datasets/brown-benchmark", + "ja/getting-started/example-datasets/cell-towers", + "ja/getting-started/example-datasets/covid19", + "ja/getting-started/example-datasets/criteo", + "ja/getting-started/example-datasets/environmental-sensors", + "ja/getting-started/example-datasets/github", + "ja/getting-started/example-datasets/github-events", + "ja/getting-started/example-datasets/laion", + "ja/getting-started/example-datasets/menus", + "ja/getting-started/example-datasets/metrica", + "ja/getting-started/example-datasets/noaa", + "ja/getting-started/example-datasets/nyc-taxi", + "ja/getting-started/example-datasets/nypd_complaint_data", + "ja/getting-started/example-datasets/ontime", + "ja/getting-started/example-datasets/opensky", + "ja/getting-started/example-datasets/recipes", + "ja/getting-started/example-datasets/reddit-comments", + "ja/getting-started/example-datasets/stackoverflow", + "ja/getting-started/example-datasets/star-schema", + "ja/getting-started/example-datasets/tw-weather", + "ja/getting-started/example-datasets/uk-price-paid", + "ja/getting-started/example-datasets/wikistat", + "ja/getting-started/example-datasets/youtube-dislikes", + ], + } + ], + cloud_japanese: [ + { + type: "category", + label: "はじめに", + collapsed: false, + collapsible: false, + className: "top-nav-item", + items: [ + "ja/cloud-index", + { + type: "doc", + id: "ja/get-started/cloud-quick-start", + }, + "ja/get-started/sql-console", + "ja/get-started/query-insights", + "ja/get-started/query-endpoints", + "ja/cloud/support", + ], + }, + { + type: "category", + label: "Cloudの管理", + collapsed: false, + collapsible: false, + className: "top-nav-item", + items: [ + "ja/cloud/manage/service-types", + "ja/cloud/manage/integrations", + "ja/cloud/manage/backups", + { + type: "category", + label: "請求", + items: [ + "ja/cloud/manage/billing", + "ja/cloud/manage/billing/payment-thresholds", + "ja/cloud/manage/troubleshooting-billing-issues", + , + { + type: "category", + label: "Marketplace", + items: [ + "ja/cloud/manage/billing/marketplace/index", + "ja/cloud/manage/billing/marketplace/aws-marketplace-payg", + "ja/cloud/manage/billing/marketplace/aws-marketplace-committed", + "ja/cloud/manage/billing/marketplace/gcp-marketplace-payg", + "ja/cloud/manage/billing/marketplace/gcp-marketplace-committed", + "ja/cloud/manage/billing/marketplace/azure-marketplace-payg", + "ja/cloud/manage/billing/marketplace/azure-marketplace-committed", + ], + }, + ], + }, + "ja/cloud/manage/settings", + "ja/cloud/manage/scaling", + "ja/cloud/manage/service-uptime", + "ja/cloud/manage/notifications", + "ja/cloud/manage/upgrades", + "ja/cloud/manage/account-close", + "ja/cloud/manage/postman", + "ja/faq/troubleshooting", + ], + }, + { + type: "category", + label: "Cloud API", + collapsed: false, + collapsible: false, + className: "top-nav-item", + items: [ + { + type: "doc", + id: "ja/cloud/manage/api/api-overview", + }, + "ja/cloud/manage/openapi", + { + type: "category", + label: "APIリファレンス", + items: [ + "ja/cloud/manage/api/invitations-api-reference", + "ja/cloud/manage/api/keys-api-reference", + "ja/cloud/manage/api/members-api-reference", + "ja/cloud/manage/api/organizations-api-reference", + "ja/cloud/manage/api/services-api-reference", + ], + }, + ], + }, + { + type: "category", + label: "Cloudリファレンス ", + collapsed: false, + collapsible: false, + className: "top-nav-item", + items: [ + "ja/cloud/reference/architecture", + "ja/cloud/reference/shared-merge-tree", + "ja/cloud/reference/compute-compute-separation", + "ja/cloud/reference/byoc", + { + type: "category", + label: "Changelogs", + collapsed: true, + items: [ + "ja/cloud/reference/changelog", + { + type: "category", + label: "Release Notes", + collapsed: true, + items: [ + "ja/cloud/changelogs/changelog-24-6", + "ja/cloud/changelogs/changelog-24-5" + ] + } + ], + }, + "ja/cloud/reference/cloud-compatibility", + "ja/cloud/reference/supported-regions", + ], + }, + { + type: "category", + label: "ベストプラクティス", + collapsed: false, + collapsible: false, + className: "top-nav-item", + items: [ + "ja/cloud/bestpractices/bulkinserts", + "ja/cloud/bestpractices/asyncinserts", + "ja/cloud/bestpractices/avoidmutations", + "ja/cloud/bestpractices/avoidnullablecolumns", + "ja/cloud/bestpractices/avoidoptimizefinal", + "ja/cloud/bestpractices/partitioningkey", + ], + }, + { + type: "category", + label: "セキュリティ", + collapsed: false, + collapsible: false, + className: "top-nav-item", + items: [ + "ja/cloud/security/shared-responsibility-model", + { + type: "category", + label: "Cloudアクセス管理", + items: [ + "ja/cloud/security/cloud-access-management", + "ja/cloud/security/cloud-authentication", + "ja/cloud/security/saml-sso-setup", + "ja/cloud/security/common-access-management-queries", + ], + }, + { + type: "category", + label: "接続", + items: [ + "ja/cloud/security/setting-ip-filters", + { + type: "category", + label: "プライベートネットワーキング", + items: [ + "ja/cloud/security/private-link-overview", + "ja/cloud/security/aws-privatelink", + "ja/cloud/security/gcp-private-service-connect", + "ja/cloud/security/azure-privatelink", + ], + }, + "ja/cloud/security/accessing-s3-data-securely", + "ja/cloud/security/cloud-endpoints-api", + ], + }, + "ja/cloud/security/cmek", + "ja/cloud/security/audit-logging", + { + type: "category", + label: "プライバシーとコンプライアンス", + collapsed: true, + collapsible: true, + items: [ + "ja/cloud/security/compliance-overview", + "ja/cloud/security/personal-data-access", + ], + }, + ], + }, + { + type: "category", + label: "Cloudへのマイグレーション", + collapsed: false, + collapsible: false, + items: [ + "ja/integrations/migration/index", + "ja/integrations/migration/clickhouse-to-cloud", + "ja/integrations/migration/clickhouse-local-etl", + "ja/integrations/migration/etl-tool-to-clickhouse", + "ja/integrations/migration/object-storage-to-clickhouse", + "ja/integrations/migration/upload-a-csv-file", + { + type: "link", + label: "Rockset", + href: "/ja/migrations/rockset", + }, + ], + }, + ], + sqlreference_japanese: [ + { + type: "category", + label: "イントロダクション", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + { + type: "doc", + id: "ja/sql-reference/index", + }, + { + type: "doc", + id: "ja/sql-reference/syntax", + }, + { + type: "doc", + id: "ja/sql-reference/formats", + }, + // { + // type: "doc", + // id: "ja/sql-reference/ansi", + // }, + { + type: "category", + label: "データタイプ", + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/data-types", + }, + ], + }, + { + type: "category", + label: "ステートメント", + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/statements", + }, + ], + }, + ], + }, + { + type: "category", + label: "エンジン", + collapsed: false, + collapsible: false, + items: [ + { + type: "autogenerated", + dirName: "ja/engines", + }, + ], + }, + { + type: "category", + label: "関数", + collapsed: false, + collapsible: false, + items: [ + { + type: "category", + label: "一般的な関数", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/functions", + }, + ], + }, + { + type: "category", + label: "集約関数", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/aggregate-functions", + }, + ], + }, + { + type: "category", + label: "テーブル関数", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/table-functions", + }, + ], + }, + { + type: "category", + label: "ウィンドウ関数", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/window-functions", + }, + ], + }, + ], + }, + { + type: "category", + label: "その他の機能", + collapsed: false, + collapsible: false, + items: [ + { + type: "autogenerated", + dirName: "ja/sql-reference/operators", + }, + { + type: "doc", + id: "ja/sql-reference/distributed-ddl", + }, + ], + }, + ], + + integrations_japanese: [ + { + type: "category", + label: "ClickPipes", + collapsed: false, + collapsible: false, + items: [ + "ja/integrations/data-ingestion/clickpipes/index", + "ja/integrations/data-ingestion/clickpipes/kafka", + "ja/integrations/data-ingestion/clickpipes/object-storage", + "ja/integrations/data-ingestion/clickpipes/kinesis", + "ja/integrations/data-ingestion/clickpipes/secure-kinesis", + "ja/integrations/data-ingestion/clickpipes/postgres", + ], + }, + { + type: "category", + label: "全ての統合", + link: { + type: "doc", + id: "ja/integrations/index", + }, + collapsed: false, + collapsible: false, + items: [ + { + type: "category", + label: "AWS S3", + className: "top-nav-item", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/data-ingestion/s3/index", + "ja/integrations/data-ingestion/s3/performance" + ], + }, + { + type: "category", + label: "Kafka", + className: "top-nav-item", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/data-ingestion/kafka/index", + "ja/integrations/data-ingestion/kafka/kafka-clickhouse-connect-sink", + "ja/integrations/data-ingestion/kafka/confluent/custom-connector", + "ja/integrations/data-ingestion/kafka/msk/index", + "ja/integrations/data-ingestion/kafka/kafka-vector", + "ja/integrations/data-ingestion/kafka/kafka-table-engine", + "ja/integrations/data-ingestion/kafka/confluent/index", + "ja/integrations/data-ingestion/kafka/confluent/kafka-connect-http", + "ja/integrations/data-ingestion/kafka/kafka-connect-jdbc", + ], + }, + "ja/integrations/data-ingestion/etl-tools/dbt/index", + "ja/integrations/data-ingestion/etl-tools/fivetran/index", + "ja/integrations/data-ingestion/apache-spark/index", + "ja/integrations/data-ingestion/aws-glue/index", + "ja/integrations/data-ingestion/insert-local-files", + "ja/integrations/data-ingestion/dbms/jdbc-with-clickhouse", + "ja/integrations/data-ingestion/dbms/odbc-with-clickhouse", + { + type: "category", + label: "その他...", + className: "top-nav-item", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/data-ingestion/etl-tools/airbyte-and-clickhouse", + { + type: "link", + label: "Cassandra", + href: "/ja/sql-reference/dictionaries#cassandra", + }, + "ja/sql-reference/table-functions/deltalake", + "ja/integrations/data-ingestion/etl-tools/dlt-and-clickhouse", + "ja/integrations/deployment/easypanel/index", + "ja/engines/table-engines/integrations/embedded-rocksdb", + "ja/integrations/data-ingestion/emqx/index", + "ja/engines/table-engines/integrations/hive", + "ja/engines/table-engines/integrations/hudi", + "ja/engines/table-engines/integrations/iceberg", + "ja/integrations/data-ingestion/s3-minio", + "ja/engines/table-engines/integrations/mongodb", + "ja/engines/table-engines/integrations/nats", + "ja/integrations/data-ingestion/etl-tools/nifi-and-clickhouse", + "ja/integrations/prometheus", + "ja/engines/table-engines/integrations/rabbitmq", + { + type: "link", + label: "Redis", + href: "/ja/sql-reference/dictionaries#redis", + }, + "ja/integrations/data-visualization/splunk-and-clickhouse", + "ja/engines/table-engines/integrations/sqlite", + "ja/integrations/data-ingestion/etl-tools/vector-to-clickhouse", + ], + }, + ], + }, + { + type: "category", + label: "データフォーマット", + link: { + type: "doc", + id: "ja/integrations/data-ingestion/data-formats/intro", + }, + collapsed: false, + collapsible: false, + items: [ + "ja/integrations/data-ingestion/data-formats/binary", + "ja/integrations/data-ingestion/data-formats/csv-tsv", + { + type: "category", + label: "JSON", + className: "top-nav-item", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/data-ingestion/data-formats/json/intro", + "ja/integrations/data-ingestion/data-formats/json/loading", + "ja/integrations/data-ingestion/data-formats/json/inference", + "ja/integrations/data-ingestion/data-formats/json/schema", + "ja/integrations/data-ingestion/data-formats/json/exporting", + "ja/integrations/data-ingestion/data-formats/json/formats", + "ja/integrations/data-ingestion/data-formats/json/other", + ], + }, + "ja/integrations/data-ingestion/data-formats/parquet", + "ja/integrations/data-ingestion/data-formats/sql", + "ja/integrations/data-ingestion/data-formats/arrow-avro-orc", + "ja/integrations/data-ingestion/data-formats/templates-regex", + { + type: "doc", + id: "ja/interfaces/formats", + label: "全てのフォーマットを見る...", + }, + ], + }, + { + type: "category", + label: "クライアントとドライバ", + collapsed: false, + collapsible: false, + items: [ + "ja/integrations/clickhouse-client-local", + "ja/integrations/cli", + "ja/operations/utilities/clickhouse-local", + "ja/integrations/sql-clients/sql-console", + "ja/getting-started/playground", + "ja/integrations/language-clients/js", + "ja/integrations/language-clients/java/index", + "ja/integrations/language-clients/python/index", + "ja/integrations/language-clients/rust", + { + type: "category", + label: "全ての言語を見る", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/language-clients/js", + "ja/integrations/language-clients/java/index", + "ja/integrations/language-clients/go/index", + "ja/integrations/language-clients/python/index", + "ja/integrations/language-clients/rust", + ], + }, + { + type: "category", + label: "ドライバとインターフェース", + collapsed: true, + collapsible: true, + items: [ + "ja/interfaces/overview", + "ja/interfaces/cli", + "ja/interfaces/cpp", + "ja/interfaces/http", + "ja/interfaces/tcp", + "ja/interfaces/jdbc", + "ja/interfaces/mysql", + "ja/interfaces/odbc", + "ja/interfaces/postgresql", + "ja/interfaces/prometheus", + "ja/interfaces/schema-inference", + "ja/interfaces/grpc", + { + type: "category", + label: "サードパーティインターフェース", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "ja/interfaces/third-party", + }, + ], + }, + ], + }, + { + type: "category", + label: "SQLクライアント", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/sql-clients/datagrip", + "ja/integrations/sql-clients/dbeaver", + "ja/integrations/sql-clients/dbvisualizer", + "ja/integrations/sql-clients/jupysql", + "ja/integrations/sql-clients/qstudio", + "ja/integrations/sql-clients/tablum", + ], + }, + { + type: "category", + label: "ビジネスインテリジェンス", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/data-visualization", + "ja/integrations/data-visualization/deepnote", + "ja/integrations/data-visualization/draxlr-and-clickhouse", + "ja/integrations/data-visualization/embeddable-and-clickhouse", + "ja/integrations/data-visualization/explo-and-clickhouse", + { + type: "category", + label: "Grafana", + className: "top-nav-item", + collapsed: true, + collapsible: true, + items: [ + "ja/integrations/data-visualization/grafana/index", + "ja/integrations/data-visualization/grafana/query-builder", + "ja/integrations/data-visualization/grafana/config", + ], + }, + "ja/integrations/data-visualization/hashboard-and-clickhouse", + "ja/integrations/data-visualization/looker-and-clickhouse", + "ja/integrations/data-visualization/looker-studio-and-clickhouse", + "ja/integrations/data-visualization/metabase-and-clickhouse", + "ja/integrations/data-visualization/mitzu-and-clickhouse", + "ja/integrations/data-visualization/omni-and-clickhouse", + "ja/integrations/data-visualization/powerbi-and-clickhouse", + "ja/integrations/data-visualization/quicksight-and-clickhouse", + "ja/integrations/data-visualization/rocketbi-and-clickhouse", + "ja/integrations/data-visualization/superset-and-clickhouse", + "ja/integrations/data-visualization/tableau-and-clickhouse", + "ja/integrations/data-visualization/tableau-online-and-clickhouse", + "ja/integrations/data-visualization/zingdata-and-clickhouse", + ], + }, + { + type: "category", + label: "ノーコードプラットフォーム", + collapsed: true, + collapsible: true, + items: ["ja/integrations/no-code/retool"], + }, + ], + }, + ], + + managingData_japanese: [ + { + type: "category", + label: "データの更新", + collapsed: false, + collapsible: false, + items: [ + "ja/managing-data/updates", + { + type: "link", + label: "物理更新", + href: "/ja/sql-reference/statements/alter/update" + }, + { + type: "doc", + label: "論理更新", + id: "ja/guides/developer/lightweight-update" + }, + { + type: "doc", + label: "ReplacingMergeTree", + id: "ja/migrations/postgres/replacing-merge-tree" + }, + ] + }, + { + type: "category", + label: "Dataの削除", + collapsed: false, + collapsible: false, + items: [ + { + type: "doc", + label: "概要", + id: "ja/managing-data/deletes", + }, + { + type: "doc", + label: "論理削除", + id: "ja/guides/developer/lightweight-delete" + }, + { + type: "link", + label: "物理削除", + href: "/ja/sql-reference/statements/alter/delete" + }, + { + type: "link", + label: "Truncate Table", + href: "/ja/sql-reference/statements/truncate" + }, + { + type: "link", + label: "Drop Partition", + href: "/ja/sql-reference/statements/alter/partition#drop-partitionpart" + } + ] + }, + { + type: "category", + label: "データモデリング", + collapsed: false, + collapsible: false, + items: [ + "ja/data-modeling/schema-design", + "ja/dictionary/index", + { + type: "category", + label: "Materialized View", + collapsible: true, + collapsed: true, + items: [ + "ja/materialized-view/index", + // "/ja/materialized-view/refreshable-materialized-view" + ], + }, + { + type: "category", + label: "Data Compression", + collapsed: true, + collapsible: true, + items: [ + { + label: "概要", + type: "doc", + id: "ja/data-compression/compression-in-clickhouse", + }, + "ja/data-compression/compression-modes" + ], + }, + "ja/data-modeling/denormalization", + ], + }, + { + type: "category", + label: "高度なガイド", + collapsed: false, + collapsible: false, + items: [ + "ja/guides/developer/alternative-query-languages", + "ja/guides/developer/cascading-materialized-views", + "ja/guides/developer/debugging-memory-issues", + "ja/guides/developer/deduplicating-inserts-on-retries", + "ja/guides/developer/deduplication", + "ja/guides/developer/time-series-filling-gaps", + "ja/guides/developer/ttl", + "ja/guides/developer/understanding-query-execution-with-the-analyzer", + "ja/guides/joining-tables", + ], + }, + { + type: "category", + label: "パフォーマンスと最適化", + collapsed: false, + collapsible: false, + items: [ + "ja/operations/analyzer", + "ja/guides/best-practices/asyncinserts", + "ja/guides/best-practices/avoidmutations", + "ja/guides/best-practices/avoidnullablecolumns", + "ja/guides/best-practices/avoidoptimizefinal", + "ja/guides/best-practices/bulkinserts", + "ja/guides/best-practices/partitioningkey", + "ja/guides/best-practices/skipping-indexes", + "ja/guides/best-practices/sparse-primary-indexes", + "ja/operations/optimizing-performance/sampling-query-profiler", + "ja/operations/performance-test", + "ja/operations/query-cache", + ] + } + ], + + aboutClickHouse_japanese: [ + { + type: "category", + label: "ClickHouseとは", + link: { + type: "doc", + id: "ja/about-us/intro", + }, + collapsed: false, + collapsible: false, + items: [ + "ja/about-us/adopters", + "ja/about-us/support", + "ja/settings/beta-and-experimental-features", + "ja/about-us/cloud", + "ja/about-us/history", + ], + }, + { + type: "category", + label: "Changelogs", + collapsed: false, + collapsible: false, + items: [ + { + type: "autogenerated", + dirName: "ja/whats-new", + } + ] + }, + { + type: "category", + label: "開発とコントリビューション", + collapsed: false, + collapsible: false, + items: [ + "ja/operations/optimizing-performance/profile-guided-optimization", + { + type: "autogenerated", + dirName: "ja/development", + }, + { + type: "category", + label: "Native Protocol", + collapsed: true, + collapsible: true, + items: [ + { + type: "autogenerated", + dirName: "ja/native-protocol", + }, + ], + }, + ], + }, + { + type: "category", + label: "FAQ", + collapsed: true, + collapsible: true, + items: [ + "ja/faq/general/columnar-database", + "ja/faq/general/dbms-naming", + "ja/faq/integration/index", + "ja/faq/integration/json-import", + "ja/faq/integration/oracle-odbc", + "ja/faq/operations/delete-old-data", + "ja/faq/operations/index", + "ja/faq/operations/separate_storage", + "ja/faq/use-cases/index", + "ja/faq/use-cases/key-value", + "ja/faq/use-cases/time-series", + ], + } + ], + + serverAdmin_japanese: [ + { + type: "category", + label: "デプロイとスケーリング", + collapsed: false, + collapsible: false, + items: [ + "ja/deployment-guides/horizontal-scaling", + "ja/deployment-guides/replicated", + "ja/deployment-guides/terminology", + "ja/architecture/cluster-deployment", + "ja/guides/separation-storage-compute", + "ja/guides/sizing-and-hardware-recommendations", + "ja/guides/sre/keeper/index", + "ja/guides/sre/network-ports", + "ja/guides/sre/scaling-clusters", + "ja/faq/operations/multi-region-replication", + "ja/faq/operations/production", + "ja/operations/cluster-discovery", + "ja/operations/monitoring", + "ja/operations/opentelemetry", + "ja/operations/quotas", + "ja/operations/ssl-zookeeper", + "ja/operations/startup-scripts", + "ja/operations/storing-data", + "ja/operations/allocation-profiling", + "ja/operations/backup", + "ja/operations/caches", + "ja/operations/workload-scheduling", + "ja/operations/update", + "ja/guides/troubleshooting", + "ja/operations/tips", + "ja/sql-reference/distributed-ddl", + ], + }, + { + type: "category", + label: "設定", + collapsed: false, + collapsible: false, + items: [ + "ja/operations/settings/index", + "ja/operations/server-configuration-parameters/settings", + "ja/operations/settings/composable-protocols", + "ja/operations/settings/constraints-on-settings", + "ja/operations/settings/settings-formats", + "ja/operations/settings/memory-overcommit", + "ja/operations/settings/merge-tree-settings", + // "ja/operations/settings/mysql-binlog-client", + "ja/operations/settings/permissions-for-queries", + "ja/operations/settings/query-complexity", + "ja/operations/settings/settings-query-level", + "ja/operations/settings/settings", + "ja/operations/settings/settings-profiles", + "ja/operations/settings/settings-users", + "ja/operations/named-collections", + "ja/operations/configuration-files", + ], + }, + { + type: "category", + label: "System Tables", + collapsed: true, + collapsible: true, + items: [ + "ja/operations/system-tables/index", + "ja/operations/system-tables/asynchronous_insert_log", + "ja/operations/system-tables/asynchronous_inserts", + "ja/operations/system-tables/asynchronous_loader", + "ja/operations/system-tables/asynchronous_metric_log", + "ja/operations/system-tables/asynchronous_metrics", + "ja/operations/system-tables/backup_log", + "ja/operations/system-tables/blob_storage_log", + "ja/operations/system-tables/build_options", + "ja/operations/system-tables/clusters", + "ja/operations/system-tables/columns", + "ja/operations/system-tables/contributors", + "ja/operations/system-tables/crash-log", + "ja/operations/system-tables/current-roles", + "ja/operations/system-tables/dashboards", + "ja/operations/system-tables/data_skipping_indices", + "ja/operations/system-tables/data_type_families", + "ja/operations/system-tables/database_engines", + "ja/operations/system-tables/databases", + "ja/operations/system-tables/detached_parts", + "ja/operations/system-tables/detached_tables", + "ja/operations/system-tables/dictionaries", + "ja/operations/system-tables/disks", + "ja/operations/system-tables/distributed_ddl_queue", + "ja/operations/system-tables/distribution_queue", + "ja/operations/system-tables/dns_cache", + "ja/operations/system-tables/dropped_tables", + "ja/operations/system-tables/dropped_tables_parts", + "ja/operations/system-tables/enabled-roles", + "ja/operations/system-tables/error_log", + "ja/operations/system-tables/errors", + "ja/operations/system-tables/events", + "ja/operations/system-tables/functions", + "ja/operations/system-tables/grants", + "ja/operations/system-tables/graphite_retentions", + "ja/operations/system-tables/information_schema", + "ja/operations/system-tables/jemalloc_bins", + "ja/operations/system-tables/kafka_consumers", + "ja/operations/system-tables/licenses", + "ja/operations/system-tables/merge_tree_settings", + "ja/operations/system-tables/merges", + "ja/operations/system-tables/metric_log", + "ja/operations/system-tables/metrics", + "ja/operations/system-tables/moves", + "ja/operations/system-tables/mutations", + "ja/operations/system-tables/numbers", + "ja/operations/system-tables/numbers_mt", + "ja/operations/system-tables/one", + "ja/operations/system-tables/opentelemetry_span_log", + "ja/operations/system-tables/part_log", + "ja/operations/system-tables/parts", + "ja/operations/system-tables/parts_columns", + "ja/operations/system-tables/processes", + "ja/operations/system-tables/processors_profile_log", + "ja/operations/system-tables/query_cache", + "ja/operations/system-tables/query_log", + "ja/operations/system-tables/query_thread_log", + "ja/operations/system-tables/query_views_log", + "ja/operations/system-tables/quota_limits", + "ja/operations/system-tables/quota_usage", + "ja/operations/system-tables/quotas", + "ja/operations/system-tables/quotas_usage", + "ja/operations/system-tables/replicas", + "ja/operations/system-tables/replicated_fetches", + "ja/operations/system-tables/replication_queue", + "ja/operations/system-tables/role-grants", + "ja/operations/system-tables/roles", + "ja/operations/system-tables/row_policies", + "ja/operations/system-tables/scheduler", + "ja/operations/system-tables/schema_inference_cache", + "ja/operations/system-tables/server_settings", + "ja/operations/system-tables/session_log", + "ja/operations/system-tables/settings", + "ja/operations/system-tables/settings_changes", + "ja/operations/system-tables/settings_profile_elements", + "ja/operations/system-tables/settings_profiles", + "ja/operations/system-tables/stack_trace", + "ja/operations/system-tables/storage_policies", + "ja/operations/system-tables/symbols", + "ja/operations/system-tables/table_engines", + "ja/operations/system-tables/tables", + "ja/operations/system-tables/text_log", + "ja/operations/system-tables/time_zones", + "ja/operations/system-tables/trace_log", + "ja/operations/system-tables/user_processes", + "ja/operations/system-tables/users", + "ja/operations/system-tables/view_refreshes", + "ja/operations/system-tables/zookeeper", + "ja/operations/system-tables/zookeeper_connection", + "ja/operations/system-tables/zookeeper_log", + ] + }, + { + type: "category", + label: "セキュリティと認証", + collapsed: false, + collapsible: false, + items: [ + "ja/guides/sre/user-management/index", + { + type: "category", + label: "外部認証", + collapsed: true, + collapsible: true, + items: [ + { + type: "doc", + label: "概要", + id: "ja/operations/external-authenticators/index", + }, + { + type: "category", + label: "SSL", + collapsed: true, + collapsible: true, + items: [ + "ja/guides/sre/user-management/ssl-user-auth", + "ja/guides/sre/configuring-ssl", + "ja/operations/external-authenticators/ssl-x509", + ], + }, + { + type: "category", + label: "LDAP", + collapsed: true, + collapsible: true, + items: [ + "ja/operations/external-authenticators/ldap", + "ja/guides/sre/user-management/configuring-ldap", + ], + }, + "ja/operations/external-authenticators/http", + "ja/operations/external-authenticators/kerberos", + ], + }, + ] + }, + { + type: "category", + label: "ツールとユーティリティ", + collapsed: false, + collapsible: false, + items: [ + { + label: "概要", + id: "ja/operations/utilities/index", + type: "doc", + }, + "ja/operations/utilities/backupview", + "ja/operations/utilities/clickhouse-benchmark", + "ja/operations/utilities/clickhouse-compressor", + // "ja/operations/utilities/clickhouse-copier", + "ja/operations/utilities/clickhouse-disks", + "ja/operations/utilities/clickhouse-format", + "ja/operations/utilities/clickhouse-keeper-client", + "ja/operations/utilities/clickhouse-local", + "ja/operations/utilities/clickhouse-obfuscator", + "ja/operations/utilities/odbc-bridge", + "ja/tools-and-utilities/static-files-disk-uploader", + "ja/getting-started/playground", + ], + } + ], + + chd_japaneseb: [ + { + type: "category", + label: "chDB", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + "ja/chdb/index", + "ja/chdb/data-formats", + "ja/chdb/sql-reference" + ], + }, + { + type: "category", + label: "言語クライアント", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + "ja/chdb/install/python", + "ja/chdb/install/nodejs", + "ja/chdb/install/go", + "ja/chdb/install/rust", + "ja/chdb/install/bun", + "ja/chdb/install/c", + ], + }, + { + type: "category", + label: "ガイド", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + "ja/chdb/guides/jupysql", + "ja/chdb/guides/querying-pandas", + "ja/chdb/guides/querying-apache-arrow", + "ja/chdb/guides/querying-s3-bucket", + "ja/chdb/guides/querying-parquet", + "ja/chdb/guides/query-remote-clickhouse", + "ja/chdb/guides/clickhouse-local" + ], + }, + { + type: "category", + label: "統合", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + { + type: "link", + label: "JupySQL", + href: "https://jupysql.ploomber.io/ja/latest/integrations/chdb.html", + }, + { + type: "link", + label: "chdb-lambda", + href: "https://github.com/chdb-io/chdb-lambda", + }, + { + type: "link", + label: "chdb-cli", + href: "https://github.com/chdb-io/chdb-go?tab=readme-ov-file#chdb-go-cli", + }, + ], + }, + { + type: "category", + label: "chDBとは", + className: "top-nav-item", + collapsed: false, + collapsible: false, + items: [ + { + type: "link", + label: "Discord", + href: "https://discord.gg/Njw5YXSPPc", + }, + { + type: "link", + label: "chDBの誕生", + href: "https://auxten.com/the-birth-of-chdb/", + }, + { + type: "link", + label: "ClickHouse, Inc.への参加", + href: "https://clickhouse.com/blog/welcome-chdb-to-clickhouse", + }, + { + type: "link", + label: "チームとコントリビューター", + href: "https://github.com/chdb-io/chdb#contributors", + }, + ], + }, + ], // Used for generating the secondary nav mobile menu (DocsCategoryDropdown) dropdownCategories : [ {